From 827f63ea9ff22783f7753078a0cc200abece1eab Mon Sep 17 00:00:00 2001 From: Dmytro Skarzhynets Date: Tue, 28 Oct 2025 15:32:49 +0200 Subject: [PATCH 001/579] Add tests for rule engine consumer loop --- ...faultTbCalculatedFieldConsumerService.java | 6 +- .../queue/DefaultTbCoreConsumerService.java | 6 +- .../queue/DefaultTbEdgeConsumerService.java | 6 +- .../DefaultTbRuleEngineConsumerService.java | 6 +- .../TbMsgPackProcessingContextFactory.java | 35 +++ .../processing/AbstractConsumerService.java | 6 +- .../AbstractTbRuleEngineSubmitStrategy.java | 12 +- .../BatchTbRuleEngineSubmitStrategy.java | 2 +- .../BurstTbRuleEngineSubmitStrategy.java | 2 +- .../service/queue/processing/IdMsgPair.java | 14 +- ...lByEntityIdTbRuleEngineSubmitStrategy.java | 10 +- .../SequentialTbRuleEngineSubmitStrategy.java | 6 +- .../TbRuleEngineQueueConsumerManager.java | 8 +- .../src/main/resources/thingsboard.yml | 3 + .../queue/TbMsgPackProcessingContextTest.java | 260 ++++++++++++++-- .../RuleEngineConsumerLoopTest.java | 281 ++++++++++++++++++ 16 files changed, 595 insertions(+), 68 deletions(-) create mode 100644 application/src/main/java/org/thingsboard/server/service/queue/TbMsgPackProcessingContextFactory.java create mode 100644 application/src/test/java/org/thingsboard/server/service/queue/ruleengine/RuleEngineConsumerLoopTest.java diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCalculatedFieldConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCalculatedFieldConsumerService.java index acb36449e8..91981cf86f 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCalculatedFieldConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCalculatedFieldConsumerService.java @@ -146,15 +146,15 @@ public class DefaultTbCalculatedFieldConsumerService extends AbstractPartitionBa private void processMsgs(List> msgs, TbQueueConsumer> consumer, Object consumerKey, QueueConfig config) throws Exception { List> orderedMsgList = msgs.stream().map(msg -> new IdMsgPair<>(UUID.randomUUID(), msg)).toList(); ConcurrentMap> pendingMap = orderedMsgList.stream().collect( - Collectors.toConcurrentMap(IdMsgPair::getUuid, IdMsgPair::getMsg)); + Collectors.toConcurrentMap(IdMsgPair::uuid, IdMsgPair::msg)); CountDownLatch processingTimeoutLatch = new CountDownLatch(1); TbPackProcessingContext> ctx = new TbPackProcessingContext<>( processingTimeoutLatch, pendingMap, new ConcurrentHashMap<>()); PendingMsgHolder pendingMsgHolder = new PendingMsgHolder<>(); Future packSubmitFuture = consumersExecutor.submit(() -> { orderedMsgList.forEach((element) -> { - UUID id = element.getUuid(); - TbProtoQueueMsg msg = element.getMsg(); + UUID id = element.uuid(); + TbProtoQueueMsg msg = element.msg(); log.trace("[{}] Creating main callback for message: {}", id, msg.getValue()); TbCallback callback = new TbPackCallback<>(id, ctx); try { diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java index 9ab5a062eb..57a7018310 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java @@ -260,15 +260,15 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService> msgs, TbQueueConsumer> consumer, Object consumerKey, QueueConfig config) throws Exception { List> orderedMsgList = msgs.stream().map(msg -> new IdMsgPair<>(UUID.randomUUID(), msg)).toList(); ConcurrentMap> pendingMap = orderedMsgList.stream().collect( - Collectors.toConcurrentMap(IdMsgPair::getUuid, IdMsgPair::getMsg)); + Collectors.toConcurrentMap(IdMsgPair::uuid, IdMsgPair::msg)); CountDownLatch processingTimeoutLatch = new CountDownLatch(1); TbPackProcessingContext> ctx = new TbPackProcessingContext<>( processingTimeoutLatch, pendingMap, new ConcurrentHashMap<>()); PendingMsgHolder pendingMsgHolder = new PendingMsgHolder<>(); Future packSubmitFuture = consumersExecutor.submit(() -> { orderedMsgList.forEach((element) -> { - UUID id = element.getUuid(); - TbProtoQueueMsg msg = element.getMsg(); + UUID id = element.uuid(); + TbProtoQueueMsg msg = element.msg(); log.trace("[{}] Creating main callback for message: {}", id, msg.getValue()); TbCallback callback = new TbPackCallback<>(id, ctx); try { diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbEdgeConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbEdgeConsumerService.java index 40ef9bfeca..71dacdbdaf 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbEdgeConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbEdgeConsumerService.java @@ -129,15 +129,15 @@ public class DefaultTbEdgeConsumerService extends AbstractConsumerService> msgs, TbQueueConsumer> consumer, Object consumerKey, QueueConfig edgeQueueConfig) throws InterruptedException { List> orderedMsgList = msgs.stream().map(msg -> new IdMsgPair<>(UUID.randomUUID(), msg)).toList(); ConcurrentMap> pendingMap = orderedMsgList.stream().collect( - Collectors.toConcurrentMap(IdMsgPair::getUuid, IdMsgPair::getMsg)); + Collectors.toConcurrentMap(IdMsgPair::uuid, IdMsgPair::msg)); CountDownLatch processingTimeoutLatch = new CountDownLatch(1); TbPackProcessingContext> ctx = new TbPackProcessingContext<>( processingTimeoutLatch, pendingMap, new ConcurrentHashMap<>()); PendingMsgHolder pendingMsgHolder = new PendingMsgHolder<>(); Future submitFuture = consumersExecutor.submit(() -> { orderedMsgList.forEach((element) -> { - UUID id = element.getUuid(); - TbProtoQueueMsg msg = element.getMsg(); + UUID id = element.uuid(); + TbProtoQueueMsg msg = element.msg(); TbCallback callback = new TbPackCallback<>(id, ctx); try { ToEdgeMsg toEdgeMsg = msg.getValue(); diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbRuleEngineConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbRuleEngineConsumerService.java index a809f2bb11..d2a8e7a441 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbRuleEngineConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbRuleEngineConsumerService.java @@ -70,6 +70,7 @@ public class DefaultTbRuleEngineConsumerService extends AbstractPartitionBasedCo private final TbRuleEngineConsumerContext ctx; private final QueueService queueService; private final TbRuleEngineDeviceRpcService tbDeviceRpcService; + private final TbMsgPackProcessingContextFactory packProcessingContextFactory; private final ConcurrentMap consumers = new ConcurrentHashMap<>(); @@ -85,11 +86,13 @@ public class DefaultTbRuleEngineConsumerService extends AbstractPartitionBasedCo PartitionService partitionService, ApplicationEventPublisher eventPublisher, JwtSettingsService jwtSettingsService, - CalculatedFieldCache calculatedFieldCache) { + CalculatedFieldCache calculatedFieldCache, + TbMsgPackProcessingContextFactory packProcessingContextFactory) { super(actorContext, tenantProfileCache, deviceProfileCache, assetProfileCache, tbResourceDataCache, calculatedFieldCache, apiUsageStateService, partitionService, eventPublisher, jwtSettingsService); this.ctx = ctx; this.tbDeviceRpcService = tbDeviceRpcService; this.queueService = queueService; + this.packProcessingContextFactory = packProcessingContextFactory; } @Override @@ -255,6 +258,7 @@ public class DefaultTbRuleEngineConsumerService extends AbstractPartitionBasedCo .consumerExecutor(consumersExecutor) .scheduler(scheduler) .taskExecutor(mgmtExecutor) + .packProcessingContextFactory(packProcessingContextFactory) .build(); consumers.put(queueKey, consumer); consumer.init(queue); diff --git a/application/src/main/java/org/thingsboard/server/service/queue/TbMsgPackProcessingContextFactory.java b/application/src/main/java/org/thingsboard/server/service/queue/TbMsgPackProcessingContextFactory.java new file mode 100644 index 0000000000..ff804ad304 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/queue/TbMsgPackProcessingContextFactory.java @@ -0,0 +1,35 @@ +/** + * Copyright © 2016-2025 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. + */ +package org.thingsboard.server.service.queue; + +import org.springframework.stereotype.Component; +import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategy; + +public interface TbMsgPackProcessingContextFactory { + + TbMsgPackProcessingContext create(String queueName, TbRuleEngineSubmitStrategy submitStrategy, boolean skipTimeouts); + + @Component + class DefaultTbMsgPackProcessingContextFactory implements TbMsgPackProcessingContextFactory { + + @Override + public TbMsgPackProcessingContext create(String queueName, TbRuleEngineSubmitStrategy submitStrategy, boolean skipTimeouts) { + return new TbMsgPackProcessingContext(queueName, submitStrategy, skipTimeouts); + } + + } + +} diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java index e18cc0b09e..7e9ada0e75 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java @@ -134,13 +134,13 @@ public abstract class AbstractConsumerService> msgs, TbQueueConsumer> consumer) throws Exception { List> orderedMsgList = msgs.stream().map(msg -> new IdMsgPair<>(UUID.randomUUID(), msg)).toList(); ConcurrentMap> pendingMap = orderedMsgList.stream().collect( - Collectors.toConcurrentMap(IdMsgPair::getUuid, IdMsgPair::getMsg)); + Collectors.toConcurrentMap(IdMsgPair::uuid, IdMsgPair::msg)); CountDownLatch processingTimeoutLatch = new CountDownLatch(1); TbPackProcessingContext> ctx = new TbPackProcessingContext<>( processingTimeoutLatch, pendingMap, new ConcurrentHashMap<>()); orderedMsgList.forEach(element -> { - UUID id = element.getUuid(); - TbProtoQueueMsg msg = element.getMsg(); + UUID id = element.uuid(); + TbProtoQueueMsg msg = element.msg(); log.trace("[{}] Creating notification callback for message: {}", id, msg.getValue()); TbCallback callback = new TbPackCallback<>(id, ctx); try { diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractTbRuleEngineSubmitStrategy.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractTbRuleEngineSubmitStrategy.java index 019573631a..5a1bdae13a 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractTbRuleEngineSubmitStrategy.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractTbRuleEngineSubmitStrategy.java @@ -44,21 +44,21 @@ public abstract class AbstractTbRuleEngineSubmitStrategy implements TbRuleEngine @Override public ConcurrentMap> getPendingMap() { - return orderedMsgList.stream().collect(Collectors.toConcurrentMap(pair -> pair.uuid, pair -> pair.msg)); + return orderedMsgList.stream().collect(Collectors.toConcurrentMap(pair -> pair.uuid(), pair -> pair.msg())); } @Override public void update(ConcurrentMap> reprocessMap) { List> newOrderedMsgList = new ArrayList<>(reprocessMap.size()); for (IdMsgPair pair : orderedMsgList) { - if (reprocessMap.containsKey(pair.uuid)) { - if (StringUtils.isNotEmpty(pair.getMsg().getValue().getFailureMessage())) { - var toRuleEngineMsg = TransportProtos.ToRuleEngineMsg.newBuilder(pair.getMsg().getValue()) + if (reprocessMap.containsKey(pair.uuid())) { + if (StringUtils.isNotEmpty(pair.msg().getValue().getFailureMessage())) { + var toRuleEngineMsg = TransportProtos.ToRuleEngineMsg.newBuilder(pair.msg().getValue()) .clearFailureMessage() .clearRelationTypes() .build(); - var newMsg = new TbProtoQueueMsg<>(pair.getMsg().getKey(), toRuleEngineMsg, pair.getMsg().getHeaders()); - newOrderedMsgList.add(new IdMsgPair<>(pair.getUuid(), newMsg)); + var newMsg = new TbProtoQueueMsg<>(pair.msg().getKey(), toRuleEngineMsg, pair.msg().getHeaders()); + newOrderedMsgList.add(new IdMsgPair<>(pair.uuid(), newMsg)); } else { newOrderedMsgList.add(pair); } diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/BatchTbRuleEngineSubmitStrategy.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/BatchTbRuleEngineSubmitStrategy.java index 93478eab18..a47c43422b 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/BatchTbRuleEngineSubmitStrategy.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/BatchTbRuleEngineSubmitStrategy.java @@ -73,7 +73,7 @@ public class BatchTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSubmitS pendingPack.clear(); for (int i = startIdx; i < endIdx; i++) { IdMsgPair pair = orderedMsgList.get(i); - pendingPack.put(pair.uuid, pair.msg); + pendingPack.put(pair.uuid(), pair.msg()); } tmpPack = new LinkedHashMap<>(pendingPack); } diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/BurstTbRuleEngineSubmitStrategy.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/BurstTbRuleEngineSubmitStrategy.java index af465686e9..9f9dd0a60f 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/BurstTbRuleEngineSubmitStrategy.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/BurstTbRuleEngineSubmitStrategy.java @@ -34,7 +34,7 @@ public class BurstTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSubmitS if (log.isDebugEnabled()) { log.debug("[{}] submitting [{}] messages to rule engine", queueName, orderedMsgList.size()); } - orderedMsgList.forEach(pair -> msgConsumer.accept(pair.uuid, pair.msg)); + orderedMsgList.forEach(pair -> msgConsumer.accept(pair.uuid(), pair.msg())); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/IdMsgPair.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/IdMsgPair.java index e74362699b..6795b2822f 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/IdMsgPair.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/IdMsgPair.java @@ -15,19 +15,9 @@ */ package org.thingsboard.server.service.queue.processing; -import lombok.Getter; +import com.google.protobuf.GeneratedMessageV3; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import java.util.UUID; -public class IdMsgPair { - @Getter - final UUID uuid; - @Getter - final TbProtoQueueMsg msg; - - public IdMsgPair(UUID uuid, TbProtoQueueMsg msg) { - this.uuid = uuid; - this.msg = msg; - } -} +public record IdMsgPair(UUID uuid, TbProtoQueueMsg msg) {} diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/SequentialByEntityIdTbRuleEngineSubmitStrategy.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/SequentialByEntityIdTbRuleEngineSubmitStrategy.java index c72f1274e7..1aa1b20284 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/SequentialByEntityIdTbRuleEngineSubmitStrategy.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/SequentialByEntityIdTbRuleEngineSubmitStrategy.java @@ -51,7 +51,7 @@ public abstract class SequentialByEntityIdTbRuleEngineSubmitStrategy extends Abs entityIdToListMap.forEach((entityId, queue) -> { IdMsgPair msg = queue.peek(); if (msg != null) { - msgConsumer.accept(msg.uuid, msg.msg); + msgConsumer.accept(msg.uuid(), msg.msg()); } }); } @@ -71,13 +71,13 @@ public abstract class SequentialByEntityIdTbRuleEngineSubmitStrategy extends Abs IdMsgPair next = null; synchronized (queue) { IdMsgPair expected = queue.peek(); - if (expected != null && expected.uuid.equals(id)) { + if (expected != null && expected.uuid().equals(id)) { queue.poll(); next = queue.peek(); } } if (next != null) { - msgConsumer.accept(next.uuid, next.msg); + msgConsumer.accept(next.uuid(), next.msg()); } } } @@ -87,9 +87,9 @@ public abstract class SequentialByEntityIdTbRuleEngineSubmitStrategy extends Abs msgToEntityIdMap.clear(); entityIdToListMap.clear(); for (IdMsgPair pair : orderedMsgList) { - EntityId entityId = getEntityId(pair.msg.getValue()); + EntityId entityId = getEntityId(pair.msg().getValue()); if (entityId != null) { - msgToEntityIdMap.put(pair.uuid, entityId); + msgToEntityIdMap.put(pair.uuid(), entityId); entityIdToListMap.computeIfAbsent(entityId, id -> new LinkedList<>()).add(pair); } } diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/SequentialTbRuleEngineSubmitStrategy.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/SequentialTbRuleEngineSubmitStrategy.java index be97853310..c048f42ee0 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/SequentialTbRuleEngineSubmitStrategy.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/SequentialTbRuleEngineSubmitStrategy.java @@ -60,11 +60,11 @@ public class SequentialTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSu int idx = msgIdx.get(); if (idx < listSize) { IdMsgPair pair = orderedMsgList.get(idx); - expectedMsgId = pair.uuid; + expectedMsgId = pair.uuid(); if (log.isDebugEnabled()) { - log.debug("[{}] submitting [{}] message to rule engine", queueName, pair.msg); + log.debug("[{}] submitting [{}] message to rule engine", queueName, pair.msg()); } - msgConsumer.accept(pair.uuid, pair.msg); + msgConsumer.accept(pair.uuid(), pair.msg()); } } diff --git a/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManager.java b/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManager.java index d067be49a0..a6f7e34208 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManager.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManager.java @@ -41,6 +41,7 @@ import org.thingsboard.server.queue.common.consumer.TbQueueConsumerTask; import org.thingsboard.server.queue.discovery.QueueKey; import org.thingsboard.server.service.queue.TbMsgPackCallback; import org.thingsboard.server.service.queue.TbMsgPackProcessingContext; +import org.thingsboard.server.service.queue.TbMsgPackProcessingContextFactory; import org.thingsboard.server.service.queue.TbRuleEngineConsumerStats; import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingDecision; import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingResult; @@ -66,13 +67,15 @@ public class TbRuleEngineQueueConsumerManager extends MainQueueConsumerManager { Integer partitionId = tpi != null ? tpi.getPartition().orElse(-1) : null; @@ -81,6 +84,7 @@ public class TbRuleEngineQueueConsumerManager extends MainQueueConsumerManager submitMessage(packCtx, id, msg)); final boolean timeout = !packCtx.await(queue.getPackProcessingTimeout(), TimeUnit.MILLISECONDS); diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 61b797515a..aa0b5d7920 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1889,6 +1889,9 @@ queue: print-interval-ms: "${TB_QUEUE_RULE_ENGINE_STATS_PRINT_INTERVAL_MS:60000}" # Max length of the error message that is printed by statistics max-error-message-length: "${TB_QUEUE_RULE_ENGINE_MAX_ERROR_MESSAGE_LENGTH:4096}" + prometheus-stats: + # Enable/disable Prometheus statistics for individual Rule Engine message processing (records time in ms for success/failure). + enabled: "${TB_QUEUE_RULE_ENGINE_PROMETHEUS_STATS_ENABLED:true}" # After a queue is deleted (or the profile's isolation option was disabled), Rule Engine will continue reading related topics during this period before deleting the actual topics topic-deletion-delay: "${TB_QUEUE_RULE_ENGINE_TOPIC_DELETION_DELAY_SEC:15}" # Size of the thread pool that handles such operations as partition changes, config updates, queue deletion diff --git a/application/src/test/java/org/thingsboard/server/service/queue/TbMsgPackProcessingContextTest.java b/application/src/test/java/org/thingsboard/server/service/queue/TbMsgPackProcessingContextTest.java index ef1febfa6c..b5d65ea035 100644 --- a/application/src/test/java/org/thingsboard/server/service/queue/TbMsgPackProcessingContextTest.java +++ b/application/src/test/java/org/thingsboard/server/service/queue/TbMsgPackProcessingContextTest.java @@ -15,14 +15,17 @@ */ package org.thingsboard.server.service.queue; -import lombok.extern.slf4j.Slf4j; -import org.junit.After; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; +import com.google.common.util.concurrent.MoreExecutors; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.common.data.DataConstants; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.msg.queue.RuleEngineException; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategy; @@ -35,30 +38,241 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import static org.junit.Assert.assertTrue; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.then; +import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -@Slf4j -@RunWith(MockitoJUnitRunner.class) -public class TbMsgPackProcessingContextTest { +@ExtendWith(MockitoExtension.class) +class TbMsgPackProcessingContextTest { + + TenantId tenantId = TenantId.fromUUID(UUID.randomUUID()); + + @Mock + TbRuleEngineSubmitStrategy submitStrategy; + @Mock + TbProtoQueueMsg mockMsg; + + ConcurrentMap> pendingMap; - public static final int TIMEOUT = 10; ExecutorService executorService; - @After - public void tearDown() { + @BeforeEach + void setup() { + pendingMap = new ConcurrentHashMap<>(); + lenient().when(submitStrategy.getPendingMap()).thenReturn(pendingMap); + } + + @AfterEach + void tearDown() { if (executorService != null) { - executorService.shutdownNow(); + MoreExecutors.shutdownAndAwaitTermination(executorService, 5, TimeUnit.SECONDS); } } @Test - public void testHighConcurrencyCase() throws InterruptedException { - //log.warn("preparing the test..."); + void testAwait_shouldReturnTrue_whenOnSuccessIsCalledBeforeTimeout() throws InterruptedException { + // GIVEN - a context with one pending message + executorService = Executors.newSingleThreadExecutor(); + + UUID msgId = UUID.randomUUID(); + pendingMap.put(msgId, mockMsg); + var context = new TbMsgPackProcessingContext("test-queue", submitStrategy, false); + + // WHEN - onSuccess() is called in another thread before timeout + executorService.submit(() -> { + try { + Thread.sleep(100); + context.onSuccess(msgId); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + }); + + // THEN - await() should return true (successful completion) + boolean result = context.await(5000, TimeUnit.MILLISECONDS); + assertThat(result).as("await() should return true when latch is counted down before timeout").isTrue(); + + // Verify the message was moved to success map + assertThat(context.getSuccessMap()).containsKey(msgId); + assertThat(context.getPendingMap()).isEmpty(); + assertThat(context.getExceptionsMap()).isEmpty(); + + + // Verify submit strategy was notified about successful message processing + then(submitStrategy).should().onSuccess(msgId); + } + + @Test + void testAwait_shouldReturnTrue_whenOnFailureIsCalledBeforeTimeout() throws InterruptedException { + // GIVEN - a context with one pending message + executorService = Executors.newSingleThreadExecutor(); + + UUID msgId = UUID.randomUUID(); + pendingMap.put(msgId, mockMsg); + var context = new TbMsgPackProcessingContext("test-queue", submitStrategy, false); + + var exception = new RuleEngineException("Test exception"); + + // WHEN - onFailure() is called in another thread before timeout + executorService.submit(() -> { + try { + Thread.sleep(100); + context.onFailure(tenantId, msgId, exception); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + }); + + // THEN - await() should return true (successful completion, even if message processing failed) + boolean result = context.await(5000, TimeUnit.MILLISECONDS); + assertThat(result).as("await() should return true when latch is counted down before timeout").isTrue(); + + // Verify the exception was added to exceptions map + assertThat(context.getSuccessMap()).isEmpty(); + assertThat(context.getPendingMap()).isEmpty(); + assertThat(context.getExceptionsMap()).containsEntry(tenantId, exception); + } + + @Test + void testAwait_shouldReturnFalse_whenTimeoutOccurs() throws InterruptedException { + // GIVEN - a context with one pending message and no processing + UUID msgId = UUID.randomUUID(); + pendingMap.put(msgId, mockMsg); + var context = new TbMsgPackProcessingContext("test-queue", submitStrategy, false); + + // WHEN - await() is called with short timeout and no message processing happens + long startTime = System.nanoTime(); + boolean result = context.await(100, TimeUnit.MILLISECONDS); + long elapsedTime = System.nanoTime() - startTime; + + // THEN - await() should return false (timeout occurred) + assertThat(result).as("await() should return false when timeout occurs").isFalse(); + assertThat(elapsedTime).as("await() should wait for at least the timeout duration").isGreaterThanOrEqualTo(100L); + + // Message should still be in pending map + assertThat(context.getSuccessMap()).isEmpty(); + assertThat(context.getPendingMap()).containsKey(msgId); + assertThat(context.getExceptionsMap()).isEmpty(); + } + + @Test + void testAwait_shouldHandleMultiplePendingMessages() throws InterruptedException { + // GIVEN - a context with multiple pending messages + executorService = Executors.newSingleThreadExecutor(); + + UUID msgId1 = UUID.randomUUID(); + UUID msgId2 = UUID.randomUUID(); + UUID msgId3 = UUID.randomUUID(); + + pendingMap.put(msgId1, mockMsg); + pendingMap.put(msgId2, mockMsg); + pendingMap.put(msgId3, mockMsg); + + var context = new TbMsgPackProcessingContext("test-queue", submitStrategy, false); + + // WHEN - messages are processed one by one + executorService.submit(() -> { + try { + Thread.sleep(50); + context.onSuccess(msgId1); + Thread.sleep(50); + context.onSuccess(msgId2); + Thread.sleep(50); + context.onSuccess(msgId3); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + }); + + // THEN - await() should return true only after all messages are processed + boolean result = context.await(5000, TimeUnit.MILLISECONDS); + assertThat(result).as("await() should return true after all messages are processed").isTrue(); + + // All messages should be in success map + assertThat(context.getSuccessMap()).containsKeys(msgId1, msgId2, msgId3); + assertThat(context.getPendingMap()).isEmpty(); + assertThat(context.getExceptionsMap()).isEmpty(); + } + + @Test + void testAwait_shouldNotCountDownPrematurely_withMultipleMessages() throws InterruptedException { + // GIVEN - a context with multiple pending messages + executorService = Executors.newSingleThreadExecutor(); + + UUID msgId1 = UUID.randomUUID(); + UUID msgId2 = UUID.randomUUID(); + + pendingMap.put(msgId1, mockMsg); + pendingMap.put(msgId2, mockMsg); + + var context = new TbMsgPackProcessingContext("test-queue", submitStrategy, false); + + // WHEN - only one message is processed + executorService.submit(() -> { + try { + Thread.sleep(100); + context.onSuccess(msgId1); + // msgId2 still in processing + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + }); + + // THEN: await should timeout because not all messages were processed + boolean result = context.await(2000, TimeUnit.MILLISECONDS); + assertThat(result).as("await() should timeout when not all messages are processed").isFalse(); + + // One message in success, one still pending + assertThat(context.getSuccessMap()).containsOnlyKeys(msgId1); + assertThat(context.getPendingMap()).containsOnlyKeys(msgId2); + assertThat(context.getExceptionsMap()).isEmpty(); + } + + @Test + void testAwait_shouldHandleMixedSuccessAndFailure() throws InterruptedException { + // GIVEN - multiple messages + executorService = Executors.newSingleThreadExecutor(); + + UUID msgId1 = UUID.randomUUID(); + UUID msgId2 = UUID.randomUUID(); + + pendingMap.put(msgId1, mockMsg); + pendingMap.put(msgId2, mockMsg); + + var context = new TbMsgPackProcessingContext("test-queue", submitStrategy, false); + + var exception = new RuleEngineException("Test exception"); + + // WHEN - one succeeds, one fails + executorService.submit(() -> { + try { + Thread.sleep(50); + context.onSuccess(msgId1); + Thread.sleep(50); + context.onFailure(tenantId, msgId2, exception); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + }); + + // THEN - await() should complete successfully + boolean result = context.await(5000, TimeUnit.MILLISECONDS); + assertThat(result).as("await() should return true when all messages are processed").isTrue(); + + assertThat(context.getSuccessMap()).containsOnlyKeys(msgId1); + assertThat(context.getPendingMap()).isEmpty(); + assertThat(context.getExceptionsMap()).containsEntry(tenantId, exception); + } + + @Test + void testHighConcurrencyCase() throws InterruptedException { int msgCount = 1000; int parallelCount = 5; executorService = Executors.newFixedThreadPool(parallelCount, ThingsBoardThreadFactory.forName(getClass().getSimpleName() + "-test-scope")); @@ -76,28 +290,24 @@ public class TbMsgPackProcessingContextTest { final CountDownLatch startLatch = new CountDownLatch(1); final CountDownLatch finishLatch = new CountDownLatch(parallelCount); for (int i = 0; i < parallelCount; i++) { - //final String taskName = "" + uuid + " " + i; executorService.submit(() -> { - //log.warn("ready {}", taskName); readyLatch.countDown(); try { startLatch.await(); } catch (InterruptedException e) { - Assert.fail("failed to await"); + fail("failed to await"); } - //log.warn("go {}", taskName); - context.onSuccess(uuid); - finishLatch.countDown(); }); } - assertTrue(readyLatch.await(TIMEOUT, TimeUnit.SECONDS)); + assertTrue(readyLatch.await(10, TimeUnit.SECONDS)); Thread.yield(); startLatch.countDown(); //run all-at-once submitted tasks - assertTrue(finishLatch.await(TIMEOUT, TimeUnit.SECONDS)); + assertTrue(finishLatch.await(10, TimeUnit.SECONDS)); } - assertTrue(context.await(TIMEOUT, TimeUnit.SECONDS)); + assertTrue(context.await(10, TimeUnit.SECONDS)); verify(strategyMock, times(msgCount)).onSuccess(any(UUID.class)); } + } diff --git a/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/RuleEngineConsumerLoopTest.java b/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/RuleEngineConsumerLoopTest.java new file mode 100644 index 0000000000..1619283586 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/RuleEngineConsumerLoopTest.java @@ -0,0 +1,281 @@ +/** + * Copyright © 2016-2025 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. + */ +package org.thingsboard.server.service.queue.ruleengine; + +import com.google.common.util.concurrent.MoreExecutors; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InOrder; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.thingsboard.common.util.ThingsBoardExecutors; +import org.thingsboard.common.util.ThingsBoardThreadFactory; +import org.thingsboard.server.actors.ActorSystemContext; +import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.msg.TbMsgType; +import org.thingsboard.server.common.data.queue.ProcessingStrategy; +import org.thingsboard.server.common.data.queue.ProcessingStrategyType; +import org.thingsboard.server.common.data.queue.Queue; +import org.thingsboard.server.common.data.queue.SubmitStrategy; +import org.thingsboard.server.common.data.queue.SubmitStrategyType; +import org.thingsboard.server.common.msg.TbMsg; +import org.thingsboard.server.common.msg.TbMsgMetaData; +import org.thingsboard.server.common.msg.queue.ServiceType; +import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; +import org.thingsboard.server.common.stats.StatsFactory; +import org.thingsboard.server.gen.transport.TransportProtos; +import org.thingsboard.server.queue.TbQueueAdmin; +import org.thingsboard.server.queue.TbQueueConsumer; +import org.thingsboard.server.queue.TbQueueMsg; +import org.thingsboard.server.queue.common.DefaultTbQueueMsgHeaders; +import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.discovery.PartitionService; +import org.thingsboard.server.queue.discovery.QueueKey; +import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.memory.DefaultInMemoryStorage; +import org.thingsboard.server.queue.memory.InMemoryStorage; +import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer; +import org.thingsboard.server.queue.provider.TbQueueProducerProvider; +import org.thingsboard.server.queue.provider.TbRuleEngineQueueFactory; +import org.thingsboard.server.service.queue.TbMsgPackProcessingContext; +import org.thingsboard.server.service.queue.TbMsgPackProcessingContextFactory; +import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingStrategyFactory; +import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategy; +import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategyFactory; +import org.thingsboard.server.service.stats.RuleEngineStatisticsService; + +import java.time.Duration; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class RuleEngineConsumerLoopTest { + + TenantId tenantId = TenantId.fromUUID(UUID.randomUUID()); + DeviceId deviceId = new DeviceId(UUID.randomUUID()); + + InMemoryStorage storage; + + @Mock + ActorSystemContext actorContext; + @Mock + StatsFactory statsFactory; + @Mock + TbRuleEngineQueueFactory queueFactory; + @Mock + RuleEngineStatisticsService statisticsService; + @Mock + TbServiceInfoProvider serviceInfoProvider; + @Mock + PartitionService partitionService; + @Mock + TbQueueProducerProvider producerProvider; + @Mock + TbQueueAdmin queueAdmin; + @Mock + TbMsgPackProcessingContextFactory packProcessingContextFactory; + @Mock + TbMsgPackProcessingContext packCtx; + + Queue mainQueue; + + TbQueueConsumer> consumer; + + TbRuleEngineConsumerContext ruleEngineConsumerContext; + TbRuleEngineQueueConsumerManager consumerManager; + + ExecutorService consumersExecutor; + ScheduledExecutorService scheduler; + ExecutorService mgmtExecutor; + + @BeforeEach + void setup() throws InterruptedException { + consumersExecutor = Executors.newCachedThreadPool(ThingsBoardThreadFactory.forName("tb-rule-engine-consumer")); + scheduler = ThingsBoardExecutors.newSingleThreadScheduledExecutor("tb-rule-engine-consumer-scheduler"); + mgmtExecutor = ThingsBoardExecutors.newWorkStealingPool(1, "tb-rule-engine-mgmt"); + + mainQueue = new Queue(); + mainQueue.setTenantId(TenantId.SYS_TENANT_ID); + mainQueue.setName("Main"); + mainQueue.setTopic("tb_rule_engine.main"); + mainQueue.setPollInterval(25); + mainQueue.setPartitions(1); + mainQueue.setConsumerPerPartition(false); + mainQueue.setPackProcessingTimeout(2000L); + + var submitStrategy = new SubmitStrategy(); + submitStrategy.setType(SubmitStrategyType.BURST); + submitStrategy.setBatchSize(1000); + mainQueue.setSubmitStrategy(submitStrategy); + + var processingStrategy = new ProcessingStrategy(); + processingStrategy.setType(ProcessingStrategyType.SKIP_ALL_FAILURES); + processingStrategy.setRetries(3); + processingStrategy.setFailurePercentage(0.0); + processingStrategy.setPauseBetweenRetries(3); + processingStrategy.setMaxPauseBetweenRetries(3); + mainQueue.setProcessingStrategy(processingStrategy); + + storage = new DefaultInMemoryStorage(); + + consumer = spy(new InMemoryTbQueueConsumer<>(storage, mainQueue.getTopic())); + given(queueFactory.createToRuleEngineMsgConsumer(eq(mainQueue), isNull())).willReturn(consumer); + + ruleEngineConsumerContext = new TbRuleEngineConsumerContext( + actorContext, statsFactory, new TbRuleEngineSubmitStrategyFactory(), new TbRuleEngineProcessingStrategyFactory(), + queueFactory, statisticsService, serviceInfoProvider, partitionService, producerProvider, queueAdmin + ); + ruleEngineConsumerContext.setPollDuration(25); + ruleEngineConsumerContext.setPackProcessingTimeout(2000); + ruleEngineConsumerContext.setStatsEnabled(false); // true by default + ruleEngineConsumerContext.setPrometheusStatsEnabled(false); + ruleEngineConsumerContext.setTopicDeletionDelayInSec(15); + ruleEngineConsumerContext.setMgmtThreadPoolSize(12); + + // Tell the (mock) context factory to return (mock) message pack context + given(packProcessingContextFactory.create( + eq(mainQueue.getName()), + any(TbRuleEngineSubmitStrategy.class), + eq(false) + )).willAnswer(invocation -> { + TbRuleEngineSubmitStrategy realStrategy = invocation.getArgument(1); + when(packCtx.getPendingMap()).thenAnswer(i -> realStrategy.getPendingMap()); + when(packCtx.getFailedMap()).thenReturn(new ConcurrentHashMap<>()); + return packCtx; + }); + + // Tell the (mock) context's await() to return 'false' (always timeout) immediately + given(packCtx.await(anyLong(), any(TimeUnit.class))).willReturn(false); + + consumerManager = TbRuleEngineQueueConsumerManager.create() + .ctx(ruleEngineConsumerContext) + .queueKey(new QueueKey(ServiceType.TB_RULE_ENGINE, mainQueue)) + .consumerExecutor(consumersExecutor) + .scheduler(scheduler) + .taskExecutor(mgmtExecutor) + .packProcessingContextFactory(packProcessingContextFactory) + .build(); + } + + @AfterEach + void destroy() { + MoreExecutors.shutdownAndAwaitTermination(scheduler, Duration.ofSeconds(30)); + MoreExecutors.shutdownAndAwaitTermination(mgmtExecutor, Duration.ofSeconds(30)); + MoreExecutors.shutdownAndAwaitTermination(consumersExecutor, Duration.ofSeconds(30)); + } + + @Test + void consumerLoopTest_verifyOperationsOrder() throws InterruptedException { + // Create partition + var partition = TopicPartitionInfo.builder() + .tenantId(TenantId.SYS_TENANT_ID) + .topic(mainQueue.getTopic()) + .partition(0) + .myPartition(true) + .useInternalPartition(false) + .build(); + + // Put 10k messages to the queue + for (int i = 0; i < 10_000; i++) { + var tbMsg = TbMsg.newMsg() + .type(TbMsgType.POST_TELEMETRY_REQUEST) + .originator(deviceId) + .data("{\"temperature\":123}") + .metaData(TbMsgMetaData.EMPTY) + .build(); + + var toRuleEngineMsg = TransportProtos.ToRuleEngineMsg.newBuilder() + .setTenantIdLSB(tenantId.getId().getLeastSignificantBits()) + .setTenantIdMSB(tenantId.getId().getMostSignificantBits()) + .setTbMsgProto(TbMsg.toProto(tbMsg)) + .addAllRelationTypes(Set.of("Success")) + .build(); + + storage.put(partition.getFullTopicName(), new TbProtoQueueMsg<>(UUID.randomUUID(), toRuleEngineMsg, new DefaultTbQueueMsgHeaders())); + } + + // Count how many polls were made + var totalPolls = new AtomicInteger(0); + var emptyPolls = new AtomicInteger(0); + doAnswer(invocation -> { + totalPolls.incrementAndGet(); + @SuppressWarnings("unchecked") + var messages = (List) invocation.callRealMethod(); + if (messages.isEmpty()) { + emptyPolls.incrementAndGet(); + } + return messages; + }).when(consumer).poll(mainQueue.getPollInterval()); + + // Count how many commits were made + var totalCommits = new AtomicInteger(0); + doAnswer(invocation -> { + totalCommits.incrementAndGet(); + return invocation.callRealMethod(); + }).when(consumer).commit(); + + // Initialize consumer + consumerManager.init(mainQueue); + + // Assign partition to the consumer + consumerManager.update(Set.of(partition)); + + // Give some time for the consumer to get all messages + await().atMost(Duration.ofSeconds(10L)).until(() -> storage.getLagTotal() == 0); + + // Stop consumer + consumerManager.stop(); + consumerManager.awaitStop(); + + // Determine number of non-empty consumer iterations made, since polling does not stop immediately after consuming all messages and may do a few empty polls + int nonEmptyPolls = totalPolls.get() - emptyPolls.get(); + + // Verify that there is 10 polls and 10 matching commits + // Each poll consumes 1k messages and queue has 10k total, so that means 10k total msgs / 1k msgs per poll = 10 polls + assertThat(nonEmptyPolls).isEqualTo(10).isEqualTo(totalCommits.get()); + + // Verify that poll-await-commit cycle happened in order with correct await timeout + InOrder inOrder = inOrder(consumer, packCtx); + for (int i = 0; i < nonEmptyPolls; i++) { + inOrder.verify(consumer).poll(mainQueue.getPollInterval()); + inOrder.verify(packCtx).await(mainQueue.getPackProcessingTimeout(), TimeUnit.MILLISECONDS); + inOrder.verify(consumer).commit(); + } + } + +} From 56a83b6cfec7794a92cae6889722d0bb5e565d0d Mon Sep 17 00:00:00 2001 From: Dmytro Skarzhynets Date: Tue, 28 Oct 2025 16:19:05 +0200 Subject: [PATCH 002/579] Fix existing test --- .../queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java | 2 ++ .../service/queue/ruleengine/TbRuleEngineStrategyTest.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java b/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java index bcbe52b5c9..3c54d421e4 100644 --- a/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java +++ b/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java @@ -59,6 +59,7 @@ import org.thingsboard.server.queue.provider.KafkaMonolithQueueFactory; import org.thingsboard.server.queue.provider.KafkaTbRuleEngineQueueFactory; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.provider.TbRuleEngineQueueFactory; +import org.thingsboard.server.service.queue.TbMsgPackProcessingContextFactory; import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingStrategyFactory; import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategyFactory; import org.thingsboard.server.service.stats.RuleEngineStatisticsService; @@ -194,6 +195,7 @@ public class TbRuleEngineQueueConsumerManagerTest { .consumerExecutor(consumersExecutor) .scheduler(scheduler) .taskExecutor(mgmtExecutor) + .packProcessingContextFactory(new TbMsgPackProcessingContextFactory.DefaultTbMsgPackProcessingContextFactory()) .build(); } diff --git a/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineStrategyTest.java b/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineStrategyTest.java index 1106fad5b6..c27a03619a 100644 --- a/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineStrategyTest.java +++ b/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineStrategyTest.java @@ -44,6 +44,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.QueueKey; +import org.thingsboard.server.service.queue.TbMsgPackProcessingContextFactory; import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingStrategyFactory; import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategyFactory; @@ -194,6 +195,7 @@ public class TbRuleEngineStrategyTest { var consumerManager = TbRuleEngineQueueConsumerManager.create() .ctx(ruleEngineConsumerContext) .queueKey(queueKey) + .packProcessingContextFactory(new TbMsgPackProcessingContextFactory.DefaultTbMsgPackProcessingContextFactory()) .build(); consumerManager.init(queue); From 33c76828e3aa7efbcad40a1d74ddc008e74e6bb0 Mon Sep 17 00:00:00 2001 From: Ekaterina Chantsova Date: Thu, 27 Nov 2025 20:08:40 +0200 Subject: [PATCH 003/579] Map widgets: fix subscription for latest data when aggregation enabled for one of keys --- .../core/services/dashboard-utils.service.ts | 1 + .../basic/map/map-basic-config.component.html | 2 +- .../basic/map/map-basic-config.component.ts | 26 +++++++++++++------ .../home/components/widget/lib/maps/map.ts | 6 ++++- .../widget/widget-config.component.ts | 17 ++++++++---- 5 files changed, 37 insertions(+), 15 deletions(-) diff --git a/ui-ngx/src/app/core/services/dashboard-utils.service.ts b/ui-ngx/src/app/core/services/dashboard-utils.service.ts index b630811f93..d2a6ce6f20 100644 --- a/ui-ngx/src/app/core/services/dashboard-utils.service.ts +++ b/ui-ngx/src/app/core/services/dashboard-utils.service.ts @@ -297,6 +297,7 @@ export class DashboardUtilsService { } widgetConfig.datasources = this.validateAndUpdateDatasources(widgetConfig.datasources); if (type === widgetType.latest) { + // TODO: the following won't work for maps if (datasourcesHasAggregation(widgetConfig.datasources)) { const onlyHistoryTimewindow = datasourcesHasOnlyComparisonAggregation(widgetConfig.datasources); widgetConfig.timewindow = initModelFromDefaultTimewindow(widgetConfig.timewindow, true, diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.html b/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.html index d6634949e2..43bfeb73ad 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.html @@ -16,7 +16,7 @@ --> - + , protected widgetConfigComponent: WidgetConfigComponent, private $injector: Injector, @@ -106,15 +107,11 @@ export class MapBasicConfigComponent extends BasicWidgetConfigComponent { actions: [configData.config.actions || {}, []] }); - if (this.trip) { - this.mapWidgetConfigForm.addControl('timewindowConfig', this.fb.control(getTimewindowConfig(configData.config))) - } + this.mapWidgetConfigForm.addControl('timewindowConfig', this.fb.control(getTimewindowConfig(configData.config))); } protected prepareOutputConfig(config: any): WidgetConfigComponentData { - if (this.trip) { - setTimewindowConfig(this.widgetConfig.config, config.timewindowConfig); - } + setTimewindowConfig(this.widgetConfig.config, config.timewindowConfig); this.widgetConfig.config.settings = config.mapSettings || {}; this.widgetConfig.config.showTitle = config.showTitle; @@ -186,4 +183,17 @@ export class MapBasicConfigComponent extends BasicWidgetConfigComponent { config.enableFullscreen = buttons.includes('fullscreen'); } + public get displayTimewindowConfig(): boolean { + if (this.trip) { + return true; + } else { + const widgetDefinition = findWidgetModelDefinition(this.widget); + if (widgetDefinition) { + return widgetDefinition.hasTimewindow(this.widget); + } else { + return false; + } + } + } + } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/maps/map.ts b/ui-ngx/src/app/modules/home/components/widget/lib/maps/map.ts index 68bbff277d..5a37643fe4 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/maps/map.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/maps/map.ts @@ -342,7 +342,8 @@ export abstract class TbMap { const dataLayersSubscriptionOptions: WidgetSubscriptionOptions = { datasources, hasDataPageLink: true, - useDashboardTimewindow: false, + useDashboardTimewindow: isDefined(this.ctx.widgetConfig.useDashboardTimewindow) + ? this.ctx.widgetConfig.useDashboardTimewindow : true, type: widgetType.latest, callbacks: { onDataUpdated: (subscription) => { @@ -354,6 +355,9 @@ export abstract class TbMap { } } }; + if (!dataLayersSubscriptionOptions.useDashboardTimewindow) { + dataLayersSubscriptionOptions.timeWindowConfig = this.ctx.widgetConfig.timewindow; + } this.ctx.subscriptionApi.createSubscription(dataLayersSubscriptionOptions, false).subscribe( (dataLayersSubscription) => { let pageSize = this.settings.mapPageSize; diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts index 5967fb4c1a..f902c7318d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts @@ -38,10 +38,11 @@ import { TargetDevice, targetDeviceValid, Widget, - widgetTypeCanHaveTimewindow, WidgetConfigMode, widgetTitleAutocompleteValues, - widgetType + widgetType, + widgetTypeCanHaveTimewindow, + widgetTypeHasTimewindow } from '@shared/models/widget.models'; import { AsyncValidator, @@ -88,6 +89,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { WidgetService } from '@core/http/widget.service'; import { TimeService } from '@core/services/time.service'; import { initModelFromDefaultTimewindow } from '@shared/models/time/time.models'; +import { findWidgetModelDefinition } from '@shared/models/widget/widget-model.definition'; import Timeout = NodeJS.Timeout; @Component({ @@ -734,11 +736,16 @@ export class WidgetConfigComponent extends PageComponent implements OnInit, OnDe } public get displayTimewindowConfig(): boolean { - if (this.widgetType === widgetType.timeseries || this.widgetType === widgetType.alarm) { + if (widgetTypeHasTimewindow(this.widgetType)) { return true; } else if (this.widgetType === widgetType.latest) { - const datasources = this.dataSettings.get('datasources').value; - return datasourcesHasAggregation(datasources); + const widgetDefinition = findWidgetModelDefinition(this.widget); + if (widgetDefinition) { + return widgetDefinition.hasTimewindow(this.widget); + } else { + const datasources = this.dataSettings.get('datasources').value; + return datasourcesHasAggregation(datasources); + } } } From 4a6177d85e94c3c221be5d9fdbeae73dde547479 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 27 Nov 2025 23:14:17 +0100 Subject: [PATCH 004/579] monitoring service improvements: provisioning dashboard, make monitoring asset and dashboard public, log dashboard url, notify on startup and shutdown, shutdown thread pools on PreDestroy, removed file based logback in favour of stdout, logback severity down to INFO, JAVA_OPTS adjusted --- monitoring/src/main/conf/logback.xml | 20 +- monitoring/src/main/conf/tb-monitoring.conf | 7 +- .../ThingsboardMonitoringApplication.java | 37 +- .../data/notification/InfoNotification.java | 27 + .../notification/NotificationService.java | 29 +- .../service/MonitoringEntityService.java | 120 +++- .../resources/dashboard_cloud_monitoring.json | 580 ++++++++++++++++++ monitoring/src/main/resources/logback.xml | 3 +- 8 files changed, 772 insertions(+), 51 deletions(-) create mode 100644 monitoring/src/main/java/org/thingsboard/monitoring/data/notification/InfoNotification.java create mode 100644 monitoring/src/main/resources/dashboard_cloud_monitoring.json diff --git a/monitoring/src/main/conf/logback.xml b/monitoring/src/main/conf/logback.xml index 53caafe8bb..43001ffd43 100644 --- a/monitoring/src/main/conf/logback.xml +++ b/monitoring/src/main/conf/logback.xml @@ -19,20 +19,6 @@ - - ${pkg.logFolder}/${pkg.name}.log - - ${pkg.logFolder}/${pkg.name}.%d{yyyy-MM-dd}.%i.log - 100MB - 30 - 3GB - - - %d{ISO8601} [%thread] %-5level %logger{36} - %msg%n - - %d{ISO8601} [%thread] %-5level %logger{36} - %msg%n @@ -40,11 +26,11 @@ - - + + + - diff --git a/monitoring/src/main/conf/tb-monitoring.conf b/monitoring/src/main/conf/tb-monitoring.conf index 493d498cd8..cd2947563f 100644 --- a/monitoring/src/main/conf/tb-monitoring.conf +++ b/monitoring/src/main/conf/tb-monitoring.conf @@ -14,9 +14,10 @@ # limitations under the License. # -export JAVA_OPTS="$JAVA_OPTS -Xlog:gc*,heap*,age*,safepoint=debug:file=/var/log/tb-monitoring/gc.log:time,uptime,level,tags:filecount=10,filesize=10M" +export JAVA_OPTS="$JAVA_OPTS -Xlog:gc*,heap*,age*,safepoint=debug:file=/var/log/tb-monitoring/gc.log:time,uptime,level,tags:filecount=3,filesize=10M" export JAVA_OPTS="$JAVA_OPTS -XX:+IgnoreUnrecognizedVMOptions -XX:+HeapDumpOnOutOfMemoryError" -export JAVA_OPTS="$JAVA_OPTS -XX:-UseBiasedLocking -XX:+UseTLAB -XX:+ResizeTLAB -XX:+PerfDisableSharedMem -XX:+UseCondCardMark" -export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:+UseStringDeduplication -XX:+ParallelRefProcEnabled -XX:MaxTenuringThreshold=10" +export JAVA_OPTS="$JAVA_OPTS -XX:+UseTLAB -XX:+ResizeTLAB -XX:+PerfDisableSharedMem -XX:+UseCondCardMark" +export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:+ParallelRefProcEnabled -XX:MaxTenuringThreshold=10" +export JAVA_OPTS="$JAVA_OPTS -XX:+ExitOnOutOfMemoryError" export LOG_FILENAME=tb-monitoring.out export LOADER_PATH=/usr/share/tb-monitoring/conf diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/ThingsboardMonitoringApplication.java b/monitoring/src/main/java/org/thingsboard/monitoring/ThingsboardMonitoringApplication.java index c8e8d7070b..f225d0d771 100644 --- a/monitoring/src/main/java/org/thingsboard/monitoring/ThingsboardMonitoringApplication.java +++ b/monitoring/src/main/java/org/thingsboard/monitoring/ThingsboardMonitoringApplication.java @@ -15,36 +15,43 @@ */ package org.thingsboard.monitoring; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; +import org.springframework.context.event.ContextClosedEvent; import org.springframework.scheduling.annotation.EnableScheduling; import org.thingsboard.common.util.ThingsBoardExecutors; +import org.thingsboard.monitoring.data.notification.InfoNotification; +import org.thingsboard.monitoring.notification.NotificationService; import org.thingsboard.monitoring.service.BaseMonitoringService; import org.thingsboard.monitoring.service.MonitoringEntityService; +import jakarta.annotation.PreDestroy; import java.util.List; import java.util.Map; +import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @SpringBootApplication @EnableScheduling @Slf4j +@RequiredArgsConstructor public class ThingsboardMonitoringApplication { - @Autowired - private List> monitoringServices; - @Autowired - private MonitoringEntityService entityService; + private final List> monitoringServices; + private final MonitoringEntityService entityService; + private final NotificationService notificationService; @Value("${monitoring.monitoring_rate_ms}") private int monitoringRateMs; + ScheduledExecutorService scheduler = ThingsBoardExecutors.newSingleThreadScheduledExecutor("monitoring-executor"); + public static void main(String[] args) { new SpringApplicationBuilder(ThingsboardMonitoringApplication.class) .properties(Map.of("spring.config.name", "tb-monitoring")) @@ -56,12 +63,30 @@ public class ThingsboardMonitoringApplication { entityService.checkEntities(); monitoringServices.forEach(BaseMonitoringService::init); - ScheduledExecutorService scheduler = ThingsBoardExecutors.newSingleThreadScheduledExecutor("monitoring-executor"); scheduler.scheduleWithFixedDelay(() -> { monitoringServices.forEach(monitoringService -> { monitoringService.runChecks(); }); }, 0, monitoringRateMs, TimeUnit.MILLISECONDS); + notificationService.sendNotification(new InfoNotification(":rocket: Monitoring started")); + } + + @EventListener(ContextClosedEvent.class) + public void onShutdown(ContextClosedEvent event) { + log.info("Shutting down monitoring service"); + try { + var futures = notificationService.sendNotification(new InfoNotification(":warning: Monitoring is shutting down")); + for (Future future : futures) { + future.get(5, TimeUnit.SECONDS); + } + } catch (Exception e) { + log.warn("Failed to send shutdown notification", e); + } + } + + @PreDestroy + public void shutdownScheduler() { + scheduler.shutdown(); } } diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/data/notification/InfoNotification.java b/monitoring/src/main/java/org/thingsboard/monitoring/data/notification/InfoNotification.java new file mode 100644 index 0000000000..6aa42cbf2b --- /dev/null +++ b/monitoring/src/main/java/org/thingsboard/monitoring/data/notification/InfoNotification.java @@ -0,0 +1,27 @@ +/** + * Copyright © 2016-2025 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. + */ +package org.thingsboard.monitoring.data.notification; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class InfoNotification implements Notification { + private final String message; + @Override + public String getText() { + return message; + } +} diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/notification/NotificationService.java b/monitoring/src/main/java/org/thingsboard/monitoring/notification/NotificationService.java index 5e4dcb2f34..3a496fc016 100644 --- a/monitoring/src/main/java/org/thingsboard/monitoring/notification/NotificationService.java +++ b/monitoring/src/main/java/org/thingsboard/monitoring/notification/NotificationService.java @@ -22,10 +22,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.thingsboard.monitoring.data.notification.Notification; import org.thingsboard.monitoring.notification.channels.NotificationChannel; +import jakarta.annotation.PreDestroy; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; @Component @RequiredArgsConstructor @@ -38,22 +41,38 @@ public class NotificationService { @Value("${monitoring.notifications.message_prefix}") private String messagePrefix; - public void sendNotification(Notification notification) { + public List> sendNotification(Notification notification) { String message; if (StringUtils.isEmpty(messagePrefix)) { message = notification.getText(); } else { - message = messagePrefix + System.lineSeparator() + notification.getText(); + message = messagePrefix + " " + notification.getText(); } - notificationChannels.forEach(notificationChannel -> { + return notificationChannels.stream().map(notificationChannel -> notificationExecutor.submit(() -> { try { notificationChannel.sendNotification(message); } catch (Exception e) { log.error("Failed to send notification to {}", notificationChannel.getClass().getSimpleName(), e); } - }); - }); + }) + ).toList(); } + @PreDestroy + public void shutdownExecutor() { + try { + notificationExecutor.shutdown(); + if (!notificationExecutor.awaitTermination(10, TimeUnit.SECONDS)) { + java.util.List dropped = notificationExecutor.shutdownNow(); + log.warn("Notification executor did not terminate in time. Forced shutdown; {} task(s) will not be executed.", dropped.size()); + } + } catch (InterruptedException e) { + java.util.List dropped = notificationExecutor.shutdownNow(); + Thread.currentThread().interrupt(); + log.warn("Interrupted during notification executor shutdown. Forced shutdown; {} task(s) will not be executed.", dropped.size()); + } catch (Exception e) { + log.warn("Unexpected error while shutting down notification executor", e); + } + } } diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringEntityService.java b/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringEntityService.java index 062104ecd5..fad9bc6b7c 100644 --- a/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringEntityService.java +++ b/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringEntityService.java @@ -30,13 +30,19 @@ import org.thingsboard.monitoring.config.transport.TransportMonitoringTarget; import org.thingsboard.monitoring.config.transport.TransportType; import org.thingsboard.monitoring.util.ResourceUtils; import org.thingsboard.server.common.data.DataConstants; +import org.thingsboard.server.common.data.Dashboard; +import org.thingsboard.server.common.data.DashboardInfo; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfileType; import org.thingsboard.server.common.data.DeviceTransportType; +import org.thingsboard.server.common.data.ShortCustomerInfo; import org.thingsboard.server.common.data.TbResource; import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.cf.CalculatedField; +import org.thingsboard.server.common.data.id.DashboardId; +import org.thingsboard.server.common.data.page.PageData; +import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.cf.CalculatedFieldType; import org.thingsboard.server.common.data.cf.configuration.Argument; import org.thingsboard.server.common.data.cf.configuration.ArgumentType; @@ -57,7 +63,6 @@ import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileTra import org.thingsboard.server.common.data.device.profile.DeviceProfileData; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.kv.KvEntry; -import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChainMetaData; import org.thingsboard.server.common.data.rule.RuleChainType; @@ -66,6 +71,8 @@ import org.thingsboard.server.common.data.security.DeviceCredentialsType; import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import static org.thingsboard.monitoring.service.BaseHealthChecker.TEST_CF_TELEMETRY_KEY; @@ -76,6 +83,9 @@ import static org.thingsboard.monitoring.service.BaseHealthChecker.TEST_TELEMETR @RequiredArgsConstructor public class MonitoringEntityService { + private static final String DASHBOARD_TITLE = "[Monitoring] Cloud monitoring"; + private static final String DASHBOARD_RESOURCE_PATH = "dashboard_cloud_monitoring.json"; + private final TbClient tbClient; @Value("${monitoring.calculated_fields.enabled:true}") @@ -95,27 +105,34 @@ public class MonitoringEntityService { int currentVersion = Integer.parseInt(attributes.getOrDefault("version", "0")); int newVersion = ruleChainDescriptor.get("version").asInt(); if (currentVersion == newVersion) { - log.info("Not updating rule chain, version is the same ({})", currentVersion); - return; + log.debug("Not updating rule chain, version is the same ({})", currentVersion); } else { log.info("Updating rule chain '{}' from version {} to {}", ruleChain.getName(), currentVersion, newVersion); + + String metadataJson = RegexUtils.replace(ruleChainDescriptor.get("metadata").toString(), + "\\$\\{MONITORING:(.+?)}", matchResult -> { + String key = matchResult.group(1); + String value = attributes.get(key); + if (value == null) { + throw new IllegalArgumentException("No attribute found for key " + key); + } + log.info("Using {}: {}", key, value); + return value; + }); + RuleChainMetaData metaData = JacksonUtil.fromString(metadataJson, RuleChainMetaData.class); + metaData.setRuleChainId(ruleChainId); + tbClient.saveRuleChainMetaData(metaData); + tbClient.saveEntityAttributesV2(ruleChainId, DataConstants.SERVER_SCOPE, JacksonUtil.newObjectNode() + .put("version", newVersion)); } - String metadataJson = RegexUtils.replace(ruleChainDescriptor.get("metadata").toString(), - "\\$\\{MONITORING:(.+?)}", matchResult -> { - String key = matchResult.group(1); - String value = attributes.get(key); - if (value == null) { - throw new IllegalArgumentException("No attribute found for key " + key); - } - log.info("Using {}: {}", key, value); - return value; - }); - RuleChainMetaData metaData = JacksonUtil.fromString(metadataJson, RuleChainMetaData.class); - metaData.setRuleChainId(ruleChainId); - tbClient.saveRuleChainMetaData(metaData); - tbClient.saveEntityAttributesV2(ruleChainId, DataConstants.SERVER_SCOPE, JacksonUtil.newObjectNode() - .put("version", newVersion)); + Asset asset = getOrCreateMonitoringAsset(); + Dashboard dashboard = getOrCreateMonitoringDashboard(); + + tbClient.assignAssetToPublicCustomer(asset.getId()); + tbClient.assignDashboardToPublicCustomer(dashboard.getId()); + + getDashboardPublicLink(dashboard); } public Asset getOrCreateMonitoringAsset() { @@ -249,4 +266,71 @@ public class MonitoringEntityService { tbClient.saveCalculatedField(calculatedField); } + private String getDashboardPublicLink(Dashboard dashboard) { + String link = ""; + try { + Optional infoOpt = tbClient.getDashboardInfoById(dashboard.getId()); + if (infoOpt.isPresent()) { + String publicCustomerId = null; + Set customers = infoOpt.get().getAssignedCustomers(); + if (customers != null) { + publicCustomerId = customers.stream() + .filter(ShortCustomerInfo::isPublic) + .map(c -> c.getCustomerId().getId().toString()) + .findFirst().orElse(null); + } + if (publicCustomerId != null) { + link = buildPublicDashboardLink(dashboard.getId(), publicCustomerId); + log.info("Public Monitoring dashboard link: {}", link); + } else { + log.warn("Dashboard is not assigned to public customer. Public link can't be generated."); + } + } + } catch (Exception e) { + log.error("Failed to get a public link to Monitoring dashboard ", e); + } + return link; + } + + private Dashboard getOrCreateMonitoringDashboard() { + Dashboard existing = findDashboardByTitle(DASHBOARD_TITLE).orElse(null); + if (existing != null) { + log.debug("Found Monitoring dashboard '{}' with id {}", existing.getTitle(), existing.getId()); + return existing; + } + + Dashboard dashboardFromResource = ResourceUtils.getResource(DASHBOARD_RESOURCE_PATH, Dashboard.class); + dashboardFromResource.setTitle(DASHBOARD_TITLE); + //Optional.ofNullable(existing).map(Dashboard::getId).ifPresent(dashboardFromResource::setId); + Dashboard saved = tbClient.saveDashboard(dashboardFromResource); + log.info("Created Monitoring dashboard '{}' with id {}", saved.getTitle(), saved.getId()); + return saved; + } + + private Optional findDashboardByTitle(String title) { + // Use text search first and then filter by exact title + PageData page = tbClient.getTenantDashboards(new PageLink(10, 0, title)); + return page.getData().stream() + .filter(info -> title.equals(info.getTitle())) + .findFirst() + .flatMap(info -> tbClient.getDashboardById(info.getId())); + } + + private String buildPublicDashboardLink(DashboardId dashboardId, String publicCustomerId) { + String base = getBaseUrl(); + return String.format("%s/dashboard/%s?publicId=%s", base, dashboardId.getId().toString(), publicCustomerId); + } + + private String getBaseUrl() { + // TbClient.baseURL contains the root url, without trailing slash + try { + var baseUrlField = tbClient.getClass().getSuperclass().getDeclaredField("baseURL"); + baseUrlField.setAccessible(true); + return (String) baseUrlField.get(tbClient); + } catch (Exception e) { + log.warn("Unable to access baseURL from RestClient. Falling back to http://localhost:8080"); + return "http://localhost:8080"; + } + } + } diff --git a/monitoring/src/main/resources/dashboard_cloud_monitoring.json b/monitoring/src/main/resources/dashboard_cloud_monitoring.json new file mode 100644 index 0000000000..8be9677c61 --- /dev/null +++ b/monitoring/src/main/resources/dashboard_cloud_monitoring.json @@ -0,0 +1,580 @@ +{ + "title": "Cloud - Monitoring", + "image": null, + "mobileHide": false, + "mobileOrder": null, + "configuration": { + "description": "", + "widgets": { + "7db7f580-2aac-d7ee-20f6-3d9315e7003f": { + "type": "timeseries", + "sizeX": 8, + "sizeY": 5, + "config": { + "datasources": [ + { + "type": "entity", + "name": null, + "entityAliasId": "6451461f-d748-9528-e3cd-64078c7fae05", + "filterId": null, + "dataKeys": [ + { + "name": "arrivalLatency", + "type": "timeseries", + "label": "Arrival latency", + "color": "#ffc107", + "settings": {}, + "_hash": 0.7424467450112592, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "processingTime", + "type": "timeseries", + "label": "Processing time", + "color": "#607d8b", + "settings": {}, + "_hash": 0.6065128737901203, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "mqttTransportWsUpdateLatency", + "type": "timeseries", + "label": "MQTT - overall", + "color": "#f44336", + "settings": {}, + "_hash": 0.19638031054010696, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "coapTransportWsUpdateLatency", + "type": "timeseries", + "label": "CoAP - overall", + "color": "#9c27b0", + "settings": {}, + "_hash": 0.8167481665043521, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "httpTransportWsUpdateLatency", + "type": "timeseries", + "label": "HTTP - overall", + "color": "#8bc34a", + "settings": {}, + "_hash": 0.45369210935861803, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "lwm2mTransportWsUpdateLatency", + "type": "timeseries", + "label": "LwM2M - overall", + "color": "#3f51b5", + "settings": {}, + "_hash": 0.3477627917073993, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "coapIntegrationWsUpdateLatency", + "type": "timeseries", + "label": "CoAP integration - overall", + "color": "#e91e63", + "settings": {}, + "_hash": 0.8332881819050183, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "wsSubscribeLatency", + "type": "timeseries", + "label": "WS subscribe latency", + "color": "#03a9f4", + "settings": {}, + "_hash": 0.7843180730206556, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "wsConnectLatency", + "type": "timeseries", + "label": "WS connect latency", + "color": "#4caf50", + "settings": { + "hideDataByDefault": false, + "disableDataHiding": false, + "removeFromLegend": false, + "excludeFromStacking": false, + "showLines": true, + "lineWidth": 1, + "fillLines": false, + "showPoints": false, + "tooltipValueFormatter": "", + "showSeparateAxis": false, + "axisTitle": "", + "axisMin": null, + "axisMax": null, + "axisPosition": "left", + "axisTickSize": null, + "axisTickDecimals": null, + "axisTicksFormatter": "", + "comparisonSettings": { + "showValuesForComparison": true, + "comparisonValuesLabel": "", + "color": "" + }, + "thresholds": [] + }, + "_hash": 0.23140687573220564, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "logInLatency", + "type": "timeseries", + "label": "Log in latency", + "color": "#2196f3", + "settings": { + "hideDataByDefault": false, + "disableDataHiding": false, + "removeFromLegend": false, + "excludeFromStacking": false, + "showLines": true, + "lineWidth": 1, + "fillLines": false, + "showPoints": false, + "tooltipValueFormatter": "", + "showSeparateAxis": false, + "axisTitle": "", + "axisMin": null, + "axisMax": null, + "axisPosition": "left", + "axisTickSize": null, + "axisTickDecimals": null, + "axisTicksFormatter": "", + "comparisonSettings": { + "showValuesForComparison": true, + "comparisonValuesLabel": "", + "color": "" + }, + "thresholds": [] + }, + "_hash": 0.6130919996800452, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + } + ], + "alarmFilterConfig": { + "statusList": [ + "ACTIVE" + ] + }, + "latestDataKeys": [] + } + ], + "timewindow": { + "realtime": { + "timewindowMs": 60000 + } + }, + "showTitle": true, + "backgroundColor": "#fff", + "color": "rgba(0, 0, 0, 0.87)", + "padding": "8px", + "settings": { + "stack": false, + "fontSize": 10, + "fontColor": "#545454", + "showTooltip": true, + "tooltipIndividual": false, + "tooltipCumulative": false, + "hideZeros": false, + "grid": { + "verticalLines": true, + "horizontalLines": true, + "outlineWidth": 1, + "color": "#545454", + "backgroundColor": null, + "tickColor": "#DDDDDD" + }, + "xaxis": { + "title": null, + "showLabels": true, + "color": "#545454" + }, + "yaxis": { + "min": null, + "max": null, + "title": null, + "showLabels": true, + "color": "#545454", + "tickSize": null, + "tickDecimals": 0, + "ticksFormatter": "" + }, + "shadowSize": 4, + "smoothLines": false, + "comparisonEnabled": false, + "timeForComparison": "previousInterval", + "comparisonCustomIntervalValue": 7200000, + "xaxisSecond": { + "axisPosition": "top", + "title": null, + "showLabels": true + }, + "customLegendEnabled": false, + "dataKeysListForLabels": [], + "showLegend": true, + "legendConfig": { + "direction": "column", + "position": "bottom", + "sortDataKeys": false, + "showMin": false, + "showMax": true, + "showAvg": true, + "showTotal": false, + "showLatest": true + } + }, + "title": "General latencies", + "dropShadow": false, + "enableFullscreen": true, + "titleStyle": { + "fontSize": "16px", + "fontWeight": 400 + }, + "useDashboardTimewindow": true, + "showTitleIcon": false, + "titleTooltip": "", + "widgetStyle": {}, + "widgetCss": "", + "pageSize": 1024, + "noDataDisplayMessage": "", + "enableDataExport": true, + "displayTimewindow": true + }, + "row": 0, + "col": 0, + "id": "7db7f580-2aac-d7ee-20f6-3d9315e7003f", + "typeFullFqn": "system.charts.basic_timeseries" + }, + "e0a2df43-2f9a-efcf-80f7-bf51b0a174e1": { + "type": "timeseries", + "sizeX": 8, + "sizeY": 5, + "config": { + "datasources": [ + { + "type": "entity", + "name": null, + "entityAliasId": "6451461f-d748-9528-e3cd-64078c7fae05", + "filterId": null, + "dataKeys": [ + { + "name": "mqttTransportRequestLatency", + "type": "timeseries", + "label": "MQTT transport request latency", + "color": "#2196f3", + "settings": {}, + "_hash": 0.8576659620523571, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "httpTransportRequestLatency", + "type": "timeseries", + "label": "HTTP transport request latency", + "color": "#4caf50", + "settings": {}, + "_hash": 0.9749033105491403, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "coapTransportRequestLatency", + "type": "timeseries", + "label": "CoAP transport request latency", + "color": "#f44336", + "settings": {}, + "_hash": 0.6977575200148037, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "coapIntegrationRequestLatency", + "type": "timeseries", + "label": "CoAP integration request latency", + "color": "#9c27b0", + "settings": {}, + "_hash": 0.18839685494200875, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "lwm2mTransportRequestLatency", + "type": "timeseries", + "label": "LwM2M transport request latency", + "color": "#ffc107", + "settings": { + "hideDataByDefault": false, + "disableDataHiding": false, + "removeFromLegend": false, + "excludeFromStacking": false, + "showLines": true, + "lineWidth": 1, + "fillLines": false, + "showPoints": false, + "tooltipValueFormatter": "", + "showSeparateAxis": false, + "axisTitle": "", + "axisMin": null, + "axisMax": null, + "axisPosition": "left", + "axisTickSize": null, + "axisTickDecimals": null, + "axisTicksFormatter": "", + "comparisonSettings": { + "showValuesForComparison": true, + "comparisonValuesLabel": "", + "color": "" + }, + "thresholds": [] + }, + "_hash": 0.85549409179514, + "aggregationType": null, + "units": "ms", + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + } + ], + "alarmFilterConfig": { + "statusList": [ + "ACTIVE" + ] + }, + "latestDataKeys": [] + } + ], + "timewindow": { + "realtime": { + "timewindowMs": 60000 + } + }, + "showTitle": true, + "backgroundColor": "#fff", + "color": "rgba(0, 0, 0, 0.87)", + "padding": "8px", + "settings": { + "shadowSize": 4, + "fontColor": "#545454", + "fontSize": 10, + "xaxis": { + "showLabels": true, + "color": "#545454" + }, + "yaxis": { + "showLabels": true, + "color": "#545454" + }, + "grid": { + "color": "#545454", + "tickColor": "#DDDDDD", + "verticalLines": true, + "horizontalLines": true, + "outlineWidth": 1 + }, + "legend": { + "show": true, + "position": "nw", + "backgroundColor": "#f0f0f0", + "backgroundOpacity": 0.85, + "labelBoxBorderColor": "rgba(1, 1, 1, 0.45)" + }, + "decimals": 1, + "stack": false, + "tooltipIndividual": false, + "showLegend": true, + "legendConfig": { + "direction": "column", + "position": "bottom", + "sortDataKeys": false, + "showMin": false, + "showMax": true, + "showAvg": true, + "showTotal": false, + "showLatest": true + } + }, + "title": "Transport latencies", + "dropShadow": false, + "enableFullscreen": true, + "titleStyle": { + "fontSize": "16px", + "fontWeight": 400 + }, + "useDashboardTimewindow": true, + "showTitleIcon": false, + "titleTooltip": "", + "widgetStyle": {}, + "widgetCss": "", + "pageSize": 1024, + "noDataDisplayMessage": "", + "enableDataExport": true, + "displayTimewindow": true + }, + "row": 0, + "col": 0, + "id": "e0a2df43-2f9a-efcf-80f7-bf51b0a174e1", + "typeFullFqn": "system.charts.basic_timeseries" + } + }, + "states": { + "default": { + "name": "Cloud - Monitoring", + "root": true, + "layouts": { + "main": { + "widgets": { + "7db7f580-2aac-d7ee-20f6-3d9315e7003f": { + "sizeX": 12, + "sizeY": 11, + "row": 0, + "col": 0 + }, + "e0a2df43-2f9a-efcf-80f7-bf51b0a174e1": { + "sizeX": 12, + "sizeY": 11, + "row": 0, + "col": 12 + } + }, + "gridSettings": { + "backgroundColor": "#eeeeee", + "columns": 24, + "margin": 10, + "backgroundSizeMode": "100%", + "outerMargin": true, + "layoutType": "default" + } + } + } + } + }, + "entityAliases": { + "6451461f-d748-9528-e3cd-64078c7fae05": { + "id": "6451461f-d748-9528-e3cd-64078c7fae05", + "alias": "Monitoring stats asset", + "filter": { + "type": "entityName", + "resolveMultiple": true, + "entityType": "ASSET", + "entityNameFilter": "[Monitoring] Latencies" + } + } + }, + "filters": {}, + "timewindow": { + "hideAggregation": false, + "hideAggInterval": false, + "hideTimezone": false, + "selectedTab": 0, + "realtime": { + "realtimeType": 0, + "interval": 120000, + "timewindowMs": 18000000, + "quickInterval": "CURRENT_DAY", + "hideInterval": false, + "hideLastInterval": false, + "hideQuickInterval": false + }, + "history": { + "historyType": 0, + "interval": 600000, + "timewindowMs": 43200000, + "fixedTimewindow": null, + "quickInterval": "CURRENT_DAY", + "hideInterval": false, + "hideLastInterval": false, + "hideFixedInterval": false, + "hideQuickInterval": false + }, + "aggregation": { + "type": "AVG", + "limit": 2500 + }, + "timezone": null + }, + "settings": { + "stateControllerId": "entity", + "showTitle": false, + "showDashboardsSelect": true, + "showEntitiesSelect": true, + "showDashboardTimewindow": true, + "showDashboardExport": true, + "toolbarAlwaysOpen": true + } + }, + "name": "Cloud - Monitoring", + "resources": null +} \ No newline at end of file diff --git a/monitoring/src/main/resources/logback.xml b/monitoring/src/main/resources/logback.xml index df3a7224c6..43001ffd43 100644 --- a/monitoring/src/main/resources/logback.xml +++ b/monitoring/src/main/resources/logback.xml @@ -17,7 +17,7 @@ --> - + @@ -34,5 +34,4 @@ - From 9850e7a4664525f34f569a8efa12995d3ced3e4e Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Fri, 28 Nov 2025 00:06:42 +0100 Subject: [PATCH 005/579] monitoring: show dashboard link on startup notification. Initial delay set for services to avoid spikes --- .../ThingsboardMonitoringApplication.java | 17 ++++++++++------- .../service/MonitoringEntityService.java | 10 ++++++---- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/ThingsboardMonitoringApplication.java b/monitoring/src/main/java/org/thingsboard/monitoring/ThingsboardMonitoringApplication.java index f225d0d771..88e9ac1fa3 100644 --- a/monitoring/src/main/java/org/thingsboard/monitoring/ThingsboardMonitoringApplication.java +++ b/monitoring/src/main/java/org/thingsboard/monitoring/ThingsboardMonitoringApplication.java @@ -50,7 +50,7 @@ public class ThingsboardMonitoringApplication { @Value("${monitoring.monitoring_rate_ms}") private int monitoringRateMs; - ScheduledExecutorService scheduler = ThingsBoardExecutors.newSingleThreadScheduledExecutor("monitoring-executor"); + ScheduledExecutorService scheduler = ThingsBoardExecutors.newSingleThreadScheduledExecutor("monitoring"); public static void main(String[] args) { new SpringApplicationBuilder(ThingsboardMonitoringApplication.class) @@ -63,12 +63,15 @@ public class ThingsboardMonitoringApplication { entityService.checkEntities(); monitoringServices.forEach(BaseMonitoringService::init); - scheduler.scheduleWithFixedDelay(() -> { - monitoringServices.forEach(monitoringService -> { - monitoringService.runChecks(); - }); - }, 0, monitoringRateMs, TimeUnit.MILLISECONDS); - notificationService.sendNotification(new InfoNotification(":rocket: Monitoring started")); + for (int i = 0; i < monitoringServices.size(); i++) { + int initialDelay = (monitoringRateMs / monitoringServices.size()) * i; + BaseMonitoringService service = monitoringServices.get(i); + log.info("Scheduling initialDelay {}, fixedDelay {} for monitoring '{}' ", initialDelay, monitoringRateMs, service.getClass().getSimpleName()); + scheduler.scheduleWithFixedDelay(service::runChecks, initialDelay, monitoringRateMs, TimeUnit.MILLISECONDS); + } + + String publicDashboardUrl = entityService.getDashboardPublicLink(); + notificationService.sendNotification(new InfoNotification(":rocket: <"+publicDashboardUrl+"|Monitoring> started")); } @EventListener(ContextClosedEvent.class) diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringEntityService.java b/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringEntityService.java index fad9bc6b7c..a0991bce72 100644 --- a/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringEntityService.java +++ b/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringEntityService.java @@ -91,6 +91,8 @@ public class MonitoringEntityService { @Value("${monitoring.calculated_fields.enabled:true}") private boolean calculatedFieldsMonitoringEnabled; + DashboardId dashboardId = null; + public void checkEntities() { RuleChain ruleChain = tbClient.getRuleChains(RuleChainType.CORE, new PageLink(10)).getData().stream() .filter(RuleChain::isRoot) @@ -132,7 +134,7 @@ public class MonitoringEntityService { tbClient.assignAssetToPublicCustomer(asset.getId()); tbClient.assignDashboardToPublicCustomer(dashboard.getId()); - getDashboardPublicLink(dashboard); + this.dashboardId = Optional.ofNullable(dashboard).map(Dashboard::getId).orElse(null); } public Asset getOrCreateMonitoringAsset() { @@ -266,10 +268,10 @@ public class MonitoringEntityService { tbClient.saveCalculatedField(calculatedField); } - private String getDashboardPublicLink(Dashboard dashboard) { + public String getDashboardPublicLink() { String link = ""; try { - Optional infoOpt = tbClient.getDashboardInfoById(dashboard.getId()); + Optional infoOpt = tbClient.getDashboardInfoById(dashboardId); if (infoOpt.isPresent()) { String publicCustomerId = null; Set customers = infoOpt.get().getAssignedCustomers(); @@ -280,7 +282,7 @@ public class MonitoringEntityService { .findFirst().orElse(null); } if (publicCustomerId != null) { - link = buildPublicDashboardLink(dashboard.getId(), publicCustomerId); + link = buildPublicDashboardLink(dashboardId, publicCustomerId); log.info("Public Monitoring dashboard link: {}", link); } else { log.warn("Dashboard is not assigned to public customer. Public link can't be generated."); From 4632773f14b1a0c50f1e5798d9a8e29c0e643876 Mon Sep 17 00:00:00 2001 From: Ekaterina Chantsova Date: Tue, 2 Dec 2025 16:19:10 +0200 Subject: [PATCH 006/579] Move hasTimewindow function from service to models --- .../core/services/dashboard-utils.service.ts | 21 +++++-------------- .../models/widget/widget-model.definition.ts | 17 ++++++++++++++- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/ui-ngx/src/app/core/services/dashboard-utils.service.ts b/ui-ngx/src/app/core/services/dashboard-utils.service.ts index ee4ee09884..7268345f1d 100644 --- a/ui-ngx/src/app/core/services/dashboard-utils.service.ts +++ b/ui-ngx/src/app/core/services/dashboard-utils.service.ts @@ -50,8 +50,7 @@ import { WidgetConfigMode, WidgetSize, widgetType, - WidgetTypeDescriptor, - widgetTypeHasTimewindow + WidgetTypeDescriptor, widgetTypeHasTimewindow } from '@app/shared/models/widget.models'; import { EntityType } from '@shared/models/entity-type.models'; import { AliasFilterType, EntityAlias, EntityAliasFilter } from '@app/shared/models/alias.models'; @@ -64,7 +63,7 @@ import { MediaBreakpoints } from '@shared/models/constants'; import { TranslateService } from '@ngx-translate/core'; import { DashboardPageLayout } from '@home/components/dashboard-page/dashboard-page.models'; import { maxGridsterCol, maxGridsterRow } from '@home/models/dashboard-component.models'; -import { findWidgetModelDefinition } from '@shared/models/widget/widget-model.definition'; +import { findWidgetModelDefinition, widgetHasTimewindow } from '@shared/models/widget/widget-model.definition'; @Injectable({ providedIn: 'root' @@ -296,7 +295,6 @@ export class DashboardUtilsService { } widgetConfig.datasources = this.validateAndUpdateDatasources(widgetConfig.datasources); if (type === widgetType.latest) { - // TODO: the following won't work for maps if (datasourcesHasAggregation(widgetConfig.datasources)) { const onlyHistoryTimewindow = datasourcesHasOnlyComparisonAggregation(widgetConfig.datasources); widgetConfig.timewindow = initModelFromDefaultTimewindow(widgetConfig.timewindow, true, @@ -355,27 +353,18 @@ export class DashboardUtilsService { } private removeTimewindowConfigIfUnused(widget: Widget) { - const widgetHasTimewindow = this.widgetHasTimewindow(widget); - if (!widgetHasTimewindow || widget.config.useDashboardTimewindow) { + const hasTimewindow = widgetHasTimewindow(widget); + if (!hasTimewindow || widget.config.useDashboardTimewindow) { delete widget.config.displayTimewindow; delete widget.config.timewindow; delete widget.config.timewindowStyle; - if (!widgetHasTimewindow) { + if (!hasTimewindow) { delete widget.config.useDashboardTimewindow; } } } - private widgetHasTimewindow(widget: Widget): boolean { - const widgetDefinition = findWidgetModelDefinition(widget); - if (widgetDefinition) { - return widgetDefinition.hasTimewindow(widget); - } - return widgetTypeHasTimewindow(widget.type) - || (widget.type === widgetType.latest && datasourcesHasAggregation(widget.config.datasources)); - } - public prepareWidgetForSaving(widget: Widget): Widget { this.removeTimewindowConfigIfUnused(widget); return widget; diff --git a/ui-ngx/src/app/shared/models/widget/widget-model.definition.ts b/ui-ngx/src/app/shared/models/widget/widget-model.definition.ts index ccec658766..13d0ae765a 100644 --- a/ui-ngx/src/app/shared/models/widget/widget-model.definition.ts +++ b/ui-ngx/src/app/shared/models/widget/widget-model.definition.ts @@ -14,7 +14,13 @@ /// limitations under the License. /// -import { Datasource, Widget } from '@shared/models/widget.models'; +import { + Datasource, + datasourcesHasAggregation, + Widget, + widgetType, + widgetTypeHasTimewindow +} from '@shared/models/widget.models'; import { Dashboard } from '@shared/models/dashboard.models'; import { EntityAliases } from '@shared/models/alias.models'; import { Filters } from '@shared/models/query/query.models'; @@ -37,3 +43,12 @@ const widgetModelRegistry: WidgetModelDefinition[] = [ export const findWidgetModelDefinition = (widget: Widget): WidgetModelDefinition => { return widgetModelRegistry.find(def => def.testWidget(widget)); } + +export const widgetHasTimewindow = (widget: Widget): boolean => { + const widgetDefinition = findWidgetModelDefinition(widget); + if (widgetDefinition) { + return widgetDefinition.hasTimewindow(widget); + } + return widgetTypeHasTimewindow(widget.type) + || (widget.type === widgetType.latest && datasourcesHasAggregation(widget.config.datasources)); +}; From cb2bd954b6a99e32596efc9be84d16040d18fab8 Mon Sep 17 00:00:00 2001 From: Dmytro Skarzhynets Date: Wed, 3 Dec 2025 13:20:15 +0200 Subject: [PATCH 007/579] Fix default value for Prometheus rule engine stats --- application/src/main/resources/thingsboard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 2ee0d23502..2cb53a8a4b 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1913,7 +1913,7 @@ queue: max-error-message-length: "${TB_QUEUE_RULE_ENGINE_MAX_ERROR_MESSAGE_LENGTH:4096}" prometheus-stats: # Enable/disable Prometheus statistics for individual Rule Engine message processing (records time in ms for success/failure). - enabled: "${TB_QUEUE_RULE_ENGINE_PROMETHEUS_STATS_ENABLED:true}" + enabled: "${TB_QUEUE_RULE_ENGINE_PROMETHEUS_STATS_ENABLED:false}" # After a queue is deleted (or the profile's isolation option was disabled), Rule Engine will continue reading related topics during this period before deleting the actual topics topic-deletion-delay: "${TB_QUEUE_RULE_ENGINE_TOPIC_DELETION_DELAY_SEC:15}" # Size of the thread pool that handles such operations as partition changes, config updates, queue deletion From 91de831262a0d3370cabb3ae0884b24dc9eb69ef Mon Sep 17 00:00:00 2001 From: Ekaterina Chantsova Date: Thu, 4 Dec 2025 16:58:14 +0200 Subject: [PATCH 008/579] Correct condition for absolute widget header actions positioning --- .../home/components/widget/widget-container.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-container.component.ts b/ui-ngx/src/app/modules/home/components/widget/widget-container.component.ts index 51ed592e7e..a0d148a115 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-container.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget-container.component.ts @@ -220,7 +220,7 @@ export class WidgetContainerComponent extends PageComponent implements OnInit, O widgetActionAbsolute(widgetComponent: WidgetComponent, absolute = false) { return absolute ? true : !(this.widget.showWidgetTitlePanel && !widgetComponent.widgetContext?.embedTitlePanel && - (this.widget.showTitle||this.widget.hasAggregation)) && !widgetComponent.widgetContext?.embedActionsPanel; + (this.widget.showTitle||this.widget.hasTimewindow)) && !widgetComponent.widgetContext?.embedActionsPanel; } onClicked(event: MouseEvent): void { From fd195a5f81e44b2b1254c3fd766e7138fd012a10 Mon Sep 17 00:00:00 2001 From: Ekaterina Chantsova Date: Thu, 4 Dec 2025 19:46:50 +0200 Subject: [PATCH 009/579] Map widget: add methods to check if aggregation enabled for latest data keys; check if timewindow should be displayed --- .../home/models/dashboard-component.models.ts | 10 ++-- .../api-usage-model.definition.ts | 6 +++ .../widget/maps/map-model.definition.ts | 47 +++++++++++++------ .../models/widget/widget-model.definition.ts | 2 + 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/ui-ngx/src/app/modules/home/models/dashboard-component.models.ts b/ui-ngx/src/app/modules/home/models/dashboard-component.models.ts index facb159af4..71f5aaaf72 100644 --- a/ui-ngx/src/app/modules/home/models/dashboard-component.models.ts +++ b/ui-ngx/src/app/modules/home/models/dashboard-component.models.ts @@ -43,6 +43,7 @@ import { UtilsService } from '@core/services/utils.service'; import { TbPopoverComponent } from '@shared/components/popover.component'; import { ComponentStyle, iconStyle, textStyle } from '@shared/models/widget-settings.models'; import { TbContextMenuEvent } from '@shared/models/jquery-event.models'; +import { widgetHasTimewindow } from '@shared/models/widget/widget-model.definition'; export interface WidgetsData { widgets: Array; @@ -616,14 +617,11 @@ export class DashboardWidget implements GridsterItem, IDashboardWidget { this.dropShadow = isDefined(this.widget.config.dropShadow) ? this.widget.config.dropShadow : true; this.enableFullscreen = isDefined(this.widget.config.enableFullscreen) ? this.widget.config.enableFullscreen : true; - let canHaveTimewindow = false; + const canHaveTimewindow = widgetHasTimewindow(this.widget); let onlyQuickInterval = false; let onlyHistoryTimewindow = false; - if (this.widget.type === widgetType.timeseries || this.widget.type === widgetType.alarm) { - canHaveTimewindow = true; - } else if (this.widget.type === widgetType.latest) { - canHaveTimewindow = datasourcesHasAggregation(this.widget.config.datasources); - onlyQuickInterval = canHaveTimewindow; + if (this.widget.type === widgetType.latest) { + onlyQuickInterval = datasourcesHasAggregation(this.widget.config.datasources); if (canHaveTimewindow) { onlyHistoryTimewindow = datasourcesHasOnlyComparisonAggregation(this.widget.config.datasources); } diff --git a/ui-ngx/src/app/shared/models/widget/home-widgets/api-usage-model.definition.ts b/ui-ngx/src/app/shared/models/widget/home-widgets/api-usage-model.definition.ts index 5c92b84cbe..04f1155d2f 100644 --- a/ui-ngx/src/app/shared/models/widget/home-widgets/api-usage-model.definition.ts +++ b/ui-ngx/src/app/shared/models/widget/home-widgets/api-usage-model.definition.ts @@ -72,6 +72,12 @@ export const ApiUsageModelDefinition: WidgetModelDefinition = { if (settings.trips?.length) { return true; } else { - const datasources: Datasource[] = []; - if (settings.markers?.length) { - datasources.push(...getMapDataLayersDatasources(settings.markers, true, 'markers')); - } - if (settings.polygons?.length) { - datasources.push(...getMapDataLayersDatasources(settings.polygons, true, 'polygons')); - } - if (settings.circles?.length) { - datasources.push(...getMapDataLayersDatasources(settings.circles, true, 'circles')); - } - if (settings.additionalDataSources?.length) { - datasources.push(...additionalMapDataSourcesToDatasources(settings.additionalDataSources)); - } + const datasources: Datasource[] = getMapLatestDataLayersDatasources(settings); return datasourcesHasAggregation(datasources); } + }, + datasourcesHasAggregation(widget: Widget): boolean { + const datasources: Datasource[] = getMapLatestDataLayersDatasources(widget.config.settings as BaseMapSettings); + return datasourcesHasAggregation(datasources); + }, + datasourcesHasOnlyComparisonAggregation(widget: Widget): boolean { + const datasources: Datasource[] = getMapLatestDataLayersDatasources(widget.config.settings as BaseMapSettings); + return datasourcesHasOnlyComparisonAggregation(datasources); } }; @@ -252,3 +254,20 @@ const getMapDataLayersDatasources = (settings: MapDataLayerSettings[], }); return datasources; }; + +const getMapLatestDataLayersDatasources = (settings: BaseMapSettings): Datasource[] => { + const datasources: Datasource[] = []; + if (settings.markers?.length) { + datasources.push(...getMapDataLayersDatasources(settings.markers, true, 'markers')); + } + if (settings.polygons?.length) { + datasources.push(...getMapDataLayersDatasources(settings.polygons, true, 'polygons')); + } + if (settings.circles?.length) { + datasources.push(...getMapDataLayersDatasources(settings.circles, true, 'circles')); + } + if (settings.additionalDataSources?.length) { + datasources.push(...additionalMapDataSourcesToDatasources(settings.additionalDataSources)); + } + return datasources; +}; diff --git a/ui-ngx/src/app/shared/models/widget/widget-model.definition.ts b/ui-ngx/src/app/shared/models/widget/widget-model.definition.ts index 13d0ae765a..6b7b547b40 100644 --- a/ui-ngx/src/app/shared/models/widget/widget-model.definition.ts +++ b/ui-ngx/src/app/shared/models/widget/widget-model.definition.ts @@ -33,6 +33,8 @@ export interface WidgetModelDefinition { updateFromExportInfo(widget: Widget, entityAliases: EntityAliases, filters: Filters, info: T): void; datasources(widget: Widget): Datasource[]; hasTimewindow(widget: Widget): boolean; + datasourcesHasAggregation(widget: Widget): boolean; + datasourcesHasOnlyComparisonAggregation(widget: Widget): boolean; } const widgetModelRegistry: WidgetModelDefinition[] = [ From bc6f380cc1b718c18f979a62214e51bf4b9f8d52 Mon Sep 17 00:00:00 2001 From: Ekaterina Chantsova Date: Mon, 8 Dec 2025 19:28:25 +0200 Subject: [PATCH 010/579] Map widget: enable quick-interval-only mode when aggregation is enabled for latest key --- .../widget/widget-config.component.ts | 11 ++++++++--- .../home/models/dashboard-component.models.ts | 19 ++++++++----------- .../models/widget/widget-model.definition.ts | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts index deb7ae07d1..6e43f1055d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts @@ -741,7 +741,7 @@ export class WidgetConfigComponent extends PageComponent implements OnInit, OnDe } else if (this.widgetType === widgetType.latest) { const widgetDefinition = findWidgetModelDefinition(this.widget); if (widgetDefinition) { - return widgetDefinition.hasTimewindow(this.widget); + return widgetDefinition.datasourcesHasAggregation(this.widget); } else { const datasources = this.dataSettings.get('datasources').value; return datasourcesHasAggregation(datasources); @@ -768,8 +768,13 @@ export class WidgetConfigComponent extends PageComponent implements OnInit, OnDe public onlyHistoryTimewindow(): boolean { if (this.widgetType === widgetType.latest) { - const datasources = this.dataSettings.get('datasources').value; - return datasourcesHasOnlyComparisonAggregation(datasources); + const widgetDefinition = findWidgetModelDefinition(this.widget); + if (widgetDefinition) { + return widgetDefinition.datasourcesHasOnlyComparisonAggregation(this.widget); + } else { + const datasources = this.dataSettings.get('datasources').value; + return datasourcesHasOnlyComparisonAggregation(datasources); + } } else { return false; } diff --git a/ui-ngx/src/app/modules/home/models/dashboard-component.models.ts b/ui-ngx/src/app/modules/home/models/dashboard-component.models.ts index 71f5aaaf72..dbdf31a2c8 100644 --- a/ui-ngx/src/app/modules/home/models/dashboard-component.models.ts +++ b/ui-ngx/src/app/modules/home/models/dashboard-component.models.ts @@ -15,14 +15,7 @@ /// import { GridsterComponent, GridsterConfig, GridsterItem, GridsterItemComponentInterface } from 'angular-gridster2'; -import { - datasourcesHasAggregation, - datasourcesHasOnlyComparisonAggregation, - FormattedData, - Widget, - WidgetPosition, - widgetType -} from '@app/shared/models/widget.models'; +import { FormattedData, Widget, WidgetPosition, widgetType } from '@app/shared/models/widget.models'; import { WidgetLayout, WidgetLayouts } from '@app/shared/models/dashboard.models'; import { IDashboardWidget, WidgetAction, WidgetContext, WidgetHeaderAction } from './widget-component.models'; import { Timewindow } from '@shared/models/time/time.models'; @@ -43,7 +36,11 @@ import { UtilsService } from '@core/services/utils.service'; import { TbPopoverComponent } from '@shared/components/popover.component'; import { ComponentStyle, iconStyle, textStyle } from '@shared/models/widget-settings.models'; import { TbContextMenuEvent } from '@shared/models/jquery-event.models'; -import { widgetHasTimewindow } from '@shared/models/widget/widget-model.definition'; +import { + widgetDatasourcesHasAggregation, + widgetDatasourcesHasOnlyComparisonAggregation, + widgetHasTimewindow +} from '@shared/models/widget/widget-model.definition'; export interface WidgetsData { widgets: Array; @@ -621,9 +618,9 @@ export class DashboardWidget implements GridsterItem, IDashboardWidget { let onlyQuickInterval = false; let onlyHistoryTimewindow = false; if (this.widget.type === widgetType.latest) { - onlyQuickInterval = datasourcesHasAggregation(this.widget.config.datasources); + onlyQuickInterval = widgetDatasourcesHasAggregation(this.widget); if (canHaveTimewindow) { - onlyHistoryTimewindow = datasourcesHasOnlyComparisonAggregation(this.widget.config.datasources); + onlyHistoryTimewindow = widgetDatasourcesHasOnlyComparisonAggregation(this.widget); } } diff --git a/ui-ngx/src/app/shared/models/widget/widget-model.definition.ts b/ui-ngx/src/app/shared/models/widget/widget-model.definition.ts index 6b7b547b40..c585268234 100644 --- a/ui-ngx/src/app/shared/models/widget/widget-model.definition.ts +++ b/ui-ngx/src/app/shared/models/widget/widget-model.definition.ts @@ -17,6 +17,7 @@ import { Datasource, datasourcesHasAggregation, + datasourcesHasOnlyComparisonAggregation, Widget, widgetType, widgetTypeHasTimewindow @@ -54,3 +55,19 @@ export const widgetHasTimewindow = (widget: Widget): boolean => { return widgetTypeHasTimewindow(widget.type) || (widget.type === widgetType.latest && datasourcesHasAggregation(widget.config.datasources)); }; + +export const widgetDatasourcesHasAggregation = (widget: Widget): boolean => { + const widgetDefinition = findWidgetModelDefinition(widget); + if (widgetDefinition) { + return widgetDefinition.datasourcesHasAggregation(widget); + } + return widget.type === widgetType.latest && datasourcesHasAggregation(widget.config.datasources); +}; + +export const widgetDatasourcesHasOnlyComparisonAggregation = (widget: Widget): boolean => { + const widgetDefinition = findWidgetModelDefinition(widget); + if (widgetDefinition) { + return widgetDefinition.datasourcesHasOnlyComparisonAggregation(widget); + } + return widget.type === widgetType.latest && datasourcesHasOnlyComparisonAggregation(widget.config.datasources); +}; From c68ea4d177f5e0a63ccf97b36e32711bd3747c6c Mon Sep 17 00:00:00 2001 From: Anatolii Davydko Date: Wed, 10 Dec 2025 16:11:56 +0000 Subject: [PATCH 011/579] add separate folder for ResourceSubType.EXTENSION and for ResourceSubType.MODULE --- .../gateway-management-extension.js | 0 .../org/thingsboard/server/service/install/InstallScripts.java | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) rename application/src/main/data/resources/{js_modules => js_extensions}/gateway-management-extension.js (100%) diff --git a/application/src/main/data/resources/js_modules/gateway-management-extension.js b/application/src/main/data/resources/js_extensions/gateway-management-extension.js similarity index 100% rename from application/src/main/data/resources/js_modules/gateway-management-extension.js rename to application/src/main/data/resources/js_extensions/gateway-management-extension.js diff --git a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java index f9b5c282a8..cb357e2a59 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java +++ b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java @@ -406,7 +406,8 @@ public class InstallScripts { Path resourcesDir = Path.of(getDataDir(), RESOURCES_DIR); loadSystemResources(resourcesDir.resolve("images"), ResourceType.IMAGE, null); - loadSystemResources(resourcesDir.resolve("js_modules"), ResourceType.JS_MODULE, ResourceSubType.EXTENSION); + loadSystemResources(resourcesDir.resolve("js_extensions"), ResourceType.JS_MODULE, ResourceSubType.EXTENSION); + loadSystemResources(resourcesDir.resolve("js_modules"), ResourceType.JS_MODULE, ResourceSubType.MODULE); loadSystemResources(resourcesDir.resolve("dashboards"), ResourceType.DASHBOARD, null); } From 924e00e26e3fa0c2a43b909b395cbfcb6d363bb1 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Wed, 10 Dec 2025 19:14:38 +0200 Subject: [PATCH 012/579] fixed EDQ for sysadmin: tenant and tenant profile entities are allowed --- .../controller/EntityQueryController.java | 2 +- .../controller/EntityQueryControllerTest.java | 64 +++++++++++++++++++ .../server/dao/entity/BaseEntityService.java | 2 +- .../query/DefaultEntityQueryRepository.java | 3 +- 4 files changed, 68 insertions(+), 3 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/EntityQueryController.java b/application/src/main/java/org/thingsboard/server/controller/EntityQueryController.java index 70fa3a5ed0..fb080e854d 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EntityQueryController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EntityQueryController.java @@ -82,7 +82,7 @@ public class EntityQueryController extends BaseController { } @ApiOperation(value = "Find Entity Data by Query", notes = ENTITY_DATA_QUERY_DESCRIPTION) - @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") + @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") @RequestMapping(value = "/entitiesQuery/find", method = RequestMethod.POST) @ResponseBody public PageData findEntityDataByQuery( diff --git a/application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java index 93d67ccd4b..8e6d90dfdc 100644 --- a/application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java @@ -17,6 +17,7 @@ package org.thingsboard.server.controller; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -26,6 +27,7 @@ import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.servlet.ResultActions; import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.server.common.data.AttributeScope; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.DataConstants; @@ -33,6 +35,7 @@ import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.Tenant; +import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmSeverity; @@ -62,6 +65,7 @@ import org.thingsboard.server.common.data.query.FilterPredicateValue; import org.thingsboard.server.common.data.query.KeyFilter; import org.thingsboard.server.common.data.query.NumericFilterPredicate; import org.thingsboard.server.common.data.query.RelationsQueryFilter; +import org.thingsboard.server.common.data.query.SingleEntityFilter; import org.thingsboard.server.common.data.query.StringFilterPredicate; import org.thingsboard.server.common.data.query.TsValue; import org.thingsboard.server.common.data.queue.QueueStats; @@ -69,6 +73,8 @@ import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.common.data.relation.EntitySearchDirection; import org.thingsboard.server.common.data.relation.RelationEntityTypeFilter; import org.thingsboard.server.common.data.security.Authority; +import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; +import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; import org.thingsboard.server.dao.queue.QueueStatsService; import org.thingsboard.server.dao.service.DaoSqlTest; @@ -210,6 +216,64 @@ public class EntityQueryControllerTest extends AbstractControllerTest { countByQueryAndCheck(countQuery, 97); } + @Test + public void testEDQForSysAdmin() throws Exception { + loginSysAdmin(); + + ObjectNode tenantAttr = JacksonUtil.newObjectNode(); + tenantAttr.put("attr", "tenantAttrValue"); + doPost("/api/plugins/telemetry/TENANT/" + tenantId + "/attributes/" + AttributeScope.SERVER_SCOPE, tenantAttr); + + loginTenantAdmin(); + Device tenantDevice = new Device(); + tenantDevice.setName("device " + StringUtils.randomAlphanumeric(10)); + tenantDevice.setType("default"); + tenantDevice = doPost("/api/device", tenantDevice, Device.class); + + loginSysAdmin(); + TenantProfile tenantProfile = doPost("/api/tenantProfile", createTenantProfile("Test tenant profile"), TenantProfile.class); + + ObjectNode tenantProfileAttr = JacksonUtil.newObjectNode(); + tenantProfileAttr.put("attr", "tenantProfileAttrValue"); + doPost("/api/plugins/telemetry/TENANT_PROFILE/" + tenantProfile.getId() + "/attributes/" + AttributeScope.SERVER_SCOPE, tenantProfileAttr); + + // check tenant telemetry is accessible for sysadmin + SingleEntityFilter filter = new SingleEntityFilter(); + filter.setSingleEntity(AliasEntityId.fromEntityId(tenantId)); + EntityDataSortOrder sortOrder = new EntityDataSortOrder(new EntityKey(EntityKeyType.ENTITY_FIELD, "createdTime"), EntityDataSortOrder.Direction.ASC); + EntityDataPageLink pageLink = new EntityDataPageLink(10, 0, null, sortOrder); + List entityFields = List.of(new EntityKey(EntityKeyType.ENTITY_FIELD, "name")); + List latestValues = List.of(new EntityKey(EntityKeyType.ATTRIBUTE, "attr")); + EntityDataQuery dataQuery = new EntityDataQuery(filter, pageLink, entityFields, latestValues, null); + + PageData loadedTenants = findByQueryAndCheck(dataQuery, 1); + String retrievedTenantAttr = loadedTenants.getData().get(0).getLatest().get(EntityKeyType.ATTRIBUTE).get("attr").getValue(); + assertThat(retrievedTenantAttr).isEqualTo("tenantAttrValue"); + + // check tenant profile telemetry is accessible for sysadmin + filter.setSingleEntity(AliasEntityId.fromEntityId(tenantProfile.getId())); + + PageData loadedTenantProfiles = findByQueryAndCheck(dataQuery, 1); + String retrievedProfileAttr = loadedTenantProfiles.getData().get(0).getLatest().get(EntityKeyType.ATTRIBUTE).get("attr").getValue(); + assertThat(retrievedProfileAttr).isEqualTo("tenantProfileAttrValue"); + + // check other tenant entities are prohibited + filter.setSingleEntity(AliasEntityId.fromEntityId(tenantDevice.getId())); + findByQueryAndCheck(dataQuery, 0); + } + + private TenantProfile createTenantProfile(String name) { + TenantProfile tenantProfile = new TenantProfile(); + tenantProfile.setName(name); + tenantProfile.setDescription(name + " Test"); + TenantProfileData tenantProfileData = new TenantProfileData(); + tenantProfileData.setConfiguration(new DefaultTenantProfileConfiguration()); + tenantProfile.setProfileData(tenantProfileData); + tenantProfile.setDefault(false); + tenantProfile.setIsolatedTbRuleEngine(false); + return tenantProfile; + } + @Test public void testTenantCountAlarmsByQuery() throws Exception { loginTenantAdmin(); diff --git a/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java b/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java index b512f353f5..d9deb5d891 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java @@ -135,7 +135,7 @@ public class BaseEntityService extends AbstractEntityService implements EntitySe long startNs = System.nanoTime(); PageData result; - if (edqsService.isApiEnabled() && validForEdqs(query)) { + if (edqsService.isApiEnabled() && validForEdqs(query) && !tenantId.isSysTenantId()) { EdqsRequest request = EdqsRequest.builder() .entityDataQuery(query) .build(); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java index 8f3fe71f35..45515e16bd 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java @@ -540,7 +540,8 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { } private String buildPermissionQuery(SqlQueryContext ctx, EntityFilter entityFilter) { - if (ctx.isIgnorePermissionCheck()) { + if (ctx.isIgnorePermissionCheck() || (ctx.getTenantId().isSysTenantId() && + (ctx.getEntityType() == EntityType.TENANT || ctx.getEntityType() == EntityType.TENANT_PROFILE))) { return "1=1"; } switch (entityFilter.getType()) { From 24ad30b14856b41c344ec505d3079b3a2725632d Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Thu, 11 Dec 2025 10:27:49 +0200 Subject: [PATCH 013/579] updated error msg when no entities by relation --- .../cf/ctx/state/CalculatedFieldState.java | 15 ++++++++++----- ...dEntitiesAggregationCalculatedFieldState.java | 16 ++++++++++++++++ .../server/utils/CalculatedFieldUtils.java | 13 ++++++++++--- ...itiesAggregationCalculatedFieldStateTest.java | 4 +++- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldState.java index f254631491..df0999922e 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldState.java @@ -110,7 +110,13 @@ public interface CalculatedFieldState extends Closeable { private static final String MISSING_PROPAGATION_TARGETS_ERROR = "No entities found via 'Propagation path to related entities'. " + "Verify the configured relation type and direction."; private static final String MISSING_PROPAGATION_TARGETS_AND_ARGUMENTS_ERROR = MISSING_PROPAGATION_TARGETS_ERROR + " Missing arguments to propagate: "; - private static final ReadinessStatus READY = new ReadinessStatus(true, null); + public static final String MISSING_AGGREGATION_ENTITIES_ERROR = "No entities found via 'Aggregation path to related entities'. " + + "Verify the configured relation type and direction."; + public static final ReadinessStatus READY = new ReadinessStatus(true, null); + + public static ReadinessStatus notReady(String errorMsg) { + return new ReadinessStatus(false, errorMsg); + } public static ReadinessStatus from(List emptyOrMissingArguments) { if (CollectionsUtil.isEmpty(emptyOrMissingArguments)) { @@ -118,13 +124,12 @@ public interface CalculatedFieldState extends Closeable { } boolean propagationCtxIsEmpty = emptyOrMissingArguments.remove(PROPAGATION_CONFIG_ARGUMENT); if (!propagationCtxIsEmpty) { - return new ReadinessStatus(false, MISSING_REQUIRED_ARGUMENTS_ERROR + String.join(", ", emptyOrMissingArguments)); + return notReady(MISSING_REQUIRED_ARGUMENTS_ERROR + String.join(", ", emptyOrMissingArguments)); } if (emptyOrMissingArguments.isEmpty()) { - return new ReadinessStatus(false, MISSING_PROPAGATION_TARGETS_ERROR); + return notReady(MISSING_PROPAGATION_TARGETS_ERROR); } - return new ReadinessStatus(false, MISSING_PROPAGATION_TARGETS_AND_ARGUMENTS_ERROR + - String.join(", ", emptyOrMissingArguments)); + return notReady(MISSING_PROPAGATION_TARGETS_AND_ARGUMENTS_ERROR + String.join(", ", emptyOrMissingArguments)); } } diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java index 7036e4bd77..3cf6dec06d 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java @@ -52,6 +52,7 @@ import java.util.stream.Collectors; import static java.util.concurrent.TimeUnit.SECONDS; import static org.thingsboard.server.service.cf.ctx.state.CalculatedFieldCtx.DISABLED_INTERVAL_VALUE; +import static org.thingsboard.server.service.cf.ctx.state.CalculatedFieldState.ReadinessStatus.MISSING_AGGREGATION_ENTITIES_ERROR; @Slf4j @Getter @@ -165,6 +166,7 @@ public class RelatedEntitiesAggregationCalculatedFieldState extends BaseCalculat }); lastMetricsEvalTs = DEFAULT_LAST_UPDATE_TS; lastArgsRefreshTs = System.currentTimeMillis(); + readinessStatus = checkReadiness(requiredArguments, arguments); } public void scheduleReevaluation() { @@ -276,4 +278,18 @@ public class RelatedEntitiesAggregationCalculatedFieldState extends BaseCalculat record EntityArgument(EntityInfo entity, JsonNode entityArguments) {} + @Override + protected ReadinessStatus checkReadiness(List requiredArguments, Map currentArguments) { + if (currentArguments == null) { + return ReadinessStatus.notReady(MISSING_AGGREGATION_ENTITIES_ERROR); + } + for (String requiredArgumentKey : requiredArguments) { + ArgumentEntry argumentEntry = currentArguments.get(requiredArgumentKey); + if (argumentEntry == null || argumentEntry.isEmpty()) { + return ReadinessStatus.notReady(MISSING_AGGREGATION_ENTITIES_ERROR); + } + } + return ReadinessStatus.READY; + } + } diff --git a/application/src/main/java/org/thingsboard/server/utils/CalculatedFieldUtils.java b/application/src/main/java/org/thingsboard/server/utils/CalculatedFieldUtils.java index 7046af3d9c..ba46f460e1 100644 --- a/application/src/main/java/org/thingsboard/server/utils/CalculatedFieldUtils.java +++ b/application/src/main/java/org/thingsboard/server/utils/CalculatedFieldUtils.java @@ -110,8 +110,12 @@ public class CalculatedFieldUtils { case GEOFENCING -> builder.addGeofencingArguments(toGeofencingArgumentProto(argName, (GeofencingArgumentEntry) argEntry)); case RELATED_ENTITIES -> { RelatedEntitiesArgumentEntry relatedEntitiesArgumentEntry = (RelatedEntitiesArgumentEntry) argEntry; - relatedEntitiesArgumentEntry.getEntityInputs() - .forEach((entityId, entry) -> builder.addSingleValueArguments(toSingleValueArgumentProto(argName, (SingleValueArgumentEntry) entry))); + Map entityInputs = relatedEntitiesArgumentEntry.getEntityInputs(); + if (entityInputs.isEmpty()) { + builder.addSingleValueArguments(SingleValueArgumentProto.newBuilder().setArgName(argName).build()); + } else { + entityInputs.forEach((entityId, entry) -> builder.addSingleValueArguments(toSingleValueArgumentProto(argName, (SingleValueArgumentEntry) entry))); + } } case ENTITY_AGGREGATION -> { EntityAggregationArgumentEntry entityAggregationArgumentEntry = (EntityAggregationArgumentEntry) argEntry; @@ -234,7 +238,10 @@ public class CalculatedFieldUtils { Map> arguments = new HashMap<>(); proto.getSingleValueArgumentsList().forEach(argProto -> { SingleValueArgumentEntry entry = fromSingleValueArgumentProto(argProto); - arguments.computeIfAbsent(argProto.getArgName(), name -> new HashMap<>()).put(entry.getEntityId(), entry); + Map entityInputs = arguments.computeIfAbsent(argProto.getArgName(), name -> new HashMap<>()); + if (entry.getEntityId() != null) { + entityInputs.put(entry.getEntityId(), entry); + } }); arguments.forEach((argName, entityInputs) -> { relatedEntitiesAggState.getArguments().put(argName, new RelatedEntitiesArgumentEntry(entityInputs, false)); diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesAggregationCalculatedFieldStateTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesAggregationCalculatedFieldStateTest.java index a93a6e8ddd..5085c64ef2 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesAggregationCalculatedFieldStateTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesAggregationCalculatedFieldStateTest.java @@ -113,8 +113,10 @@ public class RelatedEntitiesAggregationCalculatedFieldStateTest { } @Test - void testIsReadyReturnFalseWhenNoArgumentsSet() { + void testIsReadyWhenNoRelatedEntities() { assertThat(state.isReady()).isFalse(); + assertThat(state.getReadinessStatus().errorMsg()) + .isEqualTo("No entities found via 'Aggregation path to related entities'. Verify the configured relation type and direction."); } @Test From fdade4ff410df324703c618e04469e2de0fd5a6b Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Fri, 12 Dec 2025 08:18:52 +0200 Subject: [PATCH 014/579] updated aggregation ts to align with tb aggregation logic --- .../single/EntityAggregationCalculatedFieldState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java index 721e93c6fc..a1877638e9 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java @@ -288,7 +288,7 @@ public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldSt } if (!metricsNode.isEmpty()) { ObjectNode resultNode = JacksonUtil.newObjectNode(); - resultNode.put("ts", interval.getEndTs() - 1); + resultNode.put("ts", interval.getStartTs()); resultNode.set("values", metricsNode); result.add(resultNode); From 6d5141f6741d54485cf9b7a71407a5fd335f1cea Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Fri, 12 Dec 2025 09:39:04 +0200 Subject: [PATCH 015/579] fixed cf check interval duration --- .../service/cf/ctx/state/CalculatedFieldCtx.java | 11 +++++------ .../single/EntityAggregationCalculatedFieldState.java | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java index b97be4dcd8..f357a1ab7b 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java @@ -128,8 +128,8 @@ public class CalculatedFieldCtx implements Closeable { private List relatedEntityArgumentNames; private long scheduledUpdateIntervalMillis; - private long cfCheckReevaluationInterval; - private long alarmReevaluationInterval; + private long cfCheckReevaluationIntervalMillis; + private long alarmReevaluationIntervalMillis; private Argument propagationArgument; private boolean applyExpressionForResolvedArguments; @@ -246,8 +246,7 @@ public class CalculatedFieldCtx implements Closeable { boolean requiresScheduledReevaluation = calculatedField.getConfiguration().requiresScheduledReevaluation(); if (calculatedField.getConfiguration() instanceof AlarmCalculatedFieldConfiguration) { if (requiresScheduledReevaluation) { - long reevaluationIntervalMillis = TimeUnit.SECONDS.toMillis(alarmReevaluationInterval); - if (now - lastReevaluationTs >= reevaluationIntervalMillis) { + if (now - lastReevaluationTs >= alarmReevaluationIntervalMillis) { lastReevaluationTs = now; return true; } @@ -306,8 +305,8 @@ public class CalculatedFieldCtx implements Closeable { this.maxStateSize = apiLimitService.getLimit(tenantId, DefaultTenantProfileConfiguration::getMaxStateSizeInKBytes) * 1024; this.maxSingleValueArgumentSize = apiLimitService.getLimit(tenantId, DefaultTenantProfileConfiguration::getMaxSingleValueArgumentSizeInKBytes) * 1024; this.intermediateAggregationIntervalMillis = TimeUnit.SECONDS.toMillis(apiLimitService.getLimit(tenantId, DefaultTenantProfileConfiguration::getIntermediateAggregationIntervalInSecForCF)); - this.cfCheckReevaluationInterval = apiLimitService.getLimit(tenantId, DefaultTenantProfileConfiguration::getCfReevaluationCheckInterval); - this.alarmReevaluationInterval = apiLimitService.getLimit(tenantId, DefaultTenantProfileConfiguration::getAlarmsReevaluationInterval); + this.cfCheckReevaluationIntervalMillis = TimeUnit.SECONDS.toMillis(apiLimitService.getLimit(tenantId, DefaultTenantProfileConfiguration::getCfReevaluationCheckInterval)); + this.alarmReevaluationIntervalMillis = TimeUnit.SECONDS.toMillis(apiLimitService.getLimit(tenantId, DefaultTenantProfileConfiguration::getAlarmsReevaluationInterval)); } public double evaluateSimpleExpression(Expression expression, CalculatedFieldState state) { diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java index a1877638e9..0f6e01a344 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java @@ -205,7 +205,7 @@ public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldSt handleExpiredInterval(intervalEntry, args, results); expiredIntervals.add(intervalEntry); } else if (now - startTs >= intervalEntry.getIntervalDuration()) { - handleActiveInterval(ctx.getCfCheckReevaluationInterval(), intervalEntry, args, results); + handleActiveInterval(ctx.getCfCheckReevaluationIntervalMillis(), intervalEntry, args, results); if (watermarkDuration == 0) { expiredIntervals.add(intervalEntry); } From ae33b5bbfeb130f7b5b559f32a3e11935d5d12e5 Mon Sep 17 00:00:00 2001 From: nickAS21 Date: Fri, 12 Dec 2025 18:23:57 +0200 Subject: [PATCH 016/579] lwm2m: fix bug? delete fluky tests 19_65534/65534 --- .../ota/AbstractOtaLwM2MIntegrationTest.java | 23 --------- .../ota/sql/Ota5LwM2MIntegrationTest.java | 47 ------------------- .../ota/sql/Ota9LwM2MIntegrationTest.java | 46 +----------------- 3 files changed, 2 insertions(+), 114 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/AbstractOtaLwM2MIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/AbstractOtaLwM2MIntegrationTest.java index cff56694e5..d5af0a1857 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/AbstractOtaLwM2MIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/AbstractOtaLwM2MIntegrationTest.java @@ -247,27 +247,4 @@ public abstract class AbstractOtaLwM2MIntegrationTest extends AbstractLwM2MInteg log.warn("{}", statuses); return statuses.containsAll(expectedStatuses); } - - protected void resultReadOtaParams_19(String resourceIdVer, OtaPackageInfo otaPackageInfo) throws Exception { - String actualResult = sendRPCById(resourceIdVer); - ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); - assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); - String valStr = rpcActualResult.get("value").asText(); - String start = "{ id=0 value="; - String valHexDec = valStr.substring(valStr.indexOf(start) + start.length(), (valStr.indexOf("}"))); - String valNode = new String(Hex.decodeHex((valHexDec).toCharArray())); - ObjectNode actualResultVal = JacksonUtil.fromString(valNode, ObjectNode.class); - assert actualResultVal != null; - assertEquals(otaPackageInfo.getTitle(), actualResultVal.get(OTA_INFO_19_TITLE).asText()); - assertEquals(otaPackageInfo.getVersion(), actualResultVal.get(OTA_INFO_19_VERSION).asText()); - assertEquals(otaPackageInfo.getChecksum(), actualResultVal.get(OTA_INFO_19_FILE_CHECKSUM256).asText()); - assertEquals(otaPackageInfo.getFileName(), actualResultVal.get(OTA_INFO_19_FILE_NAME).asText()); - assertEquals(Optional.of(otaPackageInfo.getDataSize()), Optional.of((long) actualResultVal.get(OTA_INFO_19_FILE_SIZE).asInt())); - } - - private String sendRPCById(String path) throws Exception { - String setRpcRequest = "{\"method\": \"Read\", \"params\": {\"id\": \"" + path + "\"}}"; - return doPostAsync("/api/plugins/rpc/twoway/" + lwM2MTestClient.getDeviceIdStr(), setRpcRequest, String.class, status().isOk()); - } - } diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota5LwM2MIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota5LwM2MIntegrationTest.java index e4db6f70bf..6e272a4f64 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota5LwM2MIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota5LwM2MIntegrationTest.java @@ -111,51 +111,4 @@ public class Ota5LwM2MIntegrationTest extends AbstractOtaLwM2MIntegrationTest { .until(() -> getFwSwStateTelemetryFromAPI(device.getId().getId(), "fw_state"), this::predicateForStatuses); log.warn("Object5: Got the ts: {}", ts); } - - /** - * ObjectId = 19/65533/0 - * { - * "title" : "My firmware", - * "version" : "fw.v.1.5.0-update", - * "checksum" : "4bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a", - * "fileSize" : 1, - * "fileName" : "filename.txt" - * } - * to base64 - * /5/0/5 -> Update Result (Res); 5/0/3 -> State; - * => ((Res>=0 && Res<=9) && State=0) - * => Write to Package/Write to Package URI -> DOWNLOADING ((Res>=0 && Res<=9) && State=1) - * => Download Finished -> DOWNLOADED ((Res==0 || Res=8) && State=2) - * => Executable resource Update is triggered / Initiate Firmware Update -> UPDATING (Res=0 && State=3) - * => Update Successful [Res==1] - * => Start / Res=0 -> "IDLE" .... - * @throws Exception - */ - @Test - public void testFirmwareUpdateByObject5WithObject19_Ok() throws Exception { - Lwm2mDeviceProfileTransportConfiguration transportConfiguration = getTransportConfiguration19(OBSERVE_ATTRIBUTES_WITH_PARAMS_OTA5_19, getBootstrapServerCredentialsNoSec(NONE)); - DeviceProfile deviceProfile = createLwm2mDeviceProfile("profileFor" + this.CLIENT_ENDPOINT_OTA5 + "19_Ok", transportConfiguration); - String endpoint = this.CLIENT_ENDPOINT_OTA5 + "19_Ok"; - LwM2MDeviceCredentials deviceCredentials = getDeviceCredentialsNoSec(createNoSecClientCredentials(endpoint)); - final Device device = createLwm2mDevice(deviceCredentials, endpoint, deviceProfile.getId()); - createNewClient(SECURITY_NO_SEC, null, false, endpoint, device.getId().getId().toString()); - awaitObserveReadAll(6, device.getId().getId().toString()); - - OtaPackageInfo otaPackageInfo = createFirmware(TARGET_FW_VERSION, deviceProfile.getId()); - device.setFirmwareId(otaPackageInfo.getId()); - final Device savedDevice = doPost("/api/device", device, Device.class); - - assertThat(savedDevice).as("saved device").isNotNull(); - assertThat(getDeviceFromAPI(device.getId().getId())).as("fetched device").isEqualTo(savedDevice); - - expectedStatuses = Arrays.asList(QUEUED, INITIATED, DOWNLOADING, DOWNLOADED, UPDATING, UPDATED); - List ts = await("await on timeseries for FW") - .atMost(TIMEOUT, TimeUnit.SECONDS) - .until(() -> getFwSwStateTelemetryFromAPI(device.getId().getId(), "fw_state"), this::predicateForStatuses); - - String ver_Id_19 = lwM2MTestClient.getLeshanClient().getObjectTree().getModel().getObjectModel(BINARY_APP_DATA_CONTAINER).version; - String resourceIdVer = "/" + BINARY_APP_DATA_CONTAINER + "_" + ver_Id_19 + "/" + FW_INSTANCE_ID + "/" + RESOURCE_ID_0; - resultReadOtaParams_19(resourceIdVer, otaPackageInfo); - log.warn("Object5 with Object19: Got the ts: {}", ts); - } } diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota9LwM2MIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota9LwM2MIntegrationTest.java index b2617dd7ba..a091821444 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota9LwM2MIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota9LwM2MIntegrationTest.java @@ -51,7 +51,8 @@ public class Ota9LwM2MIntegrationTest extends AbstractOtaLwM2MIntegrationTest { * => PKG integrity verified -> DELIVERED (Res=3 (Successfully Downloaded and package integrity verified) && State=3) -> INSTALLED; * => Install -> INSTALLED (Res=2 SW successfully installed) && State=4) -> Start * - * */ + * + */ @Test public void testSoftwareUpdateByObject9() throws Exception { String clientEndpoint = this.CLIENT_ENDPOINT_OTA9; @@ -75,47 +76,4 @@ public class Ota9LwM2MIntegrationTest extends AbstractOtaLwM2MIntegrationTest { .until(() -> getFwSwStateTelemetryFromAPI(device.getId().getId(), "sw_state"), this::predicateForStatuses); log.warn("Object9: Got the ts: {}", ts); } - /** - * ObjectId = 19/65534/0 - * { - * "title" : "My sw", - * "version" : "v1.0.19", - * "checksum" : "4bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a", - * "fileSize" : 1, - * "fileName" : "filename.txt" - * } - * => Start -> INITIAL (State=0) -> DOWNLOAD STARTED; - * => PKG / URI Write -> DOWNLOAD STARTED (Res=1 (Downloading) && State=1) -> DOWNLOADED - * => PKG Written -> DOWNLOADED (Res=1 Initial && State=2) -> DELIVERED; - * => PKG integrity verified -> DELIVERED (Res=3 (Successfully Downloaded and package integrity verified) && State=3) -> INSTALLED; - * => Install -> INSTALLED (Res=2 SW successfully installed) && State=4) -> Start - * - * */ - @Test - public void testSoftwareUpdateByObject9WithObject19_Ok() throws Exception { - String clientEndpoint = this.CLIENT_ENDPOINT_OTA9_19; - Lwm2mDeviceProfileTransportConfiguration transportConfiguration = getTransportConfiguration19(OBSERVE_ATTRIBUTES_WITH_PARAMS_OTA9_19, getBootstrapServerCredentialsNoSec(NONE)); - DeviceProfile deviceProfile = createLwm2mDeviceProfile("profileFor" + clientEndpoint, transportConfiguration); - LwM2MDeviceCredentials deviceCredentials = getDeviceCredentialsNoSec(createNoSecClientCredentials(clientEndpoint)); - final Device device = createLwm2mDevice(deviceCredentials, clientEndpoint, deviceProfile.getId()); - createNewClient(SECURITY_NO_SEC, null, false, clientEndpoint, device.getId().getId().toString()); - awaitObserveReadAll(5, device.getId().getId().toString()); - OtaPackageInfo otaPackageInfo = createSoftware(deviceProfile.getId(), "v1.0.19"); - device.setSoftwareId(otaPackageInfo.getId()); - final Device savedDevice = doPost("/api/device", device, Device.class); //sync call - - assertThat(savedDevice).as("saved device").isNotNull(); - assertThat(getDeviceFromAPI(device.getId().getId())).as("fetched device").isEqualTo(savedDevice); - - expectedStatuses = List.of( - QUEUED, INITIATED, DOWNLOADING, DOWNLOADING, DOWNLOADING, DOWNLOADED, VERIFIED, UPDATED); - List ts = await("await on timeseries") - .atMost(TIMEOUT, TimeUnit.SECONDS) - .until(() -> getFwSwStateTelemetryFromAPI(device.getId().getId(), "sw_state"), this::predicateForStatuses); - - String ver_Id_19 = lwM2MTestClient.getLeshanClient().getObjectTree().getModel().getObjectModel(BINARY_APP_DATA_CONTAINER).version; - String resourceIdVer = "/" + BINARY_APP_DATA_CONTAINER + "_" + ver_Id_19 + "/" + SW_INSTANCE_ID + "/" + RESOURCE_ID_0; - resultReadOtaParams_19(resourceIdVer, otaPackageInfo); - log.warn("Object9: Got the ts: {}", ts); - } } From f19540271f981afcdb5e7846883d21563ba23935 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Fri, 12 Dec 2025 18:35:10 +0200 Subject: [PATCH 017/579] added ability to sync EDQS entities by entity type --- .../service/edqs/DefaultEdqsService.java | 44 +++++++----- .../server/service/edqs/EdqsSyncService.java | 70 ++++++++++++------- .../server/service/edqs/EdqsSyncState.java | 32 +++++++++ .../common/data/edqs/EdqsSyncRequest.java | 8 +++ 4 files changed, 111 insertions(+), 43 deletions(-) create mode 100644 application/src/main/java/org/thingsboard/server/service/edqs/EdqsSyncState.java diff --git a/application/src/main/java/org/thingsboard/server/service/edqs/DefaultEdqsService.java b/application/src/main/java/org/thingsboard/server/service/edqs/DefaultEdqsService.java index 617902bd3d..57cbace546 100644 --- a/application/src/main/java/org/thingsboard/server/service/edqs/DefaultEdqsService.java +++ b/application/src/main/java/org/thingsboard/server/service/edqs/DefaultEdqsService.java @@ -73,6 +73,7 @@ import org.thingsboard.server.queue.util.AfterStartUp; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -150,12 +151,10 @@ public class DefaultEdqsService implements EdqsService { executor.submit(() -> { try { EdqsSyncState syncState = getSyncState(); - if (edqsSyncService.isSyncNeeded() || syncState == null || syncState.getStatus() != EdqsSyncStatus.FINISHED) { - if (hashPartitionService.isSystemPartitionMine(ServiceType.TB_CORE)) { - processSystemRequest(ToCoreEdqsRequest.builder() - .syncRequest(new EdqsSyncRequest()) - .build()); - } + if (edqsSyncService.isSyncNeeded() || syncState == null) { + requestEdqsSync(new EdqsSyncRequest()); + } else if (syncState.getStatus() != EdqsSyncStatus.FINISHED) { + requestEdqsSync(new EdqsSyncRequest(syncState.getObjectTypes())); } else { // only if topic/RocksDB is not empty and sync is finished onSyncStatusUpdate(EdqsSyncStatus.FINISHED); @@ -166,11 +165,19 @@ public class DefaultEdqsService implements EdqsService { }); } + private void requestEdqsSync(EdqsSyncRequest syncRequest) { + if (hashPartitionService.isSystemPartitionMine(ServiceType.TB_CORE)) { + processSystemRequest(ToCoreEdqsRequest.builder() + .syncRequest(syncRequest) + .build()); + } + } + @Override public void processSystemRequest(ToCoreEdqsRequest request) { log.info("Processing system request {}", request); if (request.getSyncRequest() != null) { - saveSyncState(EdqsSyncStatus.REQUESTED); + saveSyncState(EdqsSyncStatus.REQUESTED, request.getSyncRequest().getObjectTypes()); } broadcast(ToCoreEdqsMsg.builder() .syncRequest(request.getSyncRequest()) @@ -198,7 +205,8 @@ public class DefaultEdqsService implements EdqsService { onSyncStatusUpdate(msg.getSyncStatus()); } - if (msg.getSyncRequest() != null) { + EdqsSyncRequest syncRequest = msg.getSyncRequest(); + if (syncRequest != null) { syncLock.lock(); try { EdqsSyncState syncState = getSyncState(); @@ -209,15 +217,15 @@ public class DefaultEdqsService implements EdqsService { return; } } - saveSyncState(EdqsSyncStatus.STARTED); + saveSyncState(EdqsSyncStatus.STARTED, syncRequest.getObjectTypes()); - edqsSyncService.sync(); + edqsSyncService.sync(syncRequest); saveSyncState(EdqsSyncStatus.FINISHED); broadcastSyncStatusUpdate(EdqsSyncStatus.FINISHED); } catch (Exception e) { log.error("Failed to complete sync", e); - saveSyncState(EdqsSyncStatus.FAILED); + saveSyncState(EdqsSyncStatus.FAILED, syncRequest.getObjectTypes()); broadcastSyncStatusUpdate(EdqsSyncStatus.FAILED); } finally { syncLock.unlock(); @@ -369,7 +377,12 @@ public class DefaultEdqsService implements EdqsService { @SneakyThrows private void saveSyncState(EdqsSyncStatus status) { - EdqsSyncState state = new EdqsSyncState(status); + saveSyncState(status, null); + } + + @SneakyThrows + private void saveSyncState(EdqsSyncStatus status, Set objectTypes) { + EdqsSyncState state = new EdqsSyncState(status, objectTypes); log.info("New EDQS sync state: {}", state); attributesService.save(TenantId.SYS_TENANT_ID, TenantId.SYS_TENANT_ID, AttributeScope.SERVER_SCOPE, new BaseAttributeKvEntry( new JsonDataEntry("edqsSyncState", JacksonUtil.toString(state)), @@ -383,11 +396,4 @@ public class DefaultEdqsService implements EdqsService { eventsProducer.stop(); } - @Data - @AllArgsConstructor - @NoArgsConstructor - private static class EdqsSyncState { - private EdqsSyncStatus status; - } - } diff --git a/application/src/main/java/org/thingsboard/server/service/edqs/EdqsSyncService.java b/application/src/main/java/org/thingsboard/server/service/edqs/EdqsSyncService.java index 88f344d048..4395ed4f1c 100644 --- a/application/src/main/java/org/thingsboard/server/service/edqs/EdqsSyncService.java +++ b/application/src/main/java/org/thingsboard/server/service/edqs/EdqsSyncService.java @@ -25,6 +25,7 @@ import org.thingsboard.server.common.data.ObjectType; import org.thingsboard.server.common.data.edqs.AttributeKv; import org.thingsboard.server.common.data.edqs.EdqsEventType; import org.thingsboard.server.common.data.edqs.EdqsObject; +import org.thingsboard.server.common.data.edqs.EdqsSyncRequest; import org.thingsboard.server.common.data.edqs.Entity; import org.thingsboard.server.common.data.edqs.LatestTsKv; import org.thingsboard.server.common.data.edqs.fields.EntityFields; @@ -83,21 +84,38 @@ public abstract class EdqsSyncService { public abstract boolean isSyncNeeded(); - public void sync() { + public void sync(EdqsSyncRequest syncRequest) { log.info("Synchronizing data to EDQS"); long startTs = System.currentTimeMillis(); counters.clear(); - syncTenantEntities(); - syncRelations(); - loadKeyDictionary(); - syncAttributes(); - syncLatestTimeseries(); + if (syncRequest.getObjectTypes() != null && !syncRequest.getObjectTypes().isEmpty()) { + log.info("Sync request for entity types: {}", syncRequest.getObjectTypes()); + for (ObjectType objectType : syncRequest.getObjectTypes()) { + syncObjectType(objectType); + } + } else { + log.info("Sync request for all entity types"); + syncTenantEntities(); + syncRelations(); + loadKeyDictionary(); + syncAttributes(); + syncLatestTimeseries(); + } counters.clear(); log.info("Finished synchronizing data to EDQS in {} ms", (System.currentTimeMillis() - startTs)); } + private void syncObjectType(ObjectType objectType) { + switch (objectType) { + case RELATION -> syncRelations(); + case ATTRIBUTE_KV -> syncAttributes(); + case LATEST_TS_KV -> syncLatestTimeseries(); + default -> syncTenantEntity(objectType); + } + } + private void process(TenantId tenantId, ObjectType type, EdqsObject object) { AtomicInteger counter = counters.computeIfAbsent(type, t -> new AtomicInteger()); if (counter.incrementAndGet() % 10000 == 0) { @@ -108,26 +126,30 @@ public abstract class EdqsSyncService { private void syncTenantEntities() { for (ObjectType type : edqsTenantTypes) { - log.info("Synchronizing {} entities to EDQS", type); - long ts = System.currentTimeMillis(); - EntityType entityType = type.toEntityType(); - Dao dao = entityDaoRegistry.getDao(entityType); - UUID lastId = UUID.fromString("00000000-0000-0000-0000-000000000000"); - while (true) { - var batch = dao.findNextBatch(lastId, entityBatchSize); - if (batch.isEmpty()) { - break; - } - for (EntityFields entityFields : batch) { - TenantId tenantId = TenantId.fromUUID(entityFields.getTenantId()); - entityInfoMap.put(entityFields.getId(), new EntityIdInfo(entityType, tenantId)); - process(tenantId, type, new Entity(entityType, entityFields)); - } - EntityFields lastRecord = batch.get(batch.size() - 1); - lastId = lastRecord.getId(); + syncTenantEntity(type); + } + } + + private void syncTenantEntity(ObjectType type) { + log.info("Synchronizing {} entities to EDQS", type); + long ts = System.currentTimeMillis(); + EntityType entityType = type.toEntityType(); + Dao dao = entityDaoRegistry.getDao(entityType); + UUID lastId = UUID.fromString("00000000-0000-0000-0000-000000000000"); + while (true) { + var batch = dao.findNextBatch(lastId, entityBatchSize); + if (batch.isEmpty()) { + break; + } + for (EntityFields entityFields : batch) { + TenantId tenantId = TenantId.fromUUID(entityFields.getTenantId()); + entityInfoMap.put(entityFields.getId(), new EntityIdInfo(entityType, tenantId)); + process(tenantId, type, new Entity(entityType, entityFields)); } - log.info("Finished synchronizing {} entities to EDQS in {} ms", type, (System.currentTimeMillis() - ts)); + EntityFields lastRecord = batch.get(batch.size() - 1); + lastId = lastRecord.getId(); } + log.info("Finished synchronizing {} entities to EDQS in {} ms", type, (System.currentTimeMillis() - ts)); } private void syncRelations() { diff --git a/application/src/main/java/org/thingsboard/server/service/edqs/EdqsSyncState.java b/application/src/main/java/org/thingsboard/server/service/edqs/EdqsSyncState.java new file mode 100644 index 0000000000..07945cea8b --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/edqs/EdqsSyncState.java @@ -0,0 +1,32 @@ +/** + * Copyright © 2016-2025 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. + */ +package org.thingsboard.server.service.edqs; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.thingsboard.server.common.data.ObjectType; +import org.thingsboard.server.common.data.edqs.EdqsState.EdqsSyncStatus; + +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EdqsSyncState { + private EdqsSyncStatus status; + private Set objectTypes; +} diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/edqs/EdqsSyncRequest.java b/common/data/src/main/java/org/thingsboard/server/common/data/edqs/EdqsSyncRequest.java index 12f7068c71..dc8292c55e 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/edqs/EdqsSyncRequest.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/edqs/EdqsSyncRequest.java @@ -16,9 +16,17 @@ package org.thingsboard.server.common.data.edqs; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; +import org.thingsboard.server.common.data.ObjectType; + +import java.util.Set; @Data +@AllArgsConstructor +@NoArgsConstructor @JsonIgnoreProperties public class EdqsSyncRequest { + Set objectTypes; } From f0f15dbfe292cd03e937f84b69d57ffc8dbc9776 Mon Sep 17 00:00:00 2001 From: nickAS21 Date: Mon, 15 Dec 2025 11:10:48 +0200 Subject: [PATCH 018/579] lwm2m: fix bug? delete fluky tests 19_65534/65534 - refactoring --- .../ota/AbstractOtaLwM2MIntegrationTest.java | 43 ------------------- .../ota/sql/Ota5LwM2MIntegrationTest.java | 4 -- .../ota/sql/Ota9LwM2MIntegrationTest.java | 4 -- 3 files changed, 51 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/AbstractOtaLwM2MIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/AbstractOtaLwM2MIntegrationTest.java index d5af0a1857..0681f00d27 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/AbstractOtaLwM2MIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/AbstractOtaLwM2MIntegrationTest.java @@ -16,14 +16,10 @@ package org.thingsboard.server.transport.lwm2m.ota; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.github.dockerjava.zerodep.shaded.org.apache.commons.codec.binary.Hex; import lombok.extern.slf4j.Slf4j; -import org.eclipse.leshan.core.ResponseCode; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.OtaPackageInfo; import org.thingsboard.server.common.data.id.DeviceProfileId; @@ -35,20 +31,13 @@ import org.thingsboard.server.transport.lwm2m.AbstractLwM2MIntegrationTest; import java.util.Comparator; import java.util.List; -import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; -import static org.junit.Assert.assertEquals; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.thingsboard.rest.client.utils.RestJsonConverter.toTimeseries; import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE; import static org.thingsboard.server.common.data.ota.OtaPackageType.SOFTWARE; -import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.OTA_INFO_19_FILE_CHECKSUM256; -import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.OTA_INFO_19_FILE_NAME; -import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.OTA_INFO_19_FILE_SIZE; -import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.OTA_INFO_19_TITLE; -import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.OTA_INFO_19_VERSION; @Slf4j @DaoSqlTest @@ -57,7 +46,6 @@ public abstract class AbstractOtaLwM2MIntegrationTest extends AbstractLwM2MInteg protected static final String CLIENT_ENDPOINT_WITHOUT_FW_INFO = "WithoutFirmwareInfoDevice"; protected static final String CLIENT_ENDPOINT_OTA5 = "Ota5_Device"; protected static final String CLIENT_ENDPOINT_OTA9 = "Ota9_Device"; - protected static final String CLIENT_ENDPOINT_OTA9_19 = "Ota9_Device_19"; protected List expectedStatuses; protected final String OBSERVE_ATTRIBUTES_WITH_PARAMS_OTA5 = @@ -88,37 +76,6 @@ public abstract class AbstractOtaLwM2MIntegrationTest extends AbstractLwM2MInteg " \"attributeLwm2m\": {}\n" + " }"; - protected final String OBSERVE_ATTRIBUTES_WITH_PARAMS_OTA5_19 = - - " {\n" + - " \"keyName\": {\n" + - " \"/5_1.2/0/3\": \"state\",\n" + - " \"/5_1.2/0/5\": \"updateResult\",\n" + - " \"/5_1.2/0/6\": \"pkgname\",\n" + - " \"/5_1.2/0/7\": \"pkgversion\",\n" + - " \"/5_1.2/0/9\": \"firmwareUpdateDeliveryMethod\",\n" + - " \"/19_1.1/0/0\": \"dataRead\"\n" + - " },\n" + - " \"observe\": [\n" + - " \"/5_1.2/0/3\",\n" + - " \"/5_1.2/0/5\",\n" + - " \"/5_1.2/0/6\",\n" + - " \"/5_1.2/0/7\",\n" + - " \"/5_1.2/0/9\",\n" + - " \"/19_1.1/0/0\"\n" + - " ],\n" + - " \"attribute\": [],\n" + - " \"telemetry\": [\n" + - " \"/5_1.2/0/3\",\n" + - " \"/5_1.2/0/5\",\n" + - " \"/5_1.2/0/6\",\n" + - " \"/5_1.2/0/7\",\n" + - " \"/5_1.2/0/9\",\n" + - " \"/19_1.1/0/0\"\n" + - " ],\n" + - " \"attributeLwm2m\": {}\n" + - " }"; - public static final String CLIENT_LWM2M_SETTINGS_19 = " {\n" + " \"useObject19ForOtaInfo\": true,\n" + diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota5LwM2MIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota5LwM2MIntegrationTest.java index 6e272a4f64..0943491045 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota5LwM2MIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota5LwM2MIntegrationTest.java @@ -21,7 +21,6 @@ import org.junit.Assert; import org.junit.Test; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; -import org.thingsboard.server.common.data.OtaPackageInfo; import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MDeviceCredentials; import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.kv.KvEntry; @@ -46,10 +45,7 @@ import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.QUEU import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.UPDATED; import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.UPDATING; import static org.thingsboard.server.dao.service.OtaPackageServiceTest.TARGET_FW_VERSION; -import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.BINARY_APP_DATA_CONTAINER; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.LwM2MProfileBootstrapConfigType.NONE; -import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.RESOURCE_ID_0; -import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_INSTANCE_ID; @Slf4j public class Ota5LwM2MIntegrationTest extends AbstractOtaLwM2MIntegrationTest { diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota9LwM2MIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota9LwM2MIntegrationTest.java index a091821444..5371a6a3c0 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota9LwM2MIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/Ota9LwM2MIntegrationTest.java @@ -19,7 +19,6 @@ import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; -import org.thingsboard.server.common.data.OtaPackageInfo; import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MDeviceCredentials; import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.kv.TsKvEntry; @@ -36,10 +35,7 @@ import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.INIT import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.QUEUED; import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.UPDATED; import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.VERIFIED; -import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.BINARY_APP_DATA_CONTAINER; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.LwM2MProfileBootstrapConfigType.NONE; -import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.RESOURCE_ID_0; -import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SW_INSTANCE_ID; @Slf4j public class Ota9LwM2MIntegrationTest extends AbstractOtaLwM2MIntegrationTest { From 12fbfc30f35e2da6c1ce9ff5af23d0ed4c892cdc Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Mon, 15 Dec 2025 16:13:13 +0200 Subject: [PATCH 019/579] Update sql views in system patch applier --- .../SqlEntityDatabaseSchemaService.java | 13 ++- .../service/system/SystemPatchApplier.java | 18 +++ ...and-functions.sql => schema-functions.sql} | 93 +-------------- dao/src/main/resources/sql/schema-views.sql | 106 ++++++++++++++++++ .../server/dao/PostgreSqlInitializer.java | 3 +- .../server/dao/TimescaleSqlInitializer.java | 4 +- .../install/sql/EntitiesSchemaSqlTest.java | 6 +- 7 files changed, 143 insertions(+), 100 deletions(-) rename dao/src/main/resources/sql/{schema-views-and-functions.sql => schema-functions.sql} (73%) create mode 100644 dao/src/main/resources/sql/schema-views.sql diff --git a/application/src/main/java/org/thingsboard/server/service/install/SqlEntityDatabaseSchemaService.java b/application/src/main/java/org/thingsboard/server/service/install/SqlEntityDatabaseSchemaService.java index aa43d77439..a773d0ab23 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/SqlEntityDatabaseSchemaService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/SqlEntityDatabaseSchemaService.java @@ -22,12 +22,13 @@ import org.springframework.stereotype.Service; @Service @Profile("install") @Slf4j -public class SqlEntityDatabaseSchemaService extends SqlAbstractDatabaseSchemaService - implements EntityDatabaseSchemaService { +public class SqlEntityDatabaseSchemaService extends SqlAbstractDatabaseSchemaService implements EntityDatabaseSchemaService { + public static final String SCHEMA_ENTITIES_SQL = "schema-entities.sql"; public static final String SCHEMA_ENTITIES_IDX_SQL = "schema-entities-idx.sql"; public static final String SCHEMA_ENTITIES_IDX_PSQL_ADDON_SQL = "schema-entities-idx-psql-addon.sql"; - public static final String SCHEMA_VIEWS_AND_FUNCTIONS_SQL = "schema-views-and-functions.sql"; + public static final String SCHEMA_VIEWS_SQL = "schema-views.sql"; + public static final String SCHEMA_FUNCTIONS_SQL = "schema-functions.sql"; public SqlEntityDatabaseSchemaService() { super(SCHEMA_ENTITIES_SQL, SCHEMA_ENTITIES_IDX_SQL); @@ -49,8 +50,10 @@ public class SqlEntityDatabaseSchemaService extends SqlAbstractDatabaseSchemaSer @Override public void createOrUpdateViewsAndFunctions() throws Exception { - log.info("Installing SQL DataBase schema views and functions: " + SCHEMA_VIEWS_AND_FUNCTIONS_SQL); - executeQueryFromFile(SCHEMA_VIEWS_AND_FUNCTIONS_SQL); + log.info("Installing SQL DataBase schema views: " + SCHEMA_VIEWS_SQL); + executeQueryFromFile(SCHEMA_VIEWS_SQL); + log.info("Installing SQL DataBase schema functions: " + SCHEMA_FUNCTIONS_SQL); + executeQueryFromFile(SCHEMA_FUNCTIONS_SQL); } } diff --git a/application/src/main/java/org/thingsboard/server/service/system/SystemPatchApplier.java b/application/src/main/java/org/thingsboard/server/service/system/SystemPatchApplier.java index 204d2b5d6c..76af940685 100644 --- a/application/src/main/java/org/thingsboard/server/service/system/SystemPatchApplier.java +++ b/application/src/main/java/org/thingsboard/server/service/system/SystemPatchApplier.java @@ -16,7 +16,9 @@ package org.thingsboard.server.service.system; import com.fasterxml.jackson.databind.JsonNode; +import com.google.common.base.Charsets; import com.google.common.hash.Hashing; +import com.google.common.io.Resources; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -34,6 +36,7 @@ import org.thingsboard.server.service.install.update.DefaultDataUpdateService; import java.io.IOException; import java.io.UncheckedIOException; +import java.net.URL; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; @@ -53,6 +56,8 @@ import java.util.stream.Stream; @RequiredArgsConstructor public class SystemPatchApplier { + private static final String SCHEMA_VIEWS_SQL = "sql/schema-views.sql"; + private static final long ADVISORY_LOCK_ID = 7536891047216478431L; private final JdbcTemplate jdbcTemplate; @@ -86,6 +91,9 @@ public class SystemPatchApplier { } try { + updateSqlViews(); + log.info("Updated sql database views"); + int updated = updateWidgetTypes(); log.info("Updated {} widget types", updated); @@ -124,6 +132,16 @@ public class SystemPatchApplier { && packageVersion.maintenance == dbVersion.maintenance && packageVersion.patch > dbVersion.patch; } + private void updateSqlViews() { + try { + URL schemaViewsUrl = Resources.getResource(SCHEMA_VIEWS_SQL); + String sql = Resources.toString(schemaViewsUrl, Charsets.UTF_8); + jdbcTemplate.execute(sql); + } catch (IOException e) { + throw new RuntimeException("Unable to update database views from schema-views.sql", e); + } + } + private int updateWidgetTypes() { AtomicInteger updated = new AtomicInteger(); Path widgetTypesDir = installScripts.getWidgetTypesDir(); diff --git a/dao/src/main/resources/sql/schema-views-and-functions.sql b/dao/src/main/resources/sql/schema-functions.sql similarity index 73% rename from dao/src/main/resources/sql/schema-views-and-functions.sql rename to dao/src/main/resources/sql/schema-functions.sql index a6a7ae43cb..e763210a3d 100644 --- a/dao/src/main/resources/sql/schema-views-and-functions.sql +++ b/dao/src/main/resources/sql/schema-functions.sql @@ -14,84 +14,6 @@ -- limitations under the License. -- -DROP VIEW IF EXISTS device_info_active_attribute_view CASCADE; -CREATE OR REPLACE VIEW device_info_active_attribute_view AS -SELECT d.* - , c.title as customer_title - , COALESCE((c.additional_info::json->>'isPublic')::bool, FALSE) as customer_is_public - , d.type as device_profile_name - , COALESCE(da.bool_v, FALSE) as active -FROM device d - LEFT JOIN customer c ON c.id = d.customer_id - LEFT JOIN attribute_kv da ON da.entity_id = d.id AND da.attribute_type = 2 AND da.attribute_key = (select key_id from key_dictionary where key = 'active'); - -DROP VIEW IF EXISTS device_info_active_ts_view CASCADE; -CREATE OR REPLACE VIEW device_info_active_ts_view AS -SELECT d.* - , c.title as customer_title - , COALESCE((c.additional_info::json->>'isPublic')::bool, FALSE) as customer_is_public - , d.type as device_profile_name - , COALESCE(dt.bool_v, FALSE) as active -FROM device d - LEFT JOIN customer c ON c.id = d.customer_id - LEFT JOIN ts_kv_latest dt ON dt.entity_id = d.id and dt.key = (select key_id from key_dictionary where key = 'active'); - -DROP VIEW IF EXISTS device_info_view CASCADE; -CREATE OR REPLACE VIEW device_info_view AS SELECT * FROM device_info_active_attribute_view; - -DROP VIEW IF EXISTS alarm_info CASCADE; -CREATE VIEW alarm_info AS -SELECT a.*, -(CASE WHEN a.acknowledged AND a.cleared THEN 'CLEARED_ACK' - WHEN NOT a.acknowledged AND a.cleared THEN 'CLEARED_UNACK' - WHEN a.acknowledged AND NOT a.cleared THEN 'ACTIVE_ACK' - WHEN NOT a.acknowledged AND NOT a.cleared THEN 'ACTIVE_UNACK' END) as status, -COALESCE(CASE WHEN a.originator_type = 0 THEN (select title from tenant where id = a.originator_id) - WHEN a.originator_type = 1 THEN (select title from customer where id = a.originator_id) - WHEN a.originator_type = 2 THEN (select email from tb_user where id = a.originator_id) - WHEN a.originator_type = 3 THEN (select title from dashboard where id = a.originator_id) - WHEN a.originator_type = 4 THEN (select name from asset where id = a.originator_id) - WHEN a.originator_type = 5 THEN (select name from device where id = a.originator_id) - WHEN a.originator_type = 9 THEN (select name from entity_view where id = a.originator_id) - WHEN a.originator_type = 13 THEN (select name from device_profile where id = a.originator_id) - WHEN a.originator_type = 14 THEN (select name from asset_profile where id = a.originator_id) - WHEN a.originator_type = 18 THEN (select name from edge where id = a.originator_id) END - , 'Deleted') originator_name, -COALESCE(CASE WHEN a.originator_type = 0 THEN (select title from tenant where id = a.originator_id) - WHEN a.originator_type = 1 THEN (select COALESCE(NULLIF(title, ''), email) from customer where id = a.originator_id) - WHEN a.originator_type = 2 THEN (select email from tb_user where id = a.originator_id) - WHEN a.originator_type = 3 THEN (select title from dashboard where id = a.originator_id) - WHEN a.originator_type = 4 THEN (select COALESCE(NULLIF(label, ''), name) from asset where id = a.originator_id) - WHEN a.originator_type = 5 THEN (select COALESCE(NULLIF(label, ''), name) from device where id = a.originator_id) - WHEN a.originator_type = 9 THEN (select name from entity_view where id = a.originator_id) - WHEN a.originator_type = 13 THEN (select name from device_profile where id = a.originator_id) - WHEN a.originator_type = 14 THEN (select name from asset_profile where id = a.originator_id) - WHEN a.originator_type = 18 THEN (select COALESCE(NULLIF(label, ''), name) from edge where id = a.originator_id) END - , 'Deleted') as originator_label, -u.first_name as assignee_first_name, u.last_name as assignee_last_name, u.email as assignee_email -FROM alarm a -LEFT JOIN tb_user u ON u.id = a.assignee_id; - -DROP VIEW IF EXISTS edge_active_attribute_view CASCADE; -CREATE OR REPLACE VIEW edge_active_attribute_view AS -SELECT ee.id - , ee.created_time - , ee.additional_info - , ee.customer_id - , ee.root_rule_chain_id - , ee.type - , ee.name - , ee.label - , ee.routing_key - , ee.secret - , ee.tenant_id - , ee.version -FROM edge ee - JOIN attribute_kv ON ee.id = attribute_kv.entity_id - JOIN key_dictionary ON attribute_kv.attribute_key = key_dictionary.key_id -WHERE attribute_kv.bool_v = true AND key_dictionary.key = 'active' -ORDER BY ee.id; - CREATE OR REPLACE FUNCTION create_or_update_active_alarm( t_id uuid, c_id uuid, a_id uuid, a_created_ts bigint, a_o_id uuid, a_o_type integer, a_type varchar, @@ -306,19 +228,6 @@ BEGIN END $$; -DROP VIEW IF EXISTS widget_type_info_view CASCADE; -CREATE OR REPLACE VIEW widget_type_info_view AS -SELECT t.*, - COALESCE((t.descriptor::json->>'type')::text, '') as widget_type, - array_to_json(ARRAY( - SELECT json_build_object('id', wb.widgets_bundle_id, 'name', b.title) - FROM widgets_bundle_widget wb - JOIN widgets_bundle b ON wb.widgets_bundle_id = b.id - WHERE wb.widget_type_id = t.id - ORDER BY b.title - )) AS bundles -FROM widget_type t; - CREATE OR REPLACE PROCEDURE cleanup_timeseries_by_ttl(IN null_uuid uuid, IN system_ttl bigint, INOUT deleted bigint) LANGUAGE plpgsql AS @@ -389,4 +298,4 @@ BEGIN FETCH tenant_cursor INTO tenant_id_record; END LOOP; END -$$; \ No newline at end of file +$$; diff --git a/dao/src/main/resources/sql/schema-views.sql b/dao/src/main/resources/sql/schema-views.sql new file mode 100644 index 0000000000..c8f7ea6483 --- /dev/null +++ b/dao/src/main/resources/sql/schema-views.sql @@ -0,0 +1,106 @@ +-- +-- Copyright © 2016-2025 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. +-- + +DROP VIEW IF EXISTS device_info_active_attribute_view CASCADE; +CREATE OR REPLACE VIEW device_info_active_attribute_view AS +SELECT d.* + , c.title as customer_title + , COALESCE((c.additional_info::json->>'isPublic')::bool, FALSE) as customer_is_public + , d.type as device_profile_name + , COALESCE(da.bool_v, FALSE) as active +FROM device d + LEFT JOIN customer c ON c.id = d.customer_id + LEFT JOIN attribute_kv da ON da.entity_id = d.id AND da.attribute_type = 2 AND da.attribute_key = (select key_id from key_dictionary where key = 'active'); + +DROP VIEW IF EXISTS device_info_active_ts_view CASCADE; +CREATE OR REPLACE VIEW device_info_active_ts_view AS +SELECT d.* + , c.title as customer_title + , COALESCE((c.additional_info::json->>'isPublic')::bool, FALSE) as customer_is_public + , d.type as device_profile_name + , COALESCE(dt.bool_v, FALSE) as active +FROM device d + LEFT JOIN customer c ON c.id = d.customer_id + LEFT JOIN ts_kv_latest dt ON dt.entity_id = d.id and dt.key = (select key_id from key_dictionary where key = 'active'); + +DROP VIEW IF EXISTS device_info_view CASCADE; +CREATE OR REPLACE VIEW device_info_view AS SELECT * FROM device_info_active_attribute_view; + +DROP VIEW IF EXISTS alarm_info CASCADE; +CREATE VIEW alarm_info AS +SELECT a.*, +(CASE WHEN a.acknowledged AND a.cleared THEN 'CLEARED_ACK' + WHEN NOT a.acknowledged AND a.cleared THEN 'CLEARED_UNACK' + WHEN a.acknowledged AND NOT a.cleared THEN 'ACTIVE_ACK' + WHEN NOT a.acknowledged AND NOT a.cleared THEN 'ACTIVE_UNACK' END) as status, +COALESCE(CASE WHEN a.originator_type = 0 THEN (select title from tenant where id = a.originator_id) + WHEN a.originator_type = 1 THEN (select title from customer where id = a.originator_id) + WHEN a.originator_type = 2 THEN (select email from tb_user where id = a.originator_id) + WHEN a.originator_type = 3 THEN (select title from dashboard where id = a.originator_id) + WHEN a.originator_type = 4 THEN (select name from asset where id = a.originator_id) + WHEN a.originator_type = 5 THEN (select name from device where id = a.originator_id) + WHEN a.originator_type = 9 THEN (select name from entity_view where id = a.originator_id) + WHEN a.originator_type = 13 THEN (select name from device_profile where id = a.originator_id) + WHEN a.originator_type = 14 THEN (select name from asset_profile where id = a.originator_id) + WHEN a.originator_type = 18 THEN (select name from edge where id = a.originator_id) END + , 'Deleted') originator_name, +COALESCE(CASE WHEN a.originator_type = 0 THEN (select title from tenant where id = a.originator_id) + WHEN a.originator_type = 1 THEN (select COALESCE(NULLIF(title, ''), email) from customer where id = a.originator_id) + WHEN a.originator_type = 2 THEN (select email from tb_user where id = a.originator_id) + WHEN a.originator_type = 3 THEN (select title from dashboard where id = a.originator_id) + WHEN a.originator_type = 4 THEN (select COALESCE(NULLIF(label, ''), name) from asset where id = a.originator_id) + WHEN a.originator_type = 5 THEN (select COALESCE(NULLIF(label, ''), name) from device where id = a.originator_id) + WHEN a.originator_type = 9 THEN (select name from entity_view where id = a.originator_id) + WHEN a.originator_type = 13 THEN (select name from device_profile where id = a.originator_id) + WHEN a.originator_type = 14 THEN (select name from asset_profile where id = a.originator_id) + WHEN a.originator_type = 18 THEN (select COALESCE(NULLIF(label, ''), name) from edge where id = a.originator_id) END + , 'Deleted') as originator_label, +u.first_name as assignee_first_name, u.last_name as assignee_last_name, u.email as assignee_email +FROM alarm a +LEFT JOIN tb_user u ON u.id = a.assignee_id; + +DROP VIEW IF EXISTS edge_active_attribute_view CASCADE; +CREATE OR REPLACE VIEW edge_active_attribute_view AS +SELECT ee.id + , ee.created_time + , ee.additional_info + , ee.customer_id + , ee.root_rule_chain_id + , ee.type + , ee.name + , ee.label + , ee.routing_key + , ee.secret + , ee.tenant_id + , ee.version +FROM edge ee + JOIN attribute_kv ON ee.id = attribute_kv.entity_id + JOIN key_dictionary ON attribute_kv.attribute_key = key_dictionary.key_id +WHERE attribute_kv.bool_v = true AND key_dictionary.key = 'active' +ORDER BY ee.id; + +DROP VIEW IF EXISTS widget_type_info_view CASCADE; +CREATE OR REPLACE VIEW widget_type_info_view AS +SELECT t.*, + COALESCE((t.descriptor::json->>'type')::text, '') as widget_type, + array_to_json(ARRAY( + SELECT json_build_object('id', wb.widgets_bundle_id, 'name', b.title) + FROM widgets_bundle_widget wb + JOIN widgets_bundle b ON wb.widgets_bundle_id = b.id + WHERE wb.widget_type_id = t.id + ORDER BY b.title + )) AS bundles +FROM widget_type t; diff --git a/dao/src/test/java/org/thingsboard/server/dao/PostgreSqlInitializer.java b/dao/src/test/java/org/thingsboard/server/dao/PostgreSqlInitializer.java index b2bb965380..49956bd6d4 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/PostgreSqlInitializer.java +++ b/dao/src/test/java/org/thingsboard/server/dao/PostgreSqlInitializer.java @@ -33,7 +33,8 @@ public class PostgreSqlInitializer { "sql/schema-entities.sql", "sql/schema-entities-idx.sql", "sql/schema-entities-idx-psql-addon.sql", - "sql/schema-views-and-functions.sql", + "sql/schema-views.sql", + "sql/schema-functions.sql", "sql/system-data.sql", "sql/system-test-psql.sql"); private static final String dropAllTablesSqlFile = "sql/psql/drop-all-tables.sql"; diff --git a/dao/src/test/java/org/thingsboard/server/dao/TimescaleSqlInitializer.java b/dao/src/test/java/org/thingsboard/server/dao/TimescaleSqlInitializer.java index c9d13b6926..511afd1eca 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/TimescaleSqlInitializer.java +++ b/dao/src/test/java/org/thingsboard/server/dao/TimescaleSqlInitializer.java @@ -33,7 +33,8 @@ public class TimescaleSqlInitializer { "sql/schema-entities.sql", "sql/schema-entities-idx.sql", "sql/schema-entities-idx-psql-addon.sql", - "sql/schema-views-and-functions.sql", + "sql/schema-views.sql", + "sql/schema-functions.sql", "sql/system-data.sql", "sql/system-test-psql.sql"); private static final String dropAllTablesSqlFile = "sql/psql/drop-all-tables.sql"; @@ -63,4 +64,5 @@ public class TimescaleSqlInitializer { throw new RuntimeException("Unable to clean up the Timescale database. Reason: " + e.getMessage(), e); } } + } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/install/sql/EntitiesSchemaSqlTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/install/sql/EntitiesSchemaSqlTest.java index 9f10ecfb7b..b28b410a12 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/install/sql/EntitiesSchemaSqlTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/install/sql/EntitiesSchemaSqlTest.java @@ -35,8 +35,10 @@ public class EntitiesSchemaSqlTest extends AbstractServiceTest { @Value("${classpath:sql/schema-entities.sql}") private Path installEntitiesPath; - @Value("${classpath:sql/schema-views-and-functions.sql}") + @Value("${classpath:sql/schema-views.sql}") private Path installViewsPath; + @Value("${classpath:sql/schema-functions.sql}") + private Path installFunctionsPath; @Autowired private JdbcTemplate jdbcTemplate; @@ -45,10 +47,12 @@ public class EntitiesSchemaSqlTest extends AbstractServiceTest { public void testRepeatedInstall() throws IOException { String entitiesScript = Files.readString(installEntitiesPath); String viewsScript = Files.readString(installViewsPath); + String functionsScript = Files.readString(installFunctionsPath); try { for (int i = 1; i <= 2; i++) { jdbcTemplate.execute(entitiesScript); jdbcTemplate.execute(viewsScript); + jdbcTemplate.execute(functionsScript); } } catch (Exception e) { Assertions.fail("Failed to execute reinstall", e); From c77217eada0bd6f208d8f4bedf0a1f70fd524718 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Mon, 15 Dec 2025 16:17:32 +0200 Subject: [PATCH 020/579] Edge Events - added merge and filter duplicates --- .../service/edge/EdgeMsgConstructorUtils.java | 133 ++++++++++++++++++ .../service/edge/rpc/EdgeGrpcSession.java | 3 +- .../edge/EdgeMsgConstructorUtilsTest.java | 98 +++++++++++++ 3 files changed, 233 insertions(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java index 505b03a1cd..6b50b8ae15 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java @@ -21,6 +21,7 @@ import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.google.gson.JsonPrimitive; import com.google.gson.reflect.TypeToken; import lombok.extern.slf4j.Slf4j; @@ -52,6 +53,7 @@ import org.thingsboard.server.common.data.asset.AssetProfile; import org.thingsboard.server.common.data.cf.CalculatedField; import org.thingsboard.server.common.data.domain.DomainInfo; import org.thingsboard.server.common.data.edge.Edge; +import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.id.AiModelId; import org.thingsboard.server.common.data.id.AssetId; @@ -76,6 +78,7 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.id.WidgetTypeId; import org.thingsboard.server.common.data.id.WidgetsBundleId; +import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.notification.rule.NotificationRule; import org.thingsboard.server.common.data.notification.targets.NotificationTarget; import org.thingsboard.server.common.data.notification.template.NotificationTemplate; @@ -88,6 +91,7 @@ import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.common.data.widget.WidgetTypeDetails; import org.thingsboard.server.common.data.widget.WidgetsBundle; +import org.thingsboard.server.common.transport.util.JsonUtils; import org.thingsboard.server.gen.edge.v1.AiModelUpdateMsg; import org.thingsboard.server.gen.edge.v1.AlarmCommentUpdateMsg; import org.thingsboard.server.gen.edge.v1.AlarmUpdateMsg; @@ -127,11 +131,16 @@ import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg; import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg; import org.thingsboard.server.gen.transport.TransportProtos; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; @Slf4j public class EdgeMsgConstructorUtils { @@ -670,4 +679,128 @@ public class EdgeMsgConstructorUtils { .setIdLSB(aiModelId.getId().getLeastSignificantBits()).build(); } + public static List mergeAndFilterDownlinkDuplicates(List edgeEvents) { + try { + edgeEvents = removeDownlinkDuplicates(edgeEvents); + + List attrUpdateMsgs = new ArrayList<>(); + for (EdgeEvent edgeEvent : edgeEvents) { + if (EdgeEventActionType.ATTRIBUTES_UPDATED.equals(edgeEvent.getAction())) { + attrUpdateMsgs.add(new AttrUpdateMsg(edgeEvent.getEntityId(), edgeEvent.getBody())); + } + } + Map> latestTsByEntityAndKey = computeLatestTsByEntityAndKey(attrUpdateMsgs); + + List result = new ArrayList<>(); + for (EdgeEvent edgeEvent : edgeEvents) { + if (!EdgeEventActionType.ATTRIBUTES_UPDATED.equals(edgeEvent.getAction())) { + result.add(edgeEvent); + continue; + } + + Map latestByKey = latestTsByEntityAndKey.get(edgeEvent.getEntityId()); + JsonNode filteredBody = filterAttributesBody(edgeEvent.getBody(), latestByKey); + if (filteredBody == null) { + continue; + } + + result.add(createFilteredEdgeEvent(edgeEvent, filteredBody)); + } + + result.sort(Comparator.comparingLong(EdgeEvent::getSeqId)); + return result; + } catch (Exception e) { + log.warn("Can't merge downlink duplicates, edgeEvents [{}]", edgeEvents, e); + return edgeEvents; + } + } + + private static AttrsTs extractAttributes(JsonNode body) { + if (body == null) { + return new AttrsTs(0L, List.of()); + } + String bodyStr = JacksonUtil.toString(body); + var jsonObject = JsonParser.parseString(bodyStr).getAsJsonObject(); + long ts = jsonObject.get("ts").getAsLong(); + var kv = jsonObject.getAsJsonObject("kv"); + List attrs = JsonConverter.convertToAttributes( + JsonUtils.getJsonObject( + JsonConverter.convertToAttributesProto(kv).getKvList() + ), ts); + return new AttrsTs(ts, attrs); + } + + private static JsonNode filterAttributesBody(JsonNode body, Map latestByKey) { + if (body == null || latestByKey == null || latestByKey.isEmpty()) { + return null; + } + String bodyStr = JacksonUtil.toString(body); + JsonObject jsonObject = JsonParser.parseString(bodyStr).getAsJsonObject(); + long ts = jsonObject.get("ts").getAsLong(); + JsonObject kv = jsonObject.getAsJsonObject("kv"); + for (Iterator> it = kv.entrySet().iterator(); it.hasNext(); ) { + Map.Entry e = it.next(); + Long latestTs = latestByKey.get(e.getKey()); + if (latestTs == null || !latestTs.equals(ts)) { + it.remove(); + } + } + if (kv.isEmpty()) { + return null; + } + return JacksonUtil.toJsonNode(jsonObject.toString()); + } + + private static Map> computeLatestTsByEntityAndKey(List attrUpdateMsgs) { + Map> latestTsByEntityAndKey = new HashMap<>(); + for (AttrUpdateMsg attrUpdateMsg : attrUpdateMsgs) { + UUID entityId = attrUpdateMsg.entityId(); + AttrsTs attrsTs = extractAttributes(attrUpdateMsg.body()); + Map map = latestTsByEntityAndKey.computeIfAbsent(entityId, id -> new HashMap<>()); + long ts = attrsTs.ts(); + for (AttributeKvEntry attr : attrsTs.attrs()) { + map.merge(attr.getKey(), ts, Math::max); + } + } + return latestTsByEntityAndKey; + } + + private static EdgeEvent createFilteredEdgeEvent(EdgeEvent edgeEvent, JsonNode filteredBody) { + EdgeEvent filtered = new EdgeEvent(); + filtered.setSeqId(edgeEvent.getSeqId()); + filtered.setTenantId(edgeEvent.getTenantId()); + filtered.setEdgeId(edgeEvent.getEdgeId()); + filtered.setAction(edgeEvent.getAction()); + filtered.setEntityId(edgeEvent.getEntityId()); + filtered.setUid(edgeEvent.getUid()); + filtered.setType(edgeEvent.getType()); + filtered.setBody(filteredBody); + return filtered; + } + + private static List removeDownlinkDuplicates(List edgeEvents) { + Set seen = new HashSet<>(); + return edgeEvents.stream() + .filter(e -> seen.add(new EventKey( + e.getTenantId(), + e.getAction(), + e.getEntityId(), + e.getType().name(), + (e.getBody() != null ? e.getBody().toString() : "null")))) + .collect(Collectors.toList()); + } + + private record EventKey(TenantId tenantId, + EdgeEventActionType action, + UUID entityId, + String type, + String body) { + } + + private record AttrsTs(long ts, List attrs) { + } + + private record AttrUpdateMsg(UUID entityId, JsonNode body) { + } + } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java index 14c1b5e30a..095c0ea1f7 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java @@ -651,7 +651,8 @@ public abstract class EdgeGrpcSession implements Closeable { protected List convertToDownlinkMsgsPack(List edgeEvents) { List result = new ArrayList<>(); - for (EdgeEvent edgeEvent : edgeEvents) { + List filtered = EdgeMsgConstructorUtils.mergeAndFilterDownlinkDuplicates(edgeEvents); + for (EdgeEvent edgeEvent : filtered) { log.trace("[{}][{}] converting edge event to downlink msg [{}]", tenantId, edge.getId(), edgeEvent); DownlinkMsg downlinkMsg = null; try { diff --git a/application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java b/application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java index 1ee6e31372..ebb8305871 100644 --- a/application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java +++ b/application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java @@ -15,10 +15,12 @@ */ package org.thingsboard.server.service.edge; +import com.fasterxml.jackson.databind.JsonNode; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -36,6 +38,10 @@ import org.thingsboard.rule.engine.rest.TbSendRestApiCallReplyNode; import org.thingsboard.rule.engine.telemetry.TbCalculatedFieldsNode; import org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode; import org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode; +import org.thingsboard.server.common.data.edge.EdgeEvent; +import org.thingsboard.server.common.data.edge.EdgeEventActionType; +import org.thingsboard.server.common.data.edge.EdgeEventType; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.rule.RuleChainMetaData; import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.gen.edge.v1.EdgeVersion; @@ -44,6 +50,7 @@ import org.thingsboard.server.gen.edge.v1.UpdateMsgType; import java.lang.reflect.Constructor; import java.util.List; import java.util.Optional; +import java.util.UUID; import java.util.stream.Stream; import static org.thingsboard.server.service.edge.EdgeMsgConstructorUtils.EXCLUDED_NODES_BY_EDGE_VERSION; @@ -155,4 +162,95 @@ public class EdgeMsgConstructorUtilsTest { String.format("For EdgeVersion '%s', ruleNode '%s' should not be included.", edgeVersion, ruleNode.getType())); } + @Test + @DisplayName("mergeDownlinkDuplicates: latest per attribute key is retained and duplicates removed") + public void testMergeDownlinkDuplicates() { + UUID deviceId = UUID.randomUUID(); + UUID assetId = UUID.randomUUID(); + TenantId tenantId = TenantId.fromUUID(UUID.randomUUID()); + + var deviceAttrUpdate1 = createEdgeEvent(tenantId, 1, EdgeEventActionType.ATTRIBUTES_UPDATED, + deviceId, EdgeEventType.DEVICE, createAttrBody(1_000L, "{\"a\":1,\"b\":1,\"d\":1}")); + var deviceAttrUpdate2 = createEdgeEvent(tenantId, 2, EdgeEventActionType.ATTRIBUTES_UPDATED, + deviceId, EdgeEventType.DEVICE, createAttrBody(2_000L, "{\"a\":2,\"b\":2,\"c\":2}")); + var deviceAttrUpdate3 = createEdgeEvent(tenantId, 3, EdgeEventActionType.ATTRIBUTES_UPDATED, + deviceId, EdgeEventType.DEVICE, createAttrBody(3_000L, "{\"a\":3,\"d\":3}")); + + var deviceUpdate = createEdgeEvent(tenantId, 4, EdgeEventActionType.UPDATED, + deviceId, EdgeEventType.DEVICE, null); + var deviceUpdateDup = createEdgeEvent(tenantId, 5, EdgeEventActionType.UPDATED, + deviceId, EdgeEventType.DEVICE, null); + + var assetAttrUpdate1 = createEdgeEvent(tenantId, 6, EdgeEventActionType.ATTRIBUTES_UPDATED, + assetId, EdgeEventType.ASSET, createAttrBody(6_000L, "{\"a\":6,\"d\":6}")); + var assetAttrUpdate2 = createEdgeEvent(tenantId, 7, EdgeEventActionType.ATTRIBUTES_UPDATED, + assetId, EdgeEventType.ASSET, createAttrBody(7_000L, "{\"a\":7,\"b\":7,\"c\":7}")); + var assetAttrUpdate3 = createEdgeEvent(tenantId, 8, EdgeEventActionType.ATTRIBUTES_UPDATED, + assetId, EdgeEventType.ASSET, createAttrBody(8_000L, "{\"a\":8,\"d\":8}")); + + List input = List.of(deviceAttrUpdate1, deviceAttrUpdate2, deviceAttrUpdate3, + deviceUpdate, deviceUpdateDup, + assetAttrUpdate1, assetAttrUpdate2, assetAttrUpdate3); + List merged = EdgeMsgConstructorUtils.mergeAndFilterDownlinkDuplicates(input); + + Assertions.assertEquals(5, merged.size()); + + EdgeEvent deviceMergedAttrBC = merged.get(0); + Assertions.assertEquals(2, deviceMergedAttrBC.getSeqId()); + Assertions.assertEquals(deviceId, deviceMergedAttrBC.getEntityId()); + Assertions.assertEquals(2_000L, deviceMergedAttrBC.getBody().get("ts").asLong()); + Assertions.assertEquals(2, getIntValue(deviceMergedAttrBC.getBody(), "b")); + Assertions.assertEquals(2, getIntValue(deviceMergedAttrBC.getBody(), "c")); + Assertions.assertNull(getIntValue(deviceMergedAttrBC.getBody(), "a")); + + EdgeEvent deviceMergedAttrAD = merged.get(1); + Assertions.assertEquals(3, deviceMergedAttrAD.getSeqId()); + Assertions.assertEquals(deviceId, deviceMergedAttrAD.getEntityId()); + Assertions.assertEquals(3_000L, deviceMergedAttrAD.getBody().get("ts").asLong()); + Assertions.assertEquals(3, getIntValue(deviceMergedAttrAD.getBody(), "a")); + Assertions.assertEquals(3, getIntValue(deviceMergedAttrAD.getBody(), "d")); + + EdgeEvent mergedDeviceUpdate = merged.get(2); + Assertions.assertEquals(4, mergedDeviceUpdate.getSeqId()); + Assertions.assertEquals(EdgeEventActionType.UPDATED, mergedDeviceUpdate.getAction()); + + EdgeEvent assetMergedAttrBC = merged.get(3); + Assertions.assertEquals(7, assetMergedAttrBC.getSeqId()); + Assertions.assertEquals(assetId, assetMergedAttrBC.getEntityId()); + Assertions.assertEquals(7_000L, assetMergedAttrBC.getBody().get("ts").asLong()); + Assertions.assertEquals(7, getIntValue(assetMergedAttrBC.getBody(), "b")); + Assertions.assertEquals(7, getIntValue(assetMergedAttrBC.getBody(), "c")); + Assertions.assertNull(getIntValue(assetMergedAttrBC.getBody(), "a")); + + EdgeEvent assetMergedAttrAD = merged.get(4); + Assertions.assertEquals(8, assetMergedAttrAD.getSeqId()); + Assertions.assertEquals(assetId, assetMergedAttrAD.getEntityId()); + Assertions.assertEquals(8_000L, assetMergedAttrAD.getBody().get("ts").asLong()); + Assertions.assertEquals(8, getIntValue(assetMergedAttrAD.getBody(), "a")); + Assertions.assertEquals(8, getIntValue(assetMergedAttrAD.getBody(), "d")); + } + + private Integer getIntValue(JsonNode body, String key) { + return body.get("kv").get(key) != null ? body.get("kv").get(key).asInt() : null; + } + + private static JsonNode createAttrBody(long ts, String kvJson) { + return JacksonUtil.toJsonNode("{\"ts\":" + ts + ",\"kv\":" + kvJson + "}"); + } + + private static EdgeEvent createEdgeEvent(TenantId tenantId, + long seqId, + EdgeEventActionType action, + UUID entityId, + EdgeEventType type, + JsonNode body) { + EdgeEvent edgeEvent = new EdgeEvent(); + edgeEvent.setSeqId(seqId); + edgeEvent.setTenantId(tenantId); + edgeEvent.setAction(action); + edgeEvent.setEntityId(entityId); + edgeEvent.setType(type); + edgeEvent.setBody(body); + return edgeEvent; + } } From f2538117ce35c06362efdf7903532d6b56e53ebf Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Mon, 15 Dec 2025 19:19:09 +0100 Subject: [PATCH 021/579] refactoring --- .../monitoring/notification/NotificationService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/notification/NotificationService.java b/monitoring/src/main/java/org/thingsboard/monitoring/notification/NotificationService.java index 3a496fc016..36529822b1 100644 --- a/monitoring/src/main/java/org/thingsboard/monitoring/notification/NotificationService.java +++ b/monitoring/src/main/java/org/thingsboard/monitoring/notification/NotificationService.java @@ -64,11 +64,11 @@ public class NotificationService { try { notificationExecutor.shutdown(); if (!notificationExecutor.awaitTermination(10, TimeUnit.SECONDS)) { - java.util.List dropped = notificationExecutor.shutdownNow(); + var dropped = notificationExecutor.shutdownNow(); log.warn("Notification executor did not terminate in time. Forced shutdown; {} task(s) will not be executed.", dropped.size()); } } catch (InterruptedException e) { - java.util.List dropped = notificationExecutor.shutdownNow(); + var dropped = notificationExecutor.shutdownNow(); Thread.currentThread().interrupt(); log.warn("Interrupted during notification executor shutdown. Forced shutdown; {} task(s) will not be executed.", dropped.size()); } catch (Exception e) { From 0b3e63a5fa1c1d927e703dcf72672dd9dcea1559 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 16 Dec 2025 09:13:59 +0200 Subject: [PATCH 022/579] Fixed testTimeseriesDeliveryFailuresForever_deliverOnlyDeviceUpdateMsgs --- .../java/org/thingsboard/server/edge/TelemetryEdgeTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/TelemetryEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/TelemetryEdgeTest.java index 36d9ed5308..a9ec11e9b1 100644 --- a/application/src/test/java/org/thingsboard/server/edge/TelemetryEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/TelemetryEdgeTest.java @@ -223,8 +223,10 @@ public class TelemetryEdgeTest extends AbstractEdgeTest { device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData); edgeEventService.saveAsync(failedEdgeEvent).get(); + // add unique body to avoid merge and filter by device id in edge service (mergeAndFilterDownlinkDuplicates) + JsonNode uniqueBody = JacksonUtil.toJsonNode("{\"idx\":" + idx + "}"); EdgeEvent successEdgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.UPDATED, - device.getId().getId(), EdgeEventType.DEVICE, null); + device.getId().getId(), EdgeEventType.DEVICE, uniqueBody); edgeEventService.saveAsync(successEdgeEvent).get(); } From 80585a17851d298750894108daa36a5f791b1113 Mon Sep 17 00:00:00 2001 From: Dmytro Skarzhynets Date: Tue, 16 Dec 2025 09:29:25 +0200 Subject: [PATCH 023/579] Move common exceptions from `dao` to `common` module --- .../server/controller/BaseController.java | 4 +- .../server/controller/EdgeController.java | 2 +- .../ThingsboardErrorResponseHandler.java | 1 - .../processor/ai/AiModelEdgeProcessor.java | 2 +- .../processor/asset/AssetEdgeProcessor.java | 2 +- .../profile/AssetProfileEdgeProcessor.java | 2 +- .../cf/CalculatedFieldEdgeProcessor.java | 2 +- .../dashboard/DashboardEdgeProcessor.java | 2 +- .../processor/device/DeviceEdgeProcessor.java | 2 +- .../profile/DeviceProfileEdgeProcessor.java | 2 +- .../entityview/EntityViewEdgeProcessor.java | 2 +- .../resource/ResourceEdgeProcessor.java | 2 +- .../rule/RuleChainEdgeProcessor.java | 2 +- .../rpc/processor/user/UserEdgeProcessor.java | 2 +- .../DefaultSystemDataLoaderService.java | 2 +- .../service/install/InstallScripts.java | 2 +- .../service/security/AccessValidator.java | 2 +- .../settings/DefaultJwtSettingsValidator.java | 2 +- .../mfa/config/DefaultTwoFaConfigManager.java | 2 +- .../auth/rest/RestAuthenticationProvider.java | 2 +- .../system/DefaultSystemSecurityService.java | 2 +- .../system/SystemSecurityService.java | 2 +- .../DefaultEntitiesExportImportService.java | 2 +- .../transport/DefaultTransportApiService.java | 2 +- .../server/utils/LwM2mObjectModelUtils.java | 2 +- .../controller/AssetControllerTest.java | 2 +- .../AssetProfileControllerTest.java | 2 +- .../controller/CustomerControllerTest.java | 2 +- .../controller/DashboardControllerTest.java | 2 +- .../controller/DeviceControllerTest.java | 2 +- .../DeviceProfileControllerTest.java | 2 +- .../server/controller/EdgeControllerTest.java | 2 +- .../controller/EntityViewControllerTest.java | 2 +- .../controller/OtaPackageControllerTest.java | 2 +- .../controller/RuleChainControllerTest.java | 2 +- .../controller/TbResourceControllerTest.java | 2 +- .../server/controller/UserControllerTest.java | 2 +- .../WidgetsBundleControllerTest.java | 2 +- .../sql/BaseTbResourceServiceTest.java | 2 +- .../exception/DataValidationException.java | 5 +- .../EntitiesLimitExceededException.java | 4 +- .../ThingsboardRuntimeException.java | 51 +++++++++++++++++++ .../server/dao/alarm/BaseAlarmService.java | 2 +- .../dao/asset/AssetProfileServiceImpl.java | 2 +- .../server/dao/asset/BaseAssetService.java | 2 +- .../BaseComponentDescriptorService.java | 2 +- .../dao/customer/CustomerServiceImpl.java | 2 +- .../dao/dashboard/DashboardServiceImpl.java | 2 +- .../device/DeviceCredentialsServiceImpl.java | 2 +- .../dao/device/DeviceProfileServiceImpl.java | 2 +- .../server/dao/device/DeviceServiceImpl.java | 2 +- .../server/dao/edge/EdgeServiceImpl.java | 2 +- .../dao/entity/AbstractEntityService.java | 2 +- .../dao/entityview/EntityViewServiceImpl.java | 2 +- .../DeviceCredentialsValidationException.java | 4 ++ .../OAuth2ConfigTemplateServiceImpl.java | 2 +- .../server/dao/ota/BaseOtaPackageService.java | 2 +- .../server/dao/queue/BaseQueueService.java | 2 +- .../dao/relation/BaseRelationService.java | 2 +- .../dao/resource/BaseResourceService.java | 2 +- .../server/dao/rule/BaseRuleChainService.java | 2 +- .../dao/rule/BaseRuleNodeStateService.java | 2 +- .../dao/service/ConstraintValidator.java | 2 +- .../server/dao/service/DataValidator.java | 7 +-- .../AbstractHasOtaPackageValidator.java | 2 +- .../validator/AdminSettingsDataValidator.java | 2 +- .../validator/AiModelDataValidator.java | 2 +- .../validator/AlarmCommentDataValidator.java | 2 +- .../service/validator/AlarmDataValidator.java | 2 +- .../validator/ApiKeyDataValidator.java | 2 +- .../validator/ApiUsageDataValidator.java | 2 +- .../service/validator/AssetDataValidator.java | 2 +- .../validator/AssetProfileDataValidator.java | 2 +- .../validator/AuditLogDataValidator.java | 2 +- .../BaseOtaPackageDataValidator.java | 2 +- .../CalculatedFieldDataValidator.java | 2 +- ...ientRegistrationTemplateDataValidator.java | 2 +- .../ComponentDescriptorDataValidator.java | 2 +- .../validator/CustomerDataValidator.java | 2 +- .../validator/DashboardDataValidator.java | 2 +- .../validator/DeviceDataValidator.java | 2 +- .../validator/DeviceProfileDataValidator.java | 4 +- .../service/validator/EdgeDataValidator.java | 2 +- .../validator/EdgeEventDataValidator.java | 2 +- .../validator/EntityViewDataValidator.java | 2 +- .../service/validator/EventDataValidator.java | 2 +- .../MobileAppBundleDataValidator.java | 2 +- .../validator/MobileAppDataValidator.java | 2 +- .../validator/Oauth2ClientDataValidator.java | 2 +- .../validator/OtaPackageDataValidator.java | 2 +- .../QrCodeSettingsDataValidator.java | 2 +- .../validator/QueueStatsDataValidator.java | 2 +- .../dao/service/validator/QueueValidator.java | 2 +- .../validator/ResourceDataValidator.java | 2 +- .../validator/RuleChainDataValidator.java | 2 +- .../validator/TenantDataValidator.java | 2 +- .../validator/TenantProfileDataValidator.java | 2 +- .../UserCredentialsDataValidator.java | 2 +- .../service/validator/UserDataValidator.java | 2 +- .../validator/WidgetTypeDataValidator.java | 2 +- .../validator/WidgetsBundleDataValidator.java | 2 +- .../dao/tenant/TenantProfileServiceImpl.java | 2 +- .../dao/user/UserSettingsServiceImpl.java | 2 +- .../thingsboard/server/dao/util/KvUtils.java | 2 +- .../dao/service/AdminSettingsServiceTest.java | 2 +- .../server/dao/service/ApiKeyServiceTest.java | 2 +- .../dao/service/AssetProfileServiceTest.java | 2 +- .../server/dao/service/AssetServiceTest.java | 2 +- .../service/CalculatedFieldServiceTest.java | 2 +- .../dao/service/ConstraintValidatorTest.java | 4 +- .../dao/service/CustomerServiceTest.java | 2 +- .../dao/service/DashboardServiceTest.java | 2 +- .../server/dao/service/DataValidatorTest.java | 2 +- .../service/DeviceCredentialsServiceTest.java | 2 +- .../dao/service/DeviceProfileServiceTest.java | 2 +- .../server/dao/service/DeviceServiceTest.java | 2 +- .../server/dao/service/EdgeServiceTest.java | 2 +- .../OAuth2ConfigTemplateServiceTest.java | 2 +- .../dao/service/OtaPackageServiceTest.java | 2 +- .../server/dao/service/QueueServiceTest.java | 2 +- .../dao/service/QueueStatsServiceTest.java | 2 +- .../dao/service/RelationServiceTest.java | 2 +- .../dao/service/RuleChainServiceTest.java | 2 +- .../dao/service/TenantProfileServiceTest.java | 2 +- .../server/dao/service/TenantServiceTest.java | 2 +- .../server/dao/service/UserServiceTest.java | 2 +- .../dao/service/WidgetTypeServiceTest.java | 2 +- .../dao/service/WidgetsBundleServiceTest.java | 2 +- .../validator/AssetDataValidatorTest.java | 2 +- .../CalculatedFieldDataValidatorTest.java | 2 +- .../validator/DeviceDataValidatorTest.java | 2 +- .../action/TbAbstractCustomerActionNode.java | 2 +- .../action/TbAbstractRelationActionNode.java | 2 +- .../thingsboard/rule/engine/ai/TbAiNode.java | 2 +- .../engine/aws/lambda/TbAwsLambdaNode.java | 2 +- .../rule/engine/ai/TbAiNodeTest.java | 2 +- .../telemetry/TbMsgAttributesNodeTest.java | 2 +- .../telemetry/TbMsgTimeseriesNodeTest.java | 2 +- 138 files changed, 198 insertions(+), 144 deletions(-) rename {dao/src/main/java/org/thingsboard/server/dao => common/data/src/main/java/org/thingsboard/server}/exception/DataValidationException.java (88%) rename {dao/src/main/java/org/thingsboard/server/dao => common/data/src/main/java/org/thingsboard/server}/exception/EntitiesLimitExceededException.java (91%) create mode 100644 common/data/src/main/java/org/thingsboard/server/exception/ThingsboardRuntimeException.java diff --git a/application/src/main/java/org/thingsboard/server/controller/BaseController.java b/application/src/main/java/org/thingsboard/server/controller/BaseController.java index 83603f7ea5..136a101e93 100644 --- a/application/src/main/java/org/thingsboard/server/controller/BaseController.java +++ b/application/src/main/java/org/thingsboard/server/controller/BaseController.java @@ -150,8 +150,6 @@ import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.domain.DomainService; import org.thingsboard.server.dao.edge.EdgeService; import org.thingsboard.server.dao.entityview.EntityViewService; -import org.thingsboard.server.dao.exception.DataValidationException; -import org.thingsboard.server.dao.exception.EntitiesLimitExceededException; import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.job.JobService; import org.thingsboard.server.dao.mobile.MobileAppBundleService; @@ -175,6 +173,8 @@ import org.thingsboard.server.dao.tenant.TenantService; import org.thingsboard.server.dao.user.UserService; import org.thingsboard.server.dao.widget.WidgetTypeService; import org.thingsboard.server.dao.widget.WidgetsBundleService; +import org.thingsboard.server.exception.DataValidationException; +import org.thingsboard.server.exception.EntitiesLimitExceededException; import org.thingsboard.server.exception.ThingsboardErrorResponseHandler; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; diff --git a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java index 1b3e494802..df9e5c6476 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java @@ -54,7 +54,7 @@ import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportReques import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportResult; import org.thingsboard.server.common.msg.edge.FromEdgeSyncResponse; import org.thingsboard.server.config.annotations.ApiOperation; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.queue.util.TbCoreComponent; diff --git a/application/src/main/java/org/thingsboard/server/exception/ThingsboardErrorResponseHandler.java b/application/src/main/java/org/thingsboard/server/exception/ThingsboardErrorResponseHandler.java index 3ef24e2db9..8cabf2ed7b 100644 --- a/application/src/main/java/org/thingsboard/server/exception/ThingsboardErrorResponseHandler.java +++ b/application/src/main/java/org/thingsboard/server/exception/ThingsboardErrorResponseHandler.java @@ -52,7 +52,6 @@ import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.msg.tools.MaxPayloadSizeExceededException; import org.thingsboard.server.common.msg.tools.TbRateLimitsException; -import org.thingsboard.server.dao.exception.EntitiesLimitExceededException; import org.thingsboard.server.service.security.exception.AuthMethodNotSupportedException; import org.thingsboard.server.service.security.exception.JwtExpiredTokenException; import org.thingsboard.server.service.security.exception.UserPasswordExpiredException; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/AiModelEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/AiModelEdgeProcessor.java index cf1c9d9abd..1b70b8bd32 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/AiModelEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/AiModelEdgeProcessor.java @@ -29,7 +29,7 @@ import org.thingsboard.server.common.data.edge.EdgeEventType; import org.thingsboard.server.common.data.id.AiModelId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.msg.TbMsgType; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.gen.edge.v1.AiModelUpdateMsg; import org.thingsboard.server.gen.edge.v1.DownlinkMsg; import org.thingsboard.server.gen.edge.v1.EdgeVersion; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessor.java index a4b35ab541..88e3113039 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessor.java @@ -33,7 +33,7 @@ import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.msg.TbMsgType; import org.thingsboard.server.common.msg.TbMsgMetaData; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg; import org.thingsboard.server.gen.edge.v1.DownlinkMsg; import org.thingsboard.server.gen.edge.v1.EdgeVersion; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/profile/AssetProfileEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/profile/AssetProfileEdgeProcessor.java index e05b6f41c3..5c09f2507b 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/profile/AssetProfileEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/profile/AssetProfileEdgeProcessor.java @@ -33,7 +33,7 @@ import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.msg.TbMsgType; import org.thingsboard.server.common.msg.TbMsgMetaData; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.gen.edge.v1.AssetProfileUpdateMsg; import org.thingsboard.server.gen.edge.v1.DownlinkMsg; import org.thingsboard.server.gen.edge.v1.EdgeVersion; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/cf/CalculatedFieldEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/cf/CalculatedFieldEdgeProcessor.java index cab4b5ecc1..5e7099c9d8 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/cf/CalculatedFieldEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/cf/CalculatedFieldEdgeProcessor.java @@ -36,7 +36,7 @@ import org.thingsboard.server.common.data.id.EntityIdFactory; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.msg.TbMsgType; import org.thingsboard.server.common.msg.TbMsgMetaData; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.gen.edge.v1.CalculatedFieldUpdateMsg; import org.thingsboard.server.gen.edge.v1.DownlinkMsg; import org.thingsboard.server.gen.edge.v1.EdgeVersion; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java index b38a9d618e..23c7e3cbcb 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java @@ -29,7 +29,7 @@ import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.msg.TbMsgType; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg; import org.thingsboard.server.gen.edge.v1.DownlinkMsg; import org.thingsboard.server.gen.edge.v1.EdgeVersion; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java index 925e903ab2..2f655d961b 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java @@ -44,7 +44,7 @@ import org.thingsboard.server.common.msg.TbMsgDataType; import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse; import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponseActorMsg; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.gen.edge.v1.DeviceCredentialsUpdateMsg; import org.thingsboard.server.gen.edge.v1.DeviceRpcCallMsg; import org.thingsboard.server.gen.edge.v1.DeviceUpdateMsg; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/profile/DeviceProfileEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/profile/DeviceProfileEdgeProcessor.java index 3355bc819f..540fd4b448 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/profile/DeviceProfileEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/profile/DeviceProfileEdgeProcessor.java @@ -33,7 +33,7 @@ import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.msg.TbMsgType; import org.thingsboard.server.common.msg.TbMsgMetaData; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg; import org.thingsboard.server.gen.edge.v1.DownlinkMsg; import org.thingsboard.server.gen.edge.v1.EdgeVersion; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/EntityViewEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/EntityViewEdgeProcessor.java index 3b6aafea74..46923c3434 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/EntityViewEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/EntityViewEdgeProcessor.java @@ -32,7 +32,7 @@ import org.thingsboard.server.common.data.id.EntityViewId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.msg.TbMsgType; import org.thingsboard.server.common.msg.TbMsgMetaData; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.gen.edge.v1.DownlinkMsg; import org.thingsboard.server.gen.edge.v1.EdgeVersion; import org.thingsboard.server.gen.edge.v1.EntityViewUpdateMsg; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java index de31bf6a9c..28b6c49bc1 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java @@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.edge.EdgeEventType; import org.thingsboard.server.common.data.id.TbResourceId; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.gen.edge.v1.DownlinkMsg; import org.thingsboard.server.gen.edge.v1.EdgeVersion; import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/rule/RuleChainEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/rule/RuleChainEdgeProcessor.java index b949660e70..5b875b1b0f 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/rule/RuleChainEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/rule/RuleChainEdgeProcessor.java @@ -31,7 +31,7 @@ import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChainMetaData; import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.msg.TbMsgMetaData; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.gen.edge.v1.DownlinkMsg; import org.thingsboard.server.gen.edge.v1.EdgeVersion; import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserEdgeProcessor.java index 3b2d76356b..4a02aeda1d 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserEdgeProcessor.java @@ -33,7 +33,7 @@ import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.msg.TbMsgType; import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.common.msg.TbMsgMetaData; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.gen.edge.v1.DownlinkMsg; import org.thingsboard.server.gen.edge.v1.EdgeVersion; import org.thingsboard.server.gen.edge.v1.UpdateMsgType; diff --git a/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java b/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java index a55832c823..16e164877a 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java @@ -103,7 +103,7 @@ import org.thingsboard.server.dao.device.DeviceConnectivityConfiguration; import org.thingsboard.server.dao.device.DeviceCredentialsService; import org.thingsboard.server.dao.device.DeviceProfileService; import org.thingsboard.server.dao.device.DeviceService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.mobile.MobileAppDao; import org.thingsboard.server.dao.notification.NotificationSettingsService; import org.thingsboard.server.dao.notification.NotificationTargetService; diff --git a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java index f9b5c282a8..a344c9ea08 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java +++ b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java @@ -39,7 +39,7 @@ import org.thingsboard.server.common.data.rule.RuleChainMetaData; import org.thingsboard.server.common.data.widget.WidgetTypeDetails; import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.dao.dashboard.DashboardService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.oauth2.OAuth2ConfigTemplateService; import org.thingsboard.server.dao.resource.ImageService; import org.thingsboard.server.dao.resource.ResourceService; diff --git a/application/src/main/java/org/thingsboard/server/service/security/AccessValidator.java b/application/src/main/java/org/thingsboard/server/service/security/AccessValidator.java index f4183dc904..bf9cece710 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/AccessValidator.java +++ b/application/src/main/java/org/thingsboard/server/service/security/AccessValidator.java @@ -69,7 +69,7 @@ import org.thingsboard.server.dao.device.DeviceProfileService; import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.edge.EdgeService; import org.thingsboard.server.dao.entityview.EntityViewService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.ota.OtaPackageService; import org.thingsboard.server.dao.resource.ResourceService; diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/jwt/settings/DefaultJwtSettingsValidator.java b/application/src/main/java/org/thingsboard/server/service/security/auth/jwt/settings/DefaultJwtSettingsValidator.java index 63f05f6255..0f2c4f346f 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/jwt/settings/DefaultJwtSettingsValidator.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/jwt/settings/DefaultJwtSettingsValidator.java @@ -21,7 +21,7 @@ import org.apache.commons.lang3.StringUtils; import org.bouncycastle.util.Arrays; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.security.model.JwtSettings; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import java.util.Base64; import java.util.Optional; diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/mfa/config/DefaultTwoFaConfigManager.java b/application/src/main/java/org/thingsboard/server/service/security/auth/mfa/config/DefaultTwoFaConfigManager.java index 3f7d711378..a742b8cd2a 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/mfa/config/DefaultTwoFaConfigManager.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/mfa/config/DefaultTwoFaConfigManager.java @@ -29,11 +29,11 @@ import org.thingsboard.server.common.data.security.model.mfa.account.AccountTwoF import org.thingsboard.server.common.data.security.model.mfa.account.TwoFaAccountConfig; import org.thingsboard.server.common.data.security.model.mfa.provider.TwoFaProviderConfig; import org.thingsboard.server.common.data.security.model.mfa.provider.TwoFaProviderType; -import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.service.ConstraintValidator; import org.thingsboard.server.dao.settings.AdminSettingsDao; import org.thingsboard.server.dao.settings.AdminSettingsService; import org.thingsboard.server.dao.user.UserAuthSettingsDao; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.service.security.auth.mfa.TwoFactorAuthService; import java.util.Comparator; diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/rest/RestAuthenticationProvider.java b/application/src/main/java/org/thingsboard/server/service/security/auth/rest/RestAuthenticationProvider.java index e43a89f815..d137b8df40 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/rest/RestAuthenticationProvider.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/rest/RestAuthenticationProvider.java @@ -33,7 +33,7 @@ import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.common.data.security.model.SecuritySettings; import org.thingsboard.server.common.data.security.model.UserPasswordPolicy; import org.thingsboard.server.dao.customer.CustomerService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.settings.SecuritySettingsService; import org.thingsboard.server.dao.user.UserService; import org.thingsboard.server.queue.util.TbCoreComponent; diff --git a/application/src/main/java/org/thingsboard/server/service/security/system/DefaultSystemSecurityService.java b/application/src/main/java/org/thingsboard/server/service/security/system/DefaultSystemSecurityService.java index 69536f0953..7d4177e5b5 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/system/DefaultSystemSecurityService.java +++ b/application/src/main/java/org/thingsboard/server/service/security/system/DefaultSystemSecurityService.java @@ -50,7 +50,7 @@ import org.thingsboard.server.common.data.security.model.SecuritySettings; import org.thingsboard.server.common.data.security.model.UserPasswordPolicy; import org.thingsboard.server.common.data.security.model.mfa.PlatformTwoFaSettings; import org.thingsboard.server.dao.audit.AuditLogService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.settings.AdminSettingsService; import org.thingsboard.server.dao.settings.SecuritySettingsService; import org.thingsboard.server.dao.user.UserService; diff --git a/application/src/main/java/org/thingsboard/server/service/security/system/SystemSecurityService.java b/application/src/main/java/org/thingsboard/server/service/security/system/SystemSecurityService.java index 1a742c6b30..753cc9fd72 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/system/SystemSecurityService.java +++ b/application/src/main/java/org/thingsboard/server/service/security/system/SystemSecurityService.java @@ -24,7 +24,7 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.common.data.security.model.UserPasswordPolicy; import org.thingsboard.server.common.data.security.model.mfa.PlatformTwoFaSettings; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.service.security.model.SecurityUser; public interface SystemSecurityService { diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/DefaultEntitiesExportImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/DefaultEntitiesExportImportService.java index 506b48bf8c..cf0d58e5ba 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/DefaultEntitiesExportImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/DefaultEntitiesExportImportService.java @@ -31,7 +31,7 @@ import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.common.data.sync.ie.EntityExportData; import org.thingsboard.server.common.data.sync.ie.EntityImportResult; import org.thingsboard.server.common.data.util.ThrowingRunnable; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.entitiy.TbLogEntityActionService; diff --git a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java index 096c1a814a..58a5b951d5 100644 --- a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java +++ b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java @@ -22,6 +22,7 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import com.google.protobuf.ByteString; +import org.thingsboard.server.exception.EntitiesLimitExceededException; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import lombok.RequiredArgsConstructor; @@ -76,7 +77,6 @@ import org.thingsboard.server.dao.device.provision.ProvisionFailedException; import org.thingsboard.server.dao.device.provision.ProvisionRequest; import org.thingsboard.server.dao.device.provision.ProvisionResponse; import org.thingsboard.server.dao.device.provision.ProvisionResponseStatus; -import org.thingsboard.server.dao.exception.EntitiesLimitExceededException; import org.thingsboard.server.dao.ota.OtaPackageService; import org.thingsboard.server.dao.queue.QueueService; import org.thingsboard.server.dao.relation.RelationService; diff --git a/application/src/main/java/org/thingsboard/server/utils/LwM2mObjectModelUtils.java b/application/src/main/java/org/thingsboard/server/utils/LwM2mObjectModelUtils.java index 172a3e8e2d..c72620bb8f 100644 --- a/application/src/main/java/org/thingsboard/server/utils/LwM2mObjectModelUtils.java +++ b/application/src/main/java/org/thingsboard/server/utils/LwM2mObjectModelUtils.java @@ -26,7 +26,7 @@ import org.thingsboard.server.common.data.lwm2m.LwM2mInstance; import org.thingsboard.server.common.data.lwm2m.LwM2mObject; import org.thingsboard.server.common.data.lwm2m.LwM2mResourceObserve; import org.thingsboard.server.common.data.util.TbDDFFileParser; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import java.io.ByteArrayInputStream; import java.io.IOException; diff --git a/application/src/test/java/org/thingsboard/server/controller/AssetControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/AssetControllerTest.java index e160fff59e..d039d7a26d 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AssetControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AssetControllerTest.java @@ -50,7 +50,7 @@ import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.dao.asset.AssetDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.service.DaoSqlTest; diff --git a/application/src/test/java/org/thingsboard/server/controller/AssetProfileControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/AssetProfileControllerTest.java index 14ac8c91d1..a1efe16381 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AssetProfileControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AssetProfileControllerTest.java @@ -42,7 +42,7 @@ import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.dao.asset.AssetProfileDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DaoSqlTest; import java.util.ArrayList; diff --git a/application/src/test/java/org/thingsboard/server/controller/CustomerControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/CustomerControllerTest.java index 95cf62f904..be99343459 100644 --- a/application/src/test/java/org/thingsboard/server/controller/CustomerControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/CustomerControllerTest.java @@ -44,7 +44,7 @@ import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.dao.customer.CustomerDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DaoSqlTest; import java.util.ArrayList; diff --git a/application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java index 052ff8777b..712b9f1472 100644 --- a/application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java @@ -51,7 +51,7 @@ import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.dao.dashboard.DashboardDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DaoSqlTest; import java.util.ArrayList; diff --git a/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java index 78679948ab..efbf18d5f5 100644 --- a/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java @@ -72,7 +72,7 @@ import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportColumn import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportRequest; import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportResult; import org.thingsboard.server.dao.device.DeviceDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.exception.DeviceCredentialsValidationException; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.service.DaoSqlTest; diff --git a/application/src/test/java/org/thingsboard/server/controller/DeviceProfileControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/DeviceProfileControllerTest.java index fb0e3fb57a..970461480d 100644 --- a/application/src/test/java/org/thingsboard/server/controller/DeviceProfileControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/DeviceProfileControllerTest.java @@ -52,7 +52,7 @@ import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.dao.device.DeviceProfileDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DaoSqlTest; import java.util.ArrayList; diff --git a/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java index f1d3ef1d52..217bba43bb 100644 --- a/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java @@ -72,7 +72,7 @@ import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.common.data.security.model.JwtSettings; import org.thingsboard.server.dao.edge.EdgeDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.edge.imitator.EdgeImitator; diff --git a/application/src/test/java/org/thingsboard/server/controller/EntityViewControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/EntityViewControllerTest.java index c9b63b01a6..fdff81799f 100644 --- a/application/src/test/java/org/thingsboard/server/controller/EntityViewControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/EntityViewControllerTest.java @@ -63,7 +63,7 @@ import org.thingsboard.server.common.data.query.EntityKeyType; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.dao.entityview.EntityViewDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.service.DaoSqlTest; diff --git a/application/src/test/java/org/thingsboard/server/controller/OtaPackageControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/OtaPackageControllerTest.java index 3fc839996c..7df2b84c43 100644 --- a/application/src/test/java/org/thingsboard/server/controller/OtaPackageControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/OtaPackageControllerTest.java @@ -37,7 +37,7 @@ import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.security.Authority; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DaoSqlTest; import java.nio.ByteBuffer; diff --git a/application/src/test/java/org/thingsboard/server/controller/RuleChainControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/RuleChainControllerTest.java index 72a6697927..a02332812b 100644 --- a/application/src/test/java/org/thingsboard/server/controller/RuleChainControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/RuleChainControllerTest.java @@ -47,7 +47,7 @@ import org.thingsboard.server.common.data.rule.RuleChainMetaData; import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.common.data.security.Authority; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.rule.RuleChainDao; import org.thingsboard.server.dao.service.DaoSqlTest; diff --git a/application/src/test/java/org/thingsboard/server/controller/TbResourceControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/TbResourceControllerTest.java index 0875551112..5e880fb957 100644 --- a/application/src/test/java/org/thingsboard/server/controller/TbResourceControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/TbResourceControllerTest.java @@ -48,7 +48,7 @@ import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.widget.WidgetType; import org.thingsboard.server.common.data.widget.WidgetTypeDetails; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DaoSqlTest; import java.util.ArrayList; diff --git a/application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java index f5f51a0c6b..8fef7f3e1d 100644 --- a/application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java @@ -50,7 +50,7 @@ import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.settings.StarredDashboardInfo; import org.thingsboard.server.common.data.settings.UserDashboardsInfo; import org.thingsboard.server.dao.device.DeviceService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.dao.user.UserDao; diff --git a/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java index 0b1c2d282e..f84e5eb6e7 100644 --- a/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java @@ -29,7 +29,7 @@ import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.widget.WidgetsBundle; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DaoSqlTest; import java.util.ArrayList; diff --git a/application/src/test/java/org/thingsboard/server/service/resource/sql/BaseTbResourceServiceTest.java b/application/src/test/java/org/thingsboard/server/service/resource/sql/BaseTbResourceServiceTest.java index a146730465..aadbb2ebb5 100644 --- a/application/src/test/java/org/thingsboard/server/service/resource/sql/BaseTbResourceServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/service/resource/sql/BaseTbResourceServiceTest.java @@ -60,7 +60,7 @@ import org.thingsboard.server.common.data.widget.WidgetTypeDetails; import org.thingsboard.server.controller.AbstractControllerTest; import org.thingsboard.server.dao.ai.AiModelService; import org.thingsboard.server.dao.dashboard.DashboardService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.resource.ResourceService; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.service.DaoSqlTest; diff --git a/dao/src/main/java/org/thingsboard/server/dao/exception/DataValidationException.java b/common/data/src/main/java/org/thingsboard/server/exception/DataValidationException.java similarity index 88% rename from dao/src/main/java/org/thingsboard/server/dao/exception/DataValidationException.java rename to common/data/src/main/java/org/thingsboard/server/exception/DataValidationException.java index 3fb1e0dc10..6db98312e7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/exception/DataValidationException.java +++ b/common/data/src/main/java/org/thingsboard/server/exception/DataValidationException.java @@ -13,12 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.server.dao.exception; +package org.thingsboard.server.exception; public class DataValidationException extends RuntimeException { - private static final long serialVersionUID = 7659985660312721830L; - public DataValidationException(String message) { super(message); } @@ -26,4 +24,5 @@ public class DataValidationException extends RuntimeException { public DataValidationException(String message, Throwable cause) { super(message, cause); } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/exception/EntitiesLimitExceededException.java b/common/data/src/main/java/org/thingsboard/server/exception/EntitiesLimitExceededException.java similarity index 91% rename from dao/src/main/java/org/thingsboard/server/dao/exception/EntitiesLimitExceededException.java rename to common/data/src/main/java/org/thingsboard/server/exception/EntitiesLimitExceededException.java index b2907c9104..39b900cb98 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/exception/EntitiesLimitExceededException.java +++ b/common/data/src/main/java/org/thingsboard/server/exception/EntitiesLimitExceededException.java @@ -13,14 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.server.dao.exception; +package org.thingsboard.server.exception; import lombok.Getter; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.TenantId; public class EntitiesLimitExceededException extends DataValidationException { - private static final long serialVersionUID = -9211462514373279196L; @Getter private final TenantId tenantId; @@ -36,4 +35,5 @@ public class EntitiesLimitExceededException extends DataValidationException { this.entityType = entityType; this.limit = limit; } + } diff --git a/common/data/src/main/java/org/thingsboard/server/exception/ThingsboardRuntimeException.java b/common/data/src/main/java/org/thingsboard/server/exception/ThingsboardRuntimeException.java new file mode 100644 index 0000000000..0a0b8ca718 --- /dev/null +++ b/common/data/src/main/java/org/thingsboard/server/exception/ThingsboardRuntimeException.java @@ -0,0 +1,51 @@ +/** + * Copyright © 2016-2025 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. + */ +package org.thingsboard.server.exception; + +import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; + +public class ThingsboardRuntimeException extends RuntimeException { + + private ThingsboardErrorCode errorCode; + + public ThingsboardRuntimeException() { + super(); + } + + public ThingsboardRuntimeException(ThingsboardErrorCode errorCode) { + this.errorCode = errorCode; + } + + public ThingsboardRuntimeException(String message, ThingsboardErrorCode errorCode) { + super(message); + this.errorCode = errorCode; + } + + public ThingsboardRuntimeException(String message, Throwable cause, ThingsboardErrorCode errorCode) { + super(message, cause); + this.errorCode = errorCode; + } + + public ThingsboardRuntimeException(Throwable cause, ThingsboardErrorCode errorCode) { + super(cause); + this.errorCode = errorCode; + } + + public ThingsboardErrorCode getErrorCode() { + return errorCode; + } + +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java index 8e5f50da1d..517bc349a1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java @@ -64,7 +64,7 @@ import org.thingsboard.server.dao.entity.EntityService; import org.thingsboard.server.dao.eventsourcing.ActionEntityEvent; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.ConstraintValidator; import org.thingsboard.server.dao.tenant.TenantService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileServiceImpl.java index 86f3cfe130..6b985a5977 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileServiceImpl.java @@ -37,7 +37,7 @@ import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.dao.entity.CachedVersionedEntityService; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.resource.ImageService; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.PaginatedRemover; diff --git a/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java b/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java index 7d8442fd3a..64cb66f6a8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java @@ -53,7 +53,7 @@ import org.thingsboard.server.dao.entity.EntityCountService; import org.thingsboard.server.dao.eventsourcing.ActionEntityEvent; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.sql.JpaExecutorService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java b/dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java index 2c5d6fb3c5..7708e08f31 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java @@ -30,7 +30,7 @@ import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.plugin.ComponentDescriptor; import org.thingsboard.server.common.data.plugin.ComponentScope; import org.thingsboard.server.common.data.plugin.ComponentType; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.Validator; diff --git a/dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java index 28e39ae4e7..d6811b4812 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java @@ -45,7 +45,7 @@ import org.thingsboard.server.dao.entity.AbstractCachedEntityService; import org.thingsboard.server.dao.entity.EntityCountService; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.PaginatedRemover; diff --git a/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java index 71e912c215..cc2579d645 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java @@ -50,7 +50,7 @@ import org.thingsboard.server.dao.entity.EntityCountService; import org.thingsboard.server.dao.eventsourcing.ActionEntityEvent; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.resource.ImageService; import org.thingsboard.server.dao.resource.ResourceService; import org.thingsboard.server.dao.service.DataValidator; diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java index 3423a74543..ceb35109c2 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java @@ -43,9 +43,9 @@ import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.msg.EncryptionUtil; import org.thingsboard.server.dao.entity.AbstractCachedEntityService; import org.thingsboard.server.dao.eventsourcing.ActionEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DeviceCredentialsValidationException; import org.thingsboard.server.dao.service.validator.DeviceCredentialsDataValidator; +import org.thingsboard.server.exception.DataValidationException; import java.util.Objects; diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java index 612be215e5..e377adf9ff 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java @@ -46,11 +46,11 @@ import org.thingsboard.server.common.msg.EncryptionUtil; import org.thingsboard.server.dao.entity.CachedVersionedEntityService; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.resource.ImageService; import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.service.Validator; import org.thingsboard.server.dao.service.validator.DeviceProfileDataValidator; +import org.thingsboard.server.exception.DataValidationException; import java.io.ByteArrayInputStream; import java.security.cert.Certificate; diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java index 5af2198911..fc8c7918a6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java @@ -80,7 +80,7 @@ import org.thingsboard.server.dao.event.EventService; import org.thingsboard.server.dao.eventsourcing.ActionEntityEvent; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.service.validator.DeviceDataValidator; diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java index 708876c393..43a5b9d36b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java @@ -66,7 +66,7 @@ import org.thingsboard.server.dao.entity.EntityCountService; import org.thingsboard.server.dao.eventsourcing.ActionEntityEvent; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.service.DataValidator; diff --git a/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java b/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java index 5e0a0df5ad..2a695d5724 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java @@ -44,7 +44,7 @@ import org.thingsboard.server.dao.alarm.AlarmService; import org.thingsboard.server.dao.cf.CalculatedFieldService; import org.thingsboard.server.dao.edge.EdgeService; import org.thingsboard.server.dao.entityview.EntityViewService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.housekeeper.CleanUpService; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.tenant.TbTenantProfileCache; diff --git a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java index e7edc93343..11518aaaae 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java @@ -51,7 +51,7 @@ import org.thingsboard.server.dao.entity.CachedVersionedEntityService; import org.thingsboard.server.dao.eventsourcing.ActionEntityEvent; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.service.validator.EntityViewDataValidator; import org.thingsboard.server.dao.sql.JpaExecutorService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/exception/DeviceCredentialsValidationException.java b/dao/src/main/java/org/thingsboard/server/dao/exception/DeviceCredentialsValidationException.java index b2cd2cc7bf..3dcbfe2806 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/exception/DeviceCredentialsValidationException.java +++ b/dao/src/main/java/org/thingsboard/server/dao/exception/DeviceCredentialsValidationException.java @@ -15,8 +15,12 @@ */ package org.thingsboard.server.dao.exception; +import org.thingsboard.server.exception.DataValidationException; + public class DeviceCredentialsValidationException extends DataValidationException { + public DeviceCredentialsValidationException(String message) { super(message); } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/oauth2/OAuth2ConfigTemplateServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/oauth2/OAuth2ConfigTemplateServiceImpl.java index 21dd339c8a..03cc68876a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/oauth2/OAuth2ConfigTemplateServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/oauth2/OAuth2ConfigTemplateServiceImpl.java @@ -23,7 +23,7 @@ import org.thingsboard.server.common.data.id.OAuth2ClientRegistrationTemplateId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.oauth2.OAuth2ClientRegistrationTemplate; import org.thingsboard.server.dao.entity.AbstractEntityService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import java.util.List; diff --git a/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java b/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java index 16894fe56c..e20b6b872f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java @@ -41,7 +41,7 @@ import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.dao.entity.AbstractCachedEntityService; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.PaginatedRemover; diff --git a/dao/src/main/java/org/thingsboard/server/dao/queue/BaseQueueService.java b/dao/src/main/java/org/thingsboard/server/dao/queue/BaseQueueService.java index 248326a722..991193aa78 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/queue/BaseQueueService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/queue/BaseQueueService.java @@ -34,7 +34,7 @@ import org.thingsboard.server.common.data.queue.Queue; import org.thingsboard.server.dao.entity.AbstractEntityService; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.service.Validator; diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java index 90dd63f7da..9e212c6d96 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java @@ -52,7 +52,7 @@ import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; import org.thingsboard.server.dao.entity.EntityService; import org.thingsboard.server.dao.eventsourcing.RelationActionEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.ConstraintValidator; import org.thingsboard.server.dao.sql.JpaExecutorService; import org.thingsboard.server.dao.sql.relation.JpaRelationQueryExecutorService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java b/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java index 2177d493e3..b18580544a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java @@ -58,7 +58,7 @@ import org.thingsboard.server.dao.dashboard.DashboardInfoDao; import org.thingsboard.server.dao.entity.AbstractCachedEntityService; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.rule.RuleChainDao; import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.service.Validator; diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java index ea93df5665..d225be8015 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java @@ -63,11 +63,11 @@ import org.thingsboard.server.dao.entity.EntityCountService; import org.thingsboard.server.dao.eventsourcing.ActionEntityEvent; import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.service.Validator; import org.thingsboard.server.dao.service.validator.RuleChainDataValidator; +import org.thingsboard.server.exception.DataValidationException; import java.util.ArrayList; import java.util.Collection; diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleNodeStateService.java b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleNodeStateService.java index e534596e34..2d7b70a39f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleNodeStateService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleNodeStateService.java @@ -26,7 +26,7 @@ import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.rule.RuleNodeState; import org.thingsboard.server.dao.entity.AbstractEntityService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; @Service @Slf4j diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/ConstraintValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/ConstraintValidator.java index 0fd55bb494..e354638b0d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/ConstraintValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/ConstraintValidator.java @@ -35,7 +35,7 @@ import org.thingsboard.server.common.data.validation.NoNullChar; import org.thingsboard.server.common.data.validation.NoXss; import org.thingsboard.server.common.data.validation.RateLimit; import org.thingsboard.server.common.data.validation.ValidJsonSchema; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import java.util.Collection; import java.util.Set; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java index 89ab237ed3..4376aa5c64 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java @@ -16,6 +16,8 @@ package org.thingsboard.server.dao.service; import com.fasterxml.jackson.databind.JsonNode; +import org.thingsboard.server.exception.DataValidationException; +import org.thingsboard.server.exception.EntitiesLimitExceededException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -27,8 +29,6 @@ import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.TenantEntityWithDataDao; -import org.thingsboard.server.dao.exception.DataValidationException; -import org.thingsboard.server.dao.exception.EntitiesLimitExceededException; import org.thingsboard.server.dao.usagerecord.ApiLimitService; import java.util.HashSet; @@ -51,7 +51,8 @@ public abstract class DataValidator> { private static final String NAME = "name"; private static final String TOPIC = "topic"; - @Autowired @Lazy + @Autowired + @Lazy private ApiLimitService apiLimitService; // Returns old instance of the same object that is fetched during validation. diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AbstractHasOtaPackageValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AbstractHasOtaPackageValidator.java index eb5fa340e0..5e7382c0ce 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AbstractHasOtaPackageValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AbstractHasOtaPackageValidator.java @@ -23,7 +23,7 @@ import org.thingsboard.server.common.data.OtaPackage; import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.ota.OtaPackageType; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.ota.OtaPackageService; import org.thingsboard.server.dao.service.DataValidator; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidator.java index 779c52c222..5b158dd998 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidator.java @@ -19,7 +19,7 @@ import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.settings.AdminSettingsService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AiModelDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AiModelDataValidator.java index fdccf2955f..8a4680b70d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AiModelDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AiModelDataValidator.java @@ -20,7 +20,7 @@ import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.ai.AiModel; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.ai.AiModelDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.tenant.TenantService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmCommentDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmCommentDataValidator.java index e8192cb7b4..084b672efa 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmCommentDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmCommentDataValidator.java @@ -19,7 +19,7 @@ import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.alarm.AlarmComment; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; @Component diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmDataValidator.java index b6d6ba2537..1e37ed4b2f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmDataValidator.java @@ -19,7 +19,7 @@ import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.tenant.TenantService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ApiKeyDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ApiKeyDataValidator.java index e539c1e721..7b2ebe9d40 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ApiKeyDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ApiKeyDataValidator.java @@ -19,7 +19,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.pat.ApiKey; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.pat.ApiKeyDao; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.tenant.TenantService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ApiUsageDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ApiUsageDataValidator.java index 1e03f5793c..30161fe978 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ApiUsageDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ApiUsageDataValidator.java @@ -21,7 +21,7 @@ import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.ApiUsageState; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.tenant.TenantService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java index 8f3fe62d03..71d1b2d960 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java @@ -25,7 +25,7 @@ import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.asset.AssetDao; import org.thingsboard.server.dao.customer.CustomerDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.tenant.TenantService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidator.java index 83211a3b86..a7eece823a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidator.java @@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.dao.asset.AssetProfileDao; import org.thingsboard.server.dao.asset.AssetProfileService; import org.thingsboard.server.dao.dashboard.DashboardService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.queue.QueueService; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.service.DataValidator; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AuditLogDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AuditLogDataValidator.java index 14cc77f7a1..f98e38f967 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AuditLogDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AuditLogDataValidator.java @@ -18,7 +18,7 @@ package org.thingsboard.server.dao.service.validator; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.audit.AuditLog; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; @Component diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidator.java index 761a99c621..e3d4c9bb90 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidator.java @@ -23,9 +23,9 @@ import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.OtaPackageInfo; import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.dao.device.DeviceProfileDao; -import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.tenant.TenantService; +import org.thingsboard.server.exception.DataValidationException; import java.util.Objects; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/CalculatedFieldDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/CalculatedFieldDataValidator.java index 6c333f36ad..7926d8c8ab 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/CalculatedFieldDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/CalculatedFieldDataValidator.java @@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.cf.configuration.aggregation.single.En import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; import org.thingsboard.server.dao.cf.CalculatedFieldDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.usagerecord.ApiLimitService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ClientRegistrationTemplateDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ClientRegistrationTemplateDataValidator.java index 830c602ccb..1701f064dc 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ClientRegistrationTemplateDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ClientRegistrationTemplateDataValidator.java @@ -19,7 +19,7 @@ import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.oauth2.OAuth2ClientRegistrationTemplate; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; @Component diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidator.java index f834f6bce5..8275a7e4b6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidator.java @@ -19,7 +19,7 @@ import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.plugin.ComponentDescriptor; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; @Component diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/CustomerDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/CustomerDataValidator.java index c6e547adbf..ba80bda39f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/CustomerDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/CustomerDataValidator.java @@ -23,7 +23,7 @@ import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.customer.CustomerDao; import org.thingsboard.server.dao.customer.CustomerServiceImpl; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.tenant.TenantService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DashboardDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DashboardDataValidator.java index aa205e9646..22f27cd260 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DashboardDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DashboardDataValidator.java @@ -20,7 +20,7 @@ import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.tenant.TenantService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java index d61f9d455d..de1646e44b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java @@ -25,7 +25,7 @@ import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.customer.CustomerDao; import org.thingsboard.server.dao.device.DeviceDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.tenant.TenantService; import java.util.Optional; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java index 401b199598..9fac76704c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java @@ -52,11 +52,11 @@ import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.dao.device.DeviceDao; import org.thingsboard.server.dao.device.DeviceProfileDao; import org.thingsboard.server.dao.device.DeviceProfileService; -import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DeviceCredentialsValidationException; import org.thingsboard.server.dao.queue.QueueService; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.tenant.TenantService; +import org.thingsboard.server.exception.DataValidationException; import java.io.FileInputStream; import java.security.KeyStore; @@ -341,7 +341,7 @@ public class DeviceProfileDataValidator extends AbstractHasOtaPackageValidator end - start); } -} \ No newline at end of file +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/CustomerServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/CustomerServiceTest.java index e69685f429..b2432ccc7c 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/CustomerServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/CustomerServiceTest.java @@ -44,7 +44,7 @@ import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.dao.asset.AssetService; import org.thingsboard.server.dao.cf.CalculatedFieldService; import org.thingsboard.server.dao.customer.CustomerService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import java.util.ArrayList; import java.util.List; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DashboardServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DashboardServiceTest.java index 6c81d31e57..333e3ce4ff 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DashboardServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DashboardServiceTest.java @@ -35,7 +35,7 @@ import org.thingsboard.server.common.data.page.SortOrder; import org.thingsboard.server.dao.customer.CustomerService; import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.dao.edge.EdgeService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import java.io.IOException; import java.util.ArrayList; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java index c8ad03f79c..a59d5dc43f 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java @@ -20,7 +20,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.spy; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsServiceTest.java index d5c969b6f3..641b8465fd 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsServiceTest.java @@ -31,7 +31,7 @@ import org.thingsboard.server.common.data.security.DeviceCredentialsType; import org.thingsboard.server.dao.device.DeviceCredentialsService; import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.eventsourcing.ActionEntityEvent; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; @DaoSqlTest public class DeviceCredentialsServiceTest extends AbstractServiceTest { diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceProfileServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceProfileServiceTest.java index c89902befd..cce711e061 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceProfileServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceProfileServiceTest.java @@ -36,7 +36,7 @@ import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.dao.device.DeviceProfileService; import org.thingsboard.server.dao.device.DeviceService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.ota.OtaPackageService; import java.nio.ByteBuffer; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceTest.java index 5157bb1b63..ed791ec27e 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceTest.java @@ -68,7 +68,7 @@ import org.thingsboard.server.dao.customer.CustomerService; import org.thingsboard.server.dao.device.DeviceCredentialsService; import org.thingsboard.server.dao.device.DeviceProfileService; import org.thingsboard.server.dao.device.DeviceService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.exception.DeviceCredentialsValidationException; import org.thingsboard.server.dao.ota.OtaPackageService; import org.thingsboard.server.dao.service.validator.DeviceCredentialsDataValidator; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/EdgeServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/EdgeServiceTest.java index 32d0c2cb84..8f4977ad8c 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/EdgeServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/EdgeServiceTest.java @@ -40,7 +40,7 @@ import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; import org.thingsboard.server.dao.customer.CustomerService; import org.thingsboard.server.dao.edge.EdgeService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.tenant.TbTenantProfileCache; import org.thingsboard.server.dao.tenant.TenantProfileService; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/OAuth2ConfigTemplateServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/OAuth2ConfigTemplateServiceTest.java index 460a1424fc..0451b740aa 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/OAuth2ConfigTemplateServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/OAuth2ConfigTemplateServiceTest.java @@ -26,7 +26,7 @@ import org.thingsboard.server.common.data.oauth2.MapperType; import org.thingsboard.server.common.data.oauth2.OAuth2BasicMapperConfig; import org.thingsboard.server.common.data.oauth2.OAuth2ClientRegistrationTemplate; import org.thingsboard.server.common.data.oauth2.OAuth2MapperConfig; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.oauth2.OAuth2ConfigTemplateService; import java.util.Arrays; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/OtaPackageServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/OtaPackageServiceTest.java index 70f2ff119d..48a8792452 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/OtaPackageServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/OtaPackageServiceTest.java @@ -36,7 +36,7 @@ import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; import org.thingsboard.server.dao.device.DeviceProfileService; import org.thingsboard.server.dao.device.DeviceService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.ota.OtaPackageService; import org.thingsboard.server.dao.tenant.TenantProfileService; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/QueueServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/QueueServiceTest.java index 3a92a817f7..a65b36a657 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/QueueServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/QueueServiceTest.java @@ -35,7 +35,7 @@ import org.thingsboard.server.common.data.queue.SubmitStrategy; import org.thingsboard.server.common.data.queue.SubmitStrategyType; import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; import org.thingsboard.server.common.data.tenant.profile.TenantProfileQueueConfiguration; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.queue.QueueService; import org.thingsboard.server.dao.tenant.TenantProfileService; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/QueueStatsServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/QueueStatsServiceTest.java index 685efbe2f6..9886841c69 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/QueueStatsServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/QueueStatsServiceTest.java @@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.queue.QueueStats; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.queue.QueueStatsService; import static org.assertj.core.api.Assertions.assertThat; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/RelationServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/RelationServiceTest.java index e3827d6a6e..a0f27be4e2 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/RelationServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/RelationServiceTest.java @@ -35,7 +35,7 @@ import org.thingsboard.server.common.data.relation.RelationEntityTypeFilter; import org.thingsboard.server.common.data.relation.RelationPathLevel; import org.thingsboard.server.common.data.relation.RelationTypeGroup; import org.thingsboard.server.common.data.relation.RelationsSearchParameters; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.tenant.TbTenantProfileCache; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/RuleChainServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/RuleChainServiceTest.java index 11fa38dc19..fc26ab96cc 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/RuleChainServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/RuleChainServiceTest.java @@ -34,7 +34,7 @@ import org.thingsboard.server.common.data.rule.RuleChainMetaData; import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.dao.edge.EdgeService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.rule.RuleChainService; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/TenantProfileServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/TenantProfileServiceTest.java index 5887f6868e..51a2f6a09d 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/TenantProfileServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/TenantProfileServiceTest.java @@ -38,7 +38,7 @@ import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileCon import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; import org.thingsboard.server.common.data.tenant.profile.TenantProfileQueueConfiguration; import org.thingsboard.server.common.util.ProtoUtils; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.tenant.TenantProfileService; import org.thingsboard.server.gen.transport.TransportProtos; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/TenantServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/TenantServiceTest.java index def4644b91..cb337d9c62 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/TenantServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/TenantServiceTest.java @@ -62,7 +62,7 @@ import org.thingsboard.server.dao.device.DeviceProfileService; import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.edge.EdgeService; import org.thingsboard.server.dao.entityview.EntityViewService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.ota.OtaPackageService; import org.thingsboard.server.dao.resource.ResourceService; import org.thingsboard.server.dao.rpc.RpcService; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/UserServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/UserServiceTest.java index ad87e73f79..25d01c40ad 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/UserServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/UserServiceTest.java @@ -33,7 +33,7 @@ import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.common.data.settings.UserSettings; import org.thingsboard.server.dao.customer.CustomerService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.user.UserService; import java.util.ArrayList; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/WidgetTypeServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/WidgetTypeServiceTest.java index 0e6c7beadb..aef0a17a38 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/WidgetTypeServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/WidgetTypeServiceTest.java @@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.id.WidgetTypeId; import org.thingsboard.server.common.data.widget.WidgetType; import org.thingsboard.server.common.data.widget.WidgetTypeDetails; import org.thingsboard.server.common.data.widget.WidgetsBundle; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.widget.WidgetTypeService; import org.thingsboard.server.dao.widget.WidgetsBundleService; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/WidgetsBundleServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/WidgetsBundleServiceTest.java index 0165d3d164..eff2a15f9c 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/WidgetsBundleServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/WidgetsBundleServiceTest.java @@ -25,7 +25,7 @@ import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.common.data.widget.WidgetsBundleFilter; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.widget.WidgetsBundleService; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetDataValidatorTest.java index 82659ead60..c3db7a251b 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetDataValidatorTest.java @@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.asset.AssetDao; import org.thingsboard.server.dao.customer.CustomerDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.tenant.TenantService; import java.util.UUID; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/CalculatedFieldDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/CalculatedFieldDataValidatorTest.java index 0d52f999de..38f097616d 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/CalculatedFieldDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/CalculatedFieldDataValidatorTest.java @@ -24,7 +24,7 @@ import org.thingsboard.server.common.data.cf.CalculatedFieldType; import org.thingsboard.server.common.data.id.CalculatedFieldId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.cf.CalculatedFieldDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.usagerecord.DefaultApiLimitService; import java.util.UUID; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java index 687c3e67ac..12b2e26746 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java @@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.customer.CustomerDao; import org.thingsboard.server.dao.device.DeviceDao; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.tenant.TenantService; import java.util.UUID; diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractCustomerActionNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractCustomerActionNode.java index ad9ce41ea3..c6e67bd65c 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractCustomerActionNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractCustomerActionNode.java @@ -31,7 +31,7 @@ import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.util.TbPair; import org.thingsboard.server.common.msg.TbMsg; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import java.util.EnumSet; import java.util.NoSuchElementException; diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractRelationActionNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractRelationActionNode.java index 83b777d153..17ab7e4022 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractRelationActionNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractRelationActionNode.java @@ -35,7 +35,7 @@ import org.thingsboard.server.common.data.relation.EntitySearchDirection; import org.thingsboard.server.common.data.relation.RelationTypeGroup; import org.thingsboard.server.common.data.util.TbPair; import org.thingsboard.server.common.msg.TbMsg; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import java.util.EnumSet; import java.util.NoSuchElementException; diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/TbAiNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/TbAiNode.java index a9ebb7ecb7..4908ca942a 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/TbAiNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/TbAiNode.java @@ -54,7 +54,7 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.plugin.ComponentType; import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.msg.TbMsg; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.resource.TbResourceDataCache; import java.nio.charset.StandardCharsets; diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/aws/lambda/TbAwsLambdaNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/aws/lambda/TbAwsLambdaNode.java index c4e448e2ee..e5bdf734bd 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/aws/lambda/TbAwsLambdaNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/aws/lambda/TbAwsLambdaNode.java @@ -35,7 +35,7 @@ import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.plugin.ComponentType; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgMetaData; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import java.nio.ByteBuffer; import java.util.concurrent.TimeUnit; diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/ai/TbAiNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/ai/TbAiNodeTest.java index a786cdd536..cadaacda68 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/ai/TbAiNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/ai/TbAiNodeTest.java @@ -67,7 +67,7 @@ import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.dao.ai.AiModelService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.resource.ResourceService; import org.thingsboard.server.dao.resource.TbResourceDataCache; diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNodeTest.java index 941dfb92d7..194d498d9a 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNodeTest.java @@ -46,7 +46,7 @@ import org.thingsboard.server.common.data.msg.TbMsgType; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.dao.attributes.AttributesService; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.ConstraintValidator; import java.util.List; diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNodeTest.java index 1141ff09d1..4af1234ded 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNodeTest.java @@ -49,7 +49,7 @@ import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileCon import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgMetaData; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.service.ConstraintValidator; import java.util.ArrayList; From 872fc0803f997e43cd3208bc011839ffe55d6d35 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Tue, 16 Dec 2025 10:54:44 +0200 Subject: [PATCH 024/579] Enhance calculated fields filter API --- .../controller/CalculatedFieldController.java | 22 ++++++++++++------- .../server/controller/AbstractWebTest.java | 3 ++- .../CalculatedFieldControllerTest.java | 2 ++ .../common/data/cf/CalculatedFieldFilter.java | 7 +++--- .../dao/sql/cf/CalculatedFieldRepository.java | 9 ++++---- .../dao/sql/cf/JpaCalculatedFieldDao.java | 3 ++- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/CalculatedFieldController.java b/application/src/main/java/org/thingsboard/server/controller/CalculatedFieldController.java index 1c6b23084e..0935f47379 100644 --- a/application/src/main/java/org/thingsboard/server/controller/CalculatedFieldController.java +++ b/application/src/main/java/org/thingsboard/server/controller/CalculatedFieldController.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.http.HttpStatus; @@ -68,7 +69,7 @@ import org.thingsboard.server.service.security.permission.Operation; import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; -import java.util.List; +import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -198,12 +199,12 @@ public class CalculatedFieldController extends BaseController { @RequestParam int pageSize, @Parameter(description = PAGE_NUMBER_DESCRIPTION, required = true) @RequestParam int page, - @Parameter(description = "Calculated field type filter.") - @RequestParam CalculatedFieldType type, + @Parameter(description = "Calculated field types filter.") + @RequestParam(required = false) Set types, @Parameter(description = "Entity type filter. If not specified, calculated fields for all supported entity types will be returned.") @RequestParam(required = false) EntityType entityType, @Parameter(description = "Entities filter. If not specified, calculated fields for entity type filter will be returned.") - @RequestParam(required = false) List entities, + @RequestParam(required = false) Set entities, @Parameter(description = "Name filter. To specify multiple names, duplicate 'name' parameter for each name, for example '?name=name1&name=name2") @RequestParam(required = false) String name, // for Swagger only, retrieved from MultiValueMap params (due to issues when name contains comma) @Parameter(description = CF_TEXT_SEARCH_DESCRIPTION) @@ -215,6 +216,12 @@ public class CalculatedFieldController extends BaseController { @RequestParam MultiValueMap params) throws ThingsboardException { PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); SecurityUser user = getCurrentUser(); + + if (CollectionUtils.isEmpty(types)) { + types = EnumSet.allOf(CalculatedFieldType.class); + types.remove(CalculatedFieldType.ALARM); + } + Set entityTypes; if (entityType == null) { entityTypes = CalculatedField.SUPPORTED_ENTITIES.keySet(); @@ -223,10 +230,10 @@ public class CalculatedFieldController extends BaseController { } CalculatedFieldFilter filter = CalculatedFieldFilter.builder() - .type(type) + .types(types) .entityTypes(entityTypes) .entityIds(entities) - .names(params.get("name")) + .names(Optional.ofNullable(params.get("name")).map(HashSet::new).orElse(null)) .build(); return calculatedFieldService.findCalculatedFieldsByTenantIdAndFilter(user.getTenantId(), filter, pageLink); } @@ -361,8 +368,7 @@ public class CalculatedFieldController extends BaseController { return; } case CUSTOMER, ASSET, DEVICE -> checkEntityId(referencedEntityId, Operation.READ); - default -> - throw new IllegalArgumentException("Calculated fields do not support '" + entityType + "' for referenced entities."); + default -> throw new IllegalArgumentException("Calculated fields do not support '" + entityType + "' for referenced entities."); } } } diff --git a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java index 80e79280df..017afe9709 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java @@ -1441,7 +1441,8 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest { EntityType entityType, List entities, List names) throws Exception { - return doGetTypedWithPageLink("/api/calculatedFields?type=" + type + "&" + + return doGetTypedWithPageLink("/api/calculatedFields?" + + (type != null ? "types=" + type + "&" : "") + (entityType != null ? "entityType=" + entityType + "&" : "") + (entities != null ? "entities=" + String.join(",", entities.stream().map(UUID::toString).toList()) + "&" : "") + diff --git a/application/src/test/java/org/thingsboard/server/controller/CalculatedFieldControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/CalculatedFieldControllerTest.java index 33f6bfa250..cc9098d492 100644 --- a/application/src/test/java/org/thingsboard/server/controller/CalculatedFieldControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/CalculatedFieldControllerTest.java @@ -259,6 +259,8 @@ public class CalculatedFieldControllerTest extends AbstractControllerTest { List allCalculatedFields = getCalculatedFields(CalculatedFieldType.SIMPLE, null, null, null); assertThat(allCalculatedFields).contains(deviceCalculatedField, profileCalculatedField); + allCalculatedFields = getCalculatedFields(null, null, null, null); + assertThat(allCalculatedFields).contains(deviceCalculatedField, profileCalculatedField); List profileLevelCalculatedFields = getCalculatedFields(CalculatedFieldType.SIMPLE, EntityType.DEVICE_PROFILE, null, null); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldFilter.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldFilter.java index 40283cbaa3..babe2b58ad 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldFilter.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldFilter.java @@ -21,7 +21,6 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.thingsboard.server.common.data.EntityType; -import java.util.List; import java.util.Set; import java.util.UUID; @@ -30,12 +29,12 @@ import java.util.UUID; public class CalculatedFieldFilter { @NonNull - private final CalculatedFieldType type; + private final Set types; @NonNull private final Set entityTypes; @Nullable - private final List entityIds; + private final Set entityIds; @Nullable - private final List names; + private final Set names; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/cf/CalculatedFieldRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/cf/CalculatedFieldRepository.java index d7bcbd0568..6f3ca515a3 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/cf/CalculatedFieldRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/cf/CalculatedFieldRepository.java @@ -23,6 +23,7 @@ import org.thingsboard.server.common.data.id.CalculatedFieldId; import org.thingsboard.server.dao.model.sql.CalculatedFieldEntity; import java.util.List; +import java.util.Set; import java.util.UUID; public interface CalculatedFieldRepository extends JpaRepository { @@ -43,18 +44,18 @@ public interface CalculatedFieldRepository extends JpaRepository findByTenantIdAndEntityIdAndTypes(UUID tenantId, UUID entityId, List types, String textSearch, Pageable pageable); @Query("SELECT cf FROM CalculatedFieldEntity cf WHERE cf.tenantId = :tenantId " + - "AND cf.type = :type " + + "AND cf.type IN :types " + "AND cf.entityType IN :entityTypes " + "AND (:entityIds IS NULL OR cf.entityId IN :entityIds) " + "AND (:names IS NULL OR cf.name IN :names) " + "AND (:textSearch IS NULL OR ilike(cf.name, CONCAT('%', :textSearch, '%')) = true)") - Page findByTenantIdAndFilter(UUID tenantId, String type, List entityTypes, - List entityIds, List names, String textSearch, Pageable pageable); + Page findByTenantIdAndFilter(UUID tenantId, List types, List entityTypes, + Set entityIds, Set names, String textSearch, Pageable pageable); @Query("SELECT DISTINCT cf.name FROM CalculatedFieldEntity cf " + "WHERE cf.tenantId = :tenantId AND cf.type = :type AND " + "(:textSearch IS NULL OR ilike(cf.name, CONCAT('%', :textSearch, '%')) = true)") - Page findNamesByTenantIdAndType(UUID tenantId, String type,String textSearch, Pageable pageable); + Page findNamesByTenantIdAndType(UUID tenantId, String type, String textSearch, Pageable pageable); List findAllByTenantId(UUID tenantId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/cf/JpaCalculatedFieldDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/cf/JpaCalculatedFieldDao.java index 94aa11a920..5093c51ba7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/cf/JpaCalculatedFieldDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/cf/JpaCalculatedFieldDao.java @@ -107,7 +107,8 @@ public class JpaCalculatedFieldDao extends JpaAbstractDao findByTenantIdAndFilter(TenantId tenantId, CalculatedFieldFilter filter, PageLink pageLink) { - return DaoUtil.toPageData(calculatedFieldRepository.findByTenantIdAndFilter(tenantId.getId(), filter.getType().name(), + return DaoUtil.toPageData(calculatedFieldRepository.findByTenantIdAndFilter(tenantId.getId(), + filter.getTypes().stream().map(Enum::name).toList(), filter.getEntityTypes().stream().map(Enum::name).toList(), CollectionUtils.isNotEmpty(filter.getEntityIds()) ? filter.getEntityIds() : null, CollectionUtils.isNotEmpty(filter.getNames()) ? filter.getNames() : null, From a3d6ecad44d19dbb6258e8561d924ed67b7992df Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 16 Dec 2025 11:43:12 +0200 Subject: [PATCH 025/579] Improved stability of edge test --- .../service/edge/rpc/EdgeSyncCursor.java | 1 + .../server/edge/AbstractEdgeTest.java | 25 +++++++++++++++++++ .../server/edge/DeviceEdgeTest.java | 13 +--------- .../server/edge/DeviceProfileEdgeTest.java | 12 ++++++--- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeSyncCursor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeSyncCursor.java index a8960abf0b..31f80b6c96 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeSyncCursor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeSyncCursor.java @@ -92,6 +92,7 @@ public class EdgeSyncCursor { fetchers.add(new NotificationTargetEdgeEventFetcher(ctx.getNotificationTargetService())); fetchers.add(new NotificationRuleEdgeEventFetcher(ctx.getNotificationRuleService())); fetchers.add(new OtaPackagesEdgeEventFetcher(ctx.getOtaPackageService())); + // sync device profiles twice to update software and hardware fields fetchers.add(new DeviceProfilesEdgeEventFetcher(ctx.getDeviceProfileService())); fetchers.add(new TenantResourcesEdgeEventFetcher(ctx.getResourceService())); } diff --git a/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java index 84d879c993..ef11a4dcf8 100644 --- a/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java @@ -22,6 +22,7 @@ import com.google.protobuf.AbstractMessage; import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.MessageLite; import lombok.extern.slf4j.Slf4j; +import org.awaitility.Awaitility; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -102,6 +103,7 @@ import org.thingsboard.server.gen.edge.v1.UserUpdateMsg; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.TreeMap; import java.util.UUID; @@ -738,4 +740,27 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest { return rpc; } + protected void verifyEdgeDisconnected() { + verifyEdgeActiveFlag(false); + } + + protected void verifyEdgeConnected() { + verifyEdgeActiveFlag(true); + } + + private void verifyEdgeActiveFlag(boolean value) { + Awaitility.await() + .atMost(TIMEOUT, TimeUnit.SECONDS) + .until(() -> { + List> values = doGetAsyncTyped("/api/plugins/telemetry/EDGE/" + edge.getId() + + "/values/attributes/SERVER_SCOPE", new TypeReference<>() {}); + Optional> activeAttrOpt = values.stream().filter(att -> att.get("key").equals("active")).findFirst(); + if (activeAttrOpt.isEmpty()) { + return false; + } + Map activeAttr = activeAttrOpt.get(); + return Boolean.toString(value).equals(activeAttr.get("value").toString()); + }); + } + } diff --git a/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java index 8d79416022..380dec8015 100644 --- a/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java @@ -893,18 +893,7 @@ public class DeviceEdgeTest extends AbstractEdgeTest { ObjectNode attributes = JacksonUtil.newObjectNode(); attributes.put("active", true); doPost("/api/plugins/telemetry/EDGE/" + edge.getId() + "/attributes/" + DataConstants.SERVER_SCOPE, attributes); - Awaitility.await() - .atMost(TIMEOUT, TimeUnit.SECONDS) - .until(() -> { - List> values = doGetAsyncTyped("/api/plugins/telemetry/EDGE/" + edge.getId() + - "/values/attributes/SERVER_SCOPE", new TypeReference<>() {}); - Optional> activeAttrOpt = values.stream().filter(att -> att.get("key").equals("active")).findFirst(); - if (activeAttrOpt.isEmpty()) { - return false; - } - Map activeAttr = activeAttrOpt.get(); - return "true".equals(activeAttr.get("value").toString()); - }); + verifyEdgeConnected(); } } diff --git a/application/src/test/java/org/thingsboard/server/edge/DeviceProfileEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/DeviceProfileEdgeTest.java index a29d7a4672..cbac977835 100644 --- a/application/src/test/java/org/thingsboard/server/edge/DeviceProfileEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/DeviceProfileEdgeTest.java @@ -151,14 +151,20 @@ public class DeviceProfileEdgeTest extends AbstractEdgeTest { // delete profile when edge is offline edgeImitator.disconnect(); + verifyEdgeDisconnected(); + doDelete("/api/deviceProfile/" + deviceProfile.getUuidId()) .andExpect(status().isOk()); - edgeImitator.connect(); // 25 sync message - // + 2 RuleChain and RuleChainMetadata - // + 1 delete DeviceProfile + // + 1 RuleChain Added + // + 1 RuleChainMetadata Added + // + 1 DeviceProfile Delete edgeImitator.expectMessageAmount(SYNC_MESSAGE_COUNT + 3); + + edgeImitator.connect(); + verifyEdgeConnected(); + Assert.assertTrue(edgeImitator.waitForMessages()); latestMessage = edgeImitator.getLatestMessage(); From eb86dc91514d5effc67a076b590eb19a7b986a9d Mon Sep 17 00:00:00 2001 From: Nikita Mazurenko Date: Tue, 16 Dec 2025 15:51:36 +0200 Subject: [PATCH 026/579] Fix events from different edges being mixed together in one queue --- .../thingsboard/server/service/edge/rpc/EdgeGrpcSession.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java index 521730741f..c7c27ae4d0 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java @@ -113,7 +113,7 @@ public abstract class EdgeGrpcSession implements Closeable { private static final int MAX_DOWNLINK_ATTEMPTS = 3; private static final String RATE_LIMIT_REACHED = "Rate limit reached"; - protected static final ConcurrentLinkedQueue highPriorityQueue = new ConcurrentLinkedQueue<>(); + protected final ConcurrentLinkedQueue highPriorityQueue = new ConcurrentLinkedQueue<>(); protected UUID sessionId; private BiConsumer sessionOpenListener; From 831e95b313844583a3dfdf8d75d44b2f9c5d6447 Mon Sep 17 00:00:00 2001 From: Maksym Tsymbarov Date: Tue, 16 Dec 2025 16:08:05 +0200 Subject: [PATCH 027/579] Fixed button changing after dialog closing --- .../lwm2m/lwm2m-bootstrap-config-servers.component.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-config-servers.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-config-servers.component.ts index 86f01e4cd8..f988d7e6aa 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-config-servers.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-config-servers.component.ts @@ -30,7 +30,7 @@ import { TranslateService } from '@ngx-translate/core'; import { DialogService } from '@core/services/dialog.service'; import { MatDialog } from '@angular/material/dialog'; import { Lwm2mBootstrapAddConfigServerDialogComponent } from '@home/components/profile/device/lwm2m/lwm2m-bootstrap-add-config-server-dialog.component'; -import { mergeMap, takeUntil } from 'rxjs/operators'; +import { filter, mergeMap, takeUntil } from 'rxjs/operators'; import { DeviceProfileService } from '@core/http/device-profile.service'; import { Lwm2mSecurityType } from '@shared/models/lwm2m-security-config.models'; @@ -164,10 +164,8 @@ export class Lwm2mBootstrapConfigServersComponent implements OnInit, ControlValu panelClass: ['tb-dialog', 'tb-fullscreen-dialog'] }).afterClosed(); const addServerConfigObs = addDialogObs.pipe( + filter((isBootstrap) => isBootstrap !== null), mergeMap((isBootstrap) => { - if (isBootstrap === null) { - return of(null); - } return this.deviceProfileService.getLwm2mBootstrapSecurityInfoBySecurityType(isBootstrap, Lwm2mSecurityType.NO_SEC); }) ); From 6627bd9c0630e4bf75bf85539854de56f6a89275 Mon Sep 17 00:00:00 2001 From: Maksym Tsymbarov Date: Tue, 16 Dec 2025 16:51:57 +0200 Subject: [PATCH 028/579] Fixed mutation in ignore Array Merge Function --- ui-ngx/src/app/core/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/core/utils.ts b/ui-ngx/src/app/core/utils.ts index e0fadd768a..5bdb6a48dd 100644 --- a/ui-ngx/src/app/core/utils.ts +++ b/ui-ngx/src/app/core/utils.ts @@ -403,7 +403,7 @@ export function mergeDeep(target: T, ...sources: T[]): T { function ignoreArrayMergeFunc(target: any, sources: any) { if (_.isArray(target)) { - return sources; + return deepClone(sources); } } From 9f48f8cce2c19541b2b6eefb0b44d61959c57e32 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Tue, 16 Dec 2025 17:09:08 +0200 Subject: [PATCH 029/579] UI: Add calculated fields page --- ui-ngx/src/app/core/services/menu.models.ts | 12 + .../alarm-rule-dialog.component.html | 4 +- .../alarm-rules/alarm-rules-table-config.ts | 4 +- .../alarm-rules-table.component.ts | 2 +- .../calculated-field.module.ts | 8 + .../calculated-fields-table-config.ts | 31 +- .../calculated-fields-table.component.html | 2 +- .../calculated-fields-table.component.scss | 6 +- .../calculated-fields-table.component.ts | 12 +- .../calculated-field-dialog.component.html | 49 ++- .../calculated-field-dialog.component.ts | 49 ++- ...ulated-fields-filter-config.component.html | 107 +++++++ ...ulated-fields-filter-config.component.scss | 56 ++++ ...lculated-fields-filter-config.component.ts | 288 ++++++++++++++++++ .../calculated-fields-header.component.html | 20 ++ .../calculated-fields-header.component.scss | 21 ++ .../calculated-fields-header.component.ts | 43 +++ .../home/pages/alarm/alarm-routing.module.ts | 15 +- .../calculated-fields-routing.module.ts | 43 +++ .../calculated-fields.module.ts | 34 +++ .../modules/home/pages/home-pages.module.ts | 2 + .../shared/models/calculated-field.models.ts | 8 +- .../assets/locale/locale.constant-en_US.json | 5 + 23 files changed, 770 insertions(+), 51 deletions(-) create mode 100644 ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.html create mode 100644 ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.scss create mode 100644 ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.ts create mode 100644 ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-header.component.html create mode 100644 ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-header.component.scss create mode 100644 ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-header.component.ts create mode 100644 ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-routing.module.ts create mode 100644 ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields.module.ts diff --git a/ui-ngx/src/app/core/services/menu.models.ts b/ui-ngx/src/app/core/services/menu.models.ts index 555717ffc0..a97acf344e 100644 --- a/ui-ngx/src/app/core/services/menu.models.ts +++ b/ui-ngx/src/app/core/services/menu.models.ts @@ -98,6 +98,7 @@ export enum MenuId { device_profiles = 'device_profiles', asset_profiles = 'asset_profiles', customers = 'customers', + calculated_fields = 'calculated_fields', rule_chains = 'rule_chains', edge_management = 'edge_management', edges = 'edges', @@ -626,6 +627,16 @@ export const menuSectionMap = new Map([ icon: 'supervisor_account' } ], + [ + MenuId.calculated_fields, + { + id: MenuId.calculated_fields, + name: 'entity.type-calculated-fields', + type: 'link', + path: '/calculatedFields', + icon: 'calculate', + } + ], [ MenuId.rule_chains, { @@ -839,6 +850,7 @@ const defaultUserMenuMap = new Map([ ] }, {id: MenuId.customers}, + {id: MenuId.calculated_fields}, {id: MenuId.rule_chains}, { id: MenuId.edge_management, diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html index 7e706bfca9..52ff7d15cb 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html @@ -56,7 +56,7 @@ /> @if (!data.entityId) { -
+
- alarm-rule.no-clear-alarm-rule + alarm-rule.no-clear-alarm-rule
+ + + +
+ +
+ + + + +
+
+
+ +
+
+
calculated-fields.calculated-field-names
+ + +
+
+
calculated-fields.calculated-field-types
+ + +
+
+
alarm-rule.target-entity-type
+ + + {{ 'alarm-rule.any-type' | translate }} + + {{ entityTypeTranslations.get(type)?.type | translate }} + + + +
+ @if (cfFilterForm.get('entityType').value) { +
+
alarm-rule.target-entities
+ + +
+ } +
+
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.scss b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.scss new file mode 100644 index 0000000000..fc4402c28f --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.scss @@ -0,0 +1,56 @@ +/** + * Copyright © 2016-2025 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 '../scss/constants'; + +:host { + display: flex; + max-width: 100%; + .mdc-button { + max-width: 100%; + } +} + +:host ::ng-deep { + .mdc-button { + .mat-icon { + min-width: 24px; + } + .mdc-button__label { + overflow: hidden; + text-overflow: ellipsis; + } + } +} + +::ng-deep { + .tb-calculated-fields-config-component { + max-width: 100%; + width: 600px; + min-width: 100%; + flex: 1; + + tb-entity-subtype-list { + flex: 1; + @media #{$mat-gt-xs} { + width: 180px; + } + .mdc-evolution-chip-set__chips { + width: 100%; + } + } + } +} diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.ts new file mode 100644 index 0000000000..9aa13e7673 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.ts @@ -0,0 +1,288 @@ +/// +/// Copyright © 2016-2025 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 { + Component, + DestroyRef, + ElementRef, + forwardRef, + Inject, + InjectionToken, + Input, + OnInit, + Optional, + TemplateRef, + ViewChild, + ViewContainerRef +} from '@angular/core'; +import { ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { coerceBoolean } from '@shared/decorators/coercion'; +import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay'; +import { TemplatePortal } from '@angular/cdk/portal'; +import { deepClone, isArraysEqualIgnoreUndefined, isDefinedAndNotNull, isEmpty, isUndefinedOrNull } from '@core/utils'; +import { EntityType, entityTypeTranslations } from '@shared/models/entity-type.models'; +import { fromEvent, Subscription } from 'rxjs'; +import { POSITION_MAP } from '@shared/models/overlay.models'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { + calculatedFieldsEntityTypeList, + CalculatedFieldsQuery, + calculatedFieldTypes, + CalculatedFieldTypeTranslations +} from '@shared/models/calculated-field.models'; +import { StringItemsOption } from '@shared/components/string-items-list.component'; +import { TranslateService } from '@ngx-translate/core'; + +export const CALCULATED_FIELDS_CONFIG_DATA = new InjectionToken('CalculatedFieldsFilterConfigData'); + +export interface CalculatedFieldsFilterConfigData { + panelMode: boolean; + userMode: boolean; + filterConfig: CalculatedFieldsQuery; + initialFilterConfig?: CalculatedFieldsQuery; +} + +@Component({ + selector: 'tb-calculated-fields-filter-config', + templateUrl: './calculated-fields-filter-config.component.html', + styleUrls: ['./calculated-fields-filter-config.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CalculatedFieldsFilterConfigComponent), + multi: true + } + ] +}) +export class CalculatedFieldsFilterConfigComponent implements OnInit, ControlValueAccessor { + + @ViewChild('calculatedFieldsFilterPanel') + calculatedFieldsFilterPanel: TemplateRef; + + @Input() + disabled: boolean; + + @coerceBoolean() + @Input() + buttonMode = true; + + @coerceBoolean() + @Input() + userMode = false; + + @coerceBoolean() + @Input() + propagatedFilter = true; + + @Input() + initialCfFilterConfig: CalculatedFieldsQuery = { + name: [], + types: [], + entityType: null, + entities: [] + }; + + panelMode = false; + + cfFilterForm: FormGroup; + + panelResult: CalculatedFieldsQuery = null; + + entityType = EntityType; + + listEntityTypes = calculatedFieldsEntityTypeList; + entityTypeTranslations = entityTypeTranslations; + + readonly types: StringItemsOption[] = calculatedFieldTypes.map(item => ({ + name: this.translate.instant(CalculatedFieldTypeTranslations.get(item).name), + value: item + })); + + private cfFilterOverlayRef: OverlayRef; + private cfFilterConfig: CalculatedFieldsQuery; + private resizeWindows: Subscription; + + private propagateChange = (_: any) => {}; + + constructor(@Optional() @Inject(CALCULATED_FIELDS_CONFIG_DATA) + private data: CalculatedFieldsFilterConfigData | undefined, + @Optional() private overlayRef: OverlayRef, + private fb: FormBuilder, + private overlay: Overlay, + private nativeElement: ElementRef, + private viewContainerRef: ViewContainerRef, + private destroyRef: DestroyRef, + private translate: TranslateService) { + } + + ngOnInit(): void { + if (this.data) { + this.panelMode = this.data.panelMode; + this.userMode = this.data.userMode; + this.cfFilterConfig = this.data.filterConfig; + this.initialCfFilterConfig = this.data.initialFilterConfig; + if (this.panelMode && !this.initialCfFilterConfig) { + this.initialCfFilterConfig = deepClone(this.cfFilterConfig); + } + } + this.cfFilterForm = this.fb.group({ + name: [null, []], + types: [null, []], + entityType: [null, []], + entities: [null, []] + }); + this.cfFilterForm.valueChanges.pipe( + takeUntilDestroyed(this.destroyRef) + ).subscribe( + () => { + if (!this.buttonMode) { + this.cfConfigUpdated(this.cfFilterForm.value); + } + } + ); + if (this.panelMode) { + this.updateCfConfigForm(this.cfFilterConfig); + } + } + + registerOnChange(fn: any): void { + this.propagateChange = fn; + } + + registerOnTouched(_fn: any): void { + } + + setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; + if (this.disabled) { + this.cfFilterForm.disable({emitEvent: false}); + } else { + this.cfFilterForm.enable({emitEvent: false}); + } + } + + writeValue(cfFilterConfig?: CalculatedFieldsQuery): void { + this.cfFilterConfig = cfFilterConfig; + if (!this.initialCfFilterConfig && cfFilterConfig) { + this.initialCfFilterConfig = deepClone(cfFilterConfig); + } + this.updateCfConfigForm(cfFilterConfig); + } + + toggleCfFilterPanel($event: Event) { + if ($event) { + $event.stopPropagation(); + } + const config = new OverlayConfig({ + panelClass: 'tb-filter-panel', + backdropClass: 'cdk-overlay-transparent-backdrop', + hasBackdrop: true, + maxHeight: '80vh', + height: 'min-content', + minWidth: '' + }); + config.hasBackdrop = true; + config.positionStrategy = this.overlay.position() + .flexibleConnectedTo(this.nativeElement) + .withPositions([POSITION_MAP.bottomLeft]); + + this.cfFilterOverlayRef = this.overlay.create(config); + this.cfFilterOverlayRef.backdropClick().subscribe(() => { + this.cfFilterOverlayRef.dispose(); + }); + this.cfFilterOverlayRef.attach(new TemplatePortal(this.calculatedFieldsFilterPanel, + this.viewContainerRef)); + this.resizeWindows = fromEvent(window, 'resize').subscribe(() => { + this.cfFilterOverlayRef.updatePosition(); + }); + } + + cancel() { + this.updateCfConfigForm(this.cfFilterConfig); + if (this.overlayRef) { + this.overlayRef.dispose(); + } else { + this.resizeWindows.unsubscribe(); + this.cfFilterOverlayRef.dispose(); + } + } + + update() { + this.cfConfigUpdated(this.cfFilterForm.value); + this.cfFilterForm.markAsPristine(); + if (this.panelMode) { + this.panelResult = this.cfFilterConfig; + } + if (this.overlayRef) { + this.overlayRef.dispose(); + } else { + this.resizeWindows.unsubscribe(); + this.cfFilterOverlayRef.dispose(); + } + } + + reset() { + const cfFilterConfig = this.cfFilterFromFormValue(this.cfFilterForm.value); + if (!this.cfFilterConfigEquals(cfFilterConfig, this.initialCfFilterConfig)) { + this.updateCfConfigForm(this.initialCfFilterConfig); + this.cfFilterForm.markAsDirty(); + } + } + + private cfFilterConfigEquals = (filter1?: CalculatedFieldsQuery, filter2?: CalculatedFieldsQuery): boolean => { + if (filter1 === filter2) { + return true; + } + if ((isUndefinedOrNull(filter1) || isEmpty(filter1)) && (isUndefinedOrNull(filter2) || isEmpty(filter2))) { + return true; + } else if (isDefinedAndNotNull(filter1) && isDefinedAndNotNull(filter2)) { + if (!isArraysEqualIgnoreUndefined(filter1.name, filter2.name)) { + return false; + } + if (!isArraysEqualIgnoreUndefined(filter1.types, filter2.types)) { + return false; + } + if (!isArraysEqualIgnoreUndefined(filter1.entities, filter2.entities)) { + return false; + } + return filter1.entityType !== filter2.entityType; + } + return false; + }; + + private updateCfConfigForm(cfFilterConfig?: CalculatedFieldsQuery) { + this.cfFilterForm.patchValue({ + name: cfFilterConfig?.name ?? [], + types: cfFilterConfig?.types ?? [], + entityType: cfFilterConfig?.entityType ?? null, + entities: cfFilterConfig?.entities ?? [], + }, {emitEvent: false}); + } + + private cfConfigUpdated(formValue: any) { + this.cfFilterConfig = this.cfFilterFromFormValue(formValue); + this.propagateChange(this.cfFilterConfig); + } + + private cfFilterFromFormValue(formValue: any): CalculatedFieldsQuery { + return { + name: formValue?.name ?? [], + types: formValue?.types ?? [], + entityType: formValue?.entityType ?? null, + entities: formValue?.entities ?? [], + }; + } +} diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-header.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-header.component.html new file mode 100644 index 0000000000..77a40a5283 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-header.component.html @@ -0,0 +1,20 @@ + + + diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-header.component.scss b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-header.component.scss new file mode 100644 index 0000000000..ee0899b5ca --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-header.component.scss @@ -0,0 +1,21 @@ +/** + * Copyright © 2016-2025 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. + */ + +:host { + padding-right: 8px; + overflow: hidden; + max-width: 100%; +} diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-header.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-header.component.ts new file mode 100644 index 0000000000..f0824347ab --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-header.component.ts @@ -0,0 +1,43 @@ +/// +/// Copyright © 2016-2025 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 { Component } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { EntityTableHeaderComponent } from '@home/components/entity/entity-table-header.component'; +import { CalculatedField, CalculatedFieldsQuery } from "@shared/models/calculated-field.models"; +import { CalculatedFieldsTableConfig } from '@home/components/calculated-fields/calculated-fields-table-config'; + +@Component({ + selector: 'tb-calculated-fields-table-header', + templateUrl: './calculated-fields-header.component.html', + styleUrls: ['./calculated-fields-header.component.scss'] +}) +export class CalculatedFieldsHeaderComponent extends EntityTableHeaderComponent { + + get calculatedFieldsTableConfig(): CalculatedFieldsTableConfig { + return this.entitiesTableConfig as CalculatedFieldsTableConfig; + } + + constructor(protected store: Store) { + super(store); + } + + calculatedFieldsFilterChanged(calculatedFieldFilterConfig: CalculatedFieldsQuery) { + this.calculatedFieldsTableConfig.calculatedFieldFilterConfig = calculatedFieldFilterConfig; + this.calculatedFieldsTableConfig.getTable().resetSortAndFilter(true, true); + } +} diff --git a/ui-ngx/src/app/modules/home/pages/alarm/alarm-routing.module.ts b/ui-ngx/src/app/modules/home/pages/alarm/alarm-routing.module.ts index 53a41027bf..1154fc83b6 100644 --- a/ui-ngx/src/app/modules/home/pages/alarm/alarm-routing.module.ts +++ b/ui-ngx/src/app/modules/home/pages/alarm/alarm-routing.module.ts @@ -14,28 +14,15 @@ /// limitations under the License. /// -import { Injectable, NgModule } from '@angular/core'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { Authority } from '@shared/models/authority.enum'; -import { Observable } from 'rxjs'; -import { OAuth2Service } from '@core/http/oauth2.service'; import { AlarmTableComponent } from '@home/components/alarm/alarm-table.component'; import { AlarmsMode } from '@shared/models/alarm.models'; import { MenuId } from '@core/services/menu.models'; import { RouterTabsComponent } from "@home/components/router-tabs.component"; import { AlarmRulesTableComponent } from "@home/components/alarm-rules/alarm-rules-table.component"; -@Injectable() -export class OAuth2LoginProcessingUrlResolver { - - constructor(private oauth2Service: OAuth2Service) { - } - - resolve(): Observable { - return this.oauth2Service.getLoginProcessingUrl(); - } -} - const routes: Routes = [ { path: 'alarms', diff --git a/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-routing.module.ts b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-routing.module.ts new file mode 100644 index 0000000000..0ed435075c --- /dev/null +++ b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-routing.module.ts @@ -0,0 +1,43 @@ +/// +/// Copyright © 2016-2025 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 { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { Authority } from '@shared/models/authority.enum'; +import { MenuId } from '@core/services/menu.models'; +import { CalculatedFieldsTableComponent } from '@home/components/calculated-fields/calculated-fields-table.component'; + +const routes: Routes = [ + { + path: 'calculatedFields', + component: CalculatedFieldsTableComponent, + data: { + auth: [Authority.TENANT_ADMIN], + title: 'entity.type-calculated-fields', + breadcrumb: { + menuId: MenuId.calculated_fields + }, + isPage: true, + } + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], + providers: [] +}) +export class CalculatedFieldsRoutingModule { } \ No newline at end of file diff --git a/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields.module.ts b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields.module.ts new file mode 100644 index 0000000000..01ed3577e8 --- /dev/null +++ b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields.module.ts @@ -0,0 +1,34 @@ +/// +/// Copyright © 2016-2025 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 { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SharedModule } from '@shared/shared.module'; +import { HomeDialogsModule } from '../../dialogs/home-dialogs.module'; +import { HomeComponentsModule } from '@modules/home/components/home-components.module'; +import { CalculatedFieldsRoutingModule } from '@home/pages/calculated-fields/calculated-fields-routing.module'; + +@NgModule({ + declarations: [], + imports: [ + CommonModule, + SharedModule, + HomeComponentsModule, + HomeDialogsModule, + CalculatedFieldsRoutingModule + ] +}) +export class CalculatedFieldsModule { } \ No newline at end of file diff --git a/ui-ngx/src/app/modules/home/pages/home-pages.module.ts b/ui-ngx/src/app/modules/home/pages/home-pages.module.ts index 5bb3954cae..c43b89d141 100644 --- a/ui-ngx/src/app/modules/home/pages/home-pages.module.ts +++ b/ui-ngx/src/app/modules/home/pages/home-pages.module.ts @@ -27,6 +27,7 @@ import { UserModule } from '@modules/home/pages/user/user.module'; import { DeviceModule } from '@modules/home/pages/device/device.module'; import { AssetModule } from '@modules/home/pages/asset/asset.module'; import { EntityViewModule } from '@modules/home/pages/entity-view/entity-view.module'; +import { CalculatedFieldsModule } from '@home/pages/calculated-fields/calculated-fields.module'; import { RuleChainModule } from '@modules/home/pages/rulechain/rulechain.module'; import { WidgetLibraryModule } from '@modules/home/pages/widget/widget-library.module'; import { DashboardModule } from '@modules/home/pages/dashboard/dashboard.module'; @@ -69,6 +70,7 @@ import { AiModelModule } from '@home/pages/ai-model/ai-model.module'; EdgeModule, EntityViewModule, CustomerModule, + CalculatedFieldsModule, RuleChainModule, WidgetLibraryModule, DashboardModule, diff --git a/ui-ngx/src/app/shared/models/calculated-field.models.ts b/ui-ngx/src/app/shared/models/calculated-field.models.ts index a21d12dc05..5f07374cf8 100644 --- a/ui-ngx/src/app/shared/models/calculated-field.models.ts +++ b/ui-ngx/src/app/shared/models/calculated-field.models.ts @@ -119,6 +119,8 @@ export const CalculatedFieldTypeTranslations = new Map type !== CalculatedFieldType.ALARM) + export type CalculatedFieldConfiguration = | CalculatedFieldSimpleConfiguration | CalculatedFieldScriptConfiguration @@ -567,6 +569,8 @@ export type CalculatedFieldArgumentEventValue = CalculatedF export type CalculatedFieldEventArguments = Record>; +export const calculatedFieldsEntityTypeList = [EntityType.DEVICE, EntityType.ASSET, EntityType.DEVICE_PROFILE, EntityType.ASSET_PROFILE]; + export const defaultCalculatedFieldOutput: CalculatedFieldOutputTimeSeries = { type: OutputType.Timeseries, strategy: { @@ -1062,8 +1066,8 @@ export function uniqueNameValidator(existingNames: string[]): ValidatorFn { } export interface CalculatedFieldsQuery { - type: CalculatedFieldType; + types: Array; entityType?: EntityType; entities?: Array; - name?: string; + name?: Array; } 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 87f1b24b38..3ed101e779 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -1220,6 +1220,11 @@ "deduplication-interval": "Deduplication interval", "deduplication-interval-min": "Deduplication interval should be at least {{ sec }} seconds.", "deduplication-interval-required": "Deduplication interval is required.", + "calculated-fields-filter": "Calculated fields filter", + "calculated-field-names": "Calculated field names", + "calculated-field-types": "Calculated field types", + "any-type": "Any type", + "all-names": "All", "metrics": { "metrics": "Metrics", "metrics-empty": "At least one metric must be configured.", From ca71ced6833231d564b3d2fd2c07e31a35442e42 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 16 Dec 2025 18:04:14 +0200 Subject: [PATCH 030/579] KafkaEdgeGrpcSession - move commit outside try/catch to propagate expection in case consumer already closed --- .../server/service/edge/rpc/KafkaEdgeGrpcSession.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/KafkaEdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/KafkaEdgeGrpcSession.java index 63669a8e3d..e6eaec23e4 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/KafkaEdgeGrpcSession.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/KafkaEdgeGrpcSession.java @@ -82,16 +82,18 @@ public class KafkaEdgeGrpcSession extends EdgeGrpcSession { edgeEvents.add(edgeEvent); } List downlinkMsgsPack = convertToDownlinkMsgsPack(edgeEvents); + boolean isInterrupted = true; try { - boolean isInterrupted = sendDownlinkMsgsPack(downlinkMsgsPack).get(); + isInterrupted = sendDownlinkMsgsPack(downlinkMsgsPack).get(); if (isInterrupted) { log.debug("[{}][{}] Send downlink messages task was interrupted", tenantId, edge.getId()); - } else { - consumer.commit(); } } catch (Exception e) { log.error("[{}][{}] Failed to process downlink messages", tenantId, edge.getId(), e); } + if (!isInterrupted) { + consumer.commit(); + } } @Override From 1518aa260b9b39c937212c0a47bc895ee0a86312 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Wed, 17 Dec 2025 12:27:10 +0200 Subject: [PATCH 031/579] UI: Add calculated fields page actions --- ui-ngx/src/app/core/services/menu.models.ts | 2 +- .../calculated-fields-table-config.ts | 57 +++++++++++++------ ...lated-field-arguments-table.component.html | 3 +- ...culated-field-arguments-table.component.ts | 4 ++ .../calculated-field-dialog.component.html | 12 +++- .../calculated-field-dialog.component.ts | 52 +++++++++-------- ...eofencing-zone-groups-table.component.html | 6 +- ...-geofencing-zone-groups-table.component.ts | 5 ++ ...culated-field-metrics-table.component.html | 6 +- ...alculated-field-metrics-table.component.ts | 5 ++ .../calculated-field-output.component.html | 4 +- .../calculated-field-output.component.ts | 3 + .../propagation-configuration.component.html | 4 +- .../propagation-configuration.component.ts | 3 + .../simple-configuration.component.html | 4 +- .../simple-configuration.component.ts | 5 +- ui-ngx/src/form.scss | 10 ++++ 17 files changed, 129 insertions(+), 56 deletions(-) diff --git a/ui-ngx/src/app/core/services/menu.models.ts b/ui-ngx/src/app/core/services/menu.models.ts index a97acf344e..e573cade2c 100644 --- a/ui-ngx/src/app/core/services/menu.models.ts +++ b/ui-ngx/src/app/core/services/menu.models.ts @@ -634,7 +634,7 @@ export const menuSectionMap = new Map([ name: 'entity.type-calculated-fields', type: 'link', path: '/calculatedFields', - icon: 'calculate', + icon: 'mdi:plus-minus-variant', } ], [ diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts index 7d691c6fc8..2ac2f05bf4 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts @@ -57,7 +57,7 @@ import { CalculatedFieldTestScriptDialogData } from './components/public-api'; import { ImportExportService } from '@shared/import-export/import-export.service'; -import { getEntityDetailsPageURL, isObject } from '@core/utils'; +import { deepClone, getEntityDetailsPageURL, isObject } from '@core/utils'; import { EntityDebugSettingsService } from '@home/components/entity/debug/entity-debug-settings.service'; import { DatePipe } from '@angular/common'; import { UtilsService } from "@core/services/utils.service"; @@ -73,7 +73,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig this.openDebugEventsDialog.call(this, calculatedField), + action: (calculatedField: CalculatedField) => this.openDebugEventsDialog.call(this, null, calculatedField), }; calculatedFieldFilterConfig: CalculatedFieldsQuery; @@ -96,6 +96,11 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { + this.editCalculatedField($event, entity); + return true; + }; } this.tableTitle = this.pageMode ? '' : this.translate.instant('entity.type-calculated-fields'); this.detailsPanelEnabled = false; @@ -152,17 +157,23 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig true, + onAction: ($event, entity) => this.copyCalculatedField($event, entity), + }, { name: this.translate.instant('action.export'), icon: 'file_download', isEnabled: () => true, - onAction: (event$, entity) => this.exportCalculatedField(event$, entity), + onAction: ($event, entity) => this.exportCalculatedField($event, entity), }, { name: this.translate.instant('entity-view.events'), icon: 'mdi:clipboard-text-clock', isEnabled: () => true, - onAction: (_, entity) => this.openDebugEventsDialog(entity), + onAction: ($event, entity) => this.openDebugEventsDialog($event, entity), }, { name: '', @@ -176,7 +187,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig true, - onAction: (_, entity) => this.editCalculatedField(entity), + onAction: ($event, entity) => this.editCalculatedField($event, entity), } ); } @@ -198,14 +209,12 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig this.openDebugEventsDialog(calculatedField) + action: () => this.openDebugEventsDialog($event, calculatedField) }; - if ($event) { - $event.stopPropagation(); - } const { viewContainerRef, renderer } = this.entityDebugSettingsService; if (!viewContainerRef || !renderer) { @@ -223,7 +232,8 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { if (res) { @@ -233,13 +243,14 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { + const entityId = this.entityId || value?.entityId; return this.dialog.open(CalculatedFieldDialogComponent, { disableClose: true, panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], data: { value, buttonTitle, - entityId: this.entityId, + entityId, tenantId: this.tenantId, entityName: this.entityName, ownerId: this.ownerId, @@ -253,7 +264,8 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { return (calculatedField.type === CalculatedFieldType.SCRIPT || (calculatedField.type === CalculatedFieldType.PROPAGATION && @@ -285,12 +297,25 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { + if (res) { + this.updateData(); + } + }); + } + private importCalculatedField(): void { this.importExportService.openCalculatedFieldImportDialog() .pipe( @@ -376,7 +401,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { if (openCalculatedFieldEdit) { - this.editCalculatedField({ + this.editCalculatedField(null, { entityId: this.entityId, ...calculatedField, configuration: {...calculatedField.configuration, expression} as any }, true) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.html index c6f2a5d479..99b4225db2 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.html @@ -111,6 +111,7 @@
+ class="tb-prompt flex flex-1 items-end justify-center text-base"> {{ 'calculated-fields.no-arguments' | translate }}
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts index 002a515164..9a8395a557 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts @@ -157,6 +157,10 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces return this.errorText ? { argumentsFormArray: false } : null; } + setDisabledState(isDisabled: boolean): void { + this.disable = isDisabled; + } + onDelete($event: Event, argument: CalculatedFieldArgumentValue): void { $event.stopPropagation(); const index = this.argumentsFormArray.controls.findIndex(control => isEqual(control.value, argument)); diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html index ac089bb4b1..44c2e702e5 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html @@ -21,6 +21,7 @@
@@ -93,6 +95,7 @@ @switch (fieldFormGroup.get('type').value) { @case (CalculatedFieldType.GEOFENCING) { {{ 'action.cancel' | translate }}
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts index 967e931ded..4d2df6e416 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts @@ -42,7 +42,7 @@ import { AdditionalDebugActionConfig } from '@home/components/entity/debug/entit import { deepTrim, isDefined } from '@core/utils'; import { EntityTypeSelectComponent } from '@shared/components/entity/entity-type-select.component'; import { EntityAutocompleteComponent } from '@shared/components/entity/entity-autocomplete.component'; -import { EntityService } from '@core/http/entity.service'; +import { BaseData } from '@shared/models/base-data'; export interface CalculatedFieldDialogData { value?: CalculatedField; @@ -82,6 +82,9 @@ export class CalculatedFieldDialogComponent extends DialogComponent, private calculatedFieldsService: CalculatedFieldsService, - private entityService: EntityService, private destroyRef: DestroyRef, private fb: FormBuilder) { super(store, router, dialogRef); - this.observeIsLoading(); this.observeType(); this.applyDialogData(); - if (!this.entityName) { + if (this.data.isDirty) { + this.fieldFormGroup.markAsDirty(); + } + + if (!this.data.entityId) { this.fieldFormGroup.get('entityId.id').valueChanges.pipe( takeUntilDestroyed(this.destroyRef) ).subscribe((entityId) => { - if (entityId && (this.fieldFormGroup.get('entityId.entityType').value === EntityType.DEVICE_PROFILE || - this.fieldFormGroup.get('entityId.entityType').value === EntityType.ASSET_PROFILE)) { - this.entityService.getEntity(this.fieldFormGroup.get('entityId.entityType').value as EntityType, entityId, {ignoreLoading: true, ignoreErrors: true}).subscribe( - value => { - this.entityName = value.name; - } - ) + this.disabledConfiguration = !entityId; + if (this.disabledConfiguration) { + this.fieldFormGroup.get('configuration').disable({emitEvent: false}); + } else { + this.fieldFormGroup.get('configuration').enable({emitEvent: false}); } }); } @@ -130,9 +133,13 @@ export class CalculatedFieldDialogComponent extends DialogComponent this.dialogRef.close(calculatedField)); + .subscribe({ + next: calculatedField => this.dialogRef.close(calculatedField), + error: () => this.isLoading = false + }); } else { this.fieldFormGroup.get('name').markAsTouched(); this.entityTypeSelect?.markAsTouched(); @@ -155,6 +162,10 @@ export class CalculatedFieldDialogComponent extends DialogComponent): void { + this.entityName = entity.name; + } + get entityId(): EntityId { return this.data.entityId || this.fieldFormGroup.get('entityId').value; } @@ -168,19 +179,10 @@ export class CalculatedFieldDialogComponent extends DialogComponent this.fieldFormGroup.get('type').updateValueAndValidity({onlySelf: true})); - } - - private observeIsLoading(): void { - this.isLoading$.pipe(takeUntilDestroyed()).subscribe(loading => { - if (loading) { - this.fieldFormGroup.disable({emitEvent: false}); - } else { - this.fieldFormGroup.enable({emitEvent: false}); - if (this.data.isDirty) { - this.fieldFormGroup.markAsDirty(); - } - } - }); + if (!this.data.entityId) { + this.fieldFormGroup.get('configuration').disable({emitEvent: false}); + this.disabledConfiguration = true; + } } private observeType(): void { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.html index 20db5c732d..fa0ba32f22 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.html @@ -101,6 +101,7 @@ #button (click)="manageZone($event, button, geofenceZone)" [matTooltip]="'action.edit' | translate" + [disabled]="disable" matTooltipPosition="above"> delete @@ -128,7 +130,7 @@ }
+ class="tb-prompt flex flex-1 items-end justify-center text-base" [class.required]="!disable"> {{ 'calculated-fields.no-zone-configured' | translate }}
@@ -137,7 +139,7 @@ color="primary" #button (click)="manageZone($event, button)" - [disabled]="maxArgumentsPerCF > 0 && zoneGroupsFormArray.length >= maxArgumentsPerCF"> + [disabled]="maxArgumentsPerCF > 0 && zoneGroupsFormArray.length >= maxArgumentsPerCF || disable"> {{ 'calculated-fields.add-zone-group' | translate }} @if (maxArgumentsPerCF && zoneGroupsFormArray.length >= maxArgumentsPerCF) { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.ts index b3e5edb80a..228d08fd90 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.ts @@ -90,6 +90,7 @@ export class CalculatedFieldGeofencingZoneGroupsTableComponent implements Contro entityNameMap = new Map(); sortOrder = { direction: 'asc', property: '' }; dataSource = new CalculatedFieldZoneDatasource(); + disable = false; readonly GeofencingReportStrategyTranslations = GeofencingReportStrategyTranslations; readonly entityTypeTranslations = entityTypeTranslations; @@ -135,6 +136,10 @@ export class CalculatedFieldGeofencingZoneGroupsTableComponent implements Contro return this.errorText ? { zonesFormArray: false } : null; } + setDisabledState(isDisabled: boolean): void { + this.disable = isDisabled; + } + onDelete($event: Event, zone: CalculatedFieldGeofencingValue): void { $event.stopPropagation(); const index = this.zoneGroupsFormArray.controls.findIndex(control => isEqual(control.value, zone)); diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.html index a35dc97d8a..4693d3afb4 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.html @@ -97,6 +97,7 @@ mat-icon-button #button (click)="manageMetrics($event, button, metric)" + [disabled]="disable" [matTooltip]="'action.edit' | translate" matTooltipPosition="above"> edit @@ -104,6 +105,7 @@
+ class="tb-prompt flex flex-1 items-end justify-center text-base" [class.required]="!disable"> {{ 'calculated-fields.metrics.no-metrics-configured' | translate }}
@@ -125,7 +127,7 @@ color="primary" #button (click)="manageMetrics($event, button)" - [disabled]="maxArgumentsPerCF > 0 && metricsFormArray.length >= maxArgumentsPerCF"> + [disabled]="maxArgumentsPerCF > 0 && metricsFormArray.length >= maxArgumentsPerCF || disable"> {{ 'calculated-fields.metrics.add-metric' | translate }} @if (maxArgumentsPerCF && metricsFormArray.length >= maxArgumentsPerCF) { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.ts index 78021529d6..21b21d07ac 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.ts @@ -89,6 +89,7 @@ export class CalculatedFieldMetricsTableComponent implements OnInit, ControlValu metricsFormArray = this.fb.array([]); sortOrder = { direction: 'asc' as SortDirection, property: '' }; dataSource = new CalculatedFieldMetricsDatasource(); + disable = false; displayColumns = ['name', 'function', 'filter', 'valueSource', 'actions']; @@ -141,6 +142,10 @@ export class CalculatedFieldMetricsTableComponent implements OnInit, ControlValu return this.errorText ? { metricsFormArray: false } : null; } + setDisabledState(isDisabled: boolean): void { + this.disable = isDisabled; + } + onDelete($event: Event, metric: CalculatedFieldAggMetricValue): void { $event.stopPropagation(); const index = this.metricsFormArray.controls.findIndex(control => isEqual(control.value, metric)); diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html index 3a47c00b1c..c2c989d0c8 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html @@ -78,7 +78,7 @@
-
+
{{ 'calculated-fields.output-strategy.strategy' | translate }}
@@ -90,7 +90,7 @@ @if (outputForm.get('strategy.type').value === OutputStrategyType.IMMEDIATE) { -
+
calculated-fields.output-strategy.processing-parameters
@if (outputForm.get('type').value === OutputType.Timeseries) { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts index 239a4921e4..149b5aa3b9 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts @@ -78,6 +78,8 @@ export class CalculatedFieldOutputComponent implements ControlValueAccessor, Val @Input({required: true}) entityId: EntityId; + disabled = false; + readonly outputTypes = Object.values(OutputType) as OutputType[]; readonly OutputType = OutputType; readonly AttributeScope = AttributeScope; @@ -171,6 +173,7 @@ export class CalculatedFieldOutputComponent implements ControlValueAccessor, Val registerOnTouched(_: any): void { } setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; if (isDisabled) { this.outputForm.disable({emitEvent: false}); } else { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.html index bd92d25f92..6dc5702735 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.html @@ -80,7 +80,7 @@ matTooltip="{{ 'calculated-fields.test-expression-function' | translate }}" matTooltipPosition="above" class="tb-mat-32" - [disabled]="propagateConfiguration.get('arguments').invalid" + [disabled]="propagateConfiguration.get('arguments').invalid || disabled" (click)="onTestScript()"> bug_report @@ -89,7 +89,7 @@
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.ts index bce244c7ba..1c493148b3 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.ts @@ -88,6 +88,8 @@ export class PropagationConfigurationComponent implements ControlValueAccessor, output: this.fb.control(defaultCalculatedFieldOutput), }); + disabled = false; + readonly ScriptLanguage = ScriptLanguage; readonly CalculatedFieldType = CalculatedFieldType; readonly OutputType = OutputType; @@ -142,6 +144,7 @@ export class PropagationConfigurationComponent implements ControlValueAccessor, registerOnTouched(_: any): void { } setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; if (isDisabled) { this.propagateConfiguration.disable({emitEvent: false}); } else { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.html index 178f8b47d6..e6a37043d5 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.html @@ -72,7 +72,7 @@ matTooltip="{{ 'calculated-fields.test-script-function' | translate }}" matTooltipPosition="above" class="tb-mat-32" - [disabled]="simpleConfiguration.get('arguments').invalid" + [disabled]="simpleConfiguration.get('arguments').invalid || disabled" (click)="onTestScript()"> bug_report @@ -81,7 +81,7 @@
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.ts index 8dc6f01726..e6ff1d1bad 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.ts @@ -104,6 +104,8 @@ export class SimpleConfigurationComponent implements ControlValueAccessor, Valid map(argumentsObj => getCalculatedFieldArgumentsHighlights(argumentsObj)) ); + disabled = false; + private propagateChange: (config: SimpeConfiguration) => void = () => { }; constructor(private fb: FormBuilder) { @@ -127,7 +129,7 @@ export class SimpleConfigurationComponent implements ControlValueAccessor, Valid for (const propName of Object.keys(changes)) { const change = changes[propName]; if (change.currentValue !== change.previousValue) { - if (propName === 'isScript') { + if (propName === 'isScript' && !this.disabled) { this.updatedFormWithScript(); if (!change.firstChange) { this.simpleConfiguration.updateValueAndValidity(); @@ -163,6 +165,7 @@ export class SimpleConfigurationComponent implements ControlValueAccessor, Valid } setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; if (isDisabled) { this.simpleConfiguration.disable({emitEvent: false}); } else { diff --git a/ui-ngx/src/form.scss b/ui-ngx/src/form.scss index b8e269c14e..f300b5e42b 100644 --- a/ui-ngx/src/form.scss +++ b/ui-ngx/src/form.scss @@ -107,6 +107,9 @@ } } } + &.disabled { + color: var(--mdc-outlined-text-field-disabled-input-text-color); + } .mat-expansion-panel { &.tb-settings { box-shadow: none; @@ -160,6 +163,13 @@ } } + .tb-form-panel-disabled { + color: var(--mdc-outlined-text-field-disabled-input-text-color); + .tb-form-panel { + color: var(--mdc-outlined-text-field-disabled-input-text-color); + } + } + .tb-form-panel-title { font-weight: 500; font-size: 16px; From e0357aff503e71a0fa0e32f2d59d626da70a0000 Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Wed, 17 Dec 2025 12:44:59 +0200 Subject: [PATCH 032/579] fixed processing telemetry batch --- ...CalculatedFieldEntityMessageProcessor.java | 34 +++++++- .../cf/ctx/state/TsRollingArgumentEntry.java | 32 +++++--- .../cf/CalculatedFieldIntegrationTest.java | 80 +++++++++++++++++++ 3 files changed, 131 insertions(+), 15 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java index 49d1af2b0f..257e9d8565 100644 --- a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java @@ -36,6 +36,7 @@ import org.thingsboard.server.common.data.msg.TbMsgType; import org.thingsboard.server.common.msg.cf.CalculatedFieldPartitionChangeMsg; import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.common.msg.queue.TbCallback; +import org.thingsboard.server.common.util.ProtoUtils; import org.thingsboard.server.gen.transport.TransportProtos.AttributeScopeProto; import org.thingsboard.server.gen.transport.TransportProtos.AttributeValueProto; import org.thingsboard.server.gen.transport.TransportProtos.CalculatedFieldTelemetryMsgProto; @@ -48,6 +49,7 @@ import org.thingsboard.server.service.cf.ctx.state.ArgumentEntry; import org.thingsboard.server.service.cf.ctx.state.CalculatedFieldCtx; import org.thingsboard.server.service.cf.ctx.state.CalculatedFieldState; import org.thingsboard.server.service.cf.ctx.state.SingleValueArgumentEntry; +import org.thingsboard.server.service.cf.ctx.state.TsRollingArgumentEntry; import java.util.ArrayList; import java.util.Collection; @@ -62,6 +64,8 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import static org.thingsboard.server.service.cf.ctx.state.TsRollingArgumentEntry.getValueForTsRecord; + /** * @author Andrew Shvayka @@ -356,13 +360,39 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM ReferencedEntityKey key = new ReferencedEntityKey(item.getKv().getKey(), ArgumentType.TS_LATEST, null); Set argNames = args.get(key); if (argNames != null) { - argNames.forEach(argName -> arguments.put(argName, new SingleValueArgumentEntry(item))); + SingleValueArgumentEntry incoming = new SingleValueArgumentEntry(item); + argNames.forEach(argName -> arguments.compute(argName, (name, existing) -> { + if (existing == null) { + return incoming; + } + existing.updateEntry(incoming); + return existing; + })); } key = new ReferencedEntityKey(item.getKv().getKey(), ArgumentType.TS_ROLLING, null); argNames = args.get(key); if (argNames != null) { - argNames.forEach(argName -> arguments.put(argName, new SingleValueArgumentEntry(item))); + Double recordValue = getValueForTsRecord(ProtoUtils.fromProto(item.getKv())); + argNames.forEach(argName -> arguments.compute(argName, (name, existing) -> { + if (existing instanceof TsRollingArgumentEntry rolling) { + if (recordValue != null) { + rolling.getTsRecords().put(item.getTs(), recordValue); + } + return rolling; + } + TsRollingArgumentEntry rolling = new TsRollingArgumentEntry(); + if (recordValue != null) { + rolling.getTsRecords().put(item.getTs(), recordValue); + } + if (existing instanceof SingleValueArgumentEntry single) { + Double existingValue = getValueForTsRecord(single.getKvEntryValue()); + if (existingValue != null) { + rolling.getTsRecords().put(single.getTs(), existingValue); + } + } + return rolling; + })); } } return arguments; diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/TsRollingArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/TsRollingArgumentEntry.java index e01d8b7369..9f9ad5db73 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/TsRollingArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/TsRollingArgumentEntry.java @@ -122,20 +122,11 @@ public class TsRollingArgumentEntry implements ArgumentEntry { } private void addTsRecord(Long ts, KvEntry value) { - try { - switch (value.getDataType()) { - case LONG -> value.getLongValue().ifPresent(aLong -> tsRecords.put(ts, aLong.doubleValue())); - case DOUBLE -> value.getDoubleValue().ifPresent(aDouble -> tsRecords.put(ts, aDouble)); - case BOOLEAN -> value.getBooleanValue().ifPresent(aBoolean -> tsRecords.put(ts, aBoolean ? 1.0 : 0.0)); - case STRING -> value.getStrValue().ifPresent(aString -> tsRecords.put(ts, Double.parseDouble(aString))); - case JSON -> value.getJsonValue().ifPresent(aString -> tsRecords.put(ts, Double.parseDouble(aString))); - } - } catch (Exception e) { - tsRecords.put(ts, Double.NaN); - log.debug("Invalid value '{}' for time series rolling arguments. Only numeric values are supported.", value.getValue()); - } finally { - cleanupExpiredRecords(); + Double recordValue = getValueForTsRecord(value); + if (recordValue != null) { + tsRecords.put(ts, recordValue); } + cleanupExpiredRecords(); } private void addTsRecord(Long ts, double value) { @@ -150,4 +141,19 @@ public class TsRollingArgumentEntry implements ArgumentEntry { tsRecords.entrySet().removeIf(tsRecord -> tsRecord.getKey() < System.currentTimeMillis() - timeWindow); } + public static Double getValueForTsRecord(KvEntry value) { + try { + return switch (value.getDataType()) { + case LONG -> value.getLongValue().map(Long::doubleValue).orElse(null); + case DOUBLE -> value.getDoubleValue().orElse(null); + case BOOLEAN -> value.getBooleanValue().map(b -> b ? 1.0 : 0.0).orElse(null); + case STRING -> value.getStrValue().map(Double::parseDouble).orElse(null); + case JSON -> value.getJsonValue().map(Double::parseDouble).orElse(null); + }; + } catch (Exception e) { + log.debug("Invalid value '{}' for time series rolling arguments. Only numeric values are supported.", value.getValue()); + return Double.NaN; + } + } + } diff --git a/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java b/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java index c83e8c5ee3..1da3673695 100644 --- a/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java @@ -796,6 +796,86 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes }); } + @Test + public void testCalculatedFieldWhenBatchOfTelemetrySent() throws Exception { + Device testDevice = createDevice("Test device", "1234567890"); + doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"a\":5}")); + doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"b\":10}")); + doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"b\":20}")); + + CalculatedField calculatedField = new CalculatedField(); + calculatedField.setEntityId(testDevice.getId()); + calculatedField.setType(CalculatedFieldType.SCRIPT); + calculatedField.setName("Script CF"); + calculatedField.setDebugSettings(DebugSettings.all()); + + SimpleCalculatedFieldConfiguration config = new SimpleCalculatedFieldConfiguration(); + + ReferencedEntityKey refEntityKeyA = new ReferencedEntityKey("a", ArgumentType.TS_LATEST, null); + Argument argumentA = new Argument(); + argumentA.setRefEntityKey(refEntityKeyA); + Argument argumentB = new Argument(); + ReferencedEntityKey refEntityKeyB = new ReferencedEntityKey("b", ArgumentType.TS_ROLLING, null); + argumentB.setTimeWindow(TimeUnit.MINUTES.toMillis(10)); + argumentB.setLimit(1000); + argumentB.setRefEntityKey(refEntityKeyB); + config.setArguments(Map.of("a", argumentA, "b", argumentB)); + config.setExpression(""" + return { + "latestA": a, + "avgB": b.avg + }; + """); + + Output output = new Output(); + output.setType(OutputType.TIME_SERIES); + config.setOutput(output); + + calculatedField.setConfiguration(config); + + doPost("/api/calculatedField", calculatedField, CalculatedField.class); + + await().alias("create CF -> perform initial calculation").atMost(TIMEOUT, TimeUnit.SECONDS) + .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) + .untilAsserted(() -> { + ObjectNode result = getLatestTelemetry(testDevice.getId(), "latestA", "avgB"); + assertThat(result).isNotNull(); + assertThat(result.get("latestA").get(0).get("value").asText()).isEqualTo("5"); + assertThat(result.get("avgB").get(0).get("value").asText()).isEqualTo("15.0"); + }); + + long now = System.currentTimeMillis(); + doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode(String.format(""" + [{ + "ts": %s, + "values": { + "a": 6, + "b": 100 + } + }, { + "ts": %s, + "values": { + "a": 7, + "b": 200 + } + }, { + "ts": %s, + "values": { + "a": 8, + "b": 300 + } + }]""", now - TimeUnit.MINUTES.toMillis(2), now, now - TimeUnit.MINUTES.toMillis(5)))); + + await().alias("update telemetry -> recalculate state").atMost(TIMEOUT, TimeUnit.SECONDS) + .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) + .untilAsserted(() -> { + ObjectNode result = getLatestTelemetry(testDevice.getId(), "latestA", "avgB"); + assertThat(result).isNotNull(); + assertThat(result.get("latestA").get(0).get("value").asText()).isEqualTo("7"); + assertThat(result.get("avgB").get(0).get("value").asText()).isEqualTo("126.0"); + }); + } + private ObjectNode getLatestTelemetry(EntityId entityId, String... keys) throws Exception { return doGetAsync("/api/plugins/telemetry/" + entityId.getEntityType() + "/" + entityId.getId() + "/values/timeseries?keys=" + String.join(",", keys), ObjectNode.class); } From 3f0388b7c0cf7737ebf0b5dc9c73f8833003f113 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Wed, 17 Dec 2025 12:15:23 +0100 Subject: [PATCH 033/579] TbMqttSslTransportComponent for MqttSslHandlerProvider --- .../mqtt/MqttSslHandlerProvider.java | 3 +- .../mqtt/TbMqttSslTransportComponent.java | 31 +++++++++++++++++++ .../mqtt/TbMqttTransportComponent.java | 6 +++- 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/TbMqttSslTransportComponent.java diff --git a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttSslHandlerProvider.java b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttSslHandlerProvider.java index 867b39cd23..77396c69fa 100644 --- a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttSslHandlerProvider.java +++ b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttSslHandlerProvider.java @@ -20,7 +20,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @@ -48,7 +47,7 @@ import java.util.concurrent.TimeUnit; @Slf4j @Component("MqttSslHandlerProvider") -@ConditionalOnProperty(prefix = "transport.mqtt.ssl", value = "enabled", havingValue = "true", matchIfMissing = false) +@TbMqttSslTransportComponent public class MqttSslHandlerProvider { @Value("${transport.mqtt.ssl.protocol}") diff --git a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/TbMqttSslTransportComponent.java b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/TbMqttSslTransportComponent.java new file mode 100644 index 0000000000..2a0e8ef42f --- /dev/null +++ b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/TbMqttSslTransportComponent.java @@ -0,0 +1,31 @@ +/** + * Copyright © 2016-2025 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. + */ +package org.thingsboard.server.transport.mqtt; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; + +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Same as @TbMqttTransportComponent with additional condition by `transport.mqtt.ssl.enabled == true` + */ + +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@ConditionalOnExpression("'${service.type:null}'=='tb-transport' || ('${service.type:null}'=='monolith' && '${transport.api_enabled:true}'=='true' && '${transport.mqtt.enabled:true}'=='true' && '${transport.mqtt.ssl.enabled:false}'=='true')") +public @interface TbMqttSslTransportComponent {} diff --git a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/TbMqttTransportComponent.java b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/TbMqttTransportComponent.java index b517cda103..0d034aebb2 100644 --- a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/TbMqttTransportComponent.java +++ b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/TbMqttTransportComponent.java @@ -21,7 +21,11 @@ import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +/** + * See also @TbMqttSslTransportComponent + */ + @Inherited @Retention(RetentionPolicy.RUNTIME) -@ConditionalOnExpression("'${service.type:null}'=='tb-transport' || ('${service.type:null}'=='monolith' && '${transport.api_enabled:true}'=='true' && '${transport.mqtt.enabled}'=='true')") +@ConditionalOnExpression("'${service.type:null}'=='tb-transport' || ('${service.type:null}'=='monolith' && '${transport.api_enabled:true}'=='true' && '${transport.mqtt.enabled:true}'=='true')") public @interface TbMqttTransportComponent {} From 6803b38207783e74b51106faa71df33b9a39466a Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Wed, 17 Dec 2025 14:19:57 +0200 Subject: [PATCH 034/579] merge with master --- .../RelatedEntitiesAggregationCalculatedFieldState.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java index 7c12f74b8a..1edfea70a3 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java @@ -178,7 +178,7 @@ public class RelatedEntitiesAggregationCalculatedFieldState extends BaseCalculat }); lastMetricsEvalTs = DEFAULT_LAST_UPDATE_TS; lastArgsRefreshTs = System.currentTimeMillis(); - readinessStatus = checkReadiness(requiredArguments, arguments); + readinessStatus = checkReadiness(); } public void scheduleReevaluation() { @@ -291,12 +291,12 @@ public class RelatedEntitiesAggregationCalculatedFieldState extends BaseCalculat record EntityArgument(EntityInfo entity, JsonNode entityArguments) {} @Override - protected ReadinessStatus checkReadiness(List requiredArguments, Map currentArguments) { - if (currentArguments == null) { + protected ReadinessStatus checkReadiness() { + if (arguments == null) { return ReadinessStatus.notReady(MISSING_AGGREGATION_ENTITIES_ERROR); } for (String requiredArgumentKey : requiredArguments) { - ArgumentEntry argumentEntry = currentArguments.get(requiredArgumentKey); + ArgumentEntry argumentEntry = arguments.get(requiredArgumentKey); if (argumentEntry == null || argumentEntry.isEmpty()) { return ReadinessStatus.notReady(MISSING_AGGREGATION_ENTITIES_ERROR); } From cb2f4080787a6eb9d8c899e3bcf7ca22ec34894d Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Wed, 17 Dec 2025 15:21:30 +0200 Subject: [PATCH 035/579] UI: Fixed entityId and add row click --- .../alarm-rule-dialog.component.html | 25 +++++---- .../alarm-rule-dialog.component.ts | 54 ++++++++++++------- .../alarm-rule-filter-config.component.ts | 4 +- .../alarm-rules/alarm-rules-table-config.ts | 41 ++++++++------ .../app/shared/models/alarm-rule.models.ts | 2 + ui-ngx/src/app/shared/models/constants.ts | 3 +- 6 files changed, 80 insertions(+), 49 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html index 52ff7d15cb..d9bff11bf0 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html @@ -19,7 +19,9 @@

{{ 'alarm-rule.alarm-rule' | translate}}

+
}
-
-
{{ 'calculated-fields.arguments' | translate }}
+
+
{{ 'calculated-fields.arguments' | translate }}
-
-
{{ 'alarm-rule.create-conditions' | translate }}
+
+
{{ 'alarm-rule.create-conditions' | translate }}
-
-
{{ 'alarm-rule.clear-condition' | translate }}
+
+
{{ 'alarm-rule.clear-condition' | translate }}
@@ -122,7 +124,7 @@
- + {{ 'alarm-rule.advanced-settings' | translate }} @@ -171,13 +173,14 @@
diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts index ac4d0f9ed6..a84aa52693 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts @@ -30,21 +30,22 @@ import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; import { EntityId } from '@shared/models/id/entity-id'; import { AdditionalDebugActionConfig } from '@home/components/entity/debug/entity-debug-settings.model'; import { COMMA, ENTER, SEMICOLON } from "@angular/cdk/keycodes"; -import { MatChipInputEvent } from "@angular/material/chips"; import { AlarmRule, AlarmRuleConditionType, + alarmRuleEntityTypeList, AlarmRuleExpressionType, AlarmRuleTestScriptFn } from "@shared/models/alarm-rule.models"; import { deepTrim } from "@core/utils"; -import { Observable } from "rxjs"; -import { switchMap } from "rxjs/operators"; +import { combineLatest, Observable } from "rxjs"; +import { debounceTime, startWith, switchMap } from "rxjs/operators"; import { EntityTypeSelectComponent } from "@shared/components/entity/entity-type-select.component"; import { EntityAutocompleteComponent } from "@shared/components/entity/entity-autocomplete.component"; import { EntityService } from "@core/http/entity.service"; import { RelationTypes } from "@shared/models/relation.models"; import { StringItemsOption } from "@shared/components/string-items-list.component"; +import { BaseData } from "@shared/models/base-data"; export interface AlarmRuleDialogData { value?: CalculatedField; @@ -92,7 +93,7 @@ export class AlarmRuleDialogComponent extends DialogComponent { this.updateRulesValidators(); }); - if (!this.entityName) { - this.fieldFormGroup.get('entityId.id').valueChanges.pipe( - takeUntilDestroyed(this.destroyRef) - ).subscribe((entityId) => { - if (entityId && (this.fieldFormGroup.get('entityId.entityType').value === EntityType.DEVICE_PROFILE || - this.fieldFormGroup.get('entityId.entityType').value === EntityType.ASSET_PROFILE)) { - this.entityService.getEntity(this.fieldFormGroup.get('entityId.entityType').value as EntityType, entityId, {ignoreLoading: true, ignoreErrors: true}).subscribe( - value => { - this.entityName = value.name; - } - ) + if (!this.data.entityId) { + combineLatest([ + this.fieldFormGroup.get('entityId.id')!.valueChanges.pipe(startWith(this.fieldFormGroup.get('entityId.id')!.value)), + this.fieldFormGroup.get('name')!.valueChanges.pipe(startWith(this.fieldFormGroup.get('name')!.value)) + ]).pipe( + debounceTime(50), + takeUntilDestroyed() + ).subscribe(([entityId, name]) => { + this.disabledArguments = !entityId || !name?.length; + const argsControl = this.fieldFormGroup.get('configuration.arguments')!; + if (this.disabledArguments) { + argsControl.disable({ emitEvent: false }); + } else { + argsControl.enable({ emitEvent: false }); } }); } @@ -174,12 +184,16 @@ export class AlarmRuleDialogComponent extends DialogComponent 0) { + this.isLoading = true; const alarmRule = { entityId: this.data.entityId, ...(this.data.value ?? {}), ...this.fromGroupValue}; alarmRule.configuration.type = CalculatedFieldType.ALARM; this.calculatedFieldsService.saveCalculatedField(alarmRule) .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(calculatedField => this.dialogRef.close(calculatedField)); + .subscribe({ + next: calculatedField => this.dialogRef.close(calculatedField), + error: () => this.isLoading = false + }); } else { this.fieldFormGroup.get('name').markAsTouched(); this.entityTypeSelect?.markAsTouched(); @@ -215,7 +229,7 @@ export class AlarmRuleDialogComponent extends DialogComponent): void { + this.entityName = entity.name; + } + } diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.ts index a19fc688a8..da91aafb07 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.ts @@ -39,7 +39,7 @@ import { fromEvent, Subscription } from 'rxjs'; import { POSITION_MAP } from '@shared/models/overlay.models'; import { UtilsService } from '@core/services/utils.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { AlarmRuleFilterConfig } from "@shared/models/alarm-rule.models"; +import { alarmRuleEntityTypeList, AlarmRuleFilterConfig } from "@shared/models/alarm-rule.models"; export const ALARM_FILTER_CONFIG_DATA = new InjectionToken('AlarmRuleFilterConfigData'); @@ -100,7 +100,7 @@ export class AlarmRuleFilterConfigComponent implements OnInit, ControlValueAcces entityType = EntityType; - listEntityTypes = [EntityType.DEVICE, EntityType.ASSET, EntityType.CUSTOMER, EntityType.DEVICE_PROFILE, EntityType.ASSET_PROFILE]; + listEntityTypes = alarmRuleEntityTypeList; entityTypeTranslations = entityTypeTranslations; private alarmRuleFilterConfig: AlarmRuleFilterConfig; diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts index b242fd9701..3784bc09bf 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts @@ -72,7 +72,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig { readonly tenantId = getCurrentAuthUser(this.store).tenantId; additionalDebugActionConfig = { title: this.translate.instant('calculated-fields.see-debug-events'), - action: (calculatedField: CalculatedField) => this.openDebugEventsDialog.call(this, calculatedField), + action: (calculatedField: CalculatedField) => this.openDebugEventsDialog.call(this, null, calculatedField), }; alarmRuleFilterConfig: CalculatedFieldsQuery; @@ -95,6 +95,13 @@ export class AlarmRulesTableConfig extends EntityTableConfig { super(); if (this.pageMode) { this.headerComponent = AlarmRuleTableHeaderComponent; + + this.rowPointer = true; + + this.handleRowClick = ($event, model) => { + this.editCalculatedField($event, model); + return true; + }; } this.tableTitle = this.pageMode ? '' : this.translate.instant('alarm-rule.alarm-rules'); this.detailsPanelEnabled = false; @@ -153,7 +160,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig { name: this.translate.instant('alarm-rule.copy'), icon: 'content_copy', isEnabled: () => true, - onAction: ($event, entity) => this.copyCalculatedField(entity) + onAction: ($event, entity) => this.copyCalculatedField($event, entity) } ); this.cellActionDescriptors.push( @@ -161,13 +168,13 @@ export class AlarmRulesTableConfig extends EntityTableConfig { name: this.translate.instant('action.export'), icon: 'file_download', isEnabled: () => true, - onAction: (event$, entity) => this.exportAlarmRule(event$, entity), + onAction: ($event, entity) => this.exportAlarmRule($event, entity), }, { name: this.translate.instant('entity-view.events'), icon: 'mdi:clipboard-text-clock', isEnabled: () => true, - onAction: (_, entity) => this.openDebugEventsDialog(entity), + onAction: ($event, entity) => this.openDebugEventsDialog($event, entity), }, { name: '', @@ -181,7 +188,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig { name: this.translate.instant('action.edit'), icon: 'edit', isEnabled: () => true, - onAction: (_, entity) => this.editCalculatedField(entity), + onAction: ($event, entity) => this.editCalculatedField($event, entity), } ); } @@ -193,14 +200,12 @@ export class AlarmRulesTableConfig extends EntityTableConfig { } onOpenDebugConfig($event: Event, calculatedField: CalculatedField): void { + $event?.stopPropagation(); const { debugSettings = {}, id } = calculatedField; const additionalActionConfig = { ...this.additionalDebugActionConfig, - action: () => this.openDebugEventsDialog(calculatedField) + action: () => this.openDebugEventsDialog($event, calculatedField) }; - if ($event) { - $event.stopPropagation(); - } const { viewContainerRef, renderer } = this.entityDebugSettingsService; if (!viewContainerRef || !renderer) { @@ -219,7 +224,8 @@ export class AlarmRulesTableConfig extends EntityTableConfig { }, $event.target as Element); } - private editCalculatedField(calculatedField: CalculatedField, isDirty = false): void { + private editCalculatedField($event: Event, calculatedField: CalculatedField, isDirty = false): void { + $event?.stopPropagation(); this.getCalculatedAlarmDialog(calculatedField, 'action.apply', isDirty) .subscribe((res) => { if (res) { @@ -228,7 +234,8 @@ export class AlarmRulesTableConfig extends EntityTableConfig { }); } - private copyCalculatedField(calculatedField: CalculatedField, isDirty = false): void { + private copyCalculatedField($event: Event, calculatedField: CalculatedField, isDirty = false): void { + $event?.stopPropagation(); const copyCalculatedAlarmRule = deepClone(calculatedField); if (this.pageMode) { copyCalculatedAlarmRule.entityId = null; @@ -243,13 +250,14 @@ export class AlarmRulesTableConfig extends EntityTableConfig { } private getCalculatedAlarmDialog(value?: CalculatedField, buttonTitle = 'action.add', isDirty = false): Observable { + const entityId = this.entityId || value?.entityId; return this.dialog.open(AlarmRuleDialogComponent, { disableClose: true, panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], data: { value, buttonTitle, - entityId: this.entityId, + entityId, tenantId: this.tenantId, entityName: this.entityName, ownerId: this.ownerId ?? {entityType: EntityType.TENANT, id: this.tenantId}, @@ -263,7 +271,8 @@ export class AlarmRulesTableConfig extends EntityTableConfig { .pipe(filter(Boolean)); } - private openDebugEventsDialog(calculatedField: CalculatedField): void { + private openDebugEventsDialog($event: Event, calculatedField: CalculatedField): void { + $event?.stopPropagation(); this.dialog.open(EventsDialogComponent, { disableClose: true, panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], @@ -282,9 +291,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig { } private exportAlarmRule($event: Event, calculatedField: CalculatedField): void { - if ($event) { - $event.stopPropagation(); - } + $event?.stopPropagation(); this.importExportService.exportCalculatedField(calculatedField.id.id); } @@ -361,7 +368,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig { filter(Boolean), tap(expression => { if (openCalculatedFieldEdit) { - this.editCalculatedField({ + this.editCalculatedField(null, { entityId: this.entityId, ...calculatedField, configuration: {...calculatedField.configuration, expression} as any }, true) diff --git a/ui-ngx/src/app/shared/models/alarm-rule.models.ts b/ui-ngx/src/app/shared/models/alarm-rule.models.ts index 3accaed95c..df137313be 100644 --- a/ui-ngx/src/app/shared/models/alarm-rule.models.ts +++ b/ui-ngx/src/app/shared/models/alarm-rule.models.ts @@ -23,6 +23,8 @@ import { EntityType } from "@shared/models/entity-type.models"; import { Observable } from "rxjs"; import { CalculatedField, CalculatedFieldArgument } from "@shared/models/calculated-field.models"; +export const alarmRuleEntityTypeList = [EntityType.DEVICE, EntityType.ASSET, EntityType.CUSTOMER, EntityType.DEVICE_PROFILE, EntityType.ASSET_PROFILE]; + export enum AlarmRuleScheduleType { ANY_TIME = 'ANY_TIME', SPECIFIC_TIME = 'SPECIFIC_TIME', diff --git a/ui-ngx/src/app/shared/models/constants.ts b/ui-ngx/src/app/shared/models/constants.ts index 2788aa52df..9253c0004a 100644 --- a/ui-ngx/src/app/shared/models/constants.ts +++ b/ui-ngx/src/app/shared/models/constants.ts @@ -219,7 +219,8 @@ export const HelpLinks = { aiModels: `${helpBaseUrl}/docs${docPlatformPrefix}/samples/analytics/ai-models/`, apiKeys: `${helpBaseUrl}/docs${docPlatformPrefix}/user-guide/ui/api-keys`, timewindowSettings: `${helpBaseUrl}/docs${docPlatformPrefix}/user-guide/dashboards/#time-window`, - trendzSettings: `${helpBaseUrl}/docs/trendz/` + trendzSettings: `${helpBaseUrl}/docs/trendz/`, + alarmRules: `${helpBaseUrl}/docs${docPlatformPrefix}/user-guide/alarm-rules/`, } }; /* eslint-enable max-len */ From b06dd754bc97be9b98da5f40065664cd5cd6847c Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Wed, 17 Dec 2025 14:08:12 +0200 Subject: [PATCH 036/579] UI: Updated filter and calculated fields page icon --- ui-ngx/src/app/core/services/menu.models.ts | 2 +- .../calculated-fields-table-config.ts | 32 +++---------------- ...ulated-fields-filter-config.component.html | 11 ------- ...lculated-fields-filter-config.component.ts | 7 ---- .../assets/locale/locale.constant-en_US.json | 3 +- 5 files changed, 6 insertions(+), 49 deletions(-) diff --git a/ui-ngx/src/app/core/services/menu.models.ts b/ui-ngx/src/app/core/services/menu.models.ts index e573cade2c..f42943cd93 100644 --- a/ui-ngx/src/app/core/services/menu.models.ts +++ b/ui-ngx/src/app/core/services/menu.models.ts @@ -634,7 +634,7 @@ export const menuSectionMap = new Map([ name: 'entity.type-calculated-fields', type: 'link', path: '/calculatedFields', - icon: 'mdi:plus-minus-variant', + icon: 'mdi:function-variant', } ], [ diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts index 2ac2f05bf4..c8732eddf3 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts @@ -99,6 +99,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { this.editCalculatedField($event, entity); + this.rowPointer = true; return true; }; } @@ -131,30 +132,15 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig('expression', 'calculated-fields.expression', '250px'); - expressionColumn.sortable = false; - expressionColumn.cellContentFunction = entity => { - const expressionLabel = this.getExpressionLabel(entity); - return expressionLabel?.length < 45 ? expressionLabel : `${expressionLabel.substring(0, 44)}…`; - } - expressionColumn.cellTooltipFunction = entity => { - const expressionLabel = this.getExpressionLabel(entity); - return expressionLabel?.length < 45 ? null : expressionLabel - }; - this.columns.push(new DateEntityTableColumn('createdTime', 'common.created-time', this.datePipe, '150px')); - this.columns.push(new EntityTableColumn('name', 'common.name', this.pageMode ? '30%' :'33%', + this.columns.push(new EntityTableColumn('name', 'common.name', this.pageMode ? '33%' : '60%', entity => this.utilsService.customTranslation(entity.name, entity.name))); - this.columns.push(new EntityTableColumn('type', 'common.type', '170px', entity => this.translate.instant(CalculatedFieldTypeTranslations.get(entity.type).name), () => ({whiteSpace: 'nowrap' }))); - this.columns.push(expressionColumn); - if (this.pageMode) { - this.columns.push(new EntityTableColumn('entityType', 'alarm-rule.target-entity-type', '15%', - entity => this.translate.instant(entityTypeTranslations.get(entity.entityId.entityType).type))); - this.columns.push(new EntityLinkTableColumn('entityName', 'alarm-rule.target-entity', '30%', + this.columns.push(new EntityLinkTableColumn('entityName', 'calculated-fields.target-entity', '33%', entity => this.utilsService.customTranslation(entity['entityName'], entity['entityName']), entity => getEntityDetailsPageURL(entity.entityId?.id, entity.entityId?.entityType as EntityType), false)); } + this.columns.push(new EntityTableColumn('type', 'common.type', this.pageMode ? '33%' : '40%', entity => this.translate.instant(CalculatedFieldTypeTranslations.get(entity.type).name), () => ({whiteSpace: 'nowrap' }))); this.cellActionDescriptors.push( { @@ -192,16 +178,6 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig> { return this.pageMode ? this.calculatedFieldsService.getCalculatedFieldsFilter(pageLink, this.calculatedFieldFilterConfig): diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.html index 6e67b9581b..b3cc3b387a 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.html @@ -56,17 +56,6 @@
-
-
calculated-fields.calculated-field-names
- - -
calculated-fields.calculated-field-types
Date: Wed, 17 Dec 2025 16:55:39 +0200 Subject: [PATCH 037/579] Clear code --- .../components/output/calculated-field-output.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html index c2c989d0c8..5bf7788e10 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html @@ -90,7 +90,7 @@ @if (outputForm.get('strategy.type').value === OutputStrategyType.IMMEDIATE) { -
+
calculated-fields.output-strategy.processing-parameters
@if (outputForm.get('type').value === OutputType.Timeseries) { From 0bd2651f223c067d80b9b169a2bf91ccaaecdbef Mon Sep 17 00:00:00 2001 From: dshvaika Date: Wed, 17 Dec 2025 17:11:02 +0200 Subject: [PATCH 038/579] Fixed generation of startTs for new alarms in AlarmCalculatedFieldState --- .../server/service/cf/ctx/state/BaseCalculatedFieldState.java | 2 -- .../service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java index 754fc2f6ee..09ca35cc4b 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java @@ -48,7 +48,6 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState, protected Map arguments = new HashMap<>(); protected boolean sizeExceedsLimit; - protected long latestTimestamp = DEFAULT_LAST_UPDATE_TS; protected ReadinessStatus readinessStatus; @Setter @@ -121,7 +120,6 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState, requiredArguments = null; arguments.clear(); sizeExceedsLimit = false; - latestTimestamp = DEFAULT_LAST_UPDATE_TS; } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java index 9dd944c2e4..4f2cbede09 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java @@ -356,7 +356,7 @@ public class AlarmCalculatedFieldState extends BaseCalculatedFieldState { newAlarm.setAcknowledged(false); newAlarm.setCleared(false); newAlarm.setSeverity(severity); - long startTs = latestTimestamp; + long startTs = getLatestTimestamp(); long currentTime = System.currentTimeMillis(); if (startTs <= 0L || startTs > currentTime) { startTs = currentTime; From 289c5674db59e6e666a90ad4f5aaebc5d1353fcf Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Wed, 17 Dec 2025 17:36:57 +0200 Subject: [PATCH 039/579] Fetch and drop partitioning tables --- .../server/service/ttl/EdgeEventsCleanUpService.java | 1 - .../server/dao/sql/asset/AssetRepository.java | 3 --- .../server/dao/sql/edge/JpaBaseEdgeEventDao.java | 3 --- .../dao/sql/entityview/EntityViewRepository.java | 3 --- .../server/dao/sql/entityview/JpaEntityViewDao.java | 3 --- .../server/dao/sql/relation/JpaRelationDao.java | 11 +++-------- .../server/dao/sql/tenant/TenantRepository.java | 3 --- .../dao/sql/usagerecord/ApiUsageStateRepository.java | 3 --- .../dao/sql/usagerecord/JpaApiUsageStateDao.java | 3 --- .../server/dao/sql/widget/JpaWidgetTypeDao.java | 3 --- .../server/dao/sql/widget/JpaWidgetsBundleDao.java | 3 --- .../dao/sql/widget/WidgetsBundleRepository.java | 4 ---- .../sqlts/insert/sql/SqlPartitioningRepository.java | 5 +++-- dao/src/main/resources/sql/schema-ts-psql.sql | 8 ++++---- 14 files changed, 10 insertions(+), 46 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/ttl/EdgeEventsCleanUpService.java b/application/src/main/java/org/thingsboard/server/service/ttl/EdgeEventsCleanUpService.java index 8b38ca32bb..dfa8f36a3e 100644 --- a/application/src/main/java/org/thingsboard/server/service/ttl/EdgeEventsCleanUpService.java +++ b/application/src/main/java/org/thingsboard/server/service/ttl/EdgeEventsCleanUpService.java @@ -20,7 +20,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; -import org.thingsboard.server.dao.edge.EdgeEventDao; import org.thingsboard.server.dao.edge.EdgeEventService; import org.thingsboard.server.dao.sqlts.insert.sql.SqlPartitioningRepository; import org.thingsboard.server.queue.discovery.PartitionService; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java index e475864684..be36ce7dd1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java @@ -30,9 +30,6 @@ import org.thingsboard.server.dao.model.sql.AssetInfoEntity; import java.util.List; import java.util.UUID; -/** - * Created by Valerii Sosliuk on 5/21/2017. - */ public interface AssetRepository extends JpaRepository, ExportableEntityRepository { @Query("SELECT new org.thingsboard.server.dao.model.sql.AssetInfoEntity(a, c.title, c.additionalInfo, p.name) " + diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java index ea2abbba8a..e30946f744 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java @@ -86,9 +86,6 @@ public class JpaBaseEdgeEventDao extends JpaPartitionedAbstractDao queue; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java index 6094e9b171..b460699b22 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java @@ -29,9 +29,6 @@ import org.thingsboard.server.dao.model.sql.EntityViewInfoEntity; import java.util.List; import java.util.UUID; -/** - * Created by Victor Basanets on 8/31/2017. - */ public interface EntityViewRepository extends JpaRepository, ExportableEntityRepository { @Query("SELECT new org.thingsboard.server.dao.model.sql.EntityViewInfoEntity(e, c.title, c.additionalInfo) " + diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java index 44d8a09ff4..dd9f302588 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java @@ -44,9 +44,6 @@ import java.util.UUID; import static org.thingsboard.server.dao.DaoUtil.convertTenantEntityTypesToDto; -/** - * Created by Victor Basanets on 8/31/2017. - */ @Component @Slf4j @SqlDao diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java index 7417418f54..3d9115dda0 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java @@ -49,9 +49,6 @@ import static org.thingsboard.server.dao.model.ModelConstants.RELATION_TYPE_GROU import static org.thingsboard.server.dao.model.ModelConstants.RELATION_TYPE_PROPERTY; import static org.thingsboard.server.dao.model.ModelConstants.VERSION_COLUMN; -/** - * Created by Valerii Sosliuk on 5/29/2017. - */ @Slf4j @Component @SqlDao @@ -256,9 +253,7 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple if (!CollectionUtils.isEmpty(relationTypeGroups)) { sqlBuilder.append("AND relation_type_group IN (?"); - for (int i = 1; i < relationTypeGroups.size(); i++) { - sqlBuilder.append(", ?"); - } + sqlBuilder.append(", ?".repeat(Math.max(0, relationTypeGroups.size() - 1))); sqlBuilder.append(")"); params.addAll(relationTypeGroups); } @@ -285,12 +280,12 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple relation.setTypeGroup(RelationTypeGroup.valueOf((String) relationTypeGroup)); relation.setVersion((Long) version); return relation; - }) - .collect(Collectors.toList()); + }).toList(); } @Override public List findRuleNodeToRuleChainRelations(RuleChainType ruleChainType, int limit) { return DaoUtil.convertDataList(relationRepository.findRuleNodeToRuleChainRelations(ruleChainType, PageRequest.of(0, limit))); } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java index 08859d5f63..f424afaf39 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java @@ -28,9 +28,6 @@ import org.thingsboard.server.dao.model.sql.TenantInfoEntity; import java.util.List; import java.util.UUID; -/** - * Created by Valerii Sosliuk on 4/30/2017. - */ public interface TenantRepository extends JpaRepository { @Query("SELECT new org.thingsboard.server.dao.model.sql.TenantInfoEntity(t, p.name) " + diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/usagerecord/ApiUsageStateRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/usagerecord/ApiUsageStateRepository.java index 98e62fc110..b3afa997c9 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/usagerecord/ApiUsageStateRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/usagerecord/ApiUsageStateRepository.java @@ -29,9 +29,6 @@ import org.thingsboard.server.dao.model.sql.ApiUsageStateEntity; import java.util.List; import java.util.UUID; -/** - * @author Valerii Sosliuk - */ public interface ApiUsageStateRepository extends JpaRepository { @Query("SELECT ur FROM ApiUsageStateEntity ur WHERE ur.tenantId = :tenantId " + diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/usagerecord/JpaApiUsageStateDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/usagerecord/JpaApiUsageStateDao.java index ec68fa34c3..83f9c0693c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/usagerecord/JpaApiUsageStateDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/usagerecord/JpaApiUsageStateDao.java @@ -34,9 +34,6 @@ import org.thingsboard.server.dao.util.SqlDao; import java.util.List; import java.util.UUID; -/** - * @author Andrii Shvaika - */ @Component @SqlDao public class JpaApiUsageStateDao extends JpaAbstractDao implements ApiUsageStateDao { diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java index 18fb544dcb..900e508736 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java @@ -53,9 +53,6 @@ import java.util.stream.Collectors; import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; -/** - * Created by Valerii Sosliuk on 4/29/2017. - */ @Component @SqlDao public class JpaWidgetTypeDao extends JpaAbstractDao implements WidgetTypeDao, TenantEntityDao { diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java index bc81be054a..d3f5e9c208 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java @@ -42,9 +42,6 @@ import java.util.UUID; import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; -/** - * Created by Valerii Sosliuk on 4/23/2017. - */ @Component @SqlDao public class JpaWidgetsBundleDao extends JpaAbstractDao implements WidgetsBundleDao, TenantEntityDao { diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java index de778588dd..3033154484 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java @@ -21,7 +21,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import org.thingsboard.server.common.data.edqs.fields.WidgetTypeFields; import org.thingsboard.server.common.data.edqs.fields.WidgetsBundleFields; import org.thingsboard.server.dao.ExportableEntityRepository; import org.thingsboard.server.dao.model.sql.WidgetsBundleEntity; @@ -29,9 +28,6 @@ import org.thingsboard.server.dao.model.sql.WidgetsBundleEntity; import java.util.List; import java.util.UUID; -/** - * Created by Valerii Sosliuk on 4/23/2017. - */ public interface WidgetsBundleRepository extends JpaRepository, ExportableEntityRepository { WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/sql/SqlPartitioningRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/sql/SqlPartitioningRepository.java index f9b0be2395..55ecb9269d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/sql/SqlPartitioningRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/sql/SqlPartitioningRepository.java @@ -41,7 +41,7 @@ public class SqlPartitioningRepository { @Autowired private JdbcTemplate jdbcTemplate; - private static final String SELECT_PARTITIONS_STMT = "SELECT tablename from pg_tables WHERE schemaname = 'public' and tablename like concat(?, '_%')"; + private static final String SELECT_PARTITIONS_STMT = "SELECT tablename from pg_tables WHERE schemaname = current_schema() and tablename like concat(?, '_%')"; private static final int PSQL_VERSION_14 = 140000; private volatile Integer currentServerVersion; @@ -54,7 +54,8 @@ public class SqlPartitioningRepository { getJdbcTemplate().execute(partition.getQuery()); } - @Transactional(propagation = Propagation.NOT_SUPPORTED) // executing non-transactionally, so that parent transaction is not aborted on partition save error + @Transactional(propagation = Propagation.NOT_SUPPORTED) + // executing non-transactionally, so that parent transaction is not aborted on partition save error public void createPartitionIfNotExists(String table, long entityTs, long partitionDurationMs) { long partitionStartTs = calculatePartitionStartTime(entityTs, partitionDurationMs); Map partitions = tablesPartitions.computeIfAbsent(table, t -> new ConcurrentHashMap<>()); diff --git a/dao/src/main/resources/sql/schema-ts-psql.sql b/dao/src/main/resources/sql/schema-ts-psql.sql index 1c88ca5604..08dfa315c9 100644 --- a/dao/src/main/resources/sql/schema-ts-psql.sql +++ b/dao/src/main/resources/sql/schema-ts-psql.sql @@ -72,7 +72,7 @@ BEGIN IF partition_type = 'YEARS' THEN FOR partition IN SELECT tablename FROM pg_tables - WHERE schemaname = 'public' + WHERE schemaname = current_schema() AND tablename like 'ts_kv_' || '%' AND tablename != 'ts_kv_latest' AND tablename != 'key_dictionary' @@ -93,7 +93,7 @@ BEGIN ELSE FOR partition IN SELECT tablename FROM pg_tables - WHERE schemaname = 'public' + WHERE schemaname = current_schema() AND tablename like 'ts_kv_' || '%' AND tablename != 'ts_kv_latest' AND tablename != 'key_dictionary' @@ -135,7 +135,7 @@ BEGIN ELSE FOR partition IN SELECT tablename FROM pg_tables - WHERE schemaname = 'public' + WHERE schemaname = current_schema() AND tablename like 'ts_kv_' || '%' AND tablename != 'ts_kv_latest' AND tablename != 'key_dictionary' @@ -205,7 +205,7 @@ BEGIN IF partition IS NOT NULL THEN IF NOT EXISTS(SELECT FROM pg_tables - WHERE schemaname = 'public' + WHERE schemaname = current_schema() AND tablename = partition) THEN partition := NULL; RAISE NOTICE 'Failed to found partition by ttl'; From 9684a1e8ad16300de6cbcf40348179cb57f139a1 Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Wed, 17 Dec 2025 17:42:32 +0200 Subject: [PATCH 040/579] Revert --- .../server/dao/sqlts/insert/sql/SqlPartitioningRepository.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/sql/SqlPartitioningRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/sql/SqlPartitioningRepository.java index 55ecb9269d..0a7cf237c8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/sql/SqlPartitioningRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/sql/SqlPartitioningRepository.java @@ -54,8 +54,7 @@ public class SqlPartitioningRepository { getJdbcTemplate().execute(partition.getQuery()); } - @Transactional(propagation = Propagation.NOT_SUPPORTED) - // executing non-transactionally, so that parent transaction is not aborted on partition save error + @Transactional(propagation = Propagation.NOT_SUPPORTED)// executing non-transactionally, so that parent transaction is not aborted on partition save error public void createPartitionIfNotExists(String table, long entityTs, long partitionDurationMs) { long partitionStartTs = calculatePartitionStartTime(entityTs, partitionDurationMs); Map partitions = tablesPartitions.computeIfAbsent(table, t -> new ConcurrentHashMap<>()); From 1baaed8279c5dcd29ceed94fe3ad262cadbfc741 Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Wed, 17 Dec 2025 17:51:09 +0200 Subject: [PATCH 041/579] Improve EventsDeletionTaskProcessor to delete only non-debug types --- .../EventsDeletionTaskProcessor.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/housekeeper/processor/EventsDeletionTaskProcessor.java b/application/src/main/java/org/thingsboard/server/service/housekeeper/processor/EventsDeletionTaskProcessor.java index cd3953130f..8a0a1c882f 100644 --- a/application/src/main/java/org/thingsboard/server/service/housekeeper/processor/EventsDeletionTaskProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/housekeeper/processor/EventsDeletionTaskProcessor.java @@ -17,6 +17,11 @@ package org.thingsboard.server.service.housekeeper.processor; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +import org.thingsboard.server.common.data.event.ErrorEventFilter; +import org.thingsboard.server.common.data.event.EventFilter; +import org.thingsboard.server.common.data.event.EventType; +import org.thingsboard.server.common.data.event.LifeCycleEventFilter; +import org.thingsboard.server.common.data.event.StatisticsEventFilter; import org.thingsboard.server.common.data.housekeeper.HousekeeperTask; import org.thingsboard.server.common.data.housekeeper.HousekeeperTaskType; import org.thingsboard.server.dao.event.EventService; @@ -29,7 +34,22 @@ public class EventsDeletionTaskProcessor extends HousekeeperTaskProcessor new ErrorEventFilter(); + case LC_EVENT -> new LifeCycleEventFilter(); + case STATS -> new StatisticsEventFilter(); + default -> throw new IllegalArgumentException("Unexpected non-debug event type: " + eventType); + }; } @Override From 6d945e3fe6d7fbe8863c0f47a79e737d296ceec9 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Wed, 17 Dec 2025 18:08:09 +0200 Subject: [PATCH 042/579] UI: Improved text to show debug events in panel --- .../home/components/alarm-rules/alarm-rules-table-config.ts | 2 +- .../calculated-fields/calculated-fields-table-config.ts | 2 +- .../modules/home/pages/rulechain/rulechain-page.component.ts | 2 +- ui-ngx/src/assets/locale/locale.constant-en_US.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts index b242fd9701..e9ba2dd92f 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts @@ -71,7 +71,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig { readonly tenantId = getCurrentAuthUser(this.store).tenantId; additionalDebugActionConfig = { - title: this.translate.instant('calculated-fields.see-debug-events'), + title: this.translate.instant('action.see-debug-events'), action: (calculatedField: CalculatedField) => this.openDebugEventsDialog.call(this, calculatedField), }; diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts index c8732eddf3..56a3cc2a45 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts @@ -72,7 +72,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig this.openDebugEventsDialog.call(this, null, calculatedField), }; diff --git a/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.ts b/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.ts index 7f751a0bfe..ac011bccf7 100644 --- a/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.ts +++ b/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.ts @@ -1660,7 +1660,7 @@ export class RuleChainPageComponent extends PageComponent get additionalActionConfig (): AdditionalDebugActionConfig { return { - title: this.translate.instant('rulenode.rule-node-events'), + title: this.translate.instant('action.see-debug-events'), action: this.switchToEventsTab.bind(this) } } 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 960d3d3857..6495a4a480 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -78,6 +78,7 @@ "show-more": "Show more", "dont-show-again": "Do not show again", "see-documentation": "See documentation", + "see-debug-events": "See debug events", "clear": "Clear", "upload": "Upload", "delete-anyway": "Delete anyway", @@ -1132,7 +1133,6 @@ "argument-owner": "Current owner", "argument-relation-query": "Related entities", "argument-type": "Argument type", - "see-debug-events": "See debug events", "attribute": "Attribute", "copy-argument-name": "Copy argument name", "timeseries-key": "Time series key", From 68b96e576c5abcac825e4e5c1055ea1c08c8e9ae Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Thu, 18 Dec 2025 08:53:36 +0200 Subject: [PATCH 043/579] added clear error message when invalid attribute scope --- .../telemetry/TbCalculatedFieldsNode.java | 23 +- .../telemetry/TbCalculatedFieldsNodeTest.java | 198 ++++++++++++++++++ 2 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbCalculatedFieldsNodeTest.java diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbCalculatedFieldsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbCalculatedFieldsNode.java index 9d91802f8b..ffc9e54d24 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbCalculatedFieldsNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbCalculatedFieldsNode.java @@ -25,6 +25,7 @@ import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TimeseriesSaveRequest; import org.thingsboard.server.common.adaptor.JsonConverter; import org.thingsboard.server.common.data.AttributeScope; +import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.kv.BasicTsKvEntry; import org.thingsboard.server.common.data.kv.KvEntry; @@ -101,11 +102,15 @@ public class TbCalculatedFieldsNode implements TbNode { ctx.tellSuccess(msg); return; } + AttributeScope scope = resolveScope(ctx, msg); + if (scope == null) { + return; + } AttributesSaveRequest attributesSaveRequest = AttributesSaveRequest.builder() .tenantId(ctx.getTenantId()) .entityId(msg.getOriginator()) - .scope(AttributeScope.valueOf(msg.getMetaData().getValue(SCOPE))) + .scope(scope) .entries(newAttributes) .strategy(AttributesSaveRequest.Strategy.CF_ONLY) .previousCalculatedFieldIds(msg.getPreviousCalculatedFieldIds()) @@ -116,4 +121,20 @@ public class TbCalculatedFieldsNode implements TbNode { ctx.getTelemetryService().saveAttributes(attributesSaveRequest); } + private AttributeScope resolveScope(TbContext ctx, TbMsg msg) { + String scopeStr = msg.getMetaData().getValue(SCOPE); + + if (StringUtils.isEmpty(scopeStr)) { + ctx.tellFailure(msg, new IllegalArgumentException("Attribute scope is missing")); + return null; + } + + try { + return AttributeScope.valueOf(scopeStr); + } catch (IllegalArgumentException e) { + ctx.tellFailure(msg, new IllegalArgumentException("Invalid attribute scope: " + scopeStr)); + return null; + } + } + } diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbCalculatedFieldsNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbCalculatedFieldsNodeTest.java new file mode 100644 index 0000000000..755f282dde --- /dev/null +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbCalculatedFieldsNodeTest.java @@ -0,0 +1,198 @@ +/** + * Copyright © 2016-2025 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. + */ +package org.thingsboard.rule.engine.telemetry; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.rule.engine.api.AttributesSaveRequest; +import org.thingsboard.rule.engine.api.EmptyNodeConfiguration; +import org.thingsboard.rule.engine.api.RuleEngineTelemetryService; +import org.thingsboard.rule.engine.api.TbContext; +import org.thingsboard.rule.engine.api.TbNodeConfiguration; +import org.thingsboard.rule.engine.api.TimeseriesSaveRequest; +import org.thingsboard.server.common.data.AttributeScope; +import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.msg.TbMsgType; +import org.thingsboard.server.common.msg.TbMsg; +import org.thingsboard.server.common.msg.TbMsgMetaData; + +import java.util.Map; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.assertArg; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.BDDMockito.then; +import static org.mockito.Mockito.lenient; + +@ExtendWith(MockitoExtension.class) +class TbCalculatedFieldsNodeTest { + + final TenantId tenantId = TenantId.fromUUID(UUID.fromString("7361ca62-7688-4d78-b374-bc3d77e12dba")); + final DeviceId deviceId = new DeviceId(UUID.fromString("21c55f8d-0c5c-47b3-a344-9657e194b0f6")); + + @Spy + TbCalculatedFieldsNode node; + + @Mock + TbContext ctxMock; + @Mock + RuleEngineTelemetryService telemetryServiceMock; + + @BeforeEach + void setUp() { + lenient().when(ctxMock.getTenantId()).thenReturn(tenantId); + lenient().when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock); + var config = new EmptyNodeConfiguration().defaultConfiguration(); + node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); + } + + @ParameterizedTest + @EnumSource(TbMsgType.class) + void givenInvalidMsgType_whenOnMsg_thenTellFailure(TbMsgType msgType) { + if (TbMsgType.POST_TELEMETRY_REQUEST == msgType || TbMsgType.POST_ATTRIBUTES_REQUEST == msgType) { + return; + } + + // GIVEN + var msg = TbMsg.newMsg() + .type(msgType) + .originator(deviceId) + .data(JacksonUtil.newObjectNode().put("temperature", 22.3).toString()) + .metaData(TbMsgMetaData.EMPTY) + .build(); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + ArgumentCaptor actualError = ArgumentCaptor.forClass(Throwable.class); + then(ctxMock).should().tellFailure(eq(msg), actualError.capture()); + assertThat(actualError.getValue()) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Unsupported msg type: " + msg.getType()); + } + + @Test + void givenTelemetryMsg_whenOnMsg_thenPushToTelemetryService() { + // GIVEN + var msg = TbMsg.newMsg() + .type(TbMsgType.POST_TELEMETRY_REQUEST) + .originator(deviceId) + .data(JacksonUtil.newObjectNode().put("temperature", 22.3).toString()) + .metaData(TbMsgMetaData.EMPTY) + .build(); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + then(telemetryServiceMock).should().saveTimeseries(assertArg( + actualSaveRequest -> assertThat(actualSaveRequest.getStrategy()).isEqualTo(TimeseriesSaveRequest.Strategy.CF_ONLY) + )); + } + + @ParameterizedTest + @ValueSource(strings = {"POST_TELEMETRY_REQUEST", "POST_ATTRIBUTES_REQUEST"}) + void givenEmptyTelemetryOrAttributesMsg_whenOnMsg_thenTellSuccess(String msgType) { + // GIVEN + var msg = TbMsg.newMsg() + .type(TbMsgType.valueOf(msgType)) + .originator(deviceId) + .data(TbMsg.EMPTY_JSON_OBJECT) + .metaData(TbMsgMetaData.EMPTY) + .build(); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + then(ctxMock).should().tellSuccess(msg); + } + + @Test + void givenEmptyAttributeScope_whenOnMsg_thenTellFailure() { + // GIVEN + var msg = TbMsg.newMsg() + .type(TbMsgType.POST_ATTRIBUTES_REQUEST) + .originator(deviceId) + .data(JacksonUtil.newObjectNode().put("active", true).toString()) + .metaData(TbMsgMetaData.EMPTY) + .build(); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + ArgumentCaptor actualError = ArgumentCaptor.forClass(Throwable.class); + then(ctxMock).should().tellFailure(eq(msg), actualError.capture()); + assertThat(actualError.getValue()) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Attribute scope is missing"); + } + + @Test + void givenInvalidAttributeScope_whenOnMsg_thenTellFailure() { + // GIVEN + String invalidScope = "INVALID_SCOPE"; + var msg = TbMsg.newMsg() + .type(TbMsgType.POST_ATTRIBUTES_REQUEST) + .originator(deviceId) + .data(JacksonUtil.newObjectNode().put("active", true).toString()) + .metaData(new TbMsgMetaData(Map.of("scope", invalidScope))) + .build(); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + ArgumentCaptor actualError = ArgumentCaptor.forClass(Throwable.class); + then(ctxMock).should().tellFailure(eq(msg), actualError.capture()); + assertThat(actualError.getValue()) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Invalid attribute scope: " + invalidScope); + } + + @Test + void givenAttributesMsg_whenOnMsg_thenPushToTelemetryService() { + // GIVEN + var msg = TbMsg.newMsg() + .type(TbMsgType.POST_ATTRIBUTES_REQUEST) + .originator(deviceId) + .data(JacksonUtil.newObjectNode().put("active", true).toString()) + .metaData(new TbMsgMetaData(Map.of("scope", AttributeScope.SERVER_SCOPE.name()))) + .build(); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + then(telemetryServiceMock).should().saveAttributes(assertArg( + actualSaveRequest -> assertThat(actualSaveRequest.getStrategy()).isEqualTo(AttributesSaveRequest.Strategy.CF_ONLY) + )); + } + +} From 17761480c03d9373dac8145dea227b71e6321c9f Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Thu, 18 Dec 2025 16:15:54 +0200 Subject: [PATCH 044/579] fixed sorting by originatorDisplayName --- .../java/org/thingsboard/server/dao/model/ModelConstants.java | 2 ++ .../thingsboard/server/dao/sql/query/AlarmDataAdapter.java | 4 +++- .../server/dao/sql/query/DefaultAlarmQueryRepository.java | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java index 0cd80c0f3b..2c17dd0686 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java @@ -257,6 +257,8 @@ public class ModelConstants { public static final String ALARM_ORIGINATOR_NAME_PROPERTY = "originator_name"; public static final String ALARM_ORIGINATOR_LABEL_PROPERTY = "originator_label"; public static final String ALARM_ORIGINATOR_TYPE_PROPERTY = "originator_type"; + + public static final String ALARM_ORIGINATOR_DISPLAY_NAME_PROPERTY = "originator_display_name"; public static final String ALARM_SEVERITY_PROPERTY = "severity"; public static final String ALARM_ASSIGNEE_ID_PROPERTY = "assignee_id"; public static final String ALARM_ASSIGNEE_FIRST_NAME_PROPERTY = "assignee_first_name"; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/AlarmDataAdapter.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/AlarmDataAdapter.java index f3e2ba83a6..f701188064 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/AlarmDataAdapter.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/AlarmDataAdapter.java @@ -117,11 +117,13 @@ public class AlarmDataAdapter { String originatorName = originatorNameObj != null ? originatorNameObj.toString() : null; Object originatorLabelObj = row.get(ModelConstants.ALARM_ORIGINATOR_LABEL_PROPERTY); String originatorLabel = originatorLabelObj != null ? originatorLabelObj.toString() : null; + Object originatorDisplayNameObj = row.get(ModelConstants.ALARM_ORIGINATOR_DISPLAY_NAME_PROPERTY); + String originatorDisplayName = originatorDisplayNameObj != null ? originatorDisplayNameObj.toString() : null; AlarmData alarmData = new AlarmData(alarm, entityId); alarmData.setOriginatorName(originatorName); alarmData.setOriginatorLabel(originatorLabel); - alarmData.setOriginatorDisplayName(StringUtils.isBlank(originatorLabel) ? originatorName : originatorLabel); + alarmData.setOriginatorDisplayName(originatorDisplayName); if (alarm.getAssigneeId() != null) { alarmData.setAssignee(new AlarmAssignee(alarm.getAssigneeId(), assigneeFirstName, assigneeLastName, assigneeEmail)); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java index 62636a9ed0..1eec369795 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java @@ -83,6 +83,7 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository { alarmFieldColumnMap.put(ASSIGNEE_FIRST_NAME_KEY, ModelConstants.ALARM_ASSIGNEE_FIRST_NAME_PROPERTY); alarmFieldColumnMap.put(ASSIGNEE_LAST_NAME_KEY, ModelConstants.ALARM_ASSIGNEE_LAST_NAME_PROPERTY); alarmFieldColumnMap.put(ASSIGNEE_EMAIL_KEY, ModelConstants.ALARM_ASSIGNEE_EMAIL_PROPERTY); + alarmFieldColumnMap.put("originatorDisplayName", ModelConstants.ALARM_ORIGINATOR_DISPLAY_NAME_PROPERTY); } private static final String FIELDS_SELECTION = "select a.id as id," + @@ -106,6 +107,7 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository { " a.type as type, " + " a.originator_name as originator_name, " + " a.originator_label as originator_label, " + + " coalesce(a.originator_label, a.originator_label) as originator_display_name, " + " a.assignee_first_name as assignee_first_name, " + " a.assignee_last_name as assignee_last_name, " + " a.assignee_email as assignee_email, " + From dc8d2d896af9b49d353d0ded2428bdc517aa4cc3 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Thu, 18 Dec 2025 16:24:31 +0200 Subject: [PATCH 045/579] fixed query --- .../java/org/thingsboard/server/dao/model/ModelConstants.java | 1 - .../server/dao/sql/query/DefaultAlarmQueryRepository.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java index 2c17dd0686..16493b90fd 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java @@ -257,7 +257,6 @@ public class ModelConstants { public static final String ALARM_ORIGINATOR_NAME_PROPERTY = "originator_name"; public static final String ALARM_ORIGINATOR_LABEL_PROPERTY = "originator_label"; public static final String ALARM_ORIGINATOR_TYPE_PROPERTY = "originator_type"; - public static final String ALARM_ORIGINATOR_DISPLAY_NAME_PROPERTY = "originator_display_name"; public static final String ALARM_SEVERITY_PROPERTY = "severity"; public static final String ALARM_ASSIGNEE_ID_PROPERTY = "assignee_id"; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java index 1eec369795..a41961768a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java @@ -107,7 +107,7 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository { " a.type as type, " + " a.originator_name as originator_name, " + " a.originator_label as originator_label, " + - " coalesce(a.originator_label, a.originator_label) as originator_display_name, " + + " coalesce(a.originator_label, a.originator_name) as originator_display_name, " + " a.assignee_first_name as assignee_first_name, " + " a.assignee_last_name as assignee_last_name, " + " a.assignee_email as assignee_email, " + From 550c65dc938f6049d73bcd29a292ce6438fe6c4f Mon Sep 17 00:00:00 2001 From: Nikita Mazurenko Date: Thu, 18 Dec 2025 17:20:53 +0200 Subject: [PATCH 046/579] Fix DeviceProfile copy constructor --- .../java/org/thingsboard/server/common/data/DeviceProfile.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfile.java b/common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfile.java index 6f31cda6aa..7d9b4e1502 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfile.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfile.java @@ -114,6 +114,9 @@ public class DeviceProfile extends BaseData implements HasName, this.description = deviceProfile.getDescription(); this.image = deviceProfile.getImage(); this.isDefault = deviceProfile.isDefault(); + this.type = deviceProfile.getType(); + this.transportType = deviceProfile.getTransportType(); + this.provisionType = deviceProfile.getProvisionType(); this.defaultRuleChainId = deviceProfile.getDefaultRuleChainId(); this.defaultDashboardId = deviceProfile.getDefaultDashboardId(); this.defaultQueueName = deviceProfile.getDefaultQueueName(); From 674c6d6c88148307c113ec080f38cd37026ca9cf Mon Sep 17 00:00:00 2001 From: Nikita Mazurenko Date: Thu, 18 Dec 2025 17:22:45 +0200 Subject: [PATCH 047/579] Fix deviceProfile sync for edges with version < 4.3 --- .../service/edge/EdgeMsgConstructorUtils.java | 34 +++++++++++++++++-- .../processor/device/DeviceEdgeProcessor.java | 2 +- .../profile/DeviceProfileEdgeProcessor.java | 3 +- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java index 6b50b8ae15..e1c7f1198c 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java @@ -51,6 +51,8 @@ import org.thingsboard.server.common.data.alarm.AlarmComment; import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.asset.AssetProfile; import org.thingsboard.server.common.data.cf.CalculatedField; +import org.thingsboard.server.common.data.device.profile.DeviceProfileTransportConfiguration; +import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.domain.DomainInfo; import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.EdgeEvent; @@ -261,12 +263,40 @@ public class EdgeMsgConstructorUtils { return DeviceCredentialsUpdateMsg.newBuilder().setEntity(JacksonUtil.toString(deviceCredentials)).build(); } - public static DeviceProfileUpdateMsg constructDeviceProfileUpdatedMsg(UpdateMsgType msgType, DeviceProfile deviceProfile) { - return DeviceProfileUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(deviceProfile)) + public static DeviceProfileUpdateMsg constructDeviceProfileUpdatedMsg(UpdateMsgType msgType, DeviceProfile deviceProfile, EdgeVersion edgeVersion) { + String entity = getEntityAndFixLwm2mBootstrapShortServerId(deviceProfile, edgeVersion); + return DeviceProfileUpdateMsg.newBuilder().setMsgType(msgType).setEntity(entity) .setIdMSB(deviceProfile.getId().getId().getMostSignificantBits()) .setIdLSB(deviceProfile.getId().getId().getLeastSignificantBits()).build(); } + public static String getEntityAndFixLwm2mBootstrapShortServerId(DeviceProfile deviceProfile, EdgeVersion edgeVersion) { + DeviceProfileTransportConfiguration transportConfiguration = deviceProfile.getProfileData().getTransportConfiguration(); + if (!(transportConfiguration instanceof Lwm2mDeviceProfileTransportConfiguration) || edgeVersion.getNumber() >= EdgeVersion.V_4_3_0.getNumber()) { + return JacksonUtil.toString(deviceProfile); + } + JsonNode jsonNode = JacksonUtil.valueToTree(deviceProfile); + JsonNode profileDataNode = jsonNode.get("profileData"); + if (profileDataNode != null && profileDataNode.has("transportConfiguration")) { + JsonNode transportConfigNode = profileDataNode.get("transportConfiguration"); + JsonNode bootstrapNode = transportConfigNode.get("bootstrap"); + if (bootstrapNode != null && bootstrapNode.isArray()) { + for (JsonNode bootstrapServerNode : bootstrapNode) { + if (bootstrapServerNode.isObject()) { + ObjectNode serverObjectNode = (ObjectNode) bootstrapServerNode; + JsonNode isBootstrapNode = serverObjectNode.get("bootstrapServerIs"); + boolean isBootstrapServer = isBootstrapNode != null && isBootstrapNode.asBoolean(false); + JsonNode shortServerIdNode = serverObjectNode.get("shortServerId"); + if (isBootstrapServer && (shortServerIdNode == null || shortServerIdNode.isNull())) { + serverObjectNode.put("shortServerId", 0); + } + } + } + } + } + return JacksonUtil.toString(jsonNode); + } + public static DeviceProfileUpdateMsg constructDeviceProfileDeleteMsg(DeviceProfileId deviceProfileId) { return DeviceProfileUpdateMsg.newBuilder() .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java index 2f655d961b..70b8f80fb1 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java @@ -237,7 +237,7 @@ public class DeviceEdgeProcessor extends BaseDeviceProcessor implements DevicePr if (UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE.equals(msgType)) { DeviceProfile deviceProfile = edgeCtx.getDeviceProfileService().findDeviceProfileById(edgeEvent.getTenantId(), device.getDeviceProfileId()); - builder.addDeviceProfileUpdateMsg(EdgeMsgConstructorUtils.constructDeviceProfileUpdatedMsg(msgType, deviceProfile)); + builder.addDeviceProfileUpdateMsg(EdgeMsgConstructorUtils.constructDeviceProfileUpdatedMsg(msgType, deviceProfile, edgeVersion)); } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/profile/DeviceProfileEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/profile/DeviceProfileEdgeProcessor.java index 540fd4b448..6f781d9492 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/profile/DeviceProfileEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/profile/DeviceProfileEdgeProcessor.java @@ -102,7 +102,7 @@ public class DeviceProfileEdgeProcessor extends BaseDeviceProfileProcessor imple DeviceProfile deviceProfile = edgeCtx.getDeviceProfileService().findDeviceProfileById(edgeEvent.getTenantId(), deviceProfileId); if (deviceProfile != null) { UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction()); - DeviceProfileUpdateMsg deviceProfileUpdateMsg = EdgeMsgConstructorUtils.constructDeviceProfileUpdatedMsg(msgType, deviceProfile); + DeviceProfileUpdateMsg deviceProfileUpdateMsg = EdgeMsgConstructorUtils.constructDeviceProfileUpdatedMsg(msgType, deviceProfile, edgeVersion); return DownlinkMsg.newBuilder() .setDownlinkMsgId(EdgeUtils.nextPositiveInt()) .addDeviceProfileUpdateMsg(deviceProfileUpdateMsg) @@ -141,5 +141,4 @@ public class DeviceProfileEdgeProcessor extends BaseDeviceProfileProcessor imple public EdgeEventType getEdgeEventType() { return EdgeEventType.DEVICE_PROFILE; } - } From f814a52faf82833d8a84672fd86f4719354d296d Mon Sep 17 00:00:00 2001 From: Nikita Mazurenko Date: Thu, 18 Dec 2025 17:26:09 +0200 Subject: [PATCH 048/579] Fix synchronization between 'profileData' and 'profileDataBytes' after shortServerId update --- .../dao/service/validator/DeviceProfileDataValidator.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java index 9fac76704c..28d7d598ab 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java @@ -174,6 +174,8 @@ public class DeviceProfileDataValidator extends AbstractHasOtaPackageValidator Date: Thu, 18 Dec 2025 17:42:28 +0200 Subject: [PATCH 049/579] Added normalization of y-axis limit in chart initialization --- .../widget/lib/chart/time-series-chart.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/chart/time-series-chart.ts b/ui-ngx/src/app/modules/home/components/widget/lib/chart/time-series-chart.ts index 8568e4b13b..f52bf13ada 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/chart/time-series-chart.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/chart/time-series-chart.ts @@ -581,6 +581,8 @@ export class TbTimeSeriesChart { yAxisSettingsList.sort((a1, a2) => a1.order - a2.order); const axisLimitDatasources: Datasource[] = []; for (const yAxisSettings of yAxisSettingsList) { + yAxisSettings.min = this.normalizeAxisLimit(yAxisSettings.min); + yAxisSettings.max = this.normalizeAxisLimit(yAxisSettings.max); const axisSettings = mergeDeep({} as TimeSeriesChartYAxisSettings, defaultTimeSeriesChartYAxisSettings, yAxisSettings); const units = isNotEmptyTbUnits(axisSettings.units) ? axisSettings.units : this.ctx.units; @@ -1078,4 +1080,21 @@ export class TbTimeSeriesChart { this.timeSeriesChart.setOption(this.timeSeriesChartOptions); } } + + private normalizeAxisLimit(limit: string | number | ValueSourceConfig): string | number | ValueSourceConfig { + if (!limit) { + return { + type: ValueSourceType.constant, + value: null, + entityAlias: null + }; + } else if (typeof limit === 'number' || typeof limit === 'string') { + return { + type: ValueSourceType.constant, + value: Number(limit), + entityAlias: null + }; + } + return limit; + } } From 8bf9e62a8ef06f7d5237b2b4dc22fbb438d19bf6 Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Thu, 18 Dec 2025 17:44:23 +0200 Subject: [PATCH 050/579] UI: Fixed action color and add new style for table timewindow --- ui-ngx/src/assets/dashboard/api_usage.json | 23 +++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/ui-ngx/src/assets/dashboard/api_usage.json b/ui-ngx/src/assets/dashboard/api_usage.json index cad63bd3e0..f4d5892f61 100644 --- a/ui-ngx/src/assets/dashboard/api_usage.json +++ b/ui-ngx/src/assets/dashboard/api_usage.json @@ -121,7 +121,24 @@ "noDataDisplayMessage": "", "configMode": "basic", "borderRadius": "12px", - "titleColor": "rgba(0, 0, 0, 0.54)" + "titleColor": "rgba(0, 0, 0, 0.54)", + "timewindowStyle": { + "showIcon": false, + "iconSize": "24px", + "icon": "query_builder", + "iconPosition": "left", + "font": { + "size": 12, + "sizeUnit": "px", + "family": "Roboto", + "weight": "400", + "style": "normal", + "lineHeight": "16px" + }, + "color": "rgba(0, 0, 0, 0.38)", + "displayTypePrefix": true + }, + "titleFont": null }, "id": "a669cf86-e715-efa4-dd9a-b839abf499e9", "typeFullFqn": "system.cards.timeseries_table" @@ -4519,7 +4536,7 @@ "name": "{i18n:api-usage.view-statistics}", "buttonType": "icon", "icon": "show_chart", - "buttonColor": "rgba(0, 0, 0, 0.87)", + "buttonColor": "rgba(0, 0, 0, 0.54)", "customButtonStyle": {}, "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", @@ -4955,7 +4972,7 @@ "name": "{i18n:api-usage.view-statistics}", "buttonType": "icon", "icon": "show_chart", - "buttonColor": "rgba(0, 0, 0, 0.87)", + "buttonColor": "rgba(0, 0, 0, 0.54)", "customButtonStyle": {}, "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", From 8bc4d462b8b3f2b8d9c2361f060d23ad83dc315e Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Thu, 18 Dec 2025 17:51:51 +0200 Subject: [PATCH 051/579] UI: Add title style --- ui-ngx/src/assets/dashboard/api_usage.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ui-ngx/src/assets/dashboard/api_usage.json b/ui-ngx/src/assets/dashboard/api_usage.json index f4d5892f61..226c570753 100644 --- a/ui-ngx/src/assets/dashboard/api_usage.json +++ b/ui-ngx/src/assets/dashboard/api_usage.json @@ -138,7 +138,14 @@ "color": "rgba(0, 0, 0, 0.38)", "displayTypePrefix": true }, - "titleFont": null + "titleFont": { + "size": 14, + "sizeUnit": "px", + "family": "Roboto", + "weight": "500", + "style": "normal", + "lineHeight": "20px" + } }, "id": "a669cf86-e715-efa4-dd9a-b839abf499e9", "typeFullFqn": "system.cards.timeseries_table" From 950656059287aa129309377e6a7b35441a4df489 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Thu, 18 Dec 2025 18:52:27 +0200 Subject: [PATCH 052/579] UI: Standardize filter button labels, filter panel and entity naming --- .../alarm-rule-dialog.component.html | 2 +- .../alarm-rule-filter-config.component.html | 4 +- .../alarm-rule-filter-config.component.scss | 1 - .../alarm-rule-filter-config.component.ts | 13 +-- .../alarm-rules/alarm-rules-table-config.ts | 8 +- .../alarm/alarm-filter-config.component.ts | 2 +- .../audit-log/audit-log-filter.component.html | 8 +- .../audit-log/audit-log-filter.component.scss | 9 ++ .../audit-log/audit-log-filter.component.ts | 25 ++++-- .../calculated-fields-table-config.ts | 6 +- .../calculated-field-dialog.component.html | 2 +- ...ulated-fields-filter-config.component.html | 10 +-- ...ulated-fields-filter-config.component.scss | 12 --- ...lculated-fields-filter-config.component.ts | 32 ++++--- .../device/device-info-filter.component.html | 53 +++++++----- .../device/device-info-filter.component.scss | 10 +++ .../device/device-info-filter.component.ts | 85 +++++++++++++------ ...device-profile-autocomplete.component.html | 9 +- .../device-profile-autocomplete.component.ts | 9 +- .../assets/locale/locale.constant-en_US.json | 23 ++--- 20 files changed, 198 insertions(+), 125 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html index d9bff11bf0..869b707d98 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html @@ -65,7 +65,7 @@ class="flex-1" showLabel required - label="{{ 'alarm-rule.target-entity-type' | translate }}" + label="{{ 'entity.entity-type' | translate }}" [filterAllowedEntityTypes]="false" [allowedEntityTypes]="alarmRuleEntityTypeList" formControlName="entityType"> diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.html index 5deddffd87..c9629f00a3 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.html @@ -66,7 +66,7 @@
-
alarm-rule.target-entity-type
+
entity.entity-type
{{ 'alarm-rule.any-type' | translate }} @@ -78,7 +78,7 @@
@if (alarmRuleFilterConfigForm.get('entityType').value) {
-
alarm-rule.target-entities
+
entity.entities
{ this.defaultSortOrder = {property: 'createdTime', direction: Direction.DESC}; this.columns.push(new DateEntityTableColumn('createdTime', 'common.created-time', this.datePipe, '150px')); - this.columns.push(new EntityTableColumn('name', 'alarm-rule.alarm-type', this.pageMode ? '30%' :'33%', + this.columns.push(new EntityTableColumn('name', 'alarm-rule.alarm-type', '33%', entity => this.utilsService.customTranslation(entity.name, entity.name))); if (this.pageMode) { - this.columns.push(new EntityTableColumn('entityType', 'alarm-rule.target-entity-type', '15%', + this.columns.push(new EntityTableColumn('entityType', 'entity.entity-type', '10%', entity => this.translate.instant(entityTypeTranslations.get(entity.entityId.entityType).type))); - this.columns.push(new EntityLinkTableColumn('entityName', 'alarm-rule.target-entity', '30%', + this.columns.push(new EntityLinkTableColumn('entityName', 'entity.entity', '33%', entity => this.utilsService.customTranslation(entity['entityName'], entity['entityName']), entity => getEntityDetailsPageURL(entity.entityId?.id, entity.entityId?.entityType as EntityType), false)); } - this.columns.push(new EntityTableColumn('createRule', 'alarm-rule.severities', this.pageMode ? '15%' :'67%', + this.columns.push(new EntityTableColumn('createRule', 'alarm-rule.severities', this.pageMode ? '23%' : '67%', entity => Object.keys(entity.configuration.createRules).map((severity) => this.translate.instant(alarmSeverityTranslations.get(severity as AlarmSeverity))).join(', '), () => ({}), false)); this.columns.push(new EntityTableColumn('clearRule', 'alarm-rule.cleared', '90px', diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts index e90071299c..093858a500 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts @@ -107,7 +107,7 @@ export class AlarmFilterConfigComponent implements OnInit, OnDestroy, ControlVal alarmSeverityTranslationMap = alarmSeverityTranslations; - buttonDisplayValue = this.translate.instant('alarm.alarm-filter'); + buttonDisplayValue = this.translate.instant('alarm.alarm-filter-title'); alarmFilterConfigForm: UntypedFormGroup; diff --git a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.html b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.html index b97285ba07..8d53bdd99b 100644 --- a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.html +++ b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.html @@ -24,14 +24,14 @@ filter_list{{buttonDisplayValue}} -
-
-
+ +
+
audit-log.filter-types
diff --git a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.scss b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.scss index 77bd5aea60..ca52472aa1 100644 --- a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.scss +++ b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.scss @@ -33,3 +33,12 @@ } } } + +::ng-deep { + .tb-audit-log-config-component { + max-width: 100%; + width: 600px; + min-width: 100%; + flex: 1; + } +} diff --git a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.ts b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.ts index e78b38965d..f810eb5df7 100644 --- a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.ts +++ b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.ts @@ -16,16 +16,27 @@ import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay'; import { TemplatePortal } from '@angular/cdk/portal'; -import { ChangeDetectorRef, Component, DestroyRef, ElementRef, forwardRef, Input, OnInit, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core'; +import { + ChangeDetectorRef, + Component, + DestroyRef, + ElementRef, + forwardRef, + Input, + OnInit, + TemplateRef, + ViewChild, + ViewContainerRef +} from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { ControlValueAccessor, NG_VALUE_ACCESSOR, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; +import { ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR } from '@angular/forms'; import { isDefined, isDefinedAndNotNull } from '@app/core/utils'; import { StringItemsOption } from '@app/shared/components/string-items-list.component'; import { ActionType, actionTypeTranslations, - auditLogFilterEquals, AuditLogFilter, + auditLogFilterEquals, POSITION_MAP, } from '@app/shared/public-api'; import { TranslateService } from '@ngx-translate/core'; @@ -56,9 +67,9 @@ export class AuditLogFilterComponent implements OnInit, ControlValueAccessor { actionTypeTranslations = actionTypeTranslations; - buttonDisplayValue = this.translate.instant('audit-log.filter'); + buttonDisplayValue = this.translate.instant('audit-log.audit-log-filter-title'); - auditLogFilterForm: UntypedFormGroup; + auditLogFilterForm: FormGroup; auditLogOverlayRef: OverlayRef; @@ -68,7 +79,7 @@ export class AuditLogFilterComponent implements OnInit, ControlValueAccessor { private propagateChange = (_: any) => {}; - constructor(private fb: UntypedFormBuilder, + constructor(private fb: FormBuilder, private translate: TranslateService, private overlay: Overlay, private nativeElement: ElementRef, @@ -93,7 +104,7 @@ export class AuditLogFilterComponent implements OnInit, ControlValueAccessor { this.propagateChange = fn; } - registerOnTouched(fn: any): void { + registerOnTouched(_fn: any): void { } setDisabledState(isDisabled: boolean): void { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts index 56a3cc2a45..e5c57aae2e 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts @@ -136,11 +136,13 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig('name', 'common.name', this.pageMode ? '33%' : '60%', entity => this.utilsService.customTranslation(entity.name, entity.name))); if (this.pageMode) { - this.columns.push(new EntityLinkTableColumn('entityName', 'calculated-fields.target-entity', '33%', + this.columns.push(new EntityTableColumn('entityType', 'entity.entity-type', '10%', + entity => this.translate.instant(entityTypeTranslations.get(entity.entityId.entityType).type))); + this.columns.push(new EntityLinkTableColumn('entityName', 'entity.entity', '33%', entity => this.utilsService.customTranslation(entity['entityName'], entity['entityName']), entity => getEntityDetailsPageURL(entity.entityId?.id, entity.entityId?.entityType as EntityType), false)); } - this.columns.push(new EntityTableColumn('type', 'common.type', this.pageMode ? '33%' : '40%', entity => this.translate.instant(CalculatedFieldTypeTranslations.get(entity.type).name), () => ({whiteSpace: 'nowrap' }))); + this.columns.push(new EntityTableColumn('type', 'common.type', this.pageMode ? '23%' : '40%', entity => this.translate.instant(CalculatedFieldTypeTranslations.get(entity.type).name), () => ({whiteSpace: 'nowrap' }))); this.cellActionDescriptors.push( { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html index 44c2e702e5..3d669b02c6 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html @@ -62,7 +62,7 @@ class="flex-1" showLabel required - label="{{ 'alarm-rule.target-entity-type' | translate }}" + label="{{ 'entity.entity-type' | translate }}" [filterAllowedEntityTypes]="false" [allowedEntityTypes]="calculatedFieldsEntityTypeList" formControlName="entityType"> diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.html index b3cc3b387a..5f4efea5b8 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.html @@ -21,18 +21,18 @@ -
+
-
alarm-rule.target-entity-type
+
entity.entity-type
{{ 'alarm-rule.any-type' | translate }} @@ -80,7 +80,7 @@
@if (cfFilterForm.get('entityType').value) {
-
alarm-rule.target-entities
+
entity.entities
this.translate.instant(CalculatedFieldTypeTranslations.get(type).name)).join(', ')); + } + if (this.cfFilterConfig?.entityType) { + filterTextParts.push(this.translate.instant( entityTypeTranslations.get(this.cfFilterConfig.entityType).type)); + } + if (!filterTextParts.length) { + this.buttonDisplayValue = this.translate.instant('calculated-fields.calculated-field-filter-title'); + } else { + this.buttonDisplayValue = this.translate.instant('calculated-fields.filter-title') + `: ${filterTextParts.join(', ')}`; + } + } + } + private cfFilterFromFormValue(formValue: any): CalculatedFieldsQuery { return { types: formValue?.types ?? [], diff --git a/ui-ngx/src/app/modules/home/components/device/device-info-filter.component.html b/ui-ngx/src/app/modules/home/components/device/device-info-filter.component.html index c7d97aae23..55b99d8a8d 100644 --- a/ui-ngx/src/app/modules/home/components/device/device-info-filter.component.html +++ b/ui-ngx/src/app/modules/home/components/device/device-info-filter.component.html @@ -33,6 +33,13 @@
+ + -
- -
+
+
+ audit-log.action-data +
- - -
+
+ audit-log.failure-details +
diff --git a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.scss b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.scss index 57bd26c8ba..5f029ce4f1 100644 --- a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.scss +++ b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.scss @@ -13,13 +13,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +@import '../../../../../scss/constants'; + :host { - .tb-audit-log-action-data, - .tb-audit-log-failure-details { - width: 100%; - min-width: 400px; - height: 100%; - min-height: 50px; + display: grid; + height: 100%; + max-width: 100%; + max-height: 100vh; + grid-template-rows: min-content minmax(auto, 1fr) min-content; + + @media #{$mat-gt-xs} { + .mat-mdc-dialog-content { + max-height: 80vh; + } + } + + .tb-audit-log { + min-width: max(400px, 100%); border: 1px solid #c0c0c0; + @media #{$mat-xs} { + min-width: 100%; + } } } diff --git a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.ts b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.ts index c888fafebc..e3d8bbc582 100644 --- a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.ts @@ -22,7 +22,11 @@ import { ActionStatus, AuditLog } from '@shared/models/audit-log.models'; import { Ace } from 'ace-builds'; import { DialogComponent } from '@shared/components/dialog.component'; import { Router } from '@angular/router'; -import { getAce } from '@shared/models/ace/ace.models'; +import { getAce, updateEditorSize } from '@shared/models/ace/ace.models'; +import { Observable, of } from 'rxjs'; +import { isObject } from '@core/utils'; +import { ContentType, contentTypesMap } from '@shared/models/constants'; +import { beautifyJs } from '@shared/models/beautify.models'; export interface AuditLogDetailsDialogData { auditLog: AuditLog; @@ -41,11 +45,10 @@ export class AuditLogDetailsDialogComponent extends DialogComponent, protected router: Router, @@ -58,12 +61,10 @@ export class AuditLogDetailsDialogComponent extends DialogComponent = { - mode: 'ace/mode/java', - theme: 'ace/theme/github', - showGutter: false, - showPrintMargin: false, - readOnly: true - }; - - const advancedOptions = { - enableSnippets: false, - enableBasicAutocompletion: false, - enableLiveAutocompletion: false - }; - - editorOptions = {...editorOptions, ...advancedOptions}; - getAce().subscribe( - (ace) => { - const editor = ace.edit(editorElement, editorOptions); - this.aceEditors.push(editor); - editor.session.setUseWrapMode(false); - editor.setValue(content, -1); - this.updateEditorSize(editorElement, content, editor); - } - ); - } - - updateEditorSize(editorElement: any, content: string, editor: Ace.Editor) { - let newHeight = 200; - let newWidth = 600; - if (content && content.length > 0) { - const lines = content.split('\n'); - newHeight = 18 * lines.length + 16; - let maxLineLength = 0; - lines.forEach((row) => { - const line = row.replace(/\t/g, ' ').replace(/\n/g, ''); - const lineLength = line.length; - maxLineLength = Math.max(maxLineLength, lineLength); - }); - newWidth = 9 * maxLineLength + 16; + let mode = 'java'; + let content$: Observable = null; + let contentType = ContentType.TEXT; + if (content && isObject(content)) { + contentType = ContentType.JSON; + mode = contentTypesMap.get(contentType).code; + content$ = beautifyJs(JSON.stringify(content), {indent_size: 2}); + } + if (!content$) { + content$ = of(content as string); } - // newHeight = Math.min(400, newHeight); - this.renderer.setStyle(editorElement, 'minHeight', newHeight.toString() + 'px'); - this.renderer.setStyle(editorElement, 'height', newHeight.toString() + 'px'); - this.renderer.setStyle(editorElement, 'width', newWidth.toString() + 'px'); - editor.resize(); + content$.subscribe((processedContent) => { + const isJSON = contentType === ContentType.JSON + const editorOptions: Partial = { + mode: `ace/mode/${mode}`, + theme: 'ace/theme/github', + showGutter: isJSON, + showFoldWidgets: true, + foldStyle: 'markbeginend', + showPrintMargin: false, + readOnly: true, + enableSnippets: false, + enableBasicAutocompletion: false, + enableLiveAutocompletion: false, + }; + getAce().subscribe( + (ace) => { + const editor = ace.edit(editorElement, editorOptions); + this.aceEditors.push(editor); + editor.session.setUseWrapMode(false); + editor.setValue(processedContent, -1); + updateEditorSize(editorElement, processedContent, editor, this.renderer, {showGutter: isJSON}); + } + ) + }); } } diff --git a/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.html b/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.html index 27280bfd9e..aa1f8754a5 100644 --- a/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.html @@ -24,8 +24,8 @@ close -
-
+
+
diff --git a/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.scss b/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.scss index 2dd61e2722..ee1ca74151 100644 --- a/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.scss +++ b/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.scss @@ -13,11 +13,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +@import '../../../../../scss/constants'; + :host { + display: grid; + height: 100%; + max-width: 100%; + max-height: 100vh; + grid-template-rows: min-content minmax(auto, 1fr) min-content; + + @media #{$mat-gt-xs} { + .mat-mdc-dialog-content { + max-height: 80vh; + } + } + .tb-event-content { - width: 100%; min-width: 400px; - height: 100%; - min-height: 50px; + &.border { + border: 1px solid #c0c0c0; + } + @media #{$mat-xs} { + min-width: 100%; + } } } diff --git a/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.ts b/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.ts index 2ae62dd890..9ca6ad8b43 100644 --- a/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.ts @@ -23,7 +23,7 @@ import { Ace } from 'ace-builds'; import { DialogComponent } from '@shared/components/dialog.component'; import { Router } from '@angular/router'; import { ContentType, contentTypesMap } from '@shared/models/constants'; -import { getAce } from '@shared/models/ace/ace.models'; +import { getAce, updateEditorSize } from '@shared/models/ace/ace.models'; import { Observable } from 'rxjs/internal/Observable'; import { beautifyJs } from '@shared/models/beautify.models'; import { of } from 'rxjs'; @@ -40,40 +40,38 @@ export interface EventContentDialogData { templateUrl: './event-content-dialog.component.html', styleUrls: ['./event-content-dialog.component.scss'] }) -export class EventContentDialogComponent extends DialogComponent implements OnInit, OnDestroy { +export class EventContentDialogComponent extends DialogComponent implements OnInit, OnDestroy { @ViewChild('eventContentEditor', {static: true}) eventContentEditorElmRef: ElementRef; - content: string; title: string; - contentType: ContentType; - aceEditor: Ace.Editor; + showBorder = false; + + private contentType: ContentType; + private aceEditor: Ace.Editor; constructor(protected store: Store, protected router: Router, @Inject(MAT_DIALOG_DATA) public data: EventContentDialogData, - public dialogRef: MatDialogRef, + protected dialogRef: MatDialogRef, private renderer: Renderer2) { super(store, router, dialogRef); } ngOnInit(): void { - this.content = this.data.content; this.title = this.data.title; this.contentType = this.data.contentType; - this.createEditor(this.eventContentEditorElmRef, this.content); + this.createEditor(this.eventContentEditorElmRef, this.data.content); } ngOnDestroy(): void { - if (this.aceEditor) { - this.aceEditor.destroy(); - } + this.aceEditor?.destroy(); super.ngOnDestroy(); } - isJson(str) { + private isJson(str: string) { try { return isLiteralObject(JSON.parse(str)); } catch (e) { @@ -81,78 +79,53 @@ export class EventContentDialogComponent extends DialogComponent = null; if (this.contentType) { mode = contentTypesMap.get(this.contentType).code; if (this.contentType === ContentType.JSON && content) { - content$ = beautifyJs(content, {indent_size: 4}); + content$ = beautifyJs(content, {indent_size: 2}); } else if (this.contentType === ContentType.BINARY && content) { try { const decodedData = base64toString(content); if (this.isJson(decodedData)) { mode = 'json'; - content$ = beautifyJs(decodedData, {indent_size: 4}); + content$ = beautifyJs(decodedData, {indent_size: 2}); } else { content$ = of(decodedData); } - } catch (e) {} + } catch (e) {/**/} } } if (!content$) { content$ = of(content); } - content$.subscribe( - (processedContent) => { - let editorOptions: Partial = { - mode: `ace/mode/${mode}`, - theme: 'ace/theme/github', - showGutter: false, - showPrintMargin: false, - readOnly: true - }; - - const advancedOptions = { - enableSnippets: false, - enableBasicAutocompletion: false, - enableLiveAutocompletion: false - }; - - editorOptions = {...editorOptions, ...advancedOptions}; - getAce().subscribe( - (ace) => { - this.aceEditor = ace.edit(editorElement, editorOptions); - this.aceEditor.session.setUseWrapMode(false); - this.aceEditor.setValue(processedContent, -1); - this.updateEditorSize(editorElement, processedContent, this.aceEditor); - } - ); - } - ); - } - - updateEditorSize(editorElement: any, content: string, editor: Ace.Editor) { - let newHeight = 400; - let newWidth = 600; - if (content && content.length > 0) { - const lines = content.split('\n'); - newHeight = 17 * lines.length + 16; - let maxLineLength = 0; - lines.forEach((row) => { - const line = row.replace(/\t/g, ' ').replace(/\n/g, ''); - const lineLength = line.length; - maxLineLength = Math.max(maxLineLength, lineLength); - }); - newWidth = 9 * maxLineLength + 16; - } - // newHeight = Math.min(400, newHeight); - this.renderer.setStyle(editorElement, 'minHeight', newHeight.toString() + 'px'); - this.renderer.setStyle(editorElement, 'height', newHeight.toString() + 'px'); - this.renderer.setStyle(editorElement, 'width', newWidth.toString() + 'px'); - editor.resize(); + content$.subscribe((processedContent) => { + const isJSON = mode === 'json' && processedContent !== '{}'; + this.showBorder = isJSON; + const editorOptions: Partial = { + mode: `ace/mode/${mode}`, + theme: 'ace/theme/github', + showGutter: isJSON, + showFoldWidgets: true, + foldStyle: 'markbeginend', + showPrintMargin: false, + readOnly: true, + enableSnippets: false, + enableBasicAutocompletion: false, + enableLiveAutocompletion: false, + }; + getAce().subscribe( + (ace) => { + this.aceEditor = ace.edit(editorElement, editorOptions); + this.aceEditor.session.setUseWrapMode(false); + this.aceEditor.setValue(processedContent, -1); + updateEditorSize(editorElement, processedContent, this.aceEditor, this.renderer, {showGutter: isJSON}); + } + ) + }); } - } diff --git a/ui-ngx/src/app/shared/components/json-object-view.component.ts b/ui-ngx/src/app/shared/components/json-object-view.component.ts index e549dd03c1..20f8660279 100644 --- a/ui-ngx/src/app/shared/components/json-object-view.component.ts +++ b/ui-ngx/src/app/shared/components/json-object-view.component.ts @@ -15,14 +15,11 @@ /// import { Component, ElementRef, forwardRef, Input, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core'; -import { NG_VALUE_ACCESSOR } from '@angular/forms'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { Ace } from 'ace-builds'; -import { coerceBooleanProperty } from '@angular/cdk/coercion'; -import { Store } from '@ngrx/store'; -import { AppState } from '@core/core.state'; -import { RafService } from '@core/services/raf.service'; import { isDefinedAndNotNull, isUndefined } from '@core/utils'; -import { getAce } from '@shared/models/ace/ace.models'; +import { getAce, updateEditorSize } from '@shared/models/ace/ace.models'; +import { coerceBoolean } from '@shared/decorators/coercion'; @Component({ selector: 'tb-json-object-view', @@ -36,7 +33,7 @@ import { getAce } from '@shared/models/ace/ace.models'; } ] }) -export class JsonObjectViewComponent implements OnInit, OnDestroy { +export class JsonObjectViewComponent implements OnInit, OnDestroy, ControlValueAccessor { @ViewChild('jsonViewer', {static: true}) jsonViewerElmRef: ElementRef; @@ -55,96 +52,54 @@ export class JsonObjectViewComponent implements OnInit, OnDestroy { @Input() sort: (key: string, value: any) => any; - private widthValue: boolean; - - get autoWidth(): boolean { - return this.widthValue; - } - @Input() - set autoWidth(value: boolean) { - this.widthValue = coerceBooleanProperty(value); - } - - private heigthValue: boolean; - - get autoHeight(): boolean { - return this.heigthValue; - } + @coerceBoolean() + autoWidth: boolean @Input() - set autoHeight(value: boolean) { - this.heigthValue = coerceBooleanProperty(value); - } + @coerceBoolean() + autoHeight: boolean - constructor(public elementRef: ElementRef, - protected store: Store, - private raf: RafService, - private renderer: Renderer2) { + constructor(private renderer: Renderer2) { } ngOnInit(): void { this.viewerElement = this.jsonViewerElmRef.nativeElement; - let editorOptions: Partial = { + const editorOptions: Partial = { mode: 'ace/mode/java', theme: 'ace/theme/github', showGutter: false, showPrintMargin: false, - readOnly: true - }; - - const advancedOptions = { + readOnly: true, enableSnippets: false, enableBasicAutocompletion: false, enableLiveAutocompletion: false }; - editorOptions = {...editorOptions, ...advancedOptions}; getAce().subscribe( (ace) => { this.jsonViewer = ace.edit(this.viewerElement, editorOptions); this.jsonViewer.session.setUseWrapMode(false); this.jsonViewer.setValue(this.contentValue ? this.contentValue : '', -1); - if (this.contentValue && (this.widthValue || this.heigthValue)) { - this.updateEditorSize(this.viewerElement, this.contentValue, this.jsonViewer); + if (this.contentValue && (this.autoWidth || this.autoHeight)) { + updateEditorSize(this.viewerElement, this.contentValue, this.jsonViewer, this.renderer, { + ignoreHeight: !this.autoHeight, + ignoreWidth: !this.autoWidth + }); } } ); } ngOnDestroy(): void { - if (this.jsonViewer) { - this.jsonViewer.destroy(); - } + this.jsonViewer?.destroy(); } - updateEditorSize(editorElement: any, content: string, editor: Ace.Editor) { - let newHeight = 200; - let newWidth = 600; - if (content && content.length > 0) { - const lines = content.split('\n'); - newHeight = 17 * lines.length + 17; - let maxLineLength = 0; - lines.forEach((row) => { - const line = row.replace(/\t/g, ' ').replace(/\n/g, ''); - const lineLength = line.length; - maxLineLength = Math.max(maxLineLength, lineLength); - }); - newWidth = 8 * maxLineLength + 16; - } - if (this.heigthValue) { - this.renderer.setStyle(editorElement, 'height', newHeight.toString() + 'px'); - } - if (this.widthValue) { - this.renderer.setStyle(editorElement, 'width', newWidth.toString() + 'px'); - } - editor.resize(); - } registerOnChange(fn: any): void { this.propagateChange = fn; } - registerOnTouched(fn: any): void { + registerOnTouched(_fn: any): void { } writeValue(value: any): void { @@ -162,8 +117,11 @@ export class JsonObjectViewComponent implements OnInit, OnDestroy { } if (this.jsonViewer) { this.jsonViewer.setValue(this.contentValue ? this.contentValue : '', -1); - if (this.contentValue && (this.widthValue || this.heigthValue)) { - this.updateEditorSize(this.viewerElement, this.contentValue, this.jsonViewer); + if (this.contentValue && (this.autoWidth || this.autoHeight)) { + updateEditorSize(this.viewerElement, this.contentValue, this.jsonViewer, this.renderer, { + ignoreHeight: !this.autoHeight, + ignoreWidth: !this.autoWidth + }); } } } diff --git a/ui-ngx/src/app/shared/import-export/import-dialog-csv.component.ts b/ui-ngx/src/app/shared/import-export/import-dialog-csv.component.ts index a3d82952cc..90bd9f30ec 100644 --- a/ui-ngx/src/app/shared/import-export/import-dialog-csv.component.ts +++ b/ui-ngx/src/app/shared/import-export/import-dialog-csv.component.ts @@ -39,7 +39,7 @@ import { import { ImportExportService } from '@shared/import-export/import-export.service'; import { TableColumnsAssignmentComponent } from '@shared/import-export/table-columns-assignment.component'; import { Ace } from 'ace-builds'; -import { getAce } from '@shared/models/ace/ace.models'; +import { getAce, updateEditorSize } from '@shared/models/ace/ace.models'; export interface ImportDialogCsvData { entityType: EntityType; @@ -283,21 +283,9 @@ export class ImportDialogCsvComponent extends DialogComponent 0) { - const lines = content.split('\n'); - newHeight = 16 * lines.length + 24; - } - const minHeight = Math.min(200, newHeight); - this.renderer.setStyle(editorElement, 'minHeight', minHeight.toString() + 'px'); - this.renderer.setStyle(editorElement, 'height', newHeight.toString() + 'px'); - editor.resize(); - } - } diff --git a/ui-ngx/src/app/shared/models/ace/ace.models.ts b/ui-ngx/src/app/shared/models/ace/ace.models.ts index 49cf670989..31b97ff144 100644 --- a/ui-ngx/src/app/shared/models/ace/ace.models.ts +++ b/ui-ngx/src/app/shared/models/ace/ace.models.ts @@ -19,6 +19,7 @@ import { Observable } from 'rxjs/internal/Observable'; import { forkJoin, from, of } from 'rxjs'; import { map, mergeMap, tap } from 'rxjs/operators'; import { unwrapModule } from '@core/utils'; +import { Renderer2 } from '@angular/core'; let aceDependenciesLoaded = false; let aceModule: any; @@ -98,6 +99,46 @@ export function getAceDiff(): Observable { } } +export function updateEditorSize(editorElement: any, content: string, editor: Ace.Editor, renderer: Renderer2, options?: { + showGutter?: boolean, + ignoreHeight?: boolean, + ignoreWidth?: boolean, + setMinHeight?: boolean +}): void { + let newHeight = 200; + let newWidth = 600; + if (content && content.length > 0) { + if (editor.renderer.lineHeight <= 0) { + editor.renderer.updateFull(true); + } + const lines = content.split('\n'); + newHeight = editor.renderer.lineHeight * lines.length + 16; + let maxLineLength = 0; + lines.forEach((row) => { + const line = row.replace(/\t/g, ' ').replace(/\n/g, ''); + const lineLength = line.length; + maxLineLength = Math.max(maxLineLength, lineLength); + }); + if (options?.showGutter) { + maxLineLength += lines.length.toString().length; + } + newWidth = 10 * maxLineLength + 16; + if (options?.showGutter) { + newWidth += 32; + } + } + if (!options.ignoreHeight) { + renderer.setStyle(editorElement, 'height', newHeight.toString() + 'px'); + } + if (options.setMinHeight) { + renderer.setStyle(editorElement, 'minHeight', newHeight.toString() + 'px'); + } + if (!options.ignoreWidth) { + renderer.setStyle(editorElement, 'width', newWidth.toString() + 'px'); + } + editor.resize(); +} + export class Range implements Ace.Range { public start: Ace.Point; From b0c39c4817330bcd8e9871333f69ef26db77dcb6 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Fri, 19 Dec 2025 19:34:26 +0100 Subject: [PATCH 061/579] TbMqttSslTransportComponent condition for both tb-transport and monolith mode --- .../server/transport/mqtt/TbMqttSslTransportComponent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/TbMqttSslTransportComponent.java b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/TbMqttSslTransportComponent.java index 2a0e8ef42f..9f55d40919 100644 --- a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/TbMqttSslTransportComponent.java +++ b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/TbMqttSslTransportComponent.java @@ -27,5 +27,5 @@ import java.lang.annotation.RetentionPolicy; @Inherited @Retention(RetentionPolicy.RUNTIME) -@ConditionalOnExpression("'${service.type:null}'=='tb-transport' || ('${service.type:null}'=='monolith' && '${transport.api_enabled:true}'=='true' && '${transport.mqtt.enabled:true}'=='true' && '${transport.mqtt.ssl.enabled:false}'=='true')") +@ConditionalOnExpression("'${transport.mqtt.ssl.enabled:false}'=='true' && ('${service.type:null}'=='tb-transport' || ('${service.type:null}'=='monolith' && '${transport.api_enabled:true}'=='true' && '${transport.mqtt.enabled:true}'=='true'))") public @interface TbMqttSslTransportComponent {} From 706b02295de2c36fcb68648df67d412cfc1a0e75 Mon Sep 17 00:00:00 2001 From: Vladyslav Prykhodko Date: Fri, 19 Dec 2025 23:52:57 +0200 Subject: [PATCH 062/579] UI: Fixed edit cf and refactor cf models and service --- .../core/http/calculated-fields.service.ts | 16 +++--- .../alarm-rules/alarm-rules-table-config.ts | 43 +++++++++------- .../calculated-fields-table-config.ts | 50 ++++++++++--------- .../entity/entity-subtype-list.component.ts | 11 ++-- .../shared/models/calculated-field.models.ts | 2 + 5 files changed, 63 insertions(+), 59 deletions(-) diff --git a/ui-ngx/src/app/core/http/calculated-fields.service.ts b/ui-ngx/src/app/core/http/calculated-fields.service.ts index 0fba704277..f3bab62cd2 100644 --- a/ui-ngx/src/app/core/http/calculated-fields.service.ts +++ b/ui-ngx/src/app/core/http/calculated-fields.service.ts @@ -15,17 +15,13 @@ /// import { Injectable } from '@angular/core'; -import { - createDefaultHttpOptions, - defaultHttpOptionsFromConfig, - defaultHttpOptionsFromParams, - RequestConfig -} from './http-utils'; +import { defaultHttpOptionsFromConfig, defaultHttpOptionsFromParams, RequestConfig } from './http-utils'; import { Observable } from 'rxjs'; import { HttpClient } from '@angular/common/http'; import { PageData } from '@shared/models/page/page-data'; import { CalculatedField, + CalculatedFieldInfo, CalculatedFieldsQuery, CalculatedFieldTestScriptInputParams, CalculatedFieldType @@ -56,11 +52,11 @@ export class CalculatedFieldsService { return this.http.delete(`/api/calculatedField/${calculatedFieldId}`, defaultHttpOptionsFromConfig(config)); } - public getCalculatedFieldsFilter(pageLink: PageLink, query: CalculatedFieldsQuery, config?: RequestConfig): Observable> { - return this.http.get>(`/api/calculatedFields${pageLink.toQuery()}`, defaultHttpOptionsFromParams(query, config)); + public getCalculatedFields(pageLink: PageLink, query: CalculatedFieldsQuery, config?: RequestConfig): Observable> { + return this.http.get>(`/api/calculatedFields${pageLink.toQuery()}`, defaultHttpOptionsFromParams(query, config)); } - public getCalculatedFields({ entityType, id }: EntityId, pageLink: PageLink, type?: CalculatedFieldType, config?: RequestConfig): Observable> { + public getCalculatedFieldsByEntityId({ entityType, id }: EntityId, pageLink: PageLink, type?: CalculatedFieldType, config?: RequestConfig): Observable> { return this.http.get>(`/api/${entityType}/${id}/calculatedFields${pageLink.toQuery()}`, defaultHttpOptionsFromParams({type} , config)); } @@ -72,7 +68,7 @@ export class CalculatedFieldsService { return this.http.get(`/api/calculatedField/${id}/debug`, defaultHttpOptionsFromConfig(config)); } - public getAlarmRuleNames(pageLink: PageLink, type: CalculatedFieldType, config?: RequestConfig): Observable> { + public getCalculatedFieldNames(pageLink: PageLink, type: CalculatedFieldType, config?: RequestConfig): Observable> { return this.http.get>(`/api/calculatedFields/names${pageLink.toQuery()}`, defaultHttpOptionsFromParams({type}, config)); } } diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts index f1bd30d853..46d43f2921 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts @@ -43,6 +43,7 @@ import { CalculatedField, CalculatedFieldAlarmRule, CalculatedFieldEventArguments, + CalculatedFieldInfo, CalculatedFieldsQuery, CalculatedFieldType, getCalculatedFieldArgumentsEditorCompleter, @@ -67,12 +68,14 @@ import { CalculatedFieldTestScriptDialogData } from "@home/components/calculated-fields/components/test-dialog/calculated-field-script-test-dialog.component"; -export class AlarmRulesTableConfig extends EntityTableConfig { +type AlarmRuleTableEntity = CalculatedField | CalculatedFieldInfo; + +export class AlarmRulesTableConfig extends EntityTableConfig { readonly tenantId = getCurrentAuthUser(this.store).tenantId; additionalDebugActionConfig = { title: this.translate.instant('action.see-debug-events'), - action: (calculatedField: CalculatedField) => this.openDebugEventsDialog.call(this, calculatedField), + action: (calculatedField: AlarmRuleTableEntity) => this.openDebugEventsDialog.call(this, calculatedField), }; alarmRuleFilterConfig: CalculatedFieldsQuery; @@ -81,11 +84,11 @@ export class AlarmRulesTableConfig extends EntityTableConfig { private translate: TranslateService, private dialog: MatDialog, private datePipe: DatePipe, - public entityId: EntityId = null, + private entityId: EntityId = null, private store: Store, private destroyRef: DestroyRef, private renderer: Renderer2, - public entityName: string, + private entityName: string, private ownerId: EntityId = null, private importExportService: ImportExportService, private entityDebugSettingsService: EntityDebugSettingsService, @@ -118,7 +121,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig { this.entitiesFetchFunction = (pageLink: PageLink) => this.fetchCalculatedFields(pageLink); this.addEntity = this.getCalculatedAlarmDialog.bind(this); - this.deleteEntityTitle = (field: CalculatedField) => this.translate.instant('alarm-rule.delete-title', {title: field.name}); + this.deleteEntityTitle = (field) => this.translate.instant('alarm-rule.delete-title', {title: field.name}); this.deleteEntityContent = () => this.translate.instant('alarm-rule.delete-text'); this.deleteEntitiesTitle = count => this.translate.instant('alarm-rule.delete-multiple-title', {count}); this.deleteEntitiesContent = () => this.translate.instant('alarm-rule.delete-multiple-text'); @@ -143,10 +146,10 @@ export class AlarmRulesTableConfig extends EntityTableConfig { this.columns.push(new EntityTableColumn('name', 'alarm-rule.alarm-type', '33%', entity => this.utilsService.customTranslation(entity.name, entity.name))); if (this.pageMode) { - this.columns.push(new EntityTableColumn('entityType', 'entity.entity-type', '10%', + this.columns.push(new EntityTableColumn('entityType', 'entity.entity-type', '10%', entity => this.translate.instant(entityTypeTranslations.get(entity.entityId.entityType).type))); - this.columns.push(new EntityLinkTableColumn('entityName', 'entity.entity', '33%', - entity => this.utilsService.customTranslation(entity['entityName'], entity['entityName']), + this.columns.push(new EntityLinkTableColumn('entityName', 'entity.entity', '33%', + entity => this.utilsService.customTranslation(entity.entityName, entity.entityName), entity => getEntityDetailsPageURL(entity.entityId?.id, entity.entityId?.entityType as EntityType), false)); } this.columns.push(new EntityTableColumn('createRule', 'alarm-rule.severities', this.pageMode ? '23%' : '67%', @@ -193,13 +196,13 @@ export class AlarmRulesTableConfig extends EntityTableConfig { ); } - fetchCalculatedFields(pageLink: PageLink): Observable> { + fetchCalculatedFields(pageLink: PageLink): Observable> { return this.pageMode ? - this.calculatedFieldsService.getCalculatedFieldsFilter(pageLink, {types: [CalculatedFieldType.ALARM], ...this.alarmRuleFilterConfig}) : - this.calculatedFieldsService.getCalculatedFields(this.entityId, pageLink, CalculatedFieldType.ALARM); + this.calculatedFieldsService.getCalculatedFields(pageLink, {types: [CalculatedFieldType.ALARM], ...this.alarmRuleFilterConfig}) : + this.calculatedFieldsService.getCalculatedFieldsByEntityId(this.entityId, pageLink, CalculatedFieldType.ALARM); } - onOpenDebugConfig($event: Event, calculatedField: CalculatedField): void { + onOpenDebugConfig($event: Event, calculatedField: AlarmRuleTableEntity): void { $event?.stopPropagation(); const { debugSettings = {}, id } = calculatedField; const additionalActionConfig = { @@ -224,7 +227,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig { }, $event.target as Element); } - private editCalculatedField($event: Event, calculatedField: CalculatedField, isDirty = false): void { + private editCalculatedField($event: Event, calculatedField: AlarmRuleTableEntity, isDirty = false): void { $event?.stopPropagation(); this.getCalculatedAlarmDialog(calculatedField, 'action.apply', isDirty) .subscribe((res) => { @@ -234,11 +237,12 @@ export class AlarmRulesTableConfig extends EntityTableConfig { }); } - private copyCalculatedField($event: Event, calculatedField: CalculatedField, isDirty = false): void { + private copyCalculatedField($event: Event, calculatedField: AlarmRuleTableEntity, isDirty = false): void { $event?.stopPropagation(); const copyCalculatedAlarmRule = deepClone(calculatedField); if (this.pageMode) { copyCalculatedAlarmRule.entityId = null; + delete (copyCalculatedAlarmRule as CalculatedFieldInfo).entityName; } delete copyCalculatedAlarmRule.id; this.getCalculatedAlarmDialog(copyCalculatedAlarmRule, 'action.apply', isDirty) @@ -249,8 +253,9 @@ export class AlarmRulesTableConfig extends EntityTableConfig { }); } - private getCalculatedAlarmDialog(value?: CalculatedField, buttonTitle = 'action.add', isDirty = false): Observable { + private getCalculatedAlarmDialog(value?: AlarmRuleTableEntity, buttonTitle = 'action.add', isDirty = false): Observable { const entityId = this.entityId || value?.entityId; + const entityName = this.entityName || (value as CalculatedFieldInfo)?.entityName; return this.dialog.open(AlarmRuleDialogComponent, { disableClose: true, panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], @@ -258,8 +263,8 @@ export class AlarmRulesTableConfig extends EntityTableConfig { value, buttonTitle, entityId, + entityName, tenantId: this.tenantId, - entityName: this.entityName, ownerId: this.ownerId ?? {entityType: EntityType.TENANT, id: this.tenantId}, additionalDebugActionConfig: this.additionalDebugActionConfig, isDirty, @@ -271,7 +276,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig { .pipe(filter(Boolean)); } - private openDebugEventsDialog($event: Event, calculatedField: CalculatedField): void { + private openDebugEventsDialog($event: Event, calculatedField: AlarmRuleTableEntity): void { $event?.stopPropagation(); this.dialog.open(EventsDialogComponent, { disableClose: true, @@ -290,7 +295,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig { .subscribe(); } - private exportAlarmRule($event: Event, calculatedField: CalculatedField): void { + private exportAlarmRule($event: Event, calculatedField: AlarmRuleTableEntity): void { $event?.stopPropagation(); this.importExportService.exportCalculatedField(calculatedField.id.id); } @@ -343,7 +348,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig { ).subscribe(() => this.updateData()); } - private getTestScriptDialog(calculatedField: CalculatedField, expression: string, argumentsObj?: CalculatedFieldEventArguments, openCalculatedFieldEdit = true): Observable { + private getTestScriptDialog(calculatedField: AlarmRuleTableEntity, expression: string, argumentsObj?: CalculatedFieldEventArguments, openCalculatedFieldEdit = true): Observable { if (calculatedField.type === CalculatedFieldType.ALARM) { const resultArguments = Object.keys(calculatedField.configuration.arguments).reduce((acc, key) => { const type = calculatedField.configuration.arguments[key].refEntityKey.type; diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts index e5c57aae2e..8385b5cb45 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts @@ -40,8 +40,8 @@ import { ArgumentEntityType, ArgumentType, CalculatedField, - CalculatedFieldAlarmRule, CalculatedFieldEventArguments, + CalculatedFieldInfo, CalculatedFieldScriptConfiguration, CalculatedFieldsQuery, CalculatedFieldType, @@ -68,12 +68,14 @@ import { CalculatedFieldsHeaderComponent } from '@home/components/calculated-fields/table-header/calculated-fields-header.component'; -export class CalculatedFieldsTableConfig extends EntityTableConfig { +type CalculatedFieldsTableEntity = CalculatedField | CalculatedFieldInfo; + +export class CalculatedFieldsTableConfig extends EntityTableConfig { readonly tenantId = getCurrentAuthUser(this.store).tenantId; additionalDebugActionConfig = { title: this.translate.instant('action.see-debug-events'), - action: (calculatedField: CalculatedField) => this.openDebugEventsDialog.call(this, null, calculatedField), + action: (calculatedField: CalculatedFieldsTableEntity) => this.openDebugEventsDialog.call(this, null, calculatedField), }; calculatedFieldFilterConfig: CalculatedFieldsQuery; @@ -82,11 +84,11 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig, private destroyRef: DestroyRef, private renderer: Renderer2, - public entityName: string, + private entityName: string, private ownerId: EntityId = null, private importExportService: ImportExportService, private entityDebugSettingsService: EntityDebugSettingsService, @@ -110,7 +112,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig this.fetchCalculatedFields(pageLink); this.addEntity = this.getCalculatedFieldDialog.bind(this); - this.deleteEntityTitle = (field: CalculatedField) => this.translate.instant('calculated-fields.delete-title', {title: field.name}); + this.deleteEntityTitle = (field) => this.translate.instant('calculated-fields.delete-title', {title: field.name}); this.deleteEntityContent = () => this.translate.instant('calculated-fields.delete-text'); this.deleteEntitiesTitle = count => this.translate.instant('calculated-fields.delete-multiple-title', {count}); this.deleteEntitiesContent = () => this.translate.instant('calculated-fields.delete-multiple-text'); @@ -136,10 +138,10 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig('name', 'common.name', this.pageMode ? '33%' : '60%', entity => this.utilsService.customTranslation(entity.name, entity.name))); if (this.pageMode) { - this.columns.push(new EntityTableColumn('entityType', 'entity.entity-type', '10%', + this.columns.push(new EntityTableColumn('entityType', 'entity.entity-type', '10%', entity => this.translate.instant(entityTypeTranslations.get(entity.entityId.entityType).type))); - this.columns.push(new EntityLinkTableColumn('entityName', 'entity.entity', '33%', - entity => this.utilsService.customTranslation(entity['entityName'], entity['entityName']), + this.columns.push(new EntityLinkTableColumn('entityName', 'entity.entity', '33%', + entity => this.utilsService.customTranslation(entity.entityName, entity.entityName), entity => getEntityDetailsPageURL(entity.entityId?.id, entity.entityId?.entityType as EntityType), false)); } this.columns.push(new EntityTableColumn('type', 'common.type', this.pageMode ? '23%' : '40%', entity => this.translate.instant(CalculatedFieldTypeTranslations.get(entity.type).name), () => ({whiteSpace: 'nowrap' }))); @@ -180,13 +182,13 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig> { + fetchCalculatedFields(pageLink: PageLink): Observable> { return this.pageMode ? - this.calculatedFieldsService.getCalculatedFieldsFilter(pageLink, this.calculatedFieldFilterConfig): - this.calculatedFieldsService.getCalculatedFields(this.entityId, pageLink); + this.calculatedFieldsService.getCalculatedFields(pageLink, this.calculatedFieldFilterConfig): + this.calculatedFieldsService.getCalculatedFieldsByEntityId(this.entityId, pageLink); } - onOpenDebugConfig($event: Event, calculatedField: CalculatedField): void { + onOpenDebugConfig($event: Event, calculatedField: CalculatedFieldsTableEntity): void { $event?.stopPropagation(); const { debugSettings = {}, id } = calculatedField; const additionalActionConfig = { @@ -210,7 +212,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { @@ -220,8 +222,9 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { + private getCalculatedFieldDialog(value?: CalculatedFieldsTableEntity, buttonTitle = 'action.add', isDirty = false): Observable { const entityId = this.entityId || value?.entityId; + const entityName = this.entityName || (value as CalculatedFieldInfo)?.entityName; return this.dialog.open(CalculatedFieldDialogComponent, { disableClose: true, panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], @@ -229,8 +232,8 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { return (calculatedField.type === CalculatedFieldType.SCRIPT || @@ -274,19 +277,20 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { if (res) { this.updateData(); @@ -350,7 +354,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig this.updateData()); } - private getTestScriptDialog(calculatedField: CalculatedField, argumentsObj?: CalculatedFieldEventArguments, openCalculatedFieldEdit = true, expression?: string): Observable { + private getTestScriptDialog(calculatedField: CalculatedFieldsTableEntity, argumentsObj?: CalculatedFieldEventArguments, openCalculatedFieldEdit = true, expression?: string): Observable { if ( calculatedField.type === CalculatedFieldType.SCRIPT || calculatedField.type === CalculatedFieldType.RELATED_ENTITIES_AGGREGATION || diff --git a/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.ts b/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.ts index dc89f05fde..05511095cf 100644 --- a/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.ts +++ b/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.ts @@ -14,7 +14,7 @@ /// limitations under the License. /// -import { AfterViewInit, Component, ElementRef, forwardRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { Component, ElementRef, forwardRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; import { Observable, ReplaySubject, Subscription, throwError } from 'rxjs'; import { debounceTime, map, mergeMap, share } from 'rxjs/operators'; @@ -46,7 +46,7 @@ import { CalculatedFieldsService } from "@core/http/calculated-fields.service"; } ] }) -export class EntitySubTypeListComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnDestroy { +export class EntitySubTypeListComponent implements ControlValueAccessor, OnInit, OnDestroy { entitySubtypeListFormGroup: FormGroup; @@ -119,7 +119,7 @@ export class EntitySubTypeListComponent implements ControlValueAccessor, OnInit, private dirty = false; - private propagateChange = (v: any) => { }; + private propagateChange = (_v: any) => { }; private hasPageDataEntitySubTypes = new Set([ EntityType.ALARM, @@ -225,9 +225,6 @@ export class EntitySubTypeListComponent implements ControlValueAccessor, OnInit, ); } - ngAfterViewInit(): void { - } - ngOnDestroy(): void { if (this.broadcastSubscription) { this.broadcastSubscription.unsubscribe(); @@ -335,7 +332,7 @@ export class EntitySubTypeListComponent implements ControlValueAccessor, OnInit, subTypesPagesObservable = this.alarmService.getAlarmTypes(pageLink, {ignoreLoading: true}); break; case EntityType.CALCULATED_FIELD: - subTypesCfPagesObservable = this.calculatedFieldsService.getAlarmRuleNames(pageLink, CalculatedFieldType.ALARM, {ignoreLoading: true}); + subTypesCfPagesObservable = this.calculatedFieldsService.getCalculatedFieldNames(pageLink, CalculatedFieldType.ALARM, {ignoreLoading: true}); } if (subTypesPagesObservable) { this.entitySubtypes = subTypesPagesObservable.pipe( diff --git a/ui-ngx/src/app/shared/models/calculated-field.models.ts b/ui-ngx/src/app/shared/models/calculated-field.models.ts index 5f07374cf8..825c08a69f 100644 --- a/ui-ngx/src/app/shared/models/calculated-field.models.ts +++ b/ui-ngx/src/app/shared/models/calculated-field.models.ts @@ -79,6 +79,8 @@ export type CalculatedField = | CalculatedFieldRelatedEntityAggregation | CalculatedFieldAlarmRule; +export type CalculatedFieldInfo = CalculatedField & {entityName: string}; + export enum CalculatedFieldType { SIMPLE = 'SIMPLE', SCRIPT = 'SCRIPT', From 6827949e7fee59e2c335f750b98e09148876b000 Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Mon, 22 Dec 2025 11:25:26 +0200 Subject: [PATCH 063/579] UI: Fixed color settings panel update --- .../lib/settings/common/color-range-list.component.ts | 7 ------- .../settings/common/color-settings-panel.component.html | 2 +- .../lib/settings/common/color-settings-panel.component.ts | 7 ------- .../widget/lib/settings/common/gradient.component.ts | 5 ----- 4 files changed, 1 insertion(+), 20 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.ts index f7c68fec3d..84d3719ef5 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.ts @@ -113,9 +113,6 @@ export class ColorRangeListComponent implements OnInit, ControlValueAccessor, On this.colorRangeListFormGroup.valueChanges.pipe( takeUntil(this.destroy$) ).subscribe(() => this.updateModel()); - this.colorRangeListFormGroup.get('advancedMode').valueChanges.pipe( - takeUntil(this.destroy$) - ).subscribe(() => setTimeout(() => {this.popover?.updatePosition();}, 0)); } ngOnDestroy() { @@ -179,7 +176,6 @@ export class ColorRangeListComponent implements OnInit, ControlValueAccessor, On public removeAdvancedRange(index: number) { (this.colorRangeListFormGroup.get('rangeAdvanced') as UntypedFormArray).removeAt(index); - setTimeout(() => {this.popover?.updatePosition();}, 0); } get advancedRangeFormArray(): UntypedFormArray { @@ -193,7 +189,6 @@ export class ColorRangeListComponent implements OnInit, ControlValueAccessor, On removeRange(index: number) { this.rangeListFormArray.removeAt(index); this.colorRangeListFormGroup.markAsDirty(); - setTimeout(() => {this.popover?.updatePosition();}, 0); } rangeDrop(event: CdkDragDrop, range: string) { @@ -216,7 +211,6 @@ export class ColorRangeListComponent implements OnInit, ControlValueAccessor, On const advancedRangeColorsArray = this.colorRangeListFormGroup.get('rangeAdvanced') as UntypedFormArray; const advancedRangeColorControl = this.fb.control(advancedRange, [advancedRangeValidator]); advancedRangeColorsArray.push(advancedRangeColorControl); - setTimeout(() => {this.popover?.updatePosition();}, 0); } addRange() { @@ -228,7 +222,6 @@ export class ColorRangeListComponent implements OnInit, ControlValueAccessor, On }; this.rangeListFormArray.push(this.colorRangeControl(newRange)); this.colorRangeListFormGroup.markAsDirty(); - setTimeout(() => {this.popover?.updatePosition();}, 0); } } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings-panel.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings-panel.component.html index d4e71096b4..bfd6a674b7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings-panel.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings-panel.component.html @@ -94,7 +94,7 @@
-
+
{ - this.updateValidators(); - setTimeout(() => {this.popover?.updatePosition();}, 0); - }); this.updateValidators(); } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/gradient.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/gradient.component.ts index 9078c8db2b..6eca820e27 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/gradient.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/gradient.component.ts @@ -117,9 +117,6 @@ export class GradientComponent implements OnInit, ControlValueAccessor, OnDestro this.gradientFormGroup.valueChanges.pipe( takeUntil(this.destroy$) ).subscribe(() => this.updateModel()); - this.gradientFormGroup.get('advancedMode').valueChanges.pipe( - takeUntil(this.destroy$) - ).subscribe(() => setTimeout(() => {this.popover?.updatePosition();}, 0)); } ngOnDestroy() { @@ -236,7 +233,6 @@ export class GradientComponent implements OnInit, ControlValueAccessor, OnDestro this.gradientListFormArray.removeAt(index); } this.gradientFormGroup.markAsDirty(); - setTimeout(() => {this.popover?.updatePosition();}, 0); } gradientDrop(event: CdkDragDrop, advanced = false) { @@ -255,7 +251,6 @@ export class GradientComponent implements OnInit, ControlValueAccessor, OnDestro this.gradientListFormArray.push(this.colorGradientControl('rgba(0,0,0,0.87)')); } this.gradientFormGroup.markAsDirty(); - setTimeout(() => {this.popover?.updatePosition();}, 0); } updateModel() { From 295d29fc681a24d5b289e2d8cb561064975ded9e Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Mon, 22 Dec 2025 15:16:17 +0200 Subject: [PATCH 064/579] Version set to 4.2.1.1-RC --- application/pom.xml | 2 +- .../service/install/DefaultDatabaseSchemaSettingsService.java | 2 +- common/actor/pom.xml | 2 +- common/cache/pom.xml | 2 +- common/cluster-api/pom.xml | 2 +- common/coap-server/pom.xml | 2 +- common/dao-api/pom.xml | 2 +- common/data/pom.xml | 2 +- common/discovery-api/pom.xml | 2 +- common/edge-api/pom.xml | 2 +- common/edqs/pom.xml | 2 +- common/message/pom.xml | 2 +- common/pom.xml | 2 +- common/proto/pom.xml | 2 +- common/queue/pom.xml | 2 +- common/script/pom.xml | 2 +- common/script/remote-js-client/pom.xml | 2 +- common/script/script-api/pom.xml | 2 +- common/stats/pom.xml | 2 +- common/transport/coap/pom.xml | 2 +- common/transport/http/pom.xml | 2 +- common/transport/lwm2m/pom.xml | 2 +- common/transport/mqtt/pom.xml | 2 +- common/transport/pom.xml | 2 +- common/transport/snmp/pom.xml | 2 +- common/transport/transport-api/pom.xml | 2 +- common/util/pom.xml | 2 +- common/version-control/pom.xml | 2 +- dao/pom.xml | 2 +- edqs/pom.xml | 2 +- monitoring/pom.xml | 2 +- msa/black-box-tests/pom.xml | 2 +- msa/edqs/pom.xml | 2 +- msa/js-executor/package.json | 2 +- msa/js-executor/pom.xml | 2 +- msa/monitoring/pom.xml | 2 +- msa/pom.xml | 2 +- msa/tb-node/pom.xml | 2 +- msa/tb/pom.xml | 2 +- msa/transport/coap/pom.xml | 2 +- msa/transport/http/pom.xml | 2 +- msa/transport/lwm2m/pom.xml | 2 +- msa/transport/mqtt/pom.xml | 2 +- msa/transport/pom.xml | 2 +- msa/transport/snmp/pom.xml | 2 +- msa/vc-executor-docker/pom.xml | 2 +- msa/vc-executor/pom.xml | 2 +- msa/web-ui/package.json | 2 +- msa/web-ui/pom.xml | 2 +- netty-mqtt/pom.xml | 4 ++-- pom.xml | 2 +- rest-client/pom.xml | 2 +- rule-engine/pom.xml | 2 +- rule-engine/rule-engine-api/pom.xml | 2 +- rule-engine/rule-engine-components/pom.xml | 2 +- tools/pom.xml | 2 +- transport/coap/pom.xml | 2 +- transport/http/pom.xml | 2 +- transport/lwm2m/pom.xml | 2 +- transport/mqtt/pom.xml | 2 +- transport/pom.xml | 2 +- transport/snmp/pom.xml | 2 +- ui-ngx/package.json | 2 +- ui-ngx/pom.xml | 2 +- 64 files changed, 65 insertions(+), 65 deletions(-) diff --git a/application/pom.xml b/application/pom.xml index 9c683cbd25..47772dfa97 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC thingsboard application diff --git a/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java b/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java index 1917b4e22d..44aa14b782 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java @@ -30,7 +30,7 @@ public class DefaultDatabaseSchemaSettingsService implements DatabaseSchemaSetti // This list should include all versions that are compatible for the upgrade in 4 digits format (like 4.2.0.0, etc.). // The compatibility cycle usually breaks when we have some scripts written in Java that may not work after a new release. - private static final List SUPPORTED_VERSIONS_FOR_UPGRADE = List.of("4.2.0.0"); + private static final List SUPPORTED_VERSIONS_FOR_UPGRADE = List.of("4.2.0.0", "4.2.1.0"); private final ProjectInfo projectInfo; private final JdbcTemplate jdbcTemplate; diff --git a/common/actor/pom.xml b/common/actor/pom.xml index 4149fe2ad9..6411934f7d 100644 --- a/common/actor/pom.xml +++ b/common/actor/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/cache/pom.xml b/common/cache/pom.xml index 6831156fde..a43009b6e1 100644 --- a/common/cache/pom.xml +++ b/common/cache/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/cluster-api/pom.xml b/common/cluster-api/pom.xml index 78ef7980e8..9a75a6b0c3 100644 --- a/common/cluster-api/pom.xml +++ b/common/cluster-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/coap-server/pom.xml b/common/coap-server/pom.xml index b24fd98f5d..1950a9ecc2 100644 --- a/common/coap-server/pom.xml +++ b/common/coap-server/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/dao-api/pom.xml b/common/dao-api/pom.xml index 555b4a54bb..8b0ad31e23 100644 --- a/common/dao-api/pom.xml +++ b/common/dao-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/data/pom.xml b/common/data/pom.xml index d81566f521..a574a6ed07 100644 --- a/common/data/pom.xml +++ b/common/data/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/discovery-api/pom.xml b/common/discovery-api/pom.xml index cb5238a664..9e65abf10a 100644 --- a/common/discovery-api/pom.xml +++ b/common/discovery-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/edge-api/pom.xml b/common/edge-api/pom.xml index 2b7db0cbd3..208e1e7b55 100644 --- a/common/edge-api/pom.xml +++ b/common/edge-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/edqs/pom.xml b/common/edqs/pom.xml index cc5c5db14e..677f5ad5ae 100644 --- a/common/edqs/pom.xml +++ b/common/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/message/pom.xml b/common/message/pom.xml index c84a4fde2d..f70bc260cf 100644 --- a/common/message/pom.xml +++ b/common/message/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/pom.xml b/common/pom.xml index f45a2bdd28..5467f452d2 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC thingsboard common diff --git a/common/proto/pom.xml b/common/proto/pom.xml index 30d4b0bc68..bab2f8d12b 100644 --- a/common/proto/pom.xml +++ b/common/proto/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/queue/pom.xml b/common/queue/pom.xml index e6ab3a4704..19368c1345 100644 --- a/common/queue/pom.xml +++ b/common/queue/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/script/pom.xml b/common/script/pom.xml index ab5ac032c7..4b7a812737 100644 --- a/common/script/pom.xml +++ b/common/script/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/script/remote-js-client/pom.xml b/common/script/remote-js-client/pom.xml index 1a3e00a88c..45d4698efe 100644 --- a/common/script/remote-js-client/pom.xml +++ b/common/script/remote-js-client/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1-RC + 4.2.1.1-RC script org.thingsboard.common.script diff --git a/common/script/script-api/pom.xml b/common/script/script-api/pom.xml index 316f823a44..3bc2168dfe 100644 --- a/common/script/script-api/pom.xml +++ b/common/script/script-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1-RC + 4.2.1.1-RC script org.thingsboard.common.script diff --git a/common/stats/pom.xml b/common/stats/pom.xml index 4bf24411dc..66011657d8 100644 --- a/common/stats/pom.xml +++ b/common/stats/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/transport/coap/pom.xml b/common/transport/coap/pom.xml index be3c62c057..e9d5dcfc1a 100644 --- a/common/transport/coap/pom.xml +++ b/common/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.common.transport diff --git a/common/transport/http/pom.xml b/common/transport/http/pom.xml index a136079cb5..caff518fe2 100644 --- a/common/transport/http/pom.xml +++ b/common/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.common.transport diff --git a/common/transport/lwm2m/pom.xml b/common/transport/lwm2m/pom.xml index 904e359bcc..2bec8f7bcb 100644 --- a/common/transport/lwm2m/pom.xml +++ b/common/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.common.transport diff --git a/common/transport/mqtt/pom.xml b/common/transport/mqtt/pom.xml index 45f9b76af7..18ff4e96c3 100644 --- a/common/transport/mqtt/pom.xml +++ b/common/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.common.transport diff --git a/common/transport/pom.xml b/common/transport/pom.xml index f786bcdd0e..feaef2bcce 100644 --- a/common/transport/pom.xml +++ b/common/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/transport/snmp/pom.xml b/common/transport/snmp/pom.xml index d3b2c46d69..da5093349d 100644 --- a/common/transport/snmp/pom.xml +++ b/common/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard.common - 4.2.1-RC + 4.2.1.1-RC transport diff --git a/common/transport/transport-api/pom.xml b/common/transport/transport-api/pom.xml index a3fee460e1..1cb128b439 100644 --- a/common/transport/transport-api/pom.xml +++ b/common/transport/transport-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.common.transport diff --git a/common/util/pom.xml b/common/util/pom.xml index ebedf5dea3..6509f154ad 100644 --- a/common/util/pom.xml +++ b/common/util/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/common/version-control/pom.xml b/common/version-control/pom.xml index b6a0ea1d2e..939d0d47ad 100644 --- a/common/version-control/pom.xml +++ b/common/version-control/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC common org.thingsboard.common diff --git a/dao/pom.xml b/dao/pom.xml index a1843959df..5044c0edfb 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC thingsboard dao diff --git a/edqs/pom.xml b/edqs/pom.xml index d648d9d786..ef91e0bed4 100644 --- a/edqs/pom.xml +++ b/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC thingsboard edqs diff --git a/monitoring/pom.xml b/monitoring/pom.xml index 77874c5ac9..3fb4ba5314 100644 --- a/monitoring/pom.xml +++ b/monitoring/pom.xml @@ -21,7 +21,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC thingsboard diff --git a/msa/black-box-tests/pom.xml b/msa/black-box-tests/pom.xml index fed33f0002..6800c0c4cf 100644 --- a/msa/black-box-tests/pom.xml +++ b/msa/black-box-tests/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.2.1-RC + 4.2.1.1-RC msa org.thingsboard.msa diff --git a/msa/edqs/pom.xml b/msa/edqs/pom.xml index c5be28e7bb..62374eb2bc 100644 --- a/msa/edqs/pom.xml +++ b/msa/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC msa org.thingsboard.msa diff --git a/msa/js-executor/package.json b/msa/js-executor/package.json index 88fc7924bf..3f4370b642 100644 --- a/msa/js-executor/package.json +++ b/msa/js-executor/package.json @@ -1,7 +1,7 @@ { "name": "thingsboard-js-executor", "private": true, - "version": "4.2.1", + "version": "4.2.1.1", "description": "ThingsBoard JavaScript Executor Microservice", "main": "server.ts", "bin": "server.js", diff --git a/msa/js-executor/pom.xml b/msa/js-executor/pom.xml index 651b142160..3aaf380e2f 100644 --- a/msa/js-executor/pom.xml +++ b/msa/js-executor/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC msa org.thingsboard.msa diff --git a/msa/monitoring/pom.xml b/msa/monitoring/pom.xml index abd12ed9e0..b81abce27d 100644 --- a/msa/monitoring/pom.xml +++ b/msa/monitoring/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC msa diff --git a/msa/pom.xml b/msa/pom.xml index 24cc67f4bf..48c83f6ee1 100644 --- a/msa/pom.xml +++ b/msa/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC thingsboard msa diff --git a/msa/tb-node/pom.xml b/msa/tb-node/pom.xml index 0103bf9352..e473e1dfdf 100644 --- a/msa/tb-node/pom.xml +++ b/msa/tb-node/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC msa org.thingsboard.msa diff --git a/msa/tb/pom.xml b/msa/tb/pom.xml index 28e1366a73..9db071c9ae 100644 --- a/msa/tb/pom.xml +++ b/msa/tb/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC msa org.thingsboard.msa diff --git a/msa/transport/coap/pom.xml b/msa/transport/coap/pom.xml index 8aefc94122..098e3263b8 100644 --- a/msa/transport/coap/pom.xml +++ b/msa/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.msa.transport diff --git a/msa/transport/http/pom.xml b/msa/transport/http/pom.xml index a1481203de..3acbeb7a2d 100644 --- a/msa/transport/http/pom.xml +++ b/msa/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.msa.transport diff --git a/msa/transport/lwm2m/pom.xml b/msa/transport/lwm2m/pom.xml index 7af2b16588..bc6d0d004e 100644 --- a/msa/transport/lwm2m/pom.xml +++ b/msa/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.msa.transport diff --git a/msa/transport/mqtt/pom.xml b/msa/transport/mqtt/pom.xml index 176dca19eb..ef20c96f26 100644 --- a/msa/transport/mqtt/pom.xml +++ b/msa/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.msa.transport diff --git a/msa/transport/pom.xml b/msa/transport/pom.xml index afbab0c450..76cec909da 100644 --- a/msa/transport/pom.xml +++ b/msa/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC msa org.thingsboard.msa diff --git a/msa/transport/snmp/pom.xml b/msa/transport/snmp/pom.xml index 553ed8bb37..348880019c 100644 --- a/msa/transport/snmp/pom.xml +++ b/msa/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard.msa transport - 4.2.1-RC + 4.2.1.1-RC org.thingsboard.msa.transport diff --git a/msa/vc-executor-docker/pom.xml b/msa/vc-executor-docker/pom.xml index d0a291e246..b1c11efe0a 100644 --- a/msa/vc-executor-docker/pom.xml +++ b/msa/vc-executor-docker/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC msa org.thingsboard.msa diff --git a/msa/vc-executor/pom.xml b/msa/vc-executor/pom.xml index cf777c4c96..a59a8aa823 100644 --- a/msa/vc-executor/pom.xml +++ b/msa/vc-executor/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.2.1-RC + 4.2.1.1-RC msa org.thingsboard.msa diff --git a/msa/web-ui/package.json b/msa/web-ui/package.json index e8d4eedd5d..97d69546bc 100644 --- a/msa/web-ui/package.json +++ b/msa/web-ui/package.json @@ -1,7 +1,7 @@ { "name": "thingsboard-web-ui", "private": true, - "version": "4.2.1", + "version": "4.2.1.1", "description": "ThingsBoard Web UI Microservice", "main": "server.ts", "bin": "server.js", diff --git a/msa/web-ui/pom.xml b/msa/web-ui/pom.xml index a56d0ca9d9..70200eddb3 100644 --- a/msa/web-ui/pom.xml +++ b/msa/web-ui/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC msa org.thingsboard.msa diff --git a/netty-mqtt/pom.xml b/netty-mqtt/pom.xml index 08f2a55f4a..c0743024ea 100644 --- a/netty-mqtt/pom.xml +++ b/netty-mqtt/pom.xml @@ -19,11 +19,11 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC thingsboard netty-mqtt - 4.2.1-RC + 4.2.1.1-RC jar Netty MQTT Client diff --git a/pom.xml b/pom.xml index 4c5b2291be..7f8ef8074a 100755 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard thingsboard - 4.2.1-RC + 4.2.1.1-RC pom Thingsboard diff --git a/rest-client/pom.xml b/rest-client/pom.xml index e6e82da954..eddcd84d9a 100644 --- a/rest-client/pom.xml +++ b/rest-client/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC thingsboard rest-client diff --git a/rule-engine/pom.xml b/rule-engine/pom.xml index 8a9ad96d95..99372b9703 100644 --- a/rule-engine/pom.xml +++ b/rule-engine/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC thingsboard rule-engine diff --git a/rule-engine/rule-engine-api/pom.xml b/rule-engine/rule-engine-api/pom.xml index 0ed5a8cdbf..c52fb92594 100644 --- a/rule-engine/rule-engine-api/pom.xml +++ b/rule-engine/rule-engine-api/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC rule-engine org.thingsboard.rule-engine diff --git a/rule-engine/rule-engine-components/pom.xml b/rule-engine/rule-engine-components/pom.xml index 90e6a87e52..f582f1277a 100644 --- a/rule-engine/rule-engine-components/pom.xml +++ b/rule-engine/rule-engine-components/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC rule-engine org.thingsboard.rule-engine diff --git a/tools/pom.xml b/tools/pom.xml index 981c4804c8..783dc1ee73 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC thingsboard tools diff --git a/transport/coap/pom.xml b/transport/coap/pom.xml index 8ae86d381f..f43d31e35b 100644 --- a/transport/coap/pom.xml +++ b/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.transport diff --git a/transport/http/pom.xml b/transport/http/pom.xml index 487e1de186..7e55ae3db5 100644 --- a/transport/http/pom.xml +++ b/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.transport diff --git a/transport/lwm2m/pom.xml b/transport/lwm2m/pom.xml index 30effe6e42..f64f8b4aa4 100644 --- a/transport/lwm2m/pom.xml +++ b/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.transport diff --git a/transport/mqtt/pom.xml b/transport/mqtt/pom.xml index a609e8d002..0bcf68cbb8 100644 --- a/transport/mqtt/pom.xml +++ b/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC transport org.thingsboard.transport diff --git a/transport/pom.xml b/transport/pom.xml index c6a82349f5..1d3755a766 100644 --- a/transport/pom.xml +++ b/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC thingsboard transport diff --git a/transport/snmp/pom.xml b/transport/snmp/pom.xml index 1894f09787..5ea39a4066 100644 --- a/transport/snmp/pom.xml +++ b/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.2.1-RC + 4.2.1.1-RC transport diff --git a/ui-ngx/package.json b/ui-ngx/package.json index e993271fa8..74b4bbbb9c 100644 --- a/ui-ngx/package.json +++ b/ui-ngx/package.json @@ -1,6 +1,6 @@ { "name": "thingsboard", - "version": "4.2.1", + "version": "4.2.1.1", "scripts": { "ng": "ng", "start": "node --max_old_space_size=8048 ./node_modules/@angular/cli/bin/ng serve --configuration development --host 0.0.0.0 --open", diff --git a/ui-ngx/pom.xml b/ui-ngx/pom.xml index 905a1a8aca..d5bd48de78 100644 --- a/ui-ngx/pom.xml +++ b/ui-ngx/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1-RC + 4.2.1.1-RC thingsboard org.thingsboard From 68f432b581e27bf94ec9c401bf9239f3b70ef32c Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Mon, 22 Dec 2025 16:51:46 +0200 Subject: [PATCH 065/579] Set default docker base image to thingsboard/openjdk25:trixie-slim --- msa/pom.xml | 2 +- msa/tb/docker-cassandra/Dockerfile | 2 +- msa/tb/docker-postgres/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/msa/pom.xml b/msa/pom.xml index 48c83f6ee1..70a907292b 100644 --- a/msa/pom.xml +++ b/msa/pom.xml @@ -32,7 +32,7 @@ ${basedir}/.. thingsboard - thingsboard/openjdk17:bookworm-slim + thingsboard/openjdk25:trixie-slim true true 1.4.13 diff --git a/msa/tb/docker-cassandra/Dockerfile b/msa/tb/docker-cassandra/Dockerfile index 20a0d8cf7a..a915e16ba2 100644 --- a/msa/tb/docker-cassandra/Dockerfile +++ b/msa/tb/docker-cassandra/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM thingsboard/openjdk17:bookworm-slim +FROM ${docker.base.image} ENV PG_MAJOR=16 diff --git a/msa/tb/docker-postgres/Dockerfile b/msa/tb/docker-postgres/Dockerfile index 7c66d626c7..f9898e955e 100644 --- a/msa/tb/docker-postgres/Dockerfile +++ b/msa/tb/docker-postgres/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM thingsboard/openjdk17:bookworm-slim +FROM ${docker.base.image} ENV PG_MAJOR 12 From 9eedf7476303e8049530417cfa1e4be85b8f26a7 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Mon, 22 Dec 2025 16:58:18 +0200 Subject: [PATCH 066/579] Revert docker base openjdk25 for monolith images --- msa/tb/docker-cassandra/Dockerfile | 2 +- msa/tb/docker-postgres/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/msa/tb/docker-cassandra/Dockerfile b/msa/tb/docker-cassandra/Dockerfile index a915e16ba2..20a0d8cf7a 100644 --- a/msa/tb/docker-cassandra/Dockerfile +++ b/msa/tb/docker-cassandra/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM ${docker.base.image} +FROM thingsboard/openjdk17:bookworm-slim ENV PG_MAJOR=16 diff --git a/msa/tb/docker-postgres/Dockerfile b/msa/tb/docker-postgres/Dockerfile index f9898e955e..7c66d626c7 100644 --- a/msa/tb/docker-postgres/Dockerfile +++ b/msa/tb/docker-postgres/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM ${docker.base.image} +FROM thingsboard/openjdk17:bookworm-slim ENV PG_MAJOR 12 From dbbd97cbccea827b5520b6f01c7fed9eb9a86e02 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Mon, 22 Dec 2025 17:15:42 +0200 Subject: [PATCH 067/579] Edge mergeAndFilterDownlinkDuplicates - handle cases when no TS in attrbiutes body --- .../service/edge/EdgeMsgConstructorUtils.java | 35 +++++++++++-------- .../server/edge/DeviceEdgeTest.java | 5 +-- .../edge/EdgeMsgConstructorUtilsTest.java | 25 +++++++++++++ 3 files changed, 46 insertions(+), 19 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java index e1c7f1198c..33084f98fa 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java @@ -560,7 +560,7 @@ public class EdgeMsgConstructorUtils { .setEntityIdMSB(entityId.getId().getMostSignificantBits()) .setEntityIdLSB(entityId.getId().getLeastSignificantBits()) .setEntityType(entityId.getEntityType().name()); - long ts = getTs(entityData.getAsJsonObject()); + long ts = extractTs(entityData.getAsJsonObject()); switch (actionType) { case TIMESERIES_UPDATED: try { @@ -613,8 +613,8 @@ public class EdgeMsgConstructorUtils { return builder.build(); } - private static long getTs(JsonObject data) { - if (data.get("ts") != null && !data.get("ts").isJsonNull()) { + private static long extractTs(JsonObject data) { + if (data.has("ts") && data.get("ts").isJsonPrimitive()) { return data.getAsJsonPrimitive("ts").getAsLong(); } return System.currentTimeMillis(); @@ -740,7 +740,7 @@ public class EdgeMsgConstructorUtils { result.sort(Comparator.comparingLong(EdgeEvent::getSeqId)); return result; } catch (Exception e) { - log.warn("Can't merge downlink duplicates, edgeEvents [{}]", edgeEvents, e); + log.info("Can't merge downlink duplicates. Sending downlinks without merge. Original edgeEvents [{}]", edgeEvents, e); return edgeEvents; } } @@ -751,6 +751,9 @@ public class EdgeMsgConstructorUtils { } String bodyStr = JacksonUtil.toString(body); var jsonObject = JsonParser.parseString(bodyStr).getAsJsonObject(); + if (!jsonObject.has("ts")) { + return new AttrsTs(0L, List.of()); + } long ts = jsonObject.get("ts").getAsLong(); var kv = jsonObject.getAsJsonObject("kv"); List attrs = JsonConverter.convertToAttributes( @@ -761,22 +764,24 @@ public class EdgeMsgConstructorUtils { } private static JsonNode filterAttributesBody(JsonNode body, Map latestByKey) { - if (body == null || latestByKey == null || latestByKey.isEmpty()) { + if (body == null) { return null; } String bodyStr = JacksonUtil.toString(body); JsonObject jsonObject = JsonParser.parseString(bodyStr).getAsJsonObject(); - long ts = jsonObject.get("ts").getAsLong(); - JsonObject kv = jsonObject.getAsJsonObject("kv"); - for (Iterator> it = kv.entrySet().iterator(); it.hasNext(); ) { - Map.Entry e = it.next(); - Long latestTs = latestByKey.get(e.getKey()); - if (latestTs == null || !latestTs.equals(ts)) { - it.remove(); + if (jsonObject.has("ts") && latestByKey != null && !latestByKey.isEmpty()) { + long ts = jsonObject.get("ts").getAsLong(); + JsonObject kv = jsonObject.getAsJsonObject("kv"); + for (Iterator> it = kv.entrySet().iterator(); it.hasNext(); ) { + Map.Entry e = it.next(); + Long latestTs = latestByKey.get(e.getKey()); + if (latestTs == null || !latestTs.equals(ts)) { + it.remove(); + } + } + if (kv.isEmpty()) { + return null; } - } - if (kv.isEmpty()) { - return null; } return JacksonUtil.toJsonNode(jsonObject.toString()); } diff --git a/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java index 380dec8015..5c3f43b451 100644 --- a/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java @@ -49,8 +49,6 @@ import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.ota.OtaPackageType; -import org.thingsboard.server.common.data.page.PageData; -import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.security.DeviceCredentialsType; import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; @@ -671,8 +669,7 @@ public class DeviceEdgeTest extends AbstractEdgeTest { .atMost(10, TimeUnit.SECONDS) .until(() -> { String urlTemplate = "/api/plugins/telemetry/DEVICE/" + device.getId() + "/keys/attributes/" + scope; - List actualKeys = doGetAsyncTyped(urlTemplate, new TypeReference<>() { - }); + List actualKeys = doGetAsyncTyped(urlTemplate, new TypeReference<>() {}); return actualKeys != null && !actualKeys.isEmpty() && actualKeys.contains(expectedKey); }); diff --git a/application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java b/application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java index ebb8305871..1e268e3bcb 100644 --- a/application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java +++ b/application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java @@ -230,10 +230,35 @@ public class EdgeMsgConstructorUtilsTest { Assertions.assertEquals(8, getIntValue(assetMergedAttrAD.getBody(), "d")); } + @Test + public void testMergeDownlinkDuplicates_attrBodyHasNoTs_returnOriginalList() { + UUID deviceId = UUID.randomUUID(); + TenantId tenantId = TenantId.fromUUID(UUID.randomUUID()); + + var deviceAttrUpdate1 = createEdgeEvent(tenantId, 1, EdgeEventActionType.ATTRIBUTES_UPDATED, + deviceId, EdgeEventType.DEVICE, createAttrBodyWithoutTs("{\"a\":1,\"b\":1,\"d\":1}")); + var deviceAttrUpdate2 = createEdgeEvent(tenantId, 2, EdgeEventActionType.ATTRIBUTES_UPDATED, + deviceId, EdgeEventType.DEVICE, createAttrBodyWithoutTs("{\"a\":2,\"b\":2,\"c\":2}")); + var deviceAttrUpdate3 = createEdgeEvent(tenantId, 3, EdgeEventActionType.ATTRIBUTES_UPDATED, + deviceId, EdgeEventType.DEVICE, createAttrBodyWithoutTs("{\"a\":3,\"d\":3}")); + + List input = List.of(deviceAttrUpdate1, deviceAttrUpdate2, deviceAttrUpdate3); + List merged = EdgeMsgConstructorUtils.mergeAndFilterDownlinkDuplicates(input); + + Assertions.assertEquals(3, merged.size()); + Assertions.assertEquals(deviceAttrUpdate1, merged.get(0)); + Assertions.assertEquals(deviceAttrUpdate2, merged.get(1)); + Assertions.assertEquals(deviceAttrUpdate3, merged.get(2)); + } + private Integer getIntValue(JsonNode body, String key) { return body.get("kv").get(key) != null ? body.get("kv").get(key).asInt() : null; } + private static JsonNode createAttrBodyWithoutTs(String kvJson) { + return JacksonUtil.toJsonNode("{\"kv\":" + kvJson + "}"); + } + private static JsonNode createAttrBody(long ts, String kvJson) { return JacksonUtil.toJsonNode("{\"ts\":" + ts + ",\"kv\":" + kvJson + "}"); } From cb7b2e2705d762149d61f43e0388e428e84abba6 Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko <83352633+ArtemDzhereleiko@users.noreply.github.com> Date: Mon, 22 Dec 2025 19:07:32 +0200 Subject: [PATCH 068/579] Fixed see debug event and change color alarm severity for alarm table (#14666) * UI: Fixed see debug event * UI: Fixed alarm colors --------- Co-authored-by: ArtemDzhereleiko --- .../components/alarm-rules/alarm-rules-table-config.ts | 2 +- .../alarm-rules/create-cf-alarm-rules.component.ts | 5 ++--- .../components/notification/notification.component.ts | 9 ++++----- ui-ngx/src/app/shared/models/alarm.models.ts | 10 +++++----- ui-ngx/src/app/shared/models/notification.models.ts | 10 ---------- 5 files changed, 12 insertions(+), 24 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts index 46d43f2921..3d1c066839 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts @@ -75,7 +75,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig this.openDebugEventsDialog.call(this, calculatedField), + action: (calculatedField: AlarmRuleTableEntity) => this.openDebugEventsDialog.call(this, null, calculatedField), }; alarmRuleFilterConfig: CalculatedFieldsQuery; diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts index 8959d709fa..09a2d52756 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts @@ -27,10 +27,9 @@ import { Validator, Validators } from '@angular/forms'; -import { AlarmSeverity, alarmSeverityTranslations } from '@shared/models/alarm.models'; +import { AlarmSeverity, alarmSeverityColors, alarmSeverityTranslations } from '@shared/models/alarm.models'; import { AlarmRule } from "@shared/models/alarm-rule.models"; import { CalculatedFieldArgument } from "@shared/models/calculated-field.models"; -import { AlarmSeverityNotificationColors } from "@shared/models/notification.models"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { coerceBoolean } from "@shared/decorators/coercion"; import { Observable } from "rxjs"; @@ -68,7 +67,7 @@ export class CreateCfAlarmRulesComponent implements ControlValueAccessor, Valida alarmSeverityEnum = AlarmSeverity; alarmSeverityTranslationMap = alarmSeverityTranslations; - AlarmSeverityNotificationColors = AlarmSeverityNotificationColors; + AlarmSeverityNotificationColors = alarmSeverityColors; createAlarmRulesFormGroup = this.fb.group({ createAlarmRules: this.fb.array<{severity: AlarmSeverity, alarmRule: AlarmRule}>([]) diff --git a/ui-ngx/src/app/shared/components/notification/notification.component.ts b/ui-ngx/src/app/shared/components/notification/notification.component.ts index 77be7ff7cd..204c9e3230 100644 --- a/ui-ngx/src/app/shared/components/notification/notification.component.ts +++ b/ui-ngx/src/app/shared/components/notification/notification.component.ts @@ -17,7 +17,6 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { ActionButtonLinkType, - AlarmSeverityNotificationColors, Notification, NotificationStatus, NotificationType, @@ -25,7 +24,7 @@ import { } from '@shared/models/notification.models'; import { UtilsService } from '@core/services/utils.service'; import { Router } from '@angular/router'; -import { alarmSeverityTranslations } from '@shared/models/alarm.models'; +import { alarmSeverityColors, alarmSeverityTranslations } from '@shared/models/alarm.models'; import tinycolor from 'tinycolor2'; import { StateObject } from '@core/api/widget-api.models'; import { objToBase64URI } from '@core/utils'; @@ -135,12 +134,12 @@ export class NotificationComponent implements OnInit { } alarmColorSeverity(alpha: number) { - return tinycolor(AlarmSeverityNotificationColors.get(this.notification.info.alarmSeverity)).setAlpha(alpha).toRgbString(); + return tinycolor(alarmSeverityColors.get(this.notification.info.alarmSeverity)).setAlpha(alpha).toRgbString(); } notificationColor(): string { if (this.notification.type === NotificationType.ALARM && !this.notification.info.cleared) { - return AlarmSeverityNotificationColors.get(this.notification.info.alarmSeverity); + return alarmSeverityColors.get(this.notification.info.alarmSeverity); } return 'transparent'; } @@ -154,7 +153,7 @@ export class NotificationComponent implements OnInit { notificationIconColor(): object { if (this.notification.type === NotificationType.ALARM) { - return {color: AlarmSeverityNotificationColors.get(this.notification.info.alarmSeverity)}; + return {color: alarmSeverityColors.get(this.notification.info.alarmSeverity)}; } else if (this.notification.type === NotificationType.RULE_ENGINE_COMPONENT_LIFECYCLE_EVENT) { return {color: '#D12730'}; } else if (this.notification.type === NotificationType.ENTITIES_LIMIT_INCREASE_REQUEST) { diff --git a/ui-ngx/src/app/shared/models/alarm.models.ts b/ui-ngx/src/app/shared/models/alarm.models.ts index 5e1e5def25..fda79a0154 100644 --- a/ui-ngx/src/app/shared/models/alarm.models.ts +++ b/ui-ngx/src/app/shared/models/alarm.models.ts @@ -88,11 +88,11 @@ export const alarmSearchStatusTranslations = new Map( export const alarmSeverityColors = new Map( [ - [AlarmSeverity.CRITICAL, 'red'], - [AlarmSeverity.MAJOR, 'orange'], - [AlarmSeverity.MINOR, '#ffca3d'], - [AlarmSeverity.WARNING, '#abab00'], - [AlarmSeverity.INDETERMINATE, 'green'] + [AlarmSeverity.CRITICAL, '#D12730'], + [AlarmSeverity.MAJOR, '#FEAC0C'], + [AlarmSeverity.MINOR, '#F2DA05'], + [AlarmSeverity.WARNING, '#F66716'], + [AlarmSeverity.INDETERMINATE, '#00000061'] ] ); diff --git a/ui-ngx/src/app/shared/models/notification.models.ts b/ui-ngx/src/app/shared/models/notification.models.ts index f9abf6462b..352e49e01e 100644 --- a/ui-ngx/src/app/shared/models/notification.models.ts +++ b/ui-ngx/src/app/shared/models/notification.models.ts @@ -551,16 +551,6 @@ export const NotificationTypeIcons = new Map([ [NotificationType.RESOURCES_SHORTAGE, 'warning'] ]); -export const AlarmSeverityNotificationColors = new Map( - [ - [AlarmSeverity.CRITICAL, '#D12730'], - [AlarmSeverity.MAJOR, '#FEAC0C'], - [AlarmSeverity.MINOR, '#F2DA05'], - [AlarmSeverity.WARNING, '#F66716'], - [AlarmSeverity.INDETERMINATE, '#00000061'] - ] -); - export enum ActionButtonLinkType { LINK = 'LINK', DASHBOARD = 'DASHBOARD' From 028083da9d83a19588da79db1cc4f7f6cee99ec5 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Tue, 23 Dec 2025 10:48:21 +0200 Subject: [PATCH 069/579] Add LTS docker tag build config --- msa/pom.xml | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/msa/pom.xml b/msa/pom.xml index 70a907292b..5eff7cc06d 100644 --- a/msa/pom.xml +++ b/msa/pom.xml @@ -125,6 +125,48 @@ + + lts + + + lts + + + + 4.2.1-latest + + + + + org.codehaus.mojo + exec-maven-plugin + + + push-lts-docker-amd-arm-images + ${docker.push-arm-amd-image.phase} + + exec + + + docker + ${project.build.directory} + + buildx + build + -t + ${docker.repo}/${docker.name}:${docker.lts.tag} + --platform=linux/amd64,linux/arm64 + -o + type=registry + . + + + + + + + + From 934b54180be8e60a8f4af7d13bf2b3cee97ad5d5 Mon Sep 17 00:00:00 2001 From: Maksym Tsymbarov Date: Tue, 23 Dec 2025 12:20:23 +0200 Subject: [PATCH 070/579] Fixed disabling update button based on filters change (#14669) --- .../alarm-rules/alarm-rule-filter-config.component.ts | 1 + .../home/components/alarm/alarm-filter-config.component.ts | 1 + .../home/components/audit-log/audit-log-filter.component.ts | 2 ++ .../table-header/calculated-fields-filter-config.component.ts | 1 + .../home/components/device/device-info-filter.component.ts | 1 + 5 files changed, 6 insertions(+) diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.ts index 03c6932067..a624a5ae12 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.ts @@ -196,6 +196,7 @@ export class AlarmRuleFilterConfigComponent implements OnInit, ControlValueAcces cancel() { this.updateAlarmRuleConfigForm(this.alarmRuleFilterConfig); + this.alarmRuleFilterConfigForm.markAsPristine(); if (this.overlayRef) { this.overlayRef.dispose(); } else { diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts index 093858a500..e938b6fa19 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts @@ -224,6 +224,7 @@ export class AlarmFilterConfigComponent implements OnInit, OnDestroy, ControlVal cancel() { this.updateAlarmConfigForm(this.alarmFilterConfig); + this.alarmFilterConfigForm.markAsPristine(); if (this.overlayRef) { this.overlayRef.dispose(); } else { diff --git a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.ts b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.ts index f810eb5df7..18e5f1a1db 100644 --- a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.ts +++ b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.ts @@ -163,11 +163,13 @@ export class AuditLogFilterComponent implements OnInit, ControlValueAccessor { cancel() { this.updateAuditLogFilterForm(this.auditLogFilter); + this.auditLogFilterForm.markAsPristine(); this.auditLogOverlayRef.dispose(); } update() { this.auditLogFilterUpdated(this.auditLogFilterForm.value); + this.auditLogFilterForm.markAsPristine(); this.auditLogOverlayRef.dispose(); } diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.ts index 83ea05af4c..ffe986d434 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/table-header/calculated-fields-filter-config.component.ts @@ -204,6 +204,7 @@ export class CalculatedFieldsFilterConfigComponent implements OnInit, ControlVal cancel() { this.updateCfConfigForm(this.cfFilterConfig); + this.cfFilterForm.markAsPristine(); if (this.overlayRef) { this.overlayRef.dispose(); } else { diff --git a/ui-ngx/src/app/modules/home/components/device/device-info-filter.component.ts b/ui-ngx/src/app/modules/home/components/device/device-info-filter.component.ts index d6a81883d2..531323bf5c 100644 --- a/ui-ngx/src/app/modules/home/components/device/device-info-filter.component.ts +++ b/ui-ngx/src/app/modules/home/components/device/device-info-filter.component.ts @@ -196,6 +196,7 @@ export class DeviceInfoFilterComponent implements OnInit, ControlValueAccessor { cancel() { this.updateDeviceInfoFilterForm(this.deviceInfoFilter); + this.deviceInfoFilterForm.markAsPristine(); if (this.overlayRef) { this.overlayRef.dispose(); } else { From f704fcc6a8e7656adadf648376aef84fec87d513 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Tue, 23 Dec 2025 12:31:52 +0200 Subject: [PATCH 071/579] Separate push-lts-docker-amd-arm-images profile --- msa/pom.xml | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/msa/pom.xml b/msa/pom.xml index 5eff7cc06d..66e92678ce 100644 --- a/msa/pom.xml +++ b/msa/pom.xml @@ -126,10 +126,10 @@ - lts + push-lts-docker-amd-arm-images - lts + push-lts-docker-amd-arm-images @@ -141,6 +141,27 @@ org.codehaus.mojo exec-maven-plugin + + push-version-docker-amd-arm-images + ${docker.push-arm-amd-image.phase} + + exec + + + docker + ${project.build.directory} + + buildx + build + -t + ${docker.repo}/${docker.name}:${project.version} + --platform=linux/amd64,linux/arm64 + -o + type=registry + . + + + push-lts-docker-amd-arm-images ${docker.push-arm-amd-image.phase} From 4a30d778782f3aa0bf5d510bced1c0fba4e0928f Mon Sep 17 00:00:00 2001 From: Maksym Tsymbarov Date: Tue, 23 Dec 2025 12:39:20 +0200 Subject: [PATCH 072/579] Added translations for severity in alarm comments --- .../alarm/alarm-comment.component.ts | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts index 800fdf2371..220a49210d 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts @@ -32,13 +32,15 @@ import { AlarmCommentInfo, AlarmCommentType, AlarmMessage, + AlarmSeverity, + alarmSeverityTranslations, getUserDisplayName } from '@shared/models/alarm.models'; import { UtilsService } from '@core/services/utils.service'; import { EntityType } from '@shared/models/entity-type.models'; import { DatePipe } from '@angular/common'; import { ImportExportService } from '@shared/import-export/import-export.service'; -import { isNotEmptyStr } from '@core/utils'; +import { deepClone, isNotEmptyStr } from '@core/utils'; interface AlarmCommentsDisplayData { commentId?: string; @@ -152,9 +154,24 @@ export class AlarmCommentComponent implements OnInit { private parseSystemComment(alarm: AlarmCommentInfo): string { const subTypeKey = alarm.comment?.subtype; + const alarmComment = deepClone(alarm.comment); if (subTypeKey && AlarmMessage[subTypeKey]) { const translationKey = AlarmMessage[subTypeKey]; - return this.translate.instant(translationKey, alarm.comment); + if (alarmComment?.newSeverity) { + const newSeverityKey = + (alarmSeverityTranslations.has(alarmComment.newSeverity) + ? alarmSeverityTranslations.get(alarmComment.newSeverity) + : alarmComment.newSeverity) as AlarmSeverity; + alarmComment.newSeverity = this.translate.instant(newSeverityKey); + } + if (alarmComment?.oldSeverity) { + const oldSeverityKey = + (alarmSeverityTranslations.has(alarmComment.oldSeverity) + ? alarmSeverityTranslations.get(alarmComment.oldSeverity) + : alarmComment.oldSeverity) as AlarmSeverity; + alarmComment.oldSeverity = this.translate.instant(oldSeverityKey); + } + return this.translate.instant(translationKey, alarmComment); } return alarm.comment.text; } From ea29bdaf4ad9824d5e6f7bdb8daf9001e80462b2 Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Tue, 23 Dec 2025 12:40:22 +0200 Subject: [PATCH 073/579] UI: Enhancement for alarm severity colors --- .../notification/notification.component.html | 2 +- .../notification/notification.component.ts | 10 +++++++--- ui-ngx/src/app/shared/models/alarm.models.ts | 20 ++++++++++++++----- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/ui-ngx/src/app/shared/components/notification/notification.component.html b/ui-ngx/src/app/shared/components/notification/notification.component.html index 674a074a85..0a667ff334 100644 --- a/ui-ngx/src/app/shared/components/notification/notification.component.html +++ b/ui-ngx/src/app/shared/components/notification/notification.component.html @@ -42,7 +42,7 @@ check_circle_outline
+ [style.background-color]="alarmColorSeverityBackground()"> {{alarmSeverityTranslations.get(notification.info.alarmSeverity) | translate}} diff --git a/ui-ngx/src/app/shared/components/notification/notification.component.ts b/ui-ngx/src/app/shared/components/notification/notification.component.ts index 204c9e3230..9e7398e457 100644 --- a/ui-ngx/src/app/shared/components/notification/notification.component.ts +++ b/ui-ngx/src/app/shared/components/notification/notification.component.ts @@ -24,7 +24,11 @@ import { } from '@shared/models/notification.models'; import { UtilsService } from '@core/services/utils.service'; import { Router } from '@angular/router'; -import { alarmSeverityColors, alarmSeverityTranslations } from '@shared/models/alarm.models'; +import { + alarmSeverityBackgroundColors, + alarmSeverityColors, + alarmSeverityTranslations +} from '@shared/models/alarm.models'; import tinycolor from 'tinycolor2'; import { StateObject } from '@core/api/widget-api.models'; import { objToBase64URI } from '@core/utils'; @@ -133,8 +137,8 @@ export class NotificationComponent implements OnInit { } } - alarmColorSeverity(alpha: number) { - return tinycolor(alarmSeverityColors.get(this.notification.info.alarmSeverity)).setAlpha(alpha).toRgbString(); + alarmColorSeverityBackground() { + return alarmSeverityBackgroundColors.get(this.notification.info.alarmSeverity); } notificationColor(): string { diff --git a/ui-ngx/src/app/shared/models/alarm.models.ts b/ui-ngx/src/app/shared/models/alarm.models.ts index fda79a0154..76199faf2c 100644 --- a/ui-ngx/src/app/shared/models/alarm.models.ts +++ b/ui-ngx/src/app/shared/models/alarm.models.ts @@ -88,11 +88,21 @@ export const alarmSearchStatusTranslations = new Map( export const alarmSeverityColors = new Map( [ - [AlarmSeverity.CRITICAL, '#D12730'], - [AlarmSeverity.MAJOR, '#FEAC0C'], - [AlarmSeverity.MINOR, '#F2DA05'], - [AlarmSeverity.WARNING, '#F66716'], - [AlarmSeverity.INDETERMINATE, '#00000061'] + [AlarmSeverity.CRITICAL, 'var(--tb-alarm-severity-critical, rgb(209, 39, 48))'], + [AlarmSeverity.MAJOR, 'var(--tb-alarm-severity-major, rgb(246, 103, 22))'], + [AlarmSeverity.MINOR, 'var(--tb-alarm-severity-minor, rgb(250, 164, 5))'], + [AlarmSeverity.WARNING, 'var(--tb-alarm-severity-warning, rgb(242, 218, 5))'], + [AlarmSeverity.INDETERMINATE, 'var(--tb-alarm-severity-indeterminate, rgba(0, 0, 0, 0.38))'] + ] +); + +export const alarmSeverityBackgroundColors = new Map( + [ + [AlarmSeverity.CRITICAL, `var(--tb-alarm-severity-critical-bg, rgba(209, 39, 48, 0.06))`], + [AlarmSeverity.MAJOR, 'var(--tb-alarm-severity-major-bg, rgba(246, 103, 22, 0.06))'], + [AlarmSeverity.MINOR, 'var(--tb-alarm-severity-minor-bg, rgba(250, 164, 5, 0.06))'], + [AlarmSeverity.WARNING, 'var(--tb-alarm-severity-warning-bg, rgba(242, 218, 5, 0.06))'], + [AlarmSeverity.INDETERMINATE, 'var(--tb-alarm-severity-indeterminate-bg, rgba(0, 0, 0, 0.06))'] ] ); From 73a09f79d21ad036f27f91bce025af35ccd53103 Mon Sep 17 00:00:00 2001 From: Maksym Tsymbarov Date: Tue, 23 Dec 2025 13:05:00 +0200 Subject: [PATCH 074/579] Simplified logic --- .../home/components/alarm/alarm-comment.component.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts index 220a49210d..6d426cdcd0 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts @@ -154,22 +154,20 @@ export class AlarmCommentComponent implements OnInit { private parseSystemComment(alarm: AlarmCommentInfo): string { const subTypeKey = alarm.comment?.subtype; - const alarmComment = deepClone(alarm.comment); if (subTypeKey && AlarmMessage[subTypeKey]) { + const alarmComment = deepClone(alarm.comment); const translationKey = AlarmMessage[subTypeKey]; if (alarmComment?.newSeverity) { - const newSeverityKey = + alarmComment.newSeverity = (alarmSeverityTranslations.has(alarmComment.newSeverity) - ? alarmSeverityTranslations.get(alarmComment.newSeverity) + ? this.translate.instant(alarmSeverityTranslations.get(alarmComment.newSeverity)) : alarmComment.newSeverity) as AlarmSeverity; - alarmComment.newSeverity = this.translate.instant(newSeverityKey); } if (alarmComment?.oldSeverity) { - const oldSeverityKey = + alarmComment.oldSeverity = (alarmSeverityTranslations.has(alarmComment.oldSeverity) - ? alarmSeverityTranslations.get(alarmComment.oldSeverity) + ? this.translate.instant(alarmSeverityTranslations.get(alarmComment.oldSeverity)) : alarmComment.oldSeverity) as AlarmSeverity; - alarmComment.oldSeverity = this.translate.instant(oldSeverityKey); } return this.translate.instant(translationKey, alarmComment); } From 8f90c7fb659e7c5e101b0692e0079d27c1631dca Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Tue, 23 Dec 2025 14:47:08 +0200 Subject: [PATCH 075/579] added help pages for related entities aggregation scripts --- ...culated-field-metrics-panel.component.html | 2 +- .../en_US/calculated-field/expression_fn.md | 9 ++- .../calculated-field/filter_expression_fn.md | 64 ++++++++++++++- .../calculated-field/map_expression_fn.md | 79 +++++++++++++++++++ 4 files changed, 149 insertions(+), 5 deletions(-) create mode 100644 ui-ngx/src/assets/help/en_US/calculated-field/map_expression_fn.md diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.html index f86c15ba73..178fedbecd 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.html @@ -170,7 +170,7 @@ [highlightRules]="highlightRules" [editorCompleter]="editorCompleter" [helpPopupStyle]="{ width: '1200px' }" - helpId="calculated-field/expression_fn"> + helpId="calculated-field/map_expression_fn">
{{ 'api-usage.tbel' | translate }}
diff --git a/ui-ngx/src/assets/help/en_US/calculated-field/expression_fn.md b/ui-ngx/src/assets/help/en_US/calculated-field/expression_fn.md index 1d45dea3c8..6129dac351 100644 --- a/ui-ngx/src/assets/help/en_US/calculated-field/expression_fn.md +++ b/ui-ngx/src/assets/help/en_US/calculated-field/expression_fn.md @@ -11,12 +11,16 @@ function calculate(ctx, arg1, arg2, ...): object | object[] ### Supported Arguments +Arguments are passed to the function by **name** defined in the calculated field configuration. + There are three types of arguments supported in the calculated field configuration: #### Attribute and Latest Telemetry Arguments These arguments are single values and may be of type: boolean, int64 (long), double, string, or JSON. +#### Direct argument access via **``** + **Example: Convert Temperature from Fahrenheit to Celsius** ```javascript @@ -26,7 +30,9 @@ return { } ``` -Alternatively, using `ctx` to access the argument as an object: +#### Accessing argument via **`ctx.args.`** + +In addition to direct access, arguments can be accessed via the `ctx.args.` object, which includes both the `value` of an argument and its timestamp as `ts`: ```json { @@ -37,7 +43,6 @@ Alternatively, using `ctx` to access the argument as an object: } ``` -You may notice that the object includes both the `value` of an argument and its timestamp as `ts`. Let's modify the function that converts Fahrenheit to Celsius to also return the timestamp information: ```javascript diff --git a/ui-ngx/src/assets/help/en_US/calculated-field/filter_expression_fn.md b/ui-ngx/src/assets/help/en_US/calculated-field/filter_expression_fn.md index ce8ca22f51..22316fe418 100644 --- a/ui-ngx/src/assets/help/en_US/calculated-field/filter_expression_fn.md +++ b/ui-ngx/src/assets/help/en_US/calculated-field/filter_expression_fn.md @@ -1,10 +1,70 @@ ## Calculated Field TBEL Filter Function -The **filter()** function is a user-defined script that enables custom calculations using [TBEL](${siteBaseUrl}/docs${docPlatformPrefix}/user-guide/tbel/) on telemetry and attribute data. +The **filter()** function is a [TBEL](${siteBaseUrl}/docs${docPlatformPrefix}/user-guide/tbel/) script used in aggregation metrics of a calculated field. + It receives arguments configured in the calculated field setup, along with an additional `ctx` object that stores `latestTs` and provides access to all arguments. +It allows you to include or exclude related entities from aggregation based on their telemetry or attribute values. + +The filter is evaluated per related entity before the aggregation function is applied. + ### Function Signature ```javascript -function calculate(ctx, arg1, arg2, ...): boolean +function filter(ctx, arg1, arg2, ...): boolean +``` + +### Supported Arguments + +Arguments are passed to the function by **name** defined in the calculated field configuration. + +There are two types of arguments supported in the calculated field configuration: **Attribute and Latest Telemetry Arguments** + +These arguments are single values and may be of type: boolean, int64 (long), double, string, or JSON. + +#### Direct argument access via **``** + +**Example: Count free parking spaces** + +**Goal**: Include only parking spaces that are active and not occupied. + +```javascript +return active == true && occupied == false; +``` + +Only entities that satisfy this condition will be included in the aggregation. + +#### Accessing argument via **`ctx.args.`** + +In addition to direct access, arguments can be accessed via the `ctx.args.` object, which includes both the `value` of an argument and its timestamp as `ts`: + +```json +{ + "consumption": { + "ts": 1740644656669, + "value": 542.6 + } +} +``` + +The `ctx.latestTs` property represents the latest timestamp across all related entities and their arguments participating in the aggregation. + +**Example: Calculate the total consumption across multiple related pumps** + +**Scenario**: Each pump reports consumption telemetry approximately every 10 minutes, but reporting times may vary due to network delays (up to ~30 seconds). +To avoid counting outdated values, only recently updated telemetry should be included. + +**Goal**: Include only pumps whose consumption value was reported within 1 minute of the latest timestamp. + +```javascript +var ONE_MINUTE = 60 * 1000; +return (ctx.latestTs - ctx.args.consumption.ts) <= ONE_MINUTE; ``` + +### Function return format + +The function **must** return a boolean: +- `true` → include entity in aggregation +- `false` → exclude entity from aggregation + +Any other return type is considered invalid. diff --git a/ui-ngx/src/assets/help/en_US/calculated-field/map_expression_fn.md b/ui-ngx/src/assets/help/en_US/calculated-field/map_expression_fn.md new file mode 100644 index 0000000000..41ccf3540b --- /dev/null +++ b/ui-ngx/src/assets/help/en_US/calculated-field/map_expression_fn.md @@ -0,0 +1,79 @@ +## Calculated Field TBEL Map Function + +The **map()** function is a [TBEL](${siteBaseUrl}/docs${docPlatformPrefix}/user-guide/tbel/) script used in aggregation metrics of a calculated field. + +It determines the value applied by each related entity to the aggregation. + +The function receives arguments configured in the calculated field setup, along with an additional `ctx` object that stores `latestTs` and provides access to all arguments. + +The function is evaluated **per related entity**, after filtering is applied. + +### Function Signature + +```javascript +function map(ctx, arg1, arg2, ...): number | boolean | string +``` + +### Supported Arguments + +Arguments are passed to the function by **name** defined in the calculated field configuration. + +There are two types of arguments supported in the calculated field configuration: **Attribute and Latest Telemetry Arguments** + +These arguments are single values and may be of type: boolean, int64 (long), double, string, or JSON. + +#### Direct argument access via **``** + +**Example: Calculate average temperature across sensors** + +**Scenario**: Multiple related sensors report temperature in Fahrenheit. You want to aggregate temperature values, but the aggregation must be performed in Celsius. + +**Goal**: Convert temperature to Celsius before aggregation + +```javascript +var temperatureC = (temperature - 32) / 1.8; +return toFixed(temperatureC, 2); +``` + +Instead of creating a separate calculated field for conversion, the transformation is performed per entity, before aggregation. + +#### Accessing argument via **`ctx.args.`** + +In addition to direct access, arguments can be accessed via the `ctx.args.` object, which includes both the `value` of an argument and its timestamp as `ts`: + +```json +{ + "temperature": { + "ts": 1740644656761, + "value": 33.6 + } +} +``` + +The `ctx.latestTs` property represents the latest timestamp across all related entities and their arguments participating in the aggregation. + +**Example: Calculate average temperature** + +**Scenario**: Each sensor reports temperature approximately every 10 minutes, but reporting times may vary due to network delays (up to ~30 seconds). +If a temperature value is outdated, you want the entity to remain part of the aggregation, but contribute a default value instead of a stale one. + +**Goal**: Return a default value when the temperature was not reported within 1 minute of the latest aggregation timestamp. + +```javascript +var ONE_MINUTE = 60 * 1000; +if ((ctx.latestTs - ctx.args.temperature.ts) > ONE_MINUTE) { + return 0; +}; +return temperature; +``` + +### Function return format + +The returned value is passed directly to the aggregation engine: + +| Aggregation function | Expected return value | +|--------------------------------|-----------------------| +| Count, Count unique | any value | +| Sum, Average, Minimum, Maximum | number | + +Returning a value of an incompatible type may result in the entity being ignored or the aggregation producing incorrect results. From 1ff694f0fd0f233012ac3e2093835c59f4d74230 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Tue, 23 Dec 2025 15:21:41 +0200 Subject: [PATCH 076/579] Revert to Java 17 due to fonts issue --- msa/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msa/pom.xml b/msa/pom.xml index 66e92678ce..a210c45eef 100644 --- a/msa/pom.xml +++ b/msa/pom.xml @@ -32,7 +32,7 @@ ${basedir}/.. thingsboard - thingsboard/openjdk25:trixie-slim + thingsboard/openjdk17:bookworm-slim true true 1.4.13 From cff9286290c507e8f2e953f85b11ffaecdc5ae0f Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Tue, 23 Dec 2025 15:49:02 +0200 Subject: [PATCH 077/579] Add optional latest tag push for LTS --- msa/pom.xml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/msa/pom.xml b/msa/pom.xml index 66e92678ce..6af7521df6 100644 --- a/msa/pom.xml +++ b/msa/pom.xml @@ -134,6 +134,7 @@ 4.2.1-latest + false @@ -141,6 +142,28 @@ org.codehaus.mojo exec-maven-plugin + + push-latest-docker-amd-arm-images + ${docker.push-arm-amd-image.phase} + + exec + + + ${docker.skip.latest.tag} + docker + ${project.build.directory} + + buildx + build + -t + ${docker.repo}/${docker.name}:latest + --platform=linux/amd64,linux/arm64 + -o + type=registry + . + + + push-version-docker-amd-arm-images ${docker.push-arm-amd-image.phase} From 0ea0dcadc04cfc27913cf330444581170341ec10 Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Tue, 23 Dec 2025 18:41:40 +0200 Subject: [PATCH 078/579] UI: overide alarm severity colors from widget and dashboard css settings --- ui-ngx/src/app/core/services/utils.service.ts | 4 ++-- .../components/dashboard-page/dashboard-page.component.ts | 1 + .../home/components/dashboard-page/dashboard-page.models.ts | 1 + .../widget/lib/alarm/alarms-table-widget.component.ts | 2 +- .../home/components/widget/widget-container.component.ts | 4 ++-- ui-ngx/src/app/modules/home/models/widget-component.models.ts | 2 ++ 6 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ui-ngx/src/app/core/services/utils.service.ts b/ui-ngx/src/app/core/services/utils.service.ts index a57e3480b1..045725271c 100644 --- a/ui-ngx/src/app/core/services/utils.service.ts +++ b/ui-ngx/src/app/core/services/utils.service.ts @@ -454,11 +454,11 @@ export class UtilsService { return base64toObj(b64Encoded); } - public applyCssToElement(renderer: Renderer2, element: any, cssClassPrefix: string, css: string): string { + public applyCssToElement(renderer: Renderer2, element: any, cssClassPrefix: string, css: string, addTbDefaultClass: boolean = false): string { const cssParser = new cssjs(); cssParser.testMode = false; const cssClass = `${cssClassPrefix}-${guid()}`; - cssParser.cssPreviewNamespace = cssClass; + cssParser.cssPreviewNamespace = addTbDefaultClass ? 'tb-default .' + cssClass : cssClass; cssParser.createStyleElement(cssClass, css); renderer.addClass(element, cssClass); return cssClass; diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.ts index d0c3325c72..090822a146 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.ts @@ -548,6 +548,7 @@ export class DashboardPageComponent extends PageComponent implements IDashboardC const cssParser = new cssjs(); cssParser.testMode = false; this.dashboardPageClass = 'tb-dashboard-page-css-' + guid(); + this.dashboardCtx.dashboardCssClass = this.dashboardPageClass; cssParser.cssPreviewNamespace = 'tb-default .' + this.dashboardPageClass; cssParser.createStyleElement(this.dashboardPageClass, cssString); } diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.models.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.models.ts index a0fa516374..fec05ff2dd 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.models.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.models.ts @@ -51,6 +51,7 @@ export interface DashboardContext { stateChanged: Observable; stateId: Observable; runChangeDetection: () => void; + dashboardCssClass?: string; } export interface IDashboardController { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/alarm/alarms-table-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/alarm/alarms-table-widget.component.ts index bf715330a7..357eed49d2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/alarm/alarms-table-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/alarm/alarms-table-widget.component.ts @@ -968,7 +968,7 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, (AlarmDetailsDialogComponent, { disableClose: true, - panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], + panelClass: ['tb-dialog', 'tb-fullscreen-dialog', this.ctx.stateController.dashboardCtrl.dashboardCtx.dashboardCssClass, this.ctx.widgetCssClass], data: { alarmId: alarm.id.id, allowAcknowledgment: this.allowAcknowledgment, diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-container.component.ts b/ui-ngx/src/app/modules/home/components/widget/widget-container.component.ts index 51ed592e7e..6edac690e7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-container.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget-container.component.ts @@ -151,8 +151,8 @@ export class WidgetContainerComponent extends PageComponent implements OnInit, O this.widget.widgetContext.containerChangeDetector = this.cd; const cssString = this.widget.widget.config.widgetCss; if (isNotEmptyStr(cssString)) { - this.cssClass = - this.utils.applyCssToElement(this.renderer, this.gridsterItem.el, 'tb-widget-css', cssString); + this.cssClass = this.utils.applyCssToElement(this.renderer, this.gridsterItem.el, 'tb-widget-css', cssString, true); + this.widget.widgetContext.widgetCssClass = this.cssClass; } $(this.gridsterItem.el).on('mousedown', (e) => this.onMouseDown(e.originalEvent)); $(this.gridsterItem.el).on('click', (e) => this.onClicked(e.originalEvent)); diff --git a/ui-ngx/src/app/modules/home/models/widget-component.models.ts b/ui-ngx/src/app/modules/home/models/widget-component.models.ts index 293381194e..d3349b2ed4 100644 --- a/ui-ngx/src/app/modules/home/models/widget-component.models.ts +++ b/ui-ngx/src/app/modules/home/models/widget-component.models.ts @@ -308,6 +308,8 @@ export class WidgetContext { widgetNamespace?: string; subscriptionApi?: WidgetSubscriptionApi; + widgetCssClass?: string; + actionsApi?: WidgetActionsApi; activeEntityInfo?: SubscriptionEntityInfo; From 960481752157fe641b7328952ba5563db38c3df2 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Tue, 23 Dec 2025 19:25:14 +0200 Subject: [PATCH 079/579] UI: Add cf details page --- .../calculated-field.component.html | 192 ++++++++++++++++++ .../calculated-field.component.scss | 18 ++ .../calculated-field.component.ts | 166 +++++++++++++++ .../calculated-field.module.ts | 4 +- .../calculated-fields-table-config.ts | 52 +++-- .../calculated-fields-table.component.ts | 4 +- .../debug/entity-debug-settings.service.ts | 4 +- .../calculated-fields-routing.module.ts | 84 +++++++- .../app/shared/models/entity-type.models.ts | 8 +- .../assets/locale/locale.constant-en_US.json | 3 +- 10 files changed, 510 insertions(+), 25 deletions(-) create mode 100644 ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html create mode 100644 ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.scss create mode 100644 ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html new file mode 100644 index 0000000000..5513770627 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html @@ -0,0 +1,192 @@ + +
+ + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
{{ 'common.general' | translate }}
+
+ + {{ 'entity-field.title' | translate }} + + @if (entityForm.get('name').errors && entityForm.get('name').touched) { + + @if (entityForm.get('name').hasError('required')) { + {{ 'common.hint.title-required' | translate }} + } @else if (entityForm.get('name').hasError('pattern')) { + {{ 'common.hint.title-pattern' | translate }} + } @else if (entityForm.get('name').hasError('maxlength')) { + {{ 'common.hint.title-max-length' | translate }} + } + + } + + + +
+ + + {{ 'common.type' | translate }} + + @for (type of fieldTypes; track type) { + {{ CalculatedFieldTypeTranslations.get(type).name | translate}} + } + + @if (CalculatedFieldTypeTranslations.get(entityForm.get('type').value).hint) { + {{ CalculatedFieldTypeTranslations.get(entityForm.get('type').value).hint | translate }} + } + +
+ @switch (entityForm.get('type').value) { + @case (CalculatedFieldType.GEOFENCING) { + + } + @case (CalculatedFieldType.PROPAGATION) { + + } + @case (CalculatedFieldType.RELATED_ENTITIES_AGGREGATION) { + + } + @case (CalculatedFieldType.ENTITY_AGGREGATION) { + + } + @default { + + } + } +
+
+
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.scss b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.scss new file mode 100644 index 0000000000..7cfc6dfef2 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.scss @@ -0,0 +1,18 @@ +/** + * Copyright © 2016-2025 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. + */ +:host { + +} diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts new file mode 100644 index 0000000000..c521c624d4 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts @@ -0,0 +1,166 @@ +/// +/// Copyright © 2016-2025 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 { ChangeDetectorRef, Component, DestroyRef, Inject, Input } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { EntityComponent } from '../../components/entity/entity.component'; +import { FormBuilder, FormGroup, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; +import { AliasEntityType, EntityType } from '@shared/models/entity-type.models'; +import { NULL_UUID } from '@shared/models/id/has-uuid'; +import { ActionNotificationShow } from '@core/notification/notification.actions'; +import { TranslateService } from '@ngx-translate/core'; +import { AssetInfo } from '@app/shared/models/asset.models'; +import { EntityTableConfig } from '@home/models/entity/entities-table-config.models'; +import { + CalculatedFieldConfiguration, + CalculatedFieldInfo, calculatedFieldsEntityTypeList, + CalculatedFieldType, calculatedFieldTypes, CalculatedFieldTypeTranslations, OutputStrategyType +} from '@shared/models/calculated-field.models'; +import { oneSpaceInsideRegex } from '@shared/models/regex.constants'; +import { isDefined } from '@core/utils'; +import { EntityId } from '@shared/models/id/entity-id'; +import { pairwise, switchMap } from 'rxjs/operators'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { BaseData } from '@shared/models/base-data'; +import { Observable, of } from 'rxjs'; +import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; +import { getCurrentAuthUser } from '@core/auth/auth.selectors'; +import { + CalculatedFieldsTableConfig, + CalculatedFieldsTableEntity +} from '@home/components/calculated-fields/calculated-fields-table-config'; + +@Component({ + selector: 'tb-calculated-field', + templateUrl: './calculated-field.component.html', + styleUrls: ['./calculated-field.component.scss'] +}) +export class CalculatedFieldComponent extends EntityComponent { + + @Input() + standalone = false; + + @Input() + entityName: string; + + disabledConfiguration = false; + + readonly tenantId = getCurrentAuthUser(this.store).tenantId; + readonly ownerId = getCurrentAuthUser(this.store).tenantId; + readonly EntityType = EntityType; + readonly calculatedFieldsEntityTypeList = calculatedFieldsEntityTypeList; + readonly CalculatedFieldType = CalculatedFieldType; + readonly fieldTypes = calculatedFieldTypes; + readonly CalculatedFieldTypeTranslations = CalculatedFieldTypeTranslations; + + constructor(protected store: Store, + protected translate: TranslateService, + @Inject('entity') protected entityValue: CalculatedFieldInfo, + @Inject('entitiesTableConfig') protected entitiesTableConfigValue: CalculatedFieldsTableConfig, + protected fb: FormBuilder, + protected cd: ChangeDetectorRef, + private destroyRef: DestroyRef, + private calculatedFieldsService: CalculatedFieldsService) { + super(store, fb, entityValue, entitiesTableConfigValue, cd); + } + + hideDelete() { + if (this.entitiesTableConfig) { + return !this.entitiesTableConfig.deleteEnabled(this.entity); + } else { + return false; + } + } + + isAssignedToCustomer(entity: AssetInfo): boolean { + return entity && entity.customerId && entity.customerId.id !== NULL_UUID; + } + + get entityId(): EntityId { + return this.entityForm.get('entityId').value; + } + + get entitiesTableConfig(): CalculatedFieldsTableConfig { + return this.entitiesTableConfigValue; + } + + changeEntity(entity: BaseData): void { + this.entityName = entity?.name; + } + + buildForm(entity?: CalculatedFieldInfo): FormGroup { + const form = this.fb.group({ + name: ['', [Validators.required, Validators.pattern(oneSpaceInsideRegex), Validators.maxLength(255)]], + entityId: [null], + type: [CalculatedFieldType.SIMPLE], + debugSettings: [], + configuration: this.fb.control({} as CalculatedFieldConfiguration), + }); + form.get('type').valueChanges.pipe( + pairwise(), + takeUntilDestroyed(this.destroyRef) + ).subscribe(([prevType, nextType]) => { + if (![CalculatedFieldType.SIMPLE, CalculatedFieldType.SCRIPT].includes(prevType) || + ![CalculatedFieldType.SIMPLE, CalculatedFieldType.SCRIPT].includes(nextType)) { + form.get('configuration').setValue(({} as CalculatedFieldConfiguration), {emitEvent: false}); + } + }); + return form; + } + + updateForm(entity: CalculatedFieldInfo) { + const { configuration = {} as CalculatedFieldConfiguration, type = CalculatedFieldType.SIMPLE, debugSettings = { failuresEnabled: true, allEnabled: true }, entityId = this.entityId, ...value } = entity ?? {}; + if (configuration.type !== CalculatedFieldType.ALARM) { + if (isDefined(configuration?.output) && !configuration?.output?.strategy) { + configuration.output.strategy = {type: OutputStrategyType.RULE_CHAIN}; + } + } + this.entityForm.patchValue({ configuration, type, debugSettings, entityId, ...value }, {emitEvent: false}); + setTimeout(() => this.entityForm.get('type').updateValueAndValidity({onlySelf: true})); + if (!entityId) { + this.entityForm.get('configuration').disable({emitEvent: false}); + this.disabledConfiguration = true; + } + } + + onTestScript(expression?: string): Observable { + const calculatedFieldId = this.entityId?.id; + if (calculatedFieldId) { + return this.calculatedFieldsService.getLatestCalculatedFieldDebugEvent(calculatedFieldId, {ignoreLoading: true}) + .pipe( + switchMap(event => { + const args = event?.arguments ? JSON.parse(event.arguments) : null; + return this.entitiesTableConfig.getTestScriptDialog(this.entityFormValue(), args, false, expression); + }), + takeUntilDestroyed(this.destroyRef) + ) + } + + return this.entitiesTableConfig.getTestScriptDialog(this.entityFormValue(), null, false, expression); + } + + updateFormState() { + if (this.entityForm) { + if (this.isEditValue) { + this.entityForm.enable({emitEvent: false}); + this.entityForm.get('entityId').disable({emitEvent: false}); + } else { + this.entityForm.disable({emitEvent: false}); + } + } + } +} diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.module.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.module.ts index e3f5ac9cc2..8a9241970d 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.module.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.module.ts @@ -50,6 +50,7 @@ import { import { CalculatedFieldsFilterConfigComponent } from '@home/components/calculated-fields/table-header/calculated-fields-filter-config.component'; +import { CalculatedFieldComponent } from '@home/components/calculated-fields/calculated-field.component'; @NgModule({ declarations: [ @@ -57,7 +58,8 @@ import { CalculatedFieldScriptTestDialogComponent, CalculatedFieldTestArgumentsComponent, CalculatedFieldsHeaderComponent, - CalculatedFieldsFilterConfigComponent + CalculatedFieldsFilterConfigComponent, + CalculatedFieldComponent ], imports: [ CommonModule, diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts index 8385b5cb45..977e03e454 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts @@ -20,7 +20,7 @@ import { EntityTableColumn, EntityTableConfig } from '@home/models/entity/entities-table-config.models'; -import { EntityType, entityTypeTranslations } from '@shared/models/entity-type.models'; +import { EntityType, entityTypeResources, entityTypeTranslations } from '@shared/models/entity-type.models'; import { TranslateService } from '@ngx-translate/core'; import { Direction } from '@shared/models/page/sort-order'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; @@ -67,8 +67,11 @@ import { EventsDialogComponent, EventsDialogData } from '@home/dialogs/events-di import { CalculatedFieldsHeaderComponent } from '@home/components/calculated-fields/table-header/calculated-fields-header.component'; +import { EntityAction } from '@home/models/entity/entity-component.models'; +import { CalculatedFieldComponent } from '@home/components/calculated-fields/calculated-field.component'; +import { Router } from '@angular/router'; -type CalculatedFieldsTableEntity = CalculatedField | CalculatedFieldInfo; +export type CalculatedFieldsTableEntity = CalculatedField | CalculatedFieldInfo; export class CalculatedFieldsTableConfig extends EntityTableConfig { @@ -93,30 +96,33 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { - this.editCalculatedField($event, entity); - this.rowPointer = true; - return true; - }; + this.entityComponent = CalculatedFieldComponent; + this.rowPointer = true; } this.tableTitle = this.pageMode ? '' : this.translate.instant('entity.type-calculated-fields'); - this.detailsPanelEnabled = false; + this.detailsPanelEnabled = this.pageMode; this.entityType = EntityType.CALCULATED_FIELD; this.entityTranslations = entityTypeTranslations.get(EntityType.CALCULATED_FIELD); + this.entityResources = entityTypeResources.get(EntityType.CALCULATED_FIELD); this.entitiesFetchFunction = (pageLink: PageLink) => this.fetchCalculatedFields(pageLink); this.addEntity = this.getCalculatedFieldDialog.bind(this); + this.loadEntity = id => this.calculatedFieldsService.getCalculatedFieldById(id.id); this.deleteEntityTitle = (field) => this.translate.instant('calculated-fields.delete-title', {title: field.name}); this.deleteEntityContent = () => this.translate.instant('calculated-fields.delete-text'); this.deleteEntitiesTitle = count => this.translate.instant('calculated-fields.delete-multiple-title', {count}); this.deleteEntitiesContent = () => this.translate.instant('calculated-fields.delete-multiple-text'); this.deleteEntity = id => this.calculatedFieldsService.deleteCalculatedField(id.id); + + this.onEntityAction = action => this.onCFAction(action); + this.addActionDescriptors = [ { name: this.translate.instant('calculated-fields.create'), @@ -172,14 +178,16 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig true, iconFunction: ({ debugSettings }) => this.entityDebugSettingsService.isDebugActive(debugSettings?.allEnabledUntil) || debugSettings?.failuresEnabled ? 'mdi:bug' : 'mdi:bug-outline', onAction: ($event, entity) => this.onOpenDebugConfig($event, entity), - }, - { + } + ); + if (!this.pageMode) { + this.cellActionDescriptors.push({ name: this.translate.instant('action.edit'), icon: 'edit', isEnabled: () => true, onAction: ($event, entity) => this.editCalculatedField($event, entity), - } - ); + }) + } } fetchCalculatedFields(pageLink: PageLink): Observable> { @@ -354,7 +362,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig this.updateData()); } - private getTestScriptDialog(calculatedField: CalculatedFieldsTableEntity, argumentsObj?: CalculatedFieldEventArguments, openCalculatedFieldEdit = true, expression?: string): Observable { + getTestScriptDialog(calculatedField: CalculatedFieldsTableEntity, argumentsObj?: CalculatedFieldEventArguments, openCalculatedFieldEdit = true, expression?: string): Observable { if ( calculatedField.type === CalculatedFieldType.SCRIPT || calculatedField.type === CalculatedFieldType.RELATED_ENTITIES_AGGREGATION || @@ -394,4 +402,22 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig): boolean { + switch (action.action) { + case 'open': + this.openCalculatedField(action.event, action.entity); + return true; + case 'export': + this.exportCalculatedField(action.event, action.entity); + return true; + } + return false; + } } diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table.component.ts index 2a0c29e31a..7687277113 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table.component.ts @@ -36,7 +36,7 @@ import { ImportExportService } from '@shared/import-export/import-export.service import { EntityDebugSettingsService } from '@home/components/entity/debug/entity-debug-settings.service'; import { DatePipe } from '@angular/common'; import { UtilsService } from "@core/services/utils.service"; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; @Component({ selector: 'tb-calculated-fields-table', @@ -70,6 +70,7 @@ export class CalculatedFieldsTableComponent { private utilsService: UtilsService, private destroyRef: DestroyRef, private route: ActivatedRoute, + private router: Router ) { this.pageMode = !!this.route.snapshot.data.isPage; effect(() => { @@ -88,6 +89,7 @@ export class CalculatedFieldsTableComponent { this.importExportService, this.entityDebugSettingsService, this.utilsService, + this.router, this.pageMode, ); this.cd.markForCheck(); diff --git a/ui-ngx/src/app/modules/home/components/entity/debug/entity-debug-settings.service.ts b/ui-ngx/src/app/modules/home/components/entity/debug/entity-debug-settings.service.ts index cb982b9650..76def20a24 100644 --- a/ui-ngx/src/app/modules/home/components/entity/debug/entity-debug-settings.service.ts +++ b/ui-ngx/src/app/modules/home/components/entity/debug/entity-debug-settings.service.ts @@ -22,7 +22,9 @@ import { TranslateService } from '@ngx-translate/core'; import { DurationLeftPipe } from '@shared/pipe/duration-left.pipe'; import { EntityDebugSettingPanelConfig } from '@home/components/entity/debug/entity-debug-settings.model'; -@Injectable() +@Injectable({ + providedIn: 'root' +}) export class EntityDebugSettingsService { constructor( diff --git a/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-routing.module.ts b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-routing.module.ts index 0ed435075c..03be3d86f6 100644 --- a/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-routing.module.ts +++ b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-routing.module.ts @@ -14,24 +14,94 @@ /// limitations under the License. /// -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { DestroyRef, inject, NgModule, Renderer2 } from '@angular/core'; +import { ActivatedRouteSnapshot, ResolveFn, Router, RouterModule, RouterStateSnapshot, Routes } from '@angular/router'; import { Authority } from '@shared/models/authority.enum'; import { MenuId } from '@core/services/menu.models'; import { CalculatedFieldsTableComponent } from '@home/components/calculated-fields/calculated-fields-table.component'; +import { EntityDetailsPageComponent } from '@home/components/entity/entity-details-page.component'; +import { ConfirmOnExitGuard } from '@core/guards/confirm-on-exit.guard'; +import { entityDetailsPageBreadcrumbLabelFunction } from '@home/pages/home-pages.models'; +import { BreadCrumbConfig } from '@shared/components/breadcrumb'; +import { CalculatedFieldsTableConfig } from '@home/components/calculated-fields/calculated-fields-table-config'; +import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; +import { TranslateService } from '@ngx-translate/core'; +import { MatDialog } from '@angular/material/dialog'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { DatePipe } from '@angular/common'; +import { ImportExportService } from '@shared/import-export/import-export.service'; +import { EntityDebugSettingsService } from '@home/components/entity/debug/entity-debug-settings.service'; +import { UtilsService } from '@core/services/utils.service'; + +export const CalculatedFieldsTableConfigResolver: ResolveFn = + (_route: ActivatedRouteSnapshot, + _state: RouterStateSnapshot, + calculatedFieldsService = inject(CalculatedFieldsService), + translate = inject(TranslateService), + dialog = inject(MatDialog), + store = inject(Store), + datePipe = inject(DatePipe), + destroyRef = inject(DestroyRef), + importExportService = inject(ImportExportService), + entityDebugSettingsService = inject(EntityDebugSettingsService), + utilsService = inject(UtilsService), + router = inject(Router), + ) => { + return new CalculatedFieldsTableConfig( + calculatedFieldsService, + translate, + dialog, + datePipe, + null, + store, + destroyRef, + null, + null, + null, + importExportService, + entityDebugSettingsService, + utilsService, + router, + false, + ); + }; const routes: Routes = [ { path: 'calculatedFields', - component: CalculatedFieldsTableComponent, data: { - auth: [Authority.TENANT_ADMIN], - title: 'entity.type-calculated-fields', breadcrumb: { menuId: MenuId.calculated_fields + } + }, + children: [ + { + path: '', + component: CalculatedFieldsTableComponent, + data: { + auth: [Authority.TENANT_ADMIN], + title: 'entity.type-calculated-fields', + isPage: true, + } }, - isPage: true, - } + { + path: ':entityId', + component: EntityDetailsPageComponent, + canDeactivate: [ConfirmOnExitGuard], + data: { + breadcrumb: { + labelFunction: entityDetailsPageBreadcrumbLabelFunction, + icon: 'mdi:function-variant' + } as BreadCrumbConfig, + auth: [Authority.TENANT_ADMIN], + title: 'entity.type-calculated-fields', + }, + resolve: { + entitiesTableConfig: CalculatedFieldsTableConfigResolver + } + } + ] } ]; diff --git a/ui-ngx/src/app/shared/models/entity-type.models.ts b/ui-ngx/src/app/shared/models/entity-type.models.ts index 48428932e4..bc0d3fd470 100644 --- a/ui-ngx/src/app/shared/models/entity-type.models.ts +++ b/ui-ngx/src/app/shared/models/entity-type.models.ts @@ -490,7 +490,7 @@ export const entityTypeTranslations = new Map Date: Wed, 24 Dec 2025 11:53:15 +0200 Subject: [PATCH 080/579] Exclude TbAiNode for Edge-4.1 --- .../server/service/edge/EdgeMsgConstructorUtils.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java index e1c7f1198c..c5579098a4 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java @@ -27,6 +27,7 @@ import com.google.gson.reflect.TypeToken; import lombok.extern.slf4j.Slf4j; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.rule.engine.action.TbSaveToCustomCassandraTableNode; +import org.thingsboard.rule.engine.ai.TbAiNode; import org.thingsboard.rule.engine.aws.lambda.TbAwsLambdaNode; import org.thingsboard.rule.engine.rest.TbSendRestApiCallReplyNode; import org.thingsboard.rule.engine.telemetry.TbCalculatedFieldsNode; @@ -167,6 +168,10 @@ public class EdgeMsgConstructorUtils { ); public static final Map> EXCLUDED_NODES_BY_EDGE_VERSION = Map.of( + EdgeVersion.V_4_1_0, + Set.of( + TbAiNode.class.getName() + ), EdgeVersion.V_3_9_0, Set.of( TbCalculatedFieldsNode.class.getName() From bd95161fa7cee882c2b43c53a6ea45dd176045ee Mon Sep 17 00:00:00 2001 From: Nikita Mazurenko Date: Wed, 24 Dec 2025 15:02:57 +0200 Subject: [PATCH 081/579] Exclude TbAiNode for Edge-4.0 --- .../server/service/edge/EdgeMsgConstructorUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java index c5579098a4..513163d54a 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java @@ -172,6 +172,10 @@ public class EdgeMsgConstructorUtils { Set.of( TbAiNode.class.getName() ), + EdgeVersion.V_4_0_0, + Set.of( + TbAiNode.class.getName() + ), EdgeVersion.V_3_9_0, Set.of( TbCalculatedFieldsNode.class.getName() From bfc0374a1d0f46d1a8fabcbeafe91925524d6ced Mon Sep 17 00:00:00 2001 From: Ekaterina Chantsova Date: Wed, 24 Dec 2025 15:29:52 +0200 Subject: [PATCH 082/579] Map widget: enable history-only mode when comparison aggregation is enabled for latest key --- .../basic/map/map-basic-config.component.html | 4 +++- .../basic/map/map-basic-config.component.ts | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.html b/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.html index 43bfeb73ad..d36ec694b6 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.html @@ -16,7 +16,9 @@ --> - + Date: Wed, 24 Dec 2025 15:52:21 +0200 Subject: [PATCH 083/579] extended getTenantsByIds API for tenant admins --- .../server/controller/TenantController.java | 15 +++++++++++++-- .../server/controller/TenantControllerTest.java | 5 +++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/TenantController.java b/application/src/main/java/org/thingsboard/server/controller/TenantController.java index 2071918dc1..f278f4fd18 100644 --- a/application/src/main/java/org/thingsboard/server/controller/TenantController.java +++ b/application/src/main/java/org/thingsboard/server/controller/TenantController.java @@ -169,7 +169,7 @@ public class TenantController extends BaseController { return checkNotNull(tenantService.findTenantInfos(pageLink)); } - @PreAuthorize("hasAnyAuthority('SYS_ADMIN')") + @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") @GetMapping(value = "/tenants", params = {"tenantIds"}) public List getTenantsByIds( @Parameter(description = "A list of tenant ids, separated by comma ','", array = @ArraySchema(schema = @Schema(type = "string"))) @@ -179,7 +179,18 @@ public class TenantController extends BaseController { for (UUID tenantIdUUID : tenantUUIDs) { tenantIds.add(TenantId.fromUUID(tenantIdUUID)); } - return tenantService.findTenantsByIds(tenantId, tenantIds); + List tenants = tenantService.findTenantsByIds(tenantId, tenantIds); + return filterTenantsByReadPermission(tenants); + } + + private List filterTenantsByReadPermission(List tenants) { + return tenants.stream().filter(tenant -> { + try { + return accessControlService.hasPermission(getCurrentUser(), Resource.TENANT, Operation.READ, tenant.getId(), tenant); + } catch (ThingsboardException e) { + return false; + } + }).toList(); } } diff --git a/application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java index 4b439ab4f9..1c0776c2ce 100644 --- a/application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java @@ -219,6 +219,11 @@ public class TenantControllerTest extends AbstractControllerTest { Assert.assertEquals(savedTenant, foundTenant); } + loginTenantAdmin(); + Tenant[] foundTenantsByTenant = doGet("/api/tenants?tenantIds=" + idsParam, Tenant[].class); + assertThat(foundTenantsByTenant).isEmpty(); + + loginSysAdmin(); for (Tenant savedTenant : savedTenants) { deleteTenant(savedTenant.getId()); } From ac7c710e5df60c18032615a97147364ba7038e87 Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Wed, 24 Dec 2025 16:03:02 +0200 Subject: [PATCH 084/579] UI: Fixed bug with cf page --- .../calculated-field.component.html | 7 ++++++- .../calculated-fields/calculated-field.component.ts | 2 +- .../calculated-fields-table-config.ts | 2 +- .../output/calculated-field-output.component.ts | 2 +- .../simple-configuration.component.ts | 2 +- .../components/entity/entity-select.component.html | 2 ++ .../components/entity/entity-select.component.ts | 13 ++++++++++++- 7 files changed, 24 insertions(+), 6 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html index 5513770627..10ab150b69 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html @@ -125,7 +125,12 @@ [additionalActionConfig]="entitiesTableConfig.additionalDebugActionConfig" />
- + + {{ 'common.type' | translate }} diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts index c521c624d4..0b62d9bb96 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts @@ -60,7 +60,7 @@ export class CalculatedFieldComponent extends EntityComponent void): void { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.ts index e6ff1d1bad..2771795635 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.ts @@ -109,6 +109,7 @@ export class SimpleConfigurationComponent implements ControlValueAccessor, Valid private propagateChange: (config: SimpeConfiguration) => void = () => { }; constructor(private fb: FormBuilder) { + this.updatedFormWithScript(); this.simpleConfiguration.get('output').valueChanges.pipe( takeUntilDestroyed(), ).subscribe(() => { @@ -151,7 +152,6 @@ export class SimpleConfigurationComponent implements ControlValueAccessor, Valid formValue.expressionSIMPLE = formValue.expression; } this.simpleConfiguration.patchValue(formValue, {emitEvent: false}); - this.updatedFormWithScript(); setTimeout(() => { this.simpleConfiguration.get('arguments').updateValueAndValidity({onlySelf: true}); }); diff --git a/ui-ngx/src/app/shared/components/entity/entity-select.component.html b/ui-ngx/src/app/shared/components/entity/entity-select.component.html index c0b4f1aafb..49e853e722 100644 --- a/ui-ngx/src/app/shared/components/entity/entity-select.component.html +++ b/ui-ngx/src/app/shared/components/entity/entity-select.component.html @@ -25,6 +25,7 @@ [useAliasEntityTypes]="useAliasEntityTypes" [allowedEntityTypes]="allowedEntityTypes" [additionEntityTypes]="additionEntityTypes" + [filterAllowedEntityTypes]="filterAllowedEntityTypes" formControlName="entityType">
diff --git a/ui-ngx/src/app/shared/components/entity/entity-select.component.ts b/ui-ngx/src/app/shared/components/entity/entity-select.component.ts index 5e75426952..fbfb7ae453 100644 --- a/ui-ngx/src/app/shared/components/entity/entity-select.component.ts +++ b/ui-ngx/src/app/shared/components/entity/entity-select.component.ts @@ -14,7 +14,7 @@ /// limitations under the License. /// -import { AfterViewInit, Component, DestroyRef, forwardRef, Input, OnInit } from '@angular/core'; +import { AfterViewInit, Component, DestroyRef, EventEmitter, forwardRef, Input, OnInit, Output } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @@ -26,6 +26,7 @@ import { NULL_UUID } from '@shared/models/id/has-uuid'; import { coerceBoolean } from '@shared/decorators/coercion'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { MatFormFieldAppearance } from '@angular/material/form-field'; +import { BaseData } from '@shared/models/base-data'; @Component({ selector: 'tb-entity-select', @@ -66,6 +67,12 @@ export class EntitySelectComponent implements ControlValueAccessor, OnInit, Afte @coerceBoolean() useEntityDisplayName = false; + @Input() + filterAllowedEntityTypes: boolean; + + @Output() + entityChanged = new EventEmitter>(); + displayEntityTypeSelect: boolean; AliasEntityType = AliasEntityType; @@ -176,4 +183,8 @@ export class EntitySelectComponent implements ControlValueAccessor, OnInit, Afte } } } + + changeEntity(entity: BaseData): void { + this.entityChanged.emit(entity); + } } From a35bbcc1de6d2ddfb845ca6c8295aa7496ec15df Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Wed, 24 Dec 2025 16:31:11 +0200 Subject: [PATCH 085/579] handle future telemetry and fill intervals after restart based on watermark --- ...tractCalculatedFieldProcessingService.java | 6 +- .../EntityAggregationArgumentEntry.java | 74 ++++++++++++++++--- ...EntityAggregationCalculatedFieldState.java | 18 +++++ .../utils/CalculatedFieldArgumentUtils.java | 4 +- .../EntityAggregationCalculatedFieldTest.java | 53 ++++++++++++- 5 files changed, 135 insertions(+), 20 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java b/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java index ec645085e6..cd88c93a71 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java @@ -233,7 +233,7 @@ public abstract class AbstractCalculatedFieldProcessingService { return config.getArguments().entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, - entry -> fetchTimeSeries(ctx.getTenantId(), entityId, entry.getValue(), config.getInterval(), ts) + entry -> fetchTimeSeries(ctx, entityId, entry.getValue(), config.getInterval(), ts) )); } @@ -341,11 +341,11 @@ public abstract class AbstractCalculatedFieldProcessingService { return resolveArgumentValue(argKey, argumentEntryFut); } - private ListenableFuture fetchTimeSeries(TenantId tenantId, EntityId entityId, Argument argument, AggInterval interval, long queryEndTs) { + private ListenableFuture fetchTimeSeries(CalculatedFieldCtx ctx, EntityId entityId, Argument argument, AggInterval interval, long queryEndTs) { long intervalStartTs = interval.getCurrentIntervalStartTs(); long intervalEndTs = interval.getCurrentIntervalEndTs(); ReadTsKvQuery query = new BaseReadTsKvQuery(argument.getRefEntityKey().getKey(), intervalStartTs, queryEndTs, 0, 1, Aggregation.NONE); - return fetchTimeSeriesInternal(tenantId, entityId, query, timeSeries -> transformAggregationArgument(timeSeries, intervalStartTs, intervalEndTs)); + return fetchTimeSeriesInternal(ctx.getTenantId(), entityId, query, timeSeries -> transformAggregationArgument(timeSeries, intervalStartTs, intervalEndTs, ctx)); } private ListenableFuture fetchTsRolling(TenantId tenantId, EntityId entityId, Argument argument, long queryEndTs) { diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationArgumentEntry.java index 7ec5098bc3..ef34b6ae8e 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationArgumentEntry.java @@ -19,11 +19,18 @@ import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.script.api.tbel.TbelCfArg; +import org.thingsboard.server.common.data.cf.configuration.aggregation.single.EntityAggregationCalculatedFieldConfiguration; +import org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval.AggInterval; +import org.thingsboard.server.common.data.cf.configuration.aggregation.single.interval.Watermark; import org.thingsboard.server.service.cf.ctx.state.ArgumentEntry; import org.thingsboard.server.service.cf.ctx.state.ArgumentEntryType; +import org.thingsboard.server.service.cf.ctx.state.CalculatedFieldCtx; import org.thingsboard.server.service.cf.ctx.state.SingleValueArgumentEntry; +import java.time.Instant; +import java.time.ZonedDateTime; import java.util.Map; +import java.util.concurrent.TimeUnit; @Data public class EntityAggregationArgumentEntry implements ArgumentEntry { @@ -32,10 +39,18 @@ public class EntityAggregationArgumentEntry implements ArgumentEntry { private boolean forceResetPrevious; + private AggInterval interval; + private long watermarkDuration; + public EntityAggregationArgumentEntry(Map aggIntervals) { this.aggIntervals = aggIntervals; } + public EntityAggregationArgumentEntry(Map aggIntervals, CalculatedFieldCtx ctx) { + this(aggIntervals); + setCtx(ctx); + } + @Override public ArgumentEntryType getType() { return ArgumentEntryType.ENTITY_AGGREGATION; @@ -46,29 +61,64 @@ public class EntityAggregationArgumentEntry implements ArgumentEntry { return aggIntervals; } + public void setCtx(CalculatedFieldCtx ctx) { + var configuration = (EntityAggregationCalculatedFieldConfiguration) ctx.getCalculatedField().getConfiguration(); + interval = configuration.getInterval(); + Watermark watermark = configuration.getWatermark(); + watermarkDuration = watermark == null ? 0 : TimeUnit.SECONDS.toMillis(watermark.getDuration()); + } + @Override public boolean updateEntry(ArgumentEntry entry) { - boolean updated = false; if (entry instanceof EntityAggregationArgumentEntry entityAggEntry) { aggIntervals.putAll(entityAggEntry.getAggIntervals()); + return true; } else if (entry instanceof SingleValueArgumentEntry singleValueArgEntry) { long entryTs = singleValueArgEntry.getTs(); - long argUpdateTs = System.currentTimeMillis(); - for (Map.Entry aggIntervalEntry : aggIntervals.entrySet()) { - if (singleValueArgEntry.isForceResetPrevious()) { - aggIntervalEntry.getValue().setLastArgsRefreshTs(argUpdateTs); - updated = true; - continue; - } - if (aggIntervalEntry.getKey().belongsToInterval(entryTs)) { - aggIntervalEntry.getValue().setLastArgsRefreshTs(argUpdateTs); - return true; - } + long now = System.currentTimeMillis(); + if (updateExistingIntervals(singleValueArgEntry, entryTs, now)) { + return true; + } + return createNewInterval(entryTs, now); + } + return false; + } + + private boolean updateExistingIntervals(SingleValueArgumentEntry entry, long entryTs, long now) { + boolean updated = false; + + for (Map.Entry aggIntervalEntry : aggIntervals.entrySet()) { + AggIntervalEntry interval = aggIntervalEntry.getKey(); + AggIntervalEntryStatus status = aggIntervalEntry.getValue(); + if (entry.isForceResetPrevious()) { + status.setLastArgsRefreshTs(now); + updated = true; + continue; + } + if (interval.belongsToInterval(entryTs)) { + status.setLastArgsRefreshTs(now); + return true; } } + return updated; } + private boolean createNewInterval(long entryTs, long now) { + ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochMilli(entryTs), interval.getZoneId()); + + long startTs = interval.getDateTimeIntervalStartTs(zdt); + long endTs = interval.getDateTimeIntervalEndTs(zdt); + + if (now - endTs > watermarkDuration) { + return false; + } + + AggIntervalEntry newInterval = new AggIntervalEntry(startTs, endTs); + aggIntervals.computeIfAbsent(newInterval, i -> new AggIntervalEntryStatus(now)); + return true; + } + @Override public boolean isEmpty() { return aggIntervals.isEmpty(); diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java index 0f6e01a344..59335717fb 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java @@ -82,6 +82,15 @@ public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldSt interval = configuration.getInterval(); metrics = configuration.getMetrics(); produceIntermediateResult = configuration.isProduceIntermediateResult(); + setCtxToArguments(); + } + + private void setCtxToArguments() { + arguments.values().forEach(argument -> { + if (argument instanceof EntityAggregationArgumentEntry entityAggArgument) { + entityAggArgument.setCtx(ctx); + } + }); } @Override @@ -154,8 +163,10 @@ public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldSt } private void fillMissingIntervals() { + long now = System.currentTimeMillis(); ZoneId zoneId = interval.getZoneId(); long currentIntervalEndTs = interval.getCurrentIntervalEndTs(); + long watermarkThresholdTs = now - watermarkDuration; Map> intervals = getIntervals(); AggIntervalEntry lastIntervalEntry = intervals.keySet().stream().max(Comparator.comparing(AggIntervalEntry::getEndTs)).orElse(null); @@ -169,6 +180,13 @@ public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldSt while (nextEnd.toInstant().toEpochMilli() <= currentIntervalEndTs) { long nextStartTs = nextStart.toInstant().toEpochMilli(); long nextEndTs = nextEnd.toInstant().toEpochMilli(); + + if (nextEndTs < watermarkThresholdTs) { + nextStart = nextEnd; + nextEnd = interval.getNextIntervalStart(nextStart); + continue; + } + AggIntervalEntry missing = new AggIntervalEntry(nextStartTs, nextEndTs); arguments.forEach((argName, argumentEntry) -> { diff --git a/application/src/main/java/org/thingsboard/server/utils/CalculatedFieldArgumentUtils.java b/application/src/main/java/org/thingsboard/server/utils/CalculatedFieldArgumentUtils.java index 7e0701cd2d..d6f08cbc69 100644 --- a/application/src/main/java/org/thingsboard/server/utils/CalculatedFieldArgumentUtils.java +++ b/application/src/main/java/org/thingsboard/server/utils/CalculatedFieldArgumentUtils.java @@ -75,7 +75,7 @@ public class CalculatedFieldArgumentUtils { return new SingleValueArgumentEntry(); } - public static ArgumentEntry transformAggregationArgument(List timeSeries, long startIntervalTs, long endIntervalTs) { + public static ArgumentEntry transformAggregationArgument(List timeSeries, long startIntervalTs, long endIntervalTs, CalculatedFieldCtx ctx) { Map aggIntervals = new HashMap<>(); AggIntervalEntry aggIntervalEntry = new AggIntervalEntry(startIntervalTs, endIntervalTs); if (timeSeries == null || timeSeries.isEmpty()) { @@ -83,7 +83,7 @@ public class CalculatedFieldArgumentUtils { } else { aggIntervals.put(aggIntervalEntry, new AggIntervalEntryStatus(System.currentTimeMillis())); } - return new EntityAggregationArgumentEntry(aggIntervals); + return new EntityAggregationArgumentEntry(aggIntervals, ctx); } private static KvEntry createDefaultKvEntry(Argument argument) { diff --git a/application/src/test/java/org/thingsboard/server/cf/EntityAggregationCalculatedFieldTest.java b/application/src/test/java/org/thingsboard/server/cf/EntityAggregationCalculatedFieldTest.java index 253d02ebe5..66c11a06a6 100644 --- a/application/src/test/java/org/thingsboard/server/cf/EntityAggregationCalculatedFieldTest.java +++ b/application/src/test/java/org/thingsboard/server/cf/EntityAggregationCalculatedFieldTest.java @@ -55,6 +55,8 @@ import static org.thingsboard.server.cf.CalculatedFieldIntegrationTest.POLL_INTE @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) public class EntityAggregationCalculatedFieldTest extends AbstractControllerTest { + private final String TZ = "Europe/Kyiv"; + private Tenant savedTenant; @Before @@ -93,7 +95,7 @@ public class EntityAggregationCalculatedFieldTest extends AbstractControllerTest public void testCreateCfAndNoTelemetryDuringInterval_checkAggregation() throws Exception { Device device = createDevice("Device", "1234567890111"); - CustomInterval customInterval = new CustomInterval("Europe/Kyiv", 0L, 5L); + CustomInterval customInterval = new CustomInterval(TZ, 0L, 5L); createConsumptionCF(device.getId(), customInterval, null); long interval = customInterval.getCurrentIntervalDurationMillis(); @@ -113,7 +115,7 @@ public class EntityAggregationCalculatedFieldTest extends AbstractControllerTest public void testCreateCfWithoutWatermark_checkAggregation() throws Exception { Device device = createDevice("Device", "1234567890111"); - CustomInterval customInterval = new CustomInterval("Europe/Kyiv", 0L, 5L); + CustomInterval customInterval = new CustomInterval(TZ, 0L, 5L); createConsumptionCF(device.getId(), customInterval, null); long currentIntervalStartTs = customInterval.getCurrentIntervalStartTs(); @@ -156,7 +158,7 @@ public class EntityAggregationCalculatedFieldTest extends AbstractControllerTest public void testCreateCfWithWatermark_checkAggregationDuringWatermark() throws Exception { Device device = createDevice("Device", "1234567890111"); - CustomInterval customInterval = new CustomInterval("Europe/Kyiv", 0L, 5L); + CustomInterval customInterval = new CustomInterval(TZ, 0L, 5L); Watermark watermark = new Watermark(10); createConsumptionCF(device.getId(), customInterval, watermark); @@ -196,6 +198,51 @@ public class EntityAggregationCalculatedFieldTest extends AbstractControllerTest }); } + @Test + public void testSendFutureTelemetry_checkAggregation() throws Exception { + Device device = createDevice("Device", "1234567890111"); + + CustomInterval customInterval = new CustomInterval(TZ, 0L, 2L); + createConsumptionCF(device.getId(), customInterval, null); + + long currentIntervalStartTs = customInterval.getCurrentIntervalStartTs(); + + long tsBeforeInterval = currentIntervalStartTs - 1000; + long tsInInterval_1 = currentIntervalStartTs + 1000; + long tsInInterval_2 = currentIntervalStartTs + 500; + long tsInInterval_3 = currentIntervalStartTs + 200; + postTelemetry(device.getId(), String.format("{\"ts\": \"%s\", \"values\": {\"energy\":120}}", tsBeforeInterval)); + postTelemetry(device.getId(), String.format("{\"ts\": \"%s\", \"values\": {\"energy\":100}}", tsInInterval_1)); + postTelemetry(device.getId(), String.format("{\"ts\": \"%s\", \"values\": {\"energy\":180}}", tsInInterval_2)); + postTelemetry(device.getId(), String.format("{\"ts\": \"%s\", \"values\": {\"energy\":120}}", tsInInterval_3)); + + long interval = customInterval.getCurrentIntervalDurationMillis(); + + await().alias("create CF -> perform aggregation after interval end") + .atMost(2 * interval, TimeUnit.MILLISECONDS) + .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) + .untilAsserted(() -> { + ObjectNode result = getLatestTelemetry(device.getId(), "consumption", "avgConsumption"); + assertThat(result).isNotNull(); + assertThat(result.get("consumption").get(0).get("value").asText()).isEqualTo("400"); + assertThat(result.get("avgConsumption").get(0).get("value").asText()).isEqualTo("133"); + }); + + postTelemetry(device.getId(), String.format("{\"ts\": \"%s\", \"values\": {\"energy\":500}}", currentIntervalStartTs + 4500L)); + + await().alias("update telemetry that belongs to future interval -> check aggregation ") + .atMost(3 * interval, TimeUnit.MILLISECONDS) + .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) + .untilAsserted(() -> { + ObjectNode result = getLatestTelemetry(device.getId(), "consumption", "avgConsumption"); + assertThat(result).isNotNull(); + assertThat(result.get("consumption").get(0).get("value").asText()).isEqualTo("500"); + assertThat(result.get("consumption").get(0).get("ts").asLong()).isEqualTo(currentIntervalStartTs + 4000L); + assertThat(result.get("avgConsumption").get(0).get("value").asText()).isEqualTo("500"); + assertThat(result.get("avgConsumption").get(0).get("ts").asLong()).isEqualTo(currentIntervalStartTs + 4000L); + }); + } + private CalculatedField createConsumptionCF(EntityId entityId, AggInterval aggInterval, Watermark watermark) { Map arguments = new HashMap<>(); Argument argument = new Argument(); From 2ee94a616f2cb3f2658b912e40c9023a271ac8c9 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Wed, 24 Dec 2025 16:36:08 +0200 Subject: [PATCH 086/579] UI: Add cf details panel tabs refactor edit value --- .../alarm-rules/alarm-rules-table-config.ts | 2 +- .../calculated-field.component.html | 259 +++++++----------- .../calculated-field.component.scss | 36 ++- .../calculated-field.component.ts | 52 ++-- .../calculated-field.module.ts | 3 +- .../calculated-fields-table-config.ts | 28 +- .../entity-aggregation-component.component.ts | 10 +- .../geofencing-configuration.component.ts | 4 +- .../calculated-field-output.component.ts | 2 +- .../propagation-configuration.component.ts | 6 +- .../simple-configuration.component.ts | 1 - .../entity/entity-tabs.component.ts | 10 +- .../components/event/event-table-config.ts | 16 +- .../components/event/event-table.component.ts | 24 +- .../home/dialogs/events-dialog.component.html | 1 + .../home/dialogs/events-dialog.component.ts | 6 +- ...ule.ts => calculated-field-page.module.ts} | 10 +- .../calculated-fields-routing.module.ts | 4 +- .../calculated-fields-tabs.component.html | 30 ++ .../calculated-fields-tabs.component.ts | 49 ++++ .../modules/home/pages/home-pages.module.ts | 4 +- .../shared/models/calculated-field.models.ts | 6 + .../assets/locale/locale.constant-en_US.json | 1 + 23 files changed, 342 insertions(+), 222 deletions(-) rename ui-ngx/src/app/modules/home/pages/calculated-fields/{calculated-fields.module.ts => calculated-field-page.module.ts} (77%) create mode 100644 ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-tabs.component.html create mode 100644 ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-tabs.component.ts diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts index 3d1c066839..b4082fb75c 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts @@ -288,7 +288,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig false + debugActionDisabled: true } }) .afterClosed() diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html index 10ab150b69..105c1c74a0 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html @@ -20,178 +20,125 @@ [disabled]="(isLoading$ | async)" (click)="onEntityAction($event, 'open')" [class.!hidden]="isEdit || isDetailsPage"> - {{'common.open-details-page' | translate }} + {{ 'common.open-details-page' | translate }} - - - - - - - - - - + + + + + + + + + +
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
{{ 'common.general' | translate }}
-
- - {{ 'entity-field.title' | translate }} - - @if (entityForm.get('name').errors && entityForm.get('name').touched) { - - @if (entityForm.get('name').hasError('required')) { - {{ 'common.hint.title-required' | translate }} - } @else if (entityForm.get('name').hasError('pattern')) { - {{ 'common.hint.title-pattern' | translate }} - } @else if (entityForm.get('name').hasError('maxlength')) { - {{ 'common.hint.title-max-length' | translate }} - } - - } - - - -
- - - - {{ 'common.type' | translate }} - - @for (type of fieldTypes; track type) { - {{ CalculatedFieldTypeTranslations.get(type).name | translate}} - } - - @if (CalculatedFieldTypeTranslations.get(entityForm.get('type').value).hint) { - {{ CalculatedFieldTypeTranslations.get(entityForm.get('type').value).hint | translate }} +
+
+
+
{{ 'common.general' | translate }}
+
+ + {{ 'entity-field.title' | translate }} + + @if (entityForm.get('name').errors && entityForm.get('name').touched) { + + @if (entityForm.get('name').hasError('required')) { + {{ 'common.hint.title-required' | translate }} + } @else if (entityForm.get('name').hasError('pattern')) { + {{ 'common.hint.title-pattern' | translate }} + } @else if (entityForm.get('name').hasError('maxlength')) { + {{ 'common.hint.title-max-length' | translate }} + } + } + +
- @switch (entityForm.get('type').value) { - @case (CalculatedFieldType.GEOFENCING) { - - } - @case (CalculatedFieldType.PROPAGATION) { - - } - @case (CalculatedFieldType.RELATED_ENTITIES_AGGREGATION) { - - } - @case (CalculatedFieldType.ENTITY_AGGREGATION) { - - } - @default { - + + + + {{ 'common.type' | translate }} + + @for (type of fieldTypes; track type) { + {{ CalculatedFieldTypeTranslations.get(type).name | translate }} + } + + @if (CalculatedFieldTypeTranslations.get(entityForm.get('type').value).hint) { + {{ CalculatedFieldTypeTranslations.get(entityForm.get('type').value).hint | translate }} } - } +
+ @switch (entityForm.get('type').value) { + @case (CalculatedFieldType.GEOFENCING) { + + } + @case (CalculatedFieldType.PROPAGATION) { + + } + @case (CalculatedFieldType.RELATED_ENTITIES_AGGREGATION) { + + } + @case (CalculatedFieldType.ENTITY_AGGREGATION) { + + } + @default { + + } + }
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.scss b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.scss index 7cfc6dfef2..5bcd2552fc 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.scss +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.scss @@ -13,6 +13,40 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -:host { +:host ::ng-deep { + .tbel-script-lang-chip { + line-height: 20px; + font-size: 14px; + font-weight: 500; + color: white; + border-radius: 100px; + width: 70px; + min-width: 70px; + display: flex; + justify-content: center; + margin-top: 2px; + margin-right: 4px; + } + .tb-js-func { + .ace_tb { + &.ace_calculated-field { + &-ctx { + color: #C52F00; + } + &-args { + color: #185F2A; + } + &-key { + color: #c24c1a; + } + &-time-window, &-values, &-func, &-value, &-ts, &-latestTs { + color: #7214D0; + } + &-start-ts, &-end-ts { + color: #2CAA00; + } + } + } + } } diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts index 0b62d9bb96..308e350116 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts @@ -18,17 +18,17 @@ import { ChangeDetectorRef, Component, DestroyRef, Inject, Input } from '@angula import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { EntityComponent } from '../../components/entity/entity.component'; -import { FormBuilder, FormGroup, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; -import { AliasEntityType, EntityType } from '@shared/models/entity-type.models'; -import { NULL_UUID } from '@shared/models/id/has-uuid'; -import { ActionNotificationShow } from '@core/notification/notification.actions'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { EntityType } from '@shared/models/entity-type.models'; import { TranslateService } from '@ngx-translate/core'; -import { AssetInfo } from '@app/shared/models/asset.models'; -import { EntityTableConfig } from '@home/models/entity/entities-table-config.models'; import { CalculatedFieldConfiguration, - CalculatedFieldInfo, calculatedFieldsEntityTypeList, - CalculatedFieldType, calculatedFieldTypes, CalculatedFieldTypeTranslations, OutputStrategyType + CalculatedFieldInfo, + calculatedFieldsEntityTypeList, + CalculatedFieldType, + calculatedFieldTypes, + CalculatedFieldTypeTranslations, + OutputStrategyType } from '@shared/models/calculated-field.models'; import { oneSpaceInsideRegex } from '@shared/models/regex.constants'; import { isDefined } from '@core/utils'; @@ -36,13 +36,14 @@ import { EntityId } from '@shared/models/id/entity-id'; import { pairwise, switchMap } from 'rxjs/operators'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { BaseData } from '@shared/models/base-data'; -import { Observable, of } from 'rxjs'; +import { Observable } from 'rxjs'; import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; import { getCurrentAuthUser } from '@core/auth/auth.selectors'; import { CalculatedFieldsTableConfig, CalculatedFieldsTableEntity } from '@home/components/calculated-fields/calculated-fields-table-config'; +import { TenantId } from '@shared/models/id/tenant-id'; @Component({ selector: 'tb-calculated-field', @@ -60,7 +61,7 @@ export class CalculatedFieldComponent extends EntityComponent this.entitiesTableConfig.additionalDebugActionConfig.action( + { id: this.entity.id, ...this.entityFormValue() }, false, + (expression) => { + if (expression) { + this.entityForm.get('configuration').setValue({...this.entityFormValue().configuration, expression}); + this.entityForm.get('configuration').markAsDirty(); + } + }), + }; get entityId(): EntityId { return this.entityForm.get('entityId').value; @@ -114,9 +123,11 @@ export class CalculatedFieldComponent extends EntityComponent { - if (![CalculatedFieldType.SIMPLE, CalculatedFieldType.SCRIPT].includes(prevType) || - ![CalculatedFieldType.SIMPLE, CalculatedFieldType.SCRIPT].includes(nextType)) { - form.get('configuration').setValue(({} as CalculatedFieldConfiguration), {emitEvent: false}); + if (this.isEditValue) { + if (![CalculatedFieldType.SIMPLE, CalculatedFieldType.SCRIPT].includes(prevType) || + ![CalculatedFieldType.SIMPLE, CalculatedFieldType.SCRIPT].includes(nextType)) { + form.get('configuration').setValue(({} as CalculatedFieldConfiguration), {emitEvent: false}); + } } }); return form; @@ -129,8 +140,11 @@ export class CalculatedFieldComponent extends EntityComponent this.entityForm.get('type').updateValueAndValidity({onlySelf: true})); + this.entityForm.patchValue({ type }, {emitEvent: false}); + setTimeout(() => { + this.entityForm.patchValue({ configuration, debugSettings, entityId, ...value }, {emitEvent: false}); + this.entityForm.get('type').updateValueAndValidity({onlySelf: true}); + }); if (!entityId) { this.entityForm.get('configuration').disable({emitEvent: false}); this.disabledConfiguration = true; @@ -138,7 +152,7 @@ export class CalculatedFieldComponent extends EntityComponent { - const calculatedFieldId = this.entityId?.id; + const calculatedFieldId = this.entity?.id?.id; if (calculatedFieldId) { return this.calculatedFieldsService.getLatestCalculatedFieldDebugEvent(calculatedFieldId, {ignoreLoading: true}) .pipe( diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.module.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.module.ts index 8a9241970d..2bcfcd7a1b 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.module.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.module.ts @@ -59,7 +59,7 @@ import { CalculatedFieldComponent } from '@home/components/calculated-fields/cal CalculatedFieldTestArgumentsComponent, CalculatedFieldsHeaderComponent, CalculatedFieldsFilterConfigComponent, - CalculatedFieldComponent + CalculatedFieldComponent, ], imports: [ CommonModule, @@ -74,6 +74,7 @@ import { CalculatedFieldComponent } from '@home/components/calculated-fields/cal exports: [ CalculatedFieldDialogComponent, CalculatedFieldScriptTestDialogComponent, + CalculatedFieldComponent, ] }) export class CalculatedFieldsModule {} diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts index e56944e00f..5841d9e511 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts @@ -46,6 +46,7 @@ import { CalculatedFieldsQuery, CalculatedFieldType, CalculatedFieldTypeTranslations, + debugCfActionEnabled, getCalculatedFieldArgumentsEditorCompleter, getCalculatedFieldArgumentsHighlights, PropagationWithExpression, @@ -62,7 +63,7 @@ import { EntityDebugSettingsService } from '@home/components/entity/debug/entity import { DatePipe } from '@angular/common'; import { UtilsService } from "@core/services/utils.service"; import { ActionNotificationShow } from "@core/notification/notification.actions"; -import { CalculatedFieldEventBody, DebugEventType, Event as DebugEvent, EventType } from '@shared/models/event.models'; +import { CalculatedFieldEventBody, DebugEventType, EventType } from '@shared/models/event.models'; import { EventsDialogComponent, EventsDialogData } from '@home/dialogs/events-dialog.component'; import { CalculatedFieldsHeaderComponent @@ -70,6 +71,7 @@ import { import { EntityAction } from '@home/models/entity/entity-component.models'; import { CalculatedFieldComponent } from '@home/components/calculated-fields/calculated-field.component'; import { Router } from '@angular/router'; +import { CalculatedFieldsTabsComponent } from '@home/pages/calculated-fields/calculated-fields-tabs.component'; export type CalculatedFieldsTableEntity = CalculatedField | CalculatedFieldInfo; @@ -78,7 +80,9 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig this.openDebugEventsDialog.call(this, null, calculatedField), + action: (calculatedField: CalculatedFieldsTableEntity, + openCalculatedFieldEdit = true, + afterCloseCallback?: (expression: string) => void) => this.openDebugEventsDialog.call(this, null, calculatedField, openCalculatedFieldEdit, afterCloseCallback), }; calculatedFieldFilterConfig: CalculatedFieldsQuery; @@ -104,6 +108,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig this.fetchCalculatedFields(pageLink); this.addEntity = this.getCalculatedFieldDialog.bind(this); + this.saveEntity = (cf) => this.calculatedFieldsService.saveCalculatedField(cf); this.loadEntity = id => this.calculatedFieldsService.getCalculatedFieldById(id.id); this.deleteEntityTitle = (field) => this.translate.instant('calculated-fields.delete-title', {title: field.name}); this.deleteEntityContent = () => this.translate.instant('calculated-fields.delete-text'); @@ -253,17 +259,11 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig void ): void { $event?.stopPropagation(); - const debugActionEnabledFn = (event: DebugEvent) => { - return (calculatedField.type === CalculatedFieldType.SCRIPT || - (calculatedField.type === CalculatedFieldType.PROPAGATION && - calculatedField.configuration.applyExpressionToResolvedArguments) - ) && !!(event as DebugEvent).body.arguments; - }; const onDebugEventSelected = (event: CalculatedFieldEventBody, dialogRef: MatDialogRef) => { - this.getTestScriptDialog(calculatedField, JSON.parse(event.arguments)) + this.getTestScriptDialog(calculatedField, JSON.parse(event.arguments), openCalculatedFieldEdit) .subscribe(expression => dialogRef.close(expression)); }; @@ -278,11 +278,15 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { + if (afterCloseCallback) { + afterCloseCallback(value) + } + }); } private exportCalculatedField($event: Event, calculatedField: CalculatedFieldsTableEntity): void { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.ts index e3655f5370..6f281b8e25 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.ts @@ -182,10 +182,12 @@ export class EntityAggregationComponentComponent implements ControlValueAccessor interval: {...value.interval, allowOffsetSec: isDefinedAndNotNull(value?.interval?.offsetSec)} } this.entityAggregationConfiguration.patchValue(data, {emitEvent: false}); - this.checkAggIntervalType(this.entityAggregationConfiguration.get('interval.type').value); - this.checkIntervalDuration(this.entityAggregationConfiguration.get('interval.allowOffsetSec').value); - this.checkWatermark(this.entityAggregationConfiguration.get('allowWatermark').value); - this.checkProduceIntermediate(); + if (this.entityAggregationConfiguration.enabled) { + this.checkAggIntervalType(this.entityAggregationConfiguration.get('interval.type').value); + this.checkIntervalDuration(this.entityAggregationConfiguration.get('interval.allowOffsetSec').value); + this.checkWatermark(this.entityAggregationConfiguration.get('allowWatermark').value); + this.checkProduceIntermediate(); + } this.updatedOffsetHint(); setTimeout(() => { this.entityAggregationConfiguration.get('arguments').updateValueAndValidity({onlySelf: true}); diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/geofencing-configuration.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/geofencing-configuration.component.ts index 3406922b9e..9df60b6094 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/geofencing-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/geofencing-configuration.component.ts @@ -124,7 +124,9 @@ export class GeofencingConfigurationComponent implements ControlValueAccessor, V writeValue(config: CalculatedFieldGeofencingConfiguration): void { this.geofencingConfiguration.patchValue(config, {emitEvent: false}); this.checkRelatedEntity(this.geofencingConfiguration.get('zoneGroups').value); - this.checkScheduledUpdateEnabled(this.geofencingConfiguration.get('scheduledUpdateEnabled').value); + if (this.geofencingConfiguration.enabled) { + this.checkScheduledUpdateEnabled(this.geofencingConfiguration.get('scheduledUpdateEnabled').value); + } } registerOnChange(fn: (config: CalculatedFieldGeofencingConfiguration) => void): void { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts index c254dcd2b4..00fea861f6 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts @@ -148,7 +148,7 @@ export class CalculatedFieldOutputComponent implements ControlValueAccessor, Val for (const propName of Object.keys(changes)) { const change = changes[propName]; if (change.currentValue !== change.previousValue) { - if (propName === 'simpleMode') { + if (propName === 'simpleMode' && !this.disabled) { this.updatedFormWithMode(); if (!change.firstChange) { this.outputForm.updateValueAndValidity(); diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.ts index 1c493148b3..33acbcf86d 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.ts @@ -131,9 +131,11 @@ export class PropagationConfigurationComponent implements ControlValueAccessor, writeValue(value: PropagationWithExpression): void { value.expression = value.expression ?? calculatedFieldDefaultScript; this.propagateConfiguration.patchValue(value, {emitEvent: false}); - this.updatedFormWithScript(); + if (!this.disabled) { + this.updatedFormWithScript(); + } setTimeout(() => { - this.propagateConfiguration.get('arguments').updateValueAndValidity({onlySelf: true}); + this.propagateConfiguration.get('arguments').updateValueAndValidity({onlySelf: true, emitEvent: false}); }); } diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.ts index 2771795635..ec07fcae03 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.ts @@ -109,7 +109,6 @@ export class SimpleConfigurationComponent implements ControlValueAccessor, Valid private propagateChange: (config: SimpeConfiguration) => void = () => { }; constructor(private fb: FormBuilder) { - this.updatedFormWithScript(); this.simpleConfiguration.get('output').valueChanges.pipe( takeUntilDestroyed(), ).subscribe(() => { diff --git a/ui-ngx/src/app/modules/home/components/entity/entity-tabs.component.ts b/ui-ngx/src/app/modules/home/components/entity/entity-tabs.component.ts index 3d297f0317..066ef268e5 100644 --- a/ui-ngx/src/app/modules/home/components/entity/entity-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/components/entity/entity-tabs.component.ts @@ -16,7 +16,7 @@ import { BaseData, HasId } from '@shared/models/base-data'; import { PageComponent } from '@shared/components/page.component'; -import { AfterViewInit, Directive, Input, OnInit, QueryList, ViewChildren } from '@angular/core'; +import { AfterViewInit, Directive, inject, Input, OnInit, QueryList, ViewChildren } from '@angular/core'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { EntityTableConfig } from '@home/models/entity/entities-table-config.models'; @@ -100,9 +100,11 @@ export abstract class EntityTabsComponent, entityTabsChanged = this.entityTabsSubject.asObservable(); - protected constructor(protected store: Store) { - super(store); - this.authUser = getCurrentAuthUser(store); + protected store: Store = inject(Store); + + protected constructor(...args: unknown[]) { + super(); + this.authUser = getCurrentAuthUser(this.store); } ngOnInit() { diff --git a/ui-ngx/src/app/modules/home/components/event/event-table-config.ts b/ui-ngx/src/app/modules/home/components/event/event-table-config.ts index 03fc641735..accc3d7060 100644 --- a/ui-ngx/src/app/modules/home/components/event/event-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/event/event-table-config.ts @@ -22,7 +22,14 @@ import { EntityTableColumn, EntityTableConfig } from '@home/models/entity/entities-table-config.models'; -import { DebugEventType, Event, EventBody, EventType, FilterEventBody } from '@shared/models/event.models'; +import { + DebugEventType, + Event as DebugEvent, + Event, + EventBody, + EventType, + FilterEventBody +} from '@shared/models/event.models'; import { TimePageLink } from '@shared/models/page/page-link'; import { TranslateService } from '@ngx-translate/core'; import { DatePipe } from '@angular/common'; @@ -95,7 +102,8 @@ export class EventTableConfig extends EntityTableConfig { private store: Store, public testButtonLabel?: string, private debugEventSelected?: EventEmitter, - public hideClearEventAction = false) { + public hideClearEventAction = false, + public disableDebugEventAction = false) { super(); this.loadDataOnInit = false; this.tableTitle = ''; @@ -453,7 +461,7 @@ export class EventTableConfig extends EntityTableConfig { this.cellActionDescriptors.push({ name: this.translate.instant('rulenode.test-with-this-message', {test: this.translate.instant(this.testButtonLabel)}), icon: 'bug_report', - isEnabled: (entity) => entity.body.type === 'IN' || entity.body.error !== undefined, + isEnabled: (entity) => (entity.body.type === 'IN' || entity.body.error !== undefined) && !this.disableDebugEventAction, onAction: ($event, entity) => { this.debugEventSelected.next(entity.body); } @@ -464,7 +472,7 @@ export class EventTableConfig extends EntityTableConfig { this.cellActionDescriptors.push({ name: this.translate.instant('calculated-fields.test-with-this-message'), icon: 'bug_report', - isEnabled: () => true, + isEnabled: (event) => !this.disableDebugEventAction && !!(event as DebugEvent).body.arguments, onAction: (_, entity) => this.debugEventSelected.next(entity.body) }); break; diff --git a/ui-ngx/src/app/modules/home/components/event/event-table.component.ts b/ui-ngx/src/app/modules/home/components/event/event-table.component.ts index 53cb8e1b96..7011c23449 100644 --- a/ui-ngx/src/app/modules/home/components/event/event-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/event/event-table.component.ts @@ -17,10 +17,12 @@ import { AfterViewInit, ChangeDetectorRef, - Component, EventEmitter, + Component, + EventEmitter, Input, OnDestroy, - OnInit, Output, + OnInit, + Output, ViewChild, ViewContainerRef } from '@angular/core'; @@ -61,6 +63,21 @@ export class EventTableComponent implements OnInit, AfterViewInit, OnDestroy { @Input() hideClearEventAction: boolean = false; + private disableDebugEventActionValue = false; + + get disableDebugEventAction() { + return this.disableDebugEventActionValue; + } + + @Input() + set disableDebugEventAction(value) { + this.disableDebugEventActionValue = value; + if (this.eventTableConfig) { + this.eventTableConfig.disableDebugEventAction = this.disableDebugEventAction; + this.eventTableConfig.updateCellAction(); + } + }; + activeValue = false; dirtyValue = false; entityIdValue: EntityId; @@ -151,7 +168,8 @@ export class EventTableComponent implements OnInit, AfterViewInit, OnDestroy { this.store, this.functionTestButtonLabel, this.debugEventSelected, - this.hideClearEventAction + this.hideClearEventAction, + this.disableDebugEventAction ); } diff --git a/ui-ngx/src/app/modules/home/dialogs/events-dialog.component.html b/ui-ngx/src/app/modules/home/dialogs/events-dialog.component.html index 655c25545d..ab48435b2d 100644 --- a/ui-ngx/src/app/modules/home/dialogs/events-dialog.component.html +++ b/ui-ngx/src/app/modules/home/dialogs/events-dialog.component.html @@ -34,6 +34,7 @@ [tenantId]="data.tenantId" [entityId]="data.entityId" [functionTestButtonLabel]="data.functionTestButtonLabel ?? ''" + [disableDebugEventAction]="data.debugActionDisabled" (debugEventSelected)="this.onDebugEventSelected($event)" />
diff --git a/ui-ngx/src/app/modules/home/dialogs/events-dialog.component.ts b/ui-ngx/src/app/modules/home/dialogs/events-dialog.component.ts index d5339de3b2..8008e74523 100644 --- a/ui-ngx/src/app/modules/home/dialogs/events-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/dialogs/events-dialog.component.ts @@ -23,7 +23,6 @@ import { AppState } from '@core/core.state'; import { Router } from '@angular/router'; import { DebugEventType, EventType } from '@shared/models/event.models'; import { EntityId } from '@shared/models/id/entity-id'; -import { BaseData, HasId } from '@shared/models/base-data'; export interface EventsDialogData { title: string; @@ -34,7 +33,7 @@ export interface EventsDialogData { disabledEventTypes?: Array; functionTestButtonLabel?: string; onDebugEventSelected?: (event: any, dialogRef: MatDialogRef) => void; - debugActionEnabledFn?: (event: BaseData) => boolean; + debugActionDisabled?: boolean; } @Component({ @@ -54,9 +53,6 @@ export class EventsDialogComponent extends DialogComponent 0) { - this.eventsTable.entitiesTable.cellActionDescriptors[0].isEnabled = this.data.debugActionEnabledFn; - } this.eventsTable.entitiesTable.updateData(); } diff --git a/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields.module.ts b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-field-page.module.ts similarity index 77% rename from ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields.module.ts rename to ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-field-page.module.ts index 01ed3577e8..f0672c2e5e 100644 --- a/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields.module.ts +++ b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-field-page.module.ts @@ -20,15 +20,19 @@ import { SharedModule } from '@shared/shared.module'; import { HomeDialogsModule } from '../../dialogs/home-dialogs.module'; import { HomeComponentsModule } from '@modules/home/components/home-components.module'; import { CalculatedFieldsRoutingModule } from '@home/pages/calculated-fields/calculated-fields-routing.module'; +import { CalculatedFieldsModule } from '@home/components/calculated-fields/calculated-field.module'; +import { CalculatedFieldsTabsComponent } from '@home/pages/calculated-fields/calculated-fields-tabs.component'; @NgModule({ - declarations: [], + declarations: [ + CalculatedFieldsTabsComponent + ], imports: [ CommonModule, SharedModule, HomeComponentsModule, HomeDialogsModule, - CalculatedFieldsRoutingModule + CalculatedFieldsRoutingModule, ] }) -export class CalculatedFieldsModule { } \ No newline at end of file +export class CalculatedFieldPageModule { } \ No newline at end of file diff --git a/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-routing.module.ts b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-routing.module.ts index 03be3d86f6..e703445155 100644 --- a/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-routing.module.ts +++ b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-routing.module.ts @@ -14,7 +14,7 @@ /// limitations under the License. /// -import { DestroyRef, inject, NgModule, Renderer2 } from '@angular/core'; +import { DestroyRef, inject, NgModule } from '@angular/core'; import { ActivatedRouteSnapshot, ResolveFn, Router, RouterModule, RouterStateSnapshot, Routes } from '@angular/router'; import { Authority } from '@shared/models/authority.enum'; import { MenuId } from '@core/services/menu.models'; @@ -63,7 +63,7 @@ export const CalculatedFieldsTableConfigResolver: ResolveFn +@if (entity) { + + + +} diff --git a/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-tabs.component.ts new file mode 100644 index 0000000000..0c41ddc33d --- /dev/null +++ b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-tabs.component.ts @@ -0,0 +1,49 @@ +/// +/// Copyright © 2016-2025 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 { Component } from '@angular/core'; +import { EntityTabsComponent } from '../../components/entity/entity-tabs.component'; +import { CalculatedFieldEventBody, DebugEventType, EventType } from '@shared/models/event.models'; +import type { + CalculatedFieldsTableConfig, + CalculatedFieldsTableEntity +} from '@home/components/calculated-fields/calculated-fields-table-config'; +import { debugCfActionEnabled } from '@shared/models/calculated-field.models'; + +@Component({ + selector: 'tb-calculated-fields-tabs', + templateUrl: './calculated-fields-tabs.component.html', + styleUrls: [] +}) +export class CalculatedFieldsTabsComponent extends EntityTabsComponent { + + readonly DebugEventType = DebugEventType; + readonly EventType = EventType; + + constructor() { + super(); + } + + get debugActionDisabled(): boolean { + return !debugCfActionEnabled(this.entity); + }; + + onDebugEventSelected(event: CalculatedFieldEventBody) { + (this.entitiesTableConfig as CalculatedFieldsTableConfig).getTestScriptDialog(this.entity, JSON.parse(event.arguments)) + .subscribe((expression) => { + }); + }; +} diff --git a/ui-ngx/src/app/modules/home/pages/home-pages.module.ts b/ui-ngx/src/app/modules/home/pages/home-pages.module.ts index c43b89d141..d84b646525 100644 --- a/ui-ngx/src/app/modules/home/pages/home-pages.module.ts +++ b/ui-ngx/src/app/modules/home/pages/home-pages.module.ts @@ -27,7 +27,7 @@ import { UserModule } from '@modules/home/pages/user/user.module'; import { DeviceModule } from '@modules/home/pages/device/device.module'; import { AssetModule } from '@modules/home/pages/asset/asset.module'; import { EntityViewModule } from '@modules/home/pages/entity-view/entity-view.module'; -import { CalculatedFieldsModule } from '@home/pages/calculated-fields/calculated-fields.module'; +import { CalculatedFieldPageModule } from '@home/pages/calculated-fields/calculated-field-page.module'; import { RuleChainModule } from '@modules/home/pages/rulechain/rulechain.module'; import { WidgetLibraryModule } from '@modules/home/pages/widget/widget-library.module'; import { DashboardModule } from '@modules/home/pages/dashboard/dashboard.module'; @@ -70,7 +70,7 @@ import { AiModelModule } from '@home/pages/ai-model/ai-model.module'; EdgeModule, EntityViewModule, CustomerModule, - CalculatedFieldsModule, + CalculatedFieldPageModule, RuleChainModule, WidgetLibraryModule, DashboardModule, diff --git a/ui-ngx/src/app/shared/models/calculated-field.models.ts b/ui-ngx/src/app/shared/models/calculated-field.models.ts index 825c08a69f..30f5a27686 100644 --- a/ui-ngx/src/app/shared/models/calculated-field.models.ts +++ b/ui-ngx/src/app/shared/models/calculated-field.models.ts @@ -540,6 +540,12 @@ export const getCalculatedFieldCurrentEntityFilter = (entityName: string, entity } } +export const debugCfActionEnabled = (cf: CalculatedField) => { + return (cf.type === CalculatedFieldType.SCRIPT || + (cf.type === CalculatedFieldType.PROPAGATION && cf.configuration.applyExpressionToResolvedArguments) + ); +} + export interface CalculatedFieldArgumentValueBase { argumentName: string; type: ArgumentType; 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 73a8bbf23f..8c2ecc2890 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -1221,6 +1221,7 @@ "calculated-field-filter-title": "Calculated field filter", "filter-title": "Filter", "calculated-field-types": "Calculated field types", + "events": "Events", "any-type": "Any type", "metrics": { "metrics": "Metrics", From c6ae93f8f2df78fa90344e0543f0871ce519d718 Mon Sep 17 00:00:00 2001 From: Ekaterina Chantsova Date: Wed, 24 Dec 2025 18:14:08 +0200 Subject: [PATCH 087/579] Map widget: disable data key aggregation settings in data layer configuration options --- .../settings/common/map/map-data-layer-dialog.component.ts | 2 +- .../lib/settings/common/map/map-data-layer-row.component.ts | 2 +- .../lib/settings/common/map/map-settings.component.models.ts | 3 ++- .../widget/lib/settings/common/map/map-settings.component.ts | 4 +++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-dialog.component.ts index af653308da..8813f18263 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-dialog.component.ts @@ -496,7 +496,7 @@ export class MapDataLayerDialogComponent extends DialogComponent { if (updatedDataKey) { this.dataLayerFormGroup.get(keyType).patchValue(updatedDataKey); diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-row.component.ts index 76a878e174..5489f0e435 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-row.component.ts @@ -247,7 +247,7 @@ export class MapDataLayerRowComponent implements ControlValueAccessor, OnInit { const targetDataKey: DataKey = this.dataLayerFormGroup.get(keyType).value; this.context.editKey(targetDataKey, this.dataLayerFormGroup.get('dsDeviceId').value, this.dataLayerFormGroup.get('dsEntityAliasId').value, - this.dataLayerType === 'trips' ? widgetType.timeseries : widgetType.latest).subscribe( + this.dataLayerType === 'trips' ? widgetType.timeseries : widgetType.latest, false).subscribe( (updatedDataKey) => { if (updatedDataKey) { this.dataLayerFormGroup.get(keyType).patchValue(updatedDataKey); diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-settings.component.models.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-settings.component.models.ts index 9ce92c5c4a..53c6ff3099 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-settings.component.models.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-settings.component.models.ts @@ -24,6 +24,7 @@ export interface MapSettingsContext { aliasController: IAliasController; callbacks: WidgetConfigCallbacks; widget: Widget; - editKey: (key: DataKey, deviceId: string, entityAliasId: string, WidgetType?: widgetType) => Observable; + editKey: (key: DataKey, deviceId: string, entityAliasId: string, WidgetType?: widgetType, + hideDataKeyAggregation?: boolean) => Observable; generateDataKey: (key: DataKey) => DataKey; } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-settings.component.ts index ab32155420..adb2d77fce 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-settings.component.ts @@ -304,7 +304,8 @@ export class MapSettingsComponent implements OnInit, ControlValueAccessor, Valid this.propagateChange(this.modelValue); } - private editKey(key: DataKey, deviceId: string, entityAliasId: string, _widgetType = widgetType.latest): Observable { + private editKey(key: DataKey, deviceId: string, entityAliasId: string, _widgetType = widgetType.latest, + hideDataKeyAggregation = true): Observable { return this.dialog.open(DataKeyConfigDialogComponent, { disableClose: true, @@ -321,6 +322,7 @@ export class MapSettingsComponent implements OnInit, ControlValueAccessor, Valid hideDataKeyColor: true, hideDataKeyDecimals: true, hideDataKeyUnits: true, + hideDataKeyAggregation: hideDataKeyAggregation, widget: this.widget, dashboard: null, dataKeySettingsForm: null, From c50b24d014bead4905627a7e2e6269020e97a73c Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Wed, 24 Dec 2025 19:12:06 +0200 Subject: [PATCH 088/579] UI: Extract same method in cf for service --- .../calculated-field-form.service.ts | 94 +++++++++++++++++++ .../calculated-field.component.ts | 74 ++++----------- .../calculated-field-dialog.component.html | 30 ++---- .../calculated-field-dialog.component.ts | 78 ++++----------- .../entity/entity-table-component.models.ts | 9 +- .../calculated-fields-tabs.component.ts | 10 +- .../entity/entity-select.component.ts | 30 ++++-- 7 files changed, 179 insertions(+), 146 deletions(-) create mode 100644 ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field-form.service.ts diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field-form.service.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field-form.service.ts new file mode 100644 index 0000000000..6ef02f0cf8 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field-form.service.ts @@ -0,0 +1,94 @@ +/// +/// Copyright © 2016-2025 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 { DestroyRef, inject, Injectable } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { pairwise, switchMap } from 'rxjs/operators'; +import { Observable } from 'rxjs'; +import { + CalculatedField, + CalculatedFieldConfiguration, + CalculatedFieldEventArguments, + CalculatedFieldType, + OutputStrategyType +} from '@shared/models/calculated-field.models'; +import { oneSpaceInsideRegex } from '@shared/models/regex.constants'; +import { isDefined } from '@core/utils'; +import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; +import { CalculatedFieldsTableEntity } from '@home/components/calculated-fields/calculated-fields-table-config'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { EntityType } from '@shared/models/entity-type.models'; + +@Injectable({ providedIn: 'root' }) +export class CalculatedFieldFormService { + private fb = inject(FormBuilder); + private calculatedFieldsService = inject(CalculatedFieldsService); + + buildForm(): FormGroup { + return this.fb.group({ + name: ['', [Validators.required, Validators.pattern(oneSpaceInsideRegex), Validators.maxLength(255)]], + entityId: [{type: EntityType.DEVICE_PROFILE, id: null}, Validators.required], + type: [CalculatedFieldType.SIMPLE], + debugSettings: [], + configuration: this.fb.control({} as CalculatedFieldConfiguration), + }); + } + + setupTypeChange(form: FormGroup, destroyRef: DestroyRef, isEditActive?: () => boolean): void { + form.get('type').valueChanges.pipe( + pairwise(), + takeUntilDestroyed(destroyRef) + ).subscribe(([prevType, nextType]) => { + const shouldCheck = isEditActive ? isEditActive() : true; + if (shouldCheck) { + if (![CalculatedFieldType.SIMPLE, CalculatedFieldType.SCRIPT].includes(prevType) || + ![CalculatedFieldType.SIMPLE, CalculatedFieldType.SCRIPT].includes(nextType)) { + form.get('configuration').setValue({} as CalculatedFieldConfiguration, { emitEvent: false }); + } + } + }); + } + + prepareConfig(configuration: CalculatedFieldConfiguration): CalculatedFieldConfiguration { + const config = configuration || ({} as CalculatedFieldConfiguration); + if (config.type !== CalculatedFieldType.ALARM) { + if (isDefined(config?.output) && !config?.output?.strategy) { + config.output.strategy = { type: OutputStrategyType.RULE_CHAIN }; + } + } + return config; + } + + testScript( + calculatedFieldId: string, + formValue: CalculatedField, + testDialogFn: (calculatedField: CalculatedFieldsTableEntity, argumentsObj?: CalculatedFieldEventArguments, openCalculatedFieldEdit?: boolean, expression?: string) => Observable, + destroyRef: DestroyRef, + expression?: string, + ): Observable { + if (calculatedFieldId) { + return this.calculatedFieldsService.getLatestCalculatedFieldDebugEvent(calculatedFieldId, {ignoreLoading: true}) + .pipe( + switchMap(event => { + const args = event?.arguments ? JSON.parse(event.arguments) : null; + return testDialogFn(formValue, args, false, expression); + }), + takeUntilDestroyed(destroyRef) + ); + } + return testDialogFn(formValue, null, false, expression); + } +} \ No newline at end of file diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts index 308e350116..01d7a8de7a 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts @@ -14,11 +14,11 @@ /// limitations under the License. /// -import { ChangeDetectorRef, Component, DestroyRef, Inject, Input } from '@angular/core'; +import { ChangeDetectorRef, Component, DestroyRef, inject, Inject, Input } from '@angular/core'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { EntityComponent } from '../../components/entity/entity.component'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FormBuilder, FormGroup } from '@angular/forms'; import { EntityType } from '@shared/models/entity-type.models'; import { TranslateService } from '@ngx-translate/core'; import { @@ -27,23 +27,18 @@ import { calculatedFieldsEntityTypeList, CalculatedFieldType, calculatedFieldTypes, - CalculatedFieldTypeTranslations, - OutputStrategyType + CalculatedFieldTypeTranslations } from '@shared/models/calculated-field.models'; -import { oneSpaceInsideRegex } from '@shared/models/regex.constants'; -import { isDefined } from '@core/utils'; import { EntityId } from '@shared/models/id/entity-id'; -import { pairwise, switchMap } from 'rxjs/operators'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { BaseData } from '@shared/models/base-data'; import { Observable } from 'rxjs'; -import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; import { getCurrentAuthUser } from '@core/auth/auth.selectors'; import { CalculatedFieldsTableConfig, CalculatedFieldsTableEntity } from '@home/components/calculated-fields/calculated-fields-table-config'; import { TenantId } from '@shared/models/id/tenant-id'; +import { CalculatedFieldFormService } from '@home/components/calculated-fields/calculated-field-form.service'; @Component({ selector: 'tb-calculated-field', @@ -68,14 +63,15 @@ export class CalculatedFieldComponent extends EntityComponent, protected translate: TranslateService, @Inject('entity') protected entityValue: CalculatedFieldInfo, @Inject('entitiesTableConfig') protected entitiesTableConfigValue: CalculatedFieldsTableConfig, protected fb: FormBuilder, - protected cd: ChangeDetectorRef, - private destroyRef: DestroyRef, - private calculatedFieldsService: CalculatedFieldsService) { + protected cd: ChangeDetectorRef) { super(store, fb, entityValue, entitiesTableConfigValue, cd); } @@ -111,60 +107,30 @@ export class CalculatedFieldComponent extends EntityComponent({} as CalculatedFieldConfiguration), - }); - form.get('type').valueChanges.pipe( - pairwise(), - takeUntilDestroyed(this.destroyRef) - ).subscribe(([prevType, nextType]) => { - if (this.isEditValue) { - if (![CalculatedFieldType.SIMPLE, CalculatedFieldType.SCRIPT].includes(prevType) || - ![CalculatedFieldType.SIMPLE, CalculatedFieldType.SCRIPT].includes(nextType)) { - form.get('configuration').setValue(({} as CalculatedFieldConfiguration), {emitEvent: false}); - } - } - }); + buildForm(_entity?: CalculatedFieldInfo): FormGroup { + const form = inject(CalculatedFieldFormService).buildForm(); + inject(CalculatedFieldFormService).setupTypeChange(form, inject(DestroyRef), () => this.isEditValue); return form; } updateForm(entity: CalculatedFieldInfo) { const { configuration = {} as CalculatedFieldConfiguration, type = CalculatedFieldType.SIMPLE, debugSettings = { failuresEnabled: true, allEnabled: true }, entityId = this.entityId, ...value } = entity ?? {}; - if (configuration.type !== CalculatedFieldType.ALARM) { - if (isDefined(configuration?.output) && !configuration?.output?.strategy) { - configuration.output.strategy = {type: OutputStrategyType.RULE_CHAIN}; - } - } + const preparedConfig = this.cfFormService.prepareConfig(configuration); this.entityForm.patchValue({ type }, {emitEvent: false}); setTimeout(() => { - this.entityForm.patchValue({ configuration, debugSettings, entityId, ...value }, {emitEvent: false}); + this.entityForm.patchValue({ configuration: preparedConfig, debugSettings, entityId, ...value }, {emitEvent: false}); this.entityForm.get('type').updateValueAndValidity({onlySelf: true}); }); - if (!entityId) { - this.entityForm.get('configuration').disable({emitEvent: false}); - this.disabledConfiguration = true; - } } onTestScript(expression?: string): Observable { - const calculatedFieldId = this.entity?.id?.id; - if (calculatedFieldId) { - return this.calculatedFieldsService.getLatestCalculatedFieldDebugEvent(calculatedFieldId, {ignoreLoading: true}) - .pipe( - switchMap(event => { - const args = event?.arguments ? JSON.parse(event.arguments) : null; - return this.entitiesTableConfig.getTestScriptDialog(this.entityFormValue(), args, false, expression); - }), - takeUntilDestroyed(this.destroyRef) - ) - } - - return this.entitiesTableConfig.getTestScriptDialog(this.entityFormValue(), null, false, expression); + return this.cfFormService.testScript( + this.entity?.id?.id, + this.entityFormValue(), + this.entitiesTableConfig.getTestScriptDialog.bind(this.entitiesTableConfig), + this.destroyRef, + expression + ); } updateFormState() { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html index 3d669b02c6..24dd114963 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html @@ -56,29 +56,13 @@ />
@if (!data.entityId) { -
- - - @if (fieldFormGroup.get('entityId.entityType').value) { - - } -
+ + } {{ 'common.type' | translate }} diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts index 4d2df6e416..3370e65f5b 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts @@ -14,11 +14,10 @@ /// limitations under the License. /// -import { Component, DestroyRef, Inject, ViewChild, ViewEncapsulation } from '@angular/core'; +import { Component, DestroyRef, Inject, ViewEncapsulation } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; -import { FormBuilder, Validators } from '@angular/forms'; import { Router } from '@angular/router'; import { DialogComponent } from '@shared/components/dialog.component'; import { @@ -28,21 +27,18 @@ import { CalculatedFieldTestScriptFn, CalculatedFieldType, calculatedFieldTypes, - CalculatedFieldTypeTranslations, - OutputStrategyType + CalculatedFieldTypeTranslations } from '@shared/models/calculated-field.models'; -import { oneSpaceInsideRegex } from '@shared/models/regex.constants'; -import { AliasEntityType, EntityType } from '@shared/models/entity-type.models'; -import { pairwise, switchMap } from 'rxjs/operators'; +import { EntityType } from '@shared/models/entity-type.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; import { Observable } from 'rxjs'; import { EntityId } from '@shared/models/id/entity-id'; import { AdditionalDebugActionConfig } from '@home/components/entity/debug/entity-debug-settings.model'; -import { deepTrim, isDefined } from '@core/utils'; -import { EntityTypeSelectComponent } from '@shared/components/entity/entity-type-select.component'; -import { EntityAutocompleteComponent } from '@shared/components/entity/entity-autocomplete.component'; +import { deepTrim } from '@core/utils'; import { BaseData } from '@shared/models/base-data'; +import { CalculatedFieldFormService } from '@home/components/calculated-fields/calculated-field-form.service'; +import { FormGroup } from '@angular/forms'; export interface CalculatedFieldDialogData { value?: CalculatedField; @@ -64,16 +60,7 @@ export interface CalculatedFieldDialogData { }) export class CalculatedFieldDialogComponent extends DialogComponent { - fieldFormGroup = this.fb.group({ - name: ['', [Validators.required, Validators.pattern(oneSpaceInsideRegex), Validators.maxLength(255)]], - entityId: this.fb.group({ - entityType: this.fb.control(EntityType.DEVICE_PROFILE, Validators.required), - id: [null as null | string, Validators.required], - }), - type: [CalculatedFieldType.SIMPLE], - debugSettings: [], - configuration: this.fb.control({} as CalculatedFieldConfiguration), - }); + fieldFormGroup: FormGroup; additionalDebugActionConfig = this.data.value?.id ? { ...this.data.additionalDebugActionConfig, @@ -91,18 +78,16 @@ export class CalculatedFieldDialogComponent extends DialogComponent, protected router: Router, @Inject(MAT_DIALOG_DATA) public data: CalculatedFieldDialogData, protected dialogRef: MatDialogRef, private calculatedFieldsService: CalculatedFieldsService, private destroyRef: DestroyRef, - private fb: FormBuilder) { + private cfFormService: CalculatedFieldFormService) { super(store, router, dialogRef); - this.observeType(); + this.fieldFormGroup = this.cfFormService.buildForm(); + this.cfFormService.setupTypeChange(this.fieldFormGroup, this.destroyRef); this.applyDialogData(); if (this.data.isDirty) { @@ -110,7 +95,7 @@ export class CalculatedFieldDialogComponent extends DialogComponent { this.disabledConfiguration = !entityId; @@ -142,24 +127,17 @@ export class CalculatedFieldDialogComponent extends DialogComponent { - const calculatedFieldId = this.data.value?.id?.id; - if (calculatedFieldId) { - return this.calculatedFieldsService.getLatestCalculatedFieldDebugEvent(calculatedFieldId, {ignoreLoading: true}) - .pipe( - switchMap(event => { - const args = event?.arguments ? JSON.parse(event.arguments) : null; - return this.data.getTestScriptDialogFn(this.fromGroupValue, args, false, expression); - }), - takeUntilDestroyed(this.destroyRef) - ) - } - return this.data.getTestScriptDialogFn(this.fromGroupValue, null, false, expression); + return this.cfFormService.testScript( + this.data.value?.id?.id, + this.fromGroupValue, + this.data.getTestScriptDialogFn, + this.destroyRef, + expression + ); } changeEntity(entity: BaseData): void { @@ -172,28 +150,12 @@ export class CalculatedFieldDialogComponent extends DialogComponent this.fieldFormGroup.get('type').updateValueAndValidity({onlySelf: true})); if (!this.data.entityId) { this.fieldFormGroup.get('configuration').disable({emitEvent: false}); this.disabledConfiguration = true; } } - - private observeType(): void { - this.fieldFormGroup.get('type').valueChanges.pipe( - pairwise(), - takeUntilDestroyed(this.destroyRef) - ).subscribe(([prevType, nextType]) => { - if (![CalculatedFieldType.SIMPLE, CalculatedFieldType.SCRIPT].includes(prevType) || - ![CalculatedFieldType.SIMPLE, CalculatedFieldType.SCRIPT].includes(nextType)) { - this.fieldFormGroup.get('configuration').setValue(({} as CalculatedFieldConfiguration), {emitEvent: false}); - } - }); - } } diff --git a/ui-ngx/src/app/modules/home/models/entity/entity-table-component.models.ts b/ui-ngx/src/app/modules/home/models/entity/entity-table-component.models.ts index e3d0bb19e6..9e2d22f8a9 100644 --- a/ui-ngx/src/app/modules/home/models/entity/entity-table-component.models.ts +++ b/ui-ngx/src/app/modules/home/models/entity/entity-table-component.models.ts @@ -20,18 +20,22 @@ import { SafeHtml } from '@angular/platform-browser'; import { PageLink } from '@shared/models/page/page-link'; import { Timewindow } from '@shared/models/time/time.models'; import { EntitiesDataSource } from '@home/models/datasource/entity-datasource'; -import { ElementRef, EventEmitter, Renderer2, ViewContainerRef } from '@angular/core'; +import { ElementRef, EventEmitter, ViewContainerRef } from '@angular/core'; import { TbAnchorComponent } from '@shared/components/tb-anchor.component'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { EntityAction } from '@home/models/entity/entity-component.models'; import { - CellActionDescriptor, EntityActionTableColumn, EntityColumn, EntityTableColumn, + CellActionDescriptor, + EntityActionTableColumn, + EntityColumn, + EntityTableColumn, EntityTableConfig, GroupActionDescriptor, HeaderActionDescriptor } from '@home/models/entity/entities-table-config.models'; import { ActivatedRoute } from '@angular/router'; +import type { EntityDetailsPanelComponent } from '@home/components/entity/entity-details-panel.component'; export type EntitiesTableAction = 'add'; @@ -64,6 +68,7 @@ export interface IEntitiesTableComponent { paginator: MatPaginator; sort: MatSort; route: ActivatedRoute; + entityDetailsPanel: EntityDetailsPanelComponent; viewContainerRef: ViewContainerRef; addEnabled(): boolean; diff --git a/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-tabs.component.ts index 0c41ddc33d..54e26db1be 100644 --- a/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-tabs.component.ts @@ -42,8 +42,16 @@ export class CalculatedFieldsTabsComponent extends EntityTabsComponent { + (this.entitiesTableConfig as CalculatedFieldsTableConfig).getTable(); + const entityDetailsPanel = this.entitiesTableConfig.getTable().entityDetailsPanel; + entityDetailsPanel.onToggleEditMode(true); + entityDetailsPanel.selectedTab = 0; + setTimeout(() => { + entityDetailsPanel.detailsForm.get('configuration').setValue({...this.entity.configuration, expression}); + entityDetailsPanel.detailsForm.get('configuration').markAsDirty(); + }); }); }; } diff --git a/ui-ngx/src/app/shared/components/entity/entity-select.component.ts b/ui-ngx/src/app/shared/components/entity/entity-select.component.ts index fbfb7ae453..57d2380705 100644 --- a/ui-ngx/src/app/shared/components/entity/entity-select.component.ts +++ b/ui-ngx/src/app/shared/components/entity/entity-select.component.ts @@ -14,7 +14,7 @@ /// limitations under the License. /// -import { AfterViewInit, Component, DestroyRef, EventEmitter, forwardRef, Input, OnInit, Output } from '@angular/core'; +import { Component, DestroyRef, EventEmitter, forwardRef, Input, OnInit, Output } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @@ -38,7 +38,7 @@ import { BaseData } from '@shared/models/base-data'; multi: true }] }) -export class EntitySelectComponent implements ControlValueAccessor, OnInit, AfterViewInit { +export class EntitySelectComponent implements ControlValueAccessor, OnInit { entitySelectFormGroup: UntypedFormGroup; @@ -70,6 +70,9 @@ export class EntitySelectComponent implements ControlValueAccessor, OnInit, Afte @Input() filterAllowedEntityTypes: boolean; + @Input() + defaultEntityType: AliasEntityType | EntityType; + @Output() entityChanged = new EventEmitter>(); @@ -81,8 +84,6 @@ export class EntitySelectComponent implements ControlValueAccessor, OnInit, Afte AliasEntityType.CURRENT_TENANT, AliasEntityType.CURRENT_USER, AliasEntityType.CURRENT_USER_OWNER ]); - private readonly defaultEntityType: EntityType | AliasEntityType = null; - private propagateChange = (v: any) => { }; constructor(private store: Store, @@ -93,15 +94,18 @@ export class EntitySelectComponent implements ControlValueAccessor, OnInit, Afte const entityTypes = this.entityService.prepareAllowedEntityTypesList(this.allowedEntityTypes, this.useAliasEntityTypes); + + let defaultEntityType: EntityType | AliasEntityType = null + if (entityTypes.length === 1) { this.displayEntityTypeSelect = false; - this.defaultEntityType = entityTypes[0]; + defaultEntityType = entityTypes[0]; } else { this.displayEntityTypeSelect = true; } this.entitySelectFormGroup = this.fb.group({ - entityType: [this.defaultEntityType], + entityType: [defaultEntityType], entityId: [null] }); } @@ -133,9 +137,19 @@ export class EntitySelectComponent implements ControlValueAccessor, OnInit, Afte if (additionNullUIIDEntityTypes.length > 0) { additionNullUIIDEntityTypes.forEach((entityType) => this.entityTypeNullUUID.add(entityType)); } - } - ngAfterViewInit(): void { + if (this.filterAllowedEntityTypes === false) { + if (this.allowedEntityTypes?.length === 1) { + this.displayEntityTypeSelect = false; + this.entitySelectFormGroup.get('entityType').setValue(this.allowedEntityTypes[0]) + } else { + this.displayEntityTypeSelect = true; + } + } + + if (this.defaultEntityType) { + this.entitySelectFormGroup.get('entityType').setValue(this.defaultEntityType); + } } setDisabledState(isDisabled: boolean): void { From f2dadd07914d6c327756160f0c665fce8597a786 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Thu, 25 Dec 2025 11:52:53 +0200 Subject: [PATCH 089/579] Version set to 4.2.1.2-SNAPSHOT --- application/pom.xml | 2 +- .../service/install/DefaultDatabaseSchemaSettingsService.java | 2 +- common/actor/pom.xml | 2 +- common/cache/pom.xml | 2 +- common/cluster-api/pom.xml | 2 +- common/coap-server/pom.xml | 2 +- common/dao-api/pom.xml | 2 +- common/data/pom.xml | 2 +- common/discovery-api/pom.xml | 2 +- common/edge-api/pom.xml | 2 +- common/edqs/pom.xml | 2 +- common/message/pom.xml | 2 +- common/pom.xml | 2 +- common/proto/pom.xml | 2 +- common/queue/pom.xml | 2 +- common/script/pom.xml | 2 +- common/script/remote-js-client/pom.xml | 2 +- common/script/script-api/pom.xml | 2 +- common/stats/pom.xml | 2 +- common/transport/coap/pom.xml | 2 +- common/transport/http/pom.xml | 2 +- common/transport/lwm2m/pom.xml | 2 +- common/transport/mqtt/pom.xml | 2 +- common/transport/pom.xml | 2 +- common/transport/snmp/pom.xml | 2 +- common/transport/transport-api/pom.xml | 2 +- common/util/pom.xml | 2 +- common/version-control/pom.xml | 2 +- dao/pom.xml | 2 +- edqs/pom.xml | 2 +- monitoring/pom.xml | 2 +- msa/black-box-tests/pom.xml | 2 +- msa/edqs/pom.xml | 2 +- msa/js-executor/package.json | 2 +- msa/js-executor/pom.xml | 2 +- msa/monitoring/pom.xml | 2 +- msa/pom.xml | 2 +- msa/tb-node/pom.xml | 2 +- msa/tb/pom.xml | 2 +- msa/transport/coap/pom.xml | 2 +- msa/transport/http/pom.xml | 2 +- msa/transport/lwm2m/pom.xml | 2 +- msa/transport/mqtt/pom.xml | 2 +- msa/transport/pom.xml | 2 +- msa/transport/snmp/pom.xml | 2 +- msa/vc-executor-docker/pom.xml | 2 +- msa/vc-executor/pom.xml | 2 +- msa/web-ui/package.json | 2 +- msa/web-ui/pom.xml | 2 +- netty-mqtt/pom.xml | 4 ++-- pom.xml | 2 +- rest-client/pom.xml | 2 +- rule-engine/pom.xml | 2 +- rule-engine/rule-engine-api/pom.xml | 2 +- rule-engine/rule-engine-components/pom.xml | 2 +- tools/pom.xml | 2 +- transport/coap/pom.xml | 2 +- transport/http/pom.xml | 2 +- transport/lwm2m/pom.xml | 2 +- transport/mqtt/pom.xml | 2 +- transport/pom.xml | 2 +- transport/snmp/pom.xml | 2 +- ui-ngx/package.json | 2 +- ui-ngx/pom.xml | 2 +- 64 files changed, 65 insertions(+), 65 deletions(-) diff --git a/application/pom.xml b/application/pom.xml index 47772dfa97..9f3b79b3f5 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT thingsboard application diff --git a/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java b/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java index 44aa14b782..500ad60df0 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java @@ -30,7 +30,7 @@ public class DefaultDatabaseSchemaSettingsService implements DatabaseSchemaSetti // This list should include all versions that are compatible for the upgrade in 4 digits format (like 4.2.0.0, etc.). // The compatibility cycle usually breaks when we have some scripts written in Java that may not work after a new release. - private static final List SUPPORTED_VERSIONS_FOR_UPGRADE = List.of("4.2.0.0", "4.2.1.0"); + private static final List SUPPORTED_VERSIONS_FOR_UPGRADE = List.of("4.2.1.0"); private final ProjectInfo projectInfo; private final JdbcTemplate jdbcTemplate; diff --git a/common/actor/pom.xml b/common/actor/pom.xml index 6411934f7d..68d05cecba 100644 --- a/common/actor/pom.xml +++ b/common/actor/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/cache/pom.xml b/common/cache/pom.xml index a43009b6e1..3d42e467ba 100644 --- a/common/cache/pom.xml +++ b/common/cache/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/cluster-api/pom.xml b/common/cluster-api/pom.xml index 9a75a6b0c3..f9b0b60e50 100644 --- a/common/cluster-api/pom.xml +++ b/common/cluster-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/coap-server/pom.xml b/common/coap-server/pom.xml index 1950a9ecc2..fd53b3dfc7 100644 --- a/common/coap-server/pom.xml +++ b/common/coap-server/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/dao-api/pom.xml b/common/dao-api/pom.xml index 8b0ad31e23..fe6f59503b 100644 --- a/common/dao-api/pom.xml +++ b/common/dao-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/data/pom.xml b/common/data/pom.xml index a574a6ed07..e8bd87aa19 100644 --- a/common/data/pom.xml +++ b/common/data/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/discovery-api/pom.xml b/common/discovery-api/pom.xml index 9e65abf10a..2c62c714f1 100644 --- a/common/discovery-api/pom.xml +++ b/common/discovery-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/edge-api/pom.xml b/common/edge-api/pom.xml index 208e1e7b55..704dc7759b 100644 --- a/common/edge-api/pom.xml +++ b/common/edge-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/edqs/pom.xml b/common/edqs/pom.xml index 677f5ad5ae..bd2b96da15 100644 --- a/common/edqs/pom.xml +++ b/common/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/message/pom.xml b/common/message/pom.xml index f70bc260cf..a3a4d2e38e 100644 --- a/common/message/pom.xml +++ b/common/message/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/pom.xml b/common/pom.xml index 5467f452d2..76aa577782 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT thingsboard common diff --git a/common/proto/pom.xml b/common/proto/pom.xml index bab2f8d12b..875904824b 100644 --- a/common/proto/pom.xml +++ b/common/proto/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/queue/pom.xml b/common/queue/pom.xml index 19368c1345..f88baefc6e 100644 --- a/common/queue/pom.xml +++ b/common/queue/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/script/pom.xml b/common/script/pom.xml index 4b7a812737..cb4d0c2ac2 100644 --- a/common/script/pom.xml +++ b/common/script/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/script/remote-js-client/pom.xml b/common/script/remote-js-client/pom.xml index 45d4698efe..e2dffb44a6 100644 --- a/common/script/remote-js-client/pom.xml +++ b/common/script/remote-js-client/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT script org.thingsboard.common.script diff --git a/common/script/script-api/pom.xml b/common/script/script-api/pom.xml index 3bc2168dfe..c10c49b279 100644 --- a/common/script/script-api/pom.xml +++ b/common/script/script-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT script org.thingsboard.common.script diff --git a/common/stats/pom.xml b/common/stats/pom.xml index 66011657d8..8e896767c7 100644 --- a/common/stats/pom.xml +++ b/common/stats/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/transport/coap/pom.xml b/common/transport/coap/pom.xml index e9d5dcfc1a..29bf5c7567 100644 --- a/common/transport/coap/pom.xml +++ b/common/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/http/pom.xml b/common/transport/http/pom.xml index caff518fe2..3b033bb741 100644 --- a/common/transport/http/pom.xml +++ b/common/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/lwm2m/pom.xml b/common/transport/lwm2m/pom.xml index 2bec8f7bcb..8c4e9e79ff 100644 --- a/common/transport/lwm2m/pom.xml +++ b/common/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/mqtt/pom.xml b/common/transport/mqtt/pom.xml index 18ff4e96c3..7012f22bb4 100644 --- a/common/transport/mqtt/pom.xml +++ b/common/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/pom.xml b/common/transport/pom.xml index feaef2bcce..d6f1761a40 100644 --- a/common/transport/pom.xml +++ b/common/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/transport/snmp/pom.xml b/common/transport/snmp/pom.xml index da5093349d..522034b9c8 100644 --- a/common/transport/snmp/pom.xml +++ b/common/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard.common - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport diff --git a/common/transport/transport-api/pom.xml b/common/transport/transport-api/pom.xml index 1cb128b439..34de935e17 100644 --- a/common/transport/transport-api/pom.xml +++ b/common/transport/transport-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/util/pom.xml b/common/util/pom.xml index 6509f154ad..2e1eb18478 100644 --- a/common/util/pom.xml +++ b/common/util/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/version-control/pom.xml b/common/version-control/pom.xml index 939d0d47ad..1930c026b5 100644 --- a/common/version-control/pom.xml +++ b/common/version-control/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/dao/pom.xml b/dao/pom.xml index 5044c0edfb..36e5bad26d 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT thingsboard dao diff --git a/edqs/pom.xml b/edqs/pom.xml index ef91e0bed4..2f5e513f16 100644 --- a/edqs/pom.xml +++ b/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT thingsboard edqs diff --git a/monitoring/pom.xml b/monitoring/pom.xml index 3fb4ba5314..1b67c4c397 100644 --- a/monitoring/pom.xml +++ b/monitoring/pom.xml @@ -21,7 +21,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT thingsboard diff --git a/msa/black-box-tests/pom.xml b/msa/black-box-tests/pom.xml index 6800c0c4cf..0d560720c8 100644 --- a/msa/black-box-tests/pom.xml +++ b/msa/black-box-tests/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/edqs/pom.xml b/msa/edqs/pom.xml index 62374eb2bc..a40ef45fff 100644 --- a/msa/edqs/pom.xml +++ b/msa/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/js-executor/package.json b/msa/js-executor/package.json index 3f4370b642..3c77172f4e 100644 --- a/msa/js-executor/package.json +++ b/msa/js-executor/package.json @@ -1,7 +1,7 @@ { "name": "thingsboard-js-executor", "private": true, - "version": "4.2.1.1", + "version": "4.2.1.2", "description": "ThingsBoard JavaScript Executor Microservice", "main": "server.ts", "bin": "server.js", diff --git a/msa/js-executor/pom.xml b/msa/js-executor/pom.xml index 3aaf380e2f..99cef90704 100644 --- a/msa/js-executor/pom.xml +++ b/msa/js-executor/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/monitoring/pom.xml b/msa/monitoring/pom.xml index b81abce27d..cd7615ae6e 100644 --- a/msa/monitoring/pom.xml +++ b/msa/monitoring/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT msa diff --git a/msa/pom.xml b/msa/pom.xml index 5eff7cc06d..29299d7b9a 100644 --- a/msa/pom.xml +++ b/msa/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT thingsboard msa diff --git a/msa/tb-node/pom.xml b/msa/tb-node/pom.xml index e473e1dfdf..0be77548a2 100644 --- a/msa/tb-node/pom.xml +++ b/msa/tb-node/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/tb/pom.xml b/msa/tb/pom.xml index 9db071c9ae..e46152fb62 100644 --- a/msa/tb/pom.xml +++ b/msa/tb/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/transport/coap/pom.xml b/msa/transport/coap/pom.xml index 098e3263b8..7b9167980d 100644 --- a/msa/transport/coap/pom.xml +++ b/msa/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/http/pom.xml b/msa/transport/http/pom.xml index 3acbeb7a2d..e56c364c72 100644 --- a/msa/transport/http/pom.xml +++ b/msa/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/lwm2m/pom.xml b/msa/transport/lwm2m/pom.xml index bc6d0d004e..7a2fc4b007 100644 --- a/msa/transport/lwm2m/pom.xml +++ b/msa/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/mqtt/pom.xml b/msa/transport/mqtt/pom.xml index ef20c96f26..7c0c77725d 100644 --- a/msa/transport/mqtt/pom.xml +++ b/msa/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/pom.xml b/msa/transport/pom.xml index 76cec909da..e1d53efaf4 100644 --- a/msa/transport/pom.xml +++ b/msa/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/transport/snmp/pom.xml b/msa/transport/snmp/pom.xml index 348880019c..ba25ffa004 100644 --- a/msa/transport/snmp/pom.xml +++ b/msa/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard.msa transport - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT org.thingsboard.msa.transport diff --git a/msa/vc-executor-docker/pom.xml b/msa/vc-executor-docker/pom.xml index b1c11efe0a..134c3d8ce5 100644 --- a/msa/vc-executor-docker/pom.xml +++ b/msa/vc-executor-docker/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/vc-executor/pom.xml b/msa/vc-executor/pom.xml index a59a8aa823..c487ddc721 100644 --- a/msa/vc-executor/pom.xml +++ b/msa/vc-executor/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/web-ui/package.json b/msa/web-ui/package.json index 97d69546bc..44aade2d73 100644 --- a/msa/web-ui/package.json +++ b/msa/web-ui/package.json @@ -1,7 +1,7 @@ { "name": "thingsboard-web-ui", "private": true, - "version": "4.2.1.1", + "version": "4.2.1.2", "description": "ThingsBoard Web UI Microservice", "main": "server.ts", "bin": "server.js", diff --git a/msa/web-ui/pom.xml b/msa/web-ui/pom.xml index 70200eddb3..36e53ed52c 100644 --- a/msa/web-ui/pom.xml +++ b/msa/web-ui/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/netty-mqtt/pom.xml b/netty-mqtt/pom.xml index c0743024ea..99261b714d 100644 --- a/netty-mqtt/pom.xml +++ b/netty-mqtt/pom.xml @@ -19,11 +19,11 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT thingsboard netty-mqtt - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT jar Netty MQTT Client diff --git a/pom.xml b/pom.xml index 7f8ef8074a..9edccba7f7 100755 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT pom Thingsboard diff --git a/rest-client/pom.xml b/rest-client/pom.xml index eddcd84d9a..3ee5321627 100644 --- a/rest-client/pom.xml +++ b/rest-client/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT thingsboard rest-client diff --git a/rule-engine/pom.xml b/rule-engine/pom.xml index 99372b9703..d89c238559 100644 --- a/rule-engine/pom.xml +++ b/rule-engine/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT thingsboard rule-engine diff --git a/rule-engine/rule-engine-api/pom.xml b/rule-engine/rule-engine-api/pom.xml index c52fb92594..5f48404b91 100644 --- a/rule-engine/rule-engine-api/pom.xml +++ b/rule-engine/rule-engine-api/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT rule-engine org.thingsboard.rule-engine diff --git a/rule-engine/rule-engine-components/pom.xml b/rule-engine/rule-engine-components/pom.xml index f582f1277a..e307d9a57d 100644 --- a/rule-engine/rule-engine-components/pom.xml +++ b/rule-engine/rule-engine-components/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT rule-engine org.thingsboard.rule-engine diff --git a/tools/pom.xml b/tools/pom.xml index 783dc1ee73..bd16603596 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT thingsboard tools diff --git a/transport/coap/pom.xml b/transport/coap/pom.xml index f43d31e35b..681c75b102 100644 --- a/transport/coap/pom.xml +++ b/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/http/pom.xml b/transport/http/pom.xml index 7e55ae3db5..b338a4b4ea 100644 --- a/transport/http/pom.xml +++ b/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/lwm2m/pom.xml b/transport/lwm2m/pom.xml index f64f8b4aa4..4d5d621a08 100644 --- a/transport/lwm2m/pom.xml +++ b/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/mqtt/pom.xml b/transport/mqtt/pom.xml index 0bcf68cbb8..336265ff00 100644 --- a/transport/mqtt/pom.xml +++ b/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/pom.xml b/transport/pom.xml index 1d3755a766..a4b9c9c630 100644 --- a/transport/pom.xml +++ b/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT thingsboard transport diff --git a/transport/snmp/pom.xml b/transport/snmp/pom.xml index 5ea39a4066..a361d85838 100644 --- a/transport/snmp/pom.xml +++ b/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT transport diff --git a/ui-ngx/package.json b/ui-ngx/package.json index 74b4bbbb9c..b17c3e1d35 100644 --- a/ui-ngx/package.json +++ b/ui-ngx/package.json @@ -1,6 +1,6 @@ { "name": "thingsboard", - "version": "4.2.1.1", + "version": "4.2.1.2", "scripts": { "ng": "ng", "start": "node --max_old_space_size=8048 ./node_modules/@angular/cli/bin/ng serve --configuration development --host 0.0.0.0 --open", diff --git a/ui-ngx/pom.xml b/ui-ngx/pom.xml index d5bd48de78..54b8adc93a 100644 --- a/ui-ngx/pom.xml +++ b/ui-ngx/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.1-RC + 4.2.1.2-SNAPSHOT thingsboard org.thingsboard From 5e8ca1ca46099ca94151a5b32c9c7bef099816a7 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Thu, 25 Dec 2025 11:59:03 +0200 Subject: [PATCH 090/579] TMP version set to 4.2.1.2-SNAPSHOT --- application/pom.xml | 2 +- common/actor/pom.xml | 2 +- common/cache/pom.xml | 2 +- common/cluster-api/pom.xml | 2 +- common/coap-server/pom.xml | 2 +- common/dao-api/pom.xml | 2 +- common/data/pom.xml | 2 +- common/discovery-api/pom.xml | 2 +- common/edge-api/pom.xml | 2 +- common/edqs/pom.xml | 2 +- common/message/pom.xml | 2 +- common/pom.xml | 2 +- common/proto/pom.xml | 2 +- common/queue/pom.xml | 2 +- common/script/pom.xml | 2 +- common/script/remote-js-client/pom.xml | 2 +- common/script/script-api/pom.xml | 2 +- common/stats/pom.xml | 2 +- common/transport/coap/pom.xml | 2 +- common/transport/http/pom.xml | 2 +- common/transport/lwm2m/pom.xml | 2 +- common/transport/mqtt/pom.xml | 2 +- common/transport/pom.xml | 2 +- common/transport/snmp/pom.xml | 2 +- common/transport/transport-api/pom.xml | 2 +- common/util/pom.xml | 2 +- common/version-control/pom.xml | 2 +- dao/pom.xml | 2 +- edqs/pom.xml | 2 +- monitoring/pom.xml | 2 +- msa/black-box-tests/pom.xml | 2 +- msa/edqs/pom.xml | 2 +- msa/js-executor/pom.xml | 2 +- msa/monitoring/pom.xml | 2 +- msa/pom.xml | 2 +- msa/tb-node/pom.xml | 2 +- msa/tb/pom.xml | 2 +- msa/transport/coap/pom.xml | 2 +- msa/transport/http/pom.xml | 2 +- msa/transport/lwm2m/pom.xml | 2 +- msa/transport/mqtt/pom.xml | 2 +- msa/transport/pom.xml | 2 +- msa/transport/snmp/pom.xml | 2 +- msa/vc-executor-docker/pom.xml | 2 +- msa/vc-executor/pom.xml | 2 +- msa/web-ui/pom.xml | 2 +- netty-mqtt/pom.xml | 4 ++-- pom.xml | 2 +- rest-client/pom.xml | 2 +- rule-engine/pom.xml | 2 +- rule-engine/rule-engine-api/pom.xml | 2 +- rule-engine/rule-engine-components/pom.xml | 2 +- tools/pom.xml | 2 +- transport/coap/pom.xml | 2 +- transport/http/pom.xml | 2 +- transport/lwm2m/pom.xml | 2 +- transport/mqtt/pom.xml | 2 +- transport/pom.xml | 2 +- transport/snmp/pom.xml | 2 +- ui-ngx/pom.xml | 2 +- 60 files changed, 61 insertions(+), 61 deletions(-) diff --git a/application/pom.xml b/application/pom.xml index 7d304226ad..9f3b79b3f5 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT thingsboard application diff --git a/common/actor/pom.xml b/common/actor/pom.xml index 1ce65906da..68d05cecba 100644 --- a/common/actor/pom.xml +++ b/common/actor/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/cache/pom.xml b/common/cache/pom.xml index bc2fbd8bda..3d42e467ba 100644 --- a/common/cache/pom.xml +++ b/common/cache/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/cluster-api/pom.xml b/common/cluster-api/pom.xml index cbb082d26a..f9b0b60e50 100644 --- a/common/cluster-api/pom.xml +++ b/common/cluster-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/coap-server/pom.xml b/common/coap-server/pom.xml index d2c5ffc7ab..fd53b3dfc7 100644 --- a/common/coap-server/pom.xml +++ b/common/coap-server/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/dao-api/pom.xml b/common/dao-api/pom.xml index 6904d69aa3..fe6f59503b 100644 --- a/common/dao-api/pom.xml +++ b/common/dao-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/data/pom.xml b/common/data/pom.xml index 921135f811..e8bd87aa19 100644 --- a/common/data/pom.xml +++ b/common/data/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/discovery-api/pom.xml b/common/discovery-api/pom.xml index 667c140615..2c62c714f1 100644 --- a/common/discovery-api/pom.xml +++ b/common/discovery-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/edge-api/pom.xml b/common/edge-api/pom.xml index 87068df36c..704dc7759b 100644 --- a/common/edge-api/pom.xml +++ b/common/edge-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/edqs/pom.xml b/common/edqs/pom.xml index aec29584e4..bd2b96da15 100644 --- a/common/edqs/pom.xml +++ b/common/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/message/pom.xml b/common/message/pom.xml index 7d4487f74a..a3a4d2e38e 100644 --- a/common/message/pom.xml +++ b/common/message/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/pom.xml b/common/pom.xml index 72ec1ee9a6..76aa577782 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT thingsboard common diff --git a/common/proto/pom.xml b/common/proto/pom.xml index 7230d20ce1..875904824b 100644 --- a/common/proto/pom.xml +++ b/common/proto/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/queue/pom.xml b/common/queue/pom.xml index 9885975417..f88baefc6e 100644 --- a/common/queue/pom.xml +++ b/common/queue/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/script/pom.xml b/common/script/pom.xml index efa5efafca..cb4d0c2ac2 100644 --- a/common/script/pom.xml +++ b/common/script/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/script/remote-js-client/pom.xml b/common/script/remote-js-client/pom.xml index 189d86d3bf..e2dffb44a6 100644 --- a/common/script/remote-js-client/pom.xml +++ b/common/script/remote-js-client/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.2.1.2-SNAPSHOT script org.thingsboard.common.script diff --git a/common/script/script-api/pom.xml b/common/script/script-api/pom.xml index c80e51a60f..c10c49b279 100644 --- a/common/script/script-api/pom.xml +++ b/common/script/script-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.2.1.2-SNAPSHOT script org.thingsboard.common.script diff --git a/common/stats/pom.xml b/common/stats/pom.xml index d1bb0a80c3..8e896767c7 100644 --- a/common/stats/pom.xml +++ b/common/stats/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/transport/coap/pom.xml b/common/transport/coap/pom.xml index dbabba721e..29bf5c7567 100644 --- a/common/transport/coap/pom.xml +++ b/common/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/http/pom.xml b/common/transport/http/pom.xml index 475effe638..3b033bb741 100644 --- a/common/transport/http/pom.xml +++ b/common/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/lwm2m/pom.xml b/common/transport/lwm2m/pom.xml index d0831647e8..8c4e9e79ff 100644 --- a/common/transport/lwm2m/pom.xml +++ b/common/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/mqtt/pom.xml b/common/transport/mqtt/pom.xml index 3ba19f00e5..7012f22bb4 100644 --- a/common/transport/mqtt/pom.xml +++ b/common/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/pom.xml b/common/transport/pom.xml index b56fbbc428..d6f1761a40 100644 --- a/common/transport/pom.xml +++ b/common/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/transport/snmp/pom.xml b/common/transport/snmp/pom.xml index b858b8ff5f..522034b9c8 100644 --- a/common/transport/snmp/pom.xml +++ b/common/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard.common - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport diff --git a/common/transport/transport-api/pom.xml b/common/transport/transport-api/pom.xml index db34b1d21f..34de935e17 100644 --- a/common/transport/transport-api/pom.xml +++ b/common/transport/transport-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/util/pom.xml b/common/util/pom.xml index 83febcaef7..2e1eb18478 100644 --- a/common/util/pom.xml +++ b/common/util/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/common/version-control/pom.xml b/common/version-control/pom.xml index 6207dc3e72..1930c026b5 100644 --- a/common/version-control/pom.xml +++ b/common/version-control/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT common org.thingsboard.common diff --git a/dao/pom.xml b/dao/pom.xml index f0aa6b833f..36e5bad26d 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT thingsboard dao diff --git a/edqs/pom.xml b/edqs/pom.xml index 546da5902f..2f5e513f16 100644 --- a/edqs/pom.xml +++ b/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT thingsboard edqs diff --git a/monitoring/pom.xml b/monitoring/pom.xml index dbac99d9c4..1b67c4c397 100644 --- a/monitoring/pom.xml +++ b/monitoring/pom.xml @@ -21,7 +21,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT thingsboard diff --git a/msa/black-box-tests/pom.xml b/msa/black-box-tests/pom.xml index 30873c4c50..0d560720c8 100644 --- a/msa/black-box-tests/pom.xml +++ b/msa/black-box-tests/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/edqs/pom.xml b/msa/edqs/pom.xml index 1b0084d471..a40ef45fff 100644 --- a/msa/edqs/pom.xml +++ b/msa/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/js-executor/pom.xml b/msa/js-executor/pom.xml index 50ab2286bb..99cef90704 100644 --- a/msa/js-executor/pom.xml +++ b/msa/js-executor/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/monitoring/pom.xml b/msa/monitoring/pom.xml index 2e85f02671..cd7615ae6e 100644 --- a/msa/monitoring/pom.xml +++ b/msa/monitoring/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT msa diff --git a/msa/pom.xml b/msa/pom.xml index f41f7f0fc0..e72d2ccfde 100644 --- a/msa/pom.xml +++ b/msa/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT thingsboard msa diff --git a/msa/tb-node/pom.xml b/msa/tb-node/pom.xml index 29ea35dba5..0be77548a2 100644 --- a/msa/tb-node/pom.xml +++ b/msa/tb-node/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/tb/pom.xml b/msa/tb/pom.xml index fd562fc692..e46152fb62 100644 --- a/msa/tb/pom.xml +++ b/msa/tb/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/transport/coap/pom.xml b/msa/transport/coap/pom.xml index 6a08c8154c..7b9167980d 100644 --- a/msa/transport/coap/pom.xml +++ b/msa/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/http/pom.xml b/msa/transport/http/pom.xml index 680863481a..e56c364c72 100644 --- a/msa/transport/http/pom.xml +++ b/msa/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/lwm2m/pom.xml b/msa/transport/lwm2m/pom.xml index 1226a9d549..7a2fc4b007 100644 --- a/msa/transport/lwm2m/pom.xml +++ b/msa/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/mqtt/pom.xml b/msa/transport/mqtt/pom.xml index cfe624c69d..7c0c77725d 100644 --- a/msa/transport/mqtt/pom.xml +++ b/msa/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/pom.xml b/msa/transport/pom.xml index b63aec5c68..e1d53efaf4 100644 --- a/msa/transport/pom.xml +++ b/msa/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/transport/snmp/pom.xml b/msa/transport/snmp/pom.xml index b6a72efa58..ba25ffa004 100644 --- a/msa/transport/snmp/pom.xml +++ b/msa/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard.msa transport - 4.3.0-RC + 4.2.1.2-SNAPSHOT org.thingsboard.msa.transport diff --git a/msa/vc-executor-docker/pom.xml b/msa/vc-executor-docker/pom.xml index eba717cb36..134c3d8ce5 100644 --- a/msa/vc-executor-docker/pom.xml +++ b/msa/vc-executor-docker/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/vc-executor/pom.xml b/msa/vc-executor/pom.xml index 0635e69bd5..c487ddc721 100644 --- a/msa/vc-executor/pom.xml +++ b/msa/vc-executor/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/web-ui/pom.xml b/msa/web-ui/pom.xml index 1eb47413d7..36e53ed52c 100644 --- a/msa/web-ui/pom.xml +++ b/msa/web-ui/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT msa org.thingsboard.msa diff --git a/netty-mqtt/pom.xml b/netty-mqtt/pom.xml index 01bc357127..99261b714d 100644 --- a/netty-mqtt/pom.xml +++ b/netty-mqtt/pom.xml @@ -19,11 +19,11 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT thingsboard netty-mqtt - 4.3.0-RC + 4.2.1.2-SNAPSHOT jar Netty MQTT Client diff --git a/pom.xml b/pom.xml index 99108196aa..9edccba7f7 100755 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT pom Thingsboard diff --git a/rest-client/pom.xml b/rest-client/pom.xml index fd5783227b..3ee5321627 100644 --- a/rest-client/pom.xml +++ b/rest-client/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT thingsboard rest-client diff --git a/rule-engine/pom.xml b/rule-engine/pom.xml index dce202bc94..d89c238559 100644 --- a/rule-engine/pom.xml +++ b/rule-engine/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT thingsboard rule-engine diff --git a/rule-engine/rule-engine-api/pom.xml b/rule-engine/rule-engine-api/pom.xml index ef6904b24c..5f48404b91 100644 --- a/rule-engine/rule-engine-api/pom.xml +++ b/rule-engine/rule-engine-api/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT rule-engine org.thingsboard.rule-engine diff --git a/rule-engine/rule-engine-components/pom.xml b/rule-engine/rule-engine-components/pom.xml index 78e6b5e684..e307d9a57d 100644 --- a/rule-engine/rule-engine-components/pom.xml +++ b/rule-engine/rule-engine-components/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT rule-engine org.thingsboard.rule-engine diff --git a/tools/pom.xml b/tools/pom.xml index d76b19ba2d..bd16603596 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT thingsboard tools diff --git a/transport/coap/pom.xml b/transport/coap/pom.xml index 4a30c5d2bb..681c75b102 100644 --- a/transport/coap/pom.xml +++ b/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/http/pom.xml b/transport/http/pom.xml index bc1c7a845d..b338a4b4ea 100644 --- a/transport/http/pom.xml +++ b/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/lwm2m/pom.xml b/transport/lwm2m/pom.xml index 8871a2b2b3..4d5d621a08 100644 --- a/transport/lwm2m/pom.xml +++ b/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/mqtt/pom.xml b/transport/mqtt/pom.xml index 2fe1cb91b2..336265ff00 100644 --- a/transport/mqtt/pom.xml +++ b/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/pom.xml b/transport/pom.xml index ad394b46f9..a4b9c9c630 100644 --- a/transport/pom.xml +++ b/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT thingsboard transport diff --git a/transport/snmp/pom.xml b/transport/snmp/pom.xml index 528538bd03..a361d85838 100644 --- a/transport/snmp/pom.xml +++ b/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT transport diff --git a/ui-ngx/pom.xml b/ui-ngx/pom.xml index f83c914409..54b8adc93a 100644 --- a/ui-ngx/pom.xml +++ b/ui-ngx/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.2.1.2-SNAPSHOT thingsboard org.thingsboard From c069d282315da2b63eb9241914433486a29f481d Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Thu, 25 Dec 2025 12:04:22 +0200 Subject: [PATCH 091/579] Version set to 4.3.0-RC --- application/pom.xml | 2 +- .../service/install/DefaultDatabaseSchemaSettingsService.java | 3 ++- common/actor/pom.xml | 2 +- common/cache/pom.xml | 2 +- common/cluster-api/pom.xml | 2 +- common/coap-server/pom.xml | 2 +- common/dao-api/pom.xml | 2 +- common/data/pom.xml | 2 +- common/discovery-api/pom.xml | 2 +- common/edge-api/pom.xml | 2 +- common/edqs/pom.xml | 2 +- common/message/pom.xml | 2 +- common/pom.xml | 2 +- common/proto/pom.xml | 2 +- common/queue/pom.xml | 2 +- common/script/pom.xml | 2 +- common/script/remote-js-client/pom.xml | 2 +- common/script/script-api/pom.xml | 2 +- common/stats/pom.xml | 2 +- common/transport/coap/pom.xml | 2 +- common/transport/http/pom.xml | 2 +- common/transport/lwm2m/pom.xml | 2 +- common/transport/mqtt/pom.xml | 2 +- common/transport/pom.xml | 2 +- common/transport/snmp/pom.xml | 2 +- common/transport/transport-api/pom.xml | 2 +- common/util/pom.xml | 2 +- common/version-control/pom.xml | 2 +- dao/pom.xml | 2 +- edqs/pom.xml | 2 +- monitoring/pom.xml | 2 +- msa/black-box-tests/pom.xml | 2 +- msa/edqs/pom.xml | 2 +- msa/js-executor/pom.xml | 2 +- msa/monitoring/pom.xml | 2 +- msa/pom.xml | 4 ++-- msa/tb-node/pom.xml | 2 +- msa/tb/pom.xml | 2 +- msa/transport/coap/pom.xml | 2 +- msa/transport/http/pom.xml | 2 +- msa/transport/lwm2m/pom.xml | 2 +- msa/transport/mqtt/pom.xml | 2 +- msa/transport/pom.xml | 2 +- msa/transport/snmp/pom.xml | 2 +- msa/vc-executor-docker/pom.xml | 2 +- msa/vc-executor/pom.xml | 2 +- msa/web-ui/pom.xml | 2 +- netty-mqtt/pom.xml | 4 ++-- pom.xml | 2 +- rest-client/pom.xml | 2 +- rule-engine/pom.xml | 2 +- rule-engine/rule-engine-api/pom.xml | 2 +- rule-engine/rule-engine-components/pom.xml | 2 +- tools/pom.xml | 2 +- transport/coap/pom.xml | 2 +- transport/http/pom.xml | 2 +- transport/lwm2m/pom.xml | 2 +- transport/mqtt/pom.xml | 2 +- transport/pom.xml | 2 +- transport/snmp/pom.xml | 2 +- ui-ngx/pom.xml | 2 +- 61 files changed, 64 insertions(+), 63 deletions(-) diff --git a/application/pom.xml b/application/pom.xml index 9f3b79b3f5..7d304226ad 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC thingsboard application diff --git a/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java b/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java index 500ad60df0..d65ac6ba31 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java @@ -30,7 +30,8 @@ public class DefaultDatabaseSchemaSettingsService implements DatabaseSchemaSetti // This list should include all versions that are compatible for the upgrade in 4 digits format (like 4.2.0.0, etc.). // The compatibility cycle usually breaks when we have some scripts written in Java that may not work after a new release. - private static final List SUPPORTED_VERSIONS_FOR_UPGRADE = List.of("4.2.1.0"); + // TODO: don't check the "patch" number, since upgrade is not required for patch releases + private static final List SUPPORTED_VERSIONS_FOR_UPGRADE = List.of("4.2.1.0", "4.2.1.1", "4.2.1.2"); private final ProjectInfo projectInfo; private final JdbcTemplate jdbcTemplate; diff --git a/common/actor/pom.xml b/common/actor/pom.xml index 68d05cecba..1ce65906da 100644 --- a/common/actor/pom.xml +++ b/common/actor/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/cache/pom.xml b/common/cache/pom.xml index 3d42e467ba..bc2fbd8bda 100644 --- a/common/cache/pom.xml +++ b/common/cache/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/cluster-api/pom.xml b/common/cluster-api/pom.xml index f9b0b60e50..cbb082d26a 100644 --- a/common/cluster-api/pom.xml +++ b/common/cluster-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/coap-server/pom.xml b/common/coap-server/pom.xml index fd53b3dfc7..d2c5ffc7ab 100644 --- a/common/coap-server/pom.xml +++ b/common/coap-server/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/dao-api/pom.xml b/common/dao-api/pom.xml index fe6f59503b..6904d69aa3 100644 --- a/common/dao-api/pom.xml +++ b/common/dao-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/data/pom.xml b/common/data/pom.xml index e8bd87aa19..921135f811 100644 --- a/common/data/pom.xml +++ b/common/data/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/discovery-api/pom.xml b/common/discovery-api/pom.xml index 2c62c714f1..667c140615 100644 --- a/common/discovery-api/pom.xml +++ b/common/discovery-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/edge-api/pom.xml b/common/edge-api/pom.xml index 704dc7759b..87068df36c 100644 --- a/common/edge-api/pom.xml +++ b/common/edge-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/edqs/pom.xml b/common/edqs/pom.xml index bd2b96da15..aec29584e4 100644 --- a/common/edqs/pom.xml +++ b/common/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/message/pom.xml b/common/message/pom.xml index a3a4d2e38e..7d4487f74a 100644 --- a/common/message/pom.xml +++ b/common/message/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/pom.xml b/common/pom.xml index 76aa577782..72ec1ee9a6 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC thingsboard common diff --git a/common/proto/pom.xml b/common/proto/pom.xml index 875904824b..7230d20ce1 100644 --- a/common/proto/pom.xml +++ b/common/proto/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/queue/pom.xml b/common/queue/pom.xml index f88baefc6e..9885975417 100644 --- a/common/queue/pom.xml +++ b/common/queue/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/script/pom.xml b/common/script/pom.xml index cb4d0c2ac2..efa5efafca 100644 --- a/common/script/pom.xml +++ b/common/script/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/script/remote-js-client/pom.xml b/common/script/remote-js-client/pom.xml index e2dffb44a6..189d86d3bf 100644 --- a/common/script/remote-js-client/pom.xml +++ b/common/script/remote-js-client/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.2-SNAPSHOT + 4.3.0-RC script org.thingsboard.common.script diff --git a/common/script/script-api/pom.xml b/common/script/script-api/pom.xml index c10c49b279..c80e51a60f 100644 --- a/common/script/script-api/pom.xml +++ b/common/script/script-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.2-SNAPSHOT + 4.3.0-RC script org.thingsboard.common.script diff --git a/common/stats/pom.xml b/common/stats/pom.xml index 8e896767c7..d1bb0a80c3 100644 --- a/common/stats/pom.xml +++ b/common/stats/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/transport/coap/pom.xml b/common/transport/coap/pom.xml index 29bf5c7567..dbabba721e 100644 --- a/common/transport/coap/pom.xml +++ b/common/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.common.transport diff --git a/common/transport/http/pom.xml b/common/transport/http/pom.xml index 3b033bb741..475effe638 100644 --- a/common/transport/http/pom.xml +++ b/common/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.common.transport diff --git a/common/transport/lwm2m/pom.xml b/common/transport/lwm2m/pom.xml index 8c4e9e79ff..d0831647e8 100644 --- a/common/transport/lwm2m/pom.xml +++ b/common/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.common.transport diff --git a/common/transport/mqtt/pom.xml b/common/transport/mqtt/pom.xml index 7012f22bb4..3ba19f00e5 100644 --- a/common/transport/mqtt/pom.xml +++ b/common/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.common.transport diff --git a/common/transport/pom.xml b/common/transport/pom.xml index d6f1761a40..b56fbbc428 100644 --- a/common/transport/pom.xml +++ b/common/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/transport/snmp/pom.xml b/common/transport/snmp/pom.xml index 522034b9c8..b858b8ff5f 100644 --- a/common/transport/snmp/pom.xml +++ b/common/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard.common - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport diff --git a/common/transport/transport-api/pom.xml b/common/transport/transport-api/pom.xml index 34de935e17..db34b1d21f 100644 --- a/common/transport/transport-api/pom.xml +++ b/common/transport/transport-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.common.transport diff --git a/common/util/pom.xml b/common/util/pom.xml index 2e1eb18478..83febcaef7 100644 --- a/common/util/pom.xml +++ b/common/util/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/common/version-control/pom.xml b/common/version-control/pom.xml index 1930c026b5..6207dc3e72 100644 --- a/common/version-control/pom.xml +++ b/common/version-control/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC common org.thingsboard.common diff --git a/dao/pom.xml b/dao/pom.xml index 36e5bad26d..f0aa6b833f 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC thingsboard dao diff --git a/edqs/pom.xml b/edqs/pom.xml index 2f5e513f16..546da5902f 100644 --- a/edqs/pom.xml +++ b/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC thingsboard edqs diff --git a/monitoring/pom.xml b/monitoring/pom.xml index 1b67c4c397..dbac99d9c4 100644 --- a/monitoring/pom.xml +++ b/monitoring/pom.xml @@ -21,7 +21,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC thingsboard diff --git a/msa/black-box-tests/pom.xml b/msa/black-box-tests/pom.xml index 0d560720c8..30873c4c50 100644 --- a/msa/black-box-tests/pom.xml +++ b/msa/black-box-tests/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC msa org.thingsboard.msa diff --git a/msa/edqs/pom.xml b/msa/edqs/pom.xml index a40ef45fff..1b0084d471 100644 --- a/msa/edqs/pom.xml +++ b/msa/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC msa org.thingsboard.msa diff --git a/msa/js-executor/pom.xml b/msa/js-executor/pom.xml index 99cef90704..50ab2286bb 100644 --- a/msa/js-executor/pom.xml +++ b/msa/js-executor/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC msa org.thingsboard.msa diff --git a/msa/monitoring/pom.xml b/msa/monitoring/pom.xml index cd7615ae6e..2e85f02671 100644 --- a/msa/monitoring/pom.xml +++ b/msa/monitoring/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC msa diff --git a/msa/pom.xml b/msa/pom.xml index 8b19c757b1..8207996169 100644 --- a/msa/pom.xml +++ b/msa/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC thingsboard msa @@ -133,7 +133,7 @@ - 4.2.1-latest + 4.3.0-latest false diff --git a/msa/tb-node/pom.xml b/msa/tb-node/pom.xml index 0be77548a2..29ea35dba5 100644 --- a/msa/tb-node/pom.xml +++ b/msa/tb-node/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC msa org.thingsboard.msa diff --git a/msa/tb/pom.xml b/msa/tb/pom.xml index e46152fb62..fd562fc692 100644 --- a/msa/tb/pom.xml +++ b/msa/tb/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC msa org.thingsboard.msa diff --git a/msa/transport/coap/pom.xml b/msa/transport/coap/pom.xml index 7b9167980d..6a08c8154c 100644 --- a/msa/transport/coap/pom.xml +++ b/msa/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.msa.transport diff --git a/msa/transport/http/pom.xml b/msa/transport/http/pom.xml index e56c364c72..680863481a 100644 --- a/msa/transport/http/pom.xml +++ b/msa/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.msa.transport diff --git a/msa/transport/lwm2m/pom.xml b/msa/transport/lwm2m/pom.xml index 7a2fc4b007..1226a9d549 100644 --- a/msa/transport/lwm2m/pom.xml +++ b/msa/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.msa.transport diff --git a/msa/transport/mqtt/pom.xml b/msa/transport/mqtt/pom.xml index 7c0c77725d..cfe624c69d 100644 --- a/msa/transport/mqtt/pom.xml +++ b/msa/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.msa.transport diff --git a/msa/transport/pom.xml b/msa/transport/pom.xml index e1d53efaf4..b63aec5c68 100644 --- a/msa/transport/pom.xml +++ b/msa/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC msa org.thingsboard.msa diff --git a/msa/transport/snmp/pom.xml b/msa/transport/snmp/pom.xml index ba25ffa004..b6a72efa58 100644 --- a/msa/transport/snmp/pom.xml +++ b/msa/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard.msa transport - 4.2.1.2-SNAPSHOT + 4.3.0-RC org.thingsboard.msa.transport diff --git a/msa/vc-executor-docker/pom.xml b/msa/vc-executor-docker/pom.xml index 134c3d8ce5..eba717cb36 100644 --- a/msa/vc-executor-docker/pom.xml +++ b/msa/vc-executor-docker/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC msa org.thingsboard.msa diff --git a/msa/vc-executor/pom.xml b/msa/vc-executor/pom.xml index c487ddc721..0635e69bd5 100644 --- a/msa/vc-executor/pom.xml +++ b/msa/vc-executor/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC msa org.thingsboard.msa diff --git a/msa/web-ui/pom.xml b/msa/web-ui/pom.xml index 36e53ed52c..1eb47413d7 100644 --- a/msa/web-ui/pom.xml +++ b/msa/web-ui/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC msa org.thingsboard.msa diff --git a/netty-mqtt/pom.xml b/netty-mqtt/pom.xml index 99261b714d..01bc357127 100644 --- a/netty-mqtt/pom.xml +++ b/netty-mqtt/pom.xml @@ -19,11 +19,11 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC thingsboard netty-mqtt - 4.2.1.2-SNAPSHOT + 4.3.0-RC jar Netty MQTT Client diff --git a/pom.xml b/pom.xml index 9edccba7f7..99108196aa 100755 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC pom Thingsboard diff --git a/rest-client/pom.xml b/rest-client/pom.xml index 3ee5321627..fd5783227b 100644 --- a/rest-client/pom.xml +++ b/rest-client/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC thingsboard rest-client diff --git a/rule-engine/pom.xml b/rule-engine/pom.xml index d89c238559..dce202bc94 100644 --- a/rule-engine/pom.xml +++ b/rule-engine/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC thingsboard rule-engine diff --git a/rule-engine/rule-engine-api/pom.xml b/rule-engine/rule-engine-api/pom.xml index 5f48404b91..ef6904b24c 100644 --- a/rule-engine/rule-engine-api/pom.xml +++ b/rule-engine/rule-engine-api/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC rule-engine org.thingsboard.rule-engine diff --git a/rule-engine/rule-engine-components/pom.xml b/rule-engine/rule-engine-components/pom.xml index e307d9a57d..78e6b5e684 100644 --- a/rule-engine/rule-engine-components/pom.xml +++ b/rule-engine/rule-engine-components/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC rule-engine org.thingsboard.rule-engine diff --git a/tools/pom.xml b/tools/pom.xml index bd16603596..d76b19ba2d 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC thingsboard tools diff --git a/transport/coap/pom.xml b/transport/coap/pom.xml index 681c75b102..4a30c5d2bb 100644 --- a/transport/coap/pom.xml +++ b/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.transport diff --git a/transport/http/pom.xml b/transport/http/pom.xml index b338a4b4ea..bc1c7a845d 100644 --- a/transport/http/pom.xml +++ b/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.transport diff --git a/transport/lwm2m/pom.xml b/transport/lwm2m/pom.xml index 4d5d621a08..8871a2b2b3 100644 --- a/transport/lwm2m/pom.xml +++ b/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.transport diff --git a/transport/mqtt/pom.xml b/transport/mqtt/pom.xml index 336265ff00..2fe1cb91b2 100644 --- a/transport/mqtt/pom.xml +++ b/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport org.thingsboard.transport diff --git a/transport/pom.xml b/transport/pom.xml index a4b9c9c630..ad394b46f9 100644 --- a/transport/pom.xml +++ b/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC thingsboard transport diff --git a/transport/snmp/pom.xml b/transport/snmp/pom.xml index a361d85838..528538bd03 100644 --- a/transport/snmp/pom.xml +++ b/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC transport diff --git a/ui-ngx/pom.xml b/ui-ngx/pom.xml index 54b8adc93a..f83c914409 100644 --- a/ui-ngx/pom.xml +++ b/ui-ngx/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.2.1.2-SNAPSHOT + 4.3.0-RC thingsboard org.thingsboard From b72f6a8fd18aef8f008fe1bccac6311747b75d99 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Thu, 25 Dec 2025 12:41:32 +0200 Subject: [PATCH 092/579] Set default base image to thingsboard/openjdk25:trixie-slim --- msa/pom.xml | 2 +- msa/tb-node/docker/Dockerfile | 15 +++++++++++++++ msa/tb/docker-cassandra/Dockerfile | 17 ++++++++++++++++- msa/tb/docker-postgres/Dockerfile | 17 ++++++++++++++++- 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/msa/pom.xml b/msa/pom.xml index 8b19c757b1..871026cc16 100644 --- a/msa/pom.xml +++ b/msa/pom.xml @@ -32,7 +32,7 @@ ${basedir}/.. thingsboard - thingsboard/openjdk17:bookworm-slim + thingsboard/openjdk25:trixie-slim true true 1.4.13 diff --git a/msa/tb-node/docker/Dockerfile b/msa/tb-node/docker/Dockerfile index c084c9c15b..a588142152 100644 --- a/msa/tb-node/docker/Dockerfile +++ b/msa/tb-node/docker/Dockerfile @@ -16,6 +16,21 @@ FROM ${docker.base.image} +# For SVG renderer Debian Trixie slim fonts should be installed explicitly +RUN echo "Previously installed font libraries:" \ + && (dpkg -l | grep -E 'font|dejavu|harfbuzz' || echo " (none)") \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + libharfbuzz0b fontconfig fonts-dejavu-core \ + && rm -rf /var/lib/apt/lists/* \ + && echo "Current fonts libraries:" \ + && (dpkg -l | grep -E 'font|dejavu|harfbuzz') \ + && echo "Font config list:" \ + && fc-list && test -n "$(fc-list)" \ + && (fc-list | grep -i dejavu) \ + && echo "Harfbuzz library test with ldconfig:" \ + && (ldconfig -p | grep harfbuzz) + COPY logback.xml start-tb-node.sh ${pkg.name}.deb /tmp/ RUN chmod a+x /tmp/*.sh \ diff --git a/msa/tb/docker-cassandra/Dockerfile b/msa/tb/docker-cassandra/Dockerfile index 20a0d8cf7a..d530f54152 100644 --- a/msa/tb/docker-cassandra/Dockerfile +++ b/msa/tb/docker-cassandra/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM thingsboard/openjdk17:bookworm-slim +FROM ${docker.base.image} ENV PG_MAJOR=16 @@ -40,6 +40,21 @@ ENV PATH=$PATH:/usr/lib/postgresql/$PG_MAJOR/bin ENV PGLOG=/var/log/postgres ENV CASSANDRA_LOG=/var/log/cassandra +# For SVG renderer Debian Trixie slim fonts should be installed explicitly +RUN echo "Previously installed font libraries:" \ + && (dpkg -l | grep -E 'font|dejavu|harfbuzz' || echo " (none)") \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + libharfbuzz0b fontconfig fonts-dejavu-core \ + && rm -rf /var/lib/apt/lists/* \ + && echo "Current fonts libraries:" \ + && (dpkg -l | grep -E 'font|dejavu|harfbuzz') \ + && echo "Font config list:" \ + && fc-list && test -n "$(fc-list)" \ + && (fc-list | grep -i dejavu) \ + && echo "Harfbuzz library test with ldconfig:" \ + && (ldconfig -p | grep harfbuzz) + COPY logback.xml ${pkg.name}.conf start-db.sh stop-db.sh start-tb.sh upgrade-tb.sh install-tb.sh ${pkg.name}.deb /tmp/ RUN apt-get update \ diff --git a/msa/tb/docker-postgres/Dockerfile b/msa/tb/docker-postgres/Dockerfile index 7c66d626c7..0e16900a14 100644 --- a/msa/tb/docker-postgres/Dockerfile +++ b/msa/tb/docker-postgres/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM thingsboard/openjdk17:bookworm-slim +FROM ${docker.base.image} ENV PG_MAJOR 12 @@ -32,6 +32,21 @@ ENV SPRING_DATASOURCE_USERNAME=${pkg.user} ENV PGLOG=/var/log/postgres +# For SVG renderer Debian Trixie slim fonts should be installed explicitly +RUN echo "Previously installed font libraries:" \ + && (dpkg -l | grep -E 'font|dejavu|harfbuzz' || echo " (none)") \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + libharfbuzz0b fontconfig fonts-dejavu-core \ + && rm -rf /var/lib/apt/lists/* \ + && echo "Current fonts libraries:" \ + && (dpkg -l | grep -E 'font|dejavu|harfbuzz') \ + && echo "Font config list:" \ + && fc-list && test -n "$(fc-list)" \ + && (fc-list | grep -i dejavu) \ + && echo "Harfbuzz library test with ldconfig:" \ + && (ldconfig -p | grep harfbuzz) + COPY logback.xml ${pkg.name}.conf start-db.sh stop-db.sh start-tb.sh upgrade-tb.sh install-tb.sh ${pkg.name}.deb /tmp/ RUN apt-get update \ From 86626834b01fd0851f89c794515fc7e3b10479c5 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Thu, 25 Dec 2025 14:50:47 +0200 Subject: [PATCH 093/579] Fix occasional alarm rule test failure due to race condition --- .../cf/ctx/state/alarm/AlarmCalculatedFieldState.java | 3 ++- .../server/service/cf/ctx/state/alarm/AlarmRuleState.java | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java index 4f2cbede09..8c258d0b00 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java @@ -150,7 +150,8 @@ public class AlarmCalculatedFieldState extends BaseCalculatedFieldState { clearRuleState = null; } } - log.debug("Initialized create rule states {} and clear rule state {} for {}", createRuleStates, clearRuleState, configuration); + log.debug("Initialized create rule states {} and clear rule state {} for {}. Restored: {}, reeval needed: {}", + createRuleStates, clearRuleState, configuration, restored, reevalNeeded); if (reevalNeeded.get()) { initCurrentAlarm(ctx); diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmRuleState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmRuleState.java index 569bbe9310..cf7b1ce108 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmRuleState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmRuleState.java @@ -262,6 +262,14 @@ public class AlarmRuleState { } } + public void setDurationCheckFuture(ScheduledFuture durationCheckFuture) { + if (this.durationCheckFuture != null) { + log.warn("Setting new duration check future while previous is not null for state {}", this, new RuntimeException("stacktrace")); + this.durationCheckFuture.cancel(true); + } + this.durationCheckFuture = durationCheckFuture; + } + public boolean isEmpty() { return eventCount == 0L && firstEventTs == 0L && lastCheckTs == 0L && durationCheckFuture == null; } From e083aaa4c3691c85c938470eaea7c3910c9bc83a Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Fri, 26 Dec 2025 11:34:43 +0200 Subject: [PATCH 094/579] UI: Fixed calculated fields panel dirty state --- .../calculated-fields/calculated-field.component.ts | 3 +-- .../calculated-field-arguments-table.component.ts | 5 +++-- ...alculated-field-geofencing-zone-groups-table.component.ts | 4 ++-- .../metrics/calculated-field-metrics-table.component.ts | 4 ++-- .../components/output/calculated-field-output.component.ts | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts index 01d7a8de7a..01cc53609d 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts @@ -116,10 +116,9 @@ export class CalculatedFieldComponent extends EntityComponent { this.entityForm.patchValue({ configuration: preparedConfig, debugSettings, entityId, ...value }, {emitEvent: false}); - this.entityForm.get('type').updateValueAndValidity({onlySelf: true}); }); } diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts index 9a8395a557..89c87c8e27 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts @@ -239,7 +239,7 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces } writeValue(argumentsObj: Record): void { - this.argumentsFormArray.clear(); + this.argumentsFormArray.clear({emitEvent: false}); this.populateArgumentsFormArray(argumentsObj); this.updateEntityNameMap(this.argumentsFormArray.value); } @@ -264,7 +264,8 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces }; this.argumentsFormArray.push(this.fb.control(value), { emitEvent: false }); }); - this.argumentsFormArray.updateValueAndValidity(); + this.updateDataSource(this.argumentsFormArray.value); + // this.argumentsFormArray.updateValueAndValidity({emitEvent: false}); } private updateEntityNameMap(values: CalculatedFieldArgumentValue[]): void { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.ts index 228d08fd90..e102033f18 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.ts @@ -214,7 +214,7 @@ export class CalculatedFieldGeofencingZoneGroupsTableComponent implements Contro } writeValue(zonesObj: Record): void { - this.zoneGroupsFormArray.clear(); + this.zoneGroupsFormArray.clear({emitEvent: false}); this.populateZonesFormArray(zonesObj); this.updateEntityNameMap(this.zoneGroupsFormArray.value); } @@ -231,7 +231,7 @@ export class CalculatedFieldGeofencingZoneGroupsTableComponent implements Contro }; this.zoneGroupsFormArray.push(this.fb.control(value), { emitEvent: false }); }); - this.zoneGroupsFormArray.updateValueAndValidity(); + this.updateDataSource(this.zoneGroupsFormArray.value); } private updateEntityNameMap(values: CalculatedFieldGeofencingValue[]): void { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.ts index 21b21d07ac..531f8d1014 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.ts @@ -218,7 +218,7 @@ export class CalculatedFieldMetricsTableComponent implements OnInit, ControlValu } writeValue(metrics: Record): void { - this.metricsFormArray.clear(); + this.metricsFormArray.clear({emitEvent: false}); this.populateZonesFormArray(metrics); } @@ -230,7 +230,7 @@ export class CalculatedFieldMetricsTableComponent implements OnInit, ControlValu }; this.metricsFormArray.push(this.fb.control(value), { emitEvent: false }); }); - this.metricsFormArray.updateValueAndValidity(); + this.updateDataSource(this.metricsFormArray.value); } private getSortValue(metric: CalculatedFieldAggMetricValue, column: string): string { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts index 00fea861f6..63e3faf131 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts @@ -253,7 +253,7 @@ export class CalculatedFieldOutputComponent implements ControlValueAccessor, Val private updateTimeSeriesTtl(value: boolean) { if (value) { - this.outputForm.get('strategy.useCustomTtl').enable({emitEvent: true}); + this.outputForm.get('strategy.useCustomTtl').enable({emitEvent: false}); } else { this.outputForm.get('strategy.useCustomTtl').disable({emitEvent: false}); this.outputForm.get('strategy.ttl').disable({emitEvent: false}); From 3c5df439ccbbe228ef74c85f1c9984cd323c01ed Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Fri, 26 Dec 2025 12:42:23 +0200 Subject: [PATCH 095/579] UI: Fixed minor problem in calculated fields panel --- .../calculated-fields-table-config.ts | 23 ++++++++++++++++--- ...culated-field-arguments-table.component.ts | 3 +-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts index 5841d9e511..e5e4063c21 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts @@ -35,7 +35,7 @@ import { DestroyRef, Renderer2 } from '@angular/core'; import { EntityDebugSettings } from '@shared/models/entity.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; -import { catchError, filter, switchMap, tap } from 'rxjs/operators'; +import { catchError, filter, first, switchMap, tap } from 'rxjs/operators'; import { ArgumentEntityType, ArgumentType, @@ -175,7 +175,8 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig true, - onAction: ($event, entity) => this.openDebugEventsDialog($event, entity), + onAction: ($event, entity) => + this.pageMode ? this.openDebugTab($event, entity) : this.openDebugEventsDialog($event, entity), }, { name: '', @@ -202,7 +203,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig 1) { + table.entityDetailsPanel.matTabGroup.selectedIndex = 1; + } else { + table.entityDetailsPanel.matTabGroup._tabs.changes.pipe( + first() + ).subscribe(() => { + table.entityDetailsPanel.matTabGroup.selectedIndex = 1; + }) + } + } + } + private editCalculatedField($event: Event, calculatedField: CalculatedFieldsTableEntity, isDirty = false): void { $event?.stopPropagation(); this.getCalculatedFieldDialog(calculatedField, 'action.apply', isDirty) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts index 89c87c8e27..983609dfa7 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts @@ -249,7 +249,7 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces } protected changeIsScriptMode(): void { - this.argumentsFormArray.updateValueAndValidity(); + this.argumentsFormArray.updateValueAndValidity({emitEvent: !this.disable}); } protected isEditButtonShowBadge(argument: CalculatedFieldArgumentValue): boolean { @@ -265,7 +265,6 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces this.argumentsFormArray.push(this.fb.control(value), { emitEvent: false }); }); this.updateDataSource(this.argumentsFormArray.value); - // this.argumentsFormArray.updateValueAndValidity({emitEvent: false}); } private updateEntityNameMap(values: CalculatedFieldArgumentValue[]): void { From 96f2c340588d959f84b8b762e431fbcf37dcbfc4 Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Thu, 25 Dec 2025 13:04:34 +0200 Subject: [PATCH 096/579] UI: Alarm rule details page --- .../alarm-rules/alarm-rule.module.ts | 5 +- .../alarm-rules/alarm-rules-table-config.ts | 59 ++++-- .../alarm-rules-table.component.ts | 4 +- .../alarm-rules/alarm-rules.component.html | 157 ++++++++++++++ .../alarm-rules/alarm-rules.component.ts | 199 ++++++++++++++++++ .../home/pages/alarm/alarm-routing.module.ts | 87 +++++++- .../alarm/alarm-rules-tabs.component.html | 30 +++ .../pages/alarm/alarm-rules-tabs.component.ts | 49 +++++ .../modules/home/pages/alarm/alarm.module.ts | 5 +- .../assets/locale/locale.constant-en_US.json | 1 + 10 files changed, 572 insertions(+), 24 deletions(-) create mode 100644 ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.html create mode 100644 ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts create mode 100644 ui-ngx/src/app/modules/home/pages/alarm/alarm-rules-tabs.component.html create mode 100644 ui-ngx/src/app/modules/home/pages/alarm/alarm-rules-tabs.component.ts diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule.module.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule.module.ts index 52d91188bc..f7adf5dab0 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule.module.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule.module.ts @@ -53,6 +53,7 @@ import { AlarmRuleTableHeaderComponent } from "@home/components/alarm-rules/alar import { AlarmRuleFilterPredicateNoDataValueComponent } from "@home/components/alarm-rules/filter/alarm-rule-filter-predicate-no-data-value.component"; +import { AlarmRulesComponent } from '@home/components/alarm-rules/alarm-rules.component'; @NgModule({ declarations: [ @@ -73,7 +74,8 @@ import { AlarmRuleDetailsDialogComponent, AlarmRuleFilterConfigComponent, AlarmRuleTableHeaderComponent, - AlarmRuleFilterPredicateNoDataValueComponent + AlarmRuleFilterPredicateNoDataValueComponent, + AlarmRulesComponent ], imports: [ CommonModule, @@ -83,6 +85,7 @@ import { ], exports: [ AlarmRuleDialogComponent, + AlarmRulesComponent ] }) export class AlarmRuleModule { } diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts index b4082fb75c..b0ac04aacb 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts @@ -21,7 +21,7 @@ import { EntityTableColumn, EntityTableConfig } from '@home/models/entity/entities-table-config.models'; -import { EntityType, entityTypeTranslations } from '@shared/models/entity-type.models'; +import { EntityType, entityTypeResources, entityTypeTranslations } from '@shared/models/entity-type.models'; import { TranslateService } from '@ngx-translate/core'; import { Direction } from '@shared/models/page/sort-order'; import { MatDialog } from '@angular/material/dialog'; @@ -67,6 +67,10 @@ import { CalculatedFieldScriptTestDialogComponent, CalculatedFieldTestScriptDialogData } from "@home/components/calculated-fields/components/test-dialog/calculated-field-script-test-dialog.component"; +import { AlarmRulesTabsComponent } from '@home/pages/alarm/alarm-rules-tabs.component'; +import { Router } from '@angular/router'; +import { EntityAction } from '@home/models/entity/entity-component.models'; +import { AlarmRulesComponent } from '@home/components/alarm-rules/alarm-rules.component'; type AlarmRuleTableEntity = CalculatedField | CalculatedFieldInfo; @@ -93,27 +97,26 @@ export class AlarmRulesTableConfig extends EntityTableConfig { - this.editCalculatedField($event, model); - return true; - }; } this.tableTitle = this.pageMode ? '' : this.translate.instant('alarm-rule.alarm-rules'); - this.detailsPanelEnabled = false; + this.detailsPanelEnabled = this.pageMode; + this.entityResources = entityTypeResources.get(EntityType.CALCULATED_FIELD); this.entityType = EntityType.CALCULATED_FIELD; this.entityTranslations = { type: 'alarm-rule.alarm-rule', typePlural: 'alarm-rule.alarm-rules', list: 'alarm-rule.list', add: 'action.add', + details: 'alarm-rule.details', noEntities: 'alarm-rule.no-found', search: 'action.search', selectedEntities: 'alarm-rule.selected-fields' @@ -121,11 +124,17 @@ export class AlarmRulesTableConfig extends EntityTableConfig this.fetchCalculatedFields(pageLink); this.addEntity = this.getCalculatedAlarmDialog.bind(this); + this.loadEntity = id => this.calculatedFieldsService.getCalculatedFieldById(id.id); + this.saveEntity = (alarmRule) => this.calculatedFieldsService.saveCalculatedField(alarmRule); + this.deleteEntityTitle = (field) => this.translate.instant('alarm-rule.delete-title', {title: field.name}); this.deleteEntityContent = () => this.translate.instant('alarm-rule.delete-text'); this.deleteEntitiesTitle = count => this.translate.instant('alarm-rule.delete-multiple-title', {count}); this.deleteEntitiesContent = () => this.translate.instant('alarm-rule.delete-multiple-text'); this.deleteEntity = id => this.calculatedFieldsService.deleteCalculatedField(id.id); + + this.onEntityAction = action => this.onCFAction(action); + this.addActionDescriptors = [ { name: this.translate.instant('alarm-rule.create'), @@ -186,14 +195,18 @@ export class AlarmRulesTableConfig extends EntityTableConfig true, iconFunction: ({ debugSettings }) => this.entityDebugSettingsService.isDebugActive(debugSettings?.allEnabledUntil) || debugSettings?.failuresEnabled ? 'mdi:bug' : 'mdi:bug-outline', onAction: ($event, entity) => this.onOpenDebugConfig($event, entity), - }, - { - name: this.translate.instant('action.edit'), - icon: 'edit', - isEnabled: () => true, - onAction: ($event, entity) => this.editCalculatedField($event, entity), } ); + if (!this.pageMode) { + this.cellActionDescriptors.push( + { + name: this.translate.instant('action.edit'), + icon: 'edit', + isEnabled: () => true, + onAction: ($event, entity) => this.editCalculatedField($event, entity), + } + ) + } } fetchCalculatedFields(pageLink: PageLink): Observable> { @@ -384,4 +397,22 @@ export class AlarmRulesTableConfig extends EntityTableConfig): boolean { + switch (action.action) { + case 'open': + this.openCalculatedField(action.event, action.entity); + return true; + case 'export': + this.exportAlarmRule(action.event, action.entity); + return true; + } + return false; + } } diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table.component.ts index 7f4c0b4ee7..aaddf94aac 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table.component.ts @@ -36,7 +36,7 @@ import { EntityDebugSettingsService } from '@home/components/entity/debug/entity import { DatePipe } from '@angular/common'; import { AlarmRulesTableConfig } from "@home/components/alarm-rules/alarm-rules-table-config"; import { UtilsService } from "@core/services/utils.service"; -import { ActivatedRoute } from "@angular/router"; +import { ActivatedRoute, Router } from "@angular/router"; @Component({ selector: 'tb-alarm-rules-table', @@ -70,6 +70,7 @@ export class AlarmRulesTableComponent { private utilsService: UtilsService, private destroyRef: DestroyRef, private route: ActivatedRoute, + private router: Router ) { this.pageMode = !!this.route.snapshot.data.isPage; effect(() => { @@ -88,6 +89,7 @@ export class AlarmRulesTableComponent { this.importExportService, this.entityDebugSettingsService, this.utilsService, + this.router, this.pageMode, ); this.cd.markForCheck(); diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.html new file mode 100644 index 0000000000..e304a78732 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.html @@ -0,0 +1,157 @@ + +
+ + + +
+
+
+
+
{{ 'common.general' | translate }}
+
+ + {{ 'entity-field.title' | translate }} + + @if (entityForm.get('name').errors && entityForm.get('name').touched) { + + @if (entityForm.get('name').hasError('required')) { + {{ 'common.hint.title-required' | translate }} + } @else if (entityForm.get('name').hasError('pattern')) { + {{ 'common.hint.title-pattern' | translate }} + } @else if (entityForm.get('name').hasError('maxlength')) { + {{ 'common.hint.title-max-length' | translate }} + } + + } + + + +
+ + +
+ +
+
{{ 'calculated-fields.arguments' | translate }}
+ +
+
+
{{ 'alarm-rule.create-conditions' | translate }}
+
+ + +
+
+
+
{{ 'alarm-rule.clear-condition' | translate }}
+
+
+ + +
+ +
+
+ alarm-rule.no-clear-alarm-rule +
+
+ +
+
+
+ + + {{ 'alarm-rule.advanced-settings' | translate }} + + +
+
+ + {{ 'alarm-rule.propagate-alarm' | translate }} + +
+ @if (configFormGroup.get('propagate').value) { + + + } +
+
+ + {{ 'alarm-rule.propagate-alarm-to-owner' | translate }} + +
+
+ + {{ 'alarm-rule.propagate-alarm-to-tenant' | translate }} + +
+
+
+
+
+
+
diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts new file mode 100644 index 0000000000..200cf09741 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts @@ -0,0 +1,199 @@ +/// +/// Copyright © 2016-2025 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 { ChangeDetectorRef, Component, DestroyRef, Inject, Input } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { EntityComponent } from '../../components/entity/entity.component'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { EntityType } from '@shared/models/entity-type.models'; +import { TranslateService } from '@ngx-translate/core'; +import { + CalculatedFieldArgument, + CalculatedFieldConfiguration, + CalculatedFieldInfo, + calculatedFieldsEntityTypeList, + CalculatedFieldType +} from '@shared/models/calculated-field.models'; +import { oneSpaceInsideRegex } from '@shared/models/regex.constants'; +import { EntityId } from '@shared/models/id/entity-id'; +import { switchMap } from 'rxjs/operators'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { BaseData } from '@shared/models/base-data'; +import { Observable } from 'rxjs'; +import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; +import { getCurrentAuthUser } from '@core/auth/auth.selectors'; +import { + CalculatedFieldsTableConfig, + CalculatedFieldsTableEntity +} from '@home/components/calculated-fields/calculated-fields-table-config'; +import { TenantId } from '@shared/models/id/tenant-id'; +import { StringItemsOption } from '@shared/components/string-items-list.component'; +import { RelationTypes } from '@shared/models/relation.models'; +import { AlarmRule, AlarmRuleConditionType, AlarmRuleExpressionType } from '@shared/models/alarm-rule.models'; + +@Component({ + selector: 'tb-alarm-rules', + templateUrl: './alarm-rules.component.html', + styleUrls: [] +}) +export class AlarmRulesComponent extends EntityComponent { + + @Input() + standalone = false; + + @Input() + entityName: string; + + readonly tenantId = getCurrentAuthUser(this.store).tenantId; + readonly ownerId = new TenantId(getCurrentAuthUser(this.store).tenantId); + readonly EntityType = EntityType; + readonly calculatedFieldsEntityTypeList = calculatedFieldsEntityTypeList; + readonly CalculatedFieldType = CalculatedFieldType; + + constructor(protected store: Store, + protected translate: TranslateService, + @Inject('entity') protected entityValue: CalculatedFieldInfo, + @Inject('entitiesTableConfig') protected entitiesTableConfigValue: CalculatedFieldsTableConfig, + protected fb: FormBuilder, + protected cd: ChangeDetectorRef, + private destroyRef: DestroyRef, + private calculatedFieldsService: CalculatedFieldsService) { + super(store, fb, entityValue, entitiesTableConfigValue, cd); + } + + hideDelete() { + if (this.entitiesTableConfig) { + return !this.entitiesTableConfig.deleteEnabled(this.entity); + } else { + return false; + } + } + + additionalDebugActionConfig = { + ...this.entitiesTableConfig.additionalDebugActionConfig, + action: () => this.entitiesTableConfig.additionalDebugActionConfig.action( + { id: this.entity.id, ...this.entityFormValue() }, false, + (expression) => { + if (expression) { + this.entityForm.get('configuration').setValue({...this.entityFormValue().configuration, expression}); + this.entityForm.get('configuration').markAsDirty(); + } + }), + }; + + get entityId(): EntityId { + return this.entityForm.get('entityId').value; + } + + get entitiesTableConfig(): CalculatedFieldsTableConfig { + return this.entitiesTableConfigValue; + } + + changeEntity(entity: BaseData): void { + this.entityName = entity?.name; + } + + buildForm(entity?: CalculatedFieldInfo): FormGroup { + const form = this.fb.group({ + name: ['', [Validators.required, Validators.pattern(oneSpaceInsideRegex), Validators.maxLength(255)]], + entityId: [null], + type: [CalculatedFieldType.ALARM], + debugSettings: [], + configuration: this.fb.group({ + type: [CalculatedFieldType.ALARM], + arguments: this.fb.control({}, Validators.required), + propagate: [false], + propagateToOwner: [false], + propagateToTenant: [false], + propagateRelationTypes: [null], + createRules: [null, Validators.required], + clearRule: [null], + }), + }); + return form; + } + + updateForm(entity: CalculatedFieldInfo) { + const { configuration = {} as CalculatedFieldConfiguration, type = CalculatedFieldType.ALARM, debugSettings = { failuresEnabled: true, allEnabled: true }, entityId = this.entityId, ...value } = entity ?? {}; + setTimeout(() => { + this.entityForm.patchValue({ configuration, debugSettings, entityId, ...value }, {emitEvent: false}); + }); + if (!entityId) { + this.entityForm.get('configuration').disable({emitEvent: false}); + } + } + + onTestScript(expression?: string): Observable { + const calculatedFieldId = this.entity?.id?.id; + if (calculatedFieldId) { + return this.calculatedFieldsService.getLatestCalculatedFieldDebugEvent(calculatedFieldId, {ignoreLoading: true}) + .pipe( + switchMap(event => { + const args = event?.arguments ? JSON.parse(event.arguments) : null; + return this.entitiesTableConfig.getTestScriptDialog(this.entityFormValue(), args, false, expression); + }), + takeUntilDestroyed(this.destroyRef) + ) + } + + return this.entitiesTableConfig.getTestScriptDialog(this.entityFormValue(), null, false, expression); + } + + updateFormState() { + if (this.entityForm) { + if (this.isEditValue) { + this.entityForm.enable({emitEvent: false}); + this.entityForm.get('entityId').disable({emitEvent: false}); + } else { + this.entityForm.disable({emitEvent: false}); + } + } + } + + get arguments(): Record { + return this.entityForm.get('configuration.arguments').value; + } + + get predefinedTypeValues(): StringItemsOption[] { + return RelationTypes.map(type => ({ + name: type, + value: type + })); + } + + get configFormGroup(): FormGroup { + return this.entityForm.get('configuration') as FormGroup; + } + + public removeClearAlarmRule() { + this.configFormGroup.patchValue({clearRule: null}); + this.entityForm.markAsDirty(); + } + + public addClearAlarmRule() { + const clearAlarmRule: AlarmRule = { + condition: { + type: AlarmRuleConditionType.SIMPLE, + expression: { + type: AlarmRuleExpressionType.SIMPLE + } + } + }; + this.configFormGroup.patchValue({clearRule: clearAlarmRule}); + } + +} diff --git a/ui-ngx/src/app/modules/home/pages/alarm/alarm-routing.module.ts b/ui-ngx/src/app/modules/home/pages/alarm/alarm-routing.module.ts index 1154fc83b6..00585ffb54 100644 --- a/ui-ngx/src/app/modules/home/pages/alarm/alarm-routing.module.ts +++ b/ui-ngx/src/app/modules/home/pages/alarm/alarm-routing.module.ts @@ -14,14 +14,64 @@ /// limitations under the License. /// -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { DestroyRef, inject, NgModule } from '@angular/core'; +import { ActivatedRouteSnapshot, ResolveFn, Router, RouterModule, RouterStateSnapshot, Routes } from '@angular/router'; import { Authority } from '@shared/models/authority.enum'; import { AlarmTableComponent } from '@home/components/alarm/alarm-table.component'; import { AlarmsMode } from '@shared/models/alarm.models'; import { MenuId } from '@core/services/menu.models'; import { RouterTabsComponent } from "@home/components/router-tabs.component"; import { AlarmRulesTableComponent } from "@home/components/alarm-rules/alarm-rules-table.component"; +import { CalculatedFieldsTableComponent } from '@home/components/calculated-fields/calculated-fields-table.component'; +import { EntityDetailsPageComponent } from '@home/components/entity/entity-details-page.component'; +import { ConfirmOnExitGuard } from '@core/guards/confirm-on-exit.guard'; +import { entityDetailsPageBreadcrumbLabelFunction } from '@home/pages/home-pages.models'; +import { BreadCrumbConfig } from '@shared/components/breadcrumb'; +import { CalculatedFieldsTableConfigResolver } from '@home/pages/calculated-fields/calculated-fields-routing.module'; +import { CalculatedFieldsTableConfig } from '@home/components/calculated-fields/calculated-fields-table-config'; +import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; +import { TranslateService } from '@ngx-translate/core'; +import { MatDialog } from '@angular/material/dialog'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { DatePipe } from '@angular/common'; +import { ImportExportService } from '@shared/import-export/import-export.service'; +import { EntityDebugSettingsService } from '@home/components/entity/debug/entity-debug-settings.service'; +import { UtilsService } from '@core/services/utils.service'; +import { AlarmRulesTableConfig } from '@home/components/alarm-rules/alarm-rules-table-config'; + +export const AlarmRulesTableConfigResolver: ResolveFn = + (_route: ActivatedRouteSnapshot, + _state: RouterStateSnapshot, + calculatedFieldsService = inject(CalculatedFieldsService), + translate = inject(TranslateService), + dialog = inject(MatDialog), + store = inject(Store), + datePipe = inject(DatePipe), + destroyRef = inject(DestroyRef), + importExportService = inject(ImportExportService), + entityDebugSettingsService = inject(EntityDebugSettingsService), + utilsService = inject(UtilsService), + router = inject(Router), + ) => { + return new AlarmRulesTableConfig( + calculatedFieldsService, + translate, + dialog, + datePipe, + null, + store, + destroyRef, + null, + null, + null, + importExportService, + entityDebugSettingsService, + utilsService, + router, + true, + ); + }; const routes: Routes = [ { @@ -57,15 +107,38 @@ const routes: Routes = [ }, { path: 'alarm-rules', - component: AlarmRulesTableComponent, data: { - auth: [Authority.TENANT_ADMIN], - title: 'alarm-rule.alarm-rules', breadcrumb: { menuId: MenuId.alarm_rules }, - isPage: true, - } + }, + children: [ + { + path: '', + component: AlarmRulesTableComponent, + data: { + auth: [Authority.TENANT_ADMIN], + title: 'alarm-rule.alarm-rules', + isPage: true, + } + }, + { + path: ':entityId', + component: EntityDetailsPageComponent, + canDeactivate: [ConfirmOnExitGuard], + data: { + breadcrumb: { + labelFunction: entityDetailsPageBreadcrumbLabelFunction, + icon: 'tune' + } as BreadCrumbConfig, + auth: [Authority.TENANT_ADMIN], + title: 'entity.type-calculated-fields', + }, + resolve: { + entitiesTableConfig: AlarmRulesTableConfigResolver + } + } + ] } ] } diff --git a/ui-ngx/src/app/modules/home/pages/alarm/alarm-rules-tabs.component.html b/ui-ngx/src/app/modules/home/pages/alarm/alarm-rules-tabs.component.html new file mode 100644 index 0000000000..7cabcbf5b8 --- /dev/null +++ b/ui-ngx/src/app/modules/home/pages/alarm/alarm-rules-tabs.component.html @@ -0,0 +1,30 @@ + +@if (entity) { + + + +} diff --git a/ui-ngx/src/app/modules/home/pages/alarm/alarm-rules-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/alarm/alarm-rules-tabs.component.ts new file mode 100644 index 0000000000..c239cfbd4d --- /dev/null +++ b/ui-ngx/src/app/modules/home/pages/alarm/alarm-rules-tabs.component.ts @@ -0,0 +1,49 @@ +/// +/// Copyright © 2016-2025 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 { Component } from '@angular/core'; +import { EntityTabsComponent } from '../../components/entity/entity-tabs.component'; +import { CalculatedFieldEventBody, DebugEventType, EventType } from '@shared/models/event.models'; +import type { + CalculatedFieldsTableConfig, + CalculatedFieldsTableEntity +} from '@home/components/calculated-fields/calculated-fields-table-config'; +import { debugCfActionEnabled } from '@shared/models/calculated-field.models'; + +@Component({ + selector: 'tb-alarm-rules-tabs', + templateUrl: './alarm-rules-tabs.component.html', + styleUrls: [] +}) +export class AlarmRulesTabsComponent extends EntityTabsComponent { + + readonly DebugEventType = DebugEventType; + readonly EventType = EventType; + + constructor() { + super(); + } + + get debugActionDisabled(): boolean { + return !debugCfActionEnabled(this.entity); + }; + + onDebugEventSelected(event: CalculatedFieldEventBody) { + (this.entitiesTableConfig as CalculatedFieldsTableConfig).getTestScriptDialog(this.entity, JSON.parse(event.arguments)) + .subscribe((expression) => { + }); + }; +} diff --git a/ui-ngx/src/app/modules/home/pages/alarm/alarm.module.ts b/ui-ngx/src/app/modules/home/pages/alarm/alarm.module.ts index 312259b217..500c6bf47b 100644 --- a/ui-ngx/src/app/modules/home/pages/alarm/alarm.module.ts +++ b/ui-ngx/src/app/modules/home/pages/alarm/alarm.module.ts @@ -20,9 +20,12 @@ import { SharedModule } from '@shared/shared.module'; import { HomeDialogsModule } from '../../dialogs/home-dialogs.module'; import { HomeComponentsModule } from '@modules/home/components/home-components.module'; import { AlarmRoutingModule } from '@home/pages/alarm/alarm-routing.module'; +import { AlarmRulesTabsComponent } from '@home/pages/alarm/alarm-rules-tabs.component'; @NgModule({ - declarations: [], + declarations: [ + AlarmRulesTabsComponent + ], imports: [ CommonModule, SharedModule, 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 8c2ecc2890..38f72b3206 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -1394,6 +1394,7 @@ "create": "Create new alarm rule", "add": "Add alarm rule", "copy": "Copy alarm rule configuration", + "details": "Alarm rule details", "no-found": "No alarm rules found", "list": "{ count, plural, =1 {One alarm rule} other {List of # alarm rules} }", "selected-fields": "{ count, plural, =1 {1 alarm rule} other {# alarm rules} } selected", From 0a58ff5e771fa1cea99dec9ddbf8ce9178ed8359 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Fri, 26 Dec 2025 14:17:19 +0200 Subject: [PATCH 097/579] UI: Improved alarm rules detail panel/page --- .../calculated-field-form.service.ts | 22 ++++++- .../alarm-rule-dialog.component.html | 33 +++------- .../alarm-rule-dialog.component.ts | 63 +++++-------------- .../alarm-rules/alarm-rules-table-config.ts | 23 ++++++- .../alarm-rules/alarm-rules.component.html | 1 + .../alarm-rules/alarm-rules.component.ts | 60 ++++++------------ .../cf-alarm-rule-condition.component.html | 4 +- .../cf-alarm-rule-condition.component.ts | 16 +++-- .../create-cf-alarm-rules.component.ts | 6 +- .../calculated-field.component.html | 11 +--- .../calculated-field.component.ts | 4 +- .../calculated-field-dialog.component.html | 1 + .../calculated-field-dialog.component.ts | 2 +- .../app/shared/models/alarm-rule.models.ts | 8 ++- 14 files changed, 109 insertions(+), 145 deletions(-) rename ui-ngx/src/app/{modules/home/components/calculated-fields => core/services}/calculated-field-form.service.ts (84%) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field-form.service.ts b/ui-ngx/src/app/core/services/calculated-field-form.service.ts similarity index 84% rename from ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field-form.service.ts rename to ui-ngx/src/app/core/services/calculated-field-form.service.ts index 6ef02f0cf8..cc3e495c17 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field-form.service.ts +++ b/ui-ngx/src/app/core/services/calculated-field-form.service.ts @@ -30,7 +30,6 @@ import { isDefined } from '@core/utils'; import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; import { CalculatedFieldsTableEntity } from '@home/components/calculated-fields/calculated-fields-table-config'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { EntityType } from '@shared/models/entity-type.models'; @Injectable({ providedIn: 'root' }) export class CalculatedFieldFormService { @@ -40,13 +39,32 @@ export class CalculatedFieldFormService { buildForm(): FormGroup { return this.fb.group({ name: ['', [Validators.required, Validators.pattern(oneSpaceInsideRegex), Validators.maxLength(255)]], - entityId: [{type: EntityType.DEVICE_PROFILE, id: null}, Validators.required], + entityId: [null, Validators.required], type: [CalculatedFieldType.SIMPLE], debugSettings: [], configuration: this.fb.control({} as CalculatedFieldConfiguration), }); } + buildAlarmRuleForm(): FormGroup { + return this.fb.group({ + name: ['', [Validators.required, Validators.pattern(oneSpaceInsideRegex), Validators.maxLength(255)]], + entityId: [null, Validators.required], + type: [CalculatedFieldType.ALARM], + debugSettings: [], + configuration: this.fb.group({ + type: [CalculatedFieldType.ALARM], + arguments: this.fb.control({}, Validators.required), + propagate: [false], + propagateToOwner: [false], + propagateToTenant: [false], + propagateRelationTypes: [null], + createRules: [null, Validators.required], + clearRule: [null], + }), + }); + } + setupTypeChange(form: FormGroup, destroyRef: DestroyRef, isEditActive?: () => boolean): void { form.get('type').valueChanges.pipe( pairwise(), diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html index 869b707d98..1b116d0696 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html @@ -58,31 +58,14 @@ />
@if (!data.entityId) { -
- - - @if (fieldFormGroup.get('entityId.entityType').value) { - - } -
+ + }
diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts index a84aa52693..854f7fb1a0 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts @@ -14,16 +14,15 @@ /// limitations under the License. /// -import { Component, DestroyRef, Inject, ViewChild, ViewEncapsulation } from '@angular/core'; +import { Component, DestroyRef, Inject, ViewEncapsulation } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FormGroup } from '@angular/forms'; import { Router } from '@angular/router'; import { DialogComponent } from '@shared/components/dialog.component'; import { CalculatedField, CalculatedFieldArgument, CalculatedFieldType } from '@shared/models/calculated-field.models'; -import { oneSpaceInsideRegex } from '@shared/models/regex.constants'; -import { AliasEntityType, EntityType, entityTypeTranslations } from '@shared/models/entity-type.models'; +import { EntityType, entityTypeTranslations } from '@shared/models/entity-type.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { ScriptLanguage } from '@shared/models/rule-node.models'; import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; @@ -39,13 +38,11 @@ import { } from "@shared/models/alarm-rule.models"; import { deepTrim } from "@core/utils"; import { combineLatest, Observable } from "rxjs"; -import { debounceTime, startWith, switchMap } from "rxjs/operators"; -import { EntityTypeSelectComponent } from "@shared/components/entity/entity-type-select.component"; -import { EntityAutocompleteComponent } from "@shared/components/entity/entity-autocomplete.component"; -import { EntityService } from "@core/http/entity.service"; +import { debounceTime, startWith } from "rxjs/operators"; import { RelationTypes } from "@shared/models/relation.models"; import { StringItemsOption } from "@shared/components/string-items-list.component"; import { BaseData } from "@shared/models/base-data"; +import { CalculatedFieldFormService } from '@core/services/calculated-field-form.service'; export interface AlarmRuleDialogData { value?: CalculatedField; @@ -67,24 +64,7 @@ export interface AlarmRuleDialogData { }) export class AlarmRuleDialogComponent extends DialogComponent { - fieldFormGroup = this.fb.group({ - name: ['', [Validators.required, Validators.pattern(oneSpaceInsideRegex), Validators.maxLength(255)]], - type: [CalculatedFieldType.ALARM], - debugSettings: [], - entityId: this.fb.group({ - entityType: this.fb.control(EntityType.DEVICE_PROFILE, Validators.required), - id: [null as null | string, Validators.required], - }), - configuration: this.fb.group({ - arguments: this.fb.control({}, Validators.required), - propagate: [false], - propagateToOwner: [false], - propagateToTenant: [false], - propagateRelationTypes: [null], - createRules: [null, Validators.required], - clearRule: [null], - }), - }); + fieldFormGroup: FormGroup ; additionalDebugActionConfig = this.data.value?.id ? { ...this.data.additionalDebugActionConfig, @@ -105,18 +85,15 @@ export class AlarmRuleDialogComponent extends DialogComponent, protected router: Router, @Inject(MAT_DIALOG_DATA) public data: AlarmRuleDialogData, protected dialogRef: MatDialogRef, private calculatedFieldsService: CalculatedFieldsService, - private entityService: EntityService, private destroyRef: DestroyRef, - private fb: FormBuilder) { + private cfFormService: CalculatedFieldFormService) { super(store, router, dialogRef); + this.fieldFormGroup = this.cfFormService.buildAlarmRuleForm(); this.applyDialogData(); this.updateRulesValidators(); @@ -132,7 +109,7 @@ export class AlarmRuleDialogComponent extends DialogComponent { - const calculatedFieldId = this.data.value?.id?.id; - if (calculatedFieldId) { - return this.calculatedFieldsService.getLatestCalculatedFieldDebugEvent(calculatedFieldId, {ignoreLoading: true}) - .pipe( - switchMap(event => { - const args = event?.arguments ? JSON.parse(event.arguments) : null; - return this.data.getTestScriptDialogFn(this.fromGroupValue, expression, args, false); - }), - takeUntilDestroyed(this.destroyRef) - ) - } - return this.data.getTestScriptDialogFn(this.fromGroupValue, expression, null, false); + return this.cfFormService.testScript( + this.data.value?.id?.id, + this.fromGroupValue, + this.data.getTestScriptDialogFn, + this.destroyRef, + expression + ); } private updateRulesValidators(): void { @@ -250,5 +220,4 @@ export class AlarmRuleDialogComponent extends DialogComponent): void { this.entityName = entity.name; } - } diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts index b0ac04aacb..ad718408e4 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table-config.ts @@ -36,7 +36,7 @@ import { DestroyRef, Renderer2 } from '@angular/core'; import { EntityDebugSettings } from '@shared/models/entity.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; -import { catchError, filter, switchMap, tap } from 'rxjs/operators'; +import { catchError, filter, first, switchMap, tap } from 'rxjs/operators'; import { ArgumentEntityType, ArgumentType, @@ -186,7 +186,8 @@ export class AlarmRulesTableConfig extends EntityTableConfig true, - onAction: ($event, entity) => this.openDebugEventsDialog($event, entity), + onAction: ($event, entity) => + this.pageMode ? this.openDebugTab($event, entity) : this.openDebugEventsDialog($event, entity), }, { name: '', @@ -308,6 +309,22 @@ export class AlarmRulesTableConfig extends EntityTableConfig 1) { + table.entityDetailsPanel.matTabGroup.selectedIndex = 1; + } else { + table.entityDetailsPanel.matTabGroup._tabs.changes.pipe( + first() + ).subscribe(() => { + table.entityDetailsPanel.matTabGroup.selectedIndex = 1; + }) + } + } + } + private exportAlarmRule($event: Event, calculatedField: AlarmRuleTableEntity): void { $event?.stopPropagation(); this.importExportService.exportCalculatedField(calculatedField.id.id); @@ -361,7 +378,7 @@ export class AlarmRulesTableConfig extends EntityTableConfig this.updateData()); } - private getTestScriptDialog(calculatedField: AlarmRuleTableEntity, expression: string, argumentsObj?: CalculatedFieldEventArguments, openCalculatedFieldEdit = true): Observable { + private getTestScriptDialog(calculatedField: AlarmRuleTableEntity, argumentsObj?: CalculatedFieldEventArguments, openCalculatedFieldEdit = true, expression?: string): Observable { if (calculatedField.type === CalculatedFieldType.ALARM) { const resultArguments = Object.keys(calculatedField.configuration.arguments).reduce((acc, key) => { const type = calculatedField.configuration.arguments[key].refEntityKey.type; diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.html index e304a78732..28695d9283 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.html @@ -65,6 +65,7 @@
diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts index 200cf09741..fb92f6c4fd 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts @@ -14,11 +14,11 @@ /// limitations under the License. /// -import { ChangeDetectorRef, Component, DestroyRef, Inject, Input } from '@angular/core'; +import { ChangeDetectorRef, Component, DestroyRef, inject, Inject, Input } from '@angular/core'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; -import { EntityComponent } from '../../components/entity/entity.component'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { EntityComponent } from '@home/components/entity/entity.component'; +import { FormBuilder, FormGroup } from '@angular/forms'; import { EntityType } from '@shared/models/entity-type.models'; import { TranslateService } from '@ngx-translate/core'; import { @@ -28,13 +28,9 @@ import { calculatedFieldsEntityTypeList, CalculatedFieldType } from '@shared/models/calculated-field.models'; -import { oneSpaceInsideRegex } from '@shared/models/regex.constants'; import { EntityId } from '@shared/models/id/entity-id'; -import { switchMap } from 'rxjs/operators'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { BaseData } from '@shared/models/base-data'; import { Observable } from 'rxjs'; -import { CalculatedFieldsService } from '@core/http/calculated-fields.service'; import { getCurrentAuthUser } from '@core/auth/auth.selectors'; import { CalculatedFieldsTableConfig, @@ -44,6 +40,7 @@ import { TenantId } from '@shared/models/id/tenant-id'; import { StringItemsOption } from '@shared/components/string-items-list.component'; import { RelationTypes } from '@shared/models/relation.models'; import { AlarmRule, AlarmRuleConditionType, AlarmRuleExpressionType } from '@shared/models/alarm-rule.models'; +import { CalculatedFieldFormService } from '@core/services/calculated-field-form.service'; @Component({ selector: 'tb-alarm-rules', @@ -58,20 +55,21 @@ export class AlarmRulesComponent extends EntityComponent, protected translate: TranslateService, @Inject('entity') protected entityValue: CalculatedFieldInfo, @Inject('entitiesTableConfig') protected entitiesTableConfigValue: CalculatedFieldsTableConfig, protected fb: FormBuilder, - protected cd: ChangeDetectorRef, - private destroyRef: DestroyRef, - private calculatedFieldsService: CalculatedFieldsService) { + protected cd: ChangeDetectorRef) { super(store, fb, entityValue, entitiesTableConfigValue, cd); } @@ -107,24 +105,8 @@ export class AlarmRulesComponent extends EntityComponent { - const calculatedFieldId = this.entity?.id?.id; - if (calculatedFieldId) { - return this.calculatedFieldsService.getLatestCalculatedFieldDebugEvent(calculatedFieldId, {ignoreLoading: true}) - .pipe( - switchMap(event => { - const args = event?.arguments ? JSON.parse(event.arguments) : null; - return this.entitiesTableConfig.getTestScriptDialog(this.entityFormValue(), args, false, expression); - }), - takeUntilDestroyed(this.destroyRef) - ) - } - - return this.entitiesTableConfig.getTestScriptDialog(this.entityFormValue(), null, false, expression); + return this.cfFormService.testScript( + this.entity?.id?.id, + this.entityFormValue(), + this.entitiesTableConfig.getTestScriptDialog.bind(this.entitiesTableConfig), + this.destroyRef, + expression + ); } updateFormState() { diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.html index 22fc01f9de..99ee0f9634 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.html @@ -15,7 +15,7 @@ limitations under the License. --> -
+
{{ 'alarm-rule.condition' | translate }}
- - - - - - - - - -
@@ -75,6 +65,7 @@
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts index 01cc53609d..65595fe9b8 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts @@ -38,7 +38,7 @@ import { CalculatedFieldsTableEntity } from '@home/components/calculated-fields/calculated-fields-table-config'; import { TenantId } from '@shared/models/id/tenant-id'; -import { CalculatedFieldFormService } from '@home/components/calculated-fields/calculated-field-form.service'; +import { CalculatedFieldFormService } from '@core/services/calculated-field-form.service'; @Component({ selector: 'tb-calculated-field', @@ -55,8 +55,8 @@ export class CalculatedFieldComponent extends EntityComponent 20;' -export type AlarmRuleTestScriptFn = (calculatedField: CalculatedField, expression: string, argumentsObj?: Record, closeAllOnSave?: boolean) => Observable; +export type AlarmRuleTestScriptFn = (calculatedField: CalculatedField, argumentsObj?: CalculatedFieldEventArguments, openCalculatedFieldEdit?: boolean, expression?: string) => Observable; export function checkPredicates(predicates: any[], validSet: Set): boolean { for (const predicate of predicates) { From 44f2b44d1af328a5b18f58be0a0f0bcc61a0be5d Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Fri, 26 Dec 2025 16:24:07 +0200 Subject: [PATCH 098/579] UI: Fixed not apply contidition in alarm rules and fixed style --- .../home/components/alarm-rules/cf-alarm-rule.component.html | 2 +- .../components/alarm-rules/create-cf-alarm-rules.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule.component.html index a7ccc25fe6..f48819da74 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule.component.html @@ -15,7 +15,7 @@ limitations under the License. --> -
+
diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts index 15d9858817..d5ec210f34 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts @@ -114,7 +114,7 @@ export class CreateCfAlarmRulesComponent implements ControlValueAccessor, Valida } createAlarmRulesControls.push(this.fb.group({ severity: [severity, Validators.required], - alarmRule: {value: [createAlarmRule, Validators.required], disabled: this.disabled} + alarmRule: [{value: createAlarmRule, disabled: this.disabled}, Validators.required] })); }); } From 9823c780761ca4b0b14120d9526f84199278b183 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Fri, 26 Dec 2025 17:04:37 +0200 Subject: [PATCH 099/579] UI: Fixed show label in select cf entity --- .../alarm-rules/alarm-rule-dialog.component.html | 1 + .../components/alarm-rules/alarm-rules.component.html | 1 + .../calculated-fields/calculated-field.component.html | 1 + .../dialog/calculated-field-dialog.component.html | 1 + .../components/entity/entity-select.component.html | 1 + .../components/entity/entity-select.component.ts | 3 +++ .../components/entity/entity-type-select.component.ts | 10 +++++++++- 7 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html index 1b116d0696..ed936cd60e 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html @@ -61,6 +61,7 @@ diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html index 7cea16c636..7d4b4b7920 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html @@ -66,6 +66,7 @@ diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html index 78df90701f..293dacdca6 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html @@ -59,6 +59,7 @@ >(); diff --git a/ui-ngx/src/app/shared/components/entity/entity-type-select.component.ts b/ui-ngx/src/app/shared/components/entity/entity-type-select.component.ts index fcfe158da0..dcabc49906 100644 --- a/ui-ngx/src/app/shared/components/entity/entity-type-select.component.ts +++ b/ui-ngx/src/app/shared/components/entity/entity-type-select.component.ts @@ -52,8 +52,16 @@ export class EntityTypeSelectComponent implements ControlValueAccessor, OnInit, @coerceBoolean() showLabel: boolean; + private labelValue = this.translate.instant('entity.type'); + + get label(): string { + return this.labelValue; + } + @Input() - label = this.translate.instant('entity.type'); + set label(value: string) { + this.labelValue = value ?? this.translate.instant('entity.type'); + } @Input() @coerceBoolean() From c4ce25b6bfd353d7dc7f80a814e52b40646b8b68 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Fri, 26 Dec 2025 17:34:53 +0200 Subject: [PATCH 100/579] UI: Disabled change CF type when import --- .../calculated-fields/calculated-fields-table-config.ts | 5 +++-- .../components/dialog/calculated-field-dialog.component.ts | 7 ++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts index e5e4063c21..e32bdc1188 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts @@ -253,7 +253,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { + private getCalculatedFieldDialog(value?: CalculatedFieldsTableEntity, buttonTitle = 'action.add', isDirty = false, disabledSelectType = false): Observable { const entityId = this.entityId || value?.entityId; const entityName = this.entityName || (value as CalculatedFieldInfo)?.entityName; return this.dialog.open(CalculatedFieldDialogComponent, { @@ -269,6 +269,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig this.getCalculatedFieldDialog(this.updateImportedCalculatedField(calculatedField), 'action.add', true)), + switchMap(calculatedField => this.getCalculatedFieldDialog(this.updateImportedCalculatedField(calculatedField), 'action.add', true, true)), filter(Boolean), switchMap(calculatedField => this.calculatedFieldsService.saveCalculatedField(calculatedField)), filter(Boolean), diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts index 28a028eacc..ee38fb2a2d 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts @@ -50,6 +50,7 @@ export interface CalculatedFieldDialogData { additionalDebugActionConfig: AdditionalDebugActionConfig<(calculatedField: CalculatedField) => void>; getTestScriptDialogFn: CalculatedFieldTestScriptFn; isDirty?: boolean; + disabledSelectType?: boolean; } @Component({ @@ -106,10 +107,14 @@ export class CalculatedFieldDialogComponent extends DialogComponent Date: Fri, 26 Dec 2025 17:42:16 +0200 Subject: [PATCH 101/579] UI: Time series data aggregation CF remove 'Count unique' aggregation function --- .../metrics/calculated-field-metrics-panel.component.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts index 3d5a53ea4e..811f7b87fa 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts @@ -74,7 +74,7 @@ export class CalculatedFieldMetricsPanelComponent implements OnInit { entityFilter: EntityFilter; - readonly AggFunctions = Object.values(AggFunction) as AggFunction[]; + AggFunctions = Object.values(AggFunction) as AggFunction[]; readonly AggFunctionTranslations = AggFunctionTranslations; readonly ScriptLanguage = ScriptLanguage; readonly AggInputType = AggInputType; @@ -103,6 +103,10 @@ export class CalculatedFieldMetricsPanelComponent implements OnInit { this.validateInputKey(); this.functionArgs = ['ctx', ...this.arguments]; + + if (this.simpleMode) { + this.AggFunctions = this.AggFunctions.filter(aggFunc => aggFunc !== AggFunction.COUNT_UNIQUE); + } } saveMetric(): void { From 1840401b29824aa16ef82e3f50b46d673e7d6605 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Fri, 26 Dec 2025 17:52:57 +0200 Subject: [PATCH 102/579] UI: Add show title in CF page and minor bug show required --- .../calculated-fields/calculated-fields-table-config.ts | 2 +- ...lculated-field-geofencing-zone-groups-panel.component.html | 4 +++- ui-ngx/src/assets/locale/locale.constant-en_US.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts index e32bdc1188..e09949d2c6 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts @@ -111,7 +111,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig
- {{ 'calculated-fields.entity-zone-relationship' | translate }} + + {{ 'calculated-fields.entity-zone-relationship' | translate }} +
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 38f72b3206..259008791e 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -1183,7 +1183,7 @@ "perimeter-attribute-key": "Perimeter attribute key", "perimeter-attribute-key-required": "Perimeter attribute key is required.", "perimeter-attribute-key-pattern": "Perimeter attribute key is invalid.", - "entity-zone-relationship": "Path from Entity to Zones *", + "entity-zone-relationship": "Path from Entity to Zones", "direction": "Relation direction", "direction-from": "From entity to zone", "direction-to": "From zone to entity", From 3a647f00379a3fc398d2de5d99ab49652dfea703 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Fri, 26 Dec 2025 18:56:17 +0200 Subject: [PATCH 103/579] UI: Optimize watchKeyChange in CF arguments --- .../calculated-field-argument-panel.component.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.ts index 38855ec79e..51d14c9478 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.ts @@ -259,7 +259,11 @@ export class CalculatedFieldArgumentPanelComponent implements OnInit, AfterViewI }; } if (!onInit) { - this.argumentFormGroup.get('refEntityKey').get('key').setValue(''); + this.argumentFormGroup.get('refEntityKey').get('key').setValue('', {emitEvents: !this.watchKeyChange}); + if (this.watchKeyChange && this.argumentFormGroup.get('argumentName').pristine) { + this.argumentFormGroup.get('argumentName').markAsUntouched({emitEvent: false}); + this.argumentFormGroup.get('argumentName').setValue('', {emitEvent: false}); + } } else if (this.predefinedEntityFilter) { entityFilter = this.predefinedEntityFilter; } From 595b52d7b279d0f754dae69ea19024865d0deb7d Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Fri, 26 Dec 2025 19:01:46 +0200 Subject: [PATCH 104/579] UI: Fixed cf argument validation --- .../calculated-field-arguments-table.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts index 983609dfa7..a05326699d 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts @@ -154,7 +154,7 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces validate(): ValidationErrors | null { this.updateErrorText(); - return this.errorText ? { argumentsFormArray: false } : null; + return this.errorText || !this.argumentsFormArray.controls.length ? { argumentsFormArray: false } : null; } setDisabledState(isDisabled: boolean): void { From bd4a450326200a4e1e5b1b1f57fb402075a094e1 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Mon, 29 Dec 2025 11:23:51 +0200 Subject: [PATCH 105/579] Use 3.8-stable tb-gateway image --- application/src/main/resources/thingsboard.yml | 2 +- .../server/controller/DeviceConnectivityControllerTest.java | 2 +- .../server/dao/device/DeviceConnectivityServiceImpl.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 787111c28e..63c461dd7c 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1467,7 +1467,7 @@ device: pem_cert_file: "${DEVICE_CONNECTIVITY_COAPS_CA_ROOT_CERT:cafile.pem}" gateway: # The docker tag for thingsboard/tb-gateway image used in docker-compose file for gateway launch - image_version: "${DEVICE_CONNECTIVITY_GATEWAY_IMAGE_VERSION:3.7-stable}" + image_version: "${DEVICE_CONNECTIVITY_GATEWAY_IMAGE_VERSION:3.8-stable}" # Edges parameters edges: diff --git a/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerTest.java index 724b1c622f..2213bb731c 100644 --- a/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerTest.java @@ -95,7 +95,7 @@ public class DeviceConnectivityControllerTest extends AbstractControllerTest { private DeviceProfileId mqttDeviceProfileId; private DeviceProfileId coapDeviceProfileId; - @Value("${device.connectivity.gateway.image_version:3.7-stable}") + @Value("${device.connectivity.gateway.image_version:3.8-stable}") private String gatewayImageVersion; @Before diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityServiceImpl.java index 6f22e95c87..e4f2796d3b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityServiceImpl.java @@ -85,7 +85,7 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService private String mqttsPemCertFile; @Value("${device.connectivity.coaps.pem_cert_file:}") private String coapsPemCertFile; - @Value("${device.connectivity.gateway.image_version:3.7-stable}") + @Value("${device.connectivity.gateway.image_version:3.8-stable}") private String gatewayImageVersion; @Override From 00ab73f114d1bb042f4e4913d4d680354aec7db7 Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Mon, 29 Dec 2025 11:34:06 +0200 Subject: [PATCH 106/579] passed ctx as param to updateEntry --- ...CalculatedFieldEntityMessageProcessor.java | 15 +++++---- ...tractCalculatedFieldProcessingService.java | 6 ++-- .../service/cf/ctx/state/ArgumentEntry.java | 2 +- .../ctx/state/BaseCalculatedFieldState.java | 8 ++--- .../ctx/state/SingleValueArgumentEntry.java | 2 +- .../cf/ctx/state/TsRollingArgumentEntry.java | 2 +- .../RelatedEntitiesArgumentEntry.java | 5 +-- .../EntityAggregationArgumentEntry.java | 28 ++++++---------- ...EntityAggregationCalculatedFieldState.java | 9 ----- .../alarm/AlarmCalculatedFieldState.java | 6 ++-- .../geofencing/GeofencingArgumentEntry.java | 3 +- .../propagation/PropagationArgumentEntry.java | 3 +- .../utils/CalculatedFieldArgumentUtils.java | 4 +-- .../GeofencingValueArgumentEntryTest.java | 25 +++++++++----- .../state/PropagationArgumentEntryTest.java | 33 +++++++++++-------- .../RelatedEntitiesArgumentEntryTest.java | 15 ++++++--- .../state/SingleValueArgumentEntryTest.java | 23 ++++++++----- .../ctx/state/TsRollingArgumentEntryTest.java | 17 +++++++--- 18 files changed, 114 insertions(+), 92 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java index d2ab4c85ac..a24c5fb732 100644 --- a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java @@ -572,24 +572,24 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM } private Map mapToArguments(CalculatedFieldCtx ctx, List data) { - return mapToArguments(entityId, ctx.getMainEntityArguments(), Collections.emptyMap(), data); + return mapToArguments(entityId, ctx, ctx.getMainEntityArguments(), Collections.emptyMap(), data); } private Map mapToArguments(CalculatedFieldCtx ctx, EntityId entityId, List data) { - return mapToArguments(entityId, ctx.getLinkedAndDynamicArgs(entityId), ctx.getRelatedEntityArguments(), data); + return mapToArguments(entityId, ctx, ctx.getLinkedAndDynamicArgs(entityId), ctx.getRelatedEntityArguments(), data); } - private Map mapToArguments(EntityId originator, Map> args, Map> relatedEntityArgs, List data) { + private Map mapToArguments(EntityId originator, CalculatedFieldCtx ctx, Map> args, Map> relatedEntityArgs, List data) { Map arguments = new HashMap<>(); if (!relatedEntityArgs.isEmpty() || !args.isEmpty()) { for (TsKvProto item : data) { ReferencedEntityKey key = new ReferencedEntityKey(item.getKv().getKey(), ArgumentType.TS_LATEST, null); SingleValueArgumentEntry relatedArgIncoming = new SingleValueArgumentEntry(originator, item); - mapLatest(relatedArgIncoming, relatedEntityArgs.get(key), arguments); + mapLatest(ctx, relatedArgIncoming, relatedEntityArgs.get(key), arguments); SingleValueArgumentEntry incoming = new SingleValueArgumentEntry(item); - mapLatest(incoming, args.get(key), arguments); + mapLatest(ctx, incoming, args.get(key), arguments); key = new ReferencedEntityKey(item.getKv().getKey(), ArgumentType.TS_ROLLING, null); mapRolling(item, args.get(key), arguments); @@ -598,7 +598,8 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM return arguments; } - private void mapLatest(SingleValueArgumentEntry incoming, + private void mapLatest(CalculatedFieldCtx ctx, + SingleValueArgumentEntry incoming, Set argNames, Map arguments) { if (argNames != null) { @@ -606,7 +607,7 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM if (existing == null) { return incoming; } - existing.updateEntry(incoming); + existing.updateEntry(incoming, ctx); return existing; })); } diff --git a/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java b/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java index cd88c93a71..ec645085e6 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java @@ -233,7 +233,7 @@ public abstract class AbstractCalculatedFieldProcessingService { return config.getArguments().entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, - entry -> fetchTimeSeries(ctx, entityId, entry.getValue(), config.getInterval(), ts) + entry -> fetchTimeSeries(ctx.getTenantId(), entityId, entry.getValue(), config.getInterval(), ts) )); } @@ -341,11 +341,11 @@ public abstract class AbstractCalculatedFieldProcessingService { return resolveArgumentValue(argKey, argumentEntryFut); } - private ListenableFuture fetchTimeSeries(CalculatedFieldCtx ctx, EntityId entityId, Argument argument, AggInterval interval, long queryEndTs) { + private ListenableFuture fetchTimeSeries(TenantId tenantId, EntityId entityId, Argument argument, AggInterval interval, long queryEndTs) { long intervalStartTs = interval.getCurrentIntervalStartTs(); long intervalEndTs = interval.getCurrentIntervalEndTs(); ReadTsKvQuery query = new BaseReadTsKvQuery(argument.getRefEntityKey().getKey(), intervalStartTs, queryEndTs, 0, 1, Aggregation.NONE); - return fetchTimeSeriesInternal(ctx.getTenantId(), entityId, query, timeSeries -> transformAggregationArgument(timeSeries, intervalStartTs, intervalEndTs, ctx)); + return fetchTimeSeriesInternal(tenantId, entityId, query, timeSeries -> transformAggregationArgument(timeSeries, intervalStartTs, intervalEndTs)); } private ListenableFuture fetchTsRolling(TenantId tenantId, EntityId entityId, Argument argument, long queryEndTs) { diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/ArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/ArgumentEntry.java index dc23ffa979..fc4f8ce365 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/ArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/ArgumentEntry.java @@ -52,7 +52,7 @@ public interface ArgumentEntry { Object getValue(); - boolean updateEntry(ArgumentEntry entry); + boolean updateEntry(ArgumentEntry entry, CalculatedFieldCtx ctx); boolean isEmpty(); diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java index 09ca35cc4b..0f648600a5 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java @@ -86,13 +86,13 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState, validateNewEntry(key, newEntry); if (existingEntry instanceof RelatedEntitiesArgumentEntry || existingEntry instanceof EntityAggregationArgumentEntry) { - updateEntry(existingEntry, newEntry); + updateEntry(existingEntry, newEntry, ctx); } else { arguments.put(key, newEntry); } entryUpdated = true; } else { - entryUpdated = updateEntry(existingEntry, newEntry); + entryUpdated = updateEntry(existingEntry, newEntry, ctx); } if (entryUpdated) { @@ -111,8 +111,8 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState, return updatedArguments; } - protected boolean updateEntry(ArgumentEntry existingEntry, ArgumentEntry newEntry) { - return existingEntry.updateEntry(newEntry); + protected boolean updateEntry(ArgumentEntry existingEntry, ArgumentEntry newEntry, CalculatedFieldCtx ctx) { + return existingEntry.updateEntry(newEntry, ctx); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SingleValueArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SingleValueArgumentEntry.java index 4d0c4d7724..028c3c429b 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SingleValueArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SingleValueArgumentEntry.java @@ -159,7 +159,7 @@ public class SingleValueArgumentEntry implements ArgumentEntry { } @Override - public boolean updateEntry(ArgumentEntry entry) { + public boolean updateEntry(ArgumentEntry entry, CalculatedFieldCtx ctx) { if (entry instanceof SingleValueArgumentEntry singleValueEntry) { if (singleValueEntry.getTs() < this.ts) { return false; diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/TsRollingArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/TsRollingArgumentEntry.java index 8cdc9ddcf9..8abddb3d4a 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/TsRollingArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/TsRollingArgumentEntry.java @@ -100,7 +100,7 @@ public class TsRollingArgumentEntry implements ArgumentEntry, HasLatestTs { } @Override - public boolean updateEntry(ArgumentEntry entry) { + public boolean updateEntry(ArgumentEntry entry, CalculatedFieldCtx ctx) { if (entry instanceof TsRollingArgumentEntry tsRollingEntry) { updateTsRollingEntry(tsRollingEntry); } else if (entry instanceof SingleValueArgumentEntry singleValueEntry) { diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesArgumentEntry.java index 219cf471ed..0a5c850e4f 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesArgumentEntry.java @@ -23,6 +23,7 @@ import org.thingsboard.script.api.tbel.TbelCfSingleValueArg; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.service.cf.ctx.state.ArgumentEntry; import org.thingsboard.server.service.cf.ctx.state.ArgumentEntryType; +import org.thingsboard.server.service.cf.ctx.state.CalculatedFieldCtx; import org.thingsboard.server.service.cf.ctx.state.HasLatestTs; import org.thingsboard.server.service.cf.ctx.state.SingleValueArgumentEntry; @@ -63,7 +64,7 @@ public class RelatedEntitiesArgumentEntry implements ArgumentEntry, HasLatestTs } @Override - public boolean updateEntry(ArgumentEntry entry) { + public boolean updateEntry(ArgumentEntry entry, CalculatedFieldCtx ctx) { if (entry instanceof RelatedEntitiesArgumentEntry relatedEntitiesArgumentEntry) { entityInputs.putAll(relatedEntitiesArgumentEntry.entityInputs); return true; @@ -74,7 +75,7 @@ public class RelatedEntitiesArgumentEntry implements ArgumentEntry, HasLatestTs } ArgumentEntry argumentEntry = entityInputs.get(singleValueArgumentEntry.getEntityId()); if (argumentEntry != null) { - argumentEntry.updateEntry(singleValueArgumentEntry); + argumentEntry.updateEntry(singleValueArgumentEntry, ctx); } else { entityInputs.put(singleValueArgumentEntry.getEntityId(), singleValueArgumentEntry); } diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationArgumentEntry.java index ef34b6ae8e..c0a0603390 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationArgumentEntry.java @@ -39,18 +39,10 @@ public class EntityAggregationArgumentEntry implements ArgumentEntry { private boolean forceResetPrevious; - private AggInterval interval; - private long watermarkDuration; - public EntityAggregationArgumentEntry(Map aggIntervals) { this.aggIntervals = aggIntervals; } - public EntityAggregationArgumentEntry(Map aggIntervals, CalculatedFieldCtx ctx) { - this(aggIntervals); - setCtx(ctx); - } - @Override public ArgumentEntryType getType() { return ArgumentEntryType.ENTITY_AGGREGATION; @@ -61,15 +53,8 @@ public class EntityAggregationArgumentEntry implements ArgumentEntry { return aggIntervals; } - public void setCtx(CalculatedFieldCtx ctx) { - var configuration = (EntityAggregationCalculatedFieldConfiguration) ctx.getCalculatedField().getConfiguration(); - interval = configuration.getInterval(); - Watermark watermark = configuration.getWatermark(); - watermarkDuration = watermark == null ? 0 : TimeUnit.SECONDS.toMillis(watermark.getDuration()); - } - @Override - public boolean updateEntry(ArgumentEntry entry) { + public boolean updateEntry(ArgumentEntry entry, CalculatedFieldCtx ctx) { if (entry instanceof EntityAggregationArgumentEntry entityAggEntry) { aggIntervals.putAll(entityAggEntry.getAggIntervals()); return true; @@ -79,7 +64,7 @@ public class EntityAggregationArgumentEntry implements ArgumentEntry { if (updateExistingIntervals(singleValueArgEntry, entryTs, now)) { return true; } - return createNewInterval(entryTs, now); + return createNewInterval(entryTs, now, ctx); } return false; } @@ -104,7 +89,14 @@ public class EntityAggregationArgumentEntry implements ArgumentEntry { return updated; } - private boolean createNewInterval(long entryTs, long now) { + private boolean createNewInterval(long entryTs, long now, CalculatedFieldCtx ctx) { + if (!(ctx.getCalculatedField().getConfiguration() instanceof EntityAggregationCalculatedFieldConfiguration config)) { + return false; + } + AggInterval interval = config.getInterval(); + Watermark watermark = config.getWatermark(); + long watermarkDuration = watermark == null ? 0 : TimeUnit.SECONDS.toMillis(watermark.getDuration()); + ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochMilli(entryTs), interval.getZoneId()); long startTs = interval.getDateTimeIntervalStartTs(zdt); diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java index 59335717fb..99bddc374c 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java @@ -82,15 +82,6 @@ public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldSt interval = configuration.getInterval(); metrics = configuration.getMetrics(); produceIntermediateResult = configuration.isProduceIntermediateResult(); - setCtxToArguments(); - } - - private void setCtxToArguments() { - arguments.values().forEach(argument -> { - if (argument instanceof EntityAggregationArgumentEntry entityAggArgument) { - entityAggArgument.setCtx(ctx); - } - }); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java index 4f2cbede09..63b7cc8eb1 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java @@ -224,17 +224,17 @@ public class AlarmCalculatedFieldState extends BaseCalculatedFieldState { } @Override - protected boolean updateEntry(ArgumentEntry existingArgumentEntry, ArgumentEntry newArgumentEntry) { + protected boolean updateEntry(ArgumentEntry existingArgumentEntry, ArgumentEntry newArgumentEntry, CalculatedFieldCtx ctx) { if (!(existingArgumentEntry instanceof SingleValueArgumentEntry existingEntry) || !(newArgumentEntry instanceof SingleValueArgumentEntry newEntry)) { - return super.updateEntry(existingArgumentEntry, newArgumentEntry); + return super.updateEntry(existingArgumentEntry, newArgumentEntry, ctx); } if (newEntry.getTs() < existingEntry.getTs()) { if (existingEntry.isDefaultValue()) { existingEntry.setTs(newEntry.getTs()); } } - return super.updateEntry(existingEntry, newEntry); + return super.updateEntry(existingEntry, newEntry, ctx); } public void processAlarmAction(Alarm alarm, ActionType action) { diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingArgumentEntry.java index 01c7119993..a3305ea52d 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingArgumentEntry.java @@ -25,6 +25,7 @@ import org.thingsboard.server.common.util.ProtoUtils; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.service.cf.ctx.state.ArgumentEntry; import org.thingsboard.server.service.cf.ctx.state.ArgumentEntryType; +import org.thingsboard.server.service.cf.ctx.state.CalculatedFieldCtx; import org.thingsboard.server.service.cf.ctx.state.HasLatestTs; import java.util.Map; @@ -68,7 +69,7 @@ public class GeofencingArgumentEntry implements ArgumentEntry, HasLatestTs { } @Override - public boolean updateEntry(ArgumentEntry entry) { + public boolean updateEntry(ArgumentEntry entry, CalculatedFieldCtx ctx) { if (!(entry instanceof GeofencingArgumentEntry geofencingArgumentEntry)) { throw new IllegalArgumentException("Unsupported argument entry type for geofencing argument entry: " + entry.getType()); } diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationArgumentEntry.java index 8536c0f65f..de04d0e817 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationArgumentEntry.java @@ -21,6 +21,7 @@ import org.thingsboard.script.api.tbel.TbelCfPropagationArg; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.service.cf.ctx.state.ArgumentEntry; import org.thingsboard.server.service.cf.ctx.state.ArgumentEntryType; +import org.thingsboard.server.service.cf.ctx.state.CalculatedFieldCtx; import java.util.ArrayList; import java.util.Collection; @@ -59,7 +60,7 @@ public class PropagationArgumentEntry implements ArgumentEntry { } @Override - public boolean updateEntry(ArgumentEntry entry) { + public boolean updateEntry(ArgumentEntry entry, CalculatedFieldCtx ctx) { if (!(entry instanceof PropagationArgumentEntry updated)) { throw new IllegalArgumentException("Unsupported argument entry type for propagation argument entry: " + entry.getType()); } diff --git a/application/src/main/java/org/thingsboard/server/utils/CalculatedFieldArgumentUtils.java b/application/src/main/java/org/thingsboard/server/utils/CalculatedFieldArgumentUtils.java index d6f08cbc69..7e0701cd2d 100644 --- a/application/src/main/java/org/thingsboard/server/utils/CalculatedFieldArgumentUtils.java +++ b/application/src/main/java/org/thingsboard/server/utils/CalculatedFieldArgumentUtils.java @@ -75,7 +75,7 @@ public class CalculatedFieldArgumentUtils { return new SingleValueArgumentEntry(); } - public static ArgumentEntry transformAggregationArgument(List timeSeries, long startIntervalTs, long endIntervalTs, CalculatedFieldCtx ctx) { + public static ArgumentEntry transformAggregationArgument(List timeSeries, long startIntervalTs, long endIntervalTs) { Map aggIntervals = new HashMap<>(); AggIntervalEntry aggIntervalEntry = new AggIntervalEntry(startIntervalTs, endIntervalTs); if (timeSeries == null || timeSeries.isEmpty()) { @@ -83,7 +83,7 @@ public class CalculatedFieldArgumentUtils { } else { aggIntervals.put(aggIntervalEntry, new AggIntervalEntryStatus(System.currentTimeMillis())); } - return new EntityAggregationArgumentEntry(aggIntervals, ctx); + return new EntityAggregationArgumentEntry(aggIntervals); } private static KvEntry createDefaultKvEntry(Argument argument) { diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingValueArgumentEntryTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingValueArgumentEntryTest.java index 6da4bdc882..d274da2434 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingValueArgumentEntryTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingValueArgumentEntryTest.java @@ -18,6 +18,9 @@ package org.thingsboard.server.service.cf.ctx.state; import io.hypersistence.utils.hibernate.type.json.internal.JacksonUtil; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.thingsboard.common.util.geo.PerimeterDefinition; import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.EntityId; @@ -33,6 +36,7 @@ import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@ExtendWith(MockitoExtension.class) public class GeofencingValueArgumentEntryTest { private final AssetId ZONE_1_ID = new AssetId(UUID.fromString("c0e3031c-7df1-45e4-9590-cfd621a4d714")); @@ -46,6 +50,9 @@ public class GeofencingValueArgumentEntryTest { private GeofencingArgumentEntry entry; + @Mock + private CalculatedFieldCtx ctx; + @BeforeEach void setUp() { entry = new GeofencingArgumentEntry(Map.of(ZONE_1_ID, allowedZoneAttributeKvEntry, ZONE_2_ID, restrictedZoneAttributeKvEntry)); @@ -58,14 +65,14 @@ public class GeofencingValueArgumentEntryTest { @Test void testUpdateEntryWhenSingleEntryPassed() { - assertThatThrownBy(() -> entry.updateEntry(new SingleValueArgumentEntry())) + assertThatThrownBy(() -> entry.updateEntry(new SingleValueArgumentEntry(), ctx)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Unsupported argument entry type for geofencing argument entry: SINGLE_VALUE"); } @Test void testUpdateEntryWhenRollingEntryPassed() { - assertThatThrownBy(() -> entry.updateEntry(new TsRollingArgumentEntry(5, 30000L))) + assertThatThrownBy(() -> entry.updateEntry(new TsRollingArgumentEntry(5, 30000L), ctx)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Unsupported argument entry type for geofencing argument entry: TS_ROLLING"); } @@ -74,7 +81,7 @@ public class GeofencingValueArgumentEntryTest { void testUpdateEntryWithTheSameTs() { BaseAttributeKvEntry differentValueSameTs = new BaseAttributeKvEntry(new JsonDataEntry("zone", "[[50.472001, 30.504001], [50.472001, 30.506001], [50.474001, 30.506001], [50.474001, 30.504001]]"), 363L, 156L); var updated = new GeofencingArgumentEntry(Map.of(ZONE_1_ID, differentValueSameTs, ZONE_2_ID, restrictedZoneAttributeKvEntry)); - assertThat(entry.updateEntry(updated)).isFalse(); + assertThat(entry.updateEntry(updated, ctx)).isFalse(); } @Test @@ -83,7 +90,7 @@ public class GeofencingValueArgumentEntryTest { BaseAttributeKvEntry differentValueNewVersionIsNull = new BaseAttributeKvEntry(new JsonDataEntry("zone", "[[50.472001, 30.504001], [50.472001, 30.506001], [50.474001, 30.506001], [50.474001, 30.504001]]"), 364L, null); var updated = new GeofencingArgumentEntry(Map.of(ZONE_1_ID, differentValueNewVersionIsNull, ZONE_2_ID, restrictedZoneAttributeKvEntry)); - assertThat(entry.updateEntry(updated)).isTrue(); + assertThat(entry.updateEntry(updated, ctx)).isTrue(); assertThat(entry.getValue()).isInstanceOf(Map.class); Map value = (Map) entry.getValue(); @@ -105,7 +112,7 @@ public class GeofencingValueArgumentEntryTest { BaseAttributeKvEntry differentValueNewVersionIsSet = new BaseAttributeKvEntry(new JsonDataEntry("zone", "[[50.472001, 30.504001], [50.472001, 30.506001], [50.474001, 30.506001], [50.474001, 30.504001]]"), 364L, 156L); var updated = new GeofencingArgumentEntry(Map.of(ZONE_1_ID, differentValueNewVersionIsSet, ZONE_2_ID, restrictedZoneAttributeKvEntry)); - assertThat(entry.updateEntry(updated)).isTrue(); + assertThat(entry.updateEntry(updated, ctx)).isTrue(); assertThat(entry.getValue()).isInstanceOf(Map.class); Map value = (Map) entry.getValue(); @@ -126,7 +133,7 @@ public class GeofencingValueArgumentEntryTest { BaseAttributeKvEntry differentValueNewVersionIsSet = new BaseAttributeKvEntry(new JsonDataEntry("zone", "[[50.472001, 30.504001], [50.472001, 30.506001], [50.474001, 30.506001], [50.474001, 30.504001]]"), 364L, 154L); var updated = new GeofencingArgumentEntry(Map.of(ZONE_1_ID, differentValueNewVersionIsSet, ZONE_2_ID, restrictedZoneAttributeKvEntry)); - assertThat(entry.updateEntry(updated)).isFalse(); + assertThat(entry.updateEntry(updated, ctx)).isFalse(); } @Test @@ -134,7 +141,7 @@ public class GeofencingValueArgumentEntryTest { BaseAttributeKvEntry newTsAndTheSameValue = new BaseAttributeKvEntry(allowedZoneDataEntry, 364L, 156L); var updated = new GeofencingArgumentEntry(Map.of(ZONE_1_ID, newTsAndTheSameValue, ZONE_2_ID, restrictedZoneAttributeKvEntry)); - assertThat(entry.updateEntry(updated)).isTrue(); + assertThat(entry.updateEntry(updated, ctx)).isTrue(); } @Test @@ -142,7 +149,7 @@ public class GeofencingValueArgumentEntryTest { BaseAttributeKvEntry oldTsAndTheSameValue = new BaseAttributeKvEntry(allowedZoneDataEntry, 362L, 156L); var updated = new GeofencingArgumentEntry(Map.of(ZONE_1_ID, oldTsAndTheSameValue, ZONE_2_ID, restrictedZoneAttributeKvEntry)); - assertThat(entry.updateEntry(updated)).isFalse(); + assertThat(entry.updateEntry(updated, ctx)).isFalse(); } @Test @@ -150,7 +157,7 @@ public class GeofencingValueArgumentEntryTest { final AssetId NEW_ZONE_ID = new AssetId(UUID.fromString("a3eacf1a-6af3-4e9f-87c4-502bb25c7dc3")); BaseAttributeKvEntry newZone = new BaseAttributeKvEntry(new JsonDataEntry("zone", "[[50.472001, 30.504001], [50.472001, 30.506001], [50.474001, 30.506001], [50.474001, 30.504001]]"), 364L, 156L); var updated = new GeofencingArgumentEntry(Map.of(ZONE_1_ID, allowedZoneAttributeKvEntry, ZONE_2_ID, restrictedZoneAttributeKvEntry, NEW_ZONE_ID, newZone)); - assertThat(entry.updateEntry(updated)).isTrue(); + assertThat(entry.updateEntry(updated, ctx)).isTrue(); } @Test diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationArgumentEntryTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationArgumentEntryTest.java index 12f3e4298d..f4098dc2df 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationArgumentEntryTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationArgumentEntryTest.java @@ -17,6 +17,9 @@ package org.thingsboard.server.service.cf.ctx.state; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.thingsboard.script.api.tbel.TbelCfArg; import org.thingsboard.script.api.tbel.TbelCfPropagationArg; import org.thingsboard.server.common.data.id.AssetId; @@ -31,6 +34,7 @@ import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@ExtendWith(MockitoExtension.class) public class PropagationArgumentEntryTest { private final AssetId ENTITY_1_ID = new AssetId(UUID.fromString("b0a8637d-6d67-43d5-a483-c0e391afe805")); @@ -39,6 +43,9 @@ public class PropagationArgumentEntryTest { private PropagationArgumentEntry entry; + @Mock + private CalculatedFieldCtx ctx; + @BeforeEach void setUp() { List propagationEntityIds = new ArrayList<>(); @@ -68,14 +75,14 @@ public class PropagationArgumentEntryTest { @Test void testUpdateEntryWhenSingleEntryPassed() { - assertThatThrownBy(() -> entry.updateEntry(new SingleValueArgumentEntry())) + assertThatThrownBy(() -> entry.updateEntry(new SingleValueArgumentEntry(), ctx)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Unsupported argument entry type for propagation argument entry: SINGLE_VALUE"); } @Test void testUpdateEntryWhenRollingEntryPassed() { - assertThatThrownBy(() -> entry.updateEntry(new TsRollingArgumentEntry(5, 30000L))) + assertThatThrownBy(() -> entry.updateEntry(new TsRollingArgumentEntry(5, 30000L), ctx)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Unsupported argument entry type for propagation argument entry: TS_ROLLING"); } @@ -85,7 +92,7 @@ public class PropagationArgumentEntryTest { var newIds = new ArrayList(List.of(ENTITY_3_ID, ENTITY_1_ID)); var updated = new PropagationArgumentEntry(newIds); - boolean changed = entry.updateEntry(updated); + boolean changed = entry.updateEntry(updated, ctx); assertThat(changed).isTrue(); assertThat(entry.getEntityIds()).containsExactlyElementsOf(newIds); @@ -95,7 +102,7 @@ public class PropagationArgumentEntryTest { void testUpdateEntryClearsWhenNewEntryIsEmpty() { var updatedEmpty = new PropagationArgumentEntry(List.of()); - boolean changed = entry.updateEntry(updatedEmpty); + boolean changed = entry.updateEntry(updatedEmpty, ctx); assertThat(changed).isTrue(); assertThat(entry.getEntityIds()).isEmpty(); @@ -106,7 +113,7 @@ public class PropagationArgumentEntryTest { var added = new PropagationArgumentEntry(); added.setAdded(List.of(ENTITY_3_ID)); - boolean changed = entry.updateEntry(added); + boolean changed = entry.updateEntry(added, ctx); assertThat(changed).isTrue(); assertThat(entry.getEntityIds()).containsExactlyInAnyOrder(ENTITY_1_ID, ENTITY_2_ID, ENTITY_3_ID); @@ -118,7 +125,7 @@ public class PropagationArgumentEntryTest { var added = new PropagationArgumentEntry(); added.setAdded(List.of(ENTITY_2_ID)); - boolean changed = entry.updateEntry(added); + boolean changed = entry.updateEntry(added, ctx); assertThat(changed).isFalse(); assertThat(entry.getEntityIds()).containsExactlyInAnyOrder(ENTITY_1_ID, ENTITY_2_ID); @@ -130,7 +137,7 @@ public class PropagationArgumentEntryTest { var removed = new PropagationArgumentEntry(); removed.setRemoved(ENTITY_2_ID); - boolean changed = entry.updateEntry(removed); + boolean changed = entry.updateEntry(removed, ctx); assertThat(changed).isTrue(); assertThat(entry.getEntityIds()).containsExactlyInAnyOrder(ENTITY_1_ID); @@ -142,7 +149,7 @@ public class PropagationArgumentEntryTest { var removed = new PropagationArgumentEntry(); removed.setRemoved(ENTITY_3_ID); - boolean changed = entry.updateEntry(removed); + boolean changed = entry.updateEntry(removed, ctx); assertThat(changed).isFalse(); assertThat(entry.getEntityIds()).containsExactlyInAnyOrder(ENTITY_1_ID, ENTITY_2_ID); @@ -154,7 +161,7 @@ public class PropagationArgumentEntryTest { var restore = new PropagationArgumentEntry(List.of(ENTITY_1_ID, ENTITY_2_ID, ENTITY_3_ID)); restore.setIgnoreRemovedEntities(true); - boolean changed = entry.updateEntry(restore); + boolean changed = entry.updateEntry(restore, ctx); assertThat(changed).isTrue(); assertThat(entry.getEntityIds()).containsExactlyInAnyOrder(ENTITY_1_ID, ENTITY_2_ID, ENTITY_3_ID); @@ -168,7 +175,7 @@ public class PropagationArgumentEntryTest { var restore = new PropagationArgumentEntry(List.of(ENTITY_1_ID)); restore.setIgnoreRemovedEntities(true); - boolean changed = entry.updateEntry(restore); + boolean changed = entry.updateEntry(restore, ctx); assertThat(changed).isFalse(); // expected no change, since we consider the removal of stale ids as no-op assertThat(entry.getEntityIds()).containsExactlyInAnyOrder(ENTITY_1_ID); @@ -182,7 +189,7 @@ public class PropagationArgumentEntryTest { var restore = new PropagationArgumentEntry(List.of(ENTITY_1_ID, ENTITY_3_ID)); restore.setIgnoreRemovedEntities(true); - boolean changed = entry.updateEntry(restore); + boolean changed = entry.updateEntry(restore, ctx); assertThat(changed).isTrue(); assertThat(entry.getEntityIds()).containsExactlyInAnyOrder(ENTITY_1_ID, ENTITY_3_ID); @@ -197,7 +204,7 @@ public class PropagationArgumentEntryTest { var restore = new PropagationArgumentEntry(List.of(ENTITY_1_ID, ENTITY_2_ID)); restore.setIgnoreRemovedEntities(true); - boolean changed = entry.updateEntry(restore); + boolean changed = entry.updateEntry(restore, ctx); assertThat(changed).isFalse(); assertThat(entry.getEntityIds()).containsExactlyInAnyOrder(ENTITY_1_ID, ENTITY_2_ID); @@ -211,7 +218,7 @@ public class PropagationArgumentEntryTest { var restore = new PropagationArgumentEntry(List.of()); restore.setIgnoreRemovedEntities(true); - boolean changed = entry.updateEntry(restore); + boolean changed = entry.updateEntry(restore, ctx); assertThat(changed).isFalse(); // expected no change, since we consider the removal of stale ids as no-op assertThat(entry.getEntityIds()).isEmpty(); diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesArgumentEntryTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesArgumentEntryTest.java index cc60b249ac..c357e2c30b 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesArgumentEntryTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesArgumentEntryTest.java @@ -17,6 +17,9 @@ package org.thingsboard.server.service.cf.ctx.state; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.kv.BasicTsKvEntry; @@ -30,10 +33,14 @@ import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@ExtendWith(MockitoExtension.class) public class RelatedEntitiesArgumentEntryTest { private RelatedEntitiesArgumentEntry entry; + @Mock + private CalculatedFieldCtx ctx; + private final DeviceId device1 = new DeviceId(UUID.fromString("1984e5f4-9ff0-4187-84ae-e4438bba4c8a")); private final DeviceId device2 = new DeviceId(UUID.fromString("937fc062-1a9d-438f-aa22-55a93fc908b7")); @@ -50,7 +57,7 @@ public class RelatedEntitiesArgumentEntryTest { @Test void testUpdateEntryWhenNotAggEntryPassed() { - assertThatThrownBy(() -> entry.updateEntry(new TsRollingArgumentEntry(5, 30000L))) + assertThatThrownBy(() -> entry.updateEntry(new TsRollingArgumentEntry(5, 30000L), ctx)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Unsupported argument entry type for aggregation argument entry: " + ArgumentEntryType.TS_ROLLING); } @@ -65,7 +72,7 @@ public class RelatedEntitiesArgumentEntryTest { device4, new SingleValueArgumentEntry(device4, new BasicTsKvEntry(ts - 60, new LongDataEntry("key", 23L), 7L)) ), false); - assertThat(entry.updateEntry(relatedEntitiesArgumentEntry)).isTrue(); + assertThat(entry.updateEntry(relatedEntitiesArgumentEntry, ctx)).isTrue(); Map aggInputs = entry.getEntityInputs(); assertThat(aggInputs.size()).isEqualTo(4); @@ -79,7 +86,7 @@ public class RelatedEntitiesArgumentEntryTest { SingleValueArgumentEntry singleEntityArgumentEntry = new SingleValueArgumentEntry(device3, new BasicTsKvEntry(ts - 50, new LongDataEntry("key", 18L), 10L)); - assertThat(entry.updateEntry(singleEntityArgumentEntry)).isTrue(); + assertThat(entry.updateEntry(singleEntityArgumentEntry, ctx)).isTrue(); Map aggInputs = entry.getEntityInputs(); assertThat(aggInputs.size()).isEqualTo(3); @@ -90,7 +97,7 @@ public class RelatedEntitiesArgumentEntryTest { void testUpdateEntryWhenSingleValueArgumentEntryPassedAndEntryByIdExist() { SingleValueArgumentEntry singleEntityArgumentEntry = new SingleValueArgumentEntry(device2, new BasicTsKvEntry(ts - 50, new LongDataEntry("key", 18L), 10L)); - assertThat(entry.updateEntry(singleEntityArgumentEntry)).isTrue(); + assertThat(entry.updateEntry(singleEntityArgumentEntry, ctx)).isTrue(); Map aggInputs = entry.getEntityInputs(); assertThat(aggInputs.size()).isEqualTo(2); diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/SingleValueArgumentEntryTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/SingleValueArgumentEntryTest.java index 4ada355054..e2d287c778 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/SingleValueArgumentEntryTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/SingleValueArgumentEntryTest.java @@ -17,6 +17,9 @@ package org.thingsboard.server.service.cf.ctx.state; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.thingsboard.script.api.tbel.TbelCfArg; import org.thingsboard.script.api.tbel.TbelCfSingleValueArg; import org.thingsboard.server.common.data.kv.JsonDataEntry; @@ -29,10 +32,14 @@ import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@ExtendWith(MockitoExtension.class) public class SingleValueArgumentEntryTest { private SingleValueArgumentEntry entry; + @Mock + private CalculatedFieldCtx ctx; + private final long ts = System.currentTimeMillis(); @BeforeEach @@ -47,48 +54,48 @@ public class SingleValueArgumentEntryTest { @Test void testUpdateEntryWhenRollingEntryPassed() { - assertThatThrownBy(() -> entry.updateEntry(new TsRollingArgumentEntry(5, 30000L))) + assertThatThrownBy(() -> entry.updateEntry(new TsRollingArgumentEntry(5, 30000L), ctx)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Unsupported argument entry type for single value argument entry: " + ArgumentEntryType.TS_ROLLING); } @Test void testUpdateEntryWithTheSameTs() { - assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts, new LongDataEntry("key", 13L), 363L))).isFalse(); + assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts, new LongDataEntry("key", 13L), 363L), ctx)).isFalse(); } @Test void testUpdateEntryWithTheSameTsAndDifferentVersion() { - assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts, new LongDataEntry("key", 13L), 364L))).isTrue(); + assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts, new LongDataEntry("key", 13L), 364L), ctx)).isTrue(); } @Test void testUpdateEntryWhenNewVersionIsNull() { - assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts + 16, new LongDataEntry("key", 13L), null))).isTrue(); + assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts + 16, new LongDataEntry("key", 13L), null), ctx)).isTrue(); assertThat(entry.getValue()).isEqualTo(13L); assertThat(entry.getVersion()).isNull(); } @Test void testUpdateEntryWhenNewVersionIsGreaterThanCurrent() { - assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts + 18, new LongDataEntry("key", 18L), 369L))).isTrue(); + assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts + 18, new LongDataEntry("key", 18L), 369L), ctx)).isTrue(); assertThat(entry.getValue()).isEqualTo(18L); assertThat(entry.getVersion()).isEqualTo(369L); } @Test void testUpdateEntryWhenNewVersionIsLessThanCurrent() { - assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts + 18, new LongDataEntry("key", 18L), 234L))).isFalse(); + assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts + 18, new LongDataEntry("key", 18L), 234L), ctx)).isFalse(); } @Test void testUpdateEntryWhenValueWasNotChanged() { - assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts + 18, new LongDataEntry("key", 11L), 364L))).isTrue(); + assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts + 18, new LongDataEntry("key", 11L), 364L), ctx)).isTrue(); } @Test void testUpdateEntryWithOldTs() { - assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts - 10, new LongDataEntry("key", 14L), 365L))).isFalse(); + assertThat(entry.updateEntry(new SingleValueArgumentEntry(ts - 10, new LongDataEntry("key", 14L), 365L), ctx)).isFalse(); } @Test diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/TsRollingArgumentEntryTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/TsRollingArgumentEntryTest.java index b1f8063857..94b2a7b389 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/TsRollingArgumentEntryTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/TsRollingArgumentEntryTest.java @@ -17,6 +17,9 @@ package org.thingsboard.server.service.cf.ctx.state; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.thingsboard.server.common.data.kv.DoubleDataEntry; import org.thingsboard.server.common.data.kv.StringDataEntry; @@ -26,10 +29,14 @@ import java.util.TreeMap; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@ExtendWith(MockitoExtension.class) public class TsRollingArgumentEntryTest { private TsRollingArgumentEntry entry; + @Mock + private CalculatedFieldCtx ctx; + private final long ts = System.currentTimeMillis(); @BeforeEach @@ -51,7 +58,7 @@ public class TsRollingArgumentEntryTest { void testUpdateEntryWhenSingleValueEntryPassed() { SingleValueArgumentEntry newEntry = new SingleValueArgumentEntry(ts - 10, new DoubleDataEntry("key", 23.0), 123L); - assertThat(entry.updateEntry(newEntry)).isTrue(); + assertThat(entry.updateEntry(newEntry, ctx)).isTrue(); assertThat(entry.getTsRecords()).hasSize(4); assertThat(entry.getTsRecords().get(ts - 10)).isEqualTo(23.0); } @@ -64,7 +71,7 @@ public class TsRollingArgumentEntryTest { values.put(ts - 5, 1.0); newEntry.setTsRecords(values); - assertThat(entry.updateEntry(newEntry)).isTrue(); + assertThat(entry.updateEntry(newEntry, ctx)).isTrue(); assertThat(entry.getTsRecords()).hasSize(5); assertThat(entry.getTsRecords()).isEqualTo(Map.of( ts - 40, 10.0, @@ -79,7 +86,7 @@ public class TsRollingArgumentEntryTest { void testUpdateEntryWhenValueIsNotNumber() { SingleValueArgumentEntry newEntry = new SingleValueArgumentEntry(ts - 10, new StringDataEntry("key", "string"), 123L); - assertThat(entry.updateEntry(newEntry)).isTrue(); + assertThat(entry.updateEntry(newEntry, ctx)).isTrue(); assertThat(entry.getTsRecords().get(ts - 10)).isNaN(); } @@ -93,7 +100,7 @@ public class TsRollingArgumentEntryTest { newEntry.setTsRecords(values); entry = new TsRollingArgumentEntry(3, 30000L); - assertThat(entry.updateEntry(newEntry)).isTrue(); + assertThat(entry.updateEntry(newEntry, ctx)).isTrue(); assertThat(entry.getTsRecords()).hasSize(1); assertThat(entry.getTsRecords()).isEqualTo(Map.of( ts - 5, 0.0 @@ -111,7 +118,7 @@ public class TsRollingArgumentEntryTest { newEntry.setTsRecords(values); entry = new TsRollingArgumentEntry(3, 30000L); - assertThat(entry.updateEntry(newEntry)).isTrue(); + assertThat(entry.updateEntry(newEntry, ctx)).isTrue(); assertThat(entry.getTsRecords()).hasSize(3); assertThat(entry.getTsRecords()).isEqualTo(Map.of( ts - 18, 0.0, From 860195426c163f980513a367a1634deea6de3bb7 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Mon, 29 Dec 2025 12:36:57 +0200 Subject: [PATCH 107/579] UI: Fixed loading state in login pages --- .../login/pages/login/create-password.component.ts | 10 +++++----- .../modules/login/pages/login/login.component.html | 6 +++--- .../app/modules/login/pages/login/login.component.ts | 11 +++++++---- .../login/pages/login/reset-password.component.ts | 8 ++++---- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts b/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts index 0f2ec26ad3..f0a6bdd0ff 100644 --- a/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts +++ b/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts @@ -20,6 +20,7 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; import { UserPasswordPolicy } from '@shared/models/settings.models'; import { passwordsMatchValidator, passwordStrengthValidator } from '@shared/models/password.models'; +import { finalize } from 'rxjs/operators'; @Component({ selector: 'tb-create-password', @@ -60,11 +61,10 @@ export class CreatePasswordComponent { if (this.createPassword.invalid) { this.createPassword.markAllAsTouched(); } else { - this.isLoading = true - this.authService.activate(this.activateToken, this.createPassword.get('newPassword').value, true) - .subscribe({ - error: () => {this.isLoading = false;} - }); + this.isLoading = true; + this.authService.activate(this.activateToken, this.createPassword.get('newPassword').value, true).pipe( + finalize(() => {this.isLoading = false;}) + ).subscribe(() => {}); } } } diff --git a/ui-ngx/src/app/modules/login/pages/login/login.component.html b/ui-ngx/src/app/modules/login/pages/login/login.component.html index f43ff18435..f2878bde27 100644 --- a/ui-ngx/src/app/modules/login/pages/login/login.component.html +++ b/ui-ngx/src/app/modules/login/pages/login/login.component.html @@ -22,9 +22,9 @@
- + - +
@if(oauth2Clients?.length) { @@ -70,7 +70,7 @@ lock -
-
diff --git a/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts b/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts index f0a6bdd0ff..6e9be088c7 100644 --- a/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts +++ b/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts @@ -21,13 +21,14 @@ import { ActivatedRoute } from '@angular/router'; import { UserPasswordPolicy } from '@shared/models/settings.models'; import { passwordsMatchValidator, passwordStrengthValidator } from '@shared/models/password.models'; import { finalize } from 'rxjs/operators'; +import { PageComponent } from '@shared/components/page.component'; @Component({ selector: 'tb-create-password', templateUrl: './create-password.component.html', styleUrls: ['./password.component.scss'] }) -export class CreatePasswordComponent { +export class CreatePasswordComponent extends PageComponent { passwordPolicy: UserPasswordPolicy; createPassword: FormGroup; @@ -39,7 +40,7 @@ export class CreatePasswordComponent { constructor(private route: ActivatedRoute, private authService: AuthService, private fb: FormBuilder) { - + super(); this.activateToken = this.route.snapshot.queryParams['activateToken'] || ''; this.passwordPolicy = this.route.snapshot.data['passwordPolicy']; From 4e45f82cde00dce0d5acbf6a2d0e6b02c1eb86da Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Tue, 23 Dec 2025 19:24:43 +0200 Subject: [PATCH 114/579] UI: Show create relation only for relation query type --- ...calculated-field-geofencing-zone-groups-panel.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.html index 52c0226275..e09d5b0f4e 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.html @@ -223,7 +223,7 @@
-
+
{{ 'calculated-fields.create-relation-with-matched-zones' | translate }} From 02cc1f3010224978f5ffda30f70e0fc20f766350 Mon Sep 17 00:00:00 2001 From: dshvaika Date: Tue, 30 Dec 2025 12:13:22 +0200 Subject: [PATCH 115/579] cleanup CF integration tests from duplicate doPost API calls --- .../cf/CalculatedFieldIntegrationTest.java | 131 ++++++------------ .../server/controller/AbstractWebTest.java | 2 +- 2 files changed, 46 insertions(+), 87 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java b/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java index fa30dc9025..334755cea9 100644 --- a/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java @@ -20,9 +20,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.NullNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.junit.Test; -import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.AttributeScope; -import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.EntityInfo; import org.thingsboard.server.common.data.EntityType; @@ -76,7 +74,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes public void testSimpleCalculatedFieldWhenAllTelemetryPresent() throws Exception { Device testDevice = createDevice("Test device", "1234567890"); postTelemetry(testDevice.getId(), "{\"temperature\":25}"); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"deviceTemperature\":40}")); + postAttributes(testDevice.getId(), AttributeScope.SERVER_SCOPE, "{\"deviceTemperature\":40}"); CalculatedField calculatedField = new CalculatedField(); calculatedField.setEntityId(testDevice.getId()); @@ -259,15 +257,15 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes @Test public void testSimpleCalculatedFieldWhenEntityIdIsProfile() throws Exception { Device testDevice = createDevice("Test device", "1234567890"); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"x\":40}")); + postAttributes(testDevice.getId(), AttributeScope.SERVER_SCOPE, "{\"x\":40}"); AssetProfile assetProfile = doPost("/api/assetProfile", createAssetProfile("Test Asset Profile"), AssetProfile.class); Asset asset1 = createAsset("Test asset 1", assetProfile.getId()); - doPost("/api/plugins/telemetry/ASSET/" + asset1.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"y\":11}")); + postAttributes(asset1.getId(), AttributeScope.SERVER_SCOPE, "{\"y\":11}"); Asset asset2 = createAsset("Test asset 2", assetProfile.getId()); - doPost("/api/plugins/telemetry/ASSET/" + asset2.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"y\":12}")); + postAttributes(asset2.getId(), AttributeScope.SERVER_SCOPE, "{\"y\":12}"); CalculatedField calculatedField = new CalculatedField(); calculatedField.setEntityId(assetProfile.getId()); @@ -316,7 +314,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes assertThat(z2.get(0).get("value").asText()).isEqualTo("52.0"); }); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"x\":25}")); + postAttributes(testDevice.getId(), AttributeScope.SERVER_SCOPE, "{\"x\":25}"); await().alias("update device telemetry -> recalculate state for all assets").atMost(TIMEOUT, TimeUnit.SECONDS) .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) @@ -332,7 +330,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes assertThat(z2.get(0).get("value").asText()).isEqualTo("37.0"); }); - doPost("/api/plugins/telemetry/ASSET/" + asset1.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"y\":15}")); + postAttributes(asset1.getId(), AttributeScope.SERVER_SCOPE, "{\"y\":15}"); await().alias("update asset 1 telemetry -> recalculate state only for asset 1").atMost(TIMEOUT, TimeUnit.SECONDS) .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) @@ -348,7 +346,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes assertThat(z2.get(0).get("value").asText()).isEqualTo("37.0"); }); - doPost("/api/plugins/telemetry/ASSET/" + asset2.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"y\":5}")); + postAttributes(asset2.getId(), AttributeScope.SERVER_SCOPE, "{\"y\":5}"); await().alias("update asset 2 telemetry -> recalculate state only for asset 2").atMost(TIMEOUT, TimeUnit.SECONDS) .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) @@ -365,7 +363,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes }); Asset asset3 = createAsset("Test asset 3", assetProfile.getId()); - doPost("/api/plugins/telemetry/ASSET/" + asset3.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"y\":13}")); + postAttributes(asset3.getId(), AttributeScope.SERVER_SCOPE, "{\"y\":13}"); Asset finalAsset3 = asset3; await().alias("add new entity to profile -> calculate state for new entity").atMost(TIMEOUT, TimeUnit.SECONDS) @@ -377,7 +375,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes assertThat(z3.get(0).get("value").asText()).isEqualTo("38.0"); }); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"x\":20}")); + postAttributes(testDevice.getId(), AttributeScope.SERVER_SCOPE, "{\"x\":20}"); await().alias("update device telemetry -> recalculate state for all assets").atMost(TIMEOUT, TimeUnit.SECONDS) .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) @@ -403,7 +401,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes asset3.setAssetProfileId(newAssetProfile.getId()); asset3 = doPost("/api/asset", asset3, Asset.class); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"x\":15}")); + postAttributes(testDevice.getId(), AttributeScope.SERVER_SCOPE, "{\"x\":15}"); Asset updatedAsset3 = asset3; await().alias("update device telemetry -> recalculate state for asset 1 and asset 2").atMost(TIMEOUT, TimeUnit.SECONDS) @@ -662,7 +660,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes assertThat(d.get("d").get(0).get("value").asText()).isEqualTo("600"); }); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"a\":10}")); + postTelemetry(testDevice.getId(), "{\"a\":10}"); await().alias("update telemetry -> save result with ts of 'a' argument").atMost(TIMEOUT, TimeUnit.SECONDS) .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) @@ -674,8 +672,8 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes assertThat(keys.get("d").get(0).get("value").asText()).isEqualTo("510"); }); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"b\":20}")); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"c\":30}")); + postTelemetry(testDevice.getId(), "{\"b\":20}"); + postTelemetry(testDevice.getId(), "{\"c\":30}"); await().alias("update telemetry -> save result with latest ts of updated arguments").atMost(TIMEOUT, TimeUnit.SECONDS) .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) @@ -726,7 +724,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes calculatedField = doPost("/api/calculatedField", calculatedField, CalculatedField.class); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"m\":1}")); + postTelemetry(testDevice.getId(), "{\"m\":1}"); await().alias("create CF -> ctx is initialized -> perform calculation").atMost(TIMEOUT, TimeUnit.SECONDS) .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) @@ -740,7 +738,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes calculatedField.setConfiguration(config); calculatedField = doPost("/api/calculatedField", calculatedField, CalculatedField.class); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"m\":2}")); + postTelemetry(testDevice.getId(), "{\"m\":2}"); await().alias("update CF -> ctx is not initialized -> no calculation performed").atMost(TIMEOUT, TimeUnit.SECONDS) .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) @@ -761,15 +759,11 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes // Restricted zone polygon (square) String restrictedPolygon = "[[50.475000, 30.510000], [50.475000, 30.512000], [50.477000, 30.512000], [50.477000, 30.510000]]"; - doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, - JacksonUtil.toJsonNode("{\"allowedZone\":" + allowedPolygon + "}")).andExpect(status().isOk()); - - doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, - JacksonUtil.toJsonNode("{\"restrictedZone\":" + restrictedPolygon + "}")).andExpect(status().isOk()); + postAttributes(device.getId(), AttributeScope.SERVER_SCOPE, "{\"allowedZone\":" + allowedPolygon + "}"); + postAttributes(device.getId(), AttributeScope.SERVER_SCOPE, "{\"restrictedZone\":" + restrictedPolygon + "}"); // Initial device coordinates (inside Allowed, outside Restricted) - doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/timeseries/unusedScope", - JacksonUtil.toJsonNode("{\"latitude\":50.4730,\"longitude\":30.5050}")); + postTelemetry(device.getId(), "{\"latitude\":50.4730,\"longitude\":30.5050}"); // --- Build CF: GEOFENCING --- CalculatedField cf = new CalculatedField(); @@ -817,8 +811,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes doDelete("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/SERVER_SCOPE?keys=allowedZonesStatus,restrictedZonesStatus", String.class); // --- Update restrictedZone by 'restrictedZone' attribute update - doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, - JacksonUtil.toJsonNode("{\"restrictedZone\":" + restrictedPolygon + "}")).andExpect(status().isOk()); + postAttributes(device.getId(), AttributeScope.SERVER_SCOPE, "{\"restrictedZone\":" + restrictedPolygon + "}"); // --- Assert no transition --- // --- Assert attributes updated with the same values for restrictedZones --- @@ -848,30 +841,17 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes String restrictedPolygon = "[[50.475000, 30.510000], [50.475000, 30.512000], [50.477000, 30.512000], [50.477000, 30.510000]]"; Asset allowedZoneAsset = createAsset("Allowed Zone", null); - doPost("/api/plugins/telemetry/ASSET/" + allowedZoneAsset.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, - JacksonUtil.toJsonNode("{\"zone\":" + allowedPolygon + "}")).andExpect(status().isOk()); + postAttributes(allowedZoneAsset.getId(), AttributeScope.SERVER_SCOPE, "{\"zone\":" + allowedPolygon + "}"); Asset restrictedZoneAsset = createAsset("Restricted Zone", null); - doPost("/api/plugins/telemetry/ASSET/" + restrictedZoneAsset.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, - JacksonUtil.toJsonNode("{\"zone\":" + restrictedPolygon + "}")).andExpect(status().isOk()); + postAttributes(restrictedZoneAsset.getId(), AttributeScope.SERVER_SCOPE, "{\"zone\":" + restrictedPolygon + "}"); // Relations from device to zones - EntityRelation deviceToAllowedZoneRelation = new EntityRelation(); - deviceToAllowedZoneRelation.setFrom(device.getId()); - deviceToAllowedZoneRelation.setTo(allowedZoneAsset.getId()); - deviceToAllowedZoneRelation.setType("AllowedZone"); - - EntityRelation deviceToRestrictedZoneRelation = new EntityRelation(); - deviceToRestrictedZoneRelation.setFrom(device.getId()); - deviceToRestrictedZoneRelation.setTo(restrictedZoneAsset.getId()); - deviceToRestrictedZoneRelation.setType("RestrictedZone"); - - doPost("/api/relation", deviceToAllowedZoneRelation).andExpect(status().isOk()); - doPost("/api/relation", deviceToRestrictedZoneRelation).andExpect(status().isOk()); + createEntityRelation(device.getId(), allowedZoneAsset.getId(), "AllowedZone"); + createEntityRelation(device.getId(), restrictedZoneAsset.getId(), "RestrictedZone"); // Initial device coordinates (inside Allowed, outside Restricted) - doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/timeseries/unusedScope", - JacksonUtil.toJsonNode("{\"latitude\":50.4730,\"longitude\":30.5050}")); + postTelemetry(device.getId(), "{\"latitude\":50.4730,\"longitude\":30.5050}"); // --- Build CF: GEOFENCING --- CalculatedField cf = new CalculatedField(); @@ -922,8 +902,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes }); // --- Move the device into Restricted zone (and outside Allowed) --- - doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/timeseries/unusedScope", - JacksonUtil.toJsonNode("{\"latitude\":50.4760,\"longitude\":30.5110}")); + postTelemetry(device.getId(), "{\"latitude\":50.4760,\"longitude\":30.5110}"); // --- Assert transition (LEFT / ENTERED) --- await().alias("transition evaluation after movement") @@ -965,19 +944,13 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes String allowedPolygonA = "[[50.472000, 30.504000], [50.472000, 30.506000], [50.474000, 30.506000], [50.474000, 30.504000]]"; Asset allowedZoneA = createAsset("Allowed Zone A", null); - doPost("/api/plugins/telemetry/ASSET/" + allowedZoneA.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, - JacksonUtil.toJsonNode("{\"zone\":" + allowedPolygonA + "}")).andExpect(status().isOk()); + postAttributes(allowedZoneA.getId(), AttributeScope.SERVER_SCOPE, "{\"zone\":" + allowedPolygonA + "}"); // Relation from device to Allowed Zone A - EntityRelation relAllowedA = new EntityRelation(); - relAllowedA.setFrom(device.getId()); - relAllowedA.setTo(allowedZoneA.getId()); - relAllowedA.setType("AllowedZone"); - doPost("/api/relation", relAllowedA).andExpect(status().isOk()); + createEntityRelation(device.getId(), allowedZoneA.getId(), "AllowedZone"); // Initial device coordinates: INSIDE Zone A - doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/timeseries/unusedScope", - JacksonUtil.toJsonNode("{\"latitude\":50.4730,\"longitude\":30.5050}")).andExpect(status().isOk()); + postTelemetry(device.getId(), "{\"latitude\":50.4730,\"longitude\":30.5050}"); // --- Build CF: GEOFENCING with dynamic 'allowedZones' and short scheduled refresh --- CalculatedField cf = new CalculatedField(); @@ -1024,8 +997,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes }); // --- Move device OUTSIDE Zone A (expect LEFT) --- - doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/timeseries/unusedScope", - JacksonUtil.toJsonNode("{\"latitude\":50.4760,\"longitude\":30.5110}")).andExpect(status().isOk()); + postTelemetry(device.getId(), "{\"latitude\":50.4760,\"longitude\":30.5110}"); await().alias("outside zone A (LEFT)") .atMost(TIMEOUT, TimeUnit.SECONDS) @@ -1042,21 +1014,15 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes String allowedPolygonB = "[[50.475500, 30.510500], [50.475500, 30.511500], [50.476500, 30.511500], [50.476500, 30.510500]]"; Asset allowedZoneB = createAsset("Allowed Zone B", null); - doPost("/api/plugins/telemetry/ASSET/" + allowedZoneB.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, - JacksonUtil.toJsonNode("{\"zone\":" + allowedPolygonB + "}")).andExpect(status().isOk()); + postAttributes(allowedZoneB.getId(), AttributeScope.SERVER_SCOPE, "{\"zone\":" + allowedPolygonB + "}"); // Add a new relation - EntityRelation relAllowedB = new EntityRelation(); - relAllowedB.setFrom(device.getId()); - relAllowedB.setTo(allowedZoneB.getId()); - relAllowedB.setType("AllowedZone"); - doPost("/api/relation", relAllowedB).andExpect(status().isOk()); + createEntityRelation(device.getId(), allowedZoneB.getId(), "AllowedZone"); awaitForCalculatedFieldEntityMessageProcessorToRegisterCfStateAsReadyToRefreshDynamicArguments(device.getId(), savedCalculatedField.getId(), minAllowedScheduledUpdateIntervalInSecForCF); // --- Same coordinates as before, but now we expect INSIDE group status since a new zone is registered --- - doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/timeseries/unusedScope", - JacksonUtil.toJsonNode("{\"latitude\":50.4760,\"longitude\":30.5110}")).andExpect(status().isOk()); + postTelemetry(device.getId(), "{\"latitude\":50.4760,\"longitude\":30.5110}"); // --- Assert dynamic refresh picks up a new relation and flips status back to INSIDE on the next telemetry update --- await().alias("dynamic refresh rebinds allowedZones") @@ -1079,14 +1045,11 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes Asset asset2 = createAsset("Propagated Asset 2", null); // Create relations FROM assets TO device - EntityRelation rel1 = new EntityRelation(asset1.getId(), device.getId(), EntityRelation.CONTAINS_TYPE); - EntityRelation rel2 = new EntityRelation(asset2.getId(), device.getId(), EntityRelation.CONTAINS_TYPE); - doPost("/api/relation", rel1).andExpect(status().isOk()); - doPost("/api/relation", rel2).andExpect(status().isOk()); + createEntityRelation(asset1.getId(), device.getId(), EntityRelation.CONTAINS_TYPE); + createEntityRelation(asset2.getId(), device.getId(), EntityRelation.CONTAINS_TYPE); // Telemetry on device - doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/timeseries/unusedScope", - JacksonUtil.toJsonNode("{\"temperature\":12.5, \"humidity\":85}")).andExpect(status().isOk()); + postTelemetry(device.getId(), "{\"temperature\":12.5, \"humidity\":85}"); // --- Build CF: PROPAGATION with expression --- CalculatedField cf = new CalculatedField(); @@ -1136,8 +1099,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes doDelete(deleteUrl).andExpect(status().isOk()); doDelete("/api/plugins/telemetry/ASSET/" + asset1.getId() + "/SERVER_SCOPE?keys=testResult").andExpect(status().isOk()); - doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/timeseries/unusedScope", - JacksonUtil.toJsonNode("{\"temperature\":25}")).andExpect(status().isOk()); + postTelemetry(device.getId(), "{\"temperature\":25}"); // --- Assert propagated calculation (expression applied with new temperature argument and one relation removed) --- await().alias("propagation expr mode evaluation after temperature update") @@ -1160,10 +1122,8 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes Asset asset2 = createAsset("Propagated Asset 2", null); // Create relations FROM assets TO device - EntityRelation rel1 = new EntityRelation(asset1.getId(), device.getId(), EntityRelation.CONTAINS_TYPE); - EntityRelation rel2 = new EntityRelation(asset2.getId(), device.getId(), EntityRelation.CONTAINS_TYPE); - doPost("/api/relation", rel1).andExpect(status().isOk()); - doPost("/api/relation", rel2).andExpect(status().isOk()); + createEntityRelation(asset1.getId(), device.getId(), EntityRelation.CONTAINS_TYPE); + createEntityRelation(asset2.getId(), device.getId(), EntityRelation.CONTAINS_TYPE); // Telemetry on device long ts = System.currentTimeMillis() - 300000L; @@ -1245,8 +1205,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes }); Asset asset3 = createAsset("Propagated Asset 3", null); - EntityRelation rel3 = new EntityRelation(asset3.getId(), device.getId(), EntityRelation.CONTAINS_TYPE); - doPost("/api/relation", rel3).andExpect(status().isOk()); + createEntityRelation(asset3.getId(), device.getId(), EntityRelation.CONTAINS_TYPE); // --- Assert propagated calculation (arguments-only mode after update) --- await().alias("propagation args-only to new entity after relation creation") @@ -1266,7 +1225,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes @Test public void testCalculatedFieldWhenTheSameTelemetryKeysUsed() throws Exception { Device testDevice = createDevice("Test device", "1234567890"); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"a\":5}")); + postTelemetry(testDevice.getId(), "{\"a\":5}"); CalculatedField calculatedField = new CalculatedField(); calculatedField.setEntityId(testDevice.getId()); @@ -1301,7 +1260,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes assertThat(c.get("c").get(0).get("value").asText()).isEqualTo("10"); }); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"a\":10}")); + postTelemetry(testDevice.getId(), "{\"a\":10}"); await().alias("update telemetry -> recalculate state").atMost(TIMEOUT, TimeUnit.SECONDS) .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) @@ -1316,8 +1275,8 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes public void testCalculatedFieldWhenBatchOfTelemetrySent() throws Exception { Device testDevice = createDevice("Test device", "1234567890"); long now = System.currentTimeMillis(); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode(String.format("{\"ts\": %s, \"values\": {\"a\":5, \"b\":10}}", now - TimeUnit.MINUTES.toMillis(3)))); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode(String.format("{\"ts\": %s, \"values\": {\"b\":20}}", now - TimeUnit.MINUTES.toMillis(1)))); + postTelemetry(testDevice.getId(), String.format("{\"ts\": %s, \"values\": {\"a\":5, \"b\":10}}", now - TimeUnit.MINUTES.toMillis(3))); + postTelemetry(testDevice.getId(), String.format("{\"ts\": %s, \"values\": {\"b\":20}}", now - TimeUnit.MINUTES.toMillis(1))); CalculatedField calculatedField = new CalculatedField(); calculatedField.setEntityId(testDevice.getId()); @@ -1358,7 +1317,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes assertThat(result.get("avgB").get(0).get("value").asText()).isEqualTo("15.0"); }); - doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode(String.format(""" + postTelemetry(testDevice.getId(), String.format(""" [{ "ts": %s, "values": { @@ -1377,7 +1336,7 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes "a": 8, "b": 300 } - }]""", now - TimeUnit.MINUTES.toMillis(2), now, now - TimeUnit.MINUTES.toMillis(5)))); + }]""", now - TimeUnit.MINUTES.toMillis(2), now, now - TimeUnit.MINUTES.toMillis(5))); await().alias("update telemetry -> recalculate state").atMost(TIMEOUT, TimeUnit.SECONDS) .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) diff --git a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java index b9c6e17ded..3df3cf1d20 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java @@ -1143,7 +1143,7 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest { protected void createEntityRelation(EntityId entityIdFrom, EntityId entityIdTo, String typeRelation) throws Exception { EntityRelation relation = new EntityRelation(entityIdFrom, entityIdTo, typeRelation); - doPost("/api/relation", relation); + doPost("/api/relation", relation).andExpect(status().isOk()); } protected void deleteEntityRelation(EntityRelation entityRelation) throws Exception { From dac772b47610a87cb95f3254f61bee25ae3fe026 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Tue, 30 Dec 2025 12:15:27 +0200 Subject: [PATCH 116/579] Fix release notes generation for bugs section --- .github/release.yml | 51 ++++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/.github/release.yml b/.github/release.yml index 53b2e3ae65..1dad5d274f 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -23,27 +23,19 @@ changelog: labels: - 'Major Core' - 'Major Rule Engine' - exclude: - labels: - - 'Bug' + - title: 'Major UI' labels: - 'Major UI' - exclude: - labels: - - 'Bug' + - title: 'Major Transport' labels: - 'Major Transport' - exclude: - labels: - - 'Bug' + - title: 'Major Edge' labels: - 'Major Edge' - exclude: - labels: - - 'Bug' + - title: 'Core & Rule Engine' labels: - 'Core' @@ -51,38 +43,63 @@ changelog: exclude: labels: - 'Bug' + - title: 'UI' labels: - 'UI' exclude: labels: - 'Bug' + - title: 'Transport' labels: - 'Transport' exclude: labels: - 'Bug' + - title: 'Edge' labels: - 'Edge' exclude: labels: - 'Bug' + - title: 'Bug: Core & Rule Engine' labels: - - 'Core' - - 'Rule Engine' - 'Bug' + exclude: + labels: + - 'UI' + - 'Transport' + - 'Edge' + - title: 'Bug: UI' labels: - - 'UI' - 'Bug' + exclude: + labels: + - 'Core' + - 'Rule Engine' + - 'Transport' + - 'Edge' + - title: 'Bug: Transport' labels: - - 'Transport' - 'Bug' + exclude: + labels: + - 'Core' + - 'Rule Engine' + - 'UI' + - 'Edge' + - title: 'Bug: Edge' labels: - - 'Edge' - 'Bug' + exclude: + labels: + - 'Core' + - 'Rule Engine' + - 'UI' + - 'Transport' From 3764dc061d3204eb43d759cc3e5568ff375fb587 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Tue, 30 Dec 2025 16:30:36 +0200 Subject: [PATCH 117/579] UI: Updated cf hint text and updated style selected cf type --- .../calculated-field.component.html | 18 ++++++++++--- .../calculated-field-dialog.component.html | 18 ++++++++++--- ...ntity-aggregation-component.component.html | 4 +-- ...culated-field-metrics-panel.component.html | 5 +++- .../calculated-field-output.component.html | 4 ++- ...ities-aggregation-component.component.html | 2 +- .../simple-configuration.component.html | 10 ++++++-- .../shared/models/calculated-field.models.ts | 12 ++++++--- .../assets/locale/locale.constant-en_US.json | 25 ++++++++++++++----- 9 files changed, 73 insertions(+), 25 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html index 7d4b4b7920..1150b5b2a6 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html @@ -74,13 +74,23 @@ {{ 'common.type' | translate }} + + {{ CalculatedFieldTypeTranslations.has(entityForm.get('type').value) + ? (CalculatedFieldTypeTranslations.get(entityForm.get('type').value).name | translate) + : entityForm.get('type').value }} + @for (type of fieldTypes; track type) { - {{ CalculatedFieldTypeTranslations.get(type).name | translate }} + + + {{ CalculatedFieldTypeTranslations.get(type).name | translate }} + +
+ + {{ CalculatedFieldTypeTranslations.get(type).hint | translate }} + +
}
- @if (CalculatedFieldTypeTranslations.get(entityForm.get('type').value).hint) { - {{ CalculatedFieldTypeTranslations.get(entityForm.get('type').value).hint | translate }} - }
@switch (entityForm.get('type').value) { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html index 293dacdca6..1c4a2995b5 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html @@ -69,13 +69,23 @@ {{ 'common.type' | translate }} + + {{ CalculatedFieldTypeTranslations.has(fieldFormGroup.get('type').value) + ? (CalculatedFieldTypeTranslations.get(fieldFormGroup.get('type').value).name | translate) + : fieldFormGroup.get('type').value }} + @for (type of fieldTypes; track type) { - {{ CalculatedFieldTypeTranslations.get(type).name | translate}} + + + {{ CalculatedFieldTypeTranslations.get(type).name | translate}} + +
+ + {{ CalculatedFieldTypeTranslations.get(type).hint | translate }} + +
}
- @if (CalculatedFieldTypeTranslations.get(fieldFormGroup.get('type').value).hint) { - {{ CalculatedFieldTypeTranslations.get(fieldFormGroup.get('type').value).hint | translate }} - }
@switch (fieldFormGroup.get('type').value) { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.html index 19600f8085..1eb0a63361 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.html @@ -17,7 +17,7 @@ -->
-
+
{{ 'calculated-fields.arguments' | translate }}
@@ -29,7 +29,7 @@ [entityName]="entityName"/>
-
+
{{ 'calculated-fields.metrics.metrics' | translate }}
@if (!simpleMode) {
-
{{ 'calculated-fields.metrics.value-source' | translate }}
+
+ {{ 'calculated-fields.metrics.value-source' | translate }} +
@for (inputType of AggInputTypes; track inputType) { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html index 5bf7788e10..c1d55dd03a 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html @@ -16,7 +16,9 @@ -->
-
{{ 'calculated-fields.output' | translate }}
+
+ {{ 'calculated-fields.output' | translate }} +
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/related-entities-aggregation-configuration/related-entities-aggregation-component.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/related-entities-aggregation-configuration/related-entities-aggregation-component.component.html index d10bf75f06..eb82ecbe70 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/related-entities-aggregation-configuration/related-entities-aggregation-component.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/related-entities-aggregation-configuration/related-entities-aggregation-component.component.html @@ -63,10 +63,10 @@ diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.html index aed0ef8f06..2b1f0cfc01 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/simple-configuration/simple-configuration.component.html @@ -17,7 +17,10 @@ -->
-
{{ 'calculated-fields.arguments' | translate }}
+
+ {{ 'calculated-fields.arguments' | translate }} +
-
{{ (isScript ? 'calculated-fields.type.script' : 'calculated-fields.expression') | translate }}
+
+ {{ (isScript ? 'calculated-fields.type.script' : 'calculated-fields.expression') | translate }} +
diff --git a/ui-ngx/src/app/shared/models/calculated-field.models.ts b/ui-ngx/src/app/shared/models/calculated-field.models.ts index 30f5a27686..b0c2c1a899 100644 --- a/ui-ngx/src/app/shared/models/calculated-field.models.ts +++ b/ui-ngx/src/app/shared/models/calculated-field.models.ts @@ -99,16 +99,20 @@ interface CalculatedFieldTypeTranslate { export const CalculatedFieldTypeTranslations = new Map( [ [CalculatedFieldType.SIMPLE, { - name: 'calculated-fields.type.simple' + name: 'calculated-fields.type.simple', + hint: 'calculated-fields.type.simple-hint', }], [CalculatedFieldType.SCRIPT, { - name: 'calculated-fields.type.script' + name: 'calculated-fields.type.script', + hint: 'calculated-fields.type.script-hint', }], [CalculatedFieldType.GEOFENCING, { - name: 'calculated-fields.type.geofencing' + name: 'calculated-fields.type.geofencing', + hint: 'calculated-fields.type.geofencing-hint', }], [CalculatedFieldType.PROPAGATION, { - name: 'calculated-fields.type.propagation' + name: 'calculated-fields.type.propagation', + hint: 'calculated-fields.type.propagation-hint', }], [CalculatedFieldType.RELATED_ENTITIES_AGGREGATION, { name: 'calculated-fields.type.related-entities-aggregation', 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 259008791e..e6ce6ccdc0 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -1104,11 +1104,15 @@ "selected-fields": "{ count, plural, =1 {1 calculated field} other {# calculated fields} } selected", "type": { "simple": "Simple", + "simple-hint": "Simple arithmetic calculation based on input arguments.", "script": "Script", + "script-hint": "Calculation over defined arguments using a TBEL script.", "geofencing" : "Geofencing", + "geofencing-hint" : "Evaluation of entity GPS position and transitions against configured geofencing zone groups.", "propagation": "Propagation", + "propagation-hint": "Propagation of data to parent or child entities based on relation direction and type.", "related-entities-aggregation": "Related entities aggregation", - "related-entities-aggregation-hint": "Aggregation of data from related entities.", + "related-entities-aggregation-hint": "Aggregation of latest data from related entities.", "time-series-data-aggregation": "Time series data aggregation", "time-series-data-aggregation-hint": "Aggregation of historical data from a current entity." }, @@ -1151,6 +1155,7 @@ "asset-name": "Asset name", "timeseries": "Time series", "output": "Output", + "output-hint": "Defines how output is processed.", "create": "Create new calculated field", "file": "Calculated field file", "invalid-file-error": "Invalid file format. Please make sure the file is a valid JSON file.", @@ -1217,6 +1222,7 @@ "aggregation-path-related-entities": "Aggregation path to related entities", "deduplication-interval": "Deduplication interval", "deduplication-interval-min": "Deduplication interval should be at least {{ sec }} seconds.", + "deduplication-interval-hint": "Minimum time between telemetry aggregations.", "deduplication-interval-required": "Deduplication interval is required.", "calculated-field-filter-title": "Calculated field filter", "filter-title": "Filter", @@ -1245,6 +1251,7 @@ }, "filtered": "Filtered", "value-source": "Value source", + "value-source-hint": "Defines how the value for aggregation is obtained.", "value-source-type": { "key": "Key", "function": "Function" @@ -1306,9 +1313,10 @@ "aggregate-period-hint-offset-and-so-on": "Your aggregation interval will be: {{ interval }} and so on.", "entity-aggregation": { "argument-hint": "Data will be fetched from current entity.", + "argument-title-hint": "Defines the input arguments used for aggregation.", "argument-setting-hint": "Latest telemetry is the only available argument type for this calculated field.", "aggregation-interval": "Aggregation interval", - "aggregation-interval-hint": "Defines how often to perform aggregation. Example: every 1 hour aggregates data at 00:00, 01:00, 02:00, etc.", + "aggregation-interval-hint": "Defines how often aggregation is performed. Example: every 1 hour aggregates data at 00:00, 01:00, 02:00, etc. Aggregation results are stored with the timestamp corresponding to the start of the aggregation interval.", "apply-offset": "Apply offset to aggregation interval", "apply-offset-hint": "Defines how much to shift the start of each aggregation period (e.g., +10 minutes - 00:10, 01:10).", "offset-value": "Offset value", @@ -1372,11 +1380,16 @@ "zone-group-refresh-interval-min": "Zone group refresh interval should be at least {{ min }} seconds.", "propagation-path-related-entities": "Defines a direct, single-level path to a related entity based on the selected direction and relation type.", "data-propagate": "Defines the data to be propagated from the arguments configured below. 'Arguments only' uses the retrieved data directly, while 'Expression result' calculates a new value from that data.", - "aggregation-path-related-entities": "Defines a single-level aggregation path via direct relations with parent or child entities based on direction and relation type. Only relations between device, asset, customer, and tenant entities are supported.", - "arguments-aggregation": "Defines input parameters used for filtering and aggregation.", + "aggregation-path-related-entities": "Defines a single-level aggregation path via direct relations with parent or child entities, based on direction and relation type. Only relations between device, asset, customer, and tenant entities are supported.", + "arguments-aggregation": "Defines the input arguments used for filtering and aggregation.", "setting-arguments-aggregation": "Data will be fetched from related entities configured in aggregation path.", - "metrics": "Defines metrics aggregated based on the configured arguments.", - "import-invalid-calculated-field-type": "Unable to import calculated field: Invalid calculated field structure." + "metrics": "Defines metrics aggregated based on configured arguments.", + "entity-aggregation-metrics": "Defines metrics aggregated based on configured arguments over the specified time intervals.", + "import-invalid-calculated-field-type": "Unable to import calculated field: Invalid calculated field structure.", + "simple-expression-title": "Arithmetic expression that defines how the calculated value is computed.", + "script-title": "TBEL script that defines the calculation logic and output values.", + "simple-arguments": "Arithmetic expression that defines how the calculated value is computed.", + "script-arguments": "Defines the input arguments available to the script." } }, "alarm-rule": { From 5bf087eec4123625d34861e0af7ea114ac851797 Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Wed, 31 Dec 2025 13:48:59 +0200 Subject: [PATCH 118/579] UI: Fixed for alarm rule and calculated fields page --- .../alarm-rule-dialog.component.html | 4 +- .../alarm-rule-dialog.component.ts | 17 ++++++- .../alarm-rules/alarm-rules.component.html | 3 +- .../alarm-rules/alarm-rules.component.ts | 40 ++++++++++++---- ...f-alarm-rule-condition-dialog.component.ts | 12 +++-- .../cf-alarm-rule-condition.component.html | 12 ++--- .../cf-alarm-rule-condition.component.ts | 47 +++++++++---------- .../calculated-field.component.ts | 26 +++++++++- .../calculated-fields-table-config.ts | 2 +- .../calculated-field-dialog.component.html | 6 +-- .../calculated-field-dialog.component.ts | 12 +++++ ...-geofencing-zone-groups-panel.component.ts | 1 + .../geofencing-configuration.component.ts | 14 ++++-- .../entity/entity-select.component.html | 1 + .../entity/entity-select.component.ts | 9 +++- .../string-items-list.component.html | 4 +- .../components/string-items-list.component.ts | 4 +- .../shared/models/calculated-field.models.ts | 2 +- .../assets/locale/locale.constant-en_US.json | 2 +- 19 files changed, 153 insertions(+), 65 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html index ed936cd60e..2c3767c4c8 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.html @@ -59,6 +59,7 @@
@if (!data.entityId) {
@@ -134,6 +135,7 @@ placeholder="{{ 'alarm-rule.alarm-rule-relation-types-list' | translate }}" hint="{{ 'alarm-rule.alarm-rule-relation-types-list-hint' | translate }}" [predefinedValues]="predefinedTypeValues" + allowUserValue formControlName="propagateRelationTypes"> } diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts index 854f7fb1a0..f0d3140ed0 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts @@ -14,7 +14,7 @@ /// limitations under the License. /// -import { Component, DestroyRef, Inject, ViewEncapsulation } from '@angular/core'; +import { Component, DestroyRef, Inject, ViewChild, ViewEncapsulation } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @@ -43,6 +43,10 @@ import { RelationTypes } from "@shared/models/relation.models"; import { StringItemsOption } from "@shared/components/string-items-list.component"; import { BaseData } from "@shared/models/base-data"; import { CalculatedFieldFormService } from '@core/services/calculated-field-form.service'; +import { EntitySelectComponent } from '@shared/components/entity/entity-select.component'; +import { NULL_UUID } from '@shared/models/id/has-uuid'; +import { AssetInfo } from '@shared/models/asset.models'; +import { DeviceInfo } from '@shared/models/device.models'; export interface AlarmRuleDialogData { value?: CalculatedField; @@ -64,6 +68,8 @@ export interface AlarmRuleDialogData { }) export class AlarmRuleDialogComponent extends DialogComponent { + @ViewChild('entitySelect') entitySelect!: EntitySelectComponent; + fieldFormGroup: FormGroup ; additionalDebugActionConfig = this.data.value?.id ? { @@ -80,6 +86,7 @@ export class AlarmRuleDialogComponent extends DialogComponent): void { this.entityName = entity.name; + if (this.isAssignedToCustomer(entity as AssetInfo | DeviceInfo)) { + this.ownerId = (entity as AssetInfo | DeviceInfo).customerId; + } + } + + private isAssignedToCustomer(entity: AssetInfo | DeviceInfo): boolean { + return entity && entity.customerId && entity.customerId.id !== NULL_UUID; } } diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.html index 64f4ab652f..32107f6eda 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.html @@ -68,7 +68,7 @@ required entityTypeLabel="{{ 'entity.entity-type' | translate }}" [filterAllowedEntityTypes]="false" - [allowedEntityTypes]="calculatedFieldsEntityTypeList" + [allowedEntityTypes]="alarmRuleEntityTypeList" (entityChanged)="changeEntity($event)">
@@ -137,6 +137,7 @@ placeholder="{{ 'alarm-rule.alarm-rule-relation-types-list' | translate }}" hint="{{ 'alarm-rule.alarm-rule-relation-types-list-hint' | translate }}" [predefinedValues]="predefinedTypeValues" + allowUserValue formControlName="propagateRelationTypes"> } diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts index fb92f6c4fd..0092bf2132 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts @@ -25,7 +25,6 @@ import { CalculatedFieldArgument, CalculatedFieldConfiguration, CalculatedFieldInfo, - calculatedFieldsEntityTypeList, CalculatedFieldType } from '@shared/models/calculated-field.models'; import { EntityId } from '@shared/models/id/entity-id'; @@ -39,8 +38,17 @@ import { import { TenantId } from '@shared/models/id/tenant-id'; import { StringItemsOption } from '@shared/components/string-items-list.component'; import { RelationTypes } from '@shared/models/relation.models'; -import { AlarmRule, AlarmRuleConditionType, AlarmRuleExpressionType } from '@shared/models/alarm-rule.models'; +import { + AlarmRule, + AlarmRuleConditionType, + alarmRuleEntityTypeList, + AlarmRuleExpressionType +} from '@shared/models/alarm-rule.models'; import { CalculatedFieldFormService } from '@core/services/calculated-field-form.service'; +import { AssetInfo } from '@shared/models/asset.models'; +import { DeviceInfo } from '@shared/models/device.models'; +import { NULL_UUID } from '@shared/models/id/has-uuid'; +import { EntityService } from '@core/http/entity.service'; @Component({ selector: 'tb-alarm-rules', @@ -55,10 +63,10 @@ export class AlarmRulesComponent extends EntityComponent { - this.entityForm.patchValue({ configuration, debugSettings, entityId, ...value }, {emitEvent: false}); - }); + this.entityForm.patchValue({ configuration, debugSettings, entityId, ...value }, {emitEvent: false}); if (!entityId) { this.entityForm.get('configuration').disable({emitEvent: false}); } @@ -134,6 +141,7 @@ export class AlarmRulesComponent extends EntityComponent { + if (this.isAssignedToCustomer(entity)) { + this.ownerId = entity.customerId; + } + } + ); + } + } + + private isAssignedToCustomer(entity: AssetInfo | DeviceInfo): boolean { + return entity && entity.customerId && entity.customerId.id !== NULL_UUID; + } + } diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition-dialog.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition-dialog.component.ts index 20ad4a4bfb..6f691ecd21 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition-dialog.component.ts @@ -184,11 +184,13 @@ export class CfAlarmRuleConditionDialogComponent extends DialogComponent { this.updateStaticValueValidator(AlarmRuleConditionType.DURATION, mode); + this.updateSpecText(this.conditionFormGroup.get('type').value); }); this.repeatingDynamicModeControl.valueChanges.pipe( takeUntilDestroyed() ).subscribe((mode) => { this.updateStaticValueValidator(AlarmRuleConditionType.REPEATING, mode); + this.updateSpecText(this.conditionFormGroup.get('type').value); }); this.updateValidators(this.conditionFormGroup.get('type').value ?? AlarmRuleConditionType.SIMPLE); @@ -289,20 +291,20 @@ export class CfAlarmRuleConditionDialogComponent extends DialogComponent
{{ 'alarm-rule.condition' | translate }}
-
{{ 'alarm-rule.schedule-title' | translate }}
-
diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.ts index 7a2ad22fdd..0fcb6d0135 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.ts @@ -137,23 +137,27 @@ export class CfAlarmRuleConditionComponent implements ControlValueAccessor, Vali writeValue(value: AlarmRuleCondition): void { this.modelValue = value; this.updateConditionInfo(); - if (value && !this.disabled) { - if (this.validate(this.alarmRuleConditionFormGroup)) { - this.onValidatorChange(); - } - } + this.recalculateArgumentValidity(); } ngOnChanges(changes: SimpleChanges) { if (changes.arguments) { - if (changes.arguments && !changes.arguments.firstChange && this.modelValue && !this.disabled) { - if (this.validate(this.alarmRuleConditionFormGroup)) { - this.onValidatorChange(); - } + if (changes.arguments && !changes.arguments.firstChange) { + this.recalculateArgumentValidity(); } } } + private recalculateArgumentValidity(): void { + if (!this.modelValue || !this.arguments) { + this.filtersArgumentsValid = true; + this.schedulerArgumentsValid = true; + return; + } + this.filtersArgumentsValid = this.areFilterAndPredicateArgumentsValid(this.modelValue, this.arguments); + this.schedulerArgumentsValid = this.isScheduleArgumentValid(this.modelValue, Object.keys(this.arguments)); + } + private isScheduleArgumentValid(obj: any, validArguments: string[]): boolean { const arg = obj?.schedule?.dynamicValueArgument; return !arg || validArguments.includes(arg); @@ -177,21 +181,14 @@ export class CfAlarmRuleConditionComponent implements ControlValueAccessor, Vali return true; } - public conditionSet() { - return this.modelValue && (this.modelValue.expression?.expression || this.modelValue.expression?.filters); + public conditionSet(): boolean { + return !!this.modelValue && !!(this.modelValue.expression?.expression || this.modelValue.expression?.filters); } public validate(control: AbstractControl): ValidationErrors | null { - this.filtersArgumentsValid = this.areFilterAndPredicateArgumentsValid(this.modelValue, this.arguments); - this.schedulerArgumentsValid = this.isScheduleArgumentValid(this.modelValue, Object.keys(this.arguments)); - this.onValidatorChange = () => { - control.updateValueAndValidity({ emitEvent: !this.disabled }); - }; - return this.conditionSet() && this.filtersArgumentsValid && this.schedulerArgumentsValid ? null : { - alarmRuleCondition: { - valid: false, - } - }; + const hasCondition = this.conditionSet(); + const argsValid = this.filtersArgumentsValid && this.schedulerArgumentsValid; + return (hasCondition && argsValid) ? null : { alarmRuleCondition: { valid: false } }; } public openFilterDialog($event: Event) { @@ -212,7 +209,6 @@ export class CfAlarmRuleConditionComponent implements ControlValueAccessor, Vali if (result) { this.modelValue = {...this.modelValue, ...result}; this.updateModel(); - this.cd.detectChanges(); } }); } @@ -278,10 +274,10 @@ export class CfAlarmRuleConditionComponent implements ControlValueAccessor, Vali private updateModel() { this.updateConditionInfo(); + this.recalculateArgumentValidity(); this.propagateChange(this.modelValue); - if (this.modelValue) { - this.onValidatorChange(); - } + this.onValidatorChange(); + this.cd.detectChanges(); } public openScheduleDialog($event: Event) { @@ -301,7 +297,6 @@ export class CfAlarmRuleConditionComponent implements ControlValueAccessor, Vali if (result) { this.modelValue.schedule = result; this.updateModel(); - this.cd.detectChanges(); } }); } diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts index 65595fe9b8..fcf20b5421 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts @@ -39,6 +39,10 @@ import { } from '@home/components/calculated-fields/calculated-fields-table-config'; import { TenantId } from '@shared/models/id/tenant-id'; import { CalculatedFieldFormService } from '@core/services/calculated-field-form.service'; +import { AssetInfo } from '@shared/models/asset.models'; +import { DeviceInfo } from '@shared/models/device.models'; +import { NULL_UUID } from '@shared/models/id/has-uuid'; +import { EntityService } from '@core/http/entity.service'; @Component({ selector: 'tb-calculated-field', @@ -55,7 +59,7 @@ export class CalculatedFieldComponent extends EntityComponent { + if (this.isAssignedToCustomer(entity)) { + this.ownerId = entity.customerId; + } + } + ); + } + } + + private isAssignedToCustomer(entity: AssetInfo | DeviceInfo): boolean { + return entity && entity.customerId && entity.customerId.id !== NULL_UUID; + } } diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts index e09949d2c6..49cc6b75ca 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table-config.ts @@ -333,7 +333,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig { - if (calculatedField.type === CalculatedFieldType.ALARM) { + if (calculatedField.type === CalculatedFieldType.ALARM || !CalculatedFieldType[calculatedField.type]) { this.store.dispatch(new ActionNotificationShow({ message: this.translate.instant('calculated-fields.hint.import-invalid-calculated-field-type'), type: 'error', diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html index 1c4a2995b5..4aba05c99e 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.html @@ -94,7 +94,7 @@ [class.tb-form-panel-disabled]="disabledConfiguration" [entityId]="entityId" [entityName]="entityName" - [ownerId]="data.ownerId" + [ownerId]="ownerId" [tenantId]="data.tenantId" > } @@ -104,7 +104,7 @@ [entityId]="entityId" [entityName]="entityName" [tenantId]="data.tenantId" - [ownerId]="data.ownerId" + [ownerId]="ownerId" [testScript]="onTestScript.bind(this)" > } @@ -130,7 +130,7 @@ [class.tb-form-panel-disabled]="disabledConfiguration" [entityId]="entityId" [entityName]="entityName" - [ownerId]="data.ownerId" + [ownerId]="ownerId" [tenantId]="data.tenantId" [isScript]="fieldFormGroup.get('type').value === CalculatedFieldType.SCRIPT" [testScript]="onTestScript.bind(this)" diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts index ee38fb2a2d..7f1c9e376a 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts @@ -39,6 +39,9 @@ import { deepTrim } from '@core/utils'; import { BaseData } from '@shared/models/base-data'; import { CalculatedFieldFormService } from '@core/services/calculated-field-form.service'; import { FormGroup } from '@angular/forms'; +import { AssetInfo } from '@shared/models/asset.models'; +import { DeviceInfo } from '@shared/models/device.models'; +import { NULL_UUID } from '@shared/models/id/has-uuid'; export interface CalculatedFieldDialogData { value?: CalculatedField; @@ -69,6 +72,7 @@ export class CalculatedFieldDialogComponent extends DialogComponent): void { this.entityName = entity.name; + if (this.isAssignedToCustomer(entity as AssetInfo | DeviceInfo)) { + this.ownerId = (entity as AssetInfo | DeviceInfo).customerId; + } } get entityId(): EntityId { @@ -163,4 +171,8 @@ export class CalculatedFieldDialogComponent extends DialogComponent ): void { this.entityChanged.emit(entity); } + + entityAutocompleteMarkAsTouched() { + this.entityAutocompleteComponent.markAsTouched(); + } } diff --git a/ui-ngx/src/app/shared/components/string-items-list.component.html b/ui-ngx/src/app/shared/components/string-items-list.component.html index 0469be2589..bcd0076269 100644 --- a/ui-ngx/src/app/shared/components/string-items-list.component.html +++ b/ui-ngx/src/app/shared/components/string-items-list.component.html @@ -52,7 +52,9 @@ @for (value of filteredValues | async; track value.value) { } @empty { - {{ 'common.not-found' | translate }} + @if (!allowUserValue) { + {{ 'common.not-found' | translate }} + } } diff --git a/ui-ngx/src/app/shared/components/string-items-list.component.ts b/ui-ngx/src/app/shared/components/string-items-list.component.ts index 1c210fdf1f..ab9f1f5831 100644 --- a/ui-ngx/src/app/shared/components/string-items-list.component.ts +++ b/ui-ngx/src/app/shared/components/string-items-list.component.ts @@ -210,8 +210,8 @@ export class StringItemsListComponent implements ControlValueAccessor, OnInit { addOnBlur(event: FocusEvent) { const target: HTMLElement = event.relatedTarget as HTMLElement; - if (target && target.tagName !== 'MAT-OPTION') { - this.addItem(this.stringItemInput.nativeElement.value ?? '') + if ((target && target.tagName !== 'MAT-OPTION') || this.allowUserValue) { + this.addItem(this.stringItemInput.nativeElement.value ?? ''); } this.onTouched(); } diff --git a/ui-ngx/src/app/shared/models/calculated-field.models.ts b/ui-ngx/src/app/shared/models/calculated-field.models.ts index b0c2c1a899..db3da4235e 100644 --- a/ui-ngx/src/app/shared/models/calculated-field.models.ts +++ b/ui-ngx/src/app/shared/models/calculated-field.models.ts @@ -525,7 +525,7 @@ export const ArgumentEntityTypeParamsMap =new Map { - switch (entityId.entityType) { + switch (entityId?.entityType) { case EntityType.ASSET_PROFILE: return { assetTypes: [entityName], 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 e6ce6ccdc0..eaad687821 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -1434,7 +1434,7 @@ "condition-during": "During {{during}}", "condition-during-dynamic": "During \"{{ attribute }}\"", "condition-repeat-times": "Repeats { count, plural, =1 {1 time} other {# times} }", - "condition-repeat-times-dynamic": "Repeats \"{{ attribute }}\"", + "condition-repeat-times-dynamic": "Repeats \"{{ attribute }}\" times", "filter-preview": "Filter preview", "condition-settings": "Condition settings", "static": "Static", From 276c3064b029c3103268192b1d32cc743321e277 Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Fri, 2 Jan 2026 16:38:27 +0200 Subject: [PATCH 119/579] UI: Preview for argument table --- ...ulated-field-argument-panel.component.html | 16 ++++--- ...lculated-field-argument-panel.component.ts | 6 +++ ...lated-field-arguments-table.component.html | 43 ++++++++++++------- ...culated-field-arguments-table.component.ts | 3 +- ...eofencing-zone-groups-panel.component.html | 16 ++++--- ...-geofencing-zone-groups-panel.component.ts | 5 +++ ...eofencing-zone-groups-table.component.html | 39 +++++++++++------ ...-geofencing-zone-groups-table.component.ts | 3 +- ...culated-field-metrics-panel.component.html | 20 +++++---- ...alculated-field-metrics-panel.component.ts | 7 ++- ...culated-field-metrics-table.component.html | 29 +++++++++---- ...alculated-field-metrics-table.component.ts | 5 ++- .../assets/locale/locale.constant-en_US.json | 1 + 13 files changed, 126 insertions(+), 67 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.html index 30533dc714..484f1f9238 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.html @@ -188,13 +188,15 @@ (click)="cancel()"> {{ 'action.cancel' | translate }} - + @if (!readonly) { + + }
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.ts index 51d14c9478..d6271409f8 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.ts @@ -88,6 +88,7 @@ export class CalculatedFieldArgumentPanelComponent implements OnInit, AfterViewI maxlength: 'calculated-fields.hint.argument-name-max-length', forbidden: 'calculated-fields.hint.argument-name-forbidden' }; + @Input() readonly = false; @ViewChild('entityAutocomplete') entityAutocomplete: EntityAutocompleteComponent; @@ -176,6 +177,11 @@ export class CalculatedFieldArgumentPanelComponent implements OnInit, AfterViewI this.argumentTypes = Object.values(ArgumentType) .filter(type => type !== ArgumentType.Rolling || this.isScript); + + if (this.readonly) { + this.argumentType.disable({emitEvent: false}); + this.argumentFormGroup.disable({emitEvent: false}); + } } ngAfterViewInit(): void { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.html index 99b4225db2..c61ce4c467 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.html @@ -93,22 +93,33 @@
- + @if (disable) { + + } @else { + + } - + @if (!readonly) { + + }
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.ts index 3484e717cb..9216eaa12c 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.ts @@ -71,6 +71,7 @@ export class CalculatedFieldGeofencingZoneGroupsPanelComponent implements OnInit @Input() entityName: string; @Input() ownerId: EntityId; @Input() usedNames: string[]; + @Input() readonly = false; @ViewChild('entityAutocomplete') entityAutocomplete: EntityAutocompleteComponent; @@ -160,6 +161,10 @@ export class CalculatedFieldGeofencingZoneGroupsPanelComponent implements OnInit this.currentEntityFilter = getCalculatedFieldCurrentEntityFilter(this.entityName, this.entityId); this.updateEntityFilter(this.zone.refEntityId?.entityType); + + if (this.readonly) { + this.geofencingFormGroup.disable({emitEvent: false}); + } } fetchOptions(searchText: string): Observable> { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.html index fa0ba32f22..d661f5021a 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.html @@ -96,20 +96,31 @@
- + @if (disable) { + + } @else { + + } @@ -119,7 +119,7 @@
@@ -213,12 +213,14 @@ (click)="cancel()"> {{ 'action.cancel' | translate }} - + @if (!readonly) { + + }
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts index 811f7b87fa..49dca514d2 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts @@ -42,7 +42,7 @@ interface CalculatedFieldAggMetricValuePanel extends CalculatedFieldAggMetricVal @Component({ selector: 'tb-calculated-field-metrics-panel', templateUrl: './calculated-field-metrics-panel.component.html', - styleUrl: '../common/calculated-field-panel.scss', + styleUrls: ['../common/calculated-field-panel.scss', '../../calculated-field.component.scss'], }) export class CalculatedFieldMetricsPanelComponent implements OnInit { @@ -54,6 +54,7 @@ export class CalculatedFieldMetricsPanelComponent implements OnInit { @Input() editorCompleter: TbEditorCompleter; @Input() highlightRules: AceHighlightRules; @Input({required: true}) testScript: (expression?: string) => Observable; + @Input() readonly = false; metricDataApplied = output(); filterExpanded = false; @@ -107,6 +108,10 @@ export class CalculatedFieldMetricsPanelComponent implements OnInit { if (this.simpleMode) { this.AggFunctions = this.AggFunctions.filter(aggFunc => aggFunc !== AggFunction.COUNT_UNIQUE); } + + if (this.readonly) { + this.metricForm.disable({emitEvent: false}); + } } saveMetric(): void { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.html index 4693d3afb4..3b50b9e152 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.html @@ -93,15 +93,26 @@
- + @if (disable) { + + } @else { + + }
} @else { - } diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.ts index 94b9e19056..1ec89e411a 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.ts @@ -326,6 +326,6 @@ export class CalculatedFieldGeofencingZoneGroupsPanelComponent implements OnInit } get dragEnabled(): boolean { - return this.levelsFormArray().controls.length > 1; + return this.levelsFormArray().controls.length > 1 && !this.readonly; } } diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.html index 8d6fc37073..1eeb4d4d5d 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.html @@ -182,7 +182,7 @@ matTooltip="{{ 'calculated-fields.test-script-function' | translate }}" matTooltipPosition="above" class="tb-mat-32" - [disabled]="!arguments.length" + [disabled]="!arguments.length || readonly" (click)="onTestScript('input.function')"> bug_report @@ -191,7 +191,7 @@
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts index 49dca514d2..e8c8c4984a 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts @@ -24,6 +24,8 @@ import { AggInputType, AggInputTypeTranslations, CalculatedFieldAggMetricValue, + calculatedFieldMetricFilterDefaultScript, + calculatedFieldMetricMapDefaultScript, FORBIDDEN_NAMES, forbiddenNamesValidator, uniqueNameValidator @@ -64,11 +66,11 @@ export class CalculatedFieldMetricsPanelComponent implements OnInit { name: ['', [Validators.required, forbiddenNamesValidator(FORBIDDEN_NAMES), Validators.pattern(charsWithNumRegex), Validators.maxLength(255)]], function: [AggFunction.AVG], allowFilter: [false], - filter: ['', Validators.required], + filter: [calculatedFieldMetricFilterDefaultScript, Validators.required], input: this.fb.group({ type: [AggInputType.key], key: ['', Validators.required], - function: ['', Validators.required], + function: [calculatedFieldMetricMapDefaultScript, Validators.required], }), defaultValue: [null] }); diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html index c1d55dd03a..b0005cad7a 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html @@ -30,7 +30,7 @@ @if (outputForm.get('type').value === OutputType.Attribute - && (entityId.entityType === EntityType.DEVICE || entityId.entityType === EntityType.DEVICE_PROFILE)) { + && (entityId?.entityType === EntityType.DEVICE || entityId?.entityType === EntityType.DEVICE_PROFILE)) { {{ 'calculated-fields.attribute-scope' | translate }} diff --git a/ui-ngx/src/app/modules/home/components/vc/entity-types-version-load.component.html b/ui-ngx/src/app/modules/home/components/vc/entity-types-version-load.component.html index 32da6c4e35..828b5eac1e 100644 --- a/ui-ngx/src/app/modules/home/components/vc/entity-types-version-load.component.html +++ b/ui-ngx/src/app/modules/home/components/vc/entity-types-version-load.component.html @@ -72,7 +72,9 @@ {{ 'version-control.load-relations' | translate }} - + {{ 'version-control.load-calculated-fields' | translate }}
diff --git a/ui-ngx/src/app/shared/models/calculated-field.models.ts b/ui-ngx/src/app/shared/models/calculated-field.models.ts index db3da4235e..9370e59835 100644 --- a/ui-ngx/src/app/shared/models/calculated-field.models.ts +++ b/ui-ngx/src/app/shared/models/calculated-field.models.ts @@ -1083,3 +1083,14 @@ export interface CalculatedFieldsQuery { entities?: Array; name?: Array; } + +export const calculatedFieldMetricFilterDefaultScript = + '// Sample filter script to include only active and unoccupied parking spaces\n' + + '// Goal: Count only parking spaces that are active and currently free\n\n' + + 'return active == true && occupied == false;'; + +export const calculatedFieldMetricMapDefaultScript = + '// Sample map script to convert temperature from Fahrenheit to Celsius\n' + + '// Goal: Apply conversion per entity before aggregation (e.g., for average temperature)\n\n' + + 'var temperatureC = (temperature - 32) / 1.8;\n' + + 'return toFixed(temperatureC, 2);'; 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 26a2c938de..5e083ec165 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -1552,7 +1552,7 @@ "mode": "Mode", "type": "Type", "value-required": "Value is required.", - "min-value": "Value must be 0 or greater.", + "min-value": "Value must be 1 or greater.", "argument-in-use": "Argument is used as general argument.", "import-invalid-alarm-rule-type": "Unable to import alarm rule: Invalid alarm rule structure.", "no-filter-preview": "No filter specified", @@ -7257,7 +7257,7 @@ "load-relations": "Load relations", "load-attributes": "Load attributes", "load-credentials": "Load credentials", - "load-calculated-fields": "Load calculated fields", + "load-calculated-fields": "Load calculated fields and alarm rules", "compare-with-current": "Compare with current", "diff-entity-with-version": "Diff with entity version '{{versionName}}'", "previous-difference": "Previous Difference", From b15ef1c082d7d649dd65bd49bd995be24ebc707b Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Tue, 6 Jan 2026 12:55:56 +0200 Subject: [PATCH 128/579] Redis: add username for ACL auth --- application/src/main/resources/thingsboard.yml | 2 ++ .../server/cache/TBRedisClusterConfiguration.java | 6 ++++++ .../server/cache/TBRedisSentinelConfiguration.java | 8 +++++++- .../server/cache/TBRedisStandaloneConfiguration.java | 5 +++++ transport/coap/src/main/resources/tb-coap-transport.yml | 2 ++ transport/http/src/main/resources/tb-http-transport.yml | 2 ++ transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml | 2 ++ transport/mqtt/src/main/resources/tb-mqtt-transport.yml | 2 ++ transport/snmp/src/main/resources/tb-snmp-transport.yml | 2 ++ 9 files changed, 30 insertions(+), 1 deletion(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index cda7f5782a..5cc3b901ab 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -727,6 +727,8 @@ redis: db: "${REDIS_DB:0}" # db password password: "${REDIS_PASSWORD:}" + # Redis username for ACL authentication (Redis 6.0+). Leave empty for legacy password-only auth + username: "${REDIS_USERNAME:}" # ssl config ssl: # Enable/disable secure connection diff --git a/common/cache/src/main/java/org/thingsboard/server/cache/TBRedisClusterConfiguration.java b/common/cache/src/main/java/org/thingsboard/server/cache/TBRedisClusterConfiguration.java index 0c6599846b..40a1931853 100644 --- a/common/cache/src/main/java/org/thingsboard/server/cache/TBRedisClusterConfiguration.java +++ b/common/cache/src/main/java/org/thingsboard/server/cache/TBRedisClusterConfiguration.java @@ -22,6 +22,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.jedis.JedisClientConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.thingsboard.server.common.data.StringUtils; @Configuration @ConditionalOnMissingBean(TbCaffeineCacheConfiguration.class) @@ -37,6 +38,9 @@ public class TBRedisClusterConfiguration extends TBRedisCacheConfiguration { @Value("${redis.cluster.useDefaultPoolConfig:true}") private boolean useDefaultPoolConfig; + @Value("${redis.username:}") + private String username; + @Value("${redis.password:}") private String password; @@ -47,6 +51,7 @@ public class TBRedisClusterConfiguration extends TBRedisCacheConfiguration { RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration(); clusterConfiguration.setClusterNodes(getNodes(clusterNodes)); clusterConfiguration.setMaxRedirects(maxRedirects); + clusterConfiguration.setUsername(username); clusterConfiguration.setPassword(password); return new JedisConnectionFactory(clusterConfiguration, buildClientConfig()); } @@ -65,4 +70,5 @@ public class TBRedisClusterConfiguration extends TBRedisCacheConfiguration { } return jedisClientConfigurationBuilder.build(); } + } diff --git a/common/cache/src/main/java/org/thingsboard/server/cache/TBRedisSentinelConfiguration.java b/common/cache/src/main/java/org/thingsboard/server/cache/TBRedisSentinelConfiguration.java index 2a4e1b34ac..9c83782071 100644 --- a/common/cache/src/main/java/org/thingsboard/server/cache/TBRedisSentinelConfiguration.java +++ b/common/cache/src/main/java/org/thingsboard/server/cache/TBRedisSentinelConfiguration.java @@ -22,6 +22,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.jedis.JedisClientConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.thingsboard.server.common.data.StringUtils; @Configuration @ConditionalOnMissingBean(TbCaffeineCacheConfiguration.class) @@ -46,6 +47,9 @@ public class TBRedisSentinelConfiguration extends TBRedisCacheConfiguration { @Value("${redis.ssl.enabled:false}") private boolean useSsl; + @Value("${redis.username:}") + private String username; + @Value("${redis.password:}") private String password; @@ -54,9 +58,10 @@ public class TBRedisSentinelConfiguration extends TBRedisCacheConfiguration { redisSentinelConfiguration.setMaster(master); redisSentinelConfiguration.setSentinels(getNodes(sentinels)); redisSentinelConfiguration.setSentinelPassword(sentinelPassword); + redisSentinelConfiguration.setUsername(username); redisSentinelConfiguration.setPassword(password); redisSentinelConfiguration.setDatabase(database); - return new JedisConnectionFactory(redisSentinelConfiguration, buildClientConfig()); + return new JedisConnectionFactory(redisSentinelConfiguration, buildClientConfig()); } private JedisClientConfiguration buildClientConfig() { @@ -73,4 +78,5 @@ public class TBRedisSentinelConfiguration extends TBRedisCacheConfiguration { } return jedisClientConfigurationBuilder.build(); } + } diff --git a/common/cache/src/main/java/org/thingsboard/server/cache/TBRedisStandaloneConfiguration.java b/common/cache/src/main/java/org/thingsboard/server/cache/TBRedisStandaloneConfiguration.java index 39944d5217..029e9c72a8 100644 --- a/common/cache/src/main/java/org/thingsboard/server/cache/TBRedisStandaloneConfiguration.java +++ b/common/cache/src/main/java/org/thingsboard/server/cache/TBRedisStandaloneConfiguration.java @@ -54,6 +54,9 @@ public class TBRedisStandaloneConfiguration extends TBRedisCacheConfiguration { @Value("${redis.db:0}") private Integer db; + @Value("${redis.username:}") + private String username; + @Value("${redis.password:}") private String password; @@ -65,6 +68,7 @@ public class TBRedisStandaloneConfiguration extends TBRedisCacheConfiguration { standaloneConfiguration.setHostName(host); standaloneConfiguration.setPort(port); standaloneConfiguration.setDatabase(db); + standaloneConfiguration.setUsername(username); standaloneConfiguration.setPassword(password); return new JedisConnectionFactory(standaloneConfiguration, buildClientConfig()); } @@ -89,4 +93,5 @@ public class TBRedisStandaloneConfiguration extends TBRedisCacheConfiguration { } return jedisClientConfigurationBuilder.build(); } + } diff --git a/transport/coap/src/main/resources/tb-coap-transport.yml b/transport/coap/src/main/resources/tb-coap-transport.yml index 02ec421366..2227aaddc3 100644 --- a/transport/coap/src/main/resources/tb-coap-transport.yml +++ b/transport/coap/src/main/resources/tb-coap-transport.yml @@ -94,6 +94,8 @@ redis: db: "${REDIS_DB:0}" # db password password: "${REDIS_PASSWORD:}" + # Redis username for ACL authentication (Redis 6.0+). Leave empty for legacy password-only auth + username: "${REDIS_USERNAME:}" ssl: # Enable/disable secure connection enabled: "${TB_REDIS_SSL_ENABLED:false}" diff --git a/transport/http/src/main/resources/tb-http-transport.yml b/transport/http/src/main/resources/tb-http-transport.yml index 7fe35a57d5..638bff9641 100644 --- a/transport/http/src/main/resources/tb-http-transport.yml +++ b/transport/http/src/main/resources/tb-http-transport.yml @@ -127,6 +127,8 @@ redis: db: "${REDIS_DB:0}" # db password password: "${REDIS_PASSWORD:}" + # Redis username for ACL authentication (Redis 6.0+). Leave empty for legacy password-only auth + username: "${REDIS_USERNAME:}" ssl: # Enable/disable secure connection enabled: "${TB_REDIS_SSL_ENABLED:false}" diff --git a/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml b/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml index b1718a2099..de3b33688d 100644 --- a/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml +++ b/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml @@ -94,6 +94,8 @@ redis: db: "${REDIS_DB:0}" # db password password: "${REDIS_PASSWORD:}" + # Redis username for ACL authentication (Redis 6.0+). Leave empty for legacy password-only auth + username: "${REDIS_USERNAME:}" ssl: # Enable/disable secure connection enabled: "${TB_REDIS_SSL_ENABLED:false}" diff --git a/transport/mqtt/src/main/resources/tb-mqtt-transport.yml b/transport/mqtt/src/main/resources/tb-mqtt-transport.yml index 86e5dc5a5b..4378fbaa4e 100644 --- a/transport/mqtt/src/main/resources/tb-mqtt-transport.yml +++ b/transport/mqtt/src/main/resources/tb-mqtt-transport.yml @@ -95,6 +95,8 @@ redis: db: "${REDIS_DB:0}" # db password password: "${REDIS_PASSWORD:}" + # Redis username for ACL authentication (Redis 6.0+). Leave empty for legacy password-only auth + username: "${REDIS_USERNAME:}" ssl: # Enable/disable secure connection enabled: "${TB_REDIS_SSL_ENABLED:false}" diff --git a/transport/snmp/src/main/resources/tb-snmp-transport.yml b/transport/snmp/src/main/resources/tb-snmp-transport.yml index 9dfb9f0b41..a454f6f294 100644 --- a/transport/snmp/src/main/resources/tb-snmp-transport.yml +++ b/transport/snmp/src/main/resources/tb-snmp-transport.yml @@ -94,6 +94,8 @@ redis: db: "${REDIS_DB:0}" # db password password: "${REDIS_PASSWORD:}" + # Redis username for ACL authentication (Redis 6.0+). Leave empty for legacy password-only auth + username: "${REDIS_USERNAME:}" ssl: # Enable/disable secure connection enabled: "${TB_REDIS_SSL_ENABLED:false}" From 4afae09a09fd83729723a1ac31171f93b3ee6ec2 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Tue, 6 Jan 2026 13:05:50 +0200 Subject: [PATCH 129/579] UI: Fixed background flashes when opening the date-time selector --- .../@mat-datetimepicker+core+14.0.0.patch | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/ui-ngx/patches/@mat-datetimepicker+core+14.0.0.patch b/ui-ngx/patches/@mat-datetimepicker+core+14.0.0.patch index 293ac10a21..ac4f7434e9 100644 --- a/ui-ngx/patches/@mat-datetimepicker+core+14.0.0.patch +++ b/ui-ngx/patches/@mat-datetimepicker+core+14.0.0.patch @@ -15,8 +15,39 @@ index 7ecfae7..08363d3 100644 date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this._adapter.getHour(this.activeDate), value); } this._timeChanged = true; +diff --git a/node_modules/@mat-datetimepicker/core/esm2022/datetimepicker/datetimepicker.mjs b/node_modules/@mat-datetimepicker/core/esm2022/datetimepicker/datetimepicker.mjs +index 5b82377..30e35ce 100644 +--- a/node_modules/@mat-datetimepicker/core/esm2022/datetimepicker/datetimepicker.mjs ++++ b/node_modules/@mat-datetimepicker/core/esm2022/datetimepicker/datetimepicker.mjs +@@ -48,7 +48,7 @@ export class MatDatetimepickerContentComponent { + } + } + /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatDatetimepickerContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } +- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: MatDatetimepickerContentComponent, selector: "mat-datetimepicker-content", host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "class.mat-datetimepicker-content-touch": "datetimepicker?.touchUi" }, classAttribute: "mat-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: MatDatetimepickerCalendarComponent, descendants: true, static: true }], ngImport: i0, template: "\n\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:#0009}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"], dependencies: [{ kind: "directive", type: i1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i2.MatDatetimepickerCalendarComponent, selector: "mat-datetimepicker-calendar", inputs: ["multiYearSelector", "startView", "twelvehour", "timeInterval", "dateFilter", "ariaLabel", "ariaNextMonthLabel", "ariaPrevMonthLabel", "ariaNextYearLabel", "ariaPrevYearLabel", "ariaNextMultiYearLabel", "ariaPrevMultiYearLabel", "preventSameDateTimeSelection", "type", "startAt", "selected", "minDate", "maxDate"], outputs: ["_userSelection", "selectedChange", "viewChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } ++ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: MatDatetimepickerContentComponent, selector: "mat-datetimepicker-content", host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "class.mat-datetimepicker-content-touch": "datetimepicker?.touchUi" }, classAttribute: "mat-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: MatDatetimepickerCalendarComponent, descendants: true, static: true }], ngImport: i0, template: "\n\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"], dependencies: [{ kind: "directive", type: i1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i2.MatDatetimepickerCalendarComponent, selector: "mat-datetimepicker-calendar", inputs: ["multiYearSelector", "startView", "twelvehour", "timeInterval", "dateFilter", "ariaLabel", "ariaNextMonthLabel", "ariaPrevMonthLabel", "ariaNextYearLabel", "ariaPrevYearLabel", "ariaNextMultiYearLabel", "ariaPrevMultiYearLabel", "preventSameDateTimeSelection", "type", "startAt", "selected", "minDate", "maxDate"], outputs: ["_userSelection", "selectedChange", "viewChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } + } + i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatDatetimepickerContentComponent, decorators: [{ + type: Component, +@@ -56,7 +56,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor + class: 'mat-datetimepicker-content', + '[class.mat-datetimepicker-content-touch]': 'datetimepicker?.touchUi', + '(keydown)': '_handleKeydown($event)', +- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:#0009}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"] }] ++ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"] }] + }], propDecorators: { _calendar: [{ + type: ViewChild, + args: [MatDatetimepickerCalendarComponent, { static: true }] +@@ -301,7 +301,7 @@ export class MatDatetimepickerComponent { + const overlayConfig = new OverlayConfig({ + positionStrategy: this._createPopupPositionStrategy(), + hasBackdrop: true, +- backdropClass: 'mat-overlay-transparent-backdrop', ++ backdropClass: 'cdk-overlay-transparent-backdrop', + direction: this._dir ? this._dir.value : 'ltr', + scrollStrategy: this._scrollStrategy(), + panelClass: 'mat-datetimepicker-popup', diff --git a/node_modules/@mat-datetimepicker/core/fesm2022/mat-datetimepicker-core.mjs b/node_modules/@mat-datetimepicker/core/fesm2022/mat-datetimepicker-core.mjs -index 00f4a52..df688e3 100644 +index 00f4a52..99c0ac1 100644 --- a/node_modules/@mat-datetimepicker/core/fesm2022/mat-datetimepicker-core.mjs +++ b/node_modules/@mat-datetimepicker/core/fesm2022/mat-datetimepicker-core.mjs @@ -946,9 +946,9 @@ class MatDatetimepickerClockComponent { @@ -32,3 +63,30 @@ index 00f4a52..df688e3 100644 date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this._adapter.getHour(this.activeDate), value); } this._timeChanged = true; +@@ -1911,7 +1911,7 @@ class MatDatetimepickerContentComponent { + } + } + /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatDatetimepickerContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } +- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: MatDatetimepickerContentComponent, selector: "mat-datetimepicker-content", host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "class.mat-datetimepicker-content-touch": "datetimepicker?.touchUi" }, classAttribute: "mat-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: MatDatetimepickerCalendarComponent, descendants: true, static: true }], ngImport: i0, template: "\n\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:#0009}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"], dependencies: [{ kind: "directive", type: i1$2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: MatDatetimepickerCalendarComponent, selector: "mat-datetimepicker-calendar", inputs: ["multiYearSelector", "startView", "twelvehour", "timeInterval", "dateFilter", "ariaLabel", "ariaNextMonthLabel", "ariaPrevMonthLabel", "ariaNextYearLabel", "ariaPrevYearLabel", "ariaNextMultiYearLabel", "ariaPrevMultiYearLabel", "preventSameDateTimeSelection", "type", "startAt", "selected", "minDate", "maxDate"], outputs: ["_userSelection", "selectedChange", "viewChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } ++ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: MatDatetimepickerContentComponent, selector: "mat-datetimepicker-content", host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "class.mat-datetimepicker-content-touch": "datetimepicker?.touchUi" }, classAttribute: "mat-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: MatDatetimepickerCalendarComponent, descendants: true, static: true }], ngImport: i0, template: "\n\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"], dependencies: [{ kind: "directive", type: i1$2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: MatDatetimepickerCalendarComponent, selector: "mat-datetimepicker-calendar", inputs: ["multiYearSelector", "startView", "twelvehour", "timeInterval", "dateFilter", "ariaLabel", "ariaNextMonthLabel", "ariaPrevMonthLabel", "ariaNextYearLabel", "ariaPrevYearLabel", "ariaNextMultiYearLabel", "ariaPrevMultiYearLabel", "preventSameDateTimeSelection", "type", "startAt", "selected", "minDate", "maxDate"], outputs: ["_userSelection", "selectedChange", "viewChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } + } + i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatDatetimepickerContentComponent, decorators: [{ + type: Component, +@@ -1919,7 +1919,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor + class: 'mat-datetimepicker-content', + '[class.mat-datetimepicker-content-touch]': 'datetimepicker?.touchUi', + '(keydown)': '_handleKeydown($event)', +- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:#0009}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"] }] ++ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"] }] + }], propDecorators: { _calendar: [{ + type: ViewChild, + args: [MatDatetimepickerCalendarComponent, { static: true }] +@@ -2164,7 +2164,7 @@ class MatDatetimepickerComponent { + const overlayConfig = new OverlayConfig({ + positionStrategy: this._createPopupPositionStrategy(), + hasBackdrop: true, +- backdropClass: 'mat-overlay-transparent-backdrop', ++ backdropClass: 'cdk-overlay-transparent-backdrop', + direction: this._dir ? this._dir.value : 'ltr', + scrollStrategy: this._scrollStrategy(), + panelClass: 'mat-datetimepicker-popup', From 578c88e59a08363d01dbb30c08e851c606cf4f3c Mon Sep 17 00:00:00 2001 From: Maksym Tsymbarov Date: Tue, 6 Jan 2026 14:12:24 +0200 Subject: [PATCH 130/579] Fixed map action panel hide when open other data layer --- .../components/widget/lib/maps/data-layer/data-layer-utils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/maps/data-layer/data-layer-utils.ts b/ui-ngx/src/app/modules/home/components/widget/lib/maps/data-layer/data-layer-utils.ts index efaf3808b2..895b2f9bb5 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/maps/data-layer/data-layer-utils.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/maps/data-layer/data-layer-utils.ts @@ -44,6 +44,7 @@ export const createTooltip = (map: TbMap, tooltip.close(); } else if (canOpen()) { if ((tooltip as any)._prepareOpen((layer as any)._latlng)) { + map.deselectItem(); tooltip.openOn(map.getMap()); } } From 7dd23bfcf07743225e1cf3edface5c4a75099049 Mon Sep 17 00:00:00 2001 From: Maksym Tsymbarov Date: Tue, 6 Jan 2026 14:12:24 +0200 Subject: [PATCH 131/579] Fixed map action panel hide when open other data layer --- .../components/widget/lib/maps/data-layer/data-layer-utils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/maps/data-layer/data-layer-utils.ts b/ui-ngx/src/app/modules/home/components/widget/lib/maps/data-layer/data-layer-utils.ts index 4b7b933d74..4a8c44919d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/maps/data-layer/data-layer-utils.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/maps/data-layer/data-layer-utils.ts @@ -44,6 +44,7 @@ export const createTooltip = (map: TbMap, tooltip.close(); } else if (canOpen()) { if ((tooltip as any)._prepareOpen((layer as any)._latlng)) { + map.deselectItem(); tooltip.openOn(map.getMap()); } } From 381c368fbe6975def63369688d638857d6ddd5fd Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Tue, 6 Jan 2026 15:57:02 +0200 Subject: [PATCH 132/579] UI: load and export alarm rules only for customer --- .../components/vc/entity-types-version-load.component.html | 2 +- .../home/components/vc/entity-version-create.component.html | 2 +- .../home/components/vc/entity-version-restore.component.html | 2 +- .../home/components/vc/entity-version-restore.component.ts | 3 +++ ui-ngx/src/assets/locale/locale.constant-en_US.json | 1 + 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/vc/entity-types-version-load.component.html b/ui-ngx/src/app/modules/home/components/vc/entity-types-version-load.component.html index 828b5eac1e..f37e58e48a 100644 --- a/ui-ngx/src/app/modules/home/components/vc/entity-types-version-load.component.html +++ b/ui-ngx/src/app/modules/home/components/vc/entity-types-version-load.component.html @@ -75,7 +75,7 @@ - {{ 'version-control.load-calculated-fields' | translate }} + {{ (entityTypeFormGroup.get('entityType').value === entityTypes.CUSTOMER ? 'version-control.load-alarm-rules' : 'version-control.load-calculated-fields') | translate }}
diff --git a/ui-ngx/src/app/modules/home/components/vc/entity-version-create.component.html b/ui-ngx/src/app/modules/home/components/vc/entity-version-create.component.html index 5004160919..f913946b3c 100644 --- a/ui-ngx/src/app/modules/home/components/vc/entity-version-create.component.html +++ b/ui-ngx/src/app/modules/home/components/vc/entity-version-create.component.html @@ -49,7 +49,7 @@ {{ 'version-control.export-relations' | translate }} - {{ 'version-control.export-calculated-fields' | translate }} + {{ (entityId.entityType === entityTypes.CUSTOMER ? 'version-control.export-alarm-rules' : 'version-control.export-calculated-fields') | translate }}
diff --git a/ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.html b/ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.html index e4312e0c98..e2392679e6 100644 --- a/ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.html +++ b/ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.html @@ -37,7 +37,7 @@ {{ 'version-control.load-relations' | translate }} - {{ 'version-control.load-calculated-fields' | translate }} + {{ ( externalEntityId?.entityType === EntityType.CUSTOMER ? 'version-control.load-alarm-rules' : 'version-control.load-calculated-fields') | translate }}
diff --git a/ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.ts b/ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.ts index 4456eb7ce7..a5310deb32 100644 --- a/ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.ts @@ -33,6 +33,7 @@ import { delay, share } from 'rxjs/operators'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { Observable, Subscription } from 'rxjs'; import { parseHttpErrorMessage } from '@core/utils'; +import { EntityType } from '@shared/models/entity-type.models'; @Component({ selector: 'tb-entity-version-restore', @@ -62,6 +63,8 @@ export class EntityVersionRestoreComponent extends PageComponent implements OnIn errorMessage: SafeHtml; + EntityType = EntityType; + versionLoadResult$: Observable; private versionLoadResultSubscription: Subscription; 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 5e083ec165..e4b2353cf9 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -7258,6 +7258,7 @@ "load-attributes": "Load attributes", "load-credentials": "Load credentials", "load-calculated-fields": "Load calculated fields and alarm rules", + "load-alarm-rules": "Load alarm rules", "compare-with-current": "Compare with current", "diff-entity-with-version": "Diff with entity version '{{versionName}}'", "previous-difference": "Previous Difference", From b7581e08e73db708310181b2c7abacab53476726 Mon Sep 17 00:00:00 2001 From: nickAS21 Date: Tue, 6 Jan 2026 16:07:04 +0200 Subject: [PATCH 133/579] fix bug coap unicast/multicast request --- .../callback/AbstractSyncSessionCallback.java | 6 ++++++ .../coap/client/DefaultCoapClientContext.java | 17 +++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/callback/AbstractSyncSessionCallback.java b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/callback/AbstractSyncSessionCallback.java index a1bfb004b8..24ddaadb68 100644 --- a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/callback/AbstractSyncSessionCallback.java +++ b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/callback/AbstractSyncSessionCallback.java @@ -78,6 +78,12 @@ public abstract class AbstractSyncSessionCallback implements SessionMsgListener return false; } } + public static boolean isMulticastRequest(TbCoapObservationState state) { + if (state != null) { + return state.getExchange().advanced().getRequest().isMulticast(); + } + return false; + } protected void respond(Response response) { response.getOptions().setContentFormat(TbCoapContentFormatUtil.getContentFormat(exchange.getRequestOptions().getContentFormat(), state.getContentFormat())); diff --git a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/client/DefaultCoapClientContext.java b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/client/DefaultCoapClientContext.java index 5c17cb75e8..422721f671 100644 --- a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/client/DefaultCoapClientContext.java +++ b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/client/DefaultCoapClientContext.java @@ -19,6 +19,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.eclipse.californium.core.coap.CoAP; import org.eclipse.californium.core.coap.Response; +import org.eclipse.californium.core.config.CoapConfig; import org.eclipse.californium.core.observe.ObserveRelation; import org.eclipse.californium.core.server.resources.CoapExchange; import org.springframework.context.annotation.Lazy; @@ -514,7 +515,8 @@ public class DefaultCoapClientContext implements CoapClientContext { if (attrs != null) { try { boolean conRequest = AbstractSyncSessionCallback.isConRequest(state.getAttrs()); - int requestId = getNextMsgId(); + boolean isMulticastRequest = AbstractSyncSessionCallback.isMulticastRequest(state.getAttrs()); + int requestId = getNextMsgId(isMulticastRequest); Response response = state.getAdaptor().convertToPublish(msg); response.getOptions().setObserve(attrs.getObserveCounter().getAndIncrement()); response.setConfirmable(conRequest); @@ -578,7 +580,8 @@ public class DefaultCoapClientContext implements CoapClientContext { boolean sent = false; String error = null; boolean conRequest = AbstractSyncSessionCallback.isConRequest(state.getRpc()); - int requestId = getNextMsgId(); + boolean isMulticastRequest = AbstractSyncSessionCallback.isMulticastRequest(state.getRpc()); + int requestId = getNextMsgId(isMulticastRequest); try { Response response = state.getAdaptor().convertToPublish(msg, state.getConfiguration().getRpcRequestDynamicMessageBuilder()); response.getOptions().setObserve(state.getRpc().getObserveCounter().getAndIncrement()); @@ -807,8 +810,14 @@ public class DefaultCoapClientContext implements CoapClientContext { } } - protected int getNextMsgId() { - return ThreadLocalRandom.current().nextInt(NONE, MAX_MID + 1); + protected int getNextMsgId(boolean multicast) { + if (multicast) { + // Range [65000...65535] + return ThreadLocalRandom.current().nextInt(CoapConfig.DEFAULT_MULTICAST_BASE_MID, MAX_MID + 1); + } else { + // Range [0...64999] + return ThreadLocalRandom.current().nextInt(NONE, CoapConfig.DEFAULT_MULTICAST_BASE_MID); + } } private void cancelRpcSubscription(TbCoapClientState state) { From a269ee453113db3779a9fe39299b1e4b599ebdf0 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Tue, 6 Jan 2026 17:59:37 +0200 Subject: [PATCH 134/579] UI: Change default sort order in Entities table --- .../src/main/data/json/system/widget_types/entities_table.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/data/json/system/widget_types/entities_table.json b/application/src/main/data/json/system/widget_types/entities_table.json index 51cad956ab..70bba1c7a4 100644 --- a/application/src/main/data/json/system/widget_types/entities_table.json +++ b/application/src/main/data/json/system/widget_types/entities_table.json @@ -16,7 +16,7 @@ "dataKeySettingsDirective": "tb-entities-table-key-settings", "hasBasicMode": true, "basicModeDirective": "tb-entities-table-basic-config", - "defaultConfig": "{\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"4px\",\"settings\":{\"enableSearch\":true,\"enableSelectColumnDisplay\":true,\"enableStickyHeader\":true,\"enableStickyAction\":true,\"reserveSpaceForHiddenAction\":\"true\",\"displayEntityName\":false,\"displayEntityLabel\":false,\"displayEntityType\":false,\"displayPagination\":true,\"defaultPageSize\":10,\"defaultSortOrder\":\"name\",\"useRowStyleFunction\":false,\"entitiesTitle\":\"Entities\"},\"title\":\"Entities table\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400,\"padding\":\"5px 10px 5px 10px\"},\"showLegend\":false,\"datasources\":[{\"type\":\"function\",\"name\":\"Simulated\",\"entityAliasId\":null,\"filterId\":null,\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Entity name\",\"color\":\"#2196f3\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.472295003170325,\"funcBody\":\"return 'Simulated';\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Entity type\",\"color\":\"#607d8b\",\"settings\":{},\"_hash\":0.782057645776538,\"funcBody\":\"return 'Device';\",\"decimals\":null,\"aggregationType\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Sin\",\"color\":\"#4caf50\",\"settings\":{},\"_hash\":0.904797781901171,\"funcBody\":\"return Math.round(1000*Math.sin(time/5000));\",\"decimals\":0},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Cos\",\"color\":\"#f44336\",\"settings\":{},\"_hash\":0.1961430898042078,\"funcBody\":\"return Math.round(1000*Math.cos(time/5000));\",\"decimals\":0},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#ffc107\",\"settings\":{},\"_hash\":0.7678057538205878,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"decimals\":2}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":false,\"titleIcon\":\"list\",\"iconColor\":null}" + "defaultConfig": "{\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"4px\",\"settings\":{\"entitiesTitle\":\"Entities\",\"enableSearch\":true,\"enableSelectColumnDisplay\":true,\"enableStickyHeader\":true,\"enableStickyAction\":true,\"reserveSpaceForHiddenAction\":\"true\",\"displayEntityName\":false,\"displayEntityLabel\":false,\"displayEntityType\":false,\"displayPagination\":true,\"defaultPageSize\":10,\"pageStepCount\":3,\"pageStepIncrement\":10,\"defaultSortOrder\":\"displayName\",\"useRowStyleFunction\":false},\"title\":\"Entities table\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400,\"padding\":\"5px 10px 5px 10px\"},\"showLegend\":false,\"datasources\":[{\"type\":\"function\",\"name\":\"Simulated\",\"entityAliasId\":null,\"filterId\":null,\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Entity name\",\"color\":\"#2196f3\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"funcBody\":\"return 'Simulated';\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Entity type\",\"color\":\"#607d8b\",\"settings\":{},\"funcBody\":\"return 'Device';\",\"decimals\":null,\"aggregationType\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Sin\",\"color\":\"#4caf50\",\"settings\":{},\"funcBody\":\"return Math.round(1000*Math.sin(time/5000));\",\"decimals\":0},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Cos\",\"color\":\"#f44336\",\"settings\":{},\"funcBody\":\"return Math.round(1000*Math.cos(time/5000));\",\"decimals\":0},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#ffc107\",\"settings\":{},\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"decimals\":2}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":false,\"titleIcon\":\"list\",\"iconColor\":null}" }, "resources": [ { From c6af9659fae8cd5d36fe141ca4bc925cf907f95d Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Wed, 7 Jan 2026 12:12:01 +0200 Subject: [PATCH 135/579] Improve NotificationRuleApiTest --- .../notification/AbstractNotificationApiTest.java | 8 +++----- .../service/notification/NotificationRuleApiTest.java | 10 ++++------ 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java b/application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java index f238a1bbc1..a28e2cb10f 100644 --- a/application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java +++ b/application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java @@ -19,9 +19,8 @@ import com.fasterxml.jackson.core.type.TypeReference; import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.util.Pair; -import org.thingsboard.rule.engine.api.MailService; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.thingsboard.rule.engine.api.notification.SlackService; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.id.NotificationRequestId; @@ -69,10 +68,8 @@ public abstract class AbstractNotificationApiTest extends AbstractControllerTest protected NotificationApiWsClient wsClient; protected NotificationApiWsClient otherWsClient; - @MockBean + @MockitoBean protected SlackService slackService; - @Autowired - protected MailService mailService; @Autowired protected NotificationRuleService notificationRuleService; @@ -225,4 +222,5 @@ public abstract class AbstractNotificationApiTest extends AbstractControllerTest public NotificationApiWsClient getAnotherWsClient() { return (NotificationApiWsClient) super.getAnotherWsClient(); } + } diff --git a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java index bab70ea505..d2d8f8a470 100644 --- a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java +++ b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java @@ -812,13 +812,13 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { @Test public void testNotificationsDeduplication_resourcesShortage() throws Exception { loginSysAdmin(); + NotificationTarget sysadmins = createNotificationTarget(new SystemAdministratorsFilter()); ResourcesShortageNotificationRuleTriggerConfig triggerConfig = ResourcesShortageNotificationRuleTriggerConfig.builder() .ramThreshold(0.01f) .cpuThreshold(1f) .storageThreshold(1f) .build(); - createNotificationRule(triggerConfig, "Warning: ${resource} shortage", "${resource} shortage", createNotificationTarget(tenantAdminUserId).getId()); - loginTenantAdmin(); + createNotificationRule(triggerConfig, "Warning: ${resource} shortage", "${resource} shortage", sysadmins.getId()); assertThat(getMyNotifications(false, 100)).size().isZero(); for (int i = 0; i < 10; i++) { @@ -848,13 +848,13 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { @Test public void testNotificationsResourcesShortage_whenThresholdChangeToMatchingFilter_thenSendNotification() throws Exception { loginSysAdmin(); + NotificationTarget sysadmins = createNotificationTarget(new SystemAdministratorsFilter()); ResourcesShortageNotificationRuleTriggerConfig triggerConfig = ResourcesShortageNotificationRuleTriggerConfig.builder() .ramThreshold(1f) .cpuThreshold(1f) .storageThreshold(1f) .build(); - NotificationRule rule = createNotificationRule(triggerConfig, "Warning: ${resource} shortage", "${resource} shortage", createNotificationTarget(tenantAdminUserId).getId()); - loginTenantAdmin(); + NotificationRule rule = createNotificationRule(triggerConfig, "Warning: ${resource} shortage", "${resource} shortage", sysadmins.getId()); Method method = DefaultSystemInfoService.class.getDeclaredMethod("saveCurrentMonolithSystemInfo"); method.setAccessible(true); @@ -863,7 +863,6 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { TimeUnit.SECONDS.sleep(5); assertThat(getMyNotifications(false, 100)).size().isZero(); - loginSysAdmin(); triggerConfig = ResourcesShortageNotificationRuleTriggerConfig.builder() .ramThreshold(0.01f) .cpuThreshold(1f) @@ -871,7 +870,6 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { .build(); rule.setTriggerConfig(triggerConfig); saveNotificationRule(rule); - loginTenantAdmin(); method.invoke(systemInfoService); From c4de8926e40779b6ce39413f22c53f4dc6e190ef Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Wed, 7 Jan 2026 12:34:25 +0200 Subject: [PATCH 136/579] Refactoring after review --- .../EventsDeletionTaskProcessor.java | 23 ++----- .../server/dao/event/EventService.java | 2 + .../server/dao/event/BaseEventService.java | 12 ++-- .../server/dao/event/EventDao.java | 60 +------------------ .../server/dao/sql/event/JpaBaseEventDao.java | 8 ++- .../insert/sql/SqlPartitioningRepository.java | 2 +- 6 files changed, 22 insertions(+), 85 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/housekeeper/processor/EventsDeletionTaskProcessor.java b/application/src/main/java/org/thingsboard/server/service/housekeeper/processor/EventsDeletionTaskProcessor.java index 8a0a1c882f..738249f29c 100644 --- a/application/src/main/java/org/thingsboard/server/service/housekeeper/processor/EventsDeletionTaskProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/housekeeper/processor/EventsDeletionTaskProcessor.java @@ -17,15 +17,13 @@ package org.thingsboard.server.service.housekeeper.processor; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; -import org.thingsboard.server.common.data.event.ErrorEventFilter; -import org.thingsboard.server.common.data.event.EventFilter; import org.thingsboard.server.common.data.event.EventType; -import org.thingsboard.server.common.data.event.LifeCycleEventFilter; -import org.thingsboard.server.common.data.event.StatisticsEventFilter; import org.thingsboard.server.common.data.housekeeper.HousekeeperTask; import org.thingsboard.server.common.data.housekeeper.HousekeeperTaskType; import org.thingsboard.server.dao.event.EventService; +import java.util.Arrays; + @Component @RequiredArgsConstructor public class EventsDeletionTaskProcessor extends HousekeeperTaskProcessor { @@ -35,21 +33,8 @@ public class EventsDeletionTaskProcessor extends HousekeeperTaskProcessor new ErrorEventFilter(); - case LC_EVENT -> new LifeCycleEventFilter(); - case STATS -> new StatisticsEventFilter(); - default -> throw new IllegalArgumentException("Unexpected non-debug event type: " + eventType); - }; + EventType[] nonDebugEventTypes = Arrays.stream(EventType.values()).filter(eventType -> !eventType.isDebug()).toArray(EventType[]::new); + eventService.removeEvents(task.getTenantId(), task.getEntityId(), 0L, System.currentTimeMillis(), nonDebugEventTypes); } @Override diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/event/EventService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/event/EventService.java index 556ef0371d..26223f14e2 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/event/EventService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/event/EventService.java @@ -41,6 +41,8 @@ public interface EventService { void removeEvents(TenantId tenantId, EntityId entityId); + void removeEvents(TenantId tenantId, EntityId entityId, Long startTime, Long endTime, EventType... types); + void removeEvents(TenantId tenantId, EntityId entityId, EventFilter eventFilter, Long startTime, Long endTime); void cleanupEvents(long regularEventExpTs, long debugEventExpTs, boolean cleanupDb); diff --git a/dao/src/main/java/org/thingsboard/server/dao/event/BaseEventService.java b/dao/src/main/java/org/thingsboard/server/dao/event/BaseEventService.java index d81d8eb0f3..68ffce0acf 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/event/BaseEventService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/event/BaseEventService.java @@ -47,11 +47,6 @@ import java.util.stream.Collectors; @Slf4j public class BaseEventService implements EventService { - @Value("${sql.ttl.events.events_ttl:0}") - private long ttlInSec; - @Value("${sql.ttl.events.debug_events_ttl:604800}") - private long debugTtlInSec; - @Value("${event.debug.max-symbols:4096}") private int maxDebugEventSymbols; @@ -125,7 +120,12 @@ public class BaseEventService implements EventService { @Override public void removeEvents(TenantId tenantId, EntityId entityId) { - removeEvents(tenantId, entityId, null, null, null); + removeEvents(tenantId, entityId, null, null); + } + + @Override + public void removeEvents(TenantId tenantId, EntityId entityId, Long startTime, Long endTime, EventType... types) { + eventDao.removeEvents(tenantId.getId(), entityId.getId(), startTime, endTime, types); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/event/EventDao.java b/dao/src/main/java/org/thingsboard/server/dao/event/EventDao.java index 7494ad2532..d8c7a0678a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/event/EventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/event/EventDao.java @@ -25,80 +25,24 @@ import org.thingsboard.server.common.data.page.TimePageLink; import java.util.List; import java.util.UUID; -/** - * The Interface EventDao. - */ public interface EventDao { - /** - * Save or update event object async - * - * @param event the event object - * @return saved event object future - */ ListenableFuture saveAsync(Event event); - /** - * Find events by tenantId, entityId, eventType and pageLink. - * - * @param tenantId the tenantId - * @param entityId the entityId - * @param eventType the eventType - * @param pageLink the pageLink - * @return the event list - */ PageData findEvents(UUID tenantId, UUID entityId, EventType eventType, TimePageLink pageLink); PageData findEventByFilter(UUID tenantId, UUID entityId, EventFilter eventFilter, TimePageLink pageLink); - /** - * Find latest events by tenantId, entityId and eventType. - * - * @param tenantId the tenantId - * @param entityId the entityId - * @param eventType the eventType - * @param limit the limit - * @return the event list - */ List findLatestEvents(UUID tenantId, UUID entityId, EventType eventType, int limit); - /** - * Find latest debug IN event by tenantId, entityId. - * - * @param tenantId the tenantId - * @param entityId the entityId - * @return the latest debug IN event - */ Event findLatestDebugRuleNodeInEvent(UUID tenantId, UUID entityId); - /** - * Executes stored procedure to cleanup old events. Uses separate ttl for debug and other events. - * @param regularEventExpTs the expiration time of the regular events - * @param debugEventExpTs the expiration time of the debug events - * @param cleanupDb - */ void cleanupEvents(long regularEventExpTs, long debugEventExpTs, boolean cleanupDb); - /** - * Removes all events for the specified entity and time interval - * - * @param tenantId - * @param entityId - * @param startTime - * @param endTime - */ void removeEvents(UUID tenantId, UUID entityId, Long startTime, Long endTime); - /** - * - * Removes all events for the specified entity, event filter and time interval - * - * @param tenantId - * @param entityId - * @param eventFilter - * @param startTime - * @param endTime - */ + void removeEvents(UUID tenantId, UUID entityId, Long startTime, Long endTime, EventType... types); + void removeEvents(UUID tenantId, UUID entityId, EventFilter eventFilter, Long startTime, Long endTime); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDao.java index 189e024608..5cd9012831 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDao.java @@ -173,8 +173,14 @@ public class JpaBaseEventDao implements EventDao { @Override public void removeEvents(UUID tenantId, UUID entityId, Long startTime, Long endTime) { + removeEvents(tenantId, entityId, startTime, endTime, EventType.values()); + } + + @Override + public void removeEvents(UUID tenantId, UUID entityId, Long startTime, Long endTime, EventType... types) { log.debug("[{}][{}] Remove events [{}-{}] ", tenantId, entityId, startTime, endTime); - for (EventType eventType : EventType.values()) { + EventType[] eventTypes = (types == null || types.length == 0) ? EventType.values() : types; + for (EventType eventType : eventTypes) { getEventRepository(eventType).removeEvents(tenantId, entityId, startTime, endTime); } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/sql/SqlPartitioningRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/sql/SqlPartitioningRepository.java index 0a7cf237c8..550922bbc6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/sql/SqlPartitioningRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/sql/SqlPartitioningRepository.java @@ -54,7 +54,7 @@ public class SqlPartitioningRepository { getJdbcTemplate().execute(partition.getQuery()); } - @Transactional(propagation = Propagation.NOT_SUPPORTED)// executing non-transactionally, so that parent transaction is not aborted on partition save error + @Transactional(propagation = Propagation.NOT_SUPPORTED) // executing non-transactionally, so that parent transaction is not aborted on partition save error public void createPartitionIfNotExists(String table, long entityTs, long partitionDurationMs) { long partitionStartTs = calculatePartitionStartTime(entityTs, partitionDurationMs); Map partitions = tablesPartitions.computeIfAbsent(table, t -> new ConcurrentHashMap<>()); From aabf0c3813d5f5962f47dd1382589787241ccdfe Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Wed, 7 Jan 2026 13:03:22 +0200 Subject: [PATCH 137/579] Improve validation for user credentials on login --- .../security/system/DefaultSystemSecurityService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/security/system/DefaultSystemSecurityService.java b/application/src/main/java/org/thingsboard/server/service/security/system/DefaultSystemSecurityService.java index 69536f0953..a977def292 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/system/DefaultSystemSecurityService.java +++ b/application/src/main/java/org/thingsboard/server/service/security/system/DefaultSystemSecurityService.java @@ -80,11 +80,15 @@ public class DefaultSystemSecurityService implements SystemSecurityService { @Override public void validateUserCredentials(TenantId tenantId, UserCredentials userCredentials, String username, String password) throws AuthenticationException { + if (!userCredentials.isEnabled()) { + throw new DisabledException("User is not active"); + } + if (!encoder.matches(password, userCredentials.getPassword())) { int failedLoginAttempts = userService.increaseFailedLoginAttempts(tenantId, userCredentials.getUserId()); SecuritySettings securitySettings = securitySettingsService.getSecuritySettings(); if (securitySettings.getMaxFailedLoginAttempts() != null && securitySettings.getMaxFailedLoginAttempts() > 0) { - if (failedLoginAttempts > securitySettings.getMaxFailedLoginAttempts() && userCredentials.isEnabled()) { + if (failedLoginAttempts > securitySettings.getMaxFailedLoginAttempts()) { lockAccount(userCredentials.getUserId(), username, securitySettings.getUserLockoutNotificationEmail(), securitySettings.getMaxFailedLoginAttempts()); throw new LockedException("Authentication Failed. Username was locked due to security policy."); } @@ -92,10 +96,6 @@ public class DefaultSystemSecurityService implements SystemSecurityService { throw new BadCredentialsException("Authentication Failed. Username or Password not valid."); } - if (!userCredentials.isEnabled()) { - throw new DisabledException("User is not active"); - } - userService.resetFailedLoginAttempts(tenantId, userCredentials.getUserId()); SecuritySettings securitySettings = securitySettingsService.getSecuritySettings(); From 5b5b4dff6b2fffce002793b15dbe4b264fa720db Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Wed, 7 Jan 2026 14:46:51 +0200 Subject: [PATCH 138/579] Update license header --- .github/release.yml | 2 +- .github/workflows/check-configuration-files.yml | 2 +- .github/workflows/license-header-format.yml | 2 +- application/pom.xml | 2 +- application/src/main/conf/logback.xml | 2 +- application/src/main/conf/thingsboard.conf | 2 +- application/src/main/data/upgrade/basic/schema_update.sql | 2 +- .../converter/xml/MappingJackson2XmlHttpMessageConverter.java | 2 +- .../org/thingsboard/server/ThingsboardInstallApplication.java | 2 +- .../org/thingsboard/server/ThingsboardServerApplication.java | 2 +- .../java/org/thingsboard/server/actors/ActorSystemContext.java | 2 +- .../server/actors/TbEntityTypeActorIdPredicate.java | 2 +- .../main/java/org/thingsboard/server/actors/app/AppActor.java | 2 +- .../java/org/thingsboard/server/actors/app/AppInitMsg.java | 2 +- .../actors/calculatedField/AbstractCalculatedFieldActor.java | 2 +- .../actors/calculatedField/CalculatedFieldEntityActor.java | 2 +- .../calculatedField/CalculatedFieldEntityActorCreator.java | 2 +- .../actors/calculatedField/CalculatedFieldEntityDeleteMsg.java | 2 +- .../calculatedField/CalculatedFieldEntityMessageProcessor.java | 2 +- .../actors/calculatedField/CalculatedFieldException.java | 2 +- .../calculatedField/CalculatedFieldLinkedTelemetryMsg.java | 2 +- .../actors/calculatedField/CalculatedFieldManagerActor.java | 2 +- .../calculatedField/CalculatedFieldManagerActorCreator.java | 2 +- .../CalculatedFieldManagerMessageProcessor.java | 2 +- .../actors/calculatedField/CalculatedFieldStateRestoreMsg.java | 2 +- .../actors/calculatedField/CalculatedFieldTelemetryMsg.java | 2 +- .../EntityCalculatedFieldLinkedTelemetryMsg.java | 2 +- .../calculatedField/EntityCalculatedFieldTelemetryMsg.java | 2 +- .../actors/calculatedField/EntityInitCalculatedFieldMsg.java | 2 +- .../server/actors/calculatedField/MultipleTbCallback.java | 2 +- .../java/org/thingsboard/server/actors/device/DeviceActor.java | 2 +- .../thingsboard/server/actors/device/DeviceActorCreator.java | 2 +- .../server/actors/device/DeviceActorMessageProcessor.java | 2 +- .../java/org/thingsboard/server/actors/device/SessionInfo.java | 2 +- .../thingsboard/server/actors/device/SessionInfoMetaData.java | 2 +- .../server/actors/device/SessionTimeoutCheckMsg.java | 2 +- .../server/actors/device/ToDeviceRpcRequestMetadata.java | 2 +- .../server/actors/device/ToServerRpcRequestMetadata.java | 2 +- .../server/actors/device/TransportSessionCloseReason.java | 2 +- .../thingsboard/server/actors/ruleChain/DefaultTbContext.java | 2 +- .../thingsboard/server/actors/ruleChain/RuleChainActor.java | 2 +- .../actors/ruleChain/RuleChainActorMessageProcessor.java | 2 +- .../thingsboard/server/actors/ruleChain/RuleChainInputMsg.java | 2 +- .../server/actors/ruleChain/RuleChainManagerActor.java | 2 +- .../server/actors/ruleChain/RuleChainOutputMsg.java | 2 +- .../server/actors/ruleChain/RuleChainToRuleChainMsg.java | 2 +- .../server/actors/ruleChain/RuleChainToRuleNodeMsg.java | 2 +- .../server/actors/ruleChain/RuleEngineComponentActor.java | 2 +- .../org/thingsboard/server/actors/ruleChain/RuleNodeActor.java | 2 +- .../server/actors/ruleChain/RuleNodeActorMessageProcessor.java | 2 +- .../org/thingsboard/server/actors/ruleChain/RuleNodeCtx.java | 2 +- .../thingsboard/server/actors/ruleChain/RuleNodeRelation.java | 2 +- .../actors/ruleChain/RuleNodeToRuleChainTellNextMsg.java | 2 +- .../thingsboard/server/actors/ruleChain/RuleNodeToSelfMsg.java | 2 +- .../server/actors/ruleChain/TbToRuleChainActorMsg.java | 2 +- .../server/actors/ruleChain/TbToRuleNodeActorMsg.java | 2 +- .../org/thingsboard/server/actors/service/ActorService.java | 2 +- .../org/thingsboard/server/actors/service/ComponentActor.java | 2 +- .../thingsboard/server/actors/service/ContextAwareActor.java | 2 +- .../thingsboard/server/actors/service/ContextBasedCreator.java | 2 +- .../thingsboard/server/actors/service/DefaultActorService.java | 2 +- .../server/actors/shared/AbstractContextAwareMsgProcessor.java | 2 +- .../thingsboard/server/actors/shared/ActorTerminationMsg.java | 2 +- .../server/actors/shared/ComponentMsgProcessor.java | 2 +- .../thingsboard/server/actors/shared/RuleChainErrorActor.java | 2 +- .../java/org/thingsboard/server/actors/stats/StatsActor.java | 2 +- .../org/thingsboard/server/actors/stats/StatsPersistMsg.java | 2 +- .../org/thingsboard/server/actors/stats/StatsPersistTick.java | 2 +- .../thingsboard/server/actors/tenant/DebugTbRateLimits.java | 2 +- .../java/org/thingsboard/server/actors/tenant/TenantActor.java | 2 +- .../main/java/org/thingsboard/server/config/CryptoConfig.java | 2 +- .../config/CustomOAuth2AuthorizationRequestResolver.java | 2 +- .../java/org/thingsboard/server/config/MvcCorsProperties.java | 2 +- .../thingsboard/server/config/RateLimitProcessingFilter.java | 2 +- .../org/thingsboard/server/config/SchedulingConfiguration.java | 2 +- .../org/thingsboard/server/config/SwaggerConfiguration.java | 2 +- .../server/config/TbRuleEngineSecurityConfiguration.java | 2 +- .../server/config/ThingsboardMessageConfiguration.java | 2 +- .../server/config/ThingsboardSecurityConfiguration.java | 2 +- .../src/main/java/org/thingsboard/server/config/WebConfig.java | 2 +- .../org/thingsboard/server/config/WebSocketConfiguration.java | 2 +- .../thingsboard/server/config/annotations/ApiOperation.java | 2 +- .../config/mqtt/MqttClientRetransmissionSettingsComponent.java | 2 +- .../server/config/mqtt/MqttClientSettingsComponent.java | 2 +- .../thingsboard/server/controller/AbstractRpcController.java | 2 +- .../org/thingsboard/server/controller/AdminController.java | 2 +- .../org/thingsboard/server/controller/AiModelController.java | 2 +- .../thingsboard/server/controller/AlarmCommentController.java | 2 +- .../org/thingsboard/server/controller/AlarmController.java | 2 +- .../org/thingsboard/server/controller/AssetController.java | 2 +- .../thingsboard/server/controller/AssetProfileController.java | 2 +- .../org/thingsboard/server/controller/AuditLogController.java | 2 +- .../java/org/thingsboard/server/controller/AuthController.java | 2 +- .../thingsboard/server/controller/AutoCommitController.java | 2 +- .../java/org/thingsboard/server/controller/BaseController.java | 2 +- .../server/controller/CalculatedFieldController.java | 2 +- .../server/controller/ComponentDescriptorController.java | 2 +- .../org/thingsboard/server/controller/ControllerConstants.java | 2 +- .../org/thingsboard/server/controller/CustomerController.java | 2 +- .../org/thingsboard/server/controller/DashboardController.java | 2 +- .../server/controller/DeviceConnectivityController.java | 2 +- .../org/thingsboard/server/controller/DeviceController.java | 2 +- .../thingsboard/server/controller/DeviceProfileController.java | 2 +- .../org/thingsboard/server/controller/DomainController.java | 2 +- .../java/org/thingsboard/server/controller/EdgeController.java | 2 +- .../org/thingsboard/server/controller/EdgeEventController.java | 2 +- .../server/controller/EntitiesVersionControlController.java | 2 +- .../thingsboard/server/controller/EntityQueryController.java | 2 +- .../server/controller/EntityRelationController.java | 2 +- .../thingsboard/server/controller/EntityViewController.java | 2 +- .../org/thingsboard/server/controller/EventController.java | 2 +- .../thingsboard/server/controller/HttpValidationCallback.java | 2 +- .../org/thingsboard/server/controller/ImageController.java | 2 +- .../java/org/thingsboard/server/controller/JobController.java | 2 +- .../org/thingsboard/server/controller/Lwm2mController.java | 2 +- .../server/controller/MailConfigTemplateController.java | 2 +- .../server/controller/MobileAppBundleController.java | 2 +- .../org/thingsboard/server/controller/MobileAppController.java | 2 +- .../thingsboard/server/controller/NotificationController.java | 2 +- .../server/controller/NotificationRuleController.java | 2 +- .../server/controller/NotificationTargetController.java | 2 +- .../server/controller/NotificationTemplateController.java | 2 +- .../server/controller/OAuth2ConfigTemplateController.java | 2 +- .../org/thingsboard/server/controller/OAuth2Controller.java | 2 +- .../thingsboard/server/controller/OtaPackageController.java | 2 +- .../server/controller/QrCodeSettingsController.java | 2 +- .../org/thingsboard/server/controller/QueueController.java | 2 +- .../thingsboard/server/controller/QueueStatsController.java | 2 +- .../org/thingsboard/server/controller/RpcV1Controller.java | 2 +- .../org/thingsboard/server/controller/RpcV2Controller.java | 2 +- .../org/thingsboard/server/controller/RuleChainController.java | 2 +- .../thingsboard/server/controller/RuleEngineController.java | 2 +- .../thingsboard/server/controller/SystemInfoController.java | 2 +- .../thingsboard/server/controller/TbResourceController.java | 2 +- .../java/org/thingsboard/server/controller/TbUrlConstants.java | 2 +- .../org/thingsboard/server/controller/TelemetryController.java | 2 +- .../org/thingsboard/server/controller/TenantController.java | 2 +- .../thingsboard/server/controller/TenantProfileController.java | 2 +- .../org/thingsboard/server/controller/TrendzController.java | 2 +- .../server/controller/TwoFactorAuthConfigController.java | 2 +- .../thingsboard/server/controller/TwoFactorAuthController.java | 2 +- .../thingsboard/server/controller/UiSettingsController.java | 2 +- .../org/thingsboard/server/controller/UsageInfoController.java | 2 +- .../java/org/thingsboard/server/controller/UserController.java | 2 +- .../thingsboard/server/controller/WidgetTypeController.java | 2 +- .../thingsboard/server/controller/WidgetsBundleController.java | 2 +- .../server/controller/plugin/TbWebSocketHandler.java | 2 +- .../thingsboard/server/controller/plugin/TbWebSocketMsg.java | 2 +- .../server/controller/plugin/TbWebSocketMsgType.java | 2 +- .../server/controller/plugin/TbWebSocketPingMsg.java | 2 +- .../server/controller/plugin/TbWebSocketTextMsg.java | 2 +- .../thingsboard/server/exception/AccessDeniedException.java | 2 +- .../server/exception/CalculatedFieldStateException.java | 2 +- .../thingsboard/server/exception/EntityNotFoundException.java | 2 +- .../thingsboard/server/exception/InternalErrorException.java | 2 +- .../server/exception/InvalidParametersException.java | 2 +- .../exception/ThingsboardCredentialsExpiredResponse.java | 2 +- .../exception/ThingsboardCredentialsViolationResponse.java | 2 +- .../thingsboard/server/exception/ThingsboardErrorResponse.java | 2 +- .../server/exception/ThingsboardErrorResponseHandler.java | 2 +- .../thingsboard/server/exception/ToErrorResponseEntity.java | 2 +- .../thingsboard/server/exception/UnauthorizedException.java | 2 +- .../thingsboard/server/exception/UncheckedApiException.java | 2 +- .../server/install/ThingsboardInstallConfiguration.java | 2 +- .../server/install/ThingsboardInstallException.java | 2 +- .../thingsboard/server/install/ThingsboardInstallService.java | 2 +- .../thingsboard/server/service/action/EntityActionService.java | 2 +- .../org/thingsboard/server/service/ai/AiChatModelService.java | 2 +- .../thingsboard/server/service/ai/AiChatModelServiceImpl.java | 2 +- .../org/thingsboard/server/service/ai/AiRequestsExecutor.java | 2 +- .../server/service/ai/DefaultAiRequestsExecutor.java | 2 +- .../server/service/ai/Langchain4jChatModelConfigurerImpl.java | 2 +- .../thingsboard/server/service/apiusage/BaseApiUsageState.java | 2 +- .../server/service/apiusage/CustomerApiUsageState.java | 2 +- .../server/service/apiusage/DefaultTbApiUsageStateService.java | 2 +- .../server/service/apiusage/TbApiUsageStateService.java | 2 +- .../server/service/apiusage/TenantApiUsageState.java | 2 +- .../server/service/asset/AssetBulkImportService.java | 2 +- .../server/service/cf/AbstractCalculatedFieldStateService.java | 2 +- .../thingsboard/server/service/cf/CalculatedFieldCache.java | 2 +- .../server/service/cf/CalculatedFieldInitService.java | 2 +- .../server/service/cf/CalculatedFieldProcessingService.java | 2 +- .../server/service/cf/CalculatedFieldQueueService.java | 2 +- .../thingsboard/server/service/cf/CalculatedFieldResult.java | 2 +- .../server/service/cf/CalculatedFieldStateService.java | 2 +- .../main/java/org/thingsboard/server/service/cf/CfRocksDb.java | 2 +- .../server/service/cf/DefaultCalculatedFieldCache.java | 2 +- .../service/cf/DefaultCalculatedFieldProcessingService.java | 2 +- .../server/service/cf/DefaultCalculatedFieldQueueService.java | 2 +- .../server/service/cf/cache/TenantEntityProfileCache.java | 2 +- .../server/service/cf/ctx/CalculatedFieldEntityCtx.java | 2 +- .../server/service/cf/ctx/CalculatedFieldEntityCtxId.java | 2 +- .../thingsboard/server/service/cf/ctx/state/ArgumentEntry.java | 2 +- .../server/service/cf/ctx/state/ArgumentEntryType.java | 2 +- .../server/service/cf/ctx/state/BaseCalculatedFieldState.java | 2 +- .../server/service/cf/ctx/state/CalculatedFieldCtx.java | 2 +- .../service/cf/ctx/state/CalculatedFieldScriptEngine.java | 2 +- .../server/service/cf/ctx/state/CalculatedFieldState.java | 2 +- .../service/cf/ctx/state/CalculatedFieldTbelScriptEngine.java | 2 +- .../service/cf/ctx/state/KafkaCalculatedFieldStateService.java | 2 +- .../cf/ctx/state/RocksDBCalculatedFieldStateService.java | 2 +- .../service/cf/ctx/state/ScriptCalculatedFieldState.java | 2 +- .../service/cf/ctx/state/SimpleCalculatedFieldState.java | 2 +- .../server/service/cf/ctx/state/SingleValueArgumentEntry.java | 2 +- .../server/service/cf/ctx/state/TsRollingArgumentEntry.java | 2 +- .../service/component/AnnotationComponentDiscoveryService.java | 2 +- .../server/service/component/ComponentDiscoveryService.java | 2 +- .../server/service/component/RuleNodeClassInfo.java | 2 +- .../server/service/device/ClaimDevicesServiceImpl.java | 2 +- .../server/service/device/DeviceBulkImportService.java | 2 +- .../server/service/device/DeviceProvisionServiceImpl.java | 2 +- .../thingsboard/server/service/edge/EdgeBulkImportService.java | 2 +- .../thingsboard/server/service/edge/EdgeContextComponent.java | 2 +- .../server/service/edge/EdgeEventSourcingListener.java | 2 +- .../server/service/edge/EdgeMsgConstructorUtils.java | 2 +- .../server/service/edge/RelatedEdgesSourcingListener.java | 2 +- .../BaseEdgeInstallUpgradeInstructionsService.java | 2 +- .../instructions/DefaultEdgeInstallInstructionsService.java | 2 +- .../instructions/DefaultEdgeUpgradeInstructionsService.java | 2 +- .../edge/instructions/EdgeInstallInstructionsService.java | 2 +- .../edge/instructions/EdgeUpgradeInstructionsService.java | 2 +- .../server/service/edge/rpc/EdgeEventStorageSettings.java | 2 +- .../thingsboard/server/service/edge/rpc/EdgeGrpcService.java | 2 +- .../thingsboard/server/service/edge/rpc/EdgeGrpcSession.java | 2 +- .../thingsboard/server/service/edge/rpc/EdgeRpcService.java | 2 +- .../thingsboard/server/service/edge/rpc/EdgeSessionState.java | 2 +- .../thingsboard/server/service/edge/rpc/EdgeSyncCursor.java | 2 +- .../server/service/edge/rpc/KafkaEdgeEventService.java | 2 +- .../server/service/edge/rpc/KafkaEdgeGrpcSession.java | 2 +- .../server/service/edge/rpc/PostgresEdgeGrpcSession.java | 2 +- .../service/edge/rpc/fetch/AdminSettingsEdgeEventFetcher.java | 2 +- .../service/edge/rpc/fetch/AssetProfilesEdgeEventFetcher.java | 2 +- .../server/service/edge/rpc/fetch/AssetsEdgeEventFetcher.java | 2 +- .../service/edge/rpc/fetch/BasePageableEdgeEventFetcher.java | 2 +- .../service/edge/rpc/fetch/BaseUsersEdgeEventFetcher.java | 2 +- .../edge/rpc/fetch/BaseWidgetTypesEdgeEventFetcher.java | 2 +- .../edge/rpc/fetch/BaseWidgetsBundlesEdgeEventFetcher.java | 2 +- .../service/edge/rpc/fetch/CustomerEdgeEventFetcher.java | 2 +- .../service/edge/rpc/fetch/CustomerUsersEdgeEventFetcher.java | 2 +- .../service/edge/rpc/fetch/DashboardsEdgeEventFetcher.java | 2 +- .../edge/rpc/fetch/DefaultProfilesEdgeEventFetcher.java | 2 +- .../service/edge/rpc/fetch/DeviceProfilesEdgeEventFetcher.java | 2 +- .../server/service/edge/rpc/fetch/DevicesEdgeEventFetcher.java | 2 +- .../server/service/edge/rpc/fetch/EdgeEventFetcher.java | 2 +- .../service/edge/rpc/fetch/EntityViewsEdgeEventFetcher.java | 2 +- .../server/service/edge/rpc/fetch/GeneralEdgeEventFetcher.java | 2 +- .../edge/rpc/fetch/NotificationRuleEdgeEventFetcher.java | 2 +- .../edge/rpc/fetch/NotificationTargetEdgeEventFetcher.java | 2 +- .../edge/rpc/fetch/NotificationTemplateEdgeEventFetcher.java | 2 +- .../server/service/edge/rpc/fetch/OAuth2EdgeEventFetcher.java | 2 +- .../service/edge/rpc/fetch/OtaPackagesEdgeEventFetcher.java | 2 +- .../server/service/edge/rpc/fetch/QueuesEdgeEventFetcher.java | 2 +- .../service/edge/rpc/fetch/RuleChainsEdgeEventFetcher.java | 2 +- .../edge/rpc/fetch/SystemWidgetTypesEdgeEventFetcher.java | 2 +- .../edge/rpc/fetch/SystemWidgetsBundlesEdgeEventFetcher.java | 2 +- .../edge/rpc/fetch/TenantAdminUsersEdgeEventFetcher.java | 2 +- .../server/service/edge/rpc/fetch/TenantEdgeEventFetcher.java | 2 +- .../edge/rpc/fetch/TenantResourcesEdgeEventFetcher.java | 2 +- .../edge/rpc/fetch/TenantWidgetTypesEdgeEventFetcher.java | 2 +- .../edge/rpc/fetch/TenantWidgetsBundlesEdgeEventFetcher.java | 2 +- .../server/service/edge/rpc/processor/BaseEdgeProcessor.java | 2 +- .../server/service/edge/rpc/processor/EdgeProcessor.java | 2 +- .../service/edge/rpc/processor/alarm/AlarmEdgeProcessor.java | 2 +- .../service/edge/rpc/processor/alarm/AlarmProcessor.java | 2 +- .../service/edge/rpc/processor/alarm/BaseAlarmProcessor.java | 2 +- .../rpc/processor/alarm/comment/AlarmCommentEdgeProcessor.java | 2 +- .../rpc/processor/alarm/comment/AlarmCommentProcessor.java | 2 +- .../service/edge/rpc/processor/asset/AssetEdgeProcessor.java | 2 +- .../service/edge/rpc/processor/asset/AssetProcessor.java | 2 +- .../service/edge/rpc/processor/asset/BaseAssetProcessor.java | 2 +- .../rpc/processor/asset/profile/AssetProfileEdgeProcessor.java | 2 +- .../rpc/processor/asset/profile/AssetProfileProcessor.java | 2 +- .../rpc/processor/asset/profile/BaseAssetProfileProcessor.java | 2 +- .../edge/rpc/processor/cf/BaseCalculatedFieldProcessor.java | 2 +- .../edge/rpc/processor/cf/CalculatedFieldEdgeProcessor.java | 2 +- .../edge/rpc/processor/cf/CalculatedFieldProcessor.java | 2 +- .../edge/rpc/processor/customer/CustomerEdgeProcessor.java | 2 +- .../edge/rpc/processor/dashboard/BaseDashboardProcessor.java | 2 +- .../edge/rpc/processor/dashboard/DashboardEdgeProcessor.java | 2 +- .../edge/rpc/processor/dashboard/DashboardProcessor.java | 2 +- .../service/edge/rpc/processor/device/BaseDeviceProcessor.java | 2 +- .../service/edge/rpc/processor/device/DeviceEdgeProcessor.java | 2 +- .../service/edge/rpc/processor/device/DeviceProcessor.java | 2 +- .../processor/device/profile/BaseDeviceProfileProcessor.java | 2 +- .../processor/device/profile/DeviceProfileEdgeProcessor.java | 2 +- .../rpc/processor/device/profile/DeviceProfileProcessor.java | 2 +- .../service/edge/rpc/processor/edge/EdgeEntityProcessor.java | 2 +- .../edge/rpc/processor/entityview/BaseEntityViewProcessor.java | 2 +- .../edge/rpc/processor/entityview/EntityViewEdgeProcessor.java | 2 +- .../edge/rpc/processor/entityview/EntityViewProcessor.java | 2 +- .../processor/notification/NotificationRuleEdgeProcessor.java | 2 +- .../notification/NotificationTargetEdgeProcessor.java | 2 +- .../notification/NotificationTemplateEdgeProcessor.java | 2 +- .../service/edge/rpc/processor/oauth2/DomainEdgeProcessor.java | 2 +- .../edge/rpc/processor/oauth2/OAuth2ClientEdgeProcessor.java | 2 +- .../edge/rpc/processor/ota/OtaPackageEdgeProcessor.java | 2 +- .../service/edge/rpc/processor/queue/QueueEdgeProcessor.java | 2 +- .../edge/rpc/processor/relation/BaseRelationProcessor.java | 2 +- .../edge/rpc/processor/relation/RelationEdgeProcessor.java | 2 +- .../service/edge/rpc/processor/relation/RelationProcessor.java | 2 +- .../edge/rpc/processor/resource/BaseResourceProcessor.java | 2 +- .../edge/rpc/processor/resource/ResourceEdgeProcessor.java | 2 +- .../service/edge/rpc/processor/resource/ResourceProcessor.java | 2 +- .../edge/rpc/processor/rule/BaseRuleChainProcessor.java | 2 +- .../edge/rpc/processor/rule/RuleChainEdgeProcessor.java | 2 +- .../rpc/processor/rule/RuleChainMetadataEdgeProcessor.java | 2 +- .../rpc/processor/settings/AdminSettingsEdgeProcessor.java | 2 +- .../edge/rpc/processor/telemetry/BaseTelemetryProcessor.java | 2 +- .../edge/rpc/processor/telemetry/TelemetryEdgeProcessor.java | 2 +- .../service/edge/rpc/processor/tenant/TenantEdgeProcessor.java | 2 +- .../edge/rpc/processor/tenant/TenantProfileEdgeProcessor.java | 2 +- .../service/edge/rpc/processor/user/UserEdgeProcessor.java | 2 +- .../edge/rpc/processor/widget/WidgetBundleEdgeProcessor.java | 2 +- .../edge/rpc/processor/widget/WidgetTypeEdgeProcessor.java | 2 +- .../service/edge/rpc/sync/DefaultEdgeRequestsService.java | 2 +- .../server/service/edge/rpc/sync/EdgeRequestsService.java | 2 +- .../server/service/edge/rpc/utils/EdgeVersionUtils.java | 2 +- .../server/service/edge/stats/EdgeStatsService.java | 2 +- .../thingsboard/server/service/edqs/DefaultEdqsApiService.java | 2 +- .../thingsboard/server/service/edqs/DefaultEdqsService.java | 2 +- .../java/org/thingsboard/server/service/edqs/EdqsListener.java | 2 +- .../org/thingsboard/server/service/edqs/EdqsSyncService.java | 2 +- .../thingsboard/server/service/edqs/KafkaEdqsSyncService.java | 2 +- .../thingsboard/server/service/edqs/LocalEdqsSyncService.java | 2 +- .../server/service/entitiy/AbstractTbEntityService.java | 2 +- .../service/entitiy/DefaultTbLogEntityActionService.java | 2 +- .../server/service/entitiy/EntityStateSourcingListener.java | 2 +- .../server/service/entitiy/SimpleTbEntityService.java | 2 +- .../server/service/entitiy/TbLogEntityActionService.java | 2 +- .../server/service/entitiy/ai/DefaultTbAiModelService.java | 2 +- .../server/service/entitiy/ai/TbAiModelService.java | 2 +- .../service/entitiy/alarm/DefaultTbAlarmCommentService.java | 2 +- .../server/service/entitiy/alarm/DefaultTbAlarmService.java | 2 +- .../server/service/entitiy/alarm/TbAlarmCommentService.java | 2 +- .../server/service/entitiy/alarm/TbAlarmService.java | 2 +- .../server/service/entitiy/asset/DefaultTbAssetService.java | 2 +- .../server/service/entitiy/asset/TbAssetService.java | 2 +- .../entitiy/asset/profile/DefaultTbAssetProfileService.java | 2 +- .../service/entitiy/asset/profile/TbAssetProfileService.java | 2 +- .../service/entitiy/cf/DefaultTbCalculatedFieldService.java | 2 +- .../server/service/entitiy/cf/TbCalculatedFieldService.java | 2 +- .../service/entitiy/customer/DefaultTbCustomerService.java | 2 +- .../server/service/entitiy/customer/TbCustomerService.java | 2 +- .../server/service/entitiy/dashboard/DashboardSyncService.java | 2 +- .../service/entitiy/dashboard/DefaultTbDashboardService.java | 2 +- .../server/service/entitiy/dashboard/TbDashboardService.java | 2 +- .../server/service/entitiy/device/DefaultTbDeviceService.java | 2 +- .../server/service/entitiy/device/TbDeviceService.java | 2 +- .../entitiy/device/profile/DefaultTbDeviceProfileService.java | 2 +- .../service/entitiy/device/profile/TbDeviceProfileService.java | 2 +- .../server/service/entitiy/domain/DefaultTbDomainService.java | 2 +- .../server/service/entitiy/domain/TbDomainService.java | 2 +- .../server/service/entitiy/edge/DefaultTbEdgeService.java | 2 +- .../thingsboard/server/service/entitiy/edge/TbEdgeService.java | 2 +- .../entity/relation/DefaultTbEntityRelationService.java | 2 +- .../entitiy/entity/relation/TbEntityRelationService.java | 2 +- .../service/entitiy/entityview/DefaultTbEntityViewService.java | 2 +- .../server/service/entitiy/entityview/TbEntityViewService.java | 2 +- .../entitiy/mobile/DefaultTbMobileAppBundleService.java | 2 +- .../service/entitiy/mobile/DefaultTbMobileAppService.java | 2 +- .../service/entitiy/mobile/TbMobileAppBundleService.java | 2 +- .../server/service/entitiy/mobile/TbMobileAppService.java | 2 +- .../entitiy/oauth2client/DefaultTbOauth2ClientService.java | 2 +- .../service/entitiy/oauth2client/TbOauth2ClientService.java | 2 +- .../server/service/entitiy/ota/DefaultTbOtaPackageService.java | 2 +- .../server/service/entitiy/ota/TbOtaPackageService.java | 2 +- .../server/service/entitiy/queue/DefaultTbQueueService.java | 2 +- .../server/service/entitiy/queue/TbQueueService.java | 2 +- .../server/service/entitiy/tenant/DefaultTbTenantService.java | 2 +- .../server/service/entitiy/tenant/TbTenantService.java | 2 +- .../entitiy/tenant/profile/DefaultTbTenantProfileService.java | 2 +- .../service/entitiy/tenant/profile/TbTenantProfileService.java | 2 +- .../service/entitiy/user/DefaultTbUserSettingsService.java | 2 +- .../server/service/entitiy/user/DefaultUserService.java | 2 +- .../thingsboard/server/service/entitiy/user/TbUserService.java | 2 +- .../server/service/entitiy/user/TbUserSettingsService.java | 2 +- .../entitiy/widgets/bundle/DefaultWidgetsBundleService.java | 2 +- .../service/entitiy/widgets/bundle/TbWidgetsBundleService.java | 2 +- .../service/entitiy/widgets/type/DefaultWidgetTypeService.java | 2 +- .../service/entitiy/widgets/type/TbWidgetTypeService.java | 2 +- .../server/service/executors/DbCallbackExecutorService.java | 2 +- .../server/service/executors/ExternalCallExecutorService.java | 2 +- .../server/service/executors/GrpcCallbackExecutorService.java | 2 +- .../server/service/executors/NotificationExecutorService.java | 2 +- .../service/executors/PubSubRuleNodeExecutorProvider.java | 2 +- .../server/service/executors/SharedEventLoopGroupService.java | 2 +- .../server/service/executors/VersionControlExecutor.java | 2 +- .../gateway_device/DefaultGatewayNotificationsService.java | 2 +- .../service/gateway_device/GatewayNotificationsService.java | 2 +- .../service/housekeeper/HousekeeperReprocessingService.java | 2 +- .../server/service/housekeeper/HousekeeperService.java | 2 +- .../housekeeper/processor/AlarmsDeletionTaskProcessor.java | 2 +- .../housekeeper/processor/AlarmsUnassignTaskProcessor.java | 2 +- .../housekeeper/processor/AttributesDeletionTaskProcessor.java | 2 +- .../processor/CalculatedFieldsDeletionTaskProcessor.java | 2 +- .../housekeeper/processor/EntitiesDeletionTaskProcessor.java | 2 +- .../housekeeper/processor/EventsDeletionTaskProcessor.java | 2 +- .../housekeeper/processor/HousekeeperTaskProcessor.java | 2 +- .../housekeeper/processor/JobsDeletionTaskProcessor.java | 2 +- .../housekeeper/processor/LatestTsDeletionTaskProcessor.java | 2 +- .../housekeeper/processor/TelemetryDeletionTaskProcessor.java | 2 +- .../processor/TenantEntitiesDeletionTaskProcessor.java | 2 +- .../housekeeper/processor/TsHistoryDeletionTaskProcessor.java | 2 +- .../service/housekeeper/stats/HousekeeperStatsService.java | 2 +- .../install/AbstractCassandraDatabaseUpgradeService.java | 2 +- .../install/CassandraAbstractDatabaseSchemaService.java | 2 +- .../server/service/install/CassandraKeyspaceService.java | 2 +- .../service/install/CassandraTsDatabaseSchemaService.java | 2 +- .../install/CassandraTsLatestDatabaseSchemaService.java | 2 +- .../server/service/install/DatabaseEntitiesUpgradeService.java | 2 +- .../server/service/install/DatabaseSchemaService.java | 2 +- .../server/service/install/DatabaseSchemaSettingsService.java | 2 +- .../server/service/install/DbUpgradeExecutorService.java | 2 +- .../service/install/DefaultDatabaseSchemaSettingsService.java | 2 +- .../server/service/install/DefaultSystemDataLoaderService.java | 2 +- .../server/service/install/EntityDatabaseSchemaService.java | 2 +- .../org/thingsboard/server/service/install/InstallScripts.java | 2 +- .../server/service/install/NoSqlKeyspaceService.java | 2 +- .../org/thingsboard/server/service/install/ProjectInfo.java | 2 +- .../service/install/SqlAbstractDatabaseSchemaService.java | 2 +- .../server/service/install/SqlDatabaseUpgradeService.java | 2 +- .../server/service/install/SqlEntityDatabaseSchemaService.java | 2 +- .../server/service/install/SqlTsDatabaseSchemaService.java | 2 +- .../server/service/install/SystemDataLoaderService.java | 2 +- .../service/install/TimescaleTsDatabaseSchemaService.java | 2 +- .../server/service/install/TsDatabaseSchemaService.java | 2 +- .../server/service/install/TsLatestDatabaseSchemaService.java | 2 +- .../server/service/install/cql/CQLStatementsParser.java | 2 +- .../server/service/install/migrate/CassandraToSqlColumn.java | 2 +- .../service/install/migrate/CassandraToSqlColumnData.java | 2 +- .../service/install/migrate/CassandraToSqlColumnType.java | 2 +- .../server/service/install/migrate/CassandraToSqlTable.java | 2 +- .../install/migrate/CassandraTsLatestToSqlMigrateService.java | 2 +- .../server/service/install/migrate/TsLatestMigrateService.java | 2 +- .../server/service/install/update/CacheCleanupService.java | 2 +- .../server/service/install/update/DataUpdateService.java | 2 +- .../service/install/update/DefaultCacheCleanupService.java | 2 +- .../service/install/update/DefaultDataUpdateService.java | 2 +- .../server/service/install/update/PaginatedUpdater.java | 2 +- .../server/service/install/update/ResourcesUpdater.java | 2 +- .../org/thingsboard/server/service/job/DefaultJobManager.java | 2 +- .../org/thingsboard/server/service/job/DummyJobProcessor.java | 2 +- .../java/org/thingsboard/server/service/job/JobProcessor.java | 2 +- .../org/thingsboard/server/service/job/JobStatsProcessor.java | 2 +- .../server/service/job/task/DummyTaskProcessor.java | 2 +- .../org/thingsboard/server/service/lwm2m/LwM2MService.java | 2 +- .../org/thingsboard/server/service/lwm2m/LwM2MServiceImpl.java | 2 +- .../thingsboard/server/service/mail/DefaultMailService.java | 2 +- .../service/mail/DefaultTbMailConfigTemplateService.java | 2 +- .../thingsboard/server/service/mail/MailExecutorService.java | 2 +- .../server/service/mail/MailSenderInternalExecutorService.java | 2 +- .../server/service/mail/PasswordResetExecutorService.java | 2 +- .../server/service/mail/RefreshTokenExpCheckService.java | 2 +- .../server/service/mail/TbMailConfigTemplateService.java | 2 +- .../server/service/mail/TbMailContextComponent.java | 2 +- .../java/org/thingsboard/server/service/mail/TbMailSender.java | 2 +- .../server/service/mobile/secret/MobileAppSecretService.java | 2 +- .../service/mobile/secret/MobileAppSecretServiceImpl.java | 2 +- .../service/mobile/secret/MobileSecretCaffeineCache.java | 2 +- .../server/service/mobile/secret/MobileSecretEvictEvent.java | 2 +- .../server/service/mobile/secret/MobileSecretRedisCache.java | 2 +- .../server/service/notification/DefaultNotificationCenter.java | 2 +- .../notification/DefaultNotificationSchedulerService.java | 2 +- .../service/notification/NotificationProcessingContext.java | 2 +- .../service/notification/NotificationSchedulerService.java | 2 +- .../notification/channels/EmailNotificationChannel.java | 2 +- .../channels/MicrosoftTeamsNotificationChannel.java | 2 +- .../notification/channels/MobileAppNotificationChannel.java | 2 +- .../service/notification/channels/NotificationChannel.java | 2 +- .../notification/channels/SlackNotificationChannel.java | 2 +- .../service/notification/channels/SmsNotificationChannel.java | 2 +- .../service/notification/channels/TeamsAdaptiveCard.java | 2 +- .../server/service/notification/channels/TeamsMessageCard.java | 2 +- .../service/notification/provider/DefaultFirebaseService.java | 2 +- .../service/notification/provider/DefaultSlackService.java | 2 +- .../notification/rule/DefaultNotificationRuleProcessor.java | 2 +- .../notification/rule/cache/DefaultNotificationRulesCache.java | 2 +- .../notification/rule/cache/NotificationRulesCache.java | 2 +- .../rule/trigger/AlarmAssignmentTriggerProcessor.java | 2 +- .../rule/trigger/AlarmCommentTriggerProcessor.java | 2 +- .../notification/rule/trigger/AlarmTriggerProcessor.java | 2 +- .../rule/trigger/ApiUsageLimitTriggerProcessor.java | 2 +- .../rule/trigger/DeviceActivityTriggerProcessor.java | 2 +- .../rule/trigger/EdgeCommunicationFailureTriggerProcessor.java | 2 +- .../rule/trigger/EdgeConnectionTriggerProcessor.java | 2 +- .../rule/trigger/EntitiesLimitTriggerProcessor.java | 2 +- .../rule/trigger/EntityActionTriggerProcessor.java | 2 +- .../rule/trigger/NewPlatformVersionTriggerProcessor.java | 2 +- .../rule/trigger/NotificationRuleTriggerProcessor.java | 2 +- .../notification/rule/trigger/RateLimitsTriggerProcessor.java | 2 +- .../rule/trigger/ResourcesShortageTriggerProcessor.java | 2 +- .../RuleEngineComponentLifecycleEventTriggerProcessor.java | 2 +- .../rule/trigger/TaskProcessingFailureTriggerProcessor.java | 2 +- .../server/service/ota/DefaultOtaPackageStateService.java | 2 +- .../thingsboard/server/service/ota/OtaPackageStateService.java | 2 +- .../service/partition/AbstractPartitionBasedService.java | 2 +- .../server/service/partition/TbCoreStartupService.java | 2 +- .../server/service/profile/DefaultTbAssetProfileCache.java | 2 +- .../server/service/profile/DefaultTbDeviceProfileCache.java | 2 +- .../server/service/profile/TbAssetProfileCache.java | 2 +- .../server/service/profile/TbDeviceProfileCache.java | 2 +- .../server/service/query/DefaultEntityQueryService.java | 2 +- .../thingsboard/server/service/query/EntityQueryService.java | 2 +- .../server/service/queue/DefaultQueueRoutingInfoService.java | 2 +- .../service/queue/DefaultTbCalculatedFieldConsumerService.java | 2 +- .../server/service/queue/DefaultTbClusterService.java | 2 +- .../server/service/queue/DefaultTbCoreConsumerService.java | 2 +- .../server/service/queue/DefaultTbEdgeConsumerService.java | 2 +- .../service/queue/DefaultTbRuleEngineConsumerService.java | 2 +- .../server/service/queue/DefaultTenantRoutingInfoService.java | 2 +- .../thingsboard/server/service/queue/EdgeConsumerStats.java | 2 +- .../org/thingsboard/server/service/queue/PendingMsgHolder.java | 2 +- .../server/service/queue/TbCalculatedFieldConsumerService.java | 2 +- .../server/service/queue/TbCoreConsumerService.java | 2 +- .../thingsboard/server/service/queue/TbCoreConsumerStats.java | 2 +- .../server/service/queue/TbEdgeConsumerService.java | 2 +- .../thingsboard/server/service/queue/TbMsgPackCallback.java | 2 +- .../server/service/queue/TbMsgPackProcessingContext.java | 2 +- .../thingsboard/server/service/queue/TbMsgProfilerInfo.java | 2 +- .../org/thingsboard/server/service/queue/TbPackCallback.java | 2 +- .../server/service/queue/TbPackProcessingContext.java | 2 +- .../server/service/queue/TbRuleEngineConsumerService.java | 2 +- .../server/service/queue/TbRuleEngineConsumerStats.java | 2 +- .../server/service/queue/TbRuleNodeProfilerInfo.java | 2 +- .../server/service/queue/TbTenantRuleEngineStats.java | 2 +- .../server/service/queue/TbTopicWithConsumerPerPartition.java | 2 +- .../service/queue/processing/AbstractConsumerService.java | 2 +- .../processing/AbstractPartitionBasedConsumerService.java | 2 +- .../queue/processing/AbstractTbRuleEngineSubmitStrategy.java | 2 +- .../queue/processing/BatchTbRuleEngineSubmitStrategy.java | 2 +- .../queue/processing/BurstTbRuleEngineSubmitStrategy.java | 2 +- .../thingsboard/server/service/queue/processing/IdMsgPair.java | 2 +- .../SequentialByEntityIdTbRuleEngineSubmitStrategy.java | 2 +- .../SequentialByOriginatorIdTbRuleEngineSubmitStrategy.java | 2 +- .../SequentialByTenantIdTbRuleEngineSubmitStrategy.java | 2 +- .../queue/processing/SequentialTbRuleEngineSubmitStrategy.java | 2 +- .../queue/processing/TbRuleEngineProcessingDecision.java | 2 +- .../service/queue/processing/TbRuleEngineProcessingResult.java | 2 +- .../queue/processing/TbRuleEngineProcessingStrategy.java | 2 +- .../processing/TbRuleEngineProcessingStrategyFactory.java | 2 +- .../service/queue/processing/TbRuleEngineSubmitStrategy.java | 2 +- .../queue/processing/TbRuleEngineSubmitStrategyFactory.java | 2 +- .../service/queue/ruleengine/TbRuleEngineConsumerContext.java | 2 +- .../queue/ruleengine/TbRuleEngineQueueConsumerManager.java | 2 +- .../server/service/resource/DefaultTbImageService.java | 2 +- .../server/service/resource/DefaultTbResourceService.java | 2 +- .../thingsboard/server/service/resource/TbImageService.java | 2 +- .../thingsboard/server/service/resource/TbResourceService.java | 2 +- .../server/service/rpc/DefaultTbCoreDeviceRpcService.java | 2 +- .../server/service/rpc/DefaultTbRuleEngineRpcService.java | 2 +- .../thingsboard/server/service/rpc/LocalRequestMetaData.java | 2 +- .../org/thingsboard/server/service/rpc/RpcSubmitStrategy.java | 2 +- .../thingsboard/server/service/rpc/TbCoreDeviceRpcService.java | 2 +- .../java/org/thingsboard/server/service/rpc/TbRpcService.java | 2 +- .../server/service/rpc/TbRuleEngineDeviceRpcService.java | 2 +- .../server/service/rule/DefaultTbRuleChainService.java | 2 +- .../thingsboard/server/service/rule/TbRuleChainService.java | 2 +- .../service/ruleengine/DefaultRuleEngineCallService.java | 2 +- .../server/service/ruleengine/RuleEngineCallService.java | 2 +- .../server/service/script/RuleNodeJsScriptEngine.java | 2 +- .../server/service/script/RuleNodeScriptEngine.java | 2 +- .../server/service/script/RuleNodeTbelScriptEngine.java | 2 +- .../thingsboard/server/service/security/AccessValidator.java | 2 +- .../server/service/security/ValidationCallback.java | 2 +- .../thingsboard/server/service/security/ValidationResult.java | 2 +- .../server/service/security/ValidationResultCode.java | 2 +- .../service/security/auth/AbstractJwtAuthenticationToken.java | 2 +- .../server/service/security/auth/AuthExceptionHandler.java | 2 +- .../service/security/auth/DefaultTokenOutdatingService.java | 2 +- .../server/service/security/auth/JwtAuthenticationToken.java | 2 +- .../server/service/security/auth/MfaAuthenticationToken.java | 2 +- .../service/security/auth/RefreshAuthenticationToken.java | 2 +- .../server/service/security/auth/TokenOutdatingService.java | 2 +- .../service/security/auth/jwt/JwtAuthenticationProvider.java | 2 +- .../auth/jwt/JwtTokenAuthenticationProcessingFilter.java | 2 +- .../security/auth/jwt/RefreshTokenAuthenticationProvider.java | 2 +- .../security/auth/jwt/RefreshTokenProcessingFilter.java | 2 +- .../server/service/security/auth/jwt/RefreshTokenRequest.java | 2 +- .../service/security/auth/jwt/SkipPathRequestMatcher.java | 2 +- .../security/auth/jwt/extractor/JwtHeaderTokenExtractor.java | 2 +- .../security/auth/jwt/extractor/JwtQueryTokenExtractor.java | 2 +- .../service/security/auth/jwt/extractor/TokenExtractor.java | 2 +- .../security/auth/jwt/settings/DefaultJwtSettingsService.java | 2 +- .../auth/jwt/settings/DefaultJwtSettingsValidator.java | 2 +- .../auth/jwt/settings/InstallJwtSettingsValidator.java | 2 +- .../service/security/auth/jwt/settings/JwtSettingsService.java | 2 +- .../security/auth/jwt/settings/JwtSettingsValidator.java | 2 +- .../service/security/auth/mfa/DefaultTwoFactorAuthService.java | 2 +- .../server/service/security/auth/mfa/TwoFactorAuthService.java | 2 +- .../security/auth/mfa/config/DefaultTwoFaConfigManager.java | 2 +- .../service/security/auth/mfa/config/TwoFaConfigManager.java | 2 +- .../service/security/auth/mfa/provider/TwoFaProvider.java | 2 +- .../auth/mfa/provider/impl/BackupCodeTwoFaProvider.java | 2 +- .../security/auth/mfa/provider/impl/EmailTwoFaProvider.java | 2 +- .../security/auth/mfa/provider/impl/OtpBasedTwoFaProvider.java | 2 +- .../security/auth/mfa/provider/impl/SmsTwoFaProvider.java | 2 +- .../security/auth/mfa/provider/impl/TotpTwoFaProvider.java | 2 +- .../security/auth/oauth2/AbstractOAuth2ClientMapper.java | 2 +- .../service/security/auth/oauth2/AppleOAuth2ClientMapper.java | 2 +- .../server/service/security/auth/oauth2/BasicMapperUtils.java | 2 +- .../service/security/auth/oauth2/BasicOAuth2ClientMapper.java | 2 +- .../server/service/security/auth/oauth2/CookieUtils.java | 2 +- .../service/security/auth/oauth2/CustomOAuth2ClientMapper.java | 2 +- .../service/security/auth/oauth2/GithubOAuth2ClientMapper.java | 2 +- .../oauth2/HttpCookieOAuth2AuthorizationRequestRepository.java | 2 +- .../service/security/auth/oauth2/OAuth2ClientMapper.java | 2 +- .../security/auth/oauth2/OAuth2ClientMapperProvider.java | 2 +- .../auth/oauth2/Oauth2AuthenticationFailureHandler.java | 2 +- .../auth/oauth2/Oauth2AuthenticationSuccessHandler.java | 2 +- .../service/security/auth/oauth2/TbOAuth2ParameterNames.java | 2 +- .../server/service/security/auth/rest/LoginRequest.java | 2 +- .../server/service/security/auth/rest/LoginResponse.java | 2 +- .../server/service/security/auth/rest/PublicLoginRequest.java | 2 +- .../service/security/auth/rest/RestAuthenticationDetails.java | 2 +- .../security/auth/rest/RestAuthenticationDetailsSource.java | 2 +- .../service/security/auth/rest/RestAuthenticationProvider.java | 2 +- .../auth/rest/RestAwareAuthenticationFailureHandler.java | 2 +- .../auth/rest/RestAwareAuthenticationSuccessHandler.java | 2 +- .../service/security/auth/rest/RestLoginProcessingFilter.java | 2 +- .../security/auth/rest/RestPublicLoginProcessingFilter.java | 2 +- .../service/security/device/DefaultDeviceAuthService.java | 2 +- .../security/exception/AuthMethodNotSupportedException.java | 2 +- .../service/security/exception/JwtExpiredTokenException.java | 2 +- .../security/exception/UserPasswordExpiredException.java | 2 +- .../security/exception/UserPasswordNotValidException.java | 2 +- .../server/service/security/model/ActivateUserRequest.java | 2 +- .../server/service/security/model/ChangePasswordRequest.java | 2 +- .../service/security/model/ResetPasswordEmailRequest.java | 2 +- .../server/service/security/model/ResetPasswordRequest.java | 2 +- .../server/service/security/model/SecurityUser.java | 2 +- .../server/service/security/model/UserPrincipal.java | 2 +- .../server/service/security/model/token/AccessJwtToken.java | 2 +- .../server/service/security/model/token/JwtTokenFactory.java | 2 +- .../service/security/model/token/OAuth2AppTokenFactory.java | 2 +- .../server/service/security/model/token/RawAccessJwtToken.java | 2 +- .../service/security/permission/AbstractPermissions.java | 2 +- .../service/security/permission/AccessControlService.java | 2 +- .../service/security/permission/CustomerUserPermissions.java | 2 +- .../security/permission/DefaultAccessControlService.java | 2 +- .../server/service/security/permission/Operation.java | 2 +- .../server/service/security/permission/PermissionChecker.java | 2 +- .../server/service/security/permission/Permissions.java | 2 +- .../server/service/security/permission/Resource.java | 2 +- .../service/security/permission/SysAdminPermissions.java | 2 +- .../service/security/permission/TenantAdminPermissions.java | 2 +- .../service/security/system/DefaultSystemSecurityService.java | 2 +- .../server/service/security/system/SystemSecurityService.java | 2 +- .../service/session/DefaultDeviceSessionCacheService.java | 2 +- .../server/service/session/DeviceSessionCacheService.java | 2 +- .../server/service/session/SessionCaffeineCache.java | 2 +- .../thingsboard/server/service/session/SessionRedisCache.java | 2 +- .../org/thingsboard/server/service/sms/AbstractSmsSender.java | 2 +- .../server/service/sms/DefaultSmsSenderFactory.java | 2 +- .../org/thingsboard/server/service/sms/DefaultSmsService.java | 2 +- .../org/thingsboard/server/service/sms/SmsExecutorService.java | 2 +- .../org/thingsboard/server/service/sms/aws/AwsSmsSender.java | 2 +- .../org/thingsboard/server/service/sms/smpp/SmppSmsSender.java | 2 +- .../thingsboard/server/service/sms/twilio/TwilioSmsSender.java | 2 +- .../server/service/state/DefaultDeviceStateManager.java | 2 +- .../server/service/state/DefaultDeviceStateService.java | 2 +- .../java/org/thingsboard/server/service/state/DeviceState.java | 2 +- .../org/thingsboard/server/service/state/DeviceStateData.java | 2 +- .../thingsboard/server/service/state/DeviceStateService.java | 2 +- .../service/stats/DefaultRuleEngineStatisticsService.java | 2 +- .../server/service/stats/RuleEngineStatisticsService.java | 2 +- .../subscription/DefaultSubscriptionManagerService.java | 2 +- .../subscription/DefaultTbEntityDataSubscriptionService.java | 2 +- .../subscription/DefaultTbLocalSubscriptionService.java | 2 +- .../server/service/subscription/ReadTsKvQueryInfo.java | 2 +- .../server/service/subscription/SubscriptionErrorCode.java | 2 +- .../service/subscription/SubscriptionManagerService.java | 2 +- .../service/subscription/SubscriptionModificationResult.java | 2 +- .../service/subscription/SubscriptionSchedulerComponent.java | 2 +- .../service/subscription/SubscriptionServiceStatistics.java | 2 +- .../server/service/subscription/TbAbstractDataSubCtx.java | 2 +- .../service/subscription/TbAbstractEntityQuerySubCtx.java | 2 +- .../server/service/subscription/TbAbstractSubCtx.java | 2 +- .../server/service/subscription/TbAlarmCountSubCtx.java | 2 +- .../server/service/subscription/TbAlarmDataSubCtx.java | 2 +- .../server/service/subscription/TbAlarmStatusSubCtx.java | 2 +- .../server/service/subscription/TbAlarmStatusSubscription.java | 2 +- .../server/service/subscription/TbAlarmsSubscription.java | 2 +- .../server/service/subscription/TbAttributeSubscription.java | 2 +- .../service/subscription/TbAttributeSubscriptionScope.java | 2 +- .../server/service/subscription/TbEntityCountSubCtx.java | 2 +- .../server/service/subscription/TbEntityDataSubCtx.java | 2 +- .../service/subscription/TbEntityDataSubscriptionService.java | 2 +- .../server/service/subscription/TbEntityLocalSubsInfo.java | 2 +- .../server/service/subscription/TbEntityRemoteSubsInfo.java | 2 +- .../server/service/subscription/TbEntitySubEvent.java | 2 +- .../server/service/subscription/TbEntityUpdatesInfo.java | 2 +- .../service/subscription/TbLocalSubscriptionService.java | 2 +- .../server/service/subscription/TbSubscription.java | 2 +- .../server/service/subscription/TbSubscriptionType.java | 2 +- .../server/service/subscription/TbSubscriptionUtils.java | 2 +- .../server/service/subscription/TbSubscriptionsInfo.java | 2 +- .../server/service/subscription/TbTimeSeriesSubscription.java | 2 +- .../thingsboard/server/service/sync/DefaultGitSyncService.java | 2 +- .../org/thingsboard/server/service/sync/GitSyncService.java | 2 +- .../service/sync/ie/DefaultEntitiesExportImportService.java | 2 +- .../server/service/sync/ie/EntitiesExportImportService.java | 2 +- .../sync/ie/exporting/DefaultExportableEntitiesService.java | 2 +- .../server/service/sync/ie/exporting/EntityExportService.java | 2 +- .../service/sync/ie/exporting/ExportableEntitiesService.java | 2 +- .../service/sync/ie/exporting/impl/AiModelExportService.java | 2 +- .../service/sync/ie/exporting/impl/AssetExportService.java | 2 +- .../sync/ie/exporting/impl/AssetProfileExportService.java | 2 +- .../sync/ie/exporting/impl/BaseEntityExportService.java | 2 +- .../service/sync/ie/exporting/impl/DashboardExportService.java | 2 +- .../sync/ie/exporting/impl/DefaultEntityExportService.java | 2 +- .../service/sync/ie/exporting/impl/DeviceExportService.java | 2 +- .../sync/ie/exporting/impl/DeviceProfileExportService.java | 2 +- .../sync/ie/exporting/impl/EntityViewExportService.java | 2 +- .../sync/ie/exporting/impl/NotificationRuleExportService.java | 2 +- .../ie/exporting/impl/NotificationTargetExportService.java | 2 +- .../ie/exporting/impl/NotificationTemplateExportService.java | 2 +- .../sync/ie/exporting/impl/OtaPackageExportService.java | 2 +- .../service/sync/ie/exporting/impl/ResourceExportService.java | 2 +- .../service/sync/ie/exporting/impl/RuleChainExportService.java | 2 +- .../sync/ie/exporting/impl/WidgetTypeExportService.java | 2 +- .../sync/ie/exporting/impl/WidgetsBundleExportService.java | 2 +- .../server/service/sync/ie/importing/EntityImportService.java | 2 +- .../sync/ie/importing/csv/AbstractBulkImportService.java | 2 +- .../service/sync/ie/importing/csv/ImportedEntityInfo.java | 2 +- .../service/sync/ie/importing/impl/AiModelImportService.java | 2 +- .../service/sync/ie/importing/impl/AssetImportService.java | 2 +- .../sync/ie/importing/impl/AssetProfileImportService.java | 2 +- .../sync/ie/importing/impl/BaseEntityImportService.java | 2 +- .../service/sync/ie/importing/impl/CustomerImportService.java | 2 +- .../service/sync/ie/importing/impl/DashboardImportService.java | 2 +- .../service/sync/ie/importing/impl/DeviceImportService.java | 2 +- .../sync/ie/importing/impl/DeviceProfileImportService.java | 2 +- .../sync/ie/importing/impl/EntityViewImportService.java | 2 +- .../service/sync/ie/importing/impl/ImportServiceException.java | 2 +- .../service/sync/ie/importing/impl/MissingEntityException.java | 2 +- .../sync/ie/importing/impl/NotificationRuleImportService.java | 2 +- .../ie/importing/impl/NotificationTargetImportService.java | 2 +- .../ie/importing/impl/NotificationTemplateImportService.java | 2 +- .../sync/ie/importing/impl/OtaPackageImportService.java | 2 +- .../service/sync/ie/importing/impl/ResourceImportService.java | 2 +- .../service/sync/ie/importing/impl/RuleChainImportService.java | 2 +- .../sync/ie/importing/impl/WidgetTypeImportService.java | 2 +- .../sync/ie/importing/impl/WidgetsBundleImportService.java | 2 +- .../service/sync/vc/DefaultEntitiesVersionControlService.java | 2 +- .../service/sync/vc/DefaultGitVersionControlQueueService.java | 2 +- .../server/service/sync/vc/EntitiesVersionControlService.java | 2 +- .../server/service/sync/vc/GitVersionControlQueueService.java | 2 +- .../server/service/sync/vc/LoadEntityException.java | 2 +- .../sync/vc/TbAbstractVersionControlSettingsService.java | 2 +- .../server/service/sync/vc/VersionControlTaskCacheEntry.java | 2 +- .../service/sync/vc/VersionControlTaskCaffeineCache.java | 2 +- .../server/service/sync/vc/VersionControlTaskRedisCache.java | 2 +- .../sync/vc/autocommit/AutoCommitSettingsCaffeineCache.java | 2 +- .../sync/vc/autocommit/AutoCommitSettingsRedisCache.java | 2 +- .../sync/vc/autocommit/DefaultTbAutoCommitSettingsService.java | 2 +- .../sync/vc/autocommit/TbAutoCommitSettingsService.java | 2 +- .../server/service/sync/vc/data/ClearRepositoryGitRequest.java | 2 +- .../server/service/sync/vc/data/CommitGitRequest.java | 2 +- .../server/service/sync/vc/data/ComplexEntitiesExportCtx.java | 2 +- .../server/service/sync/vc/data/ContentsDiffGitRequest.java | 2 +- .../server/service/sync/vc/data/EntitiesContentGitRequest.java | 2 +- .../server/service/sync/vc/data/EntitiesExportCtx.java | 2 +- .../server/service/sync/vc/data/EntitiesImportCtx.java | 2 +- .../server/service/sync/vc/data/EntityContentGitRequest.java | 2 +- .../server/service/sync/vc/data/EntityTypeExportCtx.java | 2 +- .../server/service/sync/vc/data/ListBranchesGitRequest.java | 2 +- .../server/service/sync/vc/data/ListEntitiesGitRequest.java | 2 +- .../server/service/sync/vc/data/ListVersionsGitRequest.java | 2 +- .../server/service/sync/vc/data/PendingGitRequest.java | 2 +- .../thingsboard/server/service/sync/vc/data/ReimportTask.java | 2 +- .../server/service/sync/vc/data/SimpleEntitiesExportCtx.java | 2 +- .../server/service/sync/vc/data/VersionsDiffGitRequest.java | 2 +- .../server/service/sync/vc/data/VoidGitRequest.java | 2 +- .../sync/vc/repository/DefaultTbRepositorySettingsService.java | 2 +- .../sync/vc/repository/RepositorySettingsCaffeineCache.java | 2 +- .../sync/vc/repository/RepositorySettingsRedisCache.java | 2 +- .../sync/vc/repository/TbRepositorySettingsService.java | 2 +- .../server/service/system/DefaultSystemInfoService.java | 2 +- .../thingsboard/server/service/system/SystemInfoService.java | 2 +- .../thingsboard/server/service/system/SystemPatchApplier.java | 2 +- .../server/service/telemetry/AbstractSubscriptionService.java | 2 +- .../server/service/telemetry/AlarmSubscriptionService.java | 2 +- .../thingsboard/server/service/telemetry/AttributeData.java | 2 +- .../service/telemetry/DefaultAlarmSubscriptionService.java | 2 +- .../server/service/telemetry/DefaultTbTelemetryService.java | 2 +- .../service/telemetry/DefaultTelemetrySubscriptionService.java | 2 +- .../server/service/telemetry/InternalTelemetryService.java | 2 +- .../server/service/telemetry/TbTelemetryService.java | 2 +- .../server/service/telemetry/TelemetrySubscriptionService.java | 2 +- .../java/org/thingsboard/server/service/telemetry/TsData.java | 2 +- .../service/transport/BasicCredentialsValidationResult.java | 2 +- .../service/transport/DefaultTbCoreToTransportService.java | 2 +- .../server/service/transport/DefaultTransportApiService.java | 2 +- .../server/service/transport/TbCoreToTransportService.java | 2 +- .../server/service/transport/TbCoreTransportApiService.java | 2 +- .../server/service/transport/TransportApiService.java | 2 +- .../transport/msg/TransportToDeviceActorMsgWrapper.java | 2 +- .../thingsboard/server/service/ttl/AbstractCleanUpService.java | 2 +- .../thingsboard/server/service/ttl/AlarmsCleanUpService.java | 2 +- .../server/service/ttl/AuditLogsCleanUpService.java | 2 +- .../server/service/ttl/EdgeEventsCleanUpService.java | 2 +- .../thingsboard/server/service/ttl/EventsCleanUpService.java | 2 +- .../server/service/ttl/KafkaEdgeTopicsCleanUpService.java | 2 +- .../server/service/ttl/NotificationsCleanUpService.java | 2 +- .../server/service/ttl/TimeseriesCleanUpService.java | 2 +- .../thingsboard/server/service/ttl/rpc/RpcCleanUpService.java | 2 +- .../server/service/update/DefaultUpdateService.java | 2 +- .../org/thingsboard/server/service/update/UpdateService.java | 2 +- .../main/java/org/thingsboard/server/service/ws/AuthCmd.java | 2 +- .../thingsboard/server/service/ws/DefaultWebSocketService.java | 2 +- .../java/org/thingsboard/server/service/ws/SessionEvent.java | 2 +- .../thingsboard/server/service/ws/WebSocketMsgEndpoint.java | 2 +- .../org/thingsboard/server/service/ws/WebSocketService.java | 2 +- .../org/thingsboard/server/service/ws/WebSocketSessionRef.java | 2 +- .../thingsboard/server/service/ws/WebSocketSessionType.java | 2 +- .../src/main/java/org/thingsboard/server/service/ws/WsCmd.java | 2 +- .../main/java/org/thingsboard/server/service/ws/WsCmdType.java | 2 +- .../org/thingsboard/server/service/ws/WsCommandsWrapper.java | 2 +- .../org/thingsboard/server/service/ws/WsSessionMetaData.java | 2 +- .../ws/notification/DefaultNotificationCommandsHandler.java | 2 +- .../service/ws/notification/NotificationCommandsHandler.java | 2 +- .../ws/notification/cmd/MarkAllNotificationsAsReadCmd.java | 2 +- .../ws/notification/cmd/MarkNotificationsAsReadCmd.java | 2 +- .../service/ws/notification/cmd/NotificationCmdsWrapper.java | 2 +- .../service/ws/notification/cmd/NotificationsCountSubCmd.java | 2 +- .../service/ws/notification/cmd/NotificationsSubCmd.java | 2 +- .../service/ws/notification/cmd/NotificationsUnsubCmd.java | 2 +- .../ws/notification/cmd/UnreadNotificationsCountUpdate.java | 2 +- .../service/ws/notification/cmd/UnreadNotificationsUpdate.java | 2 +- .../ws/notification/sub/AbstractNotificationSubscription.java | 2 +- .../service/ws/notification/sub/NotificationRequestUpdate.java | 2 +- .../server/service/ws/notification/sub/NotificationUpdate.java | 2 +- .../ws/notification/sub/NotificationsCountSubscription.java | 2 +- .../service/ws/notification/sub/NotificationsSubscription.java | 2 +- .../ws/notification/sub/NotificationsSubscriptionUpdate.java | 2 +- .../server/service/ws/telemetry/TelemetryFeature.java | 2 +- .../server/service/ws/telemetry/TelemetryWebSocketTextMsg.java | 2 +- .../server/service/ws/telemetry/cmd/TelemetryCmdsWrapper.java | 2 +- .../service/ws/telemetry/cmd/v1/AttributesSubscriptionCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v1/GetHistoryCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v1/SubscriptionCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v1/TelemetryPluginCmd.java | 2 +- .../service/ws/telemetry/cmd/v1/TimeseriesSubscriptionCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v2/AggHistoryCmd.java | 2 +- .../thingsboard/server/service/ws/telemetry/cmd/v2/AggKey.java | 2 +- .../server/service/ws/telemetry/cmd/v2/AggTimeSeriesCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v2/AlarmCountCmd.java | 2 +- .../service/ws/telemetry/cmd/v2/AlarmCountUnsubscribeCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v2/AlarmCountUpdate.java | 2 +- .../server/service/ws/telemetry/cmd/v2/AlarmDataCmd.java | 2 +- .../service/ws/telemetry/cmd/v2/AlarmDataUnsubscribeCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v2/AlarmDataUpdate.java | 2 +- .../server/service/ws/telemetry/cmd/v2/AlarmStatusCmd.java | 2 +- .../service/ws/telemetry/cmd/v2/AlarmStatusUnsubscribeCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v2/AlarmStatusUpdate.java | 2 +- .../server/service/ws/telemetry/cmd/v2/CmdUpdate.java | 2 +- .../server/service/ws/telemetry/cmd/v2/CmdUpdateType.java | 2 +- .../server/service/ws/telemetry/cmd/v2/DataCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v2/DataUpdate.java | 2 +- .../server/service/ws/telemetry/cmd/v2/EntityCountCmd.java | 2 +- .../service/ws/telemetry/cmd/v2/EntityCountUnsubscribeCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v2/EntityCountUpdate.java | 2 +- .../server/service/ws/telemetry/cmd/v2/EntityDataCmd.java | 2 +- .../service/ws/telemetry/cmd/v2/EntityDataUnsubscribeCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v2/EntityDataUpdate.java | 2 +- .../server/service/ws/telemetry/cmd/v2/EntityHistoryCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v2/GetTsCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v2/LatestValueCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v2/TimeSeriesCmd.java | 2 +- .../server/service/ws/telemetry/cmd/v2/UnsubscribeCmd.java | 2 +- .../service/ws/telemetry/sub/AlarmSubscriptionUpdate.java | 2 +- .../server/service/ws/telemetry/sub/SubscriptionState.java | 2 +- .../service/ws/telemetry/sub/TelemetrySubscriptionUpdate.java | 2 +- .../thingsboard/server/utils/CalculatedFieldArgumentUtils.java | 2 +- .../org/thingsboard/server/utils/CalculatedFieldUtils.java | 2 +- .../src/main/java/org/thingsboard/server/utils/CsvUtils.java | 2 +- .../thingsboard/server/utils/DebugModeRateLimitsConfig.java | 2 +- .../org/thingsboard/server/utils/LwM2mObjectModelUtils.java | 2 +- .../src/main/java/org/thingsboard/server/utils/MiscUtils.java | 2 +- .../java/org/thingsboard/server/utils/TbNodeUpgradeUtils.java | 2 +- application/src/main/resources/logback.xml | 2 +- .../src/main/resources/templates/2fa.verification.code.ftl | 2 +- application/src/main/resources/templates/account.activated.ftl | 2 +- application/src/main/resources/templates/account.lockout.ftl | 2 +- application/src/main/resources/templates/activation.ftl | 2 +- .../src/main/resources/templates/password.was.reset.ftl | 2 +- application/src/main/resources/templates/reset.password.ftl | 2 +- application/src/main/resources/templates/state.disabled.ftl | 2 +- application/src/main/resources/templates/state.enabled.ftl | 2 +- application/src/main/resources/templates/state.warning.ftl | 2 +- application/src/main/resources/templates/test.ftl | 2 +- application/src/main/resources/thingsboard.yml | 2 +- .../server/actors/device/DeviceActorMessageProcessorTest.java | 2 +- .../thingsboard/server/actors/rule/DefaultTbContextTest.java | 2 +- .../thingsboard/server/actors/service/ComponentActorTest.java | 2 +- .../org/thingsboard/server/actors/stats/StatsActorTest.java | 2 +- .../thingsboard/server/actors/stats/StatsPersistMsgTest.java | 2 +- .../org/thingsboard/server/actors/tenant/TenantActorTest.java | 2 +- .../server/cache/CaffeineCacheDefaultConfigurationTest.java | 2 +- .../thingsboard/server/cf/CalculatedFieldIntegrationTest.java | 2 +- .../thingsboard/server/controller/AbstractControllerTest.java | 2 +- .../server/controller/AbstractInMemoryStorageTest.java | 2 +- .../server/controller/AbstractNotifyEntityTest.java | 2 +- .../server/controller/AbstractRuleEngineControllerTest.java | 2 +- .../org/thingsboard/server/controller/AbstractWebTest.java | 2 +- .../org/thingsboard/server/controller/AdminControllerTest.java | 2 +- .../thingsboard/server/controller/AiModelControllerTest.java | 2 +- .../server/controller/AlarmCommentControllerTest.java | 2 +- .../org/thingsboard/server/controller/AlarmControllerTest.java | 2 +- .../org/thingsboard/server/controller/AssetControllerTest.java | 2 +- .../server/controller/AssetProfileControllerTest.java | 2 +- .../thingsboard/server/controller/AuditLogControllerTest.java | 2 +- .../AuditLogControllerTest_DedicatedEventsDataSource.java | 2 +- .../org/thingsboard/server/controller/AuthControllerTest.java | 2 +- .../thingsboard/server/controller/BaseQueueControllerTest.java | 2 +- .../server/controller/CalculatedFieldControllerTest.java | 2 +- .../server/controller/ComponentDescriptorControllerTest.java | 2 +- .../thingsboard/server/controller/CustomerControllerTest.java | 2 +- .../thingsboard/server/controller/DashboardControllerTest.java | 2 +- .../server/controller/DeviceConnectivityControllerTest.java | 2 +- .../thingsboard/server/controller/DeviceControllerTest.java | 2 +- .../server/controller/DeviceProfileControllerTest.java | 2 +- .../thingsboard/server/controller/DomainControllerTest.java | 2 +- .../org/thingsboard/server/controller/EdgeControllerTest.java | 2 +- .../thingsboard/server/controller/EdgeEventControllerTest.java | 2 +- .../org/thingsboard/server/controller/EdqsControllerTest.java | 2 +- .../server/controller/EdqsEntityQueryControllerTest.java | 2 +- .../server/controller/EntityQueryControllerTest.java | 2 +- .../server/controller/EntityRelationControllerTest.java | 2 +- .../server/controller/EntityViewControllerTest.java | 2 +- .../org/thingsboard/server/controller/HomePageApiTest.java | 2 +- .../org/thingsboard/server/controller/ImageControllerTest.java | 2 +- .../server/controller/MobileAppBundleControllerTest.java | 2 +- .../thingsboard/server/controller/MobileAppControllerTest.java | 2 +- .../server/controller/Oauth2ClientControllerTest.java | 2 +- .../server/controller/OtaPackageControllerTest.java | 2 +- .../server/controller/QrCodeSettingsControllerTest.java | 2 +- .../thingsboard/server/controller/RepositorySettingsTest.java | 2 +- .../org/thingsboard/server/controller/RpcControllerTest.java | 2 +- .../thingsboard/server/controller/RuleChainControllerTest.java | 2 +- .../server/controller/RuleEngineControllerTest.java | 2 +- .../server/controller/TbResourceControllerTest.java | 2 +- .../thingsboard/server/controller/TbTestWebSocketClient.java | 2 +- .../thingsboard/server/controller/TelemetryControllerTest.java | 2 +- .../thingsboard/server/controller/TenantControllerTest.java | 2 +- .../server/controller/TenantProfileControllerTest.java | 2 +- .../thingsboard/server/controller/TrendzControllerTest.java | 2 +- .../thingsboard/server/controller/TwoFactorAuthConfigTest.java | 2 +- .../org/thingsboard/server/controller/TwoFactorAuthTest.java | 2 +- .../org/thingsboard/server/controller/UserControllerTest.java | 2 +- .../org/thingsboard/server/controller/WebsocketApiTest.java | 2 +- .../server/controller/WidgetTypeControllerTest.java | 2 +- .../server/controller/WidgetsBundleControllerTest.java | 2 +- .../server/controller/plugin/TbWebSocketHandlerTest.java | 2 +- .../java/org/thingsboard/server/edge/AbstractEdgeTest.java | 2 +- .../test/java/org/thingsboard/server/edge/AlarmEdgeTest.java | 2 +- .../test/java/org/thingsboard/server/edge/AssetEdgeTest.java | 2 +- .../java/org/thingsboard/server/edge/AssetProfileEdgeTest.java | 2 +- .../org/thingsboard/server/edge/CalculatedFieldEdgeTest.java | 2 +- .../java/org/thingsboard/server/edge/CustomerEdgeTest.java | 2 +- .../java/org/thingsboard/server/edge/DashboardEdgeTest.java | 2 +- .../test/java/org/thingsboard/server/edge/DeviceEdgeTest.java | 2 +- .../org/thingsboard/server/edge/DeviceProfileEdgeTest.java | 2 +- .../src/test/java/org/thingsboard/server/edge/EdgeTest.java | 2 +- .../java/org/thingsboard/server/edge/EntityViewEdgeTest.java | 2 +- .../java/org/thingsboard/server/edge/NotificationEdgeTest.java | 2 +- .../test/java/org/thingsboard/server/edge/OAuth2EdgeTest.java | 2 +- .../java/org/thingsboard/server/edge/OtaPackageEdgeTest.java | 2 +- .../test/java/org/thingsboard/server/edge/QueueEdgeTest.java | 2 +- .../java/org/thingsboard/server/edge/RelationEdgeTest.java | 2 +- .../java/org/thingsboard/server/edge/ResourceEdgeTest.java | 2 +- .../java/org/thingsboard/server/edge/RuleChainEdgeTest.java | 2 +- .../java/org/thingsboard/server/edge/TelemetryEdgeTest.java | 2 +- .../test/java/org/thingsboard/server/edge/TenantEdgeTest.java | 2 +- .../org/thingsboard/server/edge/TenantProfileEdgeTest.java | 2 +- .../test/java/org/thingsboard/server/edge/UserEdgeTest.java | 2 +- .../test/java/org/thingsboard/server/edge/WidgetEdgeTest.java | 2 +- .../org/thingsboard/server/edge/imitator/EdgeImitator.java | 2 +- .../server/queue/discovery/HashPartitionServiceTest.java | 2 +- .../rules/flow/AbstractRuleEngineFlowIntegrationTest.java | 2 +- .../rules/flow/sql/RuleEngineFlowSqlIntegrationTest.java | 2 +- .../lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java | 2 +- .../lifecycle/sql/RuleEngineLifecycleSqlIntegrationTest.java | 2 +- .../org/thingsboard/server/service/apiusage/ApiUsageTest.java | 2 +- .../service/apiusage/DefaultTbApiUsageStateServiceTest.java | 2 +- .../service/cf/ctx/state/ScriptCalculatedFieldStateTest.java | 2 +- .../service/cf/ctx/state/SimpleCalculatedFieldStateTest.java | 2 +- .../service/cf/ctx/state/SingleValueArgumentEntryTest.java | 2 +- .../service/cf/ctx/state/TsRollingArgumentEntryTest.java | 2 +- .../service/device/provision/DeviceProvisionServiceTest.java | 2 +- .../server/service/edge/EdgeMsgConstructorUtilsTest.java | 2 +- .../org/thingsboard/server/service/edge/EdgeStatsTest.java | 2 +- .../server/service/entitiy/EdqsEntityServiceTest.java | 2 +- .../thingsboard/server/service/entitiy/EntityServiceTest.java | 2 +- .../server/service/entitiy/ai/DefaultTbAiModelServiceTest.java | 2 +- .../service/entitiy/alarm/DefaultTbAlarmServiceTest.java | 2 +- .../entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java | 2 +- .../service/entitiy/dashboard/DashboardSyncServiceTest.java | 2 +- .../entitiy/entityview/DefaultTbEntityViewServiceTest.java | 2 +- .../server/service/housekeeper/HousekeeperServiceTest.java | 2 +- .../thingsboard/server/service/install/InstallScriptsTest.java | 2 +- .../service/install/SqlEntityDatabaseSchemaServiceTest.java | 2 +- .../service/install/update/DefaultDataUpdateServiceTest.java | 2 +- .../org/thingsboard/server/service/job/JobManagerTest.java | 2 +- .../service/job/JobManagerTest_EntityPartitioningStrategy.java | 2 +- .../org/thingsboard/server/service/job/TestTaskProcessor.java | 2 +- .../server/service/limits/RateLimitServiceTest.java | 2 +- .../org/thingsboard/server/service/mail/TbMailSenderTest.java | 2 +- .../service/notification/AbstractNotificationApiTest.java | 2 +- .../server/service/notification/NotificationApiTest.java | 2 +- .../server/service/notification/NotificationApiWsClient.java | 2 +- .../server/service/notification/NotificationRuleApiTest.java | 2 +- .../server/service/notification/NotificationTargetApiTest.java | 2 +- .../service/notification/NotificationTemplateApiTest.java | 2 +- .../service/notification/TestNotificationSettingsService.java | 2 +- .../server/service/queue/DefaultTbClusterServiceTest.java | 2 +- .../server/service/queue/DefaultTbCoreConsumerServiceTest.java | 2 +- .../server/service/queue/TbMsgPackCallbackTest.java | 2 +- .../server/service/queue/TbMsgPackProcessingContextTest.java | 2 +- .../queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java | 2 +- .../service/queue/ruleengine/TbRuleEngineStrategyTest.java | 2 +- .../server/service/resource/DefaultResourceDataCacheTest.java | 2 +- .../server/service/resource/sql/BaseTbResourceServiceTest.java | 2 +- .../server/service/rpc/DefaultTbRuleEngineRpcServiceTest.java | 2 +- .../thingsboard/server/service/rpc/RpcSubmitStrategyTest.java | 2 +- .../service/ruleengine/DefaultRuleEngineCallServiceTest.java | 2 +- .../server/service/script/AbstractTbelInvokeTest.java | 2 +- .../thingsboard/server/service/script/MockJsInvokeService.java | 2 +- .../server/service/script/NashornJsInvokeServiceTest.java | 2 +- .../server/service/script/RemoteJsInvokeServiceTest.java | 2 +- .../server/service/script/TbelInvokeDocsIoTest.java | 2 +- .../server/service/script/TbelInvokeServiceTest.java | 2 +- .../server/service/security/auth/JwtTokenFactoryTest.java | 2 +- .../server/service/security/auth/TokenOutdatingTest.java | 2 +- .../server/service/security/auth/oauth2/CookieUtilsTest.java | 2 +- .../auth/oauth2/Oauth2AuthenticationSuccessHandlerTest.java | 2 +- .../thingsboard/server/service/sms/DefaultSmsServiceTest.java | 2 +- .../thingsboard/server/service/sms/smpp/SmppSmsSenderTest.java | 2 +- .../service/sql/SequentialTimeseriesPersistenceTest.java | 2 +- .../server/service/state/DefaultDeviceStateManagerTest.java | 2 +- .../server/service/state/DefaultDeviceStateServiceTest.java | 2 +- .../server/service/stats/DevicesStatisticsTest.java | 2 +- .../subscription/DefaultTbLocalSubscriptionServiceTest.java | 2 +- .../server/service/subscription/TbEntityDataSubCtxTest.java | 2 +- .../server/service/subscription/TbEntityLocalSubsInfoTest.java | 2 +- .../server/service/sync/ie/ExportImportServiceSqlTest.java | 2 +- .../thingsboard/server/service/sync/vc/VersionControlTest.java | 2 +- .../telemetry/DefaultTelemetrySubscriptionServiceTest.java | 2 +- .../service/transport/DefaultTransportApiServiceTest.java | 2 +- .../server/service/ttl/AlarmsCleanUpServiceTest.java | 2 +- .../server/service/ttl/EventsCleanUpServiceTest.java | 2 +- .../org/thingsboard/server/system/BaseHttpDeviceApiTest.java | 2 +- .../org/thingsboard/server/system/BaseRestApiLimitsTest.java | 2 +- .../thingsboard/server/system/RestTemplateConvertersTest.java | 2 +- .../org/thingsboard/server/system/SystemPatchApplierTest.java | 2 +- .../org/thingsboard/server/system/sql/DeviceApiSqlTest.java | 2 +- .../thingsboard/server/system/sql/RestApiLimitsSqlTest.java | 2 +- .../server/transport/AbstractTransportIntegrationTest.java | 2 +- .../thingsboard/server/transport/TransportNoSqlTestSuite.java | 2 +- .../server/transport/coap/AbstractCoapIntegrationTest.java | 2 +- .../thingsboard/server/transport/coap/CoapTestCallback.java | 2 +- .../org/thingsboard/server/transport/coap/CoapTestClient.java | 2 +- .../server/transport/coap/CoapTestConfigProperties.java | 2 +- .../coap/attributes/AbstractCoapAttributesIntegrationTest.java | 2 +- .../request/CoapAttributesRequestIntegrationTest.java | 2 +- .../request/CoapAttributesRequestJsonIntegrationTest.java | 2 +- .../request/CoapAttributesRequestProtoIntegrationTest.java | 2 +- .../updates/CoapAttributesUpdatesIntegrationTest.java | 2 +- .../updates/CoapAttributesUpdatesJsonIntegrationTest.java | 2 +- .../updates/CoapAttributesUpdatesProtoIntegrationTest.java | 2 +- .../server/transport/coap/claim/CoapClaimDeviceTest.java | 2 +- .../server/transport/coap/claim/CoapClaimJsonDeviceTest.java | 2 +- .../server/transport/coap/claim/CoapClaimProtoDeviceTest.java | 2 +- .../transport/coap/client/CoapClientIntegrationTest.java | 2 +- .../transport/coap/provision/CoapProvisionJsonDeviceTest.java | 2 +- .../transport/coap/provision/CoapProvisionProtoDeviceTest.java | 2 +- .../coap/rpc/AbstractCoapServerSideRpcIntegrationTest.java | 2 +- .../coap/rpc/CoapServerSideRpcDefaultIntegrationTest.java | 2 +- .../coap/rpc/CoapServerSideRpcJsonIntegrationTest.java | 2 +- .../coap/rpc/CoapServerSideRpcProtoIntegrationTest.java | 2 +- .../coap/security/AbstractCoapSecurityIntegrationTest.java | 2 +- .../security/sql/CoapClientX509SecurityJksIntegrationTest.java | 2 +- .../security/sql/CoapClientX509SecurityPemIntegrationTest.java | 2 +- .../telemetry/attributes/CoapAttributesIntegrationTest.java | 2 +- .../attributes/CoapAttributesJsonIntegrationTest.java | 2 +- .../attributes/CoapAttributesProtoIntegrationTest.java | 2 +- .../timeseries/AbstractCoapTimeseriesIntegrationTest.java | 2 +- .../timeseries/AbstractCoapTimeseriesJsonIntegrationTest.java | 2 +- .../timeseries/AbstractCoapTimeseriesProtoIntegrationTest.java | 2 +- .../timeseries/nosql/CoapTimeseriesNoSqlIntegrationTest.java | 2 +- .../nosql/CoapTimeseriesNoSqlJsonIntegrationTest.java | 2 +- .../nosql/CoapTimeseriesNoSqlProtoIntegrationTest.java | 2 +- .../timeseries/sql/CoapTimeseriesSqlIntegrationTest.java | 2 +- .../timeseries/sql/CoapTimeseriesSqlJsonIntegrationTest.java | 2 +- .../timeseries/sql/CoapTimeseriesSqlProtoIntegrationTest.java | 2 +- .../thingsboard/server/transport/coap/x509/CertPrivateKey.java | 2 +- .../server/transport/coap/x509/CoapClientX509Test.java | 2 +- .../transport/coap/x509/TbAdvancedCertificateVerifier.java | 2 +- .../server/transport/lwm2m/AbstractLwM2MIntegrationTest.java | 2 +- .../thingsboard/server/transport/lwm2m/Lwm2mTestHelper.java | 2 +- .../lwm2m/attributes/DefaultLwM2mAttributeParserTest.java | 2 +- .../transport/lwm2m/attributes/DefaultLwM2mLinkParserTest.java | 2 +- .../server/transport/lwm2m/attributes/LwM2mAttributesTest.java | 2 +- .../server/transport/lwm2m/client/DtlsSessionLogger.java | 2 +- .../server/transport/lwm2m/client/FwLwM2MDevice.java | 2 +- .../server/transport/lwm2m/client/LwM2MLocationParams.java | 2 +- .../server/transport/lwm2m/client/LwM2MTestClient.java | 2 +- .../transport/lwm2m/client/LwM2mBinaryAppDataContainer.java | 2 +- .../server/transport/lwm2m/client/LwM2mLocation.java | 2 +- .../server/transport/lwm2m/client/LwM2mTemperatureSensor.java | 2 +- .../thingsboard/server/transport/lwm2m/client/Lwm2mServer.java | 2 +- .../server/transport/lwm2m/client/SimpleLwM2MDevice.java | 2 +- .../server/transport/lwm2m/client/SwLwM2MDevice.java | 2 +- .../transport/lwm2m/ota/AbstractOtaLwM2MIntegrationTest.java | 2 +- .../transport/lwm2m/ota/sql/Ota5LwM2MIntegrationTest.java | 2 +- .../transport/lwm2m/ota/sql/Ota9LwM2MIntegrationTest.java | 2 +- .../rpc/AbstractRpcLwM2MIntegrationObserve_Ver_1_0_Test.java | 2 +- .../rpc/AbstractRpcLwM2MIntegrationObserve_Ver_1_1_Test.java | 2 +- .../rpc/AbstractRpcLwM2MIntegrationObserve_Ver_1_2_Test.java | 2 +- .../transport/lwm2m/rpc/AbstractRpcLwM2MIntegrationTest.java | 2 +- .../lwm2m/rpc/sql/RpcLwm2MIntegrationObserveCompositeTest.java | 2 +- .../transport/lwm2m/rpc/sql/RpcLwm2mIntegrationCreateTest.java | 2 +- .../rpc/sql/RpcLwm2mIntegrationDataReceivedFromClientTest.java | 2 +- .../transport/lwm2m/rpc/sql/RpcLwm2mIntegrationDeleteTest.java | 2 +- .../lwm2m/rpc/sql/RpcLwm2mIntegrationDiscoverTest.java | 2 +- .../sql/RpcLwm2mIntegrationDiscoverWriteAttributesTest.java | 2 +- .../lwm2m/rpc/sql/RpcLwm2mIntegrationExecuteTest.java | 2 +- .../lwm2m/rpc/sql/RpcLwm2mIntegrationObserveTest.java | 2 +- .../lwm2m/rpc/sql/RpcLwm2mIntegrationObserveVer10Test.java | 2 +- .../lwm2m/rpc/sql/RpcLwm2mIntegrationObserveVer11Test.java | 2 +- .../lwm2m/rpc/sql/RpcLwm2mIntegrationObserveVer12Test.java | 2 +- .../rpc/sql/RpcLwm2mIntegrationReadCollectedValueTest.java | 2 +- .../transport/lwm2m/rpc/sql/RpcLwm2mIntegrationReadTest.java | 2 +- .../lwm2m/rpc/sql/RpcLwm2mIntegrationWriteCborTest.java | 2 +- .../transport/lwm2m/rpc/sql/RpcLwm2mIntegrationWriteTest.java | 2 +- .../lwm2m/security/AbstractSecurityLwM2MIntegrationTest.java | 2 +- .../AbstractSecurityLwM2MIntegrationDtlsCidLength0Test.java | 2 +- .../AbstractSecurityLwM2MIntegrationDtlsCidLength3Test.java | 2 +- .../AbstractSecurityLwM2MIntegrationDtlsCidLengthNullTest.java | 2 +- .../cid/AbstractSecurityLwM2MIntegrationDtlsCidLengthTest.java | 2 +- .../NoSecLwM2MIntegrationDtlsCidLengthTest.java | 2 +- .../PskLwm2mIntegrationDtlsCidLengthTest.java | 2 +- .../NoSecLwM2MIntegrationDtlsCidLengthTest.java | 2 +- .../PskLwm2mIntegrationDtlsCidLengthTest.java | 2 +- .../NoSecLwM2MIntegrationDtlsCidLengthTest.java | 2 +- .../PskLwm2mIntegrationDtlsCidLengthTest.java | 2 +- .../diffPort/AbstractLwM2MIntegrationDiffPortTest.java | 2 +- .../lwm2m/security/diffPort/LwM2MIntegrationDiffPortTest.java | 2 +- .../lwm2m/security/sql/NoSecLwM2MIntegrationTest.java | 2 +- .../transport/lwm2m/security/sql/PskLwm2mIntegrationTest.java | 2 +- .../transport/lwm2m/security/sql/RpkLwM2MIntegrationTest.java | 2 +- .../lwm2m/security/sql/X509_NoTrustLwM2MIntegrationTest.java | 2 +- .../lwm2m/security/sql/X509_TrustLwM2MIntegrationTest.java | 2 +- .../transport/lwm2m/server/LwM2mTransportServerHelperTest.java | 2 +- .../ObserveStrategyTransportConfigurationTest.java | 2 +- .../ObserveStrategyWithNoSecQueueModeConnectTest.java | 2 +- .../server/transport/mqtt/AbstractMqttIntegrationTest.java | 2 +- .../server/transport/mqtt/MqttGatewayRateLimitsTest.java | 2 +- .../server/transport/mqtt/MqttTestConfigProperties.java | 2 +- .../server/transport/mqtt/mqttv3/MqttTestCallback.java | 2 +- .../server/transport/mqtt/mqttv3/MqttTestClient.java | 2 +- .../mqtt/mqttv3/MqttTestSubscribeOnTopicCallback.java | 2 +- .../attributes/AbstractMqttAttributesIntegrationTest.java | 2 +- ...tAttributesRequestBackwardCompatibilityIntegrationTest.java | 2 +- .../request/MqttAttributesRequestIntegrationTest.java | 2 +- .../request/MqttAttributesRequestJsonIntegrationTest.java | 2 +- .../request/MqttAttributesRequestProtoIntegrationTest.java | 2 +- ...tAttributesUpdatesBackwardCompatibilityIntegrationTest.java | 2 +- .../updates/MqttAttributesUpdatesIntegrationTest.java | 2 +- .../updates/MqttAttributesUpdatesJsonIntegrationTest.java | 2 +- .../updates/MqttAttributesUpdatesProtoIntegrationTest.java | 2 +- .../mqttv3/claim/MqttClaimBackwardCompatibilityDeviceTest.java | 2 +- .../transport/mqtt/mqttv3/claim/MqttClaimDeviceTest.java | 2 +- .../transport/mqtt/mqttv3/claim/MqttClaimJsonDeviceTest.java | 2 +- .../transport/mqtt/mqttv3/claim/MqttClaimProtoDeviceTest.java | 2 +- .../mqtt/mqttv3/client/AbstractMqttClientConnectionTest.java | 2 +- .../transport/mqtt/mqttv3/client/MqttClientConnectionTest.java | 2 +- .../mqtt/mqttv3/credentials/BasicMqttCredentialsTest.java | 2 +- .../mqtt/mqttv3/provision/MqttProvisionJsonDeviceTest.java | 2 +- .../mqtt/mqttv3/provision/MqttProvisionProtoDeviceTest.java | 2 +- .../mqttv3/rpc/AbstractMqttServerSideRpcIntegrationTest.java | 2 +- .../mqtt/mqttv3/rpc/MqttClientSideRpcIntegrationTest.java | 2 +- .../MqttServerSideRpcBackwardCompatibilityIntegrationTest.java | 2 +- .../mqttv3/rpc/MqttServerSideRpcDefaultIntegrationTest.java | 2 +- .../mqtt/mqttv3/rpc/MqttServerSideRpcJsonIntegrationTest.java | 2 +- .../mqtt/mqttv3/rpc/MqttServerSideRpcProtoIntegrationTest.java | 2 +- .../rpc/MqttServerSideRpcSequenceOnAckIntegrationTest.java | 2 +- .../MqttServerSideRpcSequenceOnResponseIntegrationTest.java | 2 +- .../telemetry/attributes/MqttAttributesIntegrationTest.java | 2 +- .../attributes/MqttAttributesJsonIntegrationTest.java | 2 +- .../attributes/MqttAttributesProtoIntegrationTest.java | 2 +- .../timeseries/AbstractMqttTimeseriesIntegrationTest.java | 2 +- .../timeseries/AbstractMqttTimeseriesJsonIntegrationTest.java | 2 +- .../timeseries/AbstractMqttTimeseriesProtoIntegrationTest.java | 2 +- .../timeseries/nosql/MqttTimeseriesNoSqlIntegrationTest.java | 2 +- .../nosql/MqttTimeseriesNoSqlJsonIntegrationTest.java | 2 +- .../nosql/MqttTimeseriesNoSqlProtoIntegrationTest.java | 2 +- .../timeseries/sql/MqttTimeseriesSqlIntegrationTest.java | 2 +- .../timeseries/sql/MqttTimeseriesSqlJsonIntegrationTest.java | 2 +- .../timeseries/sql/MqttTimeseriesSqlProtoIntegrationTest.java | 2 +- .../server/transport/mqtt/mqttv5/AbstractMqttV5Test.java | 2 +- .../server/transport/mqtt/mqttv5/MqttV5TestCallback.java | 2 +- .../server/transport/mqtt/mqttv5/MqttV5TestClient.java | 2 +- .../mqtt/mqttv5/attributes/AbstractAttributesMqttV5Test.java | 2 +- .../mqtt/mqttv5/attributes/updates/AttributesUpdatesTest.java | 2 +- .../mqtt/mqttv5/attributes/upload/AttributesPublishTest.java | 2 +- .../transport/mqtt/mqttv5/claim/AbstractMqttV5ClaimTest.java | 2 +- .../server/transport/mqtt/mqttv5/claim/MqttV5ClaimTest.java | 2 +- .../client/connection/AbstractMqttV5ClientConnectionTest.java | 2 +- .../mqttv5/client/connection/MqttV5ClientConnectionTest.java | 2 +- .../mqttv5/client/publish/AbstractMqttV5ClientPublishTest.java | 2 +- .../mqtt/mqttv5/client/publish/MqttV5ClientPublishTest.java | 2 +- .../client/subscribe/AbstractMqttV5ClientSubscriptionTest.java | 2 +- .../mqttv5/client/subscribe/MqttV5ClientSubscriptionTest.java | 2 +- .../unsubscribe/AbstractMqttV5ClientUnsubscribeTest.java | 2 +- .../mqttv5/client/unsubscribe/MqttV5ClientUnsubscribeTest.java | 2 +- .../mqtt/mqttv5/provision/MqttV5ProvisionDeviceTest.java | 2 +- .../transport/mqtt/mqttv5/rpc/AbstractMqttV5RpcTest.java | 2 +- ...oseTransportSessionOnRpcDeliveryTimeoutIntegrationTest.java | 2 +- .../server/transport/mqtt/mqttv5/rpc/MqttV5RpcTest.java | 2 +- .../mqtt/mqttv5/timeseries/AbstractMqttV5TimeseriesTest.java | 2 +- .../transport/mqtt/mqttv5/timeseries/MqttV5TimeseriesTest.java | 2 +- .../mqtt/sparkplug/AbstractMqttV5ClientSparkplugTest.java | 2 +- .../AbstractMqttV5ClientSparkplugAttributesTest.java | 2 +- .../MqttV5ClientSparkplugBAttributesInProfileTest.java | 2 +- .../attributes/MqttV5ClientSparkplugBAttributesTest.java | 2 +- .../AbstractMqttV5ClientSparkplugConnectionTest.java | 2 +- .../connection/MqttV5ClientSparkplugBConnectionTest.java | 2 +- .../mqtt/sparkplug/rpc/AbstractMqttV5RpcSparkplugTest.java | 2 +- .../transport/mqtt/sparkplug/rpc/MqttV5RpcSparkplugTest.java | 2 +- .../timeseries/AbstractMqttV5ClientSparkplugTelemetryTest.java | 2 +- .../timeseries/MqttV5ClientSparkplugBTelemetryTest.java | 2 +- .../org/thingsboard/server/utils/TbNodeUpgradeUtilsTest.java | 2 +- build.sh | 2 +- build_proto.sh | 2 +- common/actor/pom.xml | 2 +- .../java/org/thingsboard/server/actors/AbstractTbActor.java | 2 +- .../org/thingsboard/server/actors/DefaultTbActorSystem.java | 2 +- .../main/java/org/thingsboard/server/actors/Dispatcher.java | 2 +- .../org/thingsboard/server/actors/InitFailureStrategy.java | 2 +- .../org/thingsboard/server/actors/ProcessFailureStrategy.java | 2 +- .../src/main/java/org/thingsboard/server/actors/TbActor.java | 2 +- .../java/org/thingsboard/server/actors/TbActorCreator.java | 2 +- .../main/java/org/thingsboard/server/actors/TbActorCtx.java | 2 +- .../java/org/thingsboard/server/actors/TbActorException.java | 2 +- .../src/main/java/org/thingsboard/server/actors/TbActorId.java | 2 +- .../java/org/thingsboard/server/actors/TbActorMailbox.java | 2 +- .../server/actors/TbActorNotRegisteredException.java | 2 +- .../main/java/org/thingsboard/server/actors/TbActorRef.java | 2 +- .../main/java/org/thingsboard/server/actors/TbActorSystem.java | 2 +- .../org/thingsboard/server/actors/TbActorSystemSettings.java | 2 +- .../server/actors/TbCalculatedFieldEntityActorId.java | 2 +- .../java/org/thingsboard/server/actors/TbEntityActorId.java | 2 +- .../thingsboard/server/actors/TbRuleNodeUpdateException.java | 2 +- .../java/org/thingsboard/server/actors/TbStringActorId.java | 2 +- .../java/org/thingsboard/server/actors/ActorSystemTest.java | 2 +- .../test/java/org/thingsboard/server/actors/ActorTestCtx.java | 2 +- .../java/org/thingsboard/server/actors/FailedToInitActor.java | 2 +- .../test/java/org/thingsboard/server/actors/IntTbActorMsg.java | 2 +- .../java/org/thingsboard/server/actors/SlowCreateActor.java | 2 +- .../test/java/org/thingsboard/server/actors/SlowInitActor.java | 2 +- .../test/java/org/thingsboard/server/actors/TestRootActor.java | 2 +- common/cache/pom.xml | 2 +- .../src/main/java/org/thingsboard/server/cache/CacheSpecs.java | 2 +- .../main/java/org/thingsboard/server/cache/CacheSpecsMap.java | 2 +- .../thingsboard/server/cache/CaffeineTbCacheTransaction.java | 2 +- .../thingsboard/server/cache/CaffeineTbTransactionalCache.java | 2 +- .../java/org/thingsboard/server/cache/RedisSslCredentials.java | 2 +- .../org/thingsboard/server/cache/RedisTbCacheTransaction.java | 2 +- .../thingsboard/server/cache/RedisTbTransactionalCache.java | 2 +- .../thingsboard/server/cache/SimpleTbCacheValueWrapper.java | 2 +- .../thingsboard/server/cache/TBRedisCacheConfiguration.java | 2 +- .../thingsboard/server/cache/TBRedisClusterConfiguration.java | 2 +- .../thingsboard/server/cache/TBRedisSentinelConfiguration.java | 2 +- .../server/cache/TBRedisStandaloneConfiguration.java | 2 +- .../java/org/thingsboard/server/cache/TbCacheTransaction.java | 2 +- .../java/org/thingsboard/server/cache/TbCacheValueWrapper.java | 2 +- .../thingsboard/server/cache/TbCaffeineCacheConfiguration.java | 2 +- .../org/thingsboard/server/cache/TbJavaRedisSerializer.java | 2 +- .../org/thingsboard/server/cache/TbJsonRedisSerializer.java | 2 +- .../java/org/thingsboard/server/cache/TbRedisSerializer.java | 2 +- .../org/thingsboard/server/cache/TbTransactionalCache.java | 2 +- .../thingsboard/server/cache/TbTypedJsonRedisSerializer.java | 2 +- .../java/org/thingsboard/server/cache/VersionedCacheKey.java | 2 +- .../org/thingsboard/server/cache/VersionedCaffeineTbCache.java | 2 +- .../org/thingsboard/server/cache/VersionedRedisTbCache.java | 2 +- .../java/org/thingsboard/server/cache/VersionedTbCache.java | 2 +- .../server/cache/customer/CustomerCacheEvictEvent.java | 2 +- .../thingsboard/server/cache/customer/CustomerCacheKey.java | 2 +- .../server/cache/customer/CustomerCaffeineCache.java | 2 +- .../thingsboard/server/cache/customer/CustomerRedisCache.java | 2 +- .../thingsboard/server/cache/device/DeviceCacheEvictEvent.java | 2 +- .../org/thingsboard/server/cache/device/DeviceCacheKey.java | 2 +- .../thingsboard/server/cache/device/DeviceCaffeineCache.java | 2 +- .../org/thingsboard/server/cache/device/DeviceRedisCache.java | 2 +- .../org/thingsboard/server/cache/edge/EdgeCacheEvictEvent.java | 2 +- .../java/org/thingsboard/server/cache/edge/EdgeCacheKey.java | 2 +- .../org/thingsboard/server/cache/edge/EdgeCaffeineCache.java | 2 +- .../java/org/thingsboard/server/cache/edge/EdgeRedisCache.java | 2 +- .../thingsboard/server/cache/edge/RelatedEdgesCacheKey.java | 2 +- .../thingsboard/server/cache/edge/RelatedEdgesCacheValue.java | 2 +- .../server/cache/edge/RelatedEdgesCaffeineCache.java | 2 +- .../thingsboard/server/cache/edge/RelatedEdgesEvictEvent.java | 2 +- .../thingsboard/server/cache/edge/RelatedEdgesRedisCache.java | 2 +- .../server/cache/limits/DefaultRateLimitService.java | 2 +- .../org/thingsboard/server/cache/limits/RateLimitService.java | 2 +- .../thingsboard/server/cache/limits/TenantProfileProvider.java | 2 +- .../thingsboard/server/cache/ota/CaffeineOtaPackageCache.java | 2 +- .../org/thingsboard/server/cache/ota/OtaPackageDataCache.java | 2 +- .../thingsboard/server/cache/ota/RedisOtaPackageDataCache.java | 2 +- .../server/cache/resourceInfo/ResourceInfoCacheKey.java | 2 +- .../server/cache/resourceInfo/ResourceInfoCaffeineCache.java | 2 +- .../server/cache/resourceInfo/ResourceInfoEvictEvent.java | 2 +- .../server/cache/resourceInfo/ResourceInfoRedisCache.java | 2 +- .../org/thingsboard/server/cache/user/UserCacheEvictEvent.java | 2 +- .../java/org/thingsboard/server/cache/user/UserCacheKey.java | 2 +- .../org/thingsboard/server/cache/user/UserCaffeineCache.java | 2 +- .../java/org/thingsboard/server/cache/user/UserRedisCache.java | 2 +- .../usersUpdateTime/UsersSessionInvalidationCaffeineCache.java | 2 +- .../usersUpdateTime/UsersSessionInvalidationRedisCache.java | 2 +- .../java/org/thingsboard/server/cache/CacheSpecsMapTest.java | 2 +- .../org/thingsboard/server/cache/TsLatestRedisCacheTest.java | 2 +- common/cluster-api/pom.xml | 2 +- .../java/org/thingsboard/server/cluster/TbClusterService.java | 2 +- .../java/org/thingsboard/server/queue/TbEdgeQueueAdmin.java | 2 +- .../main/java/org/thingsboard/server/queue/TbQueueAdmin.java | 2 +- .../java/org/thingsboard/server/queue/TbQueueCallback.java | 2 +- .../org/thingsboard/server/queue/TbQueueClusterService.java | 2 +- .../java/org/thingsboard/server/queue/TbQueueConsumer.java | 2 +- .../main/java/org/thingsboard/server/queue/TbQueueHandler.java | 2 +- .../src/main/java/org/thingsboard/server/queue/TbQueueMsg.java | 2 +- .../java/org/thingsboard/server/queue/TbQueueMsgDecoder.java | 2 +- .../java/org/thingsboard/server/queue/TbQueueMsgHeaders.java | 2 +- .../java/org/thingsboard/server/queue/TbQueueMsgMetadata.java | 2 +- .../java/org/thingsboard/server/queue/TbQueueProducer.java | 2 +- .../org/thingsboard/server/queue/TbQueueRequestTemplate.java | 2 +- .../org/thingsboard/server/queue/TbQueueResponseTemplate.java | 2 +- common/coap-server/pom.xml | 2 +- .../org/thingsboard/server/coapserver/CoapServerContext.java | 2 +- .../org/thingsboard/server/coapserver/CoapServerService.java | 2 +- .../server/coapserver/DefaultCoapServerService.java | 2 +- .../server/coapserver/TbCoapDtlsCertificateVerifier.java | 2 +- .../server/coapserver/TbCoapDtlsSessionInMemoryStorage.java | 2 +- .../thingsboard/server/coapserver/TbCoapDtlsSessionInfo.java | 2 +- .../thingsboard/server/coapserver/TbCoapDtlsSessionKey.java | 2 +- .../org/thingsboard/server/coapserver/TbCoapDtlsSettings.java | 2 +- .../thingsboard/server/coapserver/TbCoapServerComponent.java | 2 +- .../server/coapserver/TbCoapServerMessageDeliverer.java | 2 +- .../server/coapserver/TbCoapTransportComponent.java | 2 +- .../thingsboard/server/coapserver/TbCoapDtlsSettingsTest.java | 2 +- common/dao-api/pom.xml | 2 +- .../java/org/thingsboard/server/dao/ai/AiModelService.java | 2 +- .../org/thingsboard/server/dao/alarm/AlarmCommentService.java | 2 +- .../java/org/thingsboard/server/dao/alarm/AlarmService.java | 2 +- .../org/thingsboard/server/dao/asset/AssetProfileService.java | 2 +- .../java/org/thingsboard/server/dao/asset/AssetService.java | 2 +- .../thingsboard/server/dao/attributes/AttributesService.java | 2 +- .../java/org/thingsboard/server/dao/audit/AuditLogService.java | 2 +- .../server/dao/cassandra/AbstractCassandraCluster.java | 2 +- .../org/thingsboard/server/dao/cassandra/CassandraCluster.java | 2 +- .../server/dao/cassandra/CassandraDriverOptions.java | 2 +- .../server/dao/cassandra/CassandraInstallCluster.java | 2 +- .../server/dao/cassandra/guava/DefaultGuavaSession.java | 2 +- .../server/dao/cassandra/guava/GuavaDriverContext.java | 2 +- .../server/dao/cassandra/guava/GuavaMultiPageResultSet.java | 2 +- .../server/dao/cassandra/guava/GuavaRequestAsyncProcessor.java | 2 +- .../thingsboard/server/dao/cassandra/guava/GuavaSession.java | 2 +- .../server/dao/cassandra/guava/GuavaSessionBuilder.java | 2 +- .../server/dao/cassandra/guava/GuavaSessionUtils.java | 2 +- .../org/thingsboard/server/dao/cf/CalculatedFieldService.java | 2 +- .../server/dao/component/ComponentDescriptorService.java | 2 +- .../org/thingsboard/server/dao/customer/CustomerService.java | 2 +- .../org/thingsboard/server/dao/dashboard/DashboardService.java | 2 +- .../org/thingsboard/server/dao/device/ClaimDevicesService.java | 2 +- .../server/dao/device/DeviceConnectivityService.java | 2 +- .../server/dao/device/DeviceCredentialsService.java | 2 +- .../thingsboard/server/dao/device/DeviceProfileService.java | 2 +- .../thingsboard/server/dao/device/DeviceProvisionService.java | 2 +- .../java/org/thingsboard/server/dao/device/DeviceService.java | 2 +- .../org/thingsboard/server/dao/device/claim/ClaimData.java | 2 +- .../org/thingsboard/server/dao/device/claim/ClaimResponse.java | 2 +- .../org/thingsboard/server/dao/device/claim/ClaimResult.java | 2 +- .../org/thingsboard/server/dao/device/claim/ReclaimResult.java | 2 +- .../server/dao/device/provision/ProvisionFailedException.java | 2 +- .../server/dao/device/provision/ProvisionRequest.java | 2 +- .../server/dao/device/provision/ProvisionResponse.java | 2 +- .../server/dao/device/provision/ProvisionResponseStatus.java | 2 +- .../java/org/thingsboard/server/dao/domain/DomainService.java | 2 +- .../java/org/thingsboard/server/dao/edge/EdgeEventService.java | 2 +- .../main/java/org/thingsboard/server/dao/edge/EdgeService.java | 2 +- .../server/dao/edge/EdgeSynchronizationManager.java | 2 +- .../org/thingsboard/server/dao/edge/RelatedEdgesService.java | 2 +- .../org/thingsboard/server/dao/entity/EntityCountService.java | 2 +- .../org/thingsboard/server/dao/entity/EntityDaoService.java | 2 +- .../java/org/thingsboard/server/dao/entity/EntityService.java | 2 +- .../thingsboard/server/dao/entity/EntityServiceRegistry.java | 2 +- .../thingsboard/server/dao/entityview/EntityViewService.java | 2 +- .../java/org/thingsboard/server/dao/event/EventService.java | 2 +- .../main/java/org/thingsboard/server/dao/job/JobService.java | 2 +- .../thingsboard/server/dao/mobile/MobileAppBundleService.java | 2 +- .../org/thingsboard/server/dao/mobile/MobileAppService.java | 2 +- .../thingsboard/server/dao/nosql/CassandraStatementTask.java | 2 +- .../java/org/thingsboard/server/dao/nosql/TbResultSet.java | 2 +- .../org/thingsboard/server/dao/nosql/TbResultSetFuture.java | 2 +- .../server/dao/notification/NotificationRequestService.java | 2 +- .../server/dao/notification/NotificationRuleService.java | 2 +- .../server/dao/notification/NotificationService.java | 2 +- .../server/dao/notification/NotificationSettingsService.java | 2 +- .../server/dao/notification/NotificationTargetService.java | 2 +- .../server/dao/notification/NotificationTemplateService.java | 2 +- .../org/thingsboard/server/dao/oauth2/OAuth2ClientService.java | 2 +- .../server/dao/oauth2/OAuth2ConfigTemplateService.java | 2 +- .../java/org/thingsboard/server/dao/oauth2/OAuth2User.java | 2 +- .../java/org/thingsboard/server/dao/ota/OtaPackageService.java | 2 +- .../java/org/thingsboard/server/dao/queue/QueueService.java | 2 +- .../org/thingsboard/server/dao/queue/QueueStatsService.java | 2 +- .../org/thingsboard/server/dao/relation/RelationService.java | 2 +- .../java/org/thingsboard/server/dao/resource/ImageService.java | 2 +- .../org/thingsboard/server/dao/resource/ResourceService.java | 2 +- .../thingsboard/server/dao/resource/TbResourceDataCache.java | 2 +- .../main/java/org/thingsboard/server/dao/rpc/RpcService.java | 2 +- .../java/org/thingsboard/server/dao/rule/RuleChainService.java | 2 +- .../org/thingsboard/server/dao/rule/RuleNodeStateService.java | 2 +- .../thingsboard/server/dao/settings/AdminSettingsService.java | 2 +- .../thingsboard/server/dao/tenant/TbTenantProfileCache.java | 2 +- .../thingsboard/server/dao/tenant/TenantProfileService.java | 2 +- .../java/org/thingsboard/server/dao/tenant/TenantService.java | 2 +- .../thingsboard/server/dao/timeseries/TimeseriesService.java | 2 +- .../thingsboard/server/dao/trendz/TrendzSettingsService.java | 2 +- .../org/thingsboard/server/dao/usage/UsageInfoService.java | 2 +- .../thingsboard/server/dao/usagerecord/ApiLimitService.java | 2 +- .../server/dao/usagerecord/ApiUsageStateService.java | 2 +- .../main/java/org/thingsboard/server/dao/user/UserService.java | 2 +- .../org/thingsboard/server/dao/user/UserSettingsService.java | 2 +- .../main/java/org/thingsboard/server/dao/util/AsyncTask.java | 2 +- .../org/thingsboard/server/dao/util/DbTypeInfoComponent.java | 2 +- .../server/dao/util/DefaultDbTypeInfoComponent.java | 2 +- .../main/java/org/thingsboard/server/dao/util/NoSqlAnyDao.java | 2 +- .../org/thingsboard/server/dao/util/NoSqlAnyDaoNonCloud.java | 2 +- .../main/java/org/thingsboard/server/dao/util/NoSqlTsDao.java | 2 +- .../java/org/thingsboard/server/dao/util/NoSqlTsLatestDao.java | 2 +- .../src/main/java/org/thingsboard/server/dao/util/SqlDao.java | 2 +- .../main/java/org/thingsboard/server/dao/util/SqlTsDao.java | 2 +- .../org/thingsboard/server/dao/util/SqlTsLatestAnyDao.java | 2 +- .../server/dao/util/SqlTsLatestAnyDaoCachedRedis.java | 2 +- .../java/org/thingsboard/server/dao/util/SqlTsLatestDao.java | 2 +- .../org/thingsboard/server/dao/util/SqlTsOrTsLatestAnyDao.java | 2 +- .../org/thingsboard/server/dao/util/TbAutoConfiguration.java | 2 +- .../java/org/thingsboard/server/dao/util/TimescaleDBTsDao.java | 2 +- .../thingsboard/server/dao/util/TimescaleDBTsLatestDao.java | 2 +- .../server/dao/util/TimescaleDBTsOrTsLatestDao.java | 2 +- .../org/thingsboard/server/dao/widget/WidgetTypeService.java | 2 +- .../thingsboard/server/dao/widget/WidgetsBundleService.java | 2 +- common/data/pom.xml | 2 +- .../java/org/thingsboard/server/common/data/AdminSettings.java | 2 +- .../java/org/thingsboard/server/common/data/ApiFeature.java | 2 +- .../org/thingsboard/server/common/data/ApiUsageRecordKey.java | 2 +- .../thingsboard/server/common/data/ApiUsageRecordState.java | 2 +- .../java/org/thingsboard/server/common/data/ApiUsageState.java | 2 +- .../org/thingsboard/server/common/data/ApiUsageStateValue.java | 2 +- .../org/thingsboard/server/common/data/AttributeScope.java | 2 +- .../main/java/org/thingsboard/server/common/data/BaseData.java | 2 +- .../server/common/data/BaseDataWithAdditionalInfo.java | 2 +- .../org/thingsboard/server/common/data/CacheConstants.java | 2 +- .../java/org/thingsboard/server/common/data/ClaimRequest.java | 2 +- .../org/thingsboard/server/common/data/CoapDeviceType.java | 2 +- .../java/org/thingsboard/server/common/data/ContactBased.java | 2 +- .../main/java/org/thingsboard/server/common/data/Customer.java | 2 +- .../java/org/thingsboard/server/common/data/Dashboard.java | 2 +- .../java/org/thingsboard/server/common/data/DashboardInfo.java | 2 +- .../java/org/thingsboard/server/common/data/DataConstants.java | 2 +- .../main/java/org/thingsboard/server/common/data/Device.java | 2 +- .../java/org/thingsboard/server/common/data/DeviceIdInfo.java | 2 +- .../java/org/thingsboard/server/common/data/DeviceInfo.java | 2 +- .../org/thingsboard/server/common/data/DeviceInfoFilter.java | 2 +- .../java/org/thingsboard/server/common/data/DeviceProfile.java | 2 +- .../org/thingsboard/server/common/data/DeviceProfileInfo.java | 2 +- .../server/common/data/DeviceProfileProvisionType.java | 2 +- .../org/thingsboard/server/common/data/DeviceProfileType.java | 2 +- .../thingsboard/server/common/data/DeviceTransportType.java | 2 +- .../org/thingsboard/server/common/data/DynamicProtoUtils.java | 2 +- .../org/thingsboard/server/common/data/EdgeUpgradeInfo.java | 2 +- .../org/thingsboard/server/common/data/EdgeUpgradeMessage.java | 2 +- .../java/org/thingsboard/server/common/data/EdgeUtils.java | 2 +- .../org/thingsboard/server/common/data/EntityFieldsData.java | 2 +- .../java/org/thingsboard/server/common/data/EntityInfo.java | 2 +- .../java/org/thingsboard/server/common/data/EntitySubtype.java | 2 +- .../java/org/thingsboard/server/common/data/EntityType.java | 2 +- .../java/org/thingsboard/server/common/data/EntityView.java | 2 +- .../org/thingsboard/server/common/data/EntityViewInfo.java | 2 +- .../java/org/thingsboard/server/common/data/EventInfo.java | 2 +- .../org/thingsboard/server/common/data/ExportableEntity.java | 2 +- .../java/org/thingsboard/server/common/data/FeaturesInfo.java | 2 +- .../org/thingsboard/server/common/data/FstStatsService.java | 2 +- .../thingsboard/server/common/data/GeneralFileDescriptor.java | 2 +- .../org/thingsboard/server/common/data/HasAdditionalInfo.java | 2 +- .../java/org/thingsboard/server/common/data/HasCustomerId.java | 2 +- .../org/thingsboard/server/common/data/HasDebugSettings.java | 2 +- .../org/thingsboard/server/common/data/HasDefaultOption.java | 2 +- .../main/java/org/thingsboard/server/common/data/HasEmail.java | 2 +- .../main/java/org/thingsboard/server/common/data/HasImage.java | 2 +- .../main/java/org/thingsboard/server/common/data/HasLabel.java | 2 +- .../main/java/org/thingsboard/server/common/data/HasName.java | 2 +- .../java/org/thingsboard/server/common/data/HasOtaPackage.java | 2 +- .../thingsboard/server/common/data/HasRuleEngineProfile.java | 2 +- .../java/org/thingsboard/server/common/data/HasTenantId.java | 2 +- .../main/java/org/thingsboard/server/common/data/HasTitle.java | 2 +- .../java/org/thingsboard/server/common/data/HasVersion.java | 2 +- .../java/org/thingsboard/server/common/data/HomeDashboard.java | 2 +- .../org/thingsboard/server/common/data/HomeDashboardInfo.java | 2 +- .../org/thingsboard/server/common/data/ImageDescriptor.java | 2 +- .../org/thingsboard/server/common/data/JavaSerDesUtil.java | 2 +- .../java/org/thingsboard/server/common/data/ObjectType.java | 2 +- .../java/org/thingsboard/server/common/data/OtaPackage.java | 2 +- .../org/thingsboard/server/common/data/OtaPackageInfo.java | 2 +- .../thingsboard/server/common/data/ProfileEntityIdInfo.java | 2 +- .../org/thingsboard/server/common/data/ResourceExportData.java | 2 +- .../org/thingsboard/server/common/data/ResourceSubType.java | 2 +- .../java/org/thingsboard/server/common/data/ResourceType.java | 2 +- .../java/org/thingsboard/server/common/data/ResourceUtils.java | 2 +- .../server/common/data/SaveDeviceWithCredentialsRequest.java | 2 +- .../server/common/data/SaveOtaPackageInfoRequest.java | 2 +- .../org/thingsboard/server/common/data/ShortCustomerInfo.java | 2 +- .../java/org/thingsboard/server/common/data/StringUtils.java | 2 +- .../java/org/thingsboard/server/common/data/SystemInfo.java | 2 +- .../org/thingsboard/server/common/data/SystemInfoData.java | 2 +- .../java/org/thingsboard/server/common/data/SystemParams.java | 2 +- .../thingsboard/server/common/data/TbImageDeleteResult.java | 2 +- .../java/org/thingsboard/server/common/data/TbProperty.java | 2 +- .../java/org/thingsboard/server/common/data/TbResource.java | 2 +- .../org/thingsboard/server/common/data/TbResourceDataInfo.java | 2 +- .../thingsboard/server/common/data/TbResourceDeleteResult.java | 2 +- .../org/thingsboard/server/common/data/TbResourceInfo.java | 2 +- .../thingsboard/server/common/data/TbResourceInfoFilter.java | 2 +- .../org/thingsboard/server/common/data/TbTransportService.java | 2 +- .../main/java/org/thingsboard/server/common/data/Tenant.java | 2 +- .../java/org/thingsboard/server/common/data/TenantInfo.java | 2 +- .../java/org/thingsboard/server/common/data/TenantProfile.java | 2 +- .../org/thingsboard/server/common/data/TenantProfileType.java | 2 +- .../thingsboard/server/common/data/TransportPayloadType.java | 2 +- .../java/org/thingsboard/server/common/data/UUIDConverter.java | 2 +- .../java/org/thingsboard/server/common/data/UpdateMessage.java | 2 +- .../java/org/thingsboard/server/common/data/UsageInfo.java | 2 +- .../src/main/java/org/thingsboard/server/common/data/User.java | 2 +- .../org/thingsboard/server/common/data/UserActivationLink.java | 2 +- .../java/org/thingsboard/server/common/data/UserEmailInfo.java | 2 +- .../main/java/org/thingsboard/server/common/data/Views.java | 2 +- .../java/org/thingsboard/server/common/data/ai/AiModel.java | 2 +- .../thingsboard/server/common/data/ai/dto/TbChatRequest.java | 2 +- .../thingsboard/server/common/data/ai/dto/TbChatResponse.java | 2 +- .../org/thingsboard/server/common/data/ai/dto/TbContent.java | 2 +- .../thingsboard/server/common/data/ai/dto/TbUserMessage.java | 2 +- .../thingsboard/server/common/data/ai/model/AiModelConfig.java | 2 +- .../thingsboard/server/common/data/ai/model/AiModelType.java | 2 +- .../server/common/data/ai/model/chat/AiChatModelConfig.java | 2 +- .../data/ai/model/chat/AmazonBedrockChatModelConfig.java | 2 +- .../common/data/ai/model/chat/AnthropicChatModelConfig.java | 2 +- .../common/data/ai/model/chat/AzureOpenAiChatModelConfig.java | 2 +- .../common/data/ai/model/chat/GitHubModelsChatModelConfig.java | 2 +- .../data/ai/model/chat/GoogleAiGeminiChatModelConfig.java | 2 +- .../ai/model/chat/GoogleVertexAiGeminiChatModelConfig.java | 2 +- .../data/ai/model/chat/Langchain4jChatModelConfigurer.java | 2 +- .../common/data/ai/model/chat/MistralAiChatModelConfig.java | 2 +- .../common/data/ai/model/chat/OllamaChatModelConfig.java | 2 +- .../common/data/ai/model/chat/OpenAiChatModelConfig.java | 2 +- .../thingsboard/server/common/data/ai/provider/AiProvider.java | 2 +- .../server/common/data/ai/provider/AiProviderConfig.java | 2 +- .../common/data/ai/provider/AmazonBedrockProviderConfig.java | 2 +- .../common/data/ai/provider/AnthropicProviderConfig.java | 2 +- .../common/data/ai/provider/AzureOpenAiProviderConfig.java | 2 +- .../common/data/ai/provider/GitHubModelsProviderConfig.java | 2 +- .../common/data/ai/provider/GoogleAiGeminiProviderConfig.java | 2 +- .../data/ai/provider/GoogleVertexAiGeminiProviderConfig.java | 2 +- .../common/data/ai/provider/MistralAiProviderConfig.java | 2 +- .../server/common/data/ai/provider/OllamaProviderConfig.java | 2 +- .../server/common/data/ai/provider/OpenAiProviderConfig.java | 2 +- .../java/org/thingsboard/server/common/data/alarm/Alarm.java | 2 +- .../server/common/data/alarm/AlarmApiCallResult.java | 2 +- .../thingsboard/server/common/data/alarm/AlarmAssignee.java | 2 +- .../server/common/data/alarm/AlarmAssigneeUpdate.java | 2 +- .../org/thingsboard/server/common/data/alarm/AlarmComment.java | 2 +- .../thingsboard/server/common/data/alarm/AlarmCommentInfo.java | 2 +- .../thingsboard/server/common/data/alarm/AlarmCommentType.java | 2 +- .../common/data/alarm/AlarmCreateOrUpdateActiveRequest.java | 2 +- .../org/thingsboard/server/common/data/alarm/AlarmInfo.java | 2 +- .../server/common/data/alarm/AlarmModificationRequest.java | 2 +- .../server/common/data/alarm/AlarmPropagationInfo.java | 2 +- .../org/thingsboard/server/common/data/alarm/AlarmQuery.java | 2 +- .../org/thingsboard/server/common/data/alarm/AlarmQueryV2.java | 2 +- .../server/common/data/alarm/AlarmSearchStatus.java | 2 +- .../thingsboard/server/common/data/alarm/AlarmSeverity.java | 2 +- .../org/thingsboard/server/common/data/alarm/AlarmStatus.java | 2 +- .../server/common/data/alarm/AlarmStatusFilter.java | 2 +- .../server/common/data/alarm/AlarmUpdateRequest.java | 2 +- .../org/thingsboard/server/common/data/alarm/EntityAlarm.java | 2 +- .../java/org/thingsboard/server/common/data/asset/Asset.java | 2 +- .../org/thingsboard/server/common/data/asset/AssetInfo.java | 2 +- .../org/thingsboard/server/common/data/asset/AssetProfile.java | 2 +- .../thingsboard/server/common/data/asset/AssetProfileInfo.java | 2 +- .../thingsboard/server/common/data/asset/AssetSearchQuery.java | 2 +- .../org/thingsboard/server/common/data/audit/ActionStatus.java | 2 +- .../org/thingsboard/server/common/data/audit/ActionType.java | 2 +- .../org/thingsboard/server/common/data/audit/AuditLog.java | 2 +- .../org/thingsboard/server/common/data/cf/CalculatedField.java | 2 +- .../thingsboard/server/common/data/cf/CalculatedFieldLink.java | 2 +- .../thingsboard/server/common/data/cf/CalculatedFieldType.java | 2 +- .../server/common/data/cf/configuration/Argument.java | 2 +- .../server/common/data/cf/configuration/ArgumentType.java | 2 +- .../cf/configuration/BaseCalculatedFieldConfiguration.java | 2 +- .../data/cf/configuration/CalculatedFieldConfiguration.java | 2 +- .../server/common/data/cf/configuration/Output.java | 2 +- .../server/common/data/cf/configuration/OutputType.java | 2 +- .../common/data/cf/configuration/ReferencedEntityKey.java | 2 +- .../cf/configuration/ScriptCalculatedFieldConfiguration.java | 2 +- .../cf/configuration/SimpleCalculatedFieldConfiguration.java | 2 +- .../thingsboard/server/common/data/debug/DebugSettings.java | 2 +- .../server/common/data/device/DeviceSearchQuery.java | 2 +- .../common/data/device/credentials/BasicMqttCredentials.java | 2 +- .../device/credentials/ProvisionDeviceCredentialsData.java | 2 +- .../lwm2m/AbstractLwM2MBootstrapClientCredentialWithKeys.java | 2 +- .../credentials/lwm2m/AbstractLwM2MClientCredential.java | 2 +- .../lwm2m/AbstractLwM2MClientSecurityCredential.java | 2 +- .../credentials/lwm2m/LwM2MBootstrapClientCredential.java | 2 +- .../credentials/lwm2m/LwM2MBootstrapClientCredentials.java | 2 +- .../data/device/credentials/lwm2m/LwM2MClientCredential.java | 2 +- .../data/device/credentials/lwm2m/LwM2MDeviceCredentials.java | 2 +- .../data/device/credentials/lwm2m/LwM2MSecurityMode.java | 2 +- .../credentials/lwm2m/NoSecBootstrapClientCredential.java | 2 +- .../data/device/credentials/lwm2m/NoSecClientCredential.java | 2 +- .../device/credentials/lwm2m/PSKBootstrapClientCredential.java | 2 +- .../data/device/credentials/lwm2m/PSKClientCredential.java | 2 +- .../device/credentials/lwm2m/RPKBootstrapClientCredential.java | 2 +- .../data/device/credentials/lwm2m/RPKClientCredential.java | 2 +- .../credentials/lwm2m/X509BootstrapClientCredential.java | 2 +- .../data/device/credentials/lwm2m/X509ClientCredential.java | 2 +- .../data/device/data/CoapDeviceTransportConfiguration.java | 2 +- .../common/data/device/data/DefaultDeviceConfiguration.java | 2 +- .../data/device/data/DefaultDeviceTransportConfiguration.java | 2 +- .../server/common/data/device/data/DeviceConfiguration.java | 2 +- .../thingsboard/server/common/data/device/data/DeviceData.java | 2 +- .../common/data/device/data/DeviceTransportConfiguration.java | 2 +- .../data/device/data/Lwm2mDeviceTransportConfiguration.java | 2 +- .../data/device/data/MqttDeviceTransportConfiguration.java | 2 +- .../thingsboard/server/common/data/device/data/PowerMode.java | 2 +- .../common/data/device/data/PowerSavingConfiguration.java | 2 +- .../data/device/data/SnmpDeviceTransportConfiguration.java | 2 +- .../server/common/data/device/profile/AlarmCondition.java | 2 +- .../common/data/device/profile/AlarmConditionFilter.java | 2 +- .../common/data/device/profile/AlarmConditionFilterKey.java | 2 +- .../common/data/device/profile/AlarmConditionKeyType.java | 2 +- .../server/common/data/device/profile/AlarmConditionSpec.java | 2 +- .../common/data/device/profile/AlarmConditionSpecType.java | 2 +- .../server/common/data/device/profile/AlarmRule.java | 2 +- .../server/common/data/device/profile/AlarmSchedule.java | 2 +- .../server/common/data/device/profile/AlarmScheduleType.java | 2 +- ...lowCreateNewDevicesDeviceProfileProvisionConfiguration.java | 2 +- .../server/common/data/device/profile/AnyTimeSchedule.java | 2 +- ...eProvisionedDevicesDeviceProfileProvisionConfiguration.java | 2 +- .../profile/CoapDeviceProfileTransportConfiguration.java | 2 +- .../data/device/profile/CoapDeviceTypeConfiguration.java | 2 +- .../server/common/data/device/profile/CustomTimeSchedule.java | 2 +- .../common/data/device/profile/CustomTimeScheduleItem.java | 2 +- .../device/profile/DefaultCoapDeviceTypeConfiguration.java | 2 +- .../data/device/profile/DefaultDeviceProfileConfiguration.java | 2 +- .../profile/DefaultDeviceProfileTransportConfiguration.java | 2 +- .../server/common/data/device/profile/DeviceProfileAlarm.java | 2 +- .../common/data/device/profile/DeviceProfileConfiguration.java | 2 +- .../server/common/data/device/profile/DeviceProfileData.java | 2 +- .../device/profile/DeviceProfileProvisionConfiguration.java | 2 +- .../device/profile/DeviceProfileTransportConfiguration.java | 2 +- .../profile/DisabledDeviceProfileProvisionConfiguration.java | 2 +- .../common/data/device/profile/DurationAlarmConditionSpec.java | 2 +- .../data/device/profile/EfentoCoapDeviceTypeConfiguration.java | 2 +- .../data/device/profile/JsonTransportPayloadConfiguration.java | 2 +- .../profile/Lwm2mDeviceProfileTransportConfiguration.java | 2 +- .../profile/MqttDeviceProfileTransportConfiguration.java | 2 +- .../server/common/data/device/profile/MqttTopics.java | 2 +- .../device/profile/ProtoTransportPayloadConfiguration.java | 2 +- .../data/device/profile/ProvisionDeviceProfileCredentials.java | 2 +- .../data/device/profile/RepeatingAlarmConditionSpec.java | 2 +- .../common/data/device/profile/SimpleAlarmConditionSpec.java | 2 +- .../profile/SnmpDeviceProfileTransportConfiguration.java | 2 +- .../common/data/device/profile/SpecificTimeSchedule.java | 2 +- .../data/device/profile/TransportPayloadTypeConfiguration.java | 2 +- .../profile/X509CertificateChainProvisionConfiguration.java | 2 +- .../common/data/device/profile/lwm2m/ObjectAttributes.java | 2 +- .../common/data/device/profile/lwm2m/OtherConfiguration.java | 2 +- .../device/profile/lwm2m/TelemetryMappingConfiguration.java | 2 +- .../data/device/profile/lwm2m/TelemetryObserveStrategy.java | 2 +- .../bootstrap/AbstractLwM2MBootstrapServerCredential.java | 2 +- .../lwm2m/bootstrap/LwM2MBootstrapServerCredential.java | 2 +- .../profile/lwm2m/bootstrap/LwM2MServerSecurityConfig.java | 2 +- .../lwm2m/bootstrap/LwM2MServerSecurityConfigDefault.java | 2 +- .../lwm2m/bootstrap/NoSecLwM2MBootstrapServerCredential.java | 2 +- .../lwm2m/bootstrap/PSKLwM2MBootstrapServerCredential.java | 2 +- .../lwm2m/bootstrap/RPKLwM2MBootstrapServerCredential.java | 2 +- .../lwm2m/bootstrap/X509LwM2MBootstrapServerCredential.java | 2 +- .../java/org/thingsboard/server/common/data/domain/Domain.java | 2 +- .../org/thingsboard/server/common/data/domain/DomainInfo.java | 2 +- .../server/common/data/domain/DomainOauth2Client.java | 2 +- .../java/org/thingsboard/server/common/data/edge/Edge.java | 2 +- .../org/thingsboard/server/common/data/edge/EdgeEvent.java | 2 +- .../server/common/data/edge/EdgeEventActionType.java | 2 +- .../org/thingsboard/server/common/data/edge/EdgeEventType.java | 2 +- .../java/org/thingsboard/server/common/data/edge/EdgeInfo.java | 2 +- .../thingsboard/server/common/data/edge/EdgeInstructions.java | 2 +- .../thingsboard/server/common/data/edge/EdgeSearchQuery.java | 2 +- .../org/thingsboard/server/common/data/edqs/AttributeKv.java | 2 +- .../org/thingsboard/server/common/data/edqs/DataPoint.java | 2 +- .../org/thingsboard/server/common/data/edqs/EdqsEvent.java | 2 +- .../org/thingsboard/server/common/data/edqs/EdqsEventType.java | 2 +- .../org/thingsboard/server/common/data/edqs/EdqsObject.java | 2 +- .../org/thingsboard/server/common/data/edqs/EdqsObjectKey.java | 2 +- .../org/thingsboard/server/common/data/edqs/EdqsState.java | 2 +- .../thingsboard/server/common/data/edqs/EdqsSyncRequest.java | 2 +- .../java/org/thingsboard/server/common/data/edqs/Entity.java | 2 +- .../org/thingsboard/server/common/data/edqs/LatestTsKv.java | 2 +- .../org/thingsboard/server/common/data/edqs/ToCoreEdqsMsg.java | 2 +- .../thingsboard/server/common/data/edqs/ToCoreEdqsRequest.java | 2 +- .../server/common/data/edqs/fields/AbstractEntityFields.java | 2 +- .../server/common/data/edqs/fields/ApiUsageStateFields.java | 2 +- .../server/common/data/edqs/fields/AssetFields.java | 2 +- .../server/common/data/edqs/fields/AssetProfileFields.java | 2 +- .../server/common/data/edqs/fields/CustomerFields.java | 2 +- .../server/common/data/edqs/fields/DashboardFields.java | 2 +- .../server/common/data/edqs/fields/DeviceFields.java | 2 +- .../server/common/data/edqs/fields/DeviceProfileFields.java | 2 +- .../thingsboard/server/common/data/edqs/fields/EdgeFields.java | 2 +- .../server/common/data/edqs/fields/EntityFields.java | 2 +- .../server/common/data/edqs/fields/EntityIdFields.java | 2 +- .../server/common/data/edqs/fields/EntityViewFields.java | 2 +- .../thingsboard/server/common/data/edqs/fields/FieldsUtil.java | 2 +- .../server/common/data/edqs/fields/GenericFields.java | 2 +- .../server/common/data/edqs/fields/ProfileAwareFields.java | 2 +- .../server/common/data/edqs/fields/QueueStatsFields.java | 2 +- .../server/common/data/edqs/fields/RuleChainFields.java | 2 +- .../server/common/data/edqs/fields/RuleNodeFields.java | 2 +- .../server/common/data/edqs/fields/TenantFields.java | 2 +- .../server/common/data/edqs/fields/TenantProfileFields.java | 2 +- .../thingsboard/server/common/data/edqs/fields/UserFields.java | 2 +- .../server/common/data/edqs/fields/WidgetTypeFields.java | 2 +- .../server/common/data/edqs/fields/WidgetsBundleFields.java | 2 +- .../thingsboard/server/common/data/edqs/query/EdqsRequest.java | 2 +- .../server/common/data/edqs/query/EdqsResponse.java | 2 +- .../thingsboard/server/common/data/edqs/query/QueryResult.java | 2 +- .../server/common/data/entityview/EntityViewSearchQuery.java | 2 +- .../server/common/data/event/CalculatedFieldDebugEvent.java | 2 +- .../common/data/event/CalculatedFieldDebugEventFilter.java | 2 +- .../thingsboard/server/common/data/event/DebugEventFilter.java | 2 +- .../org/thingsboard/server/common/data/event/ErrorEvent.java | 2 +- .../thingsboard/server/common/data/event/ErrorEventFilter.java | 2 +- .../java/org/thingsboard/server/common/data/event/Event.java | 2 +- .../org/thingsboard/server/common/data/event/EventFilter.java | 2 +- .../org/thingsboard/server/common/data/event/EventType.java | 2 +- .../server/common/data/event/LifeCycleEventFilter.java | 2 +- .../thingsboard/server/common/data/event/LifecycleEvent.java | 2 +- .../server/common/data/event/RuleChainDebugEvent.java | 2 +- .../server/common/data/event/RuleChainDebugEventFilter.java | 2 +- .../server/common/data/event/RuleNodeDebugEvent.java | 2 +- .../server/common/data/event/RuleNodeDebugEventFilter.java | 2 +- .../thingsboard/server/common/data/event/StatisticsEvent.java | 2 +- .../server/common/data/event/StatisticsEventFilter.java | 2 +- .../common/data/exception/AbstractRateLimitException.java | 2 +- .../common/data/exception/ApiUsageLimitsExceededException.java | 2 +- .../common/data/exception/EntityVersionMismatchException.java | 2 +- .../common/data/exception/RateLimitExceededException.java | 2 +- .../server/common/data/exception/TenantNotFoundException.java | 2 +- .../common/data/exception/TenantProfileNotFoundException.java | 2 +- .../server/common/data/exception/ThingsboardErrorCode.java | 2 +- .../server/common/data/exception/ThingsboardException.java | 2 +- .../common/data/exception/ThingsboardKafkaClientError.java | 2 +- .../common/data/housekeeper/AlarmsDeletionHousekeeperTask.java | 2 +- .../common/data/housekeeper/AlarmsUnassignHousekeeperTask.java | 2 +- .../data/housekeeper/EntitiesDeletionHousekeeperTask.java | 2 +- .../server/common/data/housekeeper/HousekeeperTask.java | 2 +- .../server/common/data/housekeeper/HousekeeperTaskType.java | 2 +- .../data/housekeeper/LatestTsDeletionHousekeeperTask.java | 2 +- .../housekeeper/TenantEntitiesDeletionHousekeeperTask.java | 2 +- .../data/housekeeper/TsHistoryDeletionHousekeeperTask.java | 2 +- .../org/thingsboard/server/common/data/id/AdminSettingsId.java | 2 +- .../java/org/thingsboard/server/common/data/id/AiModelId.java | 2 +- .../org/thingsboard/server/common/data/id/AlarmCommentId.java | 2 +- .../java/org/thingsboard/server/common/data/id/AlarmId.java | 2 +- .../org/thingsboard/server/common/data/id/ApiUsageStateId.java | 2 +- .../java/org/thingsboard/server/common/data/id/AssetId.java | 2 +- .../org/thingsboard/server/common/data/id/AssetProfileId.java | 2 +- .../java/org/thingsboard/server/common/data/id/AuditLogId.java | 2 +- .../thingsboard/server/common/data/id/CalculatedFieldId.java | 2 +- .../server/common/data/id/CalculatedFieldLinkId.java | 2 +- .../server/common/data/id/ComponentDescriptorId.java | 2 +- .../java/org/thingsboard/server/common/data/id/CustomerId.java | 2 +- .../org/thingsboard/server/common/data/id/DashboardId.java | 2 +- .../thingsboard/server/common/data/id/DeviceCredentialsId.java | 2 +- .../java/org/thingsboard/server/common/data/id/DeviceId.java | 2 +- .../org/thingsboard/server/common/data/id/DeviceProfileId.java | 2 +- .../java/org/thingsboard/server/common/data/id/DomainId.java | 2 +- .../org/thingsboard/server/common/data/id/EdgeEventId.java | 2 +- .../java/org/thingsboard/server/common/data/id/EdgeId.java | 2 +- .../java/org/thingsboard/server/common/data/id/EntityId.java | 2 +- .../server/common/data/id/EntityIdDeserializer.java | 2 +- .../org/thingsboard/server/common/data/id/EntityIdFactory.java | 2 +- .../thingsboard/server/common/data/id/EntityIdSerializer.java | 2 +- .../org/thingsboard/server/common/data/id/EntityViewId.java | 2 +- .../java/org/thingsboard/server/common/data/id/EventId.java | 2 +- .../main/java/org/thingsboard/server/common/data/id/HasId.java | 2 +- .../java/org/thingsboard/server/common/data/id/HasUUID.java | 2 +- .../java/org/thingsboard/server/common/data/id/IdBased.java | 2 +- .../main/java/org/thingsboard/server/common/data/id/JobId.java | 2 +- .../thingsboard/server/common/data/id/MobileAppBundleId.java | 2 +- .../org/thingsboard/server/common/data/id/MobileAppId.java | 2 +- .../server/common/data/id/NameLabelAndCustomerDetails.java | 2 +- .../java/org/thingsboard/server/common/data/id/NodeId.java | 2 +- .../org/thingsboard/server/common/data/id/NotificationId.java | 2 +- .../server/common/data/id/NotificationRequestId.java | 2 +- .../thingsboard/server/common/data/id/NotificationRuleId.java | 2 +- .../server/common/data/id/NotificationTargetId.java | 2 +- .../server/common/data/id/NotificationTemplateId.java | 2 +- .../org/thingsboard/server/common/data/id/OAuth2ClientId.java | 2 +- .../common/data/id/OAuth2ClientRegistrationTemplateId.java | 2 +- .../org/thingsboard/server/common/data/id/OAuth2ParamsId.java | 2 +- .../org/thingsboard/server/common/data/id/OtaPackageId.java | 2 +- .../thingsboard/server/common/data/id/QrCodeSettingsId.java | 2 +- .../java/org/thingsboard/server/common/data/id/QueueId.java | 2 +- .../org/thingsboard/server/common/data/id/QueueStatsId.java | 2 +- .../main/java/org/thingsboard/server/common/data/id/RpcId.java | 2 +- .../org/thingsboard/server/common/data/id/RuleChainId.java | 2 +- .../java/org/thingsboard/server/common/data/id/RuleNodeId.java | 2 +- .../org/thingsboard/server/common/data/id/RuleNodeStateId.java | 2 +- .../org/thingsboard/server/common/data/id/TbResourceId.java | 2 +- .../java/org/thingsboard/server/common/data/id/TenantId.java | 2 +- .../org/thingsboard/server/common/data/id/TenantProfileId.java | 2 +- .../java/org/thingsboard/server/common/data/id/UUIDBased.java | 2 +- .../thingsboard/server/common/data/id/UserAuthSettingsId.java | 2 +- .../thingsboard/server/common/data/id/UserCredentialsId.java | 2 +- .../java/org/thingsboard/server/common/data/id/UserId.java | 2 +- .../org/thingsboard/server/common/data/id/WidgetTypeId.java | 2 +- .../org/thingsboard/server/common/data/id/WidgetsBundleId.java | 2 +- .../server/common/data/job/DummyJobConfiguration.java | 2 +- .../org/thingsboard/server/common/data/job/DummyJobResult.java | 2 +- .../main/java/org/thingsboard/server/common/data/job/Job.java | 2 +- .../thingsboard/server/common/data/job/JobConfiguration.java | 2 +- .../java/org/thingsboard/server/common/data/job/JobFilter.java | 2 +- .../java/org/thingsboard/server/common/data/job/JobResult.java | 2 +- .../java/org/thingsboard/server/common/data/job/JobStats.java | 2 +- .../java/org/thingsboard/server/common/data/job/JobStatus.java | 2 +- .../java/org/thingsboard/server/common/data/job/JobType.java | 2 +- .../org/thingsboard/server/common/data/job/task/DummyTask.java | 2 +- .../server/common/data/job/task/DummyTaskResult.java | 2 +- .../java/org/thingsboard/server/common/data/job/task/Task.java | 2 +- .../thingsboard/server/common/data/job/task/TaskFailure.java | 2 +- .../thingsboard/server/common/data/job/task/TaskResult.java | 2 +- .../org/thingsboard/server/common/data/kv/AggTsKvEntry.java | 2 +- .../org/thingsboard/server/common/data/kv/Aggregation.java | 2 +- .../thingsboard/server/common/data/kv/AggregationParams.java | 2 +- .../org/thingsboard/server/common/data/kv/AttributeKey.java | 2 +- .../thingsboard/server/common/data/kv/AttributeKvEntry.java | 2 +- .../server/common/data/kv/AttributesSaveResult.java | 2 +- .../server/common/data/kv/BaseAttributeKvEntry.java | 2 +- .../thingsboard/server/common/data/kv/BaseDeleteTsKvQuery.java | 2 +- .../thingsboard/server/common/data/kv/BaseReadTsKvQuery.java | 2 +- .../org/thingsboard/server/common/data/kv/BaseTsKvQuery.java | 2 +- .../org/thingsboard/server/common/data/kv/BasicKvEntry.java | 2 +- .../org/thingsboard/server/common/data/kv/BasicTsKvEntry.java | 2 +- .../thingsboard/server/common/data/kv/BooleanDataEntry.java | 2 +- .../java/org/thingsboard/server/common/data/kv/DataType.java | 2 +- .../org/thingsboard/server/common/data/kv/DeleteTsKvQuery.java | 2 +- .../org/thingsboard/server/common/data/kv/DoubleDataEntry.java | 2 +- .../org/thingsboard/server/common/data/kv/IntervalType.java | 2 +- .../org/thingsboard/server/common/data/kv/JsonDataEntry.java | 2 +- .../java/org/thingsboard/server/common/data/kv/KvEntry.java | 2 +- .../org/thingsboard/server/common/data/kv/LongDataEntry.java | 2 +- .../org/thingsboard/server/common/data/kv/ReadTsKvQuery.java | 2 +- .../thingsboard/server/common/data/kv/ReadTsKvQueryResult.java | 2 +- .../org/thingsboard/server/common/data/kv/StringDataEntry.java | 2 +- .../server/common/data/kv/TimeseriesSaveResult.java | 2 +- .../java/org/thingsboard/server/common/data/kv/TsKvEntry.java | 2 +- .../thingsboard/server/common/data/kv/TsKvEntryAggWrapper.java | 2 +- .../server/common/data/kv/TsKvLatestRemovingResult.java | 2 +- .../java/org/thingsboard/server/common/data/kv/TsKvQuery.java | 2 +- .../org/thingsboard/server/common/data/limit/LimitedApi.java | 2 +- .../thingsboard/server/common/data/limit/RateLimitEntry.java | 2 +- .../thingsboard/server/common/data/limit/RateLimitUtil.java | 2 +- .../thingsboard/server/common/data/lwm2m/LwM2mConstants.java | 2 +- .../thingsboard/server/common/data/lwm2m/LwM2mInstance.java | 2 +- .../org/thingsboard/server/common/data/lwm2m/LwM2mObject.java | 2 +- .../server/common/data/lwm2m/LwM2mResourceObserve.java | 2 +- .../server/common/data/mail/MailOauth2Provider.java | 2 +- .../thingsboard/server/common/data/mobile/LoginMobileInfo.java | 2 +- .../server/common/data/mobile/MobileSessionInfo.java | 2 +- .../thingsboard/server/common/data/mobile/UserMobileInfo.java | 2 +- .../server/common/data/mobile/UserMobileSessionInfo.java | 2 +- .../thingsboard/server/common/data/mobile/app/MobileApp.java | 2 +- .../server/common/data/mobile/app/MobileAppStatus.java | 2 +- .../server/common/data/mobile/app/MobileAppVersionInfo.java | 2 +- .../thingsboard/server/common/data/mobile/app/StoreInfo.java | 2 +- .../server/common/data/mobile/bundle/MobileAppBundle.java | 2 +- .../server/common/data/mobile/bundle/MobileAppBundleInfo.java | 2 +- .../common/data/mobile/bundle/MobileAppBundleOauth2Client.java | 2 +- .../server/common/data/mobile/layout/AbstractMobilePage.java | 2 +- .../server/common/data/mobile/layout/CustomMobilePage.java | 2 +- .../server/common/data/mobile/layout/DashboardPage.java | 2 +- .../server/common/data/mobile/layout/DefaultMobilePage.java | 2 +- .../server/common/data/mobile/layout/DefaultPageId.java | 2 +- .../server/common/data/mobile/layout/MobileLayoutConfig.java | 2 +- .../server/common/data/mobile/layout/MobilePage.java | 2 +- .../server/common/data/mobile/layout/MobilePageType.java | 2 +- .../server/common/data/mobile/layout/WebViewPage.java | 2 +- .../common/data/mobile/qrCodeSettings/BadgePosition.java | 2 +- .../server/common/data/mobile/qrCodeSettings/QRCodeConfig.java | 2 +- .../common/data/mobile/qrCodeSettings/QrCodeSettings.java | 2 +- .../java/org/thingsboard/server/common/data/msg/TbMsgType.java | 2 +- .../server/common/data/msg/TbNodeConnectionType.java | 2 +- .../server/common/data/notification/AlreadySentException.java | 2 +- .../server/common/data/notification/Notification.java | 2 +- .../common/data/notification/NotificationDeliveryMethod.java | 2 +- .../server/common/data/notification/NotificationRequest.java | 2 +- .../common/data/notification/NotificationRequestConfig.java | 2 +- .../common/data/notification/NotificationRequestInfo.java | 2 +- .../common/data/notification/NotificationRequestPreview.java | 2 +- .../common/data/notification/NotificationRequestStats.java | 2 +- .../common/data/notification/NotificationRequestStatus.java | 2 +- .../server/common/data/notification/NotificationStatus.java | 2 +- .../server/common/data/notification/NotificationType.java | 2 +- .../notification/info/AlarmAssignmentNotificationInfo.java | 2 +- .../data/notification/info/AlarmCommentNotificationInfo.java | 2 +- .../common/data/notification/info/AlarmNotificationInfo.java | 2 +- .../data/notification/info/ApiUsageLimitNotificationInfo.java | 2 +- .../data/notification/info/DeviceActivityNotificationInfo.java | 2 +- .../info/EdgeCommunicationFailureNotificationInfo.java | 2 +- .../data/notification/info/EdgeConnectionNotificationInfo.java | 2 +- .../data/notification/info/EntitiesLimitNotificationInfo.java | 2 +- .../data/notification/info/EntityActionNotificationInfo.java | 2 +- .../common/data/notification/info/GeneralNotificationInfo.java | 2 +- .../notification/info/NewPlatformVersionNotificationInfo.java | 2 +- .../server/common/data/notification/info/NotificationInfo.java | 2 +- .../data/notification/info/RateLimitsNotificationInfo.java | 2 +- .../notification/info/ResourcesShortageNotificationInfo.java | 2 +- .../RuleEngineComponentLifecycleEventNotificationInfo.java | 2 +- .../info/RuleEngineOriginatedNotificationInfo.java | 2 +- .../data/notification/info/RuleOriginatedNotificationInfo.java | 2 +- .../info/TaskProcessingFailureNotificationInfo.java | 2 +- .../rule/DefaultNotificationRuleRecipientsConfig.java | 2 +- .../rule/EscalatedNotificationRuleRecipientsConfig.java | 2 +- .../server/common/data/notification/rule/NotificationRule.java | 2 +- .../common/data/notification/rule/NotificationRuleConfig.java | 2 +- .../common/data/notification/rule/NotificationRuleInfo.java | 2 +- .../notification/rule/NotificationRuleRecipientsConfig.java | 2 +- .../data/notification/rule/trigger/AlarmAssignmentTrigger.java | 2 +- .../data/notification/rule/trigger/AlarmCommentTrigger.java | 2 +- .../common/data/notification/rule/trigger/AlarmTrigger.java | 2 +- .../data/notification/rule/trigger/ApiUsageLimitTrigger.java | 2 +- .../data/notification/rule/trigger/DeviceActivityTrigger.java | 2 +- .../rule/trigger/EdgeCommunicationFailureTrigger.java | 2 +- .../data/notification/rule/trigger/EdgeConnectionTrigger.java | 2 +- .../data/notification/rule/trigger/EntitiesLimitTrigger.java | 2 +- .../data/notification/rule/trigger/EntityActionTrigger.java | 2 +- .../notification/rule/trigger/NewPlatformVersionTrigger.java | 2 +- .../notification/rule/trigger/NotificationRuleTrigger.java | 2 +- .../data/notification/rule/trigger/RateLimitsTrigger.java | 2 +- .../notification/rule/trigger/ResourcesShortageTrigger.java | 2 +- .../rule/trigger/RuleEngineComponentLifecycleEventTrigger.java | 2 +- .../rule/trigger/TaskProcessingFailureTrigger.java | 2 +- .../config/AlarmAssignmentNotificationRuleTriggerConfig.java | 2 +- .../config/AlarmCommentNotificationRuleTriggerConfig.java | 2 +- .../trigger/config/AlarmNotificationRuleTriggerConfig.java | 2 +- .../config/ApiUsageLimitNotificationRuleTriggerConfig.java | 2 +- .../config/DeviceActivityNotificationRuleTriggerConfig.java | 2 +- .../EdgeCommunicationFailureNotificationRuleTriggerConfig.java | 2 +- .../config/EdgeConnectionNotificationRuleTriggerConfig.java | 2 +- .../config/EntitiesLimitNotificationRuleTriggerConfig.java | 2 +- .../config/EntityActionNotificationRuleTriggerConfig.java | 2 +- .../NewPlatformVersionNotificationRuleTriggerConfig.java | 2 +- .../rule/trigger/config/NotificationRuleTriggerConfig.java | 2 +- .../rule/trigger/config/NotificationRuleTriggerType.java | 2 +- .../config/RateLimitsNotificationRuleTriggerConfig.java | 2 +- .../config/ResourcesShortageNotificationRuleTriggerConfig.java | 2 +- ...neComponentLifecycleEventNotificationRuleTriggerConfig.java | 2 +- .../TaskProcessingFailureNotificationRuleTriggerConfig.java | 2 +- .../notification/settings/AccountNotificationSettings.java | 2 +- .../settings/MobileAppNotificationDeliveryMethodConfig.java | 2 +- .../settings/NotificationDeliveryMethodConfig.java | 2 +- .../data/notification/settings/NotificationSettings.java | 2 +- .../settings/SlackNotificationDeliveryMethodConfig.java | 2 +- .../data/notification/settings/UserNotificationSettings.java | 2 +- .../targets/MicrosoftTeamsNotificationTargetConfig.java | 2 +- .../data/notification/targets/NotificationRecipient.java | 2 +- .../common/data/notification/targets/NotificationTarget.java | 2 +- .../data/notification/targets/NotificationTargetConfig.java | 2 +- .../data/notification/targets/NotificationTargetType.java | 2 +- .../targets/platform/AffectedTenantAdministratorsFilter.java | 2 +- .../data/notification/targets/platform/AffectedUserFilter.java | 2 +- .../data/notification/targets/platform/AllUsersFilter.java | 2 +- .../notification/targets/platform/CustomerUsersFilter.java | 2 +- .../targets/platform/OriginatorEntityOwnerUsersFilter.java | 2 +- .../platform/PlatformUsersNotificationTargetConfig.java | 2 +- .../targets/platform/SystemAdministratorsFilter.java | 2 +- .../targets/platform/TenantAdministratorsFilter.java | 2 +- .../data/notification/targets/platform/UserListFilter.java | 2 +- .../common/data/notification/targets/platform/UsersFilter.java | 2 +- .../data/notification/targets/platform/UsersFilterType.java | 2 +- .../data/notification/targets/slack/SlackConversation.java | 2 +- .../data/notification/targets/slack/SlackConversationType.java | 2 +- .../common/data/notification/targets/slack/SlackFile.java | 2 +- .../targets/slack/SlackNotificationTargetConfig.java | 2 +- .../template/DeliveryMethodNotificationTemplate.java | 2 +- .../template/EmailDeliveryMethodNotificationTemplate.java | 2 +- .../server/common/data/notification/template/HasSubject.java | 2 +- .../MicrosoftTeamsDeliveryMethodNotificationTemplate.java | 2 +- .../template/MobileAppDeliveryMethodNotificationTemplate.java | 2 +- .../data/notification/template/NotificationTemplate.java | 2 +- .../data/notification/template/NotificationTemplateConfig.java | 2 +- .../template/SlackDeliveryMethodNotificationTemplate.java | 2 +- .../template/SmsDeliveryMethodNotificationTemplate.java | 2 +- .../common/data/notification/template/TemplatableValue.java | 2 +- .../template/WebDeliveryMethodNotificationTemplate.java | 2 +- .../org/thingsboard/server/common/data/oauth2/MapperType.java | 2 +- .../server/common/data/oauth2/OAuth2BasicMapperConfig.java | 2 +- .../thingsboard/server/common/data/oauth2/OAuth2Client.java | 2 +- .../server/common/data/oauth2/OAuth2ClientInfo.java | 2 +- .../server/common/data/oauth2/OAuth2ClientLoginInfo.java | 2 +- .../common/data/oauth2/OAuth2ClientRegistrationTemplate.java | 2 +- .../server/common/data/oauth2/OAuth2CustomMapperConfig.java | 2 +- .../server/common/data/oauth2/OAuth2MapperConfig.java | 2 +- .../thingsboard/server/common/data/oauth2/OAuth2Params.java | 2 +- .../thingsboard/server/common/data/oauth2/PlatformType.java | 2 +- .../org/thingsboard/server/common/data/oauth2/SchemeType.java | 2 +- .../server/common/data/oauth2/TenantNameStrategyType.java | 2 +- .../server/common/data/objects/AttributesEntityView.java | 2 +- .../server/common/data/objects/TelemetryEntityView.java | 2 +- .../thingsboard/server/common/data/ota/ChecksumAlgorithm.java | 2 +- .../org/thingsboard/server/common/data/ota/OtaPackageKey.java | 2 +- .../org/thingsboard/server/common/data/ota/OtaPackageType.java | 2 +- .../server/common/data/ota/OtaPackageUpdateStatus.java | 2 +- .../org/thingsboard/server/common/data/ota/OtaPackageUtil.java | 2 +- .../server/common/data/page/BasePageDataIterable.java | 2 +- .../java/org/thingsboard/server/common/data/page/PageData.java | 2 +- .../thingsboard/server/common/data/page/PageDataIterable.java | 2 +- .../server/common/data/page/PageDataIterableByTenant.java | 2 +- .../common/data/page/PageDataIterableByTenantIdEntityId.java | 2 +- .../java/org/thingsboard/server/common/data/page/PageLink.java | 2 +- .../org/thingsboard/server/common/data/page/SortOrder.java | 2 +- .../org/thingsboard/server/common/data/page/TimePageLink.java | 2 +- .../server/common/data/permission/QueryContext.java | 2 +- .../server/common/data/plugin/ComponentClusteringMode.java | 2 +- .../server/common/data/plugin/ComponentDescriptor.java | 2 +- .../server/common/data/plugin/ComponentLifecycleEvent.java | 2 +- .../server/common/data/plugin/ComponentLifecycleState.java | 2 +- .../thingsboard/server/common/data/plugin/ComponentScope.java | 2 +- .../thingsboard/server/common/data/plugin/ComponentType.java | 2 +- .../server/common/data/query/AbstractDataQuery.java | 2 +- .../thingsboard/server/common/data/query/AlarmCountQuery.java | 2 +- .../org/thingsboard/server/common/data/query/AlarmData.java | 2 +- .../server/common/data/query/AlarmDataPageLink.java | 2 +- .../thingsboard/server/common/data/query/AlarmDataQuery.java | 2 +- .../thingsboard/server/common/data/query/AliasEntityId.java | 2 +- .../server/common/data/query/AliasEntityIdDeserializer.java | 2 +- .../server/common/data/query/AliasEntityIdImpl.java | 2 +- .../server/common/data/query/AliasEntityIdSerializer.java | 2 +- .../thingsboard/server/common/data/query/AliasEntityType.java | 2 +- .../server/common/data/query/ApiUsageStateFilter.java | 2 +- .../server/common/data/query/AssetSearchQueryFilter.java | 2 +- .../thingsboard/server/common/data/query/AssetTypeFilter.java | 2 +- .../server/common/data/query/BooleanFilterPredicate.java | 2 +- .../server/common/data/query/ComparisonTsValue.java | 2 +- .../server/common/data/query/ComplexFilterPredicate.java | 2 +- .../server/common/data/query/DeviceSearchQueryFilter.java | 2 +- .../thingsboard/server/common/data/query/DeviceTypeFilter.java | 2 +- .../org/thingsboard/server/common/data/query/DynamicValue.java | 2 +- .../server/common/data/query/DynamicValueSourceType.java | 2 +- .../server/common/data/query/EdgeSearchQueryFilter.java | 2 +- .../thingsboard/server/common/data/query/EdgeTypeFilter.java | 2 +- .../thingsboard/server/common/data/query/EntityCountQuery.java | 2 +- .../org/thingsboard/server/common/data/query/EntityData.java | 2 +- .../server/common/data/query/EntityDataPageLink.java | 2 +- .../thingsboard/server/common/data/query/EntityDataQuery.java | 2 +- .../server/common/data/query/EntityDataSortOrder.java | 2 +- .../org/thingsboard/server/common/data/query/EntityFilter.java | 2 +- .../thingsboard/server/common/data/query/EntityFilterType.java | 2 +- .../org/thingsboard/server/common/data/query/EntityKey.java | 2 +- .../thingsboard/server/common/data/query/EntityKeyType.java | 2 +- .../server/common/data/query/EntityKeyValueType.java | 2 +- .../thingsboard/server/common/data/query/EntityListFilter.java | 2 +- .../thingsboard/server/common/data/query/EntityNameFilter.java | 2 +- .../server/common/data/query/EntitySearchQueryFilter.java | 2 +- .../thingsboard/server/common/data/query/EntityTypeFilter.java | 2 +- .../server/common/data/query/EntityViewSearchQueryFilter.java | 2 +- .../server/common/data/query/EntityViewTypeFilter.java | 2 +- .../server/common/data/query/FilterPredicateType.java | 2 +- .../server/common/data/query/FilterPredicateValue.java | 2 +- .../org/thingsboard/server/common/data/query/KeyFilter.java | 2 +- .../server/common/data/query/KeyFilterPredicate.java | 2 +- .../server/common/data/query/NumericFilterPredicate.java | 2 +- .../server/common/data/query/OriginatorAlarmFilter.java | 2 +- .../server/common/data/query/RelationsQueryFilter.java | 2 +- .../server/common/data/query/SimpleKeyFilterPredicate.java | 2 +- .../server/common/data/query/SingleEntityFilter.java | 2 +- .../server/common/data/query/StringFilterPredicate.java | 2 +- .../java/org/thingsboard/server/common/data/query/TsValue.java | 2 +- .../server/common/data/queue/ProcessingStrategy.java | 2 +- .../server/common/data/queue/ProcessingStrategyType.java | 2 +- .../java/org/thingsboard/server/common/data/queue/Queue.java | 2 +- .../org/thingsboard/server/common/data/queue/QueueConfig.java | 2 +- .../org/thingsboard/server/common/data/queue/QueueStats.java | 2 +- .../thingsboard/server/common/data/queue/SubmitStrategy.java | 2 +- .../server/common/data/queue/SubmitStrategyType.java | 2 +- .../server/common/data/relation/EntityRelation.java | 2 +- .../server/common/data/relation/EntityRelationInfo.java | 2 +- .../server/common/data/relation/EntityRelationsQuery.java | 2 +- .../server/common/data/relation/EntitySearchDirection.java | 2 +- .../server/common/data/relation/RelationEntityTypeFilter.java | 2 +- .../server/common/data/relation/RelationTypeGroup.java | 2 +- .../server/common/data/relation/RelationsSearchParameters.java | 2 +- .../main/java/org/thingsboard/server/common/data/rpc/Rpc.java | 2 +- .../java/org/thingsboard/server/common/data/rpc/RpcError.java | 2 +- .../java/org/thingsboard/server/common/data/rpc/RpcStatus.java | 2 +- .../server/common/data/rpc/ToDeviceRpcRequestBody.java | 2 +- .../server/common/data/rule/DefaultRuleChainCreateRequest.java | 2 +- .../server/common/data/rule/NodeConnectionInfo.java | 2 +- .../org/thingsboard/server/common/data/rule/RuleChain.java | 2 +- .../server/common/data/rule/RuleChainConnectionInfo.java | 2 +- .../org/thingsboard/server/common/data/rule/RuleChainData.java | 2 +- .../server/common/data/rule/RuleChainImportResult.java | 2 +- .../thingsboard/server/common/data/rule/RuleChainMetaData.java | 2 +- .../server/common/data/rule/RuleChainOutputLabelsUsage.java | 2 +- .../org/thingsboard/server/common/data/rule/RuleChainType.java | 2 +- .../server/common/data/rule/RuleChainUpdateResult.java | 2 +- .../java/org/thingsboard/server/common/data/rule/RuleNode.java | 2 +- .../org/thingsboard/server/common/data/rule/RuleNodeState.java | 2 +- .../server/common/data/rule/RuleNodeUpdateResult.java | 2 +- .../java/org/thingsboard/server/common/data/rule/RuleType.java | 2 +- .../java/org/thingsboard/server/common/data/rule/Scope.java | 2 +- .../thingsboard/server/common/data/script/ScriptLanguage.java | 2 +- .../org/thingsboard/server/common/data/security/Authority.java | 2 +- .../server/common/data/security/DeviceCredentials.java | 2 +- .../server/common/data/security/DeviceCredentialsFilter.java | 2 +- .../server/common/data/security/DeviceCredentialsType.java | 2 +- .../server/common/data/security/DeviceTokenCredentials.java | 2 +- .../server/common/data/security/DeviceX509Credentials.java | 2 +- .../server/common/data/security/UserAuthSettings.java | 2 +- .../server/common/data/security/UserCredentials.java | 2 +- .../common/data/security/event/UserAuthDataChangedEvent.java | 2 +- .../data/security/event/UserCredentialsInvalidationEvent.java | 2 +- .../data/security/event/UserSessionInvalidationEvent.java | 2 +- .../thingsboard/server/common/data/security/model/JwtPair.java | 2 +- .../server/common/data/security/model/JwtSettings.java | 2 +- .../server/common/data/security/model/JwtToken.java | 2 +- .../server/common/data/security/model/SecuritySettings.java | 2 +- .../server/common/data/security/model/UserPasswordPolicy.java | 2 +- .../common/data/security/model/mfa/PlatformTwoFaSettings.java | 2 +- .../data/security/model/mfa/account/AccountTwoFaSettings.java | 2 +- .../model/mfa/account/BackupCodeTwoFaAccountConfig.java | 2 +- .../security/model/mfa/account/EmailTwoFaAccountConfig.java | 2 +- .../security/model/mfa/account/OtpBasedTwoFaAccountConfig.java | 2 +- .../data/security/model/mfa/account/SmsTwoFaAccountConfig.java | 2 +- .../security/model/mfa/account/TotpTwoFaAccountConfig.java | 2 +- .../data/security/model/mfa/account/TwoFaAccountConfig.java | 2 +- .../model/mfa/provider/BackupCodeTwoFaProviderConfig.java | 2 +- .../security/model/mfa/provider/EmailTwoFaProviderConfig.java | 2 +- .../model/mfa/provider/OtpBasedTwoFaProviderConfig.java | 2 +- .../security/model/mfa/provider/SmsTwoFaProviderConfig.java | 2 +- .../security/model/mfa/provider/TotpTwoFaProviderConfig.java | 2 +- .../data/security/model/mfa/provider/TwoFaProviderConfig.java | 2 +- .../data/security/model/mfa/provider/TwoFaProviderType.java | 2 +- .../server/common/data/settings/AbstractUserDashboardInfo.java | 2 +- .../server/common/data/settings/LastVisitedDashboardInfo.java | 2 +- .../server/common/data/settings/StarredDashboardInfo.java | 2 +- .../server/common/data/settings/UserDashboardAction.java | 2 +- .../server/common/data/settings/UserDashboardsInfo.java | 2 +- .../thingsboard/server/common/data/settings/UserSettings.java | 2 +- .../server/common/data/settings/UserSettingsCompositeKey.java | 2 +- .../server/common/data/settings/UserSettingsType.java | 2 +- .../common/data/sms/config/AwsSnsSmsProviderConfiguration.java | 2 +- .../common/data/sms/config/SmppSmsProviderConfiguration.java | 2 +- .../common/data/sms/config/SmsProviderConfiguration.java | 2 +- .../server/common/data/sms/config/SmsProviderType.java | 2 +- .../server/common/data/sms/config/TestSmsRequest.java | 2 +- .../common/data/sms/config/TwilioSmsProviderConfiguration.java | 2 +- .../org/thingsboard/server/common/data/sync/JsonTbEntity.java | 2 +- .../server/common/data/sync/ie/AttributeExportData.java | 2 +- .../server/common/data/sync/ie/DeviceExportData.java | 2 +- .../server/common/data/sync/ie/EntityExportData.java | 2 +- .../server/common/data/sync/ie/EntityExportSettings.java | 2 +- .../server/common/data/sync/ie/EntityImportResult.java | 2 +- .../server/common/data/sync/ie/EntityImportSettings.java | 2 +- .../server/common/data/sync/ie/OtaPackageExportData.java | 2 +- .../server/common/data/sync/ie/RuleChainExportData.java | 2 +- .../server/common/data/sync/ie/WidgetTypeExportData.java | 2 +- .../server/common/data/sync/ie/WidgetsBundleExportData.java | 2 +- .../data/sync/ie/importing/csv/BulkImportColumnType.java | 2 +- .../common/data/sync/ie/importing/csv/BulkImportRequest.java | 2 +- .../common/data/sync/ie/importing/csv/BulkImportResult.java | 2 +- .../server/common/data/sync/vc/AutoCommitSettings.java | 2 +- .../org/thingsboard/server/common/data/sync/vc/BranchInfo.java | 2 +- .../thingsboard/server/common/data/sync/vc/EntityDataDiff.java | 2 +- .../thingsboard/server/common/data/sync/vc/EntityDataInfo.java | 2 +- .../server/common/data/sync/vc/EntityLoadError.java | 2 +- .../server/common/data/sync/vc/EntityTypeLoadResult.java | 2 +- .../thingsboard/server/common/data/sync/vc/EntityVersion.java | 2 +- .../server/common/data/sync/vc/EntityVersionsDiff.java | 2 +- .../server/common/data/sync/vc/RepositoryAuthMethod.java | 2 +- .../server/common/data/sync/vc/RepositorySettings.java | 2 +- .../server/common/data/sync/vc/RepositorySettingsInfo.java | 2 +- .../org/thingsboard/server/common/data/sync/vc/VcUtils.java | 2 +- .../server/common/data/sync/vc/VersionCreationResult.java | 2 +- .../server/common/data/sync/vc/VersionLoadResult.java | 2 +- .../server/common/data/sync/vc/VersionedEntityInfo.java | 2 +- .../data/sync/vc/request/create/AutoVersionCreateConfig.java | 2 +- .../sync/vc/request/create/ComplexVersionCreateRequest.java | 2 +- .../sync/vc/request/create/EntityTypeVersionCreateConfig.java | 2 +- .../vc/request/create/SingleEntityVersionCreateRequest.java | 2 +- .../common/data/sync/vc/request/create/SyncStrategy.java | 2 +- .../data/sync/vc/request/create/VersionCreateConfig.java | 2 +- .../data/sync/vc/request/create/VersionCreateRequest.java | 2 +- .../data/sync/vc/request/create/VersionCreateRequestType.java | 2 +- .../data/sync/vc/request/load/EntityTypeVersionLoadConfig.java | 2 +- .../sync/vc/request/load/EntityTypeVersionLoadRequest.java | 2 +- .../sync/vc/request/load/SingleEntityVersionLoadRequest.java | 2 +- .../common/data/sync/vc/request/load/VersionLoadConfig.java | 2 +- .../common/data/sync/vc/request/load/VersionLoadRequest.java | 2 +- .../data/sync/vc/request/load/VersionLoadRequestType.java | 2 +- .../data/tenant/profile/DefaultTenantProfileConfiguration.java | 2 +- .../common/data/tenant/profile/TenantProfileConfiguration.java | 2 +- .../server/common/data/tenant/profile/TenantProfileData.java | 2 +- .../data/tenant/profile/TenantProfileQueueConfiguration.java | 2 +- .../server/common/data/transport/resource/ResourceType.java | 2 +- .../common/data/transport/snmp/AuthenticationProtocol.java | 2 +- .../server/common/data/transport/snmp/PrivacyProtocol.java | 2 +- .../common/data/transport/snmp/SnmpCommunicationSpec.java | 2 +- .../server/common/data/transport/snmp/SnmpMapping.java | 2 +- .../server/common/data/transport/snmp/SnmpMethod.java | 2 +- .../server/common/data/transport/snmp/SnmpProtocolVersion.java | 2 +- .../snmp/config/MultipleMappingsSnmpCommunicationConfig.java | 2 +- .../snmp/config/RepeatingQueryingSnmpCommunicationConfig.java | 2 +- .../data/transport/snmp/config/SnmpCommunicationConfig.java | 2 +- .../snmp/config/ToServerRpcRequestSnmpCommunicationConfig.java | 2 +- .../impl/ClientAttributesQueryingSnmpCommunicationConfig.java | 2 +- .../impl/SharedAttributesSettingSnmpCommunicationConfig.java | 2 +- .../config/impl/TelemetryQueryingSnmpCommunicationConfig.java | 2 +- .../config/impl/ToDeviceRpcRequestSnmpCommunicationConfig.java | 2 +- .../thingsboard/server/common/data/trendz/TrendzSettings.java | 2 +- .../thingsboard/server/common/data/util/CollectionsUtil.java | 2 +- .../thingsboard/server/common/data/util/ReflectionUtils.java | 2 +- .../thingsboard/server/common/data/util/TbDDFFileParser.java | 2 +- .../server/common/data/util/TbDefaultDDFFileValidator.java | 2 +- .../java/org/thingsboard/server/common/data/util/TbPair.java | 2 +- .../org/thingsboard/server/common/data/util/TemplateUtils.java | 2 +- .../server/common/data/util/ThrowingBiFunction.java | 2 +- .../thingsboard/server/common/data/util/ThrowingRunnable.java | 2 +- .../thingsboard/server/common/data/util/ThrowingSupplier.java | 2 +- .../org/thingsboard/server/common/data/util/TypeCastUtil.java | 2 +- .../org/thingsboard/server/common/data/validation/Length.java | 2 +- .../thingsboard/server/common/data/validation/NoNullChar.java | 2 +- .../org/thingsboard/server/common/data/validation/NoXss.java | 2 +- .../thingsboard/server/common/data/validation/RateLimit.java | 2 +- .../server/common/data/validation/ValidJsonSchema.java | 2 +- .../thingsboard/server/common/data/widget/BaseWidgetType.java | 2 +- .../server/common/data/widget/DeprecatedFilter.java | 2 +- .../server/common/data/widget/WidgetBundleInfo.java | 2 +- .../org/thingsboard/server/common/data/widget/WidgetType.java | 2 +- .../server/common/data/widget/WidgetTypeDetails.java | 2 +- .../server/common/data/widget/WidgetTypeFilter.java | 2 +- .../thingsboard/server/common/data/widget/WidgetTypeInfo.java | 2 +- .../thingsboard/server/common/data/widget/WidgetsBundle.java | 2 +- .../server/common/data/widget/WidgetsBundleFilter.java | 2 +- .../server/common/data/widget/WidgetsBundleWidget.java | 2 +- .../thingsboard/server/common/data/DynamicProtoUtilsTest.java | 2 +- .../org/thingsboard/server/common/data/EntityTypeTest.java | 2 +- .../org/thingsboard/server/common/data/StringUtilsTest.java | 2 +- .../org/thingsboard/server/common/data/UUIDConverterTest.java | 2 +- .../thingsboard/server/common/data/audit/ActionTypeTest.java | 2 +- .../org/thingsboard/server/common/data/id/EntityIdTest.java | 2 +- .../thingsboard/server/common/data/limit/LimitedApiTest.java | 2 +- .../server/common/data/limit/RateLimitUtilTest.java | 2 +- .../org/thingsboard/server/common/data/msg/TbMsgTypeTest.java | 2 +- .../org/thingsboard/server/common/data/rpc/RpcStatusTest.java | 2 +- common/discovery-api/pom.xml | 2 +- .../server/queue/discovery/TbServiceInfoProvider.java | 2 +- common/edge-api/pom.xml | 2 +- .../thingsboard/edge/exception/EdgeConnectionException.java | 2 +- .../src/main/java/org/thingsboard/edge/rpc/EdgeGrpcClient.java | 2 +- .../src/main/java/org/thingsboard/edge/rpc/EdgeRpcClient.java | 2 +- common/edge-api/src/main/proto/edge.proto | 2 +- common/edqs/pom.xml | 2 +- .../org/thingsboard/server/edqs/data/ApiUsageStateData.java | 2 +- .../main/java/org/thingsboard/server/edqs/data/AssetData.java | 2 +- .../java/org/thingsboard/server/edqs/data/BaseEntityData.java | 2 +- .../java/org/thingsboard/server/edqs/data/CustomerData.java | 2 +- .../main/java/org/thingsboard/server/edqs/data/DeviceData.java | 2 +- .../main/java/org/thingsboard/server/edqs/data/EntityData.java | 2 +- .../org/thingsboard/server/edqs/data/EntityProfileData.java | 2 +- .../java/org/thingsboard/server/edqs/data/GenericData.java | 2 +- .../org/thingsboard/server/edqs/data/ProfileAwareData.java | 2 +- .../java/org/thingsboard/server/edqs/data/RelationData.java | 2 +- .../java/org/thingsboard/server/edqs/data/RelationInfo.java | 2 +- .../java/org/thingsboard/server/edqs/data/RelationsRepo.java | 2 +- .../main/java/org/thingsboard/server/edqs/data/TenantData.java | 2 +- .../org/thingsboard/server/edqs/data/dp/AbstractDataPoint.java | 2 +- .../org/thingsboard/server/edqs/data/dp/BoolDataPoint.java | 2 +- .../server/edqs/data/dp/CompressedJsonDataPoint.java | 2 +- .../server/edqs/data/dp/CompressedStringDataPoint.java | 2 +- .../org/thingsboard/server/edqs/data/dp/DoubleDataPoint.java | 2 +- .../org/thingsboard/server/edqs/data/dp/JsonDataPoint.java | 2 +- .../org/thingsboard/server/edqs/data/dp/LongDataPoint.java | 2 +- .../org/thingsboard/server/edqs/data/dp/StringDataPoint.java | 2 +- .../org/thingsboard/server/edqs/processor/EdqsProcessor.java | 2 +- .../org/thingsboard/server/edqs/processor/EdqsProducer.java | 2 +- .../main/java/org/thingsboard/server/edqs/query/DataKey.java | 2 +- .../java/org/thingsboard/server/edqs/query/EdqsCountQuery.java | 2 +- .../java/org/thingsboard/server/edqs/query/EdqsDataQuery.java | 2 +- .../java/org/thingsboard/server/edqs/query/EdqsFilter.java | 2 +- .../main/java/org/thingsboard/server/edqs/query/EdqsQuery.java | 2 +- .../org/thingsboard/server/edqs/query/SortableEntityData.java | 2 +- .../processor/AbstractEntityProfileNameQueryProcessor.java | 2 +- .../query/processor/AbstractEntityProfileQueryProcessor.java | 2 +- .../query/processor/AbstractEntitySearchQueryProcessor.java | 2 +- .../server/edqs/query/processor/AbstractQueryProcessor.java | 2 +- .../edqs/query/processor/AbstractRelationQueryProcessor.java | 2 +- .../edqs/query/processor/AbstractSimpleQueryProcessor.java | 2 +- .../processor/AbstractSingleEntityTypeQueryProcessor.java | 2 +- .../edqs/query/processor/ApiUsageStateQueryProcessor.java | 2 +- .../server/edqs/query/processor/AssetSearchQueryProcessor.java | 2 +- .../server/edqs/query/processor/AssetTypeQueryProcessor.java | 2 +- .../edqs/query/processor/DeviceSearchQueryProcessor.java | 2 +- .../server/edqs/query/processor/DeviceTypeQueryProcessor.java | 2 +- .../server/edqs/query/processor/EdgeTypeQueryProcessor.java | 2 +- .../edqs/query/processor/EdgeTypeSearchQueryProcessor.java | 2 +- .../server/edqs/query/processor/EntityListQueryProcessor.java | 2 +- .../server/edqs/query/processor/EntityNameQueryProcessor.java | 2 +- .../server/edqs/query/processor/EntityQueryProcessor.java | 2 +- .../edqs/query/processor/EntityQueryProcessorFactory.java | 2 +- .../server/edqs/query/processor/EntityTypeQueryProcessor.java | 2 +- .../edqs/query/processor/EntityViewSearchQueryProcessor.java | 2 +- .../edqs/query/processor/EntityViewTypeQueryProcessor.java | 2 +- .../server/edqs/query/processor/RelationQueryProcessor.java | 2 +- .../edqs/query/processor/SingleEntityQueryProcessor.java | 2 +- .../thingsboard/server/edqs/repo/DefaultEdqsRepository.java | 2 +- .../java/org/thingsboard/server/edqs/repo/EdqsRepository.java | 2 +- .../java/org/thingsboard/server/edqs/repo/KeyDictionary.java | 2 +- .../main/java/org/thingsboard/server/edqs/repo/TenantRepo.java | 2 +- .../thingsboard/server/edqs/state/EdqsPartitionService.java | 2 +- .../org/thingsboard/server/edqs/state/EdqsStateService.java | 2 +- .../thingsboard/server/edqs/state/KafkaEdqsStateService.java | 2 +- .../thingsboard/server/edqs/state/LocalEdqsStateService.java | 2 +- .../thingsboard/server/edqs/stats/DefaultEdqsStatsService.java | 2 +- .../org/thingsboard/server/edqs/util/DefaultEdqsMapper.java | 2 +- .../main/java/org/thingsboard/server/edqs/util/EdqsMapper.java | 2 +- .../java/org/thingsboard/server/edqs/util/EdqsRocksDb.java | 2 +- .../java/org/thingsboard/server/edqs/util/RepositoryUtils.java | 2 +- .../main/java/org/thingsboard/server/edqs/util/TbRocksDb.java | 2 +- .../java/org/thingsboard/server/edqs/util/VersionsStore.java | 2 +- common/message/pom.xml | 2 +- .../java/org/thingsboard/server/common/msg/EncryptionUtil.java | 2 +- .../main/java/org/thingsboard/server/common/msg/MsgType.java | 2 +- .../java/org/thingsboard/server/common/msg/TbActorMsg.java | 2 +- .../org/thingsboard/server/common/msg/TbActorStopReason.java | 2 +- .../src/main/java/org/thingsboard/server/common/msg/TbMsg.java | 2 +- .../java/org/thingsboard/server/common/msg/TbMsgDataType.java | 2 +- .../java/org/thingsboard/server/common/msg/TbMsgMetaData.java | 2 +- .../org/thingsboard/server/common/msg/TbMsgProcessingCtx.java | 2 +- .../server/common/msg/TbMsgProcessingStackItem.java | 2 +- .../thingsboard/server/common/msg/TbRuleEngineActorMsg.java | 2 +- .../server/common/msg/ToCalculatedFieldSystemMsg.java | 2 +- .../server/common/msg/ToDeviceActorNotificationMsg.java | 2 +- .../thingsboard/server/common/msg/aware/CustomerAwareMsg.java | 2 +- .../thingsboard/server/common/msg/aware/DeviceAwareMsg.java | 2 +- .../org/thingsboard/server/common/msg/aware/NodeAwareMsg.java | 2 +- .../thingsboard/server/common/msg/aware/RuleChainAwareMsg.java | 2 +- .../thingsboard/server/common/msg/aware/TenantAwareMsg.java | 2 +- .../server/common/msg/cf/CalculatedFieldCacheInitMsg.java | 2 +- .../common/msg/cf/CalculatedFieldEntityLifecycleMsg.java | 2 +- .../common/msg/cf/CalculatedFieldPartitionChangeMsg.java | 2 +- .../thingsboard/server/common/msg/cluster/ToAllNodesMsg.java | 2 +- .../thingsboard/server/common/msg/edge/EdgeEventUpdateMsg.java | 2 +- .../server/common/msg/edge/EdgeHighPriorityMsg.java | 2 +- .../org/thingsboard/server/common/msg/edge/EdgeSessionMsg.java | 2 +- .../server/common/msg/edge/FromEdgeSyncResponse.java | 2 +- .../thingsboard/server/common/msg/edge/ToEdgeSyncRequest.java | 2 +- .../org/thingsboard/server/common/msg/edqs/EdqsApiService.java | 2 +- .../org/thingsboard/server/common/msg/edqs/EdqsService.java | 2 +- .../server/common/msg/gateway/metrics/GatewayMetadata.java | 2 +- .../server/common/msg/housekeeper/HousekeeperClient.java | 2 +- .../common/msg/notification/NotificationRuleProcessor.java | 2 +- .../server/common/msg/plugin/ComponentLifecycleListener.java | 2 +- .../server/common/msg/plugin/ComponentLifecycleMsg.java | 2 +- .../server/common/msg/plugin/RuleNodeUpdatedMsg.java | 2 +- .../server/common/msg/queue/PartitionChangeMsg.java | 2 +- .../server/common/msg/queue/QueueToRuleEngineMsg.java | 2 +- .../server/common/msg/queue/RuleEngineException.java | 2 +- .../thingsboard/server/common/msg/queue/RuleNodeException.java | 2 +- .../org/thingsboard/server/common/msg/queue/RuleNodeInfo.java | 2 +- .../org/thingsboard/server/common/msg/queue/ServiceType.java | 2 +- .../org/thingsboard/server/common/msg/queue/TbCallback.java | 2 +- .../org/thingsboard/server/common/msg/queue/TbMsgCallback.java | 2 +- .../server/common/msg/queue/TopicPartitionInfo.java | 2 +- .../server/common/msg/rpc/FromDeviceRpcResponse.java | 2 +- .../server/common/msg/rpc/FromDeviceRpcResponseActorMsg.java | 2 +- .../thingsboard/server/common/msg/rpc/RemoveRpcActorMsg.java | 2 +- .../thingsboard/server/common/msg/rpc/ToDeviceRpcRequest.java | 2 +- .../server/common/msg/rpc/ToDeviceRpcRequestActorMsg.java | 2 +- .../server/common/msg/rule/engine/DeviceAttributes.java | 2 +- .../msg/rule/engine/DeviceAttributesEventNotificationMsg.java | 2 +- .../rule/engine/DeviceCredentialsUpdateNotificationMsg.java | 2 +- .../server/common/msg/rule/engine/DeviceDeleteMsg.java | 2 +- .../server/common/msg/rule/engine/DeviceEdgeUpdateMsg.java | 2 +- .../server/common/msg/rule/engine/DeviceMetaData.java | 2 +- .../common/msg/rule/engine/DeviceNameOrTypeUpdateMsg.java | 2 +- .../org/thingsboard/server/common/msg/session/FeatureType.java | 2 +- .../thingsboard/server/common/msg/session/SessionMsgType.java | 2 +- .../common/msg/session/ex/ProcessingTimeoutException.java | 2 +- .../server/common/msg/session/ex/SessionAuthException.java | 2 +- .../server/common/msg/session/ex/SessionException.java | 2 +- .../common/msg/timeout/DeviceActorServerSideRpcTimeoutMsg.java | 2 +- .../org/thingsboard/server/common/msg/timeout/TimeoutMsg.java | 2 +- .../common/msg/tools/MaxPayloadSizeExceededException.java | 2 +- .../thingsboard/server/common/msg/tools/SchedulerUtils.java | 2 +- .../org/thingsboard/server/common/msg/tools/TbRateLimits.java | 2 +- .../server/common/msg/tools/TbRateLimitsException.java | 2 +- common/message/src/main/proto/tbmsg.proto | 2 +- .../org/thingsboard/server/common/msg/EncryptionUtilTest.java | 2 +- .../org/thingsboard/server/common/msg/TbMsgMetaDataTest.java | 2 +- .../server/common/msg/TbMsgProcessingStackItemTest.java | 2 +- .../server/common/msg/queue/TopicPartitionInfoTest.java | 2 +- .../thingsboard/server/common/msg/tools/TbRateLimitsTest.java | 2 +- common/pom.xml | 2 +- common/proto/pom.xml | 2 +- .../thingsboard/server/common/adaptor/AdaptorException.java | 2 +- .../org/thingsboard/server/common/adaptor/JsonConverter.java | 2 +- .../thingsboard/server/common/adaptor/JsonConverterConfig.java | 2 +- .../org/thingsboard/server/common/adaptor/ProtoConverter.java | 2 +- .../java/org/thingsboard/server/common/util/KvProtoUtil.java | 2 +- .../java/org/thingsboard/server/common/util/ProtoUtils.java | 2 +- common/proto/src/main/proto/jsinvoke.proto | 2 +- common/proto/src/main/proto/queue.proto | 2 +- common/proto/src/main/proto/transport.proto | 2 +- .../thingsboard/server/common/adaptor/JsonConverterTest.java | 2 +- .../org/thingsboard/server/common/util/KvProtoUtilTest.java | 2 +- .../org/thingsboard/server/common/util/ProtoUtilsTest.java | 2 +- common/queue/pom.xml | 2 +- .../server/queue/RuleEngineTbQueueAdminFactory.java | 2 +- .../queue/common/AbstractParallelTbQueueConsumerTemplate.java | 2 +- .../server/queue/common/AbstractTbQueueConsumerTemplate.java | 2 +- .../server/queue/common/AbstractTbQueueTemplate.java | 2 +- .../thingsboard/server/queue/common/AsyncCallbackTemplate.java | 2 +- .../org/thingsboard/server/queue/common/DefaultTbQueueMsg.java | 2 +- .../server/queue/common/DefaultTbQueueMsgHeaders.java | 2 +- .../server/queue/common/DefaultTbQueueRequestTemplate.java | 2 +- .../server/queue/common/DefaultTbQueueResponseTemplate.java | 2 +- .../server/queue/common/MultipleTbQueueCallbackWrapper.java | 2 +- .../queue/common/MultipleTbQueueTbMsgCallbackWrapper.java | 2 +- .../server/queue/common/PartitionedQueueResponseTemplate.java | 2 +- .../thingsboard/server/queue/common/SimpleTbQueueCallback.java | 2 +- .../org/thingsboard/server/queue/common/TbProtoJsQueueMsg.java | 2 +- .../org/thingsboard/server/queue/common/TbProtoQueueMsg.java | 2 +- .../server/queue/common/TbQueueTbMsgCallbackWrapper.java | 2 +- .../server/queue/common/TbRuleEngineProducerService.java | 2 +- .../server/queue/common/consumer/MainQueueConsumerManager.java | 2 +- .../queue/common/consumer/PartitionedQueueConsumerManager.java | 2 +- .../server/queue/common/consumer/QueueConsumerManager.java | 2 +- .../server/queue/common/consumer/QueueTaskType.java | 2 +- .../queue/common/consumer/TbQueueConsumerManagerTask.java | 2 +- .../server/queue/common/consumer/TbQueueConsumerTask.java | 2 +- .../server/queue/common/state/DefaultQueueStateService.java | 2 +- .../server/queue/common/state/KafkaQueueStateService.java | 2 +- .../server/queue/common/state/QueueStateService.java | 2 +- .../server/queue/discovery/ConsistentHashCircle.java | 2 +- .../server/queue/discovery/DefaultTbServiceInfoProvider.java | 2 +- .../thingsboard/server/queue/discovery/DiscoveryService.java | 2 +- .../server/queue/discovery/DummyDiscoveryService.java | 2 +- .../server/queue/discovery/HashPartitionService.java | 2 +- .../thingsboard/server/queue/discovery/PartitionService.java | 2 +- .../java/org/thingsboard/server/queue/discovery/QueueKey.java | 2 +- .../thingsboard/server/queue/discovery/QueueRoutingInfo.java | 2 +- .../server/queue/discovery/QueueRoutingInfoService.java | 2 +- .../server/queue/discovery/TbApplicationEventListener.java | 2 +- .../thingsboard/server/queue/discovery/TenantRoutingInfo.java | 2 +- .../server/queue/discovery/TenantRoutingInfoService.java | 2 +- .../org/thingsboard/server/queue/discovery/TopicService.java | 2 +- .../thingsboard/server/queue/discovery/ZkDiscoveryService.java | 2 +- .../queue/discovery/event/ClusterTopologyChangeEvent.java | 2 +- .../queue/discovery/event/OtherServiceShutdownEvent.java | 2 +- .../server/queue/discovery/event/PartitionChangeEvent.java | 2 +- .../server/queue/discovery/event/ServiceListChangedEvent.java | 2 +- .../server/queue/discovery/event/TbApplicationEvent.java | 2 +- .../java/org/thingsboard/server/queue/edqs/EdqsComponent.java | 2 +- .../java/org/thingsboard/server/queue/edqs/EdqsConfig.java | 2 +- .../java/org/thingsboard/server/queue/edqs/EdqsExecutors.java | 2 +- .../org/thingsboard/server/queue/edqs/EdqsQueueFactory.java | 2 +- .../thingsboard/server/queue/edqs/InMemoryEdqsComponent.java | 2 +- .../server/queue/edqs/InMemoryEdqsQueueFactory.java | 2 +- .../org/thingsboard/server/queue/edqs/KafkaEdqsComponent.java | 2 +- .../thingsboard/server/queue/edqs/KafkaEdqsQueueFactory.java | 2 +- .../thingsboard/server/queue/environment/DistributedLock.java | 2 +- .../server/queue/environment/DistributedLockService.java | 2 +- .../server/queue/environment/DummyDistributedLockService.java | 2 +- .../server/queue/environment/EnvironmentLogService.java | 2 +- .../server/queue/environment/ZkDistributedLockService.java | 2 +- .../server/queue/housekeeper/DefaultHousekeeperClient.java | 2 +- .../server/queue/housekeeper/HousekeeperConfig.java | 2 +- .../java/org/thingsboard/server/queue/kafka/KafkaAdmin.java | 2 +- .../org/thingsboard/server/queue/kafka/KafkaTbQueueMsg.java | 2 +- .../server/queue/kafka/KafkaTbQueueMsgMetadata.java | 2 +- .../java/org/thingsboard/server/queue/kafka/TbKafkaAdmin.java | 2 +- .../server/queue/kafka/TbKafkaConsumerStatisticConfig.java | 2 +- .../server/queue/kafka/TbKafkaConsumerStatsService.java | 2 +- .../server/queue/kafka/TbKafkaConsumerTemplate.java | 2 +- .../org/thingsboard/server/queue/kafka/TbKafkaDecoder.java | 2 +- .../org/thingsboard/server/queue/kafka/TbKafkaEncoder.java | 2 +- .../server/queue/kafka/TbKafkaProducerTemplate.java | 2 +- .../org/thingsboard/server/queue/kafka/TbKafkaSettings.java | 2 +- .../thingsboard/server/queue/kafka/TbKafkaTopicConfigs.java | 2 +- .../server/queue/memory/DefaultInMemoryStorage.java | 2 +- .../org/thingsboard/server/queue/memory/InMemoryStorage.java | 2 +- .../server/queue/memory/InMemoryTbQueueConsumer.java | 2 +- .../server/queue/memory/InMemoryTbQueueProducer.java | 2 +- .../notification/DefaultNotificationDeduplicationService.java | 2 +- .../queue/notification/NotificationDeduplicationService.java | 2 +- .../queue/notification/RemoteNotificationRuleProcessor.java | 2 +- .../server/queue/provider/EdqsClientQueueFactory.java | 2 +- .../server/queue/provider/HousekeeperClientQueueFactory.java | 2 +- .../server/queue/provider/InMemoryMonolithQueueFactory.java | 2 +- .../server/queue/provider/InMemoryTbTransportQueueFactory.java | 2 +- .../server/queue/provider/KafkaMonolithQueueFactory.java | 2 +- .../server/queue/provider/KafkaTbCoreQueueFactory.java | 2 +- .../server/queue/provider/KafkaTbRuleEngineQueueFactory.java | 2 +- .../server/queue/provider/KafkaTbTransportQueueFactory.java | 2 +- .../queue/provider/KafkaTbVersionControlQueueFactory.java | 2 +- .../thingsboard/server/queue/provider/TbCoreQueueFactory.java | 2 +- .../server/queue/provider/TbCoreQueueProducerProvider.java | 2 +- .../server/queue/provider/TbQueueProducerProvider.java | 2 +- .../server/queue/provider/TbRuleEngineProducerProvider.java | 2 +- .../server/queue/provider/TbRuleEngineQueueFactory.java | 2 +- .../server/queue/provider/TbTransportQueueFactory.java | 2 +- .../queue/provider/TbTransportQueueProducerProvider.java | 2 +- .../server/queue/provider/TbUsageStatsClientQueueFactory.java | 2 +- .../queue/provider/TbVersionControlProducerProvider.java | 2 +- .../server/queue/provider/TbVersionControlQueueFactory.java | 2 +- .../server/queue/scheduler/DefaultSchedulerComponent.java | 2 +- .../thingsboard/server/queue/scheduler/SchedulerComponent.java | 2 +- .../thingsboard/server/queue/settings/TasksQueueConfig.java | 2 +- .../server/queue/settings/TbQueueCalculatedFieldSettings.java | 2 +- .../thingsboard/server/queue/settings/TbQueueCoreSettings.java | 2 +- .../thingsboard/server/queue/settings/TbQueueEdgeSettings.java | 2 +- .../server/queue/settings/TbQueueRemoteJsInvokeSettings.java | 2 +- .../server/queue/settings/TbQueueRuleEngineSettings.java | 2 +- .../server/queue/settings/TbQueueTransportApiSettings.java | 2 +- .../queue/settings/TbQueueTransportNotificationSettings.java | 2 +- .../server/queue/settings/TbQueueVersionControlSettings.java | 2 +- .../server/queue/task/InMemoryTaskProcessorQueueFactory.java | 2 +- .../server/queue/task/InMemoryTaskProducerQueueFactory.java | 2 +- .../org/thingsboard/server/queue/task/JobStatsService.java | 2 +- .../server/queue/task/KafkaTaskProcessorQueueFactory.java | 2 +- .../server/queue/task/KafkaTaskProducerQueueFactory.java | 2 +- .../java/org/thingsboard/server/queue/task/TaskProcessor.java | 2 +- .../thingsboard/server/queue/task/TaskProcessorExecutors.java | 2 +- .../server/queue/task/TaskProcessorQueueFactory.java | 2 +- .../server/queue/task/TaskProducerQueueFactory.java | 2 +- .../server/queue/usagestats/DefaultTbApiUsageReportClient.java | 2 +- .../org/thingsboard/server/queue/util/AfterContextReady.java | 2 +- .../java/org/thingsboard/server/queue/util/AfterStartUp.java | 2 +- .../java/org/thingsboard/server/queue/util/PropertyUtils.java | 2 +- .../org/thingsboard/server/queue/util/TbCoreComponent.java | 2 +- .../org/thingsboard/server/queue/util/TbKafkaComponent.java | 2 +- .../server/queue/util/TbLwM2mBootstrapTransportComponent.java | 2 +- .../server/queue/util/TbLwM2mTransportComponent.java | 2 +- .../thingsboard/server/queue/util/TbRuleEngineComponent.java | 2 +- .../server/queue/util/TbSnmpTransportComponent.java | 2 +- .../thingsboard/server/queue/util/TbTransportComponent.java | 2 +- .../server/queue/util/TbVersionControlComponent.java | 2 +- .../server/queue/common/DefaultTbQueueRequestTemplateTest.java | 2 +- .../org/thingsboard/server/queue/discovery/QueueKeyTest.java | 2 +- .../server/queue/discovery/ZkDiscoveryServiceTest.java | 2 +- .../org/thingsboard/server/queue/kafka/TbKafkaAdminTest.java | 2 +- .../server/queue/kafka/TbKafkaProducerTemplateTest.java | 2 +- .../thingsboard/server/queue/kafka/TbKafkaSettingsTest.java | 2 +- .../server/queue/memory/DefaultInMemoryStorageTest.java | 2 +- .../org/thingsboard/server/queue/util/PropertyUtilsTest.java | 2 +- common/script/pom.xml | 2 +- common/script/remote-js-client/pom.xml | 2 +- .../thingsboard/server/service/script/JsExecutorService.java | 2 +- .../server/service/script/RemoteJsInvokeService.java | 2 +- .../server/service/script/RemoteJsRequestEncoder.java | 2 +- .../server/service/script/RemoteJsResponseDecoder.java | 2 +- common/script/script-api/pom.xml | 2 +- .../thingsboard/script/api/AbstractScriptInvokeService.java | 2 +- .../java/org/thingsboard/script/api/BlockedScriptInfo.java | 2 +- .../java/org/thingsboard/script/api/RuleNodeScriptFactory.java | 2 +- .../java/org/thingsboard/script/api/ScriptInvokeService.java | 2 +- .../java/org/thingsboard/script/api/ScriptStatCallback.java | 2 +- .../src/main/java/org/thingsboard/script/api/ScriptType.java | 2 +- .../java/org/thingsboard/script/api/TbScriptException.java | 2 +- .../java/org/thingsboard/script/api/TbScriptExecutionTask.java | 2 +- .../org/thingsboard/script/api/js/AbstractJsInvokeService.java | 2 +- .../java/org/thingsboard/script/api/js/JsInvokeService.java | 2 +- .../org/thingsboard/script/api/js/JsScriptExecutionTask.java | 2 +- .../main/java/org/thingsboard/script/api/js/JsScriptInfo.java | 2 +- .../main/java/org/thingsboard/script/api/js/JsValidator.java | 2 +- .../org/thingsboard/script/api/js/NashornJsInvokeService.java | 2 +- .../org/thingsboard/script/api/tbel/DateTimeFormatOptions.java | 2 +- .../thingsboard/script/api/tbel/DefaultTbelInvokeService.java | 2 +- .../src/main/java/org/thingsboard/script/api/tbel/TbDate.java | 2 +- .../src/main/java/org/thingsboard/script/api/tbel/TbJson.java | 2 +- .../java/org/thingsboard/script/api/tbel/TbTimeWindow.java | 2 +- .../src/main/java/org/thingsboard/script/api/tbel/TbUtils.java | 2 +- .../main/java/org/thingsboard/script/api/tbel/TbelCfArg.java | 2 +- .../main/java/org/thingsboard/script/api/tbel/TbelCfCtx.java | 2 +- .../java/org/thingsboard/script/api/tbel/TbelCfObject.java | 2 +- .../org/thingsboard/script/api/tbel/TbelCfSingleValueArg.java | 2 +- .../org/thingsboard/script/api/tbel/TbelCfTsDoubleVal.java | 2 +- .../thingsboard/script/api/tbel/TbelCfTsMultiDoubleVal.java | 2 +- .../org/thingsboard/script/api/tbel/TbelCfTsRollingArg.java | 2 +- .../org/thingsboard/script/api/tbel/TbelCfTsRollingData.java | 2 +- .../org/thingsboard/script/api/tbel/TbelInvokeService.java | 2 +- .../main/java/org/thingsboard/script/api/tbel/TbelScript.java | 2 +- .../thingsboard/script/api/tbel/TbelScriptExecutionTask.java | 2 +- .../script/api/AbstractScriptInvokeServiceTest.java | 2 +- .../java/org/thingsboard/script/api/TbScriptExceptionTest.java | 2 +- .../thingsboard/script/api/js/AbstractJsInvokeServiceTest.java | 2 +- .../java/org/thingsboard/script/api/js/JsValidatorTest.java | 2 +- .../org/thingsboard/script/api/tbel/TbDateConstructorTest.java | 2 +- .../test/java/org/thingsboard/script/api/tbel/TbDateTest.java | 2 +- .../java/org/thingsboard/script/api/tbel/TbDateTestEntity.java | 2 +- .../test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java | 2 +- .../thingsboard/script/api/tbel/TbelCfTsRollingArgTest.java | 2 +- common/stats/pom.xml | 2 +- .../org/thingsboard/server/common/stats/DefaultCounter.java | 2 +- .../thingsboard/server/common/stats/DefaultMessagesStats.java | 2 +- .../thingsboard/server/common/stats/DefaultStatsFactory.java | 2 +- .../thingsboard/server/common/stats/DummyEdqsStatsService.java | 2 +- .../org/thingsboard/server/common/stats/EdqsStatsService.java | 2 +- .../thingsboard/server/common/stats/FstStatsServiceImpl.java | 2 +- .../org/thingsboard/server/common/stats/MessagesStats.java | 2 +- .../java/org/thingsboard/server/common/stats/StatsCounter.java | 2 +- .../java/org/thingsboard/server/common/stats/StatsFactory.java | 2 +- .../java/org/thingsboard/server/common/stats/StatsTimer.java | 2 +- .../java/org/thingsboard/server/common/stats/StatsType.java | 2 +- .../server/common/stats/TbApiUsageReportClient.java | 2 +- .../thingsboard/server/common/stats/TbApiUsageStateClient.java | 2 +- common/transport/coap/pom.xml | 2 +- .../server/transport/coap/AbstractCoapTransportResource.java | 2 +- .../thingsboard/server/transport/coap/CoapSessionMsgType.java | 2 +- .../server/transport/coap/CoapTransportContext.java | 2 +- .../server/transport/coap/CoapTransportResource.java | 2 +- .../server/transport/coap/CoapTransportService.java | 2 +- .../server/transport/coap/OtaPackageTransportResource.java | 2 +- .../server/transport/coap/TbCoapMessageObserver.java | 2 +- .../server/transport/coap/TransportConfigurationContainer.java | 2 +- .../server/transport/coap/adaptors/CoapAdaptorUtils.java | 2 +- .../server/transport/coap/adaptors/CoapTransportAdaptor.java | 2 +- .../server/transport/coap/adaptors/JsonCoapAdaptor.java | 2 +- .../server/transport/coap/adaptors/ProtoCoapAdaptor.java | 2 +- .../transport/coap/callback/AbstractSyncSessionCallback.java | 2 +- .../server/transport/coap/callback/CoapDeviceAuthCallback.java | 2 +- .../server/transport/coap/callback/CoapEfentoCallback.java | 2 +- .../server/transport/coap/callback/CoapNoOpCallback.java | 2 +- .../server/transport/coap/callback/CoapResponseCallback.java | 2 +- .../transport/coap/callback/CoapResponseCodeCallback.java | 2 +- .../coap/callback/GetAttributesSyncSessionCallback.java | 2 +- .../coap/callback/ToServerRpcSyncSessionCallback.java | 2 +- .../server/transport/coap/client/CoapClientContext.java | 2 +- .../server/transport/coap/client/DefaultCoapClientContext.java | 2 +- .../thingsboard/server/transport/coap/client/NoSecClient.java | 2 +- .../server/transport/coap/client/NoSecObserveClient.java | 2 +- .../server/transport/coap/client/SecureClientNoAuth.java | 2 +- .../server/transport/coap/client/SecureClientX509.java | 2 +- .../server/transport/coap/client/TbCoapClientState.java | 2 +- .../server/transport/coap/client/TbCoapContentFormatUtil.java | 2 +- .../server/transport/coap/client/TbCoapObservationState.java | 2 +- .../transport/coap/efento/CoapEfentoTransportResource.java | 2 +- .../transport/coap/efento/adaptor/EfentoCoapAdaptor.java | 2 +- .../server/transport/coap/efento/utils/CoapEfentoUtils.java | 2 +- .../server/transport/coap/efento/utils/PulseCounterType.java | 2 +- common/transport/coap/src/main/proto/efento/proto_config.proto | 2 +- .../coap/src/main/proto/efento/proto_device_info.proto | 2 +- .../coap/src/main/proto/efento/proto_measurement_types.proto | 2 +- .../coap/src/main/proto/efento/proto_measurements.proto | 2 +- common/transport/coap/src/main/proto/efento/proto_rule.proto | 2 +- .../server/transport/coap/CoapTransportResourceTest.java | 2 +- .../transport/coap/efento/CoapEfentoTransportResourceTest.java | 2 +- common/transport/http/pom.xml | 2 +- .../thingsboard/server/transport/http/DeviceApiController.java | 2 +- .../server/transport/http/HttpTransportContext.java | 2 +- .../server/transport/http/config/PayloadSizeFilter.java | 2 +- .../transport/http/config/TransportSecurityConfiguration.java | 2 +- .../server/transport/http/DeviceApiControllerTest.java | 2 +- common/transport/lwm2m/pom.xml | 2 +- .../lwm2m/bootstrap/LwM2MTransportBootstrapService.java | 2 +- .../transport/lwm2m/bootstrap/secure/LwM2MBootstrapConfig.java | 2 +- .../lwm2m/bootstrap/secure/LwM2MBootstrapServers.java | 2 +- .../transport/lwm2m/bootstrap/secure/LwM2MServerBootstrap.java | 2 +- .../bootstrap/secure/LwM2mDefaultBootstrapSessionManager.java | 2 +- .../secure/TbLwM2MDtlsBootstrapCertificateVerifier.java | 2 +- .../lwm2m/bootstrap/store/LwM2MBootstrapClientInstanceIds.java | 2 +- .../bootstrap/store/LwM2MBootstrapConfigStoreTaskProvider.java | 2 +- .../lwm2m/bootstrap/store/LwM2MBootstrapSecurityStore.java | 2 +- .../lwm2m/bootstrap/store/LwM2MBootstrapTaskProvider.java | 2 +- .../lwm2m/bootstrap/store/LwM2MConfigurationChecker.java | 2 +- .../bootstrap/store/LwM2MInMemoryBootstrapConfigStore.java | 2 +- .../server/transport/lwm2m/config/LwM2MSecureServerConfig.java | 2 +- .../transport/lwm2m/config/LwM2MTransportBootstrapConfig.java | 2 +- .../transport/lwm2m/config/LwM2MTransportServerConfig.java | 2 +- .../server/transport/lwm2m/config/TbLwM2mVersion.java | 2 +- .../lwm2m/secure/LwM2mCredentialsSecurityInfoValidator.java | 2 +- .../server/transport/lwm2m/secure/LwM2mRPkCredentials.java | 2 +- .../server/transport/lwm2m/secure/TbLwM2MAuthorizer.java | 2 +- .../transport/lwm2m/secure/TbLwM2MDtlsCertificateVerifier.java | 2 +- .../server/transport/lwm2m/secure/TbLwM2MSecurityInfo.java | 2 +- .../server/transport/lwm2m/secure/TbX509DtlsSessionInfo.java | 2 +- .../lwm2m/secure/credentials/LwM2MClientCredentials.java | 2 +- .../transport/lwm2m/server/AbstractLwM2mTransportResource.java | 2 +- .../transport/lwm2m/server/DefaultLwM2mTransportService.java | 2 +- .../server/transport/lwm2m/server/LwM2MNetworkConfig.java | 2 +- .../server/transport/lwm2m/server/LwM2MOperationType.java | 2 +- .../server/transport/lwm2m/server/LwM2MTransportService.java | 2 +- .../server/transport/lwm2m/server/LwM2mOtaConvert.java | 2 +- .../server/transport/lwm2m/server/LwM2mQueuedRequest.java | 2 +- .../server/transport/lwm2m/server/LwM2mServerListener.java | 2 +- .../server/transport/lwm2m/server/LwM2mSessionMsgListener.java | 2 +- .../transport/lwm2m/server/LwM2mTransportCoapResource.java | 2 +- .../server/transport/lwm2m/server/LwM2mTransportContext.java | 2 +- .../transport/lwm2m/server/LwM2mTransportServerHelper.java | 2 +- .../transport/lwm2m/server/LwM2mVersionedModelProvider.java | 2 +- .../transport/lwm2m/server/adaptors/LwM2MJsonAdaptor.java | 2 +- .../transport/lwm2m/server/adaptors/LwM2MTransportAdaptor.java | 2 +- .../lwm2m/server/attributes/DefaultLwM2MAttributesService.java | 2 +- .../lwm2m/server/attributes/LwM2MAttributesService.java | 2 +- .../transport/lwm2m/server/client/LwM2MAuthException.java | 2 +- .../server/transport/lwm2m/server/client/LwM2MClientState.java | 2 +- .../lwm2m/server/client/LwM2MClientStateException.java | 2 +- .../server/transport/lwm2m/server/client/LwM2mClient.java | 2 +- .../transport/lwm2m/server/client/LwM2mClientContext.java | 2 +- .../transport/lwm2m/server/client/LwM2mClientContextImpl.java | 2 +- .../server/transport/lwm2m/server/client/ModelObject.java | 2 +- .../transport/lwm2m/server/client/ResourceUpdateResult.java | 2 +- .../server/transport/lwm2m/server/client/ResourceValue.java | 2 +- .../transport/lwm2m/server/client/ResultsAddKeyValueProto.java | 2 +- .../lwm2m/server/common/LwM2MExecutorAwareService.java | 2 +- .../lwm2m/server/downlink/AbstractTbLwM2MRequestCallback.java | 2 +- .../downlink/AbstractTbLwM2MTargetedDownlinkRequest.java | 2 +- .../lwm2m/server/downlink/DefaultLwM2mDownlinkMsgHandler.java | 2 +- .../lwm2m/server/downlink/DownlinkRequestCallback.java | 2 +- .../transport/lwm2m/server/downlink/HasContentFormat.java | 2 +- .../server/transport/lwm2m/server/downlink/HasVersionedId.java | 2 +- .../transport/lwm2m/server/downlink/HasVersionedIds.java | 2 +- .../lwm2m/server/downlink/LwM2mDownlinkMsgHandler.java | 2 +- .../lwm2m/server/downlink/TbLwM2MCancelAllObserveCallback.java | 2 +- .../lwm2m/server/downlink/TbLwM2MCancelAllRequest.java | 2 +- .../lwm2m/server/downlink/TbLwM2MCancelObserveCallback.java | 2 +- .../lwm2m/server/downlink/TbLwM2MCancelObserveRequest.java | 2 +- .../transport/lwm2m/server/downlink/TbLwM2MCreateRequest.java | 2 +- .../lwm2m/server/downlink/TbLwM2MCreateResponseCallback.java | 2 +- .../transport/lwm2m/server/downlink/TbLwM2MDeleteCallback.java | 2 +- .../transport/lwm2m/server/downlink/TbLwM2MDeleteRequest.java | 2 +- .../lwm2m/server/downlink/TbLwM2MDiscoverAllRequest.java | 2 +- .../lwm2m/server/downlink/TbLwM2MDiscoverCallback.java | 2 +- .../lwm2m/server/downlink/TbLwM2MDiscoverRequest.java | 2 +- .../lwm2m/server/downlink/TbLwM2MDownlinkRequest.java | 2 +- .../lwm2m/server/downlink/TbLwM2MExecuteCallback.java | 2 +- .../transport/lwm2m/server/downlink/TbLwM2MExecuteRequest.java | 2 +- .../transport/lwm2m/server/downlink/TbLwM2MLatchCallback.java | 2 +- .../lwm2m/server/downlink/TbLwM2MObserveAllRequest.java | 2 +- .../lwm2m/server/downlink/TbLwM2MObserveCallback.java | 2 +- .../transport/lwm2m/server/downlink/TbLwM2MObserveRequest.java | 2 +- .../transport/lwm2m/server/downlink/TbLwM2MReadCallback.java | 2 +- .../transport/lwm2m/server/downlink/TbLwM2MReadRequest.java | 2 +- .../lwm2m/server/downlink/TbLwM2MTargetedCallback.java | 2 +- .../lwm2m/server/downlink/TbLwM2MUplinkTargetedCallback.java | 2 +- .../lwm2m/server/downlink/TbLwM2MWriteAttributesCallback.java | 2 +- .../lwm2m/server/downlink/TbLwM2MWriteAttributesRequest.java | 2 +- .../lwm2m/server/downlink/TbLwM2MWriteReplaceRequest.java | 2 +- .../lwm2m/server/downlink/TbLwM2MWriteResponseCallback.java | 2 +- .../lwm2m/server/downlink/TbLwM2MWriteUpdateRequest.java | 2 +- .../AbstractTbLwM2MTargetedDownlinkCompositeRequest.java | 2 +- .../composite/TbLwM2MCancelObserveCompositeCallback.java | 2 +- .../composite/TbLwM2MCancelObserveCompositeRequest.java | 2 +- .../downlink/composite/TbLwM2MObserveCompositeCallback.java | 2 +- .../downlink/composite/TbLwM2MObserveCompositeRequest.java | 2 +- .../downlink/composite/TbLwM2MReadCompositeCallback.java | 2 +- .../server/downlink/composite/TbLwM2MReadCompositeRequest.java | 2 +- .../downlink/composite/TbLwM2MWriteCompositeRequest.java | 2 +- .../composite/TbLwM2MWriteResponseCompositeCallback.java | 2 +- .../lwm2m/server/log/DefaultLwM2MTelemetryLogService.java | 2 +- .../transport/lwm2m/server/log/LwM2MTelemetryLogService.java | 2 +- .../server/transport/lwm2m/server/model/LwM2MModelConfig.java | 2 +- .../transport/lwm2m/server/model/LwM2MModelConfigService.java | 2 +- .../lwm2m/server/model/LwM2MModelConfigServiceImpl.java | 2 +- .../transport/lwm2m/server/model/ParametersAnalyzeResult.java | 2 +- .../lwm2m/server/model/ParametersObserveAnalyzeResult.java | 2 +- .../lwm2m/server/model/ParametersUpdateAnalyzeResult.java | 2 +- .../lwm2m/server/ota/DefaultLwM2MOtaUpdateService.java | 2 +- .../server/transport/lwm2m/server/ota/LwM2MClientOtaInfo.java | 2 +- .../server/transport/lwm2m/server/ota/LwM2MClientOtaState.java | 2 +- .../transport/lwm2m/server/ota/LwM2MOtaUpdateService.java | 2 +- .../lwm2m/server/ota/firmware/FirmwareDeliveryMethod.java | 2 +- .../lwm2m/server/ota/firmware/FirmwareUpdateResult.java | 2 +- .../lwm2m/server/ota/firmware/FirmwareUpdateState.java | 2 +- .../lwm2m/server/ota/firmware/LwM2MClientFwOtaInfo.java | 2 +- .../lwm2m/server/ota/firmware/LwM2MFirmwareUpdateStrategy.java | 2 +- .../lwm2m/server/ota/software/LwM2MClientSwOtaInfo.java | 2 +- .../lwm2m/server/ota/software/LwM2MSoftwareUpdateStrategy.java | 2 +- .../lwm2m/server/ota/software/SoftwareUpdateResult.java | 2 +- .../lwm2m/server/ota/software/SoftwareUpdateState.java | 2 +- .../lwm2m/server/rpc/DefaultLwM2MRpcRequestHandler.java | 2 +- .../transport/lwm2m/server/rpc/LwM2MRpcRequestHandler.java | 2 +- .../transport/lwm2m/server/rpc/LwM2MRpcRequestHeader.java | 2 +- .../transport/lwm2m/server/rpc/LwM2MRpcResponseBody.java | 2 +- .../lwm2m/server/rpc/RpcCancelAllObserveCallback.java | 2 +- .../transport/lwm2m/server/rpc/RpcCancelObserveCallback.java | 2 +- .../server/transport/lwm2m/server/rpc/RpcCreateRequest.java | 2 +- .../transport/lwm2m/server/rpc/RpcCreateResponseCallback.java | 2 +- .../server/transport/lwm2m/server/rpc/RpcDiscoverCallback.java | 2 +- .../lwm2m/server/rpc/RpcDownlinkRequestCallbackProxy.java | 2 +- .../transport/lwm2m/server/rpc/RpcEmptyResponseCallback.java | 2 +- .../server/transport/lwm2m/server/rpc/RpcLinkSetCallback.java | 2 +- .../transport/lwm2m/server/rpc/RpcLwM2MDownlinkCallback.java | 2 +- .../transport/lwm2m/server/rpc/RpcReadResponseCallback.java | 2 +- .../transport/lwm2m/server/rpc/RpcWriteAttributesRequest.java | 2 +- .../transport/lwm2m/server/rpc/RpcWriteReplaceRequest.java | 2 +- .../transport/lwm2m/server/rpc/RpcWriteUpdateRequest.java | 2 +- .../rpc/composite/RpcCancelObserveCompositeCallback.java | 2 +- .../rpc/composite/RpcObserveResponseCompositeCallback.java | 2 +- .../lwm2m/server/rpc/composite/RpcReadCompositeRequest.java | 2 +- .../server/rpc/composite/RpcReadResponseCompositeCallback.java | 2 +- .../lwm2m/server/rpc/composite/RpcWriteCompositeRequest.java | 2 +- .../lwm2m/server/session/DefaultLwM2MSessionManager.java | 2 +- .../transport/lwm2m/server/session/LwM2MSessionManager.java | 2 +- .../lwm2m/server/store/TbDummyLwM2MClientOtaInfoStore.java | 2 +- .../transport/lwm2m/server/store/TbDummyLwM2MClientStore.java | 2 +- .../lwm2m/server/store/TbDummyLwM2MModelConfigStore.java | 2 +- .../transport/lwm2m/server/store/TbEditableSecurityStore.java | 2 +- .../lwm2m/server/store/TbInMemoryRegistrationStore.java | 2 +- .../transport/lwm2m/server/store/TbInMemorySecurityStore.java | 2 +- .../lwm2m/server/store/TbL2M2MDtlsSessionInMemoryStore.java | 2 +- .../lwm2m/server/store/TbLwM2MClientOtaInfoStore.java | 2 +- .../transport/lwm2m/server/store/TbLwM2MClientStore.java | 2 +- .../lwm2m/server/store/TbLwM2MDtlsSessionRedisStore.java | 2 +- .../transport/lwm2m/server/store/TbLwM2MDtlsSessionStore.java | 2 +- .../transport/lwm2m/server/store/TbLwM2MModelConfigStore.java | 2 +- .../lwm2m/server/store/TbLwM2mRedisClientOtaInfoStore.java | 2 +- .../lwm2m/server/store/TbLwM2mRedisRegistrationStore.java | 2 +- .../lwm2m/server/store/TbLwM2mRedisSecurityStore.java | 2 +- .../transport/lwm2m/server/store/TbLwM2mSecurityStore.java | 2 +- .../transport/lwm2m/server/store/TbLwM2mStoreFactory.java | 2 +- .../transport/lwm2m/server/store/TbMainSecurityStore.java | 2 +- .../transport/lwm2m/server/store/TbRedisLwM2MClientStore.java | 2 +- .../lwm2m/server/store/TbRedisLwM2MModelConfigStore.java | 2 +- .../server/transport/lwm2m/server/store/TbSecurityStore.java | 2 +- .../transport/lwm2m/server/store/util/LwM2MClientSerDes.java | 2 +- .../lwm2m/server/uplink/DefaultLwM2mUplinkMsgHandler.java | 2 +- .../server/transport/lwm2m/server/uplink/LwM2mTypeServer.java | 2 +- .../transport/lwm2m/server/uplink/LwM2mUplinkMsgHandler.java | 2 +- .../server/transport/lwm2m/utils/LwM2MTransportUtil.java | 2 +- .../server/transport/lwm2m/utils/LwM2mValueConverterImpl.java | 2 +- .../server/transport/lwm2m/server/client/LwM2mClientTest.java | 2 +- .../lwm2m/server/model/LwM2MModelConfigServiceImplTest.java | 2 +- .../lwm2m/server/store/util/LwM2MClientSerDesTest.java | 2 +- common/transport/mqtt/pom.xml | 2 +- .../transport/mqtt/DefaultTransportMBeanConfiguration.java | 2 +- .../org/thingsboard/server/transport/mqtt/HashMapObserver.java | 2 +- .../server/transport/mqtt/HashMapObserverMBean.java | 2 +- .../server/transport/mqtt/MqttSslHandlerProvider.java | 2 +- .../server/transport/mqtt/MqttTransportContext.java | 2 +- .../server/transport/mqtt/MqttTransportHandler.java | 2 +- .../server/transport/mqtt/MqttTransportServerInitializer.java | 2 +- .../server/transport/mqtt/MqttTransportService.java | 2 +- .../server/transport/mqtt/TbMqttSslTransportComponent.java | 2 +- .../server/transport/mqtt/TbMqttTransportComponent.java | 2 +- .../java/org/thingsboard/server/transport/mqtt/TopicType.java | 2 +- .../transport/mqtt/adaptors/BackwardCompatibilityAdaptor.java | 2 +- .../server/transport/mqtt/adaptors/JsonMqttAdaptor.java | 2 +- .../server/transport/mqtt/adaptors/MqttTransportAdaptor.java | 2 +- .../server/transport/mqtt/adaptors/ProtoMqttAdaptor.java | 2 +- .../server/transport/mqtt/gateway/GatewayMetricsService.java | 2 +- .../transport/mqtt/gateway/metrics/GatewayMetricsState.java | 2 +- .../server/transport/mqtt/limits/GatewaySessionLimits.java | 2 +- .../org/thingsboard/server/transport/mqtt/limits/IpFilter.java | 2 +- .../server/transport/mqtt/limits/ProxyIpFilter.java | 2 +- .../server/transport/mqtt/limits/SessionLimits.java | 2 +- .../mqtt/session/AbstractGatewayDeviceSessionContext.java | 2 +- .../transport/mqtt/session/AbstractGatewaySessionHandler.java | 2 +- .../server/transport/mqtt/session/DeviceSessionCtx.java | 2 +- .../transport/mqtt/session/GatewayDeviceSessionContext.java | 2 +- .../server/transport/mqtt/session/GatewaySessionHandler.java | 2 +- .../transport/mqtt/session/MqttDeviceAwareSessionContext.java | 2 +- .../server/transport/mqtt/session/MqttTopicMatcher.java | 2 +- .../transport/mqtt/session/SparkplugDeviceSessionContext.java | 2 +- .../transport/mqtt/session/SparkplugNodeSessionHandler.java | 2 +- .../server/transport/mqtt/util/AlwaysTrueTopicFilter.java | 2 +- .../server/transport/mqtt/util/EqualsTopicFilter.java | 2 +- .../server/transport/mqtt/util/MqttTopicFilter.java | 2 +- .../server/transport/mqtt/util/MqttTopicFilterFactory.java | 2 +- .../server/transport/mqtt/util/RegexTopicFilter.java | 2 +- .../server/transport/mqtt/util/ReturnCodeResolver.java | 2 +- .../server/transport/mqtt/util/sparkplug/DeviceDescriptor.java | 2 +- .../transport/mqtt/util/sparkplug/EdgeNodeDescriptor.java | 2 +- .../server/transport/mqtt/util/sparkplug/MetricDataType.java | 2 +- .../mqtt/util/sparkplug/SparkplugConnectionState.java | 2 +- .../transport/mqtt/util/sparkplug/SparkplugDescriptor.java | 2 +- .../transport/mqtt/util/sparkplug/SparkplugMessageType.java | 2 +- .../transport/mqtt/util/sparkplug/SparkplugMetricUtil.java | 2 +- .../mqtt/util/sparkplug/SparkplugRpcRequestHeader.java | 2 +- .../mqtt/util/sparkplug/SparkplugRpcResponseBody.java | 2 +- .../server/transport/mqtt/util/sparkplug/SparkplugTopic.java | 2 +- .../transport/mqtt/util/sparkplug/SparkplugTopicService.java | 2 +- .../server/transport/mqtt/util/sparkplug/SpecVersion.java | 2 +- common/transport/mqtt/src/main/proto/sparkplug.proto | 2 +- .../server/transport/mqtt/MqttTransportHandlerTest.java | 2 +- .../transport/mqtt/session/GatewaySessionHandlerTest.java | 2 +- .../server/transport/mqtt/util/MqttTopicFilterFactoryTest.java | 2 +- common/transport/pom.xml | 2 +- common/transport/snmp/pom.xml | 2 +- .../server/transport/snmp/SnmpTransportContext.java | 2 +- .../transport/snmp/event/ServiceListChangedEventListener.java | 2 +- .../transport/snmp/event/SnmpTransportListChangedEvent.java | 2 +- .../snmp/event/SnmpTransportListChangedEventListener.java | 2 +- .../thingsboard/server/transport/snmp/service/PduService.java | 2 +- .../transport/snmp/service/ProtoTransportEntityService.java | 2 +- .../server/transport/snmp/service/SnmpAuthService.java | 2 +- .../transport/snmp/service/SnmpTransportBalancingService.java | 2 +- .../server/transport/snmp/service/SnmpTransportService.java | 2 +- .../server/transport/snmp/session/DeviceSessionContext.java | 2 +- .../server/transport/snmp/session/ScheduledTask.java | 2 +- .../server/transport/snmp/SnmpDeviceSimulatorV2.java | 2 +- .../server/transport/snmp/SnmpDeviceSimulatorV3.java | 2 +- .../java/org/thingsboard/server/transport/snmp/SnmpTestV2.java | 2 +- .../java/org/thingsboard/server/transport/snmp/SnmpTestV3.java | 2 +- common/transport/transport-api/pom.xml | 2 +- .../server/common/transport/DeviceDeletedEvent.java | 2 +- .../server/common/transport/DeviceProfileUpdatedEvent.java | 2 +- .../server/common/transport/DeviceUpdatedEvent.java | 2 +- .../server/common/transport/SessionMsgListener.java | 2 +- .../thingsboard/server/common/transport/TransportAdaptor.java | 2 +- .../thingsboard/server/common/transport/TransportContext.java | 2 +- .../server/common/transport/TransportDeviceProfileCache.java | 2 +- .../server/common/transport/TransportResourceCache.java | 2 +- .../thingsboard/server/common/transport/TransportService.java | 2 +- .../server/common/transport/TransportServiceCallback.java | 2 +- .../server/common/transport/TransportTenantProfileCache.java | 2 +- .../common/transport/activity/AbstractActivityManager.java | 2 +- .../server/common/transport/activity/ActivityManager.java | 2 +- .../common/transport/activity/ActivityReportCallback.java | 2 +- .../server/common/transport/activity/ActivityState.java | 2 +- .../common/transport/activity/strategy/ActivityStrategy.java | 2 +- .../transport/activity/strategy/ActivityStrategyType.java | 2 +- .../transport/activity/strategy/AllEventsActivityStrategy.java | 2 +- .../activity/strategy/FirstAndLastEventActivityStrategy.java | 2 +- .../activity/strategy/FirstEventActivityStrategy.java | 2 +- .../transport/activity/strategy/LastEventActivityStrategy.java | 2 +- .../server/common/transport/auth/DeviceAuthResult.java | 2 +- .../server/common/transport/auth/DeviceAuthService.java | 2 +- .../server/common/transport/auth/DeviceProfileAware.java | 2 +- .../transport/auth/GetOrCreateDeviceFromGatewayResponse.java | 2 +- .../server/common/transport/auth/SessionInfoCreator.java | 2 +- .../server/common/transport/auth/TransportDeviceInfo.java | 2 +- .../transport/auth/ValidateDeviceCredentialsResponse.java | 2 +- .../common/transport/config/ssl/AbstractSslCredentials.java | 2 +- .../common/transport/config/ssl/KeystoreSslCredentials.java | 2 +- .../server/common/transport/config/ssl/PemSslCredentials.java | 2 +- .../server/common/transport/config/ssl/SslCredentials.java | 2 +- .../common/transport/config/ssl/SslCredentialsConfig.java | 2 +- .../server/common/transport/config/ssl/SslCredentialsType.java | 2 +- .../config/ssl/SslCredentialsWebServerCustomizer.java | 2 +- .../common/transport/limits/DefaultEntityLimitsCache.java | 2 +- .../transport/limits/DefaultTransportRateLimitService.java | 2 +- .../common/transport/limits/DummyTransportRateLimit.java | 2 +- .../server/common/transport/limits/EntityLimitKey.java | 2 +- .../server/common/transport/limits/EntityLimitsCache.java | 2 +- .../common/transport/limits/EntityTransportRateLimits.java | 2 +- .../common/transport/limits/InetAddressRateLimitStats.java | 2 +- .../common/transport/limits/SimpleTransportRateLimit.java | 2 +- .../server/common/transport/limits/TransportLimitsType.java | 2 +- .../server/common/transport/limits/TransportRateLimit.java | 2 +- .../common/transport/limits/TransportRateLimitService.java | 2 +- .../common/transport/profile/TenantProfileUpdateResult.java | 2 +- .../transport/service/DefaultTransportDeviceProfileCache.java | 2 +- .../transport/service/DefaultTransportResourceCache.java | 2 +- .../common/transport/service/DefaultTransportService.java | 2 +- .../transport/service/DefaultTransportTenantProfileCache.java | 2 +- .../server/common/transport/service/RpcRequestMetadata.java | 2 +- .../server/common/transport/service/SessionMetaData.java | 2 +- .../common/transport/service/ToRuleEngineMsgEncoder.java | 2 +- .../transport/service/ToTransportMsgResponseDecoder.java | 2 +- .../common/transport/service/TransportActivityManager.java | 2 +- .../common/transport/service/TransportApiRequestEncoder.java | 2 +- .../common/transport/service/TransportApiResponseDecoder.java | 2 +- .../transport/service/TransportQueueRoutingInfoService.java | 2 +- .../transport/service/TransportTenantRoutingInfoService.java | 2 +- .../common/transport/session/DeviceAwareSessionContext.java | 2 +- .../server/common/transport/session/SessionContext.java | 2 +- .../thingsboard/server/common/transport/util/JsonUtils.java | 2 +- .../org/thingsboard/server/common/transport/util/SslUtil.java | 2 +- .../transport/activity/strategy/ActivityStrategyTypeTest.java | 2 +- .../activity/strategy/AllEventsActivityStrategyTest.java | 2 +- .../strategy/FirstAndLastEventActivityStrategyTest.java | 2 +- .../activity/strategy/FirstEventActivityStrategyTest.java | 2 +- .../activity/strategy/LastEventActivityStrategyTest.java | 2 +- .../common/transport/service/TransportActivityManagerTest.java | 2 +- common/util/pom.xml | 2 +- .../org/thingsboard/common/util/AbstractListeningExecutor.java | 2 +- .../main/java/org/thingsboard/common/util/AzureIotHubUtil.java | 2 +- .../src/main/java/org/thingsboard/common/util/CachedValue.java | 2 +- .../main/java/org/thingsboard/common/util/DebugModeUtil.java | 2 +- .../java/org/thingsboard/common/util/DeduplicationUtil.java | 2 +- .../main/java/org/thingsboard/common/util/DonAsynchron.java | 2 +- .../main/java/org/thingsboard/common/util/ExceptionUtil.java | 2 +- .../java/org/thingsboard/common/util/ExecutorProvider.java | 2 +- .../org/thingsboard/common/util/ExpressionFunctionsUtil.java | 2 +- .../src/main/java/org/thingsboard/common/util/JacksonUtil.java | 2 +- .../main/java/org/thingsboard/common/util/JsonSchemaUtils.java | 2 +- .../util/src/main/java/org/thingsboard/common/util/KvUtil.java | 2 +- .../org/thingsboard/common/util/LinkedHashMapRemoveEldest.java | 2 +- .../java/org/thingsboard/common/util/ListeningExecutor.java | 2 +- .../java/org/thingsboard/common/util/NoOpFutureCallback.java | 2 +- .../main/java/org/thingsboard/common/util/RecoveryAware.java | 2 +- .../src/main/java/org/thingsboard/common/util/RegexUtils.java | 2 +- .../src/main/java/org/thingsboard/common/util/SetCache.java | 2 +- .../src/main/java/org/thingsboard/common/util/SslUtil.java | 2 +- .../src/main/java/org/thingsboard/common/util/SystemUtil.java | 2 +- .../src/main/java/org/thingsboard/common/util/TbBytePool.java | 2 +- .../src/main/java/org/thingsboard/common/util/TbStopWatch.java | 2 +- .../main/java/org/thingsboard/common/util/TbStringPool.java | 2 +- .../java/org/thingsboard/common/util/ThingsBoardExecutors.java | 2 +- .../common/util/ThingsBoardForkJoinWorkerThreadFactory.java | 2 +- .../common/util/ThingsBoardScheduledThreadPoolExecutor.java | 2 +- .../org/thingsboard/common/util/ThingsBoardThreadFactory.java | 2 +- .../main/java/org/thingsboard/common/util/geo/Coordinates.java | 2 +- .../src/main/java/org/thingsboard/common/util/geo/GeoUtil.java | 2 +- .../main/java/org/thingsboard/common/util/geo/Perimeter.java | 2 +- .../java/org/thingsboard/common/util/geo/PerimeterType.java | 2 +- .../main/java/org/thingsboard/common/util/geo/RangeUnit.java | 2 +- .../java/org/thingsboard/common/util/ExceptionUtilTest.java | 2 +- .../test/java/org/thingsboard/common/util/JacksonUtilTest.java | 2 +- .../thingsboard/common/util/LinkedHashMapRemoveEldestTest.java | 2 +- .../util/ThingsBoardScheduledThreadPoolExecutorTest.java | 2 +- common/version-control/pom.xml | 2 +- .../server/service/sync/vc/ClusterVersionControlService.java | 2 +- .../service/sync/vc/DefaultClusterVersionControlService.java | 2 +- .../server/service/sync/vc/DefaultGitRepositoryService.java | 2 +- .../org/thingsboard/server/service/sync/vc/GitRepository.java | 2 +- .../server/service/sync/vc/GitRepositoryService.java | 2 +- .../org/thingsboard/server/service/sync/vc/PendingCommit.java | 2 +- .../server/service/sync/vc/VersionControlRequestCtx.java | 2 +- dao/pom.xml | 2 +- .../server/dao/AbstractVersionedInsertRepository.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/Dao.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java | 2 +- .../java/org/thingsboard/server/dao/ExportableEntityDao.java | 2 +- .../org/thingsboard/server/dao/ExportableEntityRepository.java | 2 +- .../java/org/thingsboard/server/dao/ImageContainerDao.java | 2 +- .../java/org/thingsboard/server/dao/ResourceContainerDao.java | 2 +- .../main/java/org/thingsboard/server/dao/TenantEntityDao.java | 2 +- .../org/thingsboard/server/dao/TenantEntityWithDataDao.java | 2 +- .../thingsboard/server/dao/ThingsboardPostgreSQLDialect.java | 2 +- .../org/thingsboard/server/dao/ai/AiModelCacheEvictEvent.java | 2 +- .../java/org/thingsboard/server/dao/ai/AiModelCacheKey.java | 2 +- .../org/thingsboard/server/dao/ai/AiModelCaffeineCache.java | 2 +- .../main/java/org/thingsboard/server/dao/ai/AiModelDao.java | 2 +- .../java/org/thingsboard/server/dao/ai/AiModelRedisCache.java | 2 +- .../java/org/thingsboard/server/dao/ai/AiModelServiceImpl.java | 2 +- .../java/org/thingsboard/server/dao/alarm/AlarmCommentDao.java | 2 +- .../main/java/org/thingsboard/server/dao/alarm/AlarmDao.java | 2 +- .../server/dao/alarm/AlarmTypesCacheEvictEvent.java | 2 +- .../thingsboard/server/dao/alarm/AlarmTypesCaffeineCache.java | 2 +- .../org/thingsboard/server/dao/alarm/AlarmTypesRedisCache.java | 2 +- .../thingsboard/server/dao/alarm/BaseAlarmCommentService.java | 2 +- .../org/thingsboard/server/dao/alarm/BaseAlarmService.java | 2 +- .../java/org/thingsboard/server/dao/aspect/DbCallStats.java | 2 +- .../org/thingsboard/server/dao/aspect/DbCallStatsSnapshot.java | 2 +- .../org/thingsboard/server/dao/aspect/MethodCallStats.java | 2 +- .../thingsboard/server/dao/aspect/MethodCallStatsSnapshot.java | 2 +- .../org/thingsboard/server/dao/aspect/SqlDaoCallsAspect.java | 2 +- .../org/thingsboard/server/dao/asset/AssetCacheEvictEvent.java | 2 +- .../java/org/thingsboard/server/dao/asset/AssetCacheKey.java | 2 +- .../org/thingsboard/server/dao/asset/AssetCaffeineCache.java | 2 +- .../main/java/org/thingsboard/server/dao/asset/AssetDao.java | 2 +- .../org/thingsboard/server/dao/asset/AssetProfileCacheKey.java | 2 +- .../server/dao/asset/AssetProfileCaffeineCache.java | 2 +- .../java/org/thingsboard/server/dao/asset/AssetProfileDao.java | 2 +- .../thingsboard/server/dao/asset/AssetProfileEvictEvent.java | 2 +- .../thingsboard/server/dao/asset/AssetProfileRedisCache.java | 2 +- .../thingsboard/server/dao/asset/AssetProfileServiceImpl.java | 2 +- .../java/org/thingsboard/server/dao/asset/AssetRedisCache.java | 2 +- .../java/org/thingsboard/server/dao/asset/AssetTypeFilter.java | 2 +- .../org/thingsboard/server/dao/asset/BaseAssetService.java | 2 +- .../thingsboard/server/dao/attributes/AttributeCacheKey.java | 2 +- .../server/dao/attributes/AttributeCaffeineCache.java | 2 +- .../thingsboard/server/dao/attributes/AttributeRedisCache.java | 2 +- .../org/thingsboard/server/dao/attributes/AttributeUtils.java | 2 +- .../org/thingsboard/server/dao/attributes/AttributesDao.java | 2 +- .../server/dao/attributes/BaseAttributesService.java | 2 +- .../server/dao/attributes/CachedAttributesService.java | 2 +- .../java/org/thingsboard/server/dao/audit/AuditLogDao.java | 2 +- .../org/thingsboard/server/dao/audit/AuditLogLevelFilter.java | 2 +- .../org/thingsboard/server/dao/audit/AuditLogLevelMask.java | 2 +- .../thingsboard/server/dao/audit/AuditLogLevelProperties.java | 2 +- .../org/thingsboard/server/dao/audit/AuditLogServiceImpl.java | 2 +- .../thingsboard/server/dao/audit/DummyAuditLogServiceImpl.java | 2 +- .../org/thingsboard/server/dao/audit/sink/AuditLogSink.java | 2 +- .../thingsboard/server/dao/audit/sink/DummyAuditLogSink.java | 2 +- .../server/dao/audit/sink/ElasticsearchAuditLogSink.java | 2 +- .../org/thingsboard/server/dao/cache/CacheExecutorService.java | 2 +- .../thingsboard/server/dao/cf/BaseCalculatedFieldService.java | 2 +- .../java/org/thingsboard/server/dao/cf/CalculatedFieldDao.java | 2 +- .../org/thingsboard/server/dao/cf/CalculatedFieldLinkDao.java | 2 +- .../server/dao/component/BaseComponentDescriptorService.java | 2 +- .../server/dao/component/ComponentDescriptorDao.java | 2 +- .../server/dao/config/DedicatedEventsDataSource.java | 2 +- .../server/dao/config/DedicatedEventsJpaDaoConfig.java | 2 +- .../org/thingsboard/server/dao/config/DefaultDataSource.java | 2 +- .../server/dao/config/DefaultDedicatedJpaDaoConfig.java | 2 +- .../java/org/thingsboard/server/dao/config/JpaDaoConfig.java | 2 +- .../java/org/thingsboard/server/dao/config/SqlTsDaoConfig.java | 2 +- .../thingsboard/server/dao/config/SqlTsLatestDaoConfig.java | 2 +- .../org/thingsboard/server/dao/config/TimescaleDaoConfig.java | 2 +- .../server/dao/config/TimescaleTsLatestDaoConfig.java | 2 +- .../java/org/thingsboard/server/dao/customer/CustomerDao.java | 2 +- .../thingsboard/server/dao/customer/CustomerServiceImpl.java | 2 +- .../org/thingsboard/server/dao/dashboard/DashboardDao.java | 2 +- .../org/thingsboard/server/dao/dashboard/DashboardInfoDao.java | 2 +- .../thingsboard/server/dao/dashboard/DashboardServiceImpl.java | 2 +- .../server/dao/dashboard/DashboardTitleEvictEvent.java | 2 +- .../server/dao/dashboard/DashboardTitlesCaffeineCache.java | 2 +- .../server/dao/dashboard/DashboardTitlesRedisCache.java | 2 +- .../java/org/thingsboard/server/dao/device/ClaimDataInfo.java | 2 +- .../server/dao/device/DeviceConnectivityConfiguration.java | 2 +- .../thingsboard/server/dao/device/DeviceConnectivityInfo.java | 2 +- .../server/dao/device/DeviceConnectivityServiceImpl.java | 2 +- .../server/dao/device/DeviceCredentialsCaffeineCache.java | 2 +- .../thingsboard/server/dao/device/DeviceCredentialsDao.java | 2 +- .../server/dao/device/DeviceCredentialsEvictEvent.java | 2 +- .../server/dao/device/DeviceCredentialsRedisCache.java | 2 +- .../server/dao/device/DeviceCredentialsServiceImpl.java | 2 +- .../main/java/org/thingsboard/server/dao/device/DeviceDao.java | 2 +- .../thingsboard/server/dao/device/DeviceProfileCacheKey.java | 2 +- .../server/dao/device/DeviceProfileCaffeineCache.java | 2 +- .../org/thingsboard/server/dao/device/DeviceProfileDao.java | 2 +- .../thingsboard/server/dao/device/DeviceProfileEvictEvent.java | 2 +- .../thingsboard/server/dao/device/DeviceProfileRedisCache.java | 2 +- .../server/dao/device/DeviceProfileServiceImpl.java | 2 +- .../org/thingsboard/server/dao/device/DeviceServiceImpl.java | 2 +- .../thingsboard/server/dao/dictionary/KeyDictionaryDao.java | 2 +- .../main/java/org/thingsboard/server/dao/domain/DomainDao.java | 2 +- .../org/thingsboard/server/dao/domain/DomainServiceImpl.java | 2 +- .../org/thingsboard/server/dao/edge/BaseEdgeEventService.java | 2 +- .../thingsboard/server/dao/edge/BaseRelatedEdgesService.java | 2 +- .../server/dao/edge/DefaultEdgeSynchronizationManager.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/edge/EdgeDao.java | 2 +- .../java/org/thingsboard/server/dao/edge/EdgeEventDao.java | 2 +- .../java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java | 2 +- .../thingsboard/server/dao/edge/EdgeSessionCaffeineCache.java | 2 +- .../org/thingsboard/server/dao/edge/EdgeSessionRedisCache.java | 2 +- .../thingsboard/server/dao/edge/PostgresEdgeEventService.java | 2 +- .../server/dao/edge/stats/EdgeStatsCounterService.java | 2 +- .../org/thingsboard/server/dao/edge/stats/EdgeStatsKey.java | 2 +- .../org/thingsboard/server/dao/edge/stats/MsgCounters.java | 2 +- .../server/dao/entity/AbstractCachedEntityService.java | 2 +- .../thingsboard/server/dao/entity/AbstractCachedService.java | 2 +- .../thingsboard/server/dao/entity/AbstractEntityService.java | 2 +- .../thingsboard/server/dao/entity/BaseEntityCountService.java | 2 +- .../org/thingsboard/server/dao/entity/BaseEntityService.java | 2 +- .../server/dao/entity/CachedVersionedEntityService.java | 2 +- .../server/dao/entity/DefaultEntityServiceRegistry.java | 2 +- .../server/dao/entity/EntityCountCacheEvictEvent.java | 2 +- .../org/thingsboard/server/dao/entity/EntityCountCacheKey.java | 2 +- .../org/thingsboard/server/dao/entity/EntityDaoRegistry.java | 2 +- .../java/org/thingsboard/server/dao/entity/EntityQueryDao.java | 2 +- .../server/dao/entity/count/EntityCountCaffeineCache.java | 2 +- .../server/dao/entity/count/EntityCountRedisCache.java | 2 +- .../thingsboard/server/dao/entityview/EntityViewCacheKey.java | 2 +- .../server/dao/entityview/EntityViewCacheValue.java | 2 +- .../server/dao/entityview/EntityViewCaffeineCache.java | 2 +- .../org/thingsboard/server/dao/entityview/EntityViewDao.java | 2 +- .../server/dao/entityview/EntityViewEvictEvent.java | 2 +- .../server/dao/entityview/EntityViewRedisCache.java | 2 +- .../server/dao/entityview/EntityViewServiceImpl.java | 2 +- .../org/thingsboard/server/dao/event/BaseEventService.java | 2 +- .../main/java/org/thingsboard/server/dao/event/EventDao.java | 2 +- .../org/thingsboard/server/dao/eventsourcing/ActionCause.java | 2 +- .../server/dao/eventsourcing/ActionEntityEvent.java | 2 +- .../server/dao/eventsourcing/DeleteEntityEvent.java | 2 +- .../server/dao/eventsourcing/RelationActionEvent.java | 2 +- .../thingsboard/server/dao/eventsourcing/SaveEntityEvent.java | 2 +- .../thingsboard/server/dao/exception/BufferLimitException.java | 2 +- .../server/dao/exception/DataValidationException.java | 2 +- .../thingsboard/server/dao/exception/DatabaseException.java | 2 +- .../dao/exception/DeviceCredentialsValidationException.java | 2 +- .../server/dao/exception/EntitiesLimitException.java | 2 +- .../server/dao/exception/IncorrectParameterException.java | 2 +- .../org/thingsboard/server/dao/housekeeper/CleanUpService.java | 2 +- .../java/org/thingsboard/server/dao/job/DefaultJobService.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/job/JobDao.java | 2 +- .../org/thingsboard/server/dao/mobile/MobileAppBundleDao.java | 2 +- .../server/dao/mobile/MobileAppBundleServiceImpl.java | 2 +- .../java/org/thingsboard/server/dao/mobile/MobileAppDao.java | 2 +- .../thingsboard/server/dao/mobile/MobileAppServiceImpl.java | 2 +- .../thingsboard/server/dao/mobile/QrCodeSettingService.java | 2 +- .../server/dao/mobile/QrCodeSettingServiceImpl.java | 2 +- .../server/dao/mobile/QrCodeSettingsCaffeineCache.java | 2 +- .../org/thingsboard/server/dao/mobile/QrCodeSettingsDao.java | 2 +- .../server/dao/mobile/QrCodeSettingsEvictEvent.java | 2 +- .../server/dao/mobile/QrCodeSettingsRedisCache.java | 2 +- .../main/java/org/thingsboard/server/dao/model/BaseEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/BaseSqlEntity.java | 2 +- .../org/thingsboard/server/dao/model/BaseVersionedEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/ModelConstants.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/model/ToData.java | 2 +- .../server/dao/model/sql/AbstractAlarmCommentEntity.java | 2 +- .../thingsboard/server/dao/model/sql/AbstractAlarmEntity.java | 2 +- .../thingsboard/server/dao/model/sql/AbstractAssetEntity.java | 2 +- .../thingsboard/server/dao/model/sql/AbstractDeviceEntity.java | 2 +- .../thingsboard/server/dao/model/sql/AbstractEdgeEntity.java | 2 +- .../server/dao/model/sql/AbstractEntityViewEntity.java | 2 +- .../server/dao/model/sql/AbstractMobileAppBundleEntity.java | 2 +- .../thingsboard/server/dao/model/sql/AbstractTenantEntity.java | 2 +- .../thingsboard/server/dao/model/sql/AbstractTsKvEntity.java | 2 +- .../server/dao/model/sql/AbstractWidgetTypeEntity.java | 2 +- .../thingsboard/server/dao/model/sql/AdminSettingsEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/AiModelEntity.java | 2 +- .../thingsboard/server/dao/model/sql/AlarmCommentEntity.java | 2 +- .../server/dao/model/sql/AlarmCommentInfoEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/AlarmEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/AlarmInfoEntity.java | 2 +- .../thingsboard/server/dao/model/sql/ApiUsageStateEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/AssetEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/AssetInfoEntity.java | 2 +- .../thingsboard/server/dao/model/sql/AssetProfileEntity.java | 2 +- .../server/dao/model/sql/AttributeKvCompositeKey.java | 2 +- .../thingsboard/server/dao/model/sql/AttributeKvEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/AuditLogEntity.java | 2 +- .../server/dao/model/sql/CalculatedFieldDebugEventEntity.java | 2 +- .../server/dao/model/sql/CalculatedFieldEntity.java | 2 +- .../server/dao/model/sql/CalculatedFieldLinkEntity.java | 2 +- .../server/dao/model/sql/ComponentDescriptorEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/CustomerEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/DashboardEntity.java | 2 +- .../thingsboard/server/dao/model/sql/DashboardInfoEntity.java | 2 +- .../server/dao/model/sql/DeviceCredentialsEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/DeviceEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/DeviceInfoEntity.java | 2 +- .../thingsboard/server/dao/model/sql/DeviceProfileEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/DomainEntity.java | 2 +- .../server/dao/model/sql/DomainOauth2ClientCompositeKey.java | 2 +- .../server/dao/model/sql/DomainOauth2ClientEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/EdgeEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/EdgeEventEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/EdgeInfoEntity.java | 2 +- .../server/dao/model/sql/EntityAlarmCompositeKey.java | 2 +- .../thingsboard/server/dao/model/sql/EntityAlarmEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/EntityViewEntity.java | 2 +- .../thingsboard/server/dao/model/sql/EntityViewInfoEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/ErrorEventEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/EventEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/JobEntity.java | 2 +- .../thingsboard/server/dao/model/sql/LifecycleEventEntity.java | 2 +- .../server/dao/model/sql/MobileAppBundleEntity.java | 2 +- .../server/dao/model/sql/MobileAppBundleInfoEntity.java | 2 +- .../dao/model/sql/MobileAppBundleOauth2ClientEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/MobileAppEntity.java | 2 +- .../dao/model/sql/MobileAppOauth2ClientCompositeKey.java | 2 +- .../thingsboard/server/dao/model/sql/NotificationEntity.java | 2 +- .../server/dao/model/sql/NotificationRequestEntity.java | 2 +- .../server/dao/model/sql/NotificationRequestInfoEntity.java | 2 +- .../server/dao/model/sql/NotificationRuleEntity.java | 2 +- .../server/dao/model/sql/NotificationRuleInfoEntity.java | 2 +- .../server/dao/model/sql/NotificationTargetEntity.java | 2 +- .../server/dao/model/sql/NotificationTemplateEntity.java | 2 +- .../thingsboard/server/dao/model/sql/OAuth2ClientEntity.java | 2 +- .../server/dao/model/sql/OAuth2ClientInfoEntity.java | 2 +- .../dao/model/sql/OAuth2ClientRegistrationTemplateEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/OtaPackageEntity.java | 2 +- .../thingsboard/server/dao/model/sql/OtaPackageInfoEntity.java | 2 +- .../thingsboard/server/dao/model/sql/QrCodeSettingsEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/QueueEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/QueueStatsEntity.java | 2 +- .../thingsboard/server/dao/model/sql/RelationCompositeKey.java | 2 +- .../org/thingsboard/server/dao/model/sql/RelationEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/RpcEntity.java | 2 +- .../server/dao/model/sql/RuleChainDebugEventEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/RuleChainEntity.java | 2 +- .../server/dao/model/sql/RuleNodeDebugEventEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/RuleNodeEntity.java | 2 +- .../thingsboard/server/dao/model/sql/RuleNodeStateEntity.java | 2 +- .../server/dao/model/sql/StatisticsEventEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/TbResourceEntity.java | 2 +- .../thingsboard/server/dao/model/sql/TbResourceInfoEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/TenantEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/TenantInfoEntity.java | 2 +- .../thingsboard/server/dao/model/sql/TenantProfileEntity.java | 2 +- .../server/dao/model/sql/UserAuthSettingsEntity.java | 2 +- .../server/dao/model/sql/UserCredentialsEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/UserEntity.java | 2 +- .../thingsboard/server/dao/model/sql/UserSettingsEntity.java | 2 +- .../server/dao/model/sql/WidgetTypeDetailsEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java | 2 +- .../server/dao/model/sql/WidgetTypeIdFqnEntity.java | 2 +- .../thingsboard/server/dao/model/sql/WidgetTypeInfoEntity.java | 2 +- .../thingsboard/server/dao/model/sql/WidgetsBundleEntity.java | 2 +- .../server/dao/model/sql/WidgetsBundleWidgetCompositeKey.java | 2 +- .../server/dao/model/sql/WidgetsBundleWidgetEntity.java | 2 +- .../dao/model/sqlts/dictionary/KeyDictionaryCompositeKey.java | 2 +- .../server/dao/model/sqlts/dictionary/KeyDictionaryEntry.java | 2 +- .../server/dao/model/sqlts/latest/TsKvLatestCompositeKey.java | 2 +- .../server/dao/model/sqlts/latest/TsKvLatestEntity.java | 2 +- .../model/sqlts/timescale/ts/TimescaleTsKvCompositeKey.java | 2 +- .../dao/model/sqlts/timescale/ts/TimescaleTsKvEntity.java | 2 +- .../server/dao/model/sqlts/ts/TsKvCompositeKey.java | 2 +- .../org/thingsboard/server/dao/model/sqlts/ts/TsKvEntity.java | 2 +- .../server/dao/nosql/CassandraAbstractAsyncDao.java | 2 +- .../org/thingsboard/server/dao/nosql/CassandraAbstractDao.java | 2 +- .../server/dao/nosql/CassandraBufferedRateReadExecutor.java | 2 +- .../server/dao/nosql/CassandraBufferedRateWriteExecutor.java | 2 +- .../dao/notification/DefaultNotificationRequestService.java | 2 +- .../dao/notification/DefaultNotificationRuleService.java | 2 +- .../server/dao/notification/DefaultNotificationService.java | 2 +- .../dao/notification/DefaultNotificationSettingsService.java | 2 +- .../dao/notification/DefaultNotificationTargetService.java | 2 +- .../dao/notification/DefaultNotificationTemplateService.java | 2 +- .../server/dao/notification/DefaultNotifications.java | 2 +- .../thingsboard/server/dao/notification/NotificationDao.java | 2 +- .../server/dao/notification/NotificationRequestDao.java | 2 +- .../server/dao/notification/NotificationRuleDao.java | 2 +- .../server/dao/notification/NotificationTargetDao.java | 2 +- .../server/dao/notification/NotificationTemplateDao.java | 2 +- .../server/dao/oauth2/HybridClientRegistrationRepository.java | 2 +- .../org/thingsboard/server/dao/oauth2/OAuth2ClientDao.java | 2 +- .../server/dao/oauth2/OAuth2ClientRegistrationTemplateDao.java | 2 +- .../thingsboard/server/dao/oauth2/OAuth2ClientServiceImpl.java | 2 +- .../server/dao/oauth2/OAuth2ConfigTemplateServiceImpl.java | 2 +- .../org/thingsboard/server/dao/oauth2/OAuth2Configuration.java | 2 +- .../org/thingsboard/server/dao/oauth2/OAuth2ParamsDao.java | 2 +- .../java/org/thingsboard/server/dao/oauth2/OAuth2Utils.java | 2 +- .../org/thingsboard/server/dao/ota/BaseOtaPackageService.java | 2 +- .../thingsboard/server/dao/ota/OtaPackageCacheEvictEvent.java | 2 +- .../org/thingsboard/server/dao/ota/OtaPackageCacheKey.java | 2 +- .../thingsboard/server/dao/ota/OtaPackageCaffeineCache.java | 2 +- .../java/org/thingsboard/server/dao/ota/OtaPackageDao.java | 2 +- .../java/org/thingsboard/server/dao/ota/OtaPackageInfoDao.java | 2 +- .../org/thingsboard/server/dao/ota/OtaPackageRedisCache.java | 2 +- .../org/thingsboard/server/dao/queue/BaseQueueService.java | 2 +- .../thingsboard/server/dao/queue/BaseQueueStatsService.java | 2 +- .../main/java/org/thingsboard/server/dao/queue/QueueDao.java | 2 +- .../java/org/thingsboard/server/dao/queue/QueueStatsDao.java | 2 +- .../thingsboard/server/dao/relation/BaseRelationService.java | 2 +- .../thingsboard/server/dao/relation/EntityRelationEvent.java | 2 +- .../org/thingsboard/server/dao/relation/RelationCacheKey.java | 2 +- .../thingsboard/server/dao/relation/RelationCacheValue.java | 2 +- .../thingsboard/server/dao/relation/RelationCaffeineCache.java | 2 +- .../java/org/thingsboard/server/dao/relation/RelationDao.java | 2 +- .../thingsboard/server/dao/relation/RelationRedisCache.java | 2 +- .../org/thingsboard/server/dao/resource/BaseImageService.java | 2 +- .../thingsboard/server/dao/resource/BaseResourceService.java | 2 +- .../server/dao/resource/DefaultTbResourceDataCache.java | 2 +- .../org/thingsboard/server/dao/resource/ImageCacheKey.java | 2 +- .../org/thingsboard/server/dao/resource/TbResourceDao.java | 2 +- .../org/thingsboard/server/dao/resource/TbResourceInfoDao.java | 2 +- .../java/org/thingsboard/server/dao/rpc/BaseRpcService.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/rpc/RpcDao.java | 2 +- .../org/thingsboard/server/dao/rule/BaseRuleChainService.java | 2 +- .../thingsboard/server/dao/rule/BaseRuleNodeStateService.java | 2 +- .../java/org/thingsboard/server/dao/rule/RuleChainDao.java | 2 +- .../main/java/org/thingsboard/server/dao/rule/RuleNodeDao.java | 2 +- .../java/org/thingsboard/server/dao/rule/RuleNodeStateDao.java | 2 +- .../thingsboard/server/dao/service/ConstraintValidator.java | 2 +- .../java/org/thingsboard/server/dao/service/DataValidator.java | 2 +- .../thingsboard/server/dao/service/JsonSchemaValidator.java | 2 +- .../thingsboard/server/dao/service/NoNullCharValidator.java | 2 +- .../org/thingsboard/server/dao/service/NoXssValidator.java | 2 +- .../org/thingsboard/server/dao/service/PaginatedRemover.java | 2 +- .../org/thingsboard/server/dao/service/RateLimitValidator.java | 2 +- .../thingsboard/server/dao/service/StringLengthValidator.java | 2 +- .../thingsboard/server/dao/service/TimePaginatedRemover.java | 2 +- .../java/org/thingsboard/server/dao/service/Validator.java | 2 +- .../dao/service/validator/AbstractHasOtaPackageValidator.java | 2 +- .../dao/service/validator/AdminSettingsDataValidator.java | 2 +- .../server/dao/service/validator/AiModelDataValidator.java | 2 +- .../dao/service/validator/AlarmCommentDataValidator.java | 2 +- .../server/dao/service/validator/AlarmDataValidator.java | 2 +- .../server/dao/service/validator/ApiUsageDataValidator.java | 2 +- .../server/dao/service/validator/AssetDataValidator.java | 2 +- .../dao/service/validator/AssetProfileDataValidator.java | 2 +- .../server/dao/service/validator/AuditLogDataValidator.java | 2 +- .../dao/service/validator/BaseOtaPackageDataValidator.java | 2 +- .../dao/service/validator/CalculatedFieldDataValidator.java | 2 +- .../service/validator/CalculatedFieldLinkDataValidator.java | 2 +- .../validator/ClientRegistrationTemplateDataValidator.java | 2 +- .../service/validator/ComponentDescriptorDataValidator.java | 2 +- .../server/dao/service/validator/CustomerDataValidator.java | 2 +- .../server/dao/service/validator/DashboardDataValidator.java | 2 +- .../dao/service/validator/DeviceCredentialsDataValidator.java | 2 +- .../server/dao/service/validator/DeviceDataValidator.java | 2 +- .../dao/service/validator/DeviceProfileDataValidator.java | 2 +- .../server/dao/service/validator/DomainDataValidator.java | 2 +- .../server/dao/service/validator/EdgeDataValidator.java | 2 +- .../server/dao/service/validator/EdgeEventDataValidator.java | 2 +- .../server/dao/service/validator/EntityViewDataValidator.java | 2 +- .../server/dao/service/validator/EventDataValidator.java | 2 +- .../dao/service/validator/MobileAppBundleDataValidator.java | 2 +- .../server/dao/service/validator/MobileAppDataValidator.java | 2 +- .../dao/service/validator/Oauth2ClientDataValidator.java | 2 +- .../server/dao/service/validator/OtaPackageDataValidator.java | 2 +- .../dao/service/validator/OtaPackageInfoDataValidator.java | 2 +- .../dao/service/validator/QrCodeSettingsDataValidator.java | 2 +- .../server/dao/service/validator/QueueStatsDataValidator.java | 2 +- .../server/dao/service/validator/QueueValidator.java | 2 +- .../server/dao/service/validator/ResourceDataValidator.java | 2 +- .../server/dao/service/validator/RuleChainDataValidator.java | 2 +- .../server/dao/service/validator/TenantDataValidator.java | 2 +- .../dao/service/validator/TenantProfileDataValidator.java | 2 +- .../dao/service/validator/UserCredentialsDataValidator.java | 2 +- .../server/dao/service/validator/UserDataValidator.java | 2 +- .../server/dao/service/validator/WidgetTypeDataValidator.java | 2 +- .../dao/service/validator/WidgetsBundleDataValidator.java | 2 +- .../org/thingsboard/server/dao/settings/AdminSettingsDao.java | 2 +- .../server/dao/settings/AdminSettingsServiceImpl.java | 2 +- .../server/dao/settings/DefaultSecuritySettingsService.java | 2 +- .../server/dao/settings/SecuritySettingsService.java | 2 +- .../main/java/org/thingsboard/server/dao/sql/IdGenerator.java | 2 +- .../java/org/thingsboard/server/dao/sql/JpaAbstractDao.java | 2 +- .../server/dao/sql/JpaAbstractDaoListeningExecutorService.java | 2 +- .../org/thingsboard/server/dao/sql/JpaExecutorService.java | 2 +- .../thingsboard/server/dao/sql/JpaPartitionedAbstractDao.java | 2 +- .../dao/sql/NamedParameterJdbcTemplateConfiguration.java | 2 +- .../server/dao/sql/ScheduledLogExecutorComponent.java | 2 +- .../org/thingsboard/server/dao/sql/TbSqlBlockingQueue.java | 2 +- .../thingsboard/server/dao/sql/TbSqlBlockingQueueParams.java | 2 +- .../thingsboard/server/dao/sql/TbSqlBlockingQueueWrapper.java | 2 +- .../main/java/org/thingsboard/server/dao/sql/TbSqlQueue.java | 2 +- .../java/org/thingsboard/server/dao/sql/TbSqlQueueElement.java | 2 +- .../org/thingsboard/server/dao/sql/ai/AiModelRepository.java | 2 +- .../java/org/thingsboard/server/dao/sql/ai/JpaAiModelDao.java | 2 +- .../server/dao/sql/alarm/AlarmCommentRepository.java | 2 +- .../org/thingsboard/server/dao/sql/alarm/AlarmRepository.java | 2 +- .../server/dao/sql/alarm/EntityAlarmRepository.java | 2 +- .../thingsboard/server/dao/sql/alarm/JpaAlarmCommentDao.java | 2 +- .../java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java | 2 +- .../thingsboard/server/dao/sql/alarm/JpaEntityAlarmDao.java | 2 +- .../server/dao/sql/asset/AssetProfileRepository.java | 2 +- .../org/thingsboard/server/dao/sql/asset/AssetRepository.java | 2 +- .../java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java | 2 +- .../thingsboard/server/dao/sql/asset/JpaAssetProfileDao.java | 2 +- .../server/dao/sql/attributes/AttributeKvInsertRepository.java | 2 +- .../server/dao/sql/attributes/AttributeKvRepository.java | 2 +- .../thingsboard/server/dao/sql/attributes/JpaAttributeDao.java | 2 +- .../thingsboard/server/dao/sql/audit/AuditLogRepository.java | 2 +- .../server/dao/sql/audit/DedicatedJpaAuditLogDao.java | 2 +- .../org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java | 2 +- .../server/dao/sql/cf/CalculatedFieldLinkRepository.java | 2 +- .../server/dao/sql/cf/CalculatedFieldRepository.java | 2 +- .../dao/sql/cf/DefaultNativeCalculatedFieldRepository.java | 2 +- .../thingsboard/server/dao/sql/cf/JpaCalculatedFieldDao.java | 2 +- .../server/dao/sql/cf/JpaCalculatedFieldLinkDao.java | 2 +- .../server/dao/sql/cf/NativeCalculatedFieldRepository.java | 2 +- .../component/AbstractComponentDescriptorInsertRepository.java | 2 +- .../dao/sql/component/ComponentDescriptorInsertRepository.java | 2 +- .../dao/sql/component/ComponentDescriptorRepository.java | 2 +- .../dao/sql/component/JpaBaseComponentDescriptorDao.java | 2 +- .../sql/component/SqlComponentDescriptorInsertRepository.java | 2 +- .../server/dao/sql/customer/CustomerRepository.java | 2 +- .../thingsboard/server/dao/sql/customer/JpaCustomerDao.java | 2 +- .../server/dao/sql/dashboard/DashboardInfoRepository.java | 2 +- .../server/dao/sql/dashboard/DashboardRepository.java | 2 +- .../thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java | 2 +- .../server/dao/sql/dashboard/JpaDashboardInfoDao.java | 2 +- .../server/dao/sql/device/AbstractNativeRepository.java | 2 +- .../server/dao/sql/device/DefaultNativeAssetRepository.java | 2 +- .../server/dao/sql/device/DefaultNativeDeviceRepository.java | 2 +- .../server/dao/sql/device/DeviceCredentialsRepository.java | 2 +- .../server/dao/sql/device/DeviceProfileRepository.java | 2 +- .../thingsboard/server/dao/sql/device/DeviceRepository.java | 2 +- .../server/dao/sql/device/JpaDeviceCredentialsDao.java | 2 +- .../org/thingsboard/server/dao/sql/device/JpaDeviceDao.java | 2 +- .../thingsboard/server/dao/sql/device/JpaDeviceProfileDao.java | 2 +- .../server/dao/sql/device/NativeAssetRepository.java | 2 +- .../server/dao/sql/device/NativeDeviceRepository.java | 2 +- .../server/dao/sql/device/NativeProfileEntityRepository.java | 2 +- .../server/dao/sql/domain/DomainOauth2ClientRepository.java | 2 +- .../thingsboard/server/dao/sql/domain/DomainRepository.java | 2 +- .../org/thingsboard/server/dao/sql/domain/JpaDomainDao.java | 2 +- .../server/dao/sql/edge/EdgeEventInsertRepository.java | 2 +- .../thingsboard/server/dao/sql/edge/EdgeEventRepository.java | 2 +- .../org/thingsboard/server/dao/sql/edge/EdgeRepository.java | 2 +- .../thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java | 2 +- .../java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java | 2 +- .../server/dao/sql/entityview/EntityViewRepository.java | 2 +- .../server/dao/sql/entityview/JpaEntityViewDao.java | 2 +- .../dao/sql/event/CalculatedFieldDebugEventRepository.java | 2 +- .../server/dao/sql/event/DedicatedEventInsertRepository.java | 2 +- .../thingsboard/server/dao/sql/event/DedicatedJpaEventDao.java | 2 +- .../thingsboard/server/dao/sql/event/ErrorEventRepository.java | 2 +- .../server/dao/sql/event/EventInsertRepository.java | 2 +- .../server/dao/sql/event/EventPartitionConfiguration.java | 2 +- .../org/thingsboard/server/dao/sql/event/EventRepository.java | 2 +- .../org/thingsboard/server/dao/sql/event/JpaBaseEventDao.java | 2 +- .../server/dao/sql/event/LifecycleEventRepository.java | 2 +- .../server/dao/sql/event/RuleChainDebugEventRepository.java | 2 +- .../server/dao/sql/event/RuleNodeDebugEventRepository.java | 2 +- .../server/dao/sql/event/StatisticsEventRepository.java | 2 +- .../java/org/thingsboard/server/dao/sql/job/JobRepository.java | 2 +- .../java/org/thingsboard/server/dao/sql/job/JpaJobDao.java | 2 +- .../server/dao/sql/mobile/JpaMobileAppBundleDao.java | 2 +- .../org/thingsboard/server/dao/sql/mobile/JpaMobileAppDao.java | 2 +- .../server/dao/sql/mobile/JpaQrCodeSettingsDao.java | 2 +- .../dao/sql/mobile/MobileAppBundleOauth2ClientRepository.java | 2 +- .../server/dao/sql/mobile/MobileAppBundleRepository.java | 2 +- .../thingsboard/server/dao/sql/mobile/MobileAppRepository.java | 2 +- .../server/dao/sql/mobile/QrCodeSettingsRepository.java | 2 +- .../server/dao/sql/notification/JpaNotificationDao.java | 2 +- .../server/dao/sql/notification/JpaNotificationRequestDao.java | 2 +- .../server/dao/sql/notification/JpaNotificationRuleDao.java | 2 +- .../server/dao/sql/notification/JpaNotificationTargetDao.java | 2 +- .../dao/sql/notification/JpaNotificationTemplateDao.java | 2 +- .../server/dao/sql/notification/NotificationRepository.java | 2 +- .../dao/sql/notification/NotificationRequestRepository.java | 2 +- .../dao/sql/notification/NotificationRuleRepository.java | 2 +- .../dao/sql/notification/NotificationTargetRepository.java | 2 +- .../dao/sql/notification/NotificationTemplateRepository.java | 2 +- .../thingsboard/server/dao/sql/oauth2/JpaOAuth2ClientDao.java | 2 +- .../dao/sql/oauth2/JpaOAuth2ClientRegistrationTemplateDao.java | 2 +- .../sql/oauth2/OAuth2ClientRegistrationTemplateRepository.java | 2 +- .../server/dao/sql/oauth2/OAuth2ClientRepository.java | 2 +- .../org/thingsboard/server/dao/sql/ota/JpaOtaPackageDao.java | 2 +- .../thingsboard/server/dao/sql/ota/JpaOtaPackageInfoDao.java | 2 +- .../server/dao/sql/ota/OtaPackageInfoRepository.java | 2 +- .../thingsboard/server/dao/sql/ota/OtaPackageRepository.java | 2 +- .../org/thingsboard/server/dao/sql/query/AlarmDataAdapter.java | 2 +- .../thingsboard/server/dao/sql/query/AlarmQueryRepository.java | 2 +- .../server/dao/sql/query/DefaultAlarmQueryRepository.java | 2 +- .../server/dao/sql/query/DefaultEntityQueryRepository.java | 2 +- .../server/dao/sql/query/DefaultQueryLogComponent.java | 2 +- .../thingsboard/server/dao/sql/query/DummyEdqsApiService.java | 2 +- .../org/thingsboard/server/dao/sql/query/DummyEdqsService.java | 2 +- .../thingsboard/server/dao/sql/query/EntityDataAdapter.java | 2 +- .../org/thingsboard/server/dao/sql/query/EntityKeyMapping.java | 2 +- .../server/dao/sql/query/EntityQueryRepository.java | 2 +- .../thingsboard/server/dao/sql/query/JpaEntityQueryDao.java | 2 +- .../thingsboard/server/dao/sql/query/QueryLogComponent.java | 2 +- .../org/thingsboard/server/dao/sql/query/SqlQueryContext.java | 2 +- .../java/org/thingsboard/server/dao/sql/queue/JpaQueueDao.java | 2 +- .../org/thingsboard/server/dao/sql/queue/JpaQueueStatsDao.java | 2 +- .../org/thingsboard/server/dao/sql/queue/QueueRepository.java | 2 +- .../thingsboard/server/dao/sql/queue/QueueStatsRepository.java | 2 +- .../thingsboard/server/dao/sql/relation/JpaRelationDao.java | 2 +- .../dao/sql/relation/JpaRelationQueryExecutorService.java | 2 +- .../server/dao/sql/relation/RelationInsertRepository.java | 2 +- .../server/dao/sql/relation/RelationRepository.java | 2 +- .../server/dao/sql/relation/SqlRelationInsertRepository.java | 2 +- .../thingsboard/server/dao/sql/resource/JpaTbResourceDao.java | 2 +- .../server/dao/sql/resource/JpaTbResourceInfoDao.java | 2 +- .../server/dao/sql/resource/TbResourceInfoRepository.java | 2 +- .../server/dao/sql/resource/TbResourceRepository.java | 2 +- .../java/org/thingsboard/server/dao/sql/rpc/JpaRpcDao.java | 2 +- .../java/org/thingsboard/server/dao/sql/rpc/RpcRepository.java | 2 +- .../org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java | 2 +- .../org/thingsboard/server/dao/sql/rule/JpaRuleNodeDao.java | 2 +- .../thingsboard/server/dao/sql/rule/JpaRuleNodeStateDao.java | 2 +- .../thingsboard/server/dao/sql/rule/RuleChainRepository.java | 2 +- .../thingsboard/server/dao/sql/rule/RuleNodeRepository.java | 2 +- .../server/dao/sql/rule/RuleNodeStateRepository.java | 2 +- .../server/dao/sql/settings/AdminSettingsRepository.java | 2 +- .../server/dao/sql/settings/JpaAdminSettingsDao.java | 2 +- .../org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java | 2 +- .../thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java | 2 +- .../server/dao/sql/tenant/TenantProfileRepository.java | 2 +- .../thingsboard/server/dao/sql/tenant/TenantRepository.java | 2 +- .../server/dao/sql/usagerecord/ApiUsageStateRepository.java | 2 +- .../server/dao/sql/usagerecord/JpaApiUsageStateDao.java | 2 +- .../server/dao/sql/user/JpaUserAuthSettingsDao.java | 2 +- .../thingsboard/server/dao/sql/user/JpaUserCredentialsDao.java | 2 +- .../java/org/thingsboard/server/dao/sql/user/JpaUserDao.java | 2 +- .../thingsboard/server/dao/sql/user/JpaUserSettingsDao.java | 2 +- .../server/dao/sql/user/UserAuthSettingsRepository.java | 2 +- .../server/dao/sql/user/UserCredentialsRepository.java | 2 +- .../org/thingsboard/server/dao/sql/user/UserRepository.java | 2 +- .../server/dao/sql/user/UserSettingsRepository.java | 2 +- .../thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java | 2 +- .../thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java | 2 +- .../server/dao/sql/widget/WidgetTypeInfoRepository.java | 2 +- .../server/dao/sql/widget/WidgetTypeRepository.java | 2 +- .../server/dao/sql/widget/WidgetsBundleRepository.java | 2 +- .../server/dao/sql/widget/WidgetsBundleWidgetRepository.java | 2 +- .../dao/sqlts/AbstractChunkedAggregationTimeseriesDao.java | 2 +- .../thingsboard/server/dao/sqlts/AbstractSqlTimeseriesDao.java | 2 +- .../thingsboard/server/dao/sqlts/AggregationTimeseriesDao.java | 2 +- .../server/dao/sqlts/BaseAbstractSqlTimeseriesDao.java | 2 +- .../server/dao/sqlts/CachedRedisSqlTimeseriesLatestDao.java | 2 +- .../java/org/thingsboard/server/dao/sqlts/EntityContainer.java | 2 +- .../thingsboard/server/dao/sqlts/SqlTimeseriesLatestDao.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/sqlts/TsKey.java | 2 +- .../server/dao/sqlts/dictionary/JpaKeyDictionaryDao.java | 2 +- .../server/dao/sqlts/dictionary/KeyDictionaryRepository.java | 2 +- .../server/dao/sqlts/insert/AbstractInsertRepository.java | 2 +- .../server/dao/sqlts/insert/InsertTsRepository.java | 2 +- .../dao/sqlts/insert/latest/InsertLatestTsRepository.java | 2 +- .../sqlts/insert/latest/sql/SqlLatestInsertTsRepository.java | 2 +- .../insert/sql/DedicatedEventsSqlPartitioningRepository.java | 2 +- .../server/dao/sqlts/insert/sql/SqlInsertTsRepository.java | 2 +- .../server/dao/sqlts/insert/sql/SqlPartitioningRepository.java | 2 +- .../sqlts/insert/timescale/TimescaleInsertTsRepository.java | 2 +- .../server/dao/sqlts/latest/SearchTsKvLatestRepository.java | 2 +- .../server/dao/sqlts/latest/TsKvLatestRepository.java | 2 +- .../thingsboard/server/dao/sqlts/sql/JpaSqlTimeseriesDao.java | 2 +- .../server/dao/sqlts/timescale/AggregationRepository.java | 2 +- .../server/dao/sqlts/timescale/TimescaleTimeseriesDao.java | 2 +- .../server/dao/sqlts/timescale/TsKvTimescaleRepository.java | 2 +- .../org/thingsboard/server/dao/sqlts/ts/TsKvRepository.java | 2 +- .../server/dao/tenant/DefaultTbTenantProfileCache.java | 2 +- .../org/thingsboard/server/dao/tenant/TenantCaffeineCache.java | 2 +- .../main/java/org/thingsboard/server/dao/tenant/TenantDao.java | 2 +- .../org/thingsboard/server/dao/tenant/TenantEvictEvent.java | 2 +- .../server/dao/tenant/TenantExistsCaffeineCache.java | 2 +- .../thingsboard/server/dao/tenant/TenantExistsRedisCache.java | 2 +- .../thingsboard/server/dao/tenant/TenantProfileCacheKey.java | 2 +- .../server/dao/tenant/TenantProfileCaffeineCache.java | 2 +- .../org/thingsboard/server/dao/tenant/TenantProfileDao.java | 2 +- .../thingsboard/server/dao/tenant/TenantProfileEvictEvent.java | 2 +- .../thingsboard/server/dao/tenant/TenantProfileRedisCache.java | 2 +- .../server/dao/tenant/TenantProfileServiceImpl.java | 2 +- .../org/thingsboard/server/dao/tenant/TenantRedisCache.java | 2 +- .../org/thingsboard/server/dao/tenant/TenantServiceImpl.java | 2 +- .../dao/timeseries/AbstractCassandraBaseTimeseriesDao.java | 2 +- .../server/dao/timeseries/AggregatePartitionsFunction.java | 2 +- .../server/dao/timeseries/BaseTimeseriesService.java | 2 +- .../server/dao/timeseries/CassandraBaseTimeseriesDao.java | 2 +- .../dao/timeseries/CassandraBaseTimeseriesLatestDao.java | 2 +- .../server/dao/timeseries/CassandraPartitionCacheKey.java | 2 +- .../server/dao/timeseries/CassandraTsPartitionsCache.java | 2 +- .../server/dao/timeseries/NoSqlTsPartitionDate.java | 2 +- .../org/thingsboard/server/dao/timeseries/QueryCursor.java | 2 +- .../server/dao/timeseries/SimpleListenableFuture.java | 2 +- .../org/thingsboard/server/dao/timeseries/SqlPartition.java | 2 +- .../thingsboard/server/dao/timeseries/SqlTsPartitionDate.java | 2 +- .../org/thingsboard/server/dao/timeseries/TimeseriesDao.java | 2 +- .../thingsboard/server/dao/timeseries/TimeseriesLatestDao.java | 2 +- .../server/dao/timeseries/TsInsertExecutorType.java | 2 +- .../org/thingsboard/server/dao/timeseries/TsKvQueryCursor.java | 2 +- .../thingsboard/server/dao/timeseries/TsLatestCacheKey.java | 2 +- .../thingsboard/server/dao/timeseries/TsLatestRedisCache.java | 2 +- .../server/dao/trendz/DefaultTrendzSettingsService.java | 2 +- .../thingsboard/server/dao/usage/BasicUsageInfoService.java | 2 +- .../thingsboard/server/dao/usagerecord/ApiUsageStateDao.java | 2 +- .../server/dao/usagerecord/ApiUsageStateServiceImpl.java | 2 +- .../server/dao/usagerecord/DefaultApiLimitService.java | 2 +- .../org/thingsboard/server/dao/user/UserAuthSettingsDao.java | 2 +- .../org/thingsboard/server/dao/user/UserCredentialsDao.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/user/UserDao.java | 2 +- .../java/org/thingsboard/server/dao/user/UserServiceImpl.java | 2 +- .../thingsboard/server/dao/user/UserSettingsCaffeineCache.java | 2 +- .../java/org/thingsboard/server/dao/user/UserSettingsDao.java | 2 +- .../thingsboard/server/dao/user/UserSettingsEvictEvent.java | 2 +- .../thingsboard/server/dao/user/UserSettingsRedisCache.java | 2 +- .../thingsboard/server/dao/user/UserSettingsServiceImpl.java | 2 +- .../server/dao/util/AbstractBufferedRateExecutor.java | 2 +- .../java/org/thingsboard/server/dao/util/AsyncRateLimiter.java | 2 +- .../java/org/thingsboard/server/dao/util/AsyncTaskContext.java | 2 +- .../org/thingsboard/server/dao/util/BufferedRateExecutor.java | 2 +- .../thingsboard/server/dao/util/BufferedRateExecutorStats.java | 2 +- .../thingsboard/server/dao/util/BufferedRateExecutorType.java | 2 +- .../thingsboard/server/dao/util/DeviceConnectivityUtil.java | 2 +- .../main/java/org/thingsboard/server/dao/util/ImageUtils.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/util/KvUtils.java | 2 +- .../main/java/org/thingsboard/server/dao/util/TimeUtils.java | 2 +- .../org/thingsboard/server/dao/util/mapping/JsonConverter.java | 2 +- .../java/org/thingsboard/server/dao/widget/WidgetTypeDao.java | 2 +- .../thingsboard/server/dao/widget/WidgetTypeServiceImpl.java | 2 +- .../org/thingsboard/server/dao/widget/WidgetsBundleDao.java | 2 +- .../server/dao/widget/WidgetsBundleServiceImpl.java | 2 +- dao/src/main/resources/cassandra/schema-keyspace.cql | 2 +- dao/src/main/resources/cassandra/schema-ts-latest.cql | 2 +- dao/src/main/resources/cassandra/schema-ts.cql | 2 +- dao/src/main/resources/sql/schema-entities-idx-psql-addon.sql | 2 +- dao/src/main/resources/sql/schema-entities-idx.sql | 2 +- dao/src/main/resources/sql/schema-entities.sql | 2 +- dao/src/main/resources/sql/schema-functions.sql | 2 +- dao/src/main/resources/sql/schema-timescale.sql | 2 +- dao/src/main/resources/sql/schema-ts-latest-psql.sql | 2 +- dao/src/main/resources/sql/schema-ts-psql.sql | 2 +- dao/src/main/resources/sql/schema-views.sql | 2 +- dao/src/main/resources/xss-policy.xml | 2 +- .../org/thingsboard/server/dao/AbstractDaoServiceTest.java | 2 +- .../java/org/thingsboard/server/dao/AbstractJpaDaoTest.java | 2 +- .../org/thingsboard/server/dao/AbstractNoSqlContainer.java | 2 +- .../thingsboard/server/dao/AbstractRedisClusterContainer.java | 2 +- .../org/thingsboard/server/dao/AbstractRedisContainer.java | 2 +- .../org/thingsboard/server/dao/NoSqlDaoServiceTestSuite.java | 2 +- .../java/org/thingsboard/server/dao/PostgreSqlInitializer.java | 2 +- .../org/thingsboard/server/dao/RedisClusterSqlTestSuite.java | 2 +- .../test/java/org/thingsboard/server/dao/RedisJUnit5Test.java | 2 +- .../java/org/thingsboard/server/dao/RedisSqlTestSuite.java | 2 +- .../thingsboard/server/dao/TimescaleDaoServiceTestSuite.java | 2 +- .../org/thingsboard/server/dao/TimescaleSqlInitializer.java | 2 +- .../thingsboard/server/dao/audit/AuditLogServiceImplTest.java | 2 +- .../server/dao/cache/RedisTbTransactionalCacheTest.java | 2 +- .../dao/component/BaseComponentDescriptorServiceTest.java | 2 +- .../server/dao/eventsourcing/DeleteEntityEventTest.java | 2 +- .../server/dao/nosql/CassandraPartitionsCacheTest.java | 2 +- .../thingsboard/server/dao/service/AbstractServiceTest.java | 2 +- .../server/dao/service/AdminSettingsServiceTest.java | 2 +- .../server/dao/service/AlarmCommentServiceTest.java | 2 +- .../org/thingsboard/server/dao/service/AlarmServiceTest.java | 2 +- .../server/dao/service/ApiUsageStateServiceTest.java | 2 +- .../server/dao/service/AssetProfileServiceTest.java | 2 +- .../org/thingsboard/server/dao/service/AssetServiceTest.java | 2 +- .../server/dao/service/CalculatedFieldServiceTest.java | 2 +- .../server/dao/service/ConstraintValidatorTest.java | 2 +- .../thingsboard/server/dao/service/CustomerServiceTest.java | 2 +- .../java/org/thingsboard/server/dao/service/DaoNoSqlTest.java | 2 +- .../java/org/thingsboard/server/dao/service/DaoSqlTest.java | 2 +- .../org/thingsboard/server/dao/service/DaoTimescaleTest.java | 2 +- .../thingsboard/server/dao/service/DashboardServiceTest.java | 2 +- .../org/thingsboard/server/dao/service/DataValidatorTest.java | 2 +- .../server/dao/service/DeviceCredentialsCacheTest.java | 2 +- .../server/dao/service/DeviceCredentialsServiceTest.java | 2 +- .../server/dao/service/DeviceProfileServiceTest.java | 2 +- .../org/thingsboard/server/dao/service/DeviceServiceTest.java | 2 +- .../org/thingsboard/server/dao/service/DomainServiceTest.java | 2 +- .../thingsboard/server/dao/service/EdgeEventServiceTest.java | 2 +- .../org/thingsboard/server/dao/service/EdgeServiceTest.java | 2 +- .../thingsboard/server/dao/service/EntityDaoRegistryTest.java | 2 +- .../server/dao/service/EntityServiceRegistryTest.java | 2 +- .../thingsboard/server/dao/service/MobileAppServiceTest.java | 2 +- .../org/thingsboard/server/dao/service/NoXssValidatorTest.java | 2 +- .../server/dao/service/OAuth2ClientServiceTest.java | 2 +- .../server/dao/service/OAuth2ConfigTemplateServiceTest.java | 2 +- .../thingsboard/server/dao/service/OtaPackageServiceTest.java | 2 +- .../org/thingsboard/server/dao/service/QueueServiceTest.java | 2 +- .../thingsboard/server/dao/service/QueueStatsServiceTest.java | 2 +- .../org/thingsboard/server/dao/service/RelationCacheTest.java | 2 +- .../thingsboard/server/dao/service/RelationServiceTest.java | 2 +- .../thingsboard/server/dao/service/RuleChainServiceTest.java | 2 +- .../server/dao/service/TbCacheSerializationTest.java | 2 +- .../server/dao/service/TenantProfileServiceTest.java | 2 +- .../org/thingsboard/server/dao/service/TenantServiceTest.java | 2 +- .../org/thingsboard/server/dao/service/UserServiceTest.java | 2 +- .../java/org/thingsboard/server/dao/service/ValidatorTest.java | 2 +- .../thingsboard/server/dao/service/WidgetTypeServiceTest.java | 2 +- .../server/dao/service/WidgetsBundleServiceTest.java | 2 +- .../dao/service/attributes/BaseAttributesServiceTest.java | 2 +- .../service/attributes/sql/AttributeCacheServiceSqlTest.java | 2 +- .../dao/service/attributes/sql/AttributesServiceSqlTest.java | 2 +- .../server/dao/service/event/BaseEventServiceTest.java | 2 +- .../server/dao/service/event/sql/EventServiceSqlTest.java | 2 +- .../sql/EventServiceSqlTest_DedicatedEventsDataSource.java | 2 +- .../server/dao/service/install/sql/EntitiesSchemaSqlTest.java | 2 +- .../dao/service/timeseries/BaseTimeseriesServiceTest.java | 2 +- .../nosql/TimeseriesServiceNoSqlSetNullEnabledTest.java | 2 +- .../service/timeseries/nosql/TimeseriesServiceNoSqlTest.java | 2 +- .../timeseries/nosql/TimeseriesServiceTimescaleTest.java | 2 +- .../timeseries/sql/LatestTimeseriesPerformanceTest.java | 2 +- .../dao/service/timeseries/sql/TimeseriesServiceSqlTest.java | 2 +- .../dao/service/validator/AdminSettingsDataValidatorTest.java | 2 +- .../server/dao/service/validator/AlarmDataValidatorTest.java | 2 +- .../server/dao/service/validator/AssetDataValidatorTest.java | 2 +- .../dao/service/validator/AssetProfileDataValidatorTest.java | 2 +- .../dao/service/validator/BaseOtaPackageDataValidatorTest.java | 2 +- .../service/validator/CalculatedFieldDataValidatorTest.java | 2 +- .../validator/CalculatedFieldLinkDataValidatorTest.java | 2 +- .../validator/ComponentDescriptorDataValidatorTest.java | 2 +- .../dao/service/validator/CustomerDataValidatorTest.java | 2 +- .../dao/service/validator/DashboardDataValidatorTest.java | 2 +- .../server/dao/service/validator/DeviceDataValidatorTest.java | 2 +- .../dao/service/validator/DeviceProfileDataValidatorTest.java | 2 +- .../server/dao/service/validator/EdgeDataValidatorTest.java | 2 +- .../dao/service/validator/EntityViewDataValidatorTest.java | 2 +- .../dao/service/validator/ResourceDataValidatorTest.java | 2 +- .../dao/service/validator/RuleChainDataValidatorTest.java | 2 +- .../server/dao/service/validator/TenantDataValidatorTest.java | 2 +- .../dao/service/validator/TenantProfileDataValidatorTest.java | 2 +- .../dao/service/validator/WidgetTypeDataValidatorTest.java | 2 +- .../dao/service/validator/WidgetsBundleDataValidatorTest.java | 2 +- .../java/org/thingsboard/server/dao/sql/JdbcTemplateTest.java | 2 +- .../server/dao/sql/alarm/JpaAlarmCommentDaoTest.java | 2 +- .../org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java | 2 +- .../org/thingsboard/server/dao/sql/asset/JpaAssetDaoTest.java | 2 +- .../thingsboard/server/dao/sql/audit/JpaAuditLogDaoTest.java | 2 +- .../dao/sql/component/JpaBaseComponentDescriptorDaoTest.java | 2 +- .../server/dao/sql/customer/JpaCustomerDaoTest.java | 2 +- .../server/dao/sql/dashboard/JpaDashboardInfoDaoTest.java | 2 +- .../server/dao/sql/device/JpaDeviceCredentialsDaoTest.java | 2 +- .../thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java | 2 +- .../thingsboard/server/dao/sql/event/JpaBaseEventDaoTest.java | 2 +- .../server/dao/sql/query/DefaultEntityQueryRepositoryTest.java | 2 +- .../server/dao/sql/query/DefaultQueryLogComponentTest.java | 2 +- .../server/dao/sql/query/EntityDataAdapterTest.java | 2 +- .../thingsboard/server/dao/sql/query/EntityKeyMappingTest.java | 2 +- .../java/org/thingsboard/server/dao/sql/rpc/JpaRpcDaoTest.java | 2 +- .../thingsboard/server/dao/sql/rule/JpaRuleNodeDaoTest.java | 2 +- .../thingsboard/server/dao/sql/tenant/JpaTenantDaoTest.java | 2 +- .../server/dao/sql/user/JpaUserCredentialsDaoTest.java | 2 +- .../org/thingsboard/server/dao/sql/user/JpaUserDaoTest.java | 2 +- .../server/dao/sql/user/JpaUserSettingsDaoTest.java | 2 +- .../server/dao/sql/widget/JpaWidgetTypeDaoTest.java | 2 +- .../server/dao/sql/widget/JpaWidgetsBundleDaoTest.java | 2 +- .../dao/sqlts/AbstractChunkedAggregationTimeseriesDaoTest.java | 2 +- .../server/dao/sqlts/SqlTimeseriesLatestDaoTest.java | 2 +- .../server/dao/sqlts/dictionary/KeyDictionaryDaoTest.java | 2 +- ...andraBaseTimeseriesDaoPartitioningDaysAlwaysExistsTest.java | 2 +- ...ndraBaseTimeseriesDaoPartitioningHoursAlwaysExistsTest.java | 2 +- ...aseTimeseriesDaoPartitioningIndefiniteAlwaysExistsTest.java | 2 +- ...raBaseTimeseriesDaoPartitioningMinutesAlwaysExistsTest.java | 2 +- ...draBaseTimeseriesDaoPartitioningMonthsAlwaysExistsTest.java | 2 +- ...ndraBaseTimeseriesDaoPartitioningYearsAlwaysExistsTest.java | 2 +- .../server/dao/timeseries/NoSqlTsPartitionDateTest.java | 2 +- .../server/dao/util/DeviceConnectivityUtilTest.java | 2 +- .../java/org/thingsboard/server/dao/util/TimeUtilsTest.java | 2 +- docker/compose-utils.sh | 2 +- docker/docker-check-log-folders.sh | 2 +- docker/docker-compose.cassandra.volumes.yml | 2 +- docker/docker-compose.confluent.yml | 2 +- docker/docker-compose.edqs.volumes.yml | 2 +- docker/docker-compose.edqs.yml | 2 +- docker/docker-compose.hybrid.yml | 2 +- docker/docker-compose.kafka.yml | 2 +- docker/docker-compose.postgres.volumes.yml | 2 +- docker/docker-compose.postgres.yml | 2 +- docker/docker-compose.prometheus-grafana.yml | 2 +- docker/docker-compose.valkey-cluster.volumes.yml | 2 +- docker/docker-compose.valkey-cluster.yml | 2 +- docker/docker-compose.valkey-sentinel.volumes.yml | 2 +- docker/docker-compose.valkey-sentinel.yml | 2 +- docker/docker-compose.valkey.volumes.yml | 2 +- docker/docker-compose.valkey.yml | 2 +- docker/docker-compose.volumes.yml | 2 +- docker/docker-compose.yml | 2 +- docker/docker-create-log-folders.sh | 2 +- docker/docker-install-tb.sh | 2 +- docker/docker-remove-services.sh | 2 +- docker/docker-start-services.sh | 2 +- docker/docker-stop-services.sh | 2 +- docker/docker-update-service.sh | 2 +- docker/docker-upgrade-tb.sh | 2 +- .../monitoring/grafana/provisioning/dashboards/dashboard.yml | 2 +- .../monitoring/grafana/provisioning/datasources/datasource.yml | 2 +- docker/monitoring/prometheus/prometheus.yml | 2 +- docker/tb-edqs/conf/logback.xml | 2 +- docker/tb-edqs/conf/tb-edqs.conf | 2 +- docker/tb-transports/coap/conf/logback.xml | 2 +- docker/tb-transports/coap/conf/tb-coap-transport.conf | 2 +- docker/tb-transports/http/conf/logback.xml | 2 +- docker/tb-transports/http/conf/tb-http-transport.conf | 2 +- docker/tb-transports/lwm2m/conf/logback.xml | 2 +- docker/tb-transports/lwm2m/conf/tb-lwm2m-transport.conf | 2 +- docker/tb-transports/mqtt/conf/logback.xml | 2 +- docker/tb-transports/mqtt/conf/tb-mqtt-transport.conf | 2 +- docker/tb-transports/snmp/conf/logback.xml | 2 +- docker/tb-transports/snmp/conf/tb-snmp-transport.conf | 2 +- docker/tb-vc-executor/conf/logback.xml | 2 +- docker/tb-vc-executor/conf/tb-vc-executor.conf | 2 +- edqs/pom.xml | 2 +- edqs/src/main/conf/logback.xml | 2 +- edqs/src/main/conf/tb-edqs.conf | 2 +- .../main/java/org/thingsboard/server/edqs/EdqsController.java | 2 +- .../thingsboard/server/edqs/ThingsboardEdqsApplication.java | 2 +- edqs/src/main/resources/edqs.yml | 2 +- edqs/src/main/resources/logback.xml | 2 +- .../java/org/thingsboard/server/edqs/repo/AbstractEDQTest.java | 2 +- .../thingsboard/server/edqs/repo/ApiUsageStateFilterTest.java | 2 +- .../server/edqs/repo/AssetSearchQueryFilterTest.java | 2 +- .../org/thingsboard/server/edqs/repo/AssetTypeFilterTest.java | 2 +- .../server/edqs/repo/DeviceSearchQueryFilterTest.java | 2 +- .../org/thingsboard/server/edqs/repo/DeviceTypeFilterTest.java | 2 +- .../server/edqs/repo/EdgeSearchQueryFilterTest.java | 2 +- .../org/thingsboard/server/edqs/repo/EdgeTypeFilterTest.java | 2 +- .../org/thingsboard/server/edqs/repo/EntityListFilterTest.java | 2 +- .../org/thingsboard/server/edqs/repo/EntityNameFilterTest.java | 2 +- .../org/thingsboard/server/edqs/repo/EntityTypeFilterTest.java | 2 +- .../server/edqs/repo/EntityViewSearchQueryFilterTest.java | 2 +- .../thingsboard/server/edqs/repo/EntityViewTypeFilterTest.java | 2 +- .../thingsboard/server/edqs/repo/RelationsQueryFilterTest.java | 2 +- .../org/thingsboard/server/edqs/repo/RepositoryUtilsTest.java | 2 +- .../thingsboard/server/edqs/repo/SingleEntityFilterTest.java | 2 +- license-header-template.txt | 2 +- monitoring/pom.xml | 2 +- monitoring/src/main/conf/logback.xml | 2 +- monitoring/src/main/conf/tb-monitoring.conf | 2 +- .../monitoring/ThingsboardMonitoringApplication.java | 2 +- .../java/org/thingsboard/monitoring/client/Lwm2mClient.java | 2 +- .../main/java/org/thingsboard/monitoring/client/TbClient.java | 2 +- .../main/java/org/thingsboard/monitoring/client/WsClient.java | 2 +- .../org/thingsboard/monitoring/client/WsClientFactory.java | 2 +- .../org/thingsboard/monitoring/config/MonitoringConfig.java | 2 +- .../org/thingsboard/monitoring/config/MonitoringTarget.java | 2 +- .../config/transport/CoapTransportMonitoringConfig.java | 2 +- .../thingsboard/monitoring/config/transport/DeviceConfig.java | 2 +- .../config/transport/HttpTransportMonitoringConfig.java | 2 +- .../config/transport/Lwm2mTransportMonitoringConfig.java | 2 +- .../config/transport/MqttTransportMonitoringConfig.java | 2 +- .../thingsboard/monitoring/config/transport/TransportInfo.java | 2 +- .../monitoring/config/transport/TransportMonitoringConfig.java | 2 +- .../monitoring/config/transport/TransportMonitoringTarget.java | 2 +- .../thingsboard/monitoring/config/transport/TransportType.java | 2 +- .../main/java/org/thingsboard/monitoring/data/Latencies.java | 2 +- .../src/main/java/org/thingsboard/monitoring/data/Latency.java | 2 +- .../org/thingsboard/monitoring/data/MonitoredServiceKey.java | 2 +- .../thingsboard/monitoring/data/ServiceFailureException.java | 2 +- .../java/org/thingsboard/monitoring/data/cmd/CmdsWrapper.java | 2 +- .../org/thingsboard/monitoring/data/cmd/EntityDataCmd.java | 2 +- .../org/thingsboard/monitoring/data/cmd/EntityDataUpdate.java | 2 +- .../org/thingsboard/monitoring/data/cmd/LatestValueCmd.java | 2 +- .../monitoring/data/notification/HighLatencyNotification.java | 2 +- .../thingsboard/monitoring/data/notification/Notification.java | 2 +- .../data/notification/ServiceFailureNotification.java | 2 +- .../data/notification/ServiceRecoveryNotification.java | 2 +- .../monitoring/notification/NotificationService.java | 2 +- .../monitoring/notification/channels/NotificationChannel.java | 2 +- .../notification/channels/impl/SlackNotificationChannel.java | 2 +- .../org/thingsboard/monitoring/service/BaseHealthChecker.java | 2 +- .../thingsboard/monitoring/service/BaseMonitoringService.java | 2 +- .../monitoring/service/MonitoringEntityService.java | 2 +- .../org/thingsboard/monitoring/service/MonitoringReporter.java | 2 +- .../monitoring/service/transport/TransportHealthChecker.java | 2 +- .../service/transport/TransportsMonitoringService.java | 2 +- .../service/transport/impl/CoapTransportHealthChecker.java | 2 +- .../service/transport/impl/HttpTransportHealthChecker.java | 2 +- .../service/transport/impl/Lwm2mTransportHealthChecker.java | 2 +- .../service/transport/impl/MqttTransportHealthChecker.java | 2 +- .../java/org/thingsboard/monitoring/util/ResourceUtils.java | 2 +- .../main/java/org/thingsboard/monitoring/util/TbStopWatch.java | 2 +- monitoring/src/main/resources/logback.xml | 2 +- monitoring/src/main/resources/lwm2m/models/0.xml | 2 +- monitoring/src/main/resources/lwm2m/models/1.xml | 2 +- monitoring/src/main/resources/lwm2m/models/2.xml | 2 +- monitoring/src/main/resources/tb-monitoring.yml | 2 +- msa/black-box-tests/pom.xml | 2 +- .../org/thingsboard/server/msa/AbstractCoapClientTest.java | 2 +- .../java/org/thingsboard/server/msa/AbstractContainerTest.java | 2 +- .../java/org/thingsboard/server/msa/ContainerTestSuite.java | 2 +- .../java/org/thingsboard/server/msa/DisableUIListeners.java | 2 +- .../java/org/thingsboard/server/msa/DockerComposeExecutor.java | 2 +- .../thingsboard/server/msa/SeleniumRemoteWebDriverTest.java | 2 +- .../src/test/java/org/thingsboard/server/msa/TestListener.java | 2 +- .../test/java/org/thingsboard/server/msa/TestProperties.java | 2 +- .../test/java/org/thingsboard/server/msa/TestRestClient.java | 2 +- .../src/test/java/org/thingsboard/server/msa/TestUtils.java | 2 +- .../org/thingsboard/server/msa/ThingsBoardDbInstaller.java | 2 +- .../src/test/java/org/thingsboard/server/msa/WsClient.java | 2 +- .../org/thingsboard/server/msa/cf/CalculatedFieldTest.java | 2 +- .../thingsboard/server/msa/connectivity/CoapClientTest.java | 2 +- .../thingsboard/server/msa/connectivity/HttpClientTest.java | 2 +- .../thingsboard/server/msa/connectivity/MqttClientTest.java | 2 +- .../server/msa/connectivity/MqttGatewayClientTest.java | 2 +- .../server/msa/connectivity/lwm2m/AbstractLwm2mClientTest.java | 2 +- .../server/msa/connectivity/lwm2m/Lwm2mDevicesForTest.java | 2 +- .../server/msa/connectivity/lwm2m/client/FwLwM2MDevice.java | 2 +- .../server/msa/connectivity/lwm2m/client/LwM2MTestClient.java | 2 +- .../connectivity/lwm2m/client/LwM2mBinaryAppDataContainer.java | 2 +- .../msa/connectivity/lwm2m/client/LwM2mTemperatureSensor.java | 2 +- .../msa/connectivity/lwm2m/client/LwM2mValueConverterImpl.java | 2 +- .../server/msa/connectivity/lwm2m/client/Lwm2mTestHelper.java | 2 +- .../msa/connectivity/lwm2m/client/SimpleLwM2MDevice.java | 2 +- .../msa/connectivity/lwm2m/rpc/Lwm2mObserveCompositeTest.java | 2 +- .../server/msa/connectivity/lwm2m/rpc/Lwm2mObserveTest.java | 2 +- .../msa/connectivity/lwm2m/security/Lwm2mClientNoSecTest.java | 2 +- .../msa/connectivity/lwm2m/security/Lwm2mClientPskTest.java | 2 +- .../thingsboard/server/msa/edqs/EdqsEntityDataQueryTest.java | 2 +- .../org/thingsboard/server/msa/mapper/AttributesResponse.java | 2 +- .../org/thingsboard/server/msa/mapper/WsTelemetryResponse.java | 2 +- .../thingsboard/server/msa/prototypes/DevicePrototypes.java | 2 +- .../org/thingsboard/server/msa/rule/node/MqttNodeTest.java | 2 +- .../org/thingsboard/server/msa/ui/base/AbstractBasePage.java | 2 +- .../thingsboard/server/msa/ui/base/AbstractDriverBaseTest.java | 2 +- .../org/thingsboard/server/msa/ui/listeners/RetryAnalyzer.java | 2 +- .../thingsboard/server/msa/ui/listeners/RetryTestListener.java | 2 +- .../server/msa/ui/pages/AlarmDetailsEntityTabElements.java | 2 +- .../server/msa/ui/pages/AlarmDetailsEntityTabHelper.java | 2 +- .../server/msa/ui/pages/AlarmDetailsViewElements.java | 2 +- .../server/msa/ui/pages/AlarmDetailsViewHelper.java | 2 +- .../thingsboard/server/msa/ui/pages/AlarmWidgetElements.java | 2 +- .../org/thingsboard/server/msa/ui/pages/AssetPageElements.java | 2 +- .../org/thingsboard/server/msa/ui/pages/AssetPageHelper.java | 2 +- .../server/msa/ui/pages/CreateWidgetPopupElements.java | 2 +- .../server/msa/ui/pages/CreateWidgetPopupHelper.java | 2 +- .../thingsboard/server/msa/ui/pages/CustomerPageElements.java | 2 +- .../thingsboard/server/msa/ui/pages/CustomerPageHelper.java | 2 +- .../thingsboard/server/msa/ui/pages/DashboardPageElements.java | 2 +- .../thingsboard/server/msa/ui/pages/DashboardPageHelper.java | 2 +- .../thingsboard/server/msa/ui/pages/DevicePageElements.java | 2 +- .../org/thingsboard/server/msa/ui/pages/DevicePageHelper.java | 2 +- .../server/msa/ui/pages/EntityViewPageElements.java | 2 +- .../thingsboard/server/msa/ui/pages/EntityViewPageHelper.java | 2 +- .../org/thingsboard/server/msa/ui/pages/LoginPageElements.java | 2 +- .../org/thingsboard/server/msa/ui/pages/LoginPageHelper.java | 2 +- .../server/msa/ui/pages/OpenRuleChainPageElements.java | 2 +- .../server/msa/ui/pages/OpenRuleChainPageHelper.java | 2 +- .../org/thingsboard/server/msa/ui/pages/OtherPageElements.java | 2 +- .../server/msa/ui/pages/OtherPageElementsHelper.java | 2 +- .../thingsboard/server/msa/ui/pages/ProfilesPageElements.java | 2 +- .../thingsboard/server/msa/ui/pages/ProfilesPageHelper.java | 2 +- .../server/msa/ui/pages/RuleChainsPageElements.java | 2 +- .../thingsboard/server/msa/ui/pages/RuleChainsPageHelper.java | 2 +- .../server/msa/ui/pages/SideBarMenuViewElements.java | 2 +- .../thingsboard/server/msa/ui/pages/SideBarMenuViewHelper.java | 2 +- .../server/msa/ui/tabs/AssignDeviceTabElements.java | 2 +- .../thingsboard/server/msa/ui/tabs/AssignDeviceTabHelper.java | 2 +- .../server/msa/ui/tabs/CreateDeviceTabElements.java | 2 +- .../thingsboard/server/msa/ui/tabs/CreateDeviceTabHelper.java | 2 +- .../server/msa/ui/tests/alarmassignee/AbstractAssignTest.java | 2 +- .../msa/ui/tests/alarmassignee/AssignDetailsTabAssignTest.java | 2 +- .../alarmassignee/AssignDetailsTabFromCustomerAssignTest.java | 2 +- .../msa/ui/tests/alarmassignee/AssignFromAlarmWidgetTest.java | 2 +- .../ui/tests/assetProfileSmoke/AssetProfileEditMenuTest.java | 2 +- .../tests/assetProfileSmoke/CreateAssetProfileImportTest.java | 2 +- .../msa/ui/tests/assetProfileSmoke/CreateAssetProfileTest.java | 2 +- .../msa/ui/tests/assetProfileSmoke/DeleteAssetProfileTest.java | 2 +- .../assetProfileSmoke/DeleteSeveralAssetProfilesTest.java | 2 +- .../tests/assetProfileSmoke/MakeAssetProfileDefaultTest.java | 2 +- .../msa/ui/tests/assetProfileSmoke/SearchAssetProfileTest.java | 2 +- .../server/msa/ui/tests/assetProfileSmoke/SortByNameTest.java | 2 +- .../server/msa/ui/tests/customerSmoke/CreateCustomerTest.java | 2 +- .../msa/ui/tests/customerSmoke/CustomerEditMenuTest.java | 2 +- .../server/msa/ui/tests/customerSmoke/DeleteCustomerTest.java | 2 +- .../msa/ui/tests/customerSmoke/DeleteSeveralCustomerTest.java | 2 +- .../msa/ui/tests/customerSmoke/ManageCustomersAssetsTest.java | 2 +- .../ui/tests/customerSmoke/ManageCustomersDashboardsTest.java | 2 +- .../msa/ui/tests/customerSmoke/ManageCustomersDevicesTest.java | 2 +- .../msa/ui/tests/customerSmoke/ManageCustomersEdgesTest.java | 2 +- .../msa/ui/tests/customerSmoke/ManageCustomersUsersTest.java | 2 +- .../server/msa/ui/tests/customerSmoke/SearchCustomerTest.java | 2 +- .../server/msa/ui/tests/customerSmoke/SortByNameTest.java | 2 +- .../deviceProfileSmoke/CreateDeviceProfileImportTest.java | 2 +- .../ui/tests/deviceProfileSmoke/CreateDeviceProfileTest.java | 2 +- .../ui/tests/deviceProfileSmoke/DeleteDeviceProfileTest.java | 2 +- .../deviceProfileSmoke/DeleteSeveralDeviceProfilesTest.java | 2 +- .../ui/tests/deviceProfileSmoke/DeviceProfileEditMenuTest.java | 2 +- .../tests/deviceProfileSmoke/MakeDeviceProfileDefaultTest.java | 2 +- .../ui/tests/deviceProfileSmoke/SearchDeviceProfileTest.java | 2 +- .../server/msa/ui/tests/deviceProfileSmoke/SortByNameTest.java | 2 +- .../server/msa/ui/tests/devicessmoke/AbstractDeviceTest.java | 2 +- .../server/msa/ui/tests/devicessmoke/AssignToCustomerTest.java | 2 +- .../server/msa/ui/tests/devicessmoke/CreateDeviceTest.java | 2 +- .../server/msa/ui/tests/devicessmoke/DeleteDeviceTest.java | 2 +- .../msa/ui/tests/devicessmoke/DeleteSeveralDevicesTest.java | 2 +- .../server/msa/ui/tests/devicessmoke/DeviceFilterTest.java | 2 +- .../server/msa/ui/tests/devicessmoke/EditDeviceTest.java | 2 +- .../msa/ui/tests/devicessmoke/MakeDevicePrivateTest.java | 2 +- .../server/msa/ui/tests/devicessmoke/MakeDevicePublicTest.java | 2 +- .../msa/ui/tests/rulechainssmoke/AbstractRuleChainTest.java | 2 +- .../ui/tests/rulechainssmoke/CreateRuleChainImportTest.java | 2 +- .../msa/ui/tests/rulechainssmoke/CreateRuleChainTest.java | 2 +- .../msa/ui/tests/rulechainssmoke/DeleteRuleChainTest.java | 2 +- .../ui/tests/rulechainssmoke/DeleteSeveralRuleChainsTest.java | 2 +- .../msa/ui/tests/rulechainssmoke/MakeRuleChainRootTest.java | 2 +- .../server/msa/ui/tests/rulechainssmoke/OpenRuleChainTest.java | 2 +- .../msa/ui/tests/rulechainssmoke/RuleChainEditMenuTest.java | 2 +- .../msa/ui/tests/rulechainssmoke/SearchRuleChainTest.java | 2 +- .../server/msa/ui/tests/rulechainssmoke/SortByNameTest.java | 2 +- .../server/msa/ui/tests/rulechainssmoke/SortByTimeTest.java | 2 +- .../test/java/org/thingsboard/server/msa/ui/utils/Const.java | 2 +- .../server/msa/ui/utils/DataProviderCredential.java | 2 +- .../org/thingsboard/server/msa/ui/utils/EntityPrototypes.java | 2 +- msa/black-box-tests/src/test/resources/alarmAssignee.xml | 2 +- msa/black-box-tests/src/test/resources/all.xml | 2 +- msa/black-box-tests/src/test/resources/connectivity.xml | 2 +- .../src/test/resources/docker-compose.hybrid-test-extras.yml | 2 +- .../src/test/resources/docker-compose.mosquitto.yml | 2 +- .../src/test/resources/docker-compose.postgres-test-extras.yml | 2 +- .../src/test/resources/docker-compose.rabbitmq-server.yml | 2 +- .../src/test/resources/docker-compose.valkey-ssl.volumes.yml | 2 +- .../src/test/resources/docker-compose.valkey-ssl.yml | 2 +- msa/black-box-tests/src/test/resources/docker-selenium.yml | 2 +- msa/black-box-tests/src/test/resources/forImport.txt | 2 +- msa/black-box-tests/src/test/resources/logback.xml | 2 +- .../src/test/resources/mosquitto/mosquitto.conf | 2 +- msa/black-box-tests/src/test/resources/smokeDevices.xml | 2 +- msa/black-box-tests/src/test/resources/smokesCustomer.xml | 2 +- msa/black-box-tests/src/test/resources/smokesProfiles.xml | 2 +- msa/black-box-tests/src/test/resources/smokesRuleChain.xml | 2 +- .../src/test/resources/tb-node/conf/logback.xml | 2 +- .../src/test/resources/tb-transports/coap/conf/logback.xml | 2 +- .../src/test/resources/tb-transports/http/conf/logback.xml | 2 +- .../src/test/resources/tb-transports/lwm2m/conf/logback.xml | 2 +- .../src/test/resources/tb-transports/mqtt/conf/logback.xml | 2 +- msa/black-box-tests/src/test/resources/uiTests.xml | 2 +- msa/edqs/docker/Dockerfile | 2 +- msa/edqs/docker/start-tb-edqs.sh | 2 +- msa/edqs/pom.xml | 2 +- msa/js-executor/api/httpServer.ts | 2 +- msa/js-executor/api/jsExecutor.models.ts | 2 +- msa/js-executor/api/jsExecutor.ts | 2 +- msa/js-executor/api/jsInvokeMessageProcessor.ts | 2 +- msa/js-executor/api/utils.ts | 2 +- msa/js-executor/config/custom-environment-variables.yml | 2 +- msa/js-executor/config/default.yml | 2 +- msa/js-executor/config/logger.ts | 2 +- msa/js-executor/config/tb-js-executor.conf | 2 +- msa/js-executor/docker/Dockerfile | 2 +- msa/js-executor/docker/start-js-executor.sh | 2 +- msa/js-executor/install.js | 2 +- msa/js-executor/pom.xml | 2 +- msa/js-executor/queue/kafkaTemplate.ts | 2 +- msa/js-executor/queue/queue.models.ts | 2 +- msa/js-executor/server.ts | 2 +- msa/monitoring/docker/Dockerfile | 2 +- msa/monitoring/docker/start-tb-monitoring.sh | 2 +- msa/monitoring/pom.xml | 2 +- msa/pom.xml | 2 +- msa/tb-node/docker/Dockerfile | 2 +- msa/tb-node/docker/logback.xml | 2 +- msa/tb-node/docker/start-tb-node.sh | 2 +- msa/tb-node/pom.xml | 2 +- msa/tb/docker-cassandra/Dockerfile | 2 +- msa/tb/docker-cassandra/start-db.sh | 2 +- msa/tb/docker-cassandra/stop-db.sh | 2 +- msa/tb/docker-postgres/Dockerfile | 2 +- msa/tb/docker-postgres/start-db.sh | 2 +- msa/tb/docker-postgres/stop-db.sh | 2 +- msa/tb/docker/install-tb.sh | 2 +- msa/tb/docker/logback.xml | 2 +- msa/tb/docker/start-tb.sh | 2 +- msa/tb/docker/thingsboard.conf | 2 +- msa/tb/docker/upgrade-tb.sh | 2 +- msa/tb/pom.xml | 2 +- msa/transport/coap/docker/Dockerfile | 2 +- msa/transport/coap/docker/start-tb-coap-transport.sh | 2 +- msa/transport/coap/pom.xml | 2 +- msa/transport/http/docker/Dockerfile | 2 +- msa/transport/http/docker/start-tb-http-transport.sh | 2 +- msa/transport/http/pom.xml | 2 +- msa/transport/lwm2m/docker/Dockerfile | 2 +- msa/transport/lwm2m/docker/start-tb-lwm2m-transport.sh | 2 +- msa/transport/lwm2m/pom.xml | 2 +- msa/transport/mqtt/docker/Dockerfile | 2 +- msa/transport/mqtt/docker/start-tb-mqtt-transport.sh | 2 +- msa/transport/mqtt/pom.xml | 2 +- msa/transport/pom.xml | 2 +- msa/transport/snmp/docker/Dockerfile | 2 +- msa/transport/snmp/docker/start-tb-snmp-transport.sh | 2 +- msa/transport/snmp/pom.xml | 2 +- msa/vc-executor-docker/docker/Dockerfile | 2 +- msa/vc-executor-docker/docker/start-tb-vc-executor.sh | 2 +- msa/vc-executor-docker/pom.xml | 2 +- msa/vc-executor/pom.xml | 2 +- msa/vc-executor/src/main/conf/logback.xml | 2 +- msa/vc-executor/src/main/conf/tb-vc-executor.conf | 2 +- .../vc/ThingsboardVersionControlExecutorApplication.java | 2 +- .../vc/service/VersionControlQueueRoutingInfoService.java | 2 +- .../vc/service/VersionControlTenantRoutingInfoService.java | 2 +- msa/vc-executor/src/main/resources/logback.xml | 2 +- msa/vc-executor/src/main/resources/tb-vc-executor.yml | 2 +- msa/web-ui/config/custom-environment-variables.yml | 2 +- msa/web-ui/config/default.yml | 2 +- msa/web-ui/config/logger.ts | 2 +- msa/web-ui/config/tb-web-ui.conf | 2 +- msa/web-ui/docker/Dockerfile | 2 +- msa/web-ui/docker/start-web-ui.sh | 2 +- msa/web-ui/install.js | 2 +- msa/web-ui/pom.xml | 2 +- msa/web-ui/server.ts | 2 +- netty-mqtt/pom.xml | 2 +- .../main/java/org/thingsboard/mqtt/ChannelClosedException.java | 2 +- .../thingsboard/mqtt/MaxRetransmissionsReachedException.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttChannelHandler.java | 2 +- netty-mqtt/src/main/java/org/thingsboard/mqtt/MqttClient.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttClientCallback.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttClientConfig.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttClientImpl.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttConnectResult.java | 2 +- netty-mqtt/src/main/java/org/thingsboard/mqtt/MqttHandler.java | 2 +- .../java/org/thingsboard/mqtt/MqttIncomingQos2Publish.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttLastWill.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttPendingPublish.java | 2 +- .../java/org/thingsboard/mqtt/MqttPendingSubscription.java | 2 +- .../java/org/thingsboard/mqtt/MqttPendingUnsubscription.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttPingHandler.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttSubscription.java | 2 +- .../src/main/java/org/thingsboard/mqtt/PendingOperation.java | 2 +- .../src/main/java/org/thingsboard/mqtt/ReconnectStrategy.java | 2 +- .../org/thingsboard/mqtt/ReconnectStrategyExponential.java | 2 +- .../main/java/org/thingsboard/mqtt/RetransmissionHandler.java | 2 +- .../src/test/java/org/thingsboard/mqtt/MqttClientTest.java | 2 +- .../src/test/java/org/thingsboard/mqtt/MqttTestProxy.java | 2 +- .../org/thingsboard/mqtt/ReconnectStrategyExponentialTest.java | 2 +- packaging/java/assembly/windows.xml | 2 +- packaging/java/build.gradle | 2 +- packaging/java/scripts/install/install.sh | 2 +- packaging/java/scripts/install/install_dev_db.sh | 2 +- packaging/java/scripts/install/logback.xml | 2 +- packaging/java/scripts/install/upgrade.sh | 2 +- packaging/java/scripts/install/upgrade_dev_db.sh | 2 +- packaging/js/assembly/windows.xml | 2 +- packaging/js/build.gradle | 2 +- pom.xml | 2 +- rest-client/pom.xml | 2 +- .../src/main/java/org/thingsboard/rest/client/RestClient.java | 2 +- .../org/thingsboard/rest/client/utils/RestJsonConverter.java | 2 +- rest-client/src/main/resources/logback.xml | 2 +- rule-engine/pom.xml | 2 +- rule-engine/rule-engine-api/pom.xml | 2 +- .../thingsboard/rule/engine/api/AttributesDeleteRequest.java | 2 +- .../org/thingsboard/rule/engine/api/AttributesSaveRequest.java | 2 +- .../rule/engine/api/CalculatedFieldSystemAwareRequest.java | 2 +- .../org/thingsboard/rule/engine/api/DeviceStateManager.java | 2 +- .../thingsboard/rule/engine/api/EmptyNodeConfiguration.java | 2 +- .../main/java/org/thingsboard/rule/engine/api/JobManager.java | 2 +- .../main/java/org/thingsboard/rule/engine/api/MailService.java | 2 +- .../org/thingsboard/rule/engine/api/MqttClientSettings.java | 2 +- .../org/thingsboard/rule/engine/api/NodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/api/NodeDefinition.java | 2 +- .../org/thingsboard/rule/engine/api/NotificationCenter.java | 2 +- .../rule/engine/api/RuleEngineAiChatModelService.java | 2 +- .../thingsboard/rule/engine/api/RuleEngineAlarmService.java | 2 +- .../rule/engine/api/RuleEngineApiUsageStateService.java | 2 +- .../rule/engine/api/RuleEngineAssetProfileCache.java | 2 +- .../rule/engine/api/RuleEngineCalculatedFieldQueueService.java | 2 +- .../rule/engine/api/RuleEngineDeviceProfileCache.java | 2 +- .../rule/engine/api/RuleEngineDeviceRpcRequest.java | 2 +- .../rule/engine/api/RuleEngineDeviceRpcResponse.java | 2 +- .../org/thingsboard/rule/engine/api/RuleEngineRpcService.java | 2 +- .../rule/engine/api/RuleEngineTelemetryService.java | 2 +- .../main/java/org/thingsboard/rule/engine/api/RuleNode.java | 2 +- .../java/org/thingsboard/rule/engine/api/ScriptEngine.java | 2 +- .../main/java/org/thingsboard/rule/engine/api/SmsService.java | 2 +- .../main/java/org/thingsboard/rule/engine/api/TbContext.java | 2 +- .../src/main/java/org/thingsboard/rule/engine/api/TbEmail.java | 2 +- .../src/main/java/org/thingsboard/rule/engine/api/TbNode.java | 2 +- .../org/thingsboard/rule/engine/api/TbNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/api/TbNodeException.java | 2 +- .../main/java/org/thingsboard/rule/engine/api/TbNodeState.java | 2 +- .../thingsboard/rule/engine/api/TimeseriesDeleteRequest.java | 2 +- .../org/thingsboard/rule/engine/api/TimeseriesSaveRequest.java | 2 +- .../rule/engine/api/notification/FirebaseService.java | 2 +- .../thingsboard/rule/engine/api/notification/SlackService.java | 2 +- .../java/org/thingsboard/rule/engine/api/sms/SmsSender.java | 2 +- .../org/thingsboard/rule/engine/api/sms/SmsSenderFactory.java | 2 +- .../rule/engine/api/sms/exception/SmsException.java | 2 +- .../rule/engine/api/sms/exception/SmsParseException.java | 2 +- .../rule/engine/api/sms/exception/SmsSendException.java | 2 +- .../java/org/thingsboard/rule/engine/api/util/TbNodeUtils.java | 2 +- .../rule/engine/api/AttributesDeleteRequestTest.java | 2 +- .../thingsboard/rule/engine/api/AttributesSaveRequestTest.java | 2 +- .../thingsboard/rule/engine/api/TimeseriesSaveRequestTest.java | 2 +- .../org/thingsboard/rule/engine/api/util/TbNodeUtilsTest.java | 2 +- rule-engine/rule-engine-components/pom.xml | 2 +- .../thingsboard/rule/engine/action/TbAbstractAlarmNode.java | 2 +- .../rule/engine/action/TbAbstractAlarmNodeConfiguration.java | 2 +- .../rule/engine/action/TbAbstractCustomerActionNode.java | 2 +- .../action/TbAbstractCustomerActionNodeConfiguration.java | 2 +- .../rule/engine/action/TbAbstractRelationActionNode.java | 2 +- .../action/TbAbstractRelationActionNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/action/TbAlarmResult.java | 2 +- .../thingsboard/rule/engine/action/TbAssignToCustomerNode.java | 2 +- .../engine/action/TbAssignToCustomerNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/action/TbClearAlarmNode.java | 2 +- .../rule/engine/action/TbClearAlarmNodeConfiguration.java | 2 +- .../rule/engine/action/TbCopyAttributesToEntityViewNode.java | 2 +- .../org/thingsboard/rule/engine/action/TbCreateAlarmNode.java | 2 +- .../rule/engine/action/TbCreateAlarmNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/action/TbCreateRelationNode.java | 2 +- .../rule/engine/action/TbCreateRelationNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/action/TbDeleteRelationNode.java | 2 +- .../rule/engine/action/TbDeleteRelationNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/action/TbDeviceStateNode.java | 2 +- .../rule/engine/action/TbDeviceStateNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/action/TbLogNode.java | 2 +- .../thingsboard/rule/engine/action/TbLogNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/action/TbMsgCountNode.java | 2 +- .../rule/engine/action/TbMsgCountNodeConfiguration.java | 2 +- .../rule/engine/action/TbSaveToCustomCassandraTableNode.java | 2 +- .../action/TbSaveToCustomCassandraTableNodeConfiguration.java | 2 +- .../rule/engine/action/TbUnassignFromCustomerNode.java | 2 +- .../engine/action/TbUnassignFromCustomerNodeConfiguration.java | 2 +- .../rule/engine/ai/Langchain4jJsonSchemaAdapter.java | 2 +- .../src/main/java/org/thingsboard/rule/engine/ai/TbAiNode.java | 2 +- .../org/thingsboard/rule/engine/ai/TbAiNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/ai/TbResponseFormat.java | 2 +- .../thingsboard/rule/engine/aws/lambda/TbAwsLambdaNode.java | 2 +- .../rule/engine/aws/lambda/TbAwsLambdaNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/aws/sns/TbSnsNode.java | 2 +- .../rule/engine/aws/sns/TbSnsNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/aws/sqs/TbSqsNode.java | 2 +- .../rule/engine/aws/sqs/TbSqsNodeConfiguration.java | 2 +- .../rule/engine/credentials/AnonymousCredentials.java | 2 +- .../thingsboard/rule/engine/credentials/BasicCredentials.java | 2 +- .../rule/engine/credentials/CertPemCredentials.java | 2 +- .../thingsboard/rule/engine/credentials/ClientCredentials.java | 2 +- .../thingsboard/rule/engine/credentials/CredentialsType.java | 2 +- .../org/thingsboard/rule/engine/data/DeviceRelationsQuery.java | 2 +- .../java/org/thingsboard/rule/engine/data/RelationsQuery.java | 2 +- .../org/thingsboard/rule/engine/debug/TbMsgGeneratorNode.java | 2 +- .../rule/engine/debug/TbMsgGeneratorNodeConfiguration.java | 2 +- .../rule/engine/deduplication/DeduplicationData.java | 2 +- .../thingsboard/rule/engine/deduplication/DeduplicationId.java | 2 +- .../rule/engine/deduplication/DeduplicationStrategy.java | 2 +- .../rule/engine/deduplication/TbMsgDeduplicationNode.java | 2 +- .../deduplication/TbMsgDeduplicationNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/delay/TbMsgDelayNode.java | 2 +- .../rule/engine/delay/TbMsgDelayNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/edge/AbstractTbMsgPushNode.java | 2 +- .../rule/engine/edge/BaseTbMsgPushNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/edge/TbMsgPushToCloudNode.java | 2 +- .../rule/engine/edge/TbMsgPushToCloudNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java | 2 +- .../rule/engine/edge/TbMsgPushToEdgeNodeConfiguration.java | 2 +- .../rule/engine/external/TbAbstractExternalNode.java | 2 +- .../rule/engine/filter/TbAbstractTypeSwitchNode.java | 2 +- .../thingsboard/rule/engine/filter/TbAssetTypeSwitchNode.java | 2 +- .../thingsboard/rule/engine/filter/TbCheckAlarmStatusNode.java | 2 +- .../rule/engine/filter/TbCheckAlarmStatusNodeConfig.java | 2 +- .../org/thingsboard/rule/engine/filter/TbCheckMessageNode.java | 2 +- .../rule/engine/filter/TbCheckMessageNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/filter/TbCheckRelationNode.java | 2 +- .../rule/engine/filter/TbCheckRelationNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/filter/TbDeviceTypeSwitchNode.java | 2 +- .../org/thingsboard/rule/engine/filter/TbJsFilterNode.java | 2 +- .../rule/engine/filter/TbJsFilterNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/filter/TbJsSwitchNode.java | 2 +- .../rule/engine/filter/TbJsSwitchNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/filter/TbMsgTypeFilterNode.java | 2 +- .../rule/engine/filter/TbMsgTypeFilterNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/filter/TbMsgTypeSwitchNode.java | 2 +- .../rule/engine/filter/TbOriginatorTypeFilterNode.java | 2 +- .../engine/filter/TbOriginatorTypeFilterNodeConfiguration.java | 2 +- .../rule/engine/filter/TbOriginatorTypeSwitchNode.java | 2 +- .../main/java/org/thingsboard/rule/engine/flow/TbAckNode.java | 2 +- .../org/thingsboard/rule/engine/flow/TbCheckpointNode.java | 2 +- .../org/thingsboard/rule/engine/flow/TbRuleChainInputNode.java | 2 +- .../rule/engine/flow/TbRuleChainInputNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/flow/TbRuleChainOutputNode.java | 2 +- .../org/thingsboard/rule/engine/gcp/pubsub/TbPubSubNode.java | 2 +- .../rule/engine/gcp/pubsub/TbPubSubNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/geo/AbstractGeofencingNode.java | 2 +- .../org/thingsboard/rule/engine/geo/EntityGeofencingState.java | 2 +- .../thingsboard/rule/engine/geo/TbGpsGeofencingActionNode.java | 2 +- .../engine/geo/TbGpsGeofencingActionNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/geo/TbGpsGeofencingFilterNode.java | 2 +- .../engine/geo/TbGpsGeofencingFilterNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/kafka/TbKafkaNode.java | 2 +- .../rule/engine/kafka/TbKafkaNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/mail/TbMsgToEmailNode.java | 2 +- .../rule/engine/mail/TbMsgToEmailNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/mail/TbSendEmailNode.java | 2 +- .../rule/engine/mail/TbSendEmailNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/math/TbMathArgument.java | 2 +- .../org/thingsboard/rule/engine/math/TbMathArgumentType.java | 2 +- .../org/thingsboard/rule/engine/math/TbMathArgumentValue.java | 2 +- .../main/java/org/thingsboard/rule/engine/math/TbMathNode.java | 2 +- .../thingsboard/rule/engine/math/TbMathNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/math/TbMathResult.java | 2 +- .../rule/engine/math/TbRuleNodeMathFunctionType.java | 2 +- .../thingsboard/rule/engine/metadata/CalculateDeltaNode.java | 2 +- .../rule/engine/metadata/CalculateDeltaNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/metadata/DataToFetch.java | 2 +- .../java/org/thingsboard/rule/engine/metadata/FetchMode.java | 2 +- .../engine/metadata/TbAbstractFetchToNodeConfiguration.java | 2 +- .../rule/engine/metadata/TbAbstractGetAttributesNode.java | 2 +- .../rule/engine/metadata/TbAbstractGetEntityDataNode.java | 2 +- .../rule/engine/metadata/TbAbstractGetEntityDetailsNode.java | 2 +- .../metadata/TbAbstractGetEntityDetailsNodeConfiguration.java | 2 +- .../rule/engine/metadata/TbAbstractGetMappedDataNode.java | 2 +- .../rule/engine/metadata/TbAbstractNodeWithFetchTo.java | 2 +- .../rule/engine/metadata/TbFetchDeviceCredentialsNode.java | 2 +- .../metadata/TbFetchDeviceCredentialsNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/metadata/TbGetAttributesNode.java | 2 +- .../rule/engine/metadata/TbGetAttributesNodeConfiguration.java | 2 +- .../rule/engine/metadata/TbGetCustomerAttributeNode.java | 2 +- .../rule/engine/metadata/TbGetCustomerDetailsNode.java | 2 +- .../engine/metadata/TbGetCustomerDetailsNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/metadata/TbGetDeviceAttrNode.java | 2 +- .../rule/engine/metadata/TbGetDeviceAttrNodeConfiguration.java | 2 +- .../rule/engine/metadata/TbGetEntityDataNodeConfiguration.java | 2 +- .../rule/engine/metadata/TbGetMappedDataNodeConfiguration.java | 2 +- .../engine/metadata/TbGetOriginatorFieldsConfiguration.java | 2 +- .../rule/engine/metadata/TbGetOriginatorFieldsNode.java | 2 +- .../rule/engine/metadata/TbGetRelatedAttributeNode.java | 2 +- .../engine/metadata/TbGetRelatedDataNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/metadata/TbGetTelemetryNode.java | 2 +- .../rule/engine/metadata/TbGetTelemetryNodeConfiguration.java | 2 +- .../rule/engine/metadata/TbGetTenantAttributeNode.java | 2 +- .../rule/engine/metadata/TbGetTenantDetailsNode.java | 2 +- .../engine/metadata/TbGetTenantDetailsNodeConfiguration.java | 2 +- .../main/java/org/thingsboard/rule/engine/mqtt/TbMqttNode.java | 2 +- .../thingsboard/rule/engine/mqtt/TbMqttNodeConfiguration.java | 2 +- .../rule/engine/mqtt/azure/AzureIotHubSasCredentials.java | 2 +- .../thingsboard/rule/engine/mqtt/azure/TbAzureIotHubNode.java | 2 +- .../rule/engine/mqtt/azure/TbAzureIotHubNodeConfiguration.java | 2 +- .../rule/engine/notification/TbNotificationNode.java | 2 +- .../engine/notification/TbNotificationNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/notification/TbSlackNode.java | 2 +- .../rule/engine/notification/TbSlackNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/profile/AlarmEvalResult.java | 2 +- .../org/thingsboard/rule/engine/profile/AlarmRuleState.java | 2 +- .../java/org/thingsboard/rule/engine/profile/AlarmState.java | 2 +- .../rule/engine/profile/AlarmStateUpdateResult.java | 2 +- .../java/org/thingsboard/rule/engine/profile/DataSnapshot.java | 2 +- .../java/org/thingsboard/rule/engine/profile/DeviceState.java | 2 +- .../rule/engine/profile/DynamicPredicateValueCtx.java | 2 +- .../rule/engine/profile/DynamicPredicateValueCtxImpl.java | 2 +- .../org/thingsboard/rule/engine/profile/EntityKeyValue.java | 2 +- .../thingsboard/rule/engine/profile/NumericParseException.java | 2 +- .../java/org/thingsboard/rule/engine/profile/ProfileState.java | 2 +- .../org/thingsboard/rule/engine/profile/SnapshotUpdate.java | 2 +- .../thingsboard/rule/engine/profile/TbDeviceProfileNode.java | 2 +- .../rule/engine/profile/TbDeviceProfileNodeConfiguration.java | 2 +- .../rule/engine/profile/state/PersistedAlarmRuleState.java | 2 +- .../rule/engine/profile/state/PersistedAlarmState.java | 2 +- .../rule/engine/profile/state/PersistedDeviceState.java | 2 +- .../org/thingsboard/rule/engine/rabbitmq/TbRabbitMqNode.java | 2 +- .../rule/engine/rabbitmq/TbRabbitMqNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/rest/TbHttpClient.java | 2 +- .../org/thingsboard/rule/engine/rest/TbRestApiCallNode.java | 2 +- .../rule/engine/rest/TbRestApiCallNodeConfiguration.java | 2 +- .../rule/engine/rest/TbSendRestApiCallReplyNode.java | 2 +- .../engine/rest/TbSendRestApiCallReplyNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/rpc/TbSendRPCReplyNode.java | 2 +- .../org/thingsboard/rule/engine/rpc/TbSendRPCRequestNode.java | 2 +- .../rule/engine/rpc/TbSendRpcReplyNodeConfiguration.java | 2 +- .../rule/engine/rpc/TbSendRpcRequestNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/sms/TbSendSmsNode.java | 2 +- .../rule/engine/sms/TbSendSmsNodeConfiguration.java | 2 +- .../rule/engine/telemetry/AttributesDeleteNodeCallback.java | 2 +- .../rule/engine/telemetry/AttributesUpdateNodeCallback.java | 2 +- .../rule/engine/telemetry/TbCalculatedFieldsNode.java | 2 +- .../thingsboard/rule/engine/telemetry/TbMsgAttributesNode.java | 2 +- .../engine/telemetry/TbMsgAttributesNodeConfiguration.java | 2 +- .../rule/engine/telemetry/TbMsgDeleteAttributesNode.java | 2 +- .../telemetry/TbMsgDeleteAttributesNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/telemetry/TbMsgTimeseriesNode.java | 2 +- .../engine/telemetry/TbMsgTimeseriesNodeConfiguration.java | 2 +- .../rule/engine/telemetry/TelemetryNodeCallback.java | 2 +- .../telemetry/settings/AttributesProcessingSettings.java | 2 +- .../rule/engine/telemetry/settings/ProcessingSettings.java | 3 +-- .../telemetry/settings/TimeseriesProcessingSettings.java | 2 +- .../telemetry/strategy/DeduplicateProcessingStrategy.java | 2 +- .../telemetry/strategy/OnEveryMessageProcessingStrategy.java | 2 +- .../rule/engine/telemetry/strategy/ProcessingStrategy.java | 2 +- .../rule/engine/telemetry/strategy/SkipProcessingStrategy.java | 2 +- .../rule/engine/transaction/TbSynchronizationBeginNode.java | 2 +- .../rule/engine/transaction/TbSynchronizationEndNode.java | 2 +- .../rule/engine/transform/MultipleTbMsgsCallbackWrapper.java | 2 +- .../thingsboard/rule/engine/transform/OriginatorSource.java | 2 +- .../rule/engine/transform/TbAbstractTransformNode.java | 2 +- .../transform/TbAbstractTransformNodeWithTbMsgSource.java | 2 +- .../rule/engine/transform/TbChangeOriginatorNode.java | 2 +- .../engine/transform/TbChangeOriginatorNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/transform/TbCopyKeysNode.java | 2 +- .../rule/engine/transform/TbCopyKeysNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/transform/TbDeleteKeysNode.java | 2 +- .../rule/engine/transform/TbDeleteKeysNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/transform/TbJsonPathNode.java | 2 +- .../rule/engine/transform/TbJsonPathNodeConfiguration.java | 2 +- .../rule/engine/transform/TbMsgCallbackWrapper.java | 2 +- .../thingsboard/rule/engine/transform/TbRenameKeysNode.java | 2 +- .../rule/engine/transform/TbRenameKeysNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/transform/TbSplitArrayMsgNode.java | 2 +- .../thingsboard/rule/engine/transform/TbTransformMsgNode.java | 2 +- .../rule/engine/transform/TbTransformMsgNodeConfiguration.java | 2 +- .../rule/engine/util/ContactBasedEntityDetails.java | 2 +- .../rule/engine/util/EntitiesAlarmOriginatorIdAsyncLoader.java | 2 +- .../rule/engine/util/EntitiesByNameAndTypeLoader.java | 2 +- .../rule/engine/util/EntitiesFieldsAsyncLoader.java | 2 +- .../rule/engine/util/EntitiesRelatedDeviceIdAsyncLoader.java | 2 +- .../rule/engine/util/EntitiesRelatedEntityIdAsyncLoader.java | 2 +- .../org/thingsboard/rule/engine/util/GpsGeofencingEvents.java | 2 +- .../thingsboard/rule/engine/util/SemaphoreWithTbMsgQueue.java | 2 +- .../java/org/thingsboard/rule/engine/util/TbMsgSource.java | 2 +- .../java/org/thingsboard/rule/engine/util/TenantIdLoader.java | 2 +- .../thingsboard/rule/engine/AbstractRuleNodeUpgradeTest.java | 2 +- .../org/thingsboard/rule/engine/TestDbCallbackExecutor.java | 2 +- .../rule/engine/action/TbAssignToCustomerNodeTest.java | 2 +- .../thingsboard/rule/engine/action/TbClearAlarmNodeTest.java | 2 +- .../engine/action/TbCopyAttributesToEntityViewNodeTest.java | 2 +- .../thingsboard/rule/engine/action/TbCreateAlarmNodeTest.java | 2 +- .../rule/engine/action/TbCreateRelationNodeTest.java | 2 +- .../rule/engine/action/TbDeleteRelationNodeTest.java | 2 +- .../thingsboard/rule/engine/action/TbDeviceStateNodeTest.java | 2 +- .../java/org/thingsboard/rule/engine/action/TbLogNodeTest.java | 2 +- .../org/thingsboard/rule/engine/action/TbMsgCountNodeTest.java | 2 +- .../engine/action/TbSaveToCustomCassandraTableNodeTest.java | 2 +- .../rule/engine/action/TbUnassignFromCustomerNodeTest.java | 2 +- .../test/java/org/thingsboard/rule/engine/ai/TbAiNodeTest.java | 2 +- .../rule/engine/aws/lambda/TbAwsLambdaNodeTest.java | 2 +- .../org/thingsboard/rule/engine/aws/sns/TbSnsNodeTest.java | 2 +- .../org/thingsboard/rule/engine/aws/sqs/TbSqsNodeTest.java | 2 +- .../rule/engine/credentials/CertPemCredentialsTest.java | 2 +- .../thingsboard/rule/engine/debug/TbMsgGeneratorNodeTest.java | 2 +- .../thingsboard/rule/engine/edge/TbMsgPushToEdgeNodeTest.java | 2 +- .../rule/engine/filter/TbAssetTypeSwitchNodeTest.java | 2 +- .../rule/engine/filter/TbCheckAlarmStatusNodeTest.java | 2 +- .../thingsboard/rule/engine/filter/TbCheckMessageNodeTest.java | 2 +- .../rule/engine/filter/TbCheckRelationNodeTest.java | 2 +- .../rule/engine/filter/TbDeviceTypeSwitchNodeTest.java | 2 +- .../org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java | 2 +- .../org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java | 2 +- .../rule/engine/filter/TbMsgTypeFilterNodeTest.java | 2 +- .../rule/engine/filter/TbMsgTypeSwitchNodeTest.java | 2 +- .../rule/engine/filter/TbOriginatorTypeFilterNodeTest.java | 2 +- .../rule/engine/filter/TbOriginatorTypeSwitchNodeTest.java | 2 +- .../java/org/thingsboard/rule/engine/flow/TbAckNodeTest.java | 2 +- .../org/thingsboard/rule/engine/flow/TbCheckpointNodeTest.java | 2 +- .../thingsboard/rule/engine/flow/TbRuleChainInputNodeTest.java | 2 +- .../rule/engine/flow/TbRuleChainOutputNodeTest.java | 2 +- .../thingsboard/rule/engine/gcp/pubsub/TbPubSubNodeTest.java | 2 +- .../test/java/org/thingsboard/rule/engine/geo/GeoUtilTest.java | 2 +- .../rule/engine/geo/GpsGeofencingActionTestCase.java | 2 +- .../rule/engine/geo/TbGpsGeofencingActionNodeTest.java | 2 +- .../rule/engine/geo/TbGpsGeofencingFilterNodeTest.java | 2 +- .../org/thingsboard/rule/engine/kafka/TbKafkaNodeTest.java | 2 +- .../org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java | 2 +- .../thingsboard/rule/engine/math/TbMathArgumentValueTest.java | 2 +- .../java/org/thingsboard/rule/engine/math/TbMathNodeTest.java | 2 +- .../rule/engine/metadata/CalculateDeltaNodeTest.java | 2 +- .../rule/engine/metadata/TbFetchDeviceCredentialsNodeTest.java | 2 +- .../rule/engine/metadata/TbGetAttributesNodeTest.java | 2 +- .../rule/engine/metadata/TbGetCustomerAttributeNodeTest.java | 2 +- .../rule/engine/metadata/TbGetCustomerDetailsNodeTest.java | 2 +- .../rule/engine/metadata/TbGetDeviceAttrNodeTest.java | 2 +- .../rule/engine/metadata/TbGetOriginatorFieldsNodeTest.java | 2 +- .../rule/engine/metadata/TbGetRelatedAttributeNodeTest.java | 2 +- .../rule/engine/metadata/TbGetTelemetryNodeTest.java | 2 +- .../rule/engine/metadata/TbGetTenantAttributeNodeTest.java | 2 +- .../rule/engine/metadata/TbGetTenantDetailsNodeTest.java | 2 +- .../java/org/thingsboard/rule/engine/mqtt/TbMqttNodeTest.java | 2 +- .../rule/engine/mqtt/azure/TbAzureIotHubNodeTest.java | 2 +- .../thingsboard/rule/engine/profile/AlarmRuleStateTest.java | 2 +- .../org/thingsboard/rule/engine/profile/AlarmStateTest.java | 2 +- .../org/thingsboard/rule/engine/profile/DeviceStateTest.java | 2 +- .../org/thingsboard/rule/engine/profile/ProfileStateTest.java | 2 +- .../rule/engine/profile/TbDeviceProfileNodeTest.java | 2 +- .../thingsboard/rule/engine/rabbitmq/TbRabbitMqNodeTest.java | 2 +- .../org/thingsboard/rule/engine/rest/TbHttpClientTest.java | 2 +- .../thingsboard/rule/engine/rest/TbRestApiCallNodeTest.java | 2 +- .../rule/engine/rest/TbSendRestApiCallReplyNodeTest.java | 2 +- .../thingsboard/rule/engine/rpc/TbSendRPCReplyNodeTest.java | 2 +- .../thingsboard/rule/engine/rpc/TbSendRPCRequestNodeTest.java | 2 +- .../rule/engine/telemetry/TbMsgAttributesNodeTest.java | 2 +- .../rule/engine/telemetry/TbMsgDeleteAttributesNodeTest.java | 2 +- .../rule/engine/telemetry/TbMsgTimeseriesNodeTest.java | 2 +- .../telemetry/strategy/DeduplicateProcessingStrategyTest.java | 2 +- .../strategy/OnEveryMessageProcessingStrategyTest.java | 2 +- .../rule/engine/telemetry/strategy/ProcessingStrategyTest.java | 2 +- .../engine/telemetry/strategy/SkipProcessingStrategyTest.java | 2 +- .../rule/engine/transform/TbChangeOriginatorNodeTest.java | 2 +- .../thingsboard/rule/engine/transform/TbCopyKeysNodeTest.java | 2 +- .../rule/engine/transform/TbDeleteKeysNodeTest.java | 2 +- .../thingsboard/rule/engine/transform/TbJsonPathNodeTest.java | 2 +- .../rule/engine/transform/TbMsgDeduplicationNodeTest.java | 2 +- .../rule/engine/transform/TbRenameKeysNodeTest.java | 2 +- .../rule/engine/transform/TbSplitArrayMsgNodeTest.java | 2 +- .../rule/engine/transform/TbTransformMsgNodeTest.java | 2 +- .../rule/engine/util/EntitiesFieldsAsyncLoaderTest.java | 2 +- .../engine/util/EntitiesRelatedDeviceIdAsyncLoaderTest.java | 2 +- .../engine/util/EntitiesRelatedEntityIdAsyncLoaderTest.java | 2 +- .../org/thingsboard/rule/engine/util/TenantIdLoaderTest.java | 2 +- tools/pom.xml | 2 +- .../main/java/org/thingsboard/client/tools/MqttSslClient.java | 2 +- .../org/thingsboard/client/tools/i18n/TranslationPruner.java | 2 +- .../thingsboard/client/tools/migrator/DictionaryParser.java | 2 +- .../org/thingsboard/client/tools/migrator/MigratorTool.java | 2 +- .../org/thingsboard/client/tools/migrator/PgCaMigrator.java | 2 +- .../client/tools/migrator/RelatedEntitiesParser.java | 2 +- .../org/thingsboard/client/tools/migrator/WriterBuilder.java | 2 +- tools/src/main/python/check_yml_file.py | 2 +- tools/src/main/python/mqtt-send-telemetry.py | 2 +- tools/src/main/python/one-way-ssl-mqtt-client.py | 2 +- tools/src/main/python/simple-mqtt-client.py | 2 +- tools/src/main/python/two-way-ssl-mqtt-client.py | 2 +- tools/src/main/shell/client.keygen.sh | 2 +- .../src/main/shell/lwm2m/lwM2M_cfssl_chain_clients_for_test.sh | 2 +- tools/src/main/shell/lwm2m/lwm2m_cfssl_chain_all_for_test.sh | 2 +- .../src/main/shell/lwm2m/lwm2m_cfssl_chain_server_for_test.sh | 2 +- tools/src/main/shell/server.keygen.sh | 2 +- transport/coap/pom.xml | 2 +- transport/coap/src/main/conf/logback.xml | 2 +- transport/coap/src/main/conf/tb-coap-transport.conf | 2 +- .../server/coap/ThingsboardCoapTransportApplication.java | 2 +- transport/coap/src/main/resources/logback.xml | 2 +- transport/coap/src/main/resources/tb-coap-transport.yml | 2 +- transport/http/pom.xml | 2 +- transport/http/src/main/conf/logback.xml | 2 +- transport/http/src/main/conf/tb-http-transport.conf | 2 +- .../server/http/ThingsboardHttpTransportApplication.java | 2 +- transport/http/src/main/resources/logback.xml | 2 +- transport/http/src/main/resources/tb-http-transport.yml | 2 +- transport/lwm2m/pom.xml | 2 +- transport/lwm2m/src/main/conf/logback.xml | 2 +- transport/lwm2m/src/main/conf/tb-lwm2m-transport.conf | 2 +- .../server/lwm2m/ThingsboardLwm2mTransportApplication.java | 2 +- transport/lwm2m/src/main/resources/logback.xml | 2 +- transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml | 2 +- transport/mqtt/pom.xml | 2 +- transport/mqtt/src/main/conf/logback.xml | 2 +- transport/mqtt/src/main/conf/tb-mqtt-transport.conf | 2 +- .../server/mqtt/ThingsboardMqttTransportApplication.java | 2 +- transport/mqtt/src/main/resources/logback.xml | 2 +- transport/mqtt/src/main/resources/tb-mqtt-transport.yml | 2 +- transport/pom.xml | 2 +- transport/snmp/pom.xml | 2 +- transport/snmp/src/main/conf/logback.xml | 2 +- transport/snmp/src/main/conf/tb-snmp-transport.conf | 2 +- .../server/snmp/ThingsboardSnmpTransportApplication.java | 2 +- transport/snmp/src/main/resources/logback.xml | 2 +- transport/snmp/src/main/resources/tb-snmp-transport.yml | 2 +- ui-ngx/.editorconfig | 2 +- ui-ngx/esbuild/tb-esbuild-plugins.ts | 2 +- ui-ngx/esbuild/tb-html-fallback-middleware.ts | 2 +- ui-ngx/generate-icon-metadata.js | 2 +- ui-ngx/generate-types.js | 2 +- ui-ngx/pom.xml | 2 +- ui-ngx/proxy.conf.js | 2 +- ui-ngx/src/app/app-routing.module.ts | 2 +- ui-ngx/src/app/app.component.html | 2 +- ui-ngx/src/app/app.component.scss | 2 +- ui-ngx/src/app/app.component.ts | 2 +- ui-ngx/src/app/app.module.ts | 2 +- ui-ngx/src/app/core/api/alarm-data-subscription.ts | 2 +- ui-ngx/src/app/core/api/alarm-data.service.ts | 2 +- ui-ngx/src/app/core/api/alias-controller.ts | 2 +- ui-ngx/src/app/core/api/data-aggregator.ts | 2 +- ui-ngx/src/app/core/api/entity-data-subscription.ts | 2 +- ui-ngx/src/app/core/api/entity-data.service.ts | 2 +- ui-ngx/src/app/core/api/public-api.ts | 2 +- ui-ngx/src/app/core/api/widget-api.models.ts | 2 +- ui-ngx/src/app/core/api/widget-subscription.ts | 2 +- ui-ngx/src/app/core/auth/auth.actions.ts | 2 +- ui-ngx/src/app/core/auth/auth.effects.ts | 2 +- ui-ngx/src/app/core/auth/auth.models.ts | 2 +- ui-ngx/src/app/core/auth/auth.reducer.ts | 2 +- ui-ngx/src/app/core/auth/auth.selectors.ts | 2 +- ui-ngx/src/app/core/auth/auth.service.spec.ts | 2 +- ui-ngx/src/app/core/auth/auth.service.ts | 2 +- ui-ngx/src/app/core/auth/public-api.ts | 2 +- ui-ngx/src/app/core/core.module.ts | 2 +- ui-ngx/src/app/core/core.state.ts | 2 +- ui-ngx/src/app/core/css/css.ts | 2 +- ui-ngx/src/app/core/guards/auth.guard.ts | 2 +- ui-ngx/src/app/core/guards/confirm-on-exit.guard.ts | 2 +- ui-ngx/src/app/core/http/admin.service.ts | 2 +- ui-ngx/src/app/core/http/ai-model.service.ts | 2 +- ui-ngx/src/app/core/http/alarm-comment.service.ts | 2 +- ui-ngx/src/app/core/http/alarm.service.ts | 2 +- ui-ngx/src/app/core/http/asset-profile.service.ts | 2 +- ui-ngx/src/app/core/http/asset.service.ts | 2 +- ui-ngx/src/app/core/http/attribute.service.ts | 2 +- ui-ngx/src/app/core/http/audit-log.service.ts | 2 +- ui-ngx/src/app/core/http/calculated-fields.service.ts | 2 +- ui-ngx/src/app/core/http/component-descriptor.service.ts | 2 +- ui-ngx/src/app/core/http/customer.service.ts | 2 +- ui-ngx/src/app/core/http/dashboard.service.ts | 2 +- ui-ngx/src/app/core/http/device-profile.service.ts | 2 +- ui-ngx/src/app/core/http/device.service.ts | 2 +- ui-ngx/src/app/core/http/domain.service.ts | 2 +- ui-ngx/src/app/core/http/edge.service.ts | 2 +- ui-ngx/src/app/core/http/entities-version-control.service.ts | 2 +- ui-ngx/src/app/core/http/entity-relation.service.ts | 2 +- ui-ngx/src/app/core/http/entity-view.service.ts | 2 +- ui-ngx/src/app/core/http/entity.service.ts | 2 +- ui-ngx/src/app/core/http/event.service.ts | 2 +- ui-ngx/src/app/core/http/git-hub.service.ts | 2 +- ui-ngx/src/app/core/http/http-utils.ts | 2 +- ui-ngx/src/app/core/http/image.service.ts | 2 +- ui-ngx/src/app/core/http/mobile-app.service.ts | 2 +- ui-ngx/src/app/core/http/mobile-application.service.ts | 2 +- ui-ngx/src/app/core/http/notification.service.ts | 2 +- ui-ngx/src/app/core/http/oauth2.service.ts | 2 +- ui-ngx/src/app/core/http/ota-package.service.ts | 2 +- ui-ngx/src/app/core/http/public-api.ts | 2 +- ui-ngx/src/app/core/http/queue.service.ts | 2 +- ui-ngx/src/app/core/http/resource.service.ts | 2 +- ui-ngx/src/app/core/http/rule-chain.service.ts | 2 +- ui-ngx/src/app/core/http/tenant-profile.service.ts | 2 +- ui-ngx/src/app/core/http/tenant.service.ts | 2 +- ui-ngx/src/app/core/http/trendz-settings.service.ts | 2 +- ui-ngx/src/app/core/http/two-factor-authentication.service.ts | 2 +- ui-ngx/src/app/core/http/ui-settings.service.ts | 2 +- ui-ngx/src/app/core/http/usage-info.service.ts | 2 +- ui-ngx/src/app/core/http/user-settings.service.ts | 2 +- ui-ngx/src/app/core/http/user.service.ts | 2 +- ui-ngx/src/app/core/http/widget.service.ts | 2 +- .../src/app/core/interceptors/entity-conflict.interceptor.ts | 2 +- ui-ngx/src/app/core/interceptors/global-http-interceptor.ts | 2 +- ui-ngx/src/app/core/interceptors/interceptor-config.ts | 2 +- ui-ngx/src/app/core/interceptors/interceptor-http-params.ts | 2 +- ui-ngx/src/app/core/interceptors/interceptor.util.ts | 2 +- ui-ngx/src/app/core/interceptors/load.actions.ts | 2 +- ui-ngx/src/app/core/interceptors/load.models.ts | 2 +- ui-ngx/src/app/core/interceptors/load.reducer.ts | 2 +- ui-ngx/src/app/core/interceptors/load.selectors.ts | 2 +- ui-ngx/src/app/core/local-storage/local-storage.service.ts | 2 +- ui-ngx/src/app/core/meta-reducers/debug.reducer.ts | 2 +- .../meta-reducers/init-state-from-local-storage.reducer.ts | 2 +- ui-ngx/src/app/core/notification/notification.actions.ts | 2 +- ui-ngx/src/app/core/notification/notification.effects.ts | 2 +- ui-ngx/src/app/core/notification/notification.models.ts | 2 +- ui-ngx/src/app/core/notification/notification.reducer.ts | 2 +- ui-ngx/src/app/core/operator/enterZone.ts | 2 +- ui-ngx/src/app/core/public-api.ts | 2 +- ui-ngx/src/app/core/services/active-component.service.ts | 2 +- ui-ngx/src/app/core/services/broadcast.models.ts | 2 +- ui-ngx/src/app/core/services/broadcast.service.ts | 2 +- ui-ngx/src/app/core/services/dashboard-utils.service.ts | 2 +- ui-ngx/src/app/core/services/dialog.service.ts | 2 +- .../src/app/core/services/dynamic-component-factory.service.ts | 2 +- ui-ngx/src/app/core/services/help.service.ts | 2 +- ui-ngx/src/app/core/services/item-buffer.service.ts | 2 +- ui-ngx/src/app/core/services/menu.models.ts | 2 +- ui-ngx/src/app/core/services/menu.service.ts | 2 +- ui-ngx/src/app/core/services/mobile.service.ts | 2 +- ui-ngx/src/app/core/services/public-api.ts | 2 +- ui-ngx/src/app/core/services/raf.service.ts | 2 +- ui-ngx/src/app/core/services/resources.service.ts | 2 +- .../src/app/core/services/script/node-script-test.service.ts | 2 +- ui-ngx/src/app/core/services/time.service.ts | 2 +- ui-ngx/src/app/core/services/title.service.ts | 2 +- ui-ngx/src/app/core/services/toast-notification.service.ts | 2 +- ui-ngx/src/app/core/services/unit.service.ts | 2 +- ui-ngx/src/app/core/services/utils.service.ts | 2 +- ui-ngx/src/app/core/services/window.service.ts | 2 +- ui-ngx/src/app/core/settings/settings.actions.ts | 2 +- ui-ngx/src/app/core/settings/settings.effects.ts | 2 +- ui-ngx/src/app/core/settings/settings.models.ts | 2 +- ui-ngx/src/app/core/settings/settings.reducer.ts | 2 +- ui-ngx/src/app/core/settings/settings.selectors.ts | 2 +- ui-ngx/src/app/core/settings/settings.utils.ts | 2 +- ui-ngx/src/app/core/translate/missing-translate-handler.ts | 2 +- ui-ngx/src/app/core/translate/translate-default-compiler.ts | 2 +- ui-ngx/src/app/core/translate/translate-default-loader.ts | 2 +- ui-ngx/src/app/core/translate/translate-default-parser.ts | 2 +- ui-ngx/src/app/core/utils.ts | 2 +- ui-ngx/src/app/core/ws/notification-websocket.service.ts | 2 +- ui-ngx/src/app/core/ws/public-api.ts | 2 +- ui-ngx/src/app/core/ws/telemetry-websocket.service.ts | 2 +- ui-ngx/src/app/core/ws/websocket.service.ts | 2 +- ui-ngx/src/app/modules/common/modules-map.models.ts | 2 +- ui-ngx/src/app/modules/common/modules-map.ts | 2 +- ui-ngx/src/app/modules/dashboard/dashboard-pages.module.ts | 2 +- .../app/modules/dashboard/dashboard-pages.routing.module.ts | 2 +- ui-ngx/src/app/modules/dashboard/dashboard-routing.module.ts | 2 +- .../home/components/ai-model/ai-model-dialog.component.html | 2 +- .../home/components/ai-model/ai-model-dialog.component.scss | 3 +-- .../home/components/ai-model/ai-model-dialog.component.ts | 2 +- .../ai-model/check-connectivity-dialog.component.html | 2 +- .../ai-model/check-connectivity-dialog.component.scss | 3 +-- .../components/ai-model/check-connectivity-dialog.component.ts | 2 +- .../home/components/alarm/alarm-assignee-panel.component.html | 2 +- .../home/components/alarm/alarm-assignee-panel.component.scss | 2 +- .../home/components/alarm/alarm-assignee-panel.component.ts | 2 +- .../components/alarm/alarm-assignee-select-panel.component.ts | 2 +- .../home/components/alarm/alarm-assignee-select.component.html | 2 +- .../home/components/alarm/alarm-assignee-select.component.ts | 2 +- .../home/components/alarm/alarm-assignee.component.html | 2 +- .../home/components/alarm/alarm-assignee.component.scss | 2 +- .../modules/home/components/alarm/alarm-assignee.component.ts | 2 +- .../home/components/alarm/alarm-comment-dialog.component.html | 2 +- .../home/components/alarm/alarm-comment-dialog.component.ts | 2 +- .../modules/home/components/alarm/alarm-comment.component.html | 2 +- .../modules/home/components/alarm/alarm-comment.component.scss | 2 +- .../modules/home/components/alarm/alarm-comment.component.ts | 2 +- .../home/components/alarm/alarm-details-dialog.component.html | 2 +- .../home/components/alarm/alarm-details-dialog.component.scss | 2 +- .../home/components/alarm/alarm-details-dialog.component.ts | 2 +- .../home/components/alarm/alarm-filter-config.component.html | 2 +- .../home/components/alarm/alarm-filter-config.component.scss | 3 +-- .../home/components/alarm/alarm-filter-config.component.ts | 2 +- .../app/modules/home/components/alarm/alarm-table-config.ts | 2 +- .../home/components/alarm/alarm-table-header.component.html | 2 +- .../home/components/alarm/alarm-table-header.component.scss | 2 +- .../home/components/alarm/alarm-table-header.component.ts | 2 +- .../modules/home/components/alarm/alarm-table.component.html | 2 +- .../modules/home/components/alarm/alarm-table.component.scss | 2 +- .../app/modules/home/components/alarm/alarm-table.component.ts | 2 +- .../alias/aliases-entity-autocomplete.component.html | 2 +- .../components/alias/aliases-entity-autocomplete.component.ts | 2 +- .../alias/aliases-entity-select-panel.component.html | 2 +- .../alias/aliases-entity-select-panel.component.scss | 2 +- .../components/alias/aliases-entity-select-panel.component.ts | 2 +- .../home/components/alias/aliases-entity-select.component.html | 2 +- .../home/components/alias/aliases-entity-select.component.scss | 2 +- .../home/components/alias/aliases-entity-select.component.ts | 2 +- .../home/components/alias/entity-alias-dialog.component.html | 2 +- .../home/components/alias/entity-alias-dialog.component.scss | 2 +- .../home/components/alias/entity-alias-dialog.component.ts | 2 +- .../home/components/alias/entity-aliases-dialog.component.html | 2 +- .../home/components/alias/entity-aliases-dialog.component.scss | 2 +- .../home/components/alias/entity-aliases-dialog.component.ts | 2 +- .../components/attribute/add-attribute-dialog.component.html | 2 +- .../components/attribute/add-attribute-dialog.component.ts | 2 +- .../attribute/add-widget-to-dashboard-dialog.component.html | 2 +- .../attribute/add-widget-to-dashboard-dialog.component.scss | 2 +- .../attribute/add-widget-to-dashboard-dialog.component.ts | 2 +- .../home/components/attribute/attribute-table.component.html | 2 +- .../home/components/attribute/attribute-table.component.scss | 2 +- .../home/components/attribute/attribute-table.component.ts | 2 +- .../attribute/delete-timeseries-panel.component.html | 2 +- .../attribute/delete-timeseries-panel.component.scss | 2 +- .../components/attribute/delete-timeseries-panel.component.ts | 2 +- .../attribute/edit-attribute-value-panel.component.html | 2 +- .../attribute/edit-attribute-value-panel.component.scss | 2 +- .../attribute/edit-attribute-value-panel.component.ts | 2 +- .../audit-log/audit-log-details-dialog.component.html | 2 +- .../audit-log/audit-log-details-dialog.component.scss | 2 +- .../components/audit-log/audit-log-details-dialog.component.ts | 2 +- .../home/components/audit-log/audit-log-table-config.ts | 2 +- .../home/components/audit-log/audit-log-table.component.html | 2 +- .../home/components/audit-log/audit-log-table.component.scss | 2 +- .../home/components/audit-log/audit-log-table.component.ts | 2 +- .../calculated-fields/calculated-fields-table-config.ts | 2 +- .../calculated-fields/calculated-fields-table.component.html | 2 +- .../calculated-fields/calculated-fields-table.component.scss | 2 +- .../calculated-fields/calculated-fields-table.component.ts | 2 +- .../calculated-field-arguments-table.component.html | 2 +- .../calculated-field-arguments-table.component.scss | 2 +- .../calculated-field-arguments-table.component.ts | 2 +- .../debug-dialog/calculated-field-debug-dialog.component.html | 2 +- .../debug-dialog/calculated-field-debug-dialog.component.scss | 2 +- .../debug-dialog/calculated-field-debug-dialog.component.ts | 2 +- .../components/dialog/calculated-field-dialog.component.html | 2 +- .../components/dialog/calculated-field-dialog.component.scss | 3 +-- .../components/dialog/calculated-field-dialog.component.ts | 2 +- .../panel/calculated-field-argument-panel.component.html | 2 +- .../panel/calculated-field-argument-panel.component.scss | 2 +- .../panel/calculated-field-argument-panel.component.ts | 2 +- .../home/components/calculated-fields/components/public-api.ts | 2 +- .../calculated-field-test-arguments.component.html | 2 +- .../calculated-field-test-arguments.component.scss | 2 +- .../calculated-field-test-arguments.component.ts | 2 +- .../calculated-field-script-test-dialog.component.html | 2 +- .../calculated-field-script-test-dialog.component.scss | 3 +-- .../calculated-field-script-test-dialog.component.ts | 2 +- .../components/dashboard-page/add-widget-dialog.component.html | 2 +- .../components/dashboard-page/add-widget-dialog.component.scss | 2 +- .../components/dashboard-page/add-widget-dialog.component.ts | 2 +- .../dashboard-page/dashboard-image-dialog.component.html | 2 +- .../dashboard-page/dashboard-image-dialog.component.scss | 2 +- .../dashboard-page/dashboard-image-dialog.component.ts | 2 +- .../components/dashboard-page/dashboard-page.component.html | 2 +- .../components/dashboard-page/dashboard-page.component.scss | 2 +- .../home/components/dashboard-page/dashboard-page.component.ts | 2 +- .../home/components/dashboard-page/dashboard-page.models.ts | 2 +- .../dashboard-page/dashboard-settings-dialog.component.html | 2 +- .../dashboard-page/dashboard-settings-dialog.component.scss | 2 +- .../dashboard-page/dashboard-settings-dialog.component.ts | 2 +- .../components/dashboard-page/dashboard-state.component.html | 2 +- .../components/dashboard-page/dashboard-state.component.scss | 2 +- .../components/dashboard-page/dashboard-state.component.ts | 2 +- .../components/dashboard-page/dashboard-toolbar.component.html | 2 +- .../components/dashboard-page/dashboard-toolbar.component.scss | 2 +- .../components/dashboard-page/dashboard-toolbar.component.ts | 2 +- .../dashboard-page/dashboard-widget-select.component.html | 2 +- .../dashboard-page/dashboard-widget-select.component.scss | 2 +- .../dashboard-page/dashboard-widget-select.component.ts | 2 +- .../home/components/dashboard-page/edit-widget.component.html | 2 +- .../home/components/dashboard-page/edit-widget.component.scss | 2 +- .../home/components/dashboard-page/edit-widget.component.ts | 2 +- .../layout/add-new-breakpoint-dialog.component.html | 2 +- .../layout/add-new-breakpoint-dialog.component.ts | 2 +- .../dashboard-page/layout/dashboard-layout.component.html | 2 +- .../dashboard-page/layout/dashboard-layout.component.scss | 2 +- .../dashboard-page/layout/dashboard-layout.component.ts | 2 +- .../home/components/dashboard-page/layout/layout.models.ts | 2 +- .../layout/manage-dashboard-layouts-dialog.component.html | 2 +- .../layout/manage-dashboard-layouts-dialog.component.scss | 2 +- .../layout/manage-dashboard-layouts-dialog.component.ts | 2 +- .../dashboard-page/layout/move-widgets-dialog.component.html | 2 +- .../dashboard-page/layout/move-widgets-dialog.component.ts | 2 +- .../layout/select-dashboard-breakpoint.component.html | 2 +- .../layout/select-dashboard-breakpoint.component.scss | 2 +- .../layout/select-dashboard-breakpoint.component.ts | 2 +- .../states/dashboard-state-dialog.component.html | 2 +- .../dashboard-page/states/dashboard-state-dialog.component.ts | 2 +- .../states/default-state-controller.component.html | 2 +- .../states/default-state-controller.component.scss | 2 +- .../states/default-state-controller.component.ts | 2 +- .../states/entity-state-controller.component.html | 2 +- .../states/entity-state-controller.component.scss | 2 +- .../dashboard-page/states/entity-state-controller.component.ts | 2 +- .../states/manage-dashboard-states-dialog.component.html | 2 +- .../states/manage-dashboard-states-dialog.component.models.ts | 2 +- .../states/manage-dashboard-states-dialog.component.scss | 2 +- .../states/manage-dashboard-states-dialog.component.ts | 2 +- .../dashboard-page/states/state-controller.component.ts | 2 +- .../dashboard-page/states/state-controller.models.ts | 2 +- .../dashboard-page/states/states-component.directive.ts | 2 +- .../dashboard-page/states/states-controller.module.ts | 2 +- .../dashboard-page/states/states-controller.service.ts | 2 +- .../dashboard-page/widget-types-panel.component.html | 2 +- .../dashboard-page/widget-types-panel.component.scss | 2 +- .../components/dashboard-page/widget-types-panel.component.ts | 2 +- .../components/dashboard-view/dashboard-view.component.html | 2 +- .../components/dashboard-view/dashboard-view.component.scss | 2 +- .../home/components/dashboard-view/dashboard-view.component.ts | 2 +- .../modules/home/components/dashboard/dashboard.component.html | 2 +- .../modules/home/components/dashboard/dashboard.component.scss | 2 +- .../modules/home/components/dashboard/dashboard.component.ts | 2 +- .../app/modules/home/components/dashboard/layout-button.scss | 2 +- .../dashboard/select-target-layout-dialog.component.html | 2 +- .../dashboard/select-target-layout-dialog.component.ts | 2 +- .../dashboard/select-target-state-dialog.component.html | 2 +- .../dashboard/select-target-state-dialog.component.ts | 2 +- .../app/modules/home/components/details-panel.component.html | 2 +- .../app/modules/home/components/details-panel.component.scss | 2 +- .../src/app/modules/home/components/details-panel.component.ts | 2 +- .../components/device/copy-device-credentials.component.html | 2 +- .../components/device/copy-device-credentials.component.ts | 2 +- .../device/device-credentials-lwm2m-server.component.html | 2 +- .../device/device-credentials-lwm2m-server.component.ts | 2 +- .../components/device/device-credentials-lwm2m.component.html | 2 +- .../components/device/device-credentials-lwm2m.component.scss | 2 +- .../components/device/device-credentials-lwm2m.component.ts | 2 +- .../device/device-credentials-mqtt-basic.component.html | 2 +- .../device/device-credentials-mqtt-basic.component.ts | 2 +- .../home/components/device/device-credentials.component.html | 2 +- .../home/components/device/device-credentials.component.scss | 2 +- .../home/components/device/device-credentials.component.ts | 2 +- .../home/components/device/device-credentials.module.ts | 2 +- .../home/components/device/device-info-filter.component.html | 2 +- .../home/components/device/device-info-filter.component.scss | 2 +- .../home/components/device/device-info-filter.component.ts | 2 +- .../modules/home/components/edge/edge-downlink-table-config.ts | 2 +- .../components/edge/edge-downlink-table-header.component.html | 2 +- .../components/edge/edge-downlink-table-header.component.scss | 2 +- .../components/edge/edge-downlink-table-header.component.ts | 2 +- .../home/components/edge/edge-downlink-table.component.html | 2 +- .../home/components/edge/edge-downlink-table.component.scss | 2 +- .../home/components/edge/edge-downlink-table.component.ts | 2 +- .../home/components/entity/add-entity-dialog.component.html | 2 +- .../home/components/entity/add-entity-dialog.component.scss | 2 +- .../home/components/entity/add-entity-dialog.component.ts | 2 +- .../modules/home/components/entity/contact-based.component.ts | 2 +- .../entity/debug/entity-debug-settings-button.component.html | 2 +- .../entity/debug/entity-debug-settings-button.component.ts | 2 +- .../entity/debug/entity-debug-settings-panel.component.html | 2 +- .../entity/debug/entity-debug-settings-panel.component.ts | 2 +- .../components/entity/debug/entity-debug-settings.model.ts | 2 +- .../components/entity/debug/entity-debug-settings.service.ts | 2 +- .../home/components/entity/entities-table.component.html | 2 +- .../home/components/entity/entities-table.component.scss | 2 +- .../modules/home/components/entity/entities-table.component.ts | 2 +- .../modules/home/components/entity/entity-chips.component.html | 2 +- .../modules/home/components/entity/entity-chips.component.scss | 2 +- .../modules/home/components/entity/entity-chips.component.ts | 2 +- .../home/components/entity/entity-details-page.component.html | 2 +- .../home/components/entity/entity-details-page.component.scss | 2 +- .../home/components/entity/entity-details-page.component.ts | 2 +- .../home/components/entity/entity-details-panel.component.html | 2 +- .../home/components/entity/entity-details-panel.component.scss | 2 +- .../home/components/entity/entity-details-panel.component.ts | 2 +- .../home/components/entity/entity-filter-view.component.html | 2 +- .../home/components/entity/entity-filter-view.component.scss | 2 +- .../home/components/entity/entity-filter-view.component.ts | 2 +- .../home/components/entity/entity-filter.component.html | 2 +- .../home/components/entity/entity-filter.component.scss | 2 +- .../modules/home/components/entity/entity-filter.component.ts | 2 +- .../home/components/entity/entity-table-header.component.ts | 2 +- .../modules/home/components/entity/entity-tabs.component.ts | 2 +- .../src/app/modules/home/components/entity/entity.component.ts | 2 +- .../home/components/event/event-content-dialog.component.html | 2 +- .../home/components/event/event-content-dialog.component.scss | 2 +- .../home/components/event/event-content-dialog.component.ts | 2 +- .../home/components/event/event-filter-panel.component.html | 2 +- .../home/components/event/event-filter-panel.component.scss | 2 +- .../home/components/event/event-filter-panel.component.ts | 2 +- .../app/modules/home/components/event/event-table-config.ts | 2 +- .../home/components/event/event-table-header.component.html | 2 +- .../home/components/event/event-table-header.component.scss | 2 +- .../home/components/event/event-table-header.component.ts | 2 +- .../modules/home/components/event/event-table.component.html | 2 +- .../modules/home/components/event/event-table.component.scss | 2 +- .../app/modules/home/components/event/event-table.component.ts | 2 +- .../components/filter/boolean-filter-predicate.component.html | 2 +- .../components/filter/boolean-filter-predicate.component.ts | 2 +- .../filter/complex-filter-predicate-dialog.component.html | 2 +- .../filter/complex-filter-predicate-dialog.component.ts | 2 +- .../components/filter/complex-filter-predicate.component.html | 2 +- .../components/filter/complex-filter-predicate.component.ts | 2 +- .../modules/home/components/filter/filter-component.models.ts | 2 +- .../home/components/filter/filter-dialog.component.html | 2 +- .../home/components/filter/filter-dialog.component.scss | 2 +- .../modules/home/components/filter/filter-dialog.component.ts | 2 +- .../components/filter/filter-predicate-list.component.html | 2 +- .../components/filter/filter-predicate-list.component.scss | 2 +- .../home/components/filter/filter-predicate-list.component.ts | 2 +- .../components/filter/filter-predicate-value.component.html | 2 +- .../home/components/filter/filter-predicate-value.component.ts | 2 +- .../home/components/filter/filter-predicate.component.html | 2 +- .../home/components/filter/filter-predicate.component.ts | 2 +- .../app/modules/home/components/filter/filter-predicate.scss | 2 +- .../modules/home/components/filter/filter-text.component.html | 2 +- .../modules/home/components/filter/filter-text.component.scss | 2 +- .../modules/home/components/filter/filter-text.component.ts | 2 +- .../components/filter/filter-user-info-dialog.component.html | 2 +- .../components/filter/filter-user-info-dialog.component.ts | 2 +- .../home/components/filter/filter-user-info.component.html | 2 +- .../home/components/filter/filter-user-info.component.ts | 2 +- .../home/components/filter/filters-dialog.component.html | 2 +- .../home/components/filter/filters-dialog.component.scss | 2 +- .../modules/home/components/filter/filters-dialog.component.ts | 2 +- .../home/components/filter/filters-edit-panel.component.html | 2 +- .../home/components/filter/filters-edit-panel.component.scss | 2 +- .../home/components/filter/filters-edit-panel.component.ts | 2 +- .../modules/home/components/filter/filters-edit.component.html | 2 +- .../modules/home/components/filter/filters-edit.component.scss | 2 +- .../modules/home/components/filter/filters-edit.component.ts | 2 +- .../home/components/filter/key-filter-dialog.component.html | 2 +- .../home/components/filter/key-filter-dialog.component.scss | 2 +- .../home/components/filter/key-filter-dialog.component.ts | 2 +- .../home/components/filter/key-filter-list.component.html | 2 +- .../home/components/filter/key-filter-list.component.scss | 2 +- .../home/components/filter/key-filter-list.component.ts | 2 +- .../components/filter/numeric-filter-predicate.component.html | 2 +- .../components/filter/numeric-filter-predicate.component.ts | 2 +- .../components/filter/string-filter-predicate.component.html | 2 +- .../components/filter/string-filter-predicate.component.ts | 2 +- .../home/components/filter/user-filter-dialog.component.html | 2 +- .../home/components/filter/user-filter-dialog.component.scss | 2 +- .../home/components/filter/user-filter-dialog.component.ts | 2 +- .../home/components/github-badge/github-badge.component.html | 2 +- .../home/components/github-badge/github-badge.component.scss | 2 +- .../home/components/github-badge/github-badge.component.ts | 2 +- .../src/app/modules/home/components/home-components.module.ts | 2 +- .../components/notification/notification-bell.component.html | 2 +- .../components/notification/notification-bell.component.ts | 2 +- .../notification/send-notification-button.component.html | 2 +- .../notification/send-notification-button.component.ts | 2 +- .../notification/show-notification-popover.component.html | 2 +- .../notification/show-notification-popover.component.scss | 2 +- .../notification/show-notification-popover.component.ts | 2 +- .../profile/add-device-profile-dialog.component.html | 2 +- .../profile/add-device-profile-dialog.component.scss | 2 +- .../components/profile/add-device-profile-dialog.component.ts | 2 +- .../alarm/alarm-duration-predicate-value.component.html | 2 +- .../profile/alarm/alarm-duration-predicate-value.component.ts | 2 +- .../profile/alarm/alarm-dynamic-value.component.html | 2 +- .../components/profile/alarm/alarm-dynamic-value.component.ts | 2 +- .../profile/alarm/alarm-rule-condition-dialog.component.html | 2 +- .../profile/alarm/alarm-rule-condition-dialog.component.scss | 2 +- .../profile/alarm/alarm-rule-condition-dialog.component.ts | 2 +- .../profile/alarm/alarm-rule-condition.component.html | 2 +- .../profile/alarm/alarm-rule-condition.component.scss | 2 +- .../components/profile/alarm/alarm-rule-condition.component.ts | 2 +- .../home/components/profile/alarm/alarm-rule.component.html | 2 +- .../home/components/profile/alarm/alarm-rule.component.scss | 2 +- .../home/components/profile/alarm/alarm-rule.component.ts | 2 +- .../profile/alarm/alarm-schedule-dialog.component.html | 2 +- .../profile/alarm/alarm-schedule-dialog.component.ts | 2 +- .../profile/alarm/alarm-schedule-info.component.html | 2 +- .../profile/alarm/alarm-schedule-info.component.scss | 2 +- .../components/profile/alarm/alarm-schedule-info.component.ts | 2 +- .../components/profile/alarm/alarm-schedule.component.html | 2 +- .../components/profile/alarm/alarm-schedule.component.scss | 2 +- .../home/components/profile/alarm/alarm-schedule.component.ts | 2 +- .../components/profile/alarm/create-alarm-rules.component.html | 2 +- .../components/profile/alarm/create-alarm-rules.component.scss | 2 +- .../components/profile/alarm/create-alarm-rules.component.ts | 2 +- .../profile/alarm/device-profile-alarm.component.html | 2 +- .../profile/alarm/device-profile-alarm.component.scss | 2 +- .../components/profile/alarm/device-profile-alarm.component.ts | 2 +- .../profile/alarm/device-profile-alarms.component.html | 2 +- .../profile/alarm/device-profile-alarms.component.scss | 2 +- .../profile/alarm/device-profile-alarms.component.ts | 2 +- .../profile/alarm/edit-alarm-details-dialog.component.html | 2 +- .../profile/alarm/edit-alarm-details-dialog.component.ts | 2 +- .../profile/asset-profile-autocomplete.component.html | 2 +- .../profile/asset-profile-autocomplete.component.scss | 2 +- .../components/profile/asset-profile-autocomplete.component.ts | 2 +- .../components/profile/asset-profile-dialog.component.html | 2 +- .../home/components/profile/asset-profile-dialog.component.ts | 2 +- .../home/components/profile/asset-profile.component.html | 2 +- .../modules/home/components/profile/asset-profile.component.ts | 2 +- .../profile/device-profile-autocomplete.component.html | 2 +- .../profile/device-profile-autocomplete.component.scss | 2 +- .../profile/device-profile-autocomplete.component.ts | 2 +- .../components/profile/device-profile-dialog.component.html | 2 +- .../home/components/profile/device-profile-dialog.component.ts | 2 +- .../device-profile-provision-configuration.component.html | 2 +- .../device-profile-provision-configuration.component.ts | 2 +- .../home/components/profile/device-profile.component.html | 2 +- .../home/components/profile/device-profile.component.ts | 2 +- .../coap-device-profile-transport-configuration.component.html | 2 +- .../coap-device-profile-transport-configuration.component.scss | 2 +- .../coap-device-profile-transport-configuration.component.ts | 2 +- .../profile/device/common/device-profile-common.module.ts | 2 +- .../profile/device/common/power-mode-setting.component.html | 2 +- .../profile/device/common/power-mode-setting.component.ts | 2 +- .../profile/device/common/time-unit-select.component.html | 2 +- .../profile/device/common/time-unit-select.component.ts | 2 +- .../device/default-device-profile-configuration.component.html | 2 +- .../device/default-device-profile-configuration.component.ts | 2 +- ...fault-device-profile-transport-configuration.component.html | 2 +- ...default-device-profile-transport-configuration.component.ts | 2 +- .../profile/device/device-profile-configuration.component.html | 2 +- .../profile/device/device-profile-configuration.component.ts | 2 +- .../device-profile-transport-configuration.component.html | 2 +- .../device/device-profile-transport-configuration.component.ts | 2 +- .../device/lwm2m/lwm2m-attributes-dialog.component.html | 2 +- .../profile/device/lwm2m/lwm2m-attributes-dialog.component.ts | 2 +- .../device/lwm2m/lwm2m-attributes-key-list.component.html | 2 +- .../device/lwm2m/lwm2m-attributes-key-list.component.scss | 2 +- .../device/lwm2m/lwm2m-attributes-key-list.component.ts | 2 +- .../profile/device/lwm2m/lwm2m-attributes.component.html | 2 +- .../profile/device/lwm2m/lwm2m-attributes.component.ts | 2 +- .../lwm2m-bootstrap-add-config-server-dialog.component.html | 2 +- .../lwm2m-bootstrap-add-config-server-dialog.component.ts | 2 +- .../device/lwm2m/lwm2m-bootstrap-config-servers.component.html | 2 +- .../device/lwm2m/lwm2m-bootstrap-config-servers.component.ts | 2 +- .../device/lwm2m/lwm2m-device-config-server.component.html | 2 +- .../device/lwm2m/lwm2m-device-config-server.component.ts | 2 +- ...lwm2m-device-profile-transport-configuration.component.html | 2 +- ...lwm2m-device-profile-transport-configuration.component.scss | 2 +- .../lwm2m-device-profile-transport-configuration.component.ts | 2 +- .../lwm2m/lwm2m-object-add-instances-dialog.component.html | 2 +- .../lwm2m/lwm2m-object-add-instances-dialog.component.ts | 2 +- .../lwm2m/lwm2m-object-add-instances-list.component.html | 2 +- .../device/lwm2m/lwm2m-object-add-instances-list.component.ts | 2 +- .../profile/device/lwm2m/lwm2m-object-list.component.html | 2 +- .../profile/device/lwm2m/lwm2m-object-list.component.ts | 2 +- .../lwm2m-observe-attr-telemetry-instances.component.html | 2 +- .../lwm2m-observe-attr-telemetry-instances.component.scss | 2 +- .../lwm2m/lwm2m-observe-attr-telemetry-instances.component.ts | 2 +- .../lwm2m-observe-attr-telemetry-resources.component.html | 2 +- .../lwm2m-observe-attr-telemetry-resources.component.scss | 2 +- .../lwm2m/lwm2m-observe-attr-telemetry-resources.component.ts | 2 +- .../device/lwm2m/lwm2m-observe-attr-telemetry.component.html | 2 +- .../device/lwm2m/lwm2m-observe-attr-telemetry.component.scss | 2 +- .../device/lwm2m/lwm2m-observe-attr-telemetry.component.ts | 2 +- .../profile/device/lwm2m/lwm2m-profile-components.module.ts | 2 +- .../profile/device/lwm2m/lwm2m-profile-config.models.ts | 2 +- .../mqtt-device-profile-transport-configuration.component.html | 2 +- .../mqtt-device-profile-transport-configuration.component.scss | 2 +- .../mqtt-device-profile-transport-configuration.component.ts | 2 +- .../snmp-device-profile-communication-config.component.html | 2 +- .../snmp-device-profile-communication-config.component.scss | 2 +- .../snmp/snmp-device-profile-communication-config.component.ts | 2 +- .../device/snmp/snmp-device-profile-mapping.component.html | 2 +- .../device/snmp/snmp-device-profile-mapping.component.scss | 2 +- .../device/snmp/snmp-device-profile-mapping.component.ts | 2 +- .../snmp-device-profile-transport-configuration.component.html | 2 +- .../snmp-device-profile-transport-configuration.component.ts | 2 +- .../device/snmp/snmp-device-profile-transport.module.ts | 2 +- .../profile/queue/tenant-profile-queues.component.html | 2 +- .../profile/queue/tenant-profile-queues.component.scss | 2 +- .../profile/queue/tenant-profile-queues.component.ts | 2 +- .../profile/tenant-profile-autocomplete.component.html | 2 +- .../profile/tenant-profile-autocomplete.component.scss | 2 +- .../profile/tenant-profile-autocomplete.component.ts | 2 +- .../home/components/profile/tenant-profile-data.component.html | 2 +- .../home/components/profile/tenant-profile-data.component.ts | 2 +- .../components/profile/tenant-profile-dialog.component.html | 2 +- .../components/profile/tenant-profile-dialog.component.scss | 2 +- .../home/components/profile/tenant-profile-dialog.component.ts | 2 +- .../home/components/profile/tenant-profile.component.html | 2 +- .../home/components/profile/tenant-profile.component.scss | 2 +- .../home/components/profile/tenant-profile.component.ts | 2 +- .../tenant/default-tenant-profile-configuration.component.html | 2 +- .../tenant/default-tenant-profile-configuration.component.scss | 2 +- .../tenant/default-tenant-profile-configuration.component.ts | 2 +- .../rate-limits/rate-limits-details-dialog.component.html | 2 +- .../tenant/rate-limits/rate-limits-details-dialog.component.ts | 2 +- .../profile/tenant/rate-limits/rate-limits-list.component.html | 2 +- .../profile/tenant/rate-limits/rate-limits-list.component.scss | 2 +- .../profile/tenant/rate-limits/rate-limits-list.component.ts | 2 +- .../profile/tenant/rate-limits/rate-limits-text.component.html | 2 +- .../profile/tenant/rate-limits/rate-limits-text.component.scss | 2 +- .../profile/tenant/rate-limits/rate-limits-text.component.ts | 2 +- .../profile/tenant/rate-limits/rate-limits.component.html | 2 +- .../profile/tenant/rate-limits/rate-limits.component.scss | 2 +- .../profile/tenant/rate-limits/rate-limits.component.ts | 2 +- .../profile/tenant/rate-limits/rate-limits.models.ts | 2 +- .../profile/tenant/tenant-profile-configuration.component.html | 2 +- .../profile/tenant/tenant-profile-configuration.component.ts | 2 +- ui-ngx/src/app/modules/home/components/public-api.ts | 2 +- .../modules/home/components/queue/queue-form.component.html | 2 +- .../modules/home/components/queue/queue-form.component.scss | 2 +- .../app/modules/home/components/queue/queue-form.component.ts | 2 +- .../home/components/relation/relation-dialog.component.html | 2 +- .../home/components/relation/relation-dialog.component.scss | 2 +- .../home/components/relation/relation-dialog.component.ts | 2 +- .../home/components/relation/relation-filters.component.html | 2 +- .../home/components/relation/relation-filters.component.scss | 2 +- .../home/components/relation/relation-filters.component.ts | 2 +- .../home/components/relation/relation-table.component.html | 2 +- .../home/components/relation/relation-table.component.scss | 2 +- .../home/components/relation/relation-table.component.ts | 2 +- .../home/components/resources/resources-dialog.component.html | 2 +- .../home/components/resources/resources-dialog.component.scss | 3 +-- .../home/components/resources/resources-dialog.component.ts | 2 +- .../home/components/resources/resources-library.component.html | 2 +- .../home/components/resources/resources-library.component.ts | 2 +- .../src/app/modules/home/components/router-tabs.component.html | 2 +- .../src/app/modules/home/components/router-tabs.component.scss | 2 +- .../src/app/modules/home/components/router-tabs.component.ts | 2 +- .../rule-chain/rule-chain-autocomplete.component.html | 2 +- .../components/rule-chain/rule-chain-autocomplete.component.ts | 2 +- .../rule-node/action/action-rule-node-config.module.ts | 2 +- .../action/advanced-processing-setting-row.component.html | 2 +- .../action/advanced-processing-setting-row.component.ts | 2 +- .../action/advanced-processing-setting.component.html | 2 +- .../rule-node/action/advanced-processing-setting.component.ts | 2 +- .../rule-node/action/assign-customer-config.component.html | 2 +- .../rule-node/action/assign-customer-config.component.ts | 2 +- .../rule-node/action/attributes-config.component.html | 2 +- .../components/rule-node/action/attributes-config.component.ts | 2 +- .../components/rule-node/action/attributes-config.model.ts | 2 +- .../rule-node/action/clear-alarm-config.component.html | 2 +- .../rule-node/action/clear-alarm-config.component.ts | 2 +- .../rule-node/action/create-alarm-config.component.html | 2 +- .../rule-node/action/create-alarm-config.component.ts | 2 +- .../rule-node/action/create-relation-config.component.html | 2 +- .../rule-node/action/create-relation-config.component.ts | 2 +- .../rule-node/action/delete-attributes-config.component.html | 2 +- .../rule-node/action/delete-attributes-config.component.ts | 2 +- .../rule-node/action/delete-relation-config.component.html | 2 +- .../rule-node/action/delete-relation-config.component.ts | 2 +- .../rule-node/action/device-profile-config.component.html | 2 +- .../rule-node/action/device-profile-config.component.ts | 2 +- .../rule-node/action/device-state-config.component.html | 2 +- .../rule-node/action/device-state-config.component.ts | 2 +- .../rule-node/action/generator-config.component.html | 2 +- .../rule-node/action/generator-config.component.scss | 2 +- .../components/rule-node/action/generator-config.component.ts | 2 +- .../rule-node/action/gps-geo-action-config.component.html | 2 +- .../rule-node/action/gps-geo-action-config.component.scss | 2 +- .../rule-node/action/gps-geo-action-config.component.ts | 2 +- .../home/components/rule-node/action/log-config.component.html | 2 +- .../home/components/rule-node/action/log-config.component.ts | 2 +- .../rule-node/action/math-function-config.component.html | 2 +- .../rule-node/action/math-function-config.component.scss | 2 +- .../rule-node/action/math-function-config.component.ts | 2 +- .../rule-node/action/msg-count-config.component.html | 2 +- .../components/rule-node/action/msg-count-config.component.ts | 2 +- .../rule-node/action/msg-delay-config.component.html | 2 +- .../components/rule-node/action/msg-delay-config.component.ts | 2 +- .../rule-node/action/push-to-cloud-config.component.html | 2 +- .../rule-node/action/push-to-cloud-config.component.ts | 2 +- .../rule-node/action/push-to-edge-config.component.html | 2 +- .../rule-node/action/push-to-edge-config.component.ts | 2 +- .../rule-node/action/rpc-reply-config.component.html | 2 +- .../components/rule-node/action/rpc-reply-config.component.ts | 2 +- .../rule-node/action/rpc-request-config.component.html | 2 +- .../rule-node/action/rpc-request-config.component.ts | 2 +- .../action/save-to-custom-table-config.component.html | 2 +- .../rule-node/action/save-to-custom-table-config.component.ts | 2 +- .../action/send-rest-api-call-reply-config.component.html | 2 +- .../action/send-rest-api-call-reply-config.component.ts | 2 +- .../rule-node/action/timeseries-config.component.html | 2 +- .../components/rule-node/action/timeseries-config.component.ts | 2 +- .../components/rule-node/action/timeseries-config.models.ts | 2 +- .../rule-node/action/unassign-customer-config.component.html | 2 +- .../rule-node/action/unassign-customer-config.component.ts | 2 +- .../rule-node/common/alarm-status-select.component.html | 2 +- .../rule-node/common/alarm-status-select.component.scss | 2 +- .../rule-node/common/alarm-status-select.component.ts | 2 +- .../rule-node/common/arguments-map-config.component.html | 2 +- .../rule-node/common/arguments-map-config.component.scss | 2 +- .../rule-node/common/arguments-map-config.component.ts | 2 +- .../rule-node/common/common-rule-node-config.module.ts | 2 +- .../rule-node/common/credentials-config.component.html | 2 +- .../rule-node/common/credentials-config.component.ts | 2 +- .../common/device-relations-query-config.component.html | 2 +- .../common/device-relations-query-config.component.scss | 2 +- .../common/device-relations-query-config.component.ts | 2 +- .../components/rule-node/common/example-hint.component.html | 2 +- .../home/components/rule-node/common/example-hint.component.ts | 2 +- .../rule-node/common/kv-map-config-old.component.html | 2 +- .../rule-node/common/kv-map-config-old.component.scss | 2 +- .../components/rule-node/common/kv-map-config-old.component.ts | 2 +- .../components/rule-node/common/kv-map-config.component.html | 2 +- .../components/rule-node/common/kv-map-config.component.scss | 2 +- .../components/rule-node/common/kv-map-config.component.ts | 2 +- .../rule-node/common/math-function-autocomplete.component.html | 2 +- .../rule-node/common/math-function-autocomplete.component.ts | 2 +- .../rule-node/common/message-types-config.component.html | 2 +- .../rule-node/common/message-types-config.component.ts | 2 +- .../rule-node/common/msg-metadata-chip.component.html | 2 +- .../components/rule-node/common/msg-metadata-chip.component.ts | 2 +- .../common/output-message-type-autocomplete.component.html | 2 +- .../common/output-message-type-autocomplete.component.ts | 2 +- .../rule-node/common/relations-query-config-old.component.html | 2 +- .../rule-node/common/relations-query-config-old.component.ts | 2 +- .../rule-node/common/relations-query-config.component.html | 2 +- .../rule-node/common/relations-query-config.component.ts | 2 +- .../rule-node/common/select-attributes.component.html | 2 +- .../components/rule-node/common/select-attributes.component.ts | 2 +- .../components/rule-node/common/sv-map-config.component.html | 2 +- .../components/rule-node/common/sv-map-config.component.scss | 2 +- .../components/rule-node/common/sv-map-config.component.ts | 2 +- .../components/rule-node/common/time-unit-input.component.html | 2 +- .../components/rule-node/common/time-unit-input.component.ts | 2 +- .../home/components/rule-node/empty-config.component.ts | 2 +- .../rule-node/enrichment/calculate-delta-config.component.html | 2 +- .../rule-node/enrichment/calculate-delta-config.component.ts | 2 +- .../enrichment/customer-attributes-config.component.html | 2 +- .../enrichment/customer-attributes-config.component.scss | 2 +- .../enrichment/customer-attributes-config.component.ts | 2 +- .../enrichment/device-attributes-config.component.html | 2 +- .../rule-node/enrichment/device-attributes-config.component.ts | 2 +- .../rule-node/enrichment/enrichment-rule-node-core.module.ts | 2 +- .../rule-node/enrichment/entity-details-config.component.html | 2 +- .../rule-node/enrichment/entity-details-config.component.ts | 2 +- .../enrichment/fetch-device-credentials-config.component.html | 2 +- .../enrichment/fetch-device-credentials-config.component.ts | 2 +- .../get-telemetry-from-database-config.component.html | 2 +- .../get-telemetry-from-database-config.component.scss | 2 +- .../enrichment/get-telemetry-from-database-config.component.ts | 2 +- .../enrichment/originator-attributes-config.component.html | 2 +- .../enrichment/originator-attributes-config.component.ts | 2 +- .../enrichment/originator-fields-config.component.html | 2 +- .../rule-node/enrichment/originator-fields-config.component.ts | 2 +- .../enrichment/related-attributes-config.component.html | 2 +- .../enrichment/related-attributes-config.component.ts | 2 +- .../enrichment/tenant-attributes-config.component.html | 2 +- .../enrichment/tenant-attributes-config.component.scss | 2 +- .../rule-node/enrichment/tenant-attributes-config.component.ts | 2 +- .../components/rule-node/external/ai-config.component.html | 2 +- .../home/components/rule-node/external/ai-config.component.ts | 2 +- .../rule-node/external/azure-iot-hub-config.component.html | 2 +- .../rule-node/external/azure-iot-hub-config.component.ts | 2 +- .../rule-node/external/external-rule-node-config.module.ts | 2 +- .../components/rule-node/external/kafka-config.component.html | 2 +- .../components/rule-node/external/kafka-config.component.ts | 2 +- .../components/rule-node/external/lambda-config.component.html | 2 +- .../components/rule-node/external/lambda-config.component.ts | 2 +- .../components/rule-node/external/mqtt-config.component.html | 2 +- .../components/rule-node/external/mqtt-config.component.scss | 2 +- .../components/rule-node/external/mqtt-config.component.ts | 2 +- .../rule-node/external/notification-config.component.html | 2 +- .../rule-node/external/notification-config.component.ts | 2 +- .../components/rule-node/external/pubsub-config.component.html | 2 +- .../components/rule-node/external/pubsub-config.component.ts | 2 +- .../rule-node/external/rabbit-mq-config.component.html | 2 +- .../rule-node/external/rabbit-mq-config.component.ts | 2 +- .../rule-node/external/rest-api-call-config.component.html | 2 +- .../rule-node/external/rest-api-call-config.component.ts | 2 +- .../rule-node/external/send-email-config.component.html | 2 +- .../rule-node/external/send-email-config.component.ts | 2 +- .../rule-node/external/send-sms-config.component.html | 2 +- .../components/rule-node/external/send-sms-config.component.ts | 2 +- .../components/rule-node/external/slack-config.component.html | 2 +- .../components/rule-node/external/slack-config.component.scss | 2 +- .../components/rule-node/external/slack-config.component.ts | 2 +- .../components/rule-node/external/sns-config.component.html | 2 +- .../home/components/rule-node/external/sns-config.component.ts | 2 +- .../components/rule-node/external/sqs-config.component.html | 2 +- .../home/components/rule-node/external/sqs-config.component.ts | 2 +- .../rule-node/filter/check-alarm-status.component.html | 2 +- .../rule-node/filter/check-alarm-status.component.ts | 2 +- .../rule-node/filter/check-message-config.component.html | 2 +- .../rule-node/filter/check-message-config.component.ts | 2 +- .../rule-node/filter/check-relation-config.component.html | 2 +- .../rule-node/filter/check-relation-config.component.scss | 2 +- .../rule-node/filter/check-relation-config.component.ts | 2 +- .../rule-node/filter/filter-rule-node-config.module.ts | 2 +- .../rule-node/filter/gps-geo-filter-config.component.html | 2 +- .../rule-node/filter/gps-geo-filter-config.component.scss | 2 +- .../rule-node/filter/gps-geo-filter-config.component.ts | 2 +- .../rule-node/filter/message-type-config.component.html | 2 +- .../rule-node/filter/message-type-config.component.ts | 2 +- .../rule-node/filter/originator-type-config.component.html | 2 +- .../rule-node/filter/originator-type-config.component.ts | 2 +- .../components/rule-node/filter/script-config.component.html | 2 +- .../components/rule-node/filter/script-config.component.ts | 2 +- .../components/rule-node/filter/switch-config.component.html | 2 +- .../components/rule-node/filter/switch-config.component.ts | 2 +- .../components/rule-node/flow/flow-rule-node-config.module.ts | 2 +- .../components/rule-node/flow/rule-chain-input.component.html | 2 +- .../components/rule-node/flow/rule-chain-input.component.ts | 2 +- .../components/rule-node/flow/rule-chain-output.component.html | 2 +- .../components/rule-node/flow/rule-chain-output.component.ts | 2 +- .../home/components/rule-node/rule-node-config.models.ts | 2 +- .../home/components/rule-node/rule-node-config.module.ts | 2 +- .../transformation/change-originator-config.component.html | 2 +- .../transformation/change-originator-config.component.ts | 2 +- .../rule-node/transformation/copy-keys-config.component.html | 2 +- .../rule-node/transformation/copy-keys-config.component.ts | 2 +- .../transformation/deduplication-config.component.html | 2 +- .../rule-node/transformation/deduplication-config.component.ts | 2 +- .../rule-node/transformation/delete-keys-config.component.html | 2 +- .../rule-node/transformation/delete-keys-config.component.ts | 2 +- .../transformation/node-json-path-config.component.html | 2 +- .../transformation/node-json-path-config.component.ts | 2 +- .../rule-node/transformation/rename-keys-config.component.html | 2 +- .../rule-node/transformation/rename-keys-config.component.scss | 2 +- .../rule-node/transformation/rename-keys-config.component.ts | 2 +- .../rule-node/transformation/script-config.component.html | 2 +- .../rule-node/transformation/script-config.component.ts | 2 +- .../rule-node/transformation/to-email-config.component.html | 2 +- .../rule-node/transformation/to-email-config.component.scss | 2 +- .../rule-node/transformation/to-email-config.component.ts | 2 +- .../transformation/transformation-rule-node-config.module.ts | 2 +- .../modules/home/components/shared-home-components.module.ts | 2 +- .../sms/aws-sns-provider-configuration.component.html | 2 +- .../components/sms/aws-sns-provider-configuration.component.ts | 2 +- .../sms/smpp-sms-provider-configuration.component.html | 2 +- .../sms/smpp-sms-provider-configuration.component.ts | 2 +- .../components/sms/sms-provider-configuration.component.html | 2 +- .../components/sms/sms-provider-configuration.component.ts | 2 +- .../sms/twilio-sms-provider-configuration.component.html | 2 +- .../sms/twilio-sms-provider-configuration.component.ts | 2 +- ui-ngx/src/app/modules/home/components/tokens.ts | 2 +- .../home/components/vc/auto-commit-settings.component.html | 2 +- .../home/components/vc/auto-commit-settings.component.scss | 2 +- .../home/components/vc/auto-commit-settings.component.ts | 2 +- .../home/components/vc/complex-version-create.component.html | 2 +- .../home/components/vc/complex-version-create.component.ts | 2 +- .../home/components/vc/complex-version-load.component.html | 2 +- .../home/components/vc/complex-version-load.component.ts | 2 +- .../components/vc/entity-types-version-create.component.html | 2 +- .../components/vc/entity-types-version-create.component.ts | 2 +- .../components/vc/entity-types-version-load.component.html | 2 +- .../home/components/vc/entity-types-version-load.component.ts | 2 +- .../home/components/vc/entity-types-version.component.scss | 2 +- .../home/components/vc/entity-version-create.component.html | 2 +- .../home/components/vc/entity-version-create.component.ts | 2 +- .../home/components/vc/entity-version-diff.component.html | 2 +- .../home/components/vc/entity-version-diff.component.scss | 2 +- .../home/components/vc/entity-version-diff.component.ts | 2 +- .../home/components/vc/entity-version-restore.component.html | 2 +- .../home/components/vc/entity-version-restore.component.ts | 2 +- .../home/components/vc/entity-versions-table.component.html | 2 +- .../home/components/vc/entity-versions-table.component.scss | 2 +- .../home/components/vc/entity-versions-table.component.ts | 2 +- .../components/vc/remove-other-entities-confirm.component.html | 2 +- .../components/vc/remove-other-entities-confirm.component.ts | 2 +- .../home/components/vc/repository-settings.component.html | 2 +- .../home/components/vc/repository-settings.component.scss | 2 +- .../home/components/vc/repository-settings.component.ts | 2 +- .../modules/home/components/vc/version-control.component.html | 2 +- .../modules/home/components/vc/version-control.component.scss | 2 +- .../modules/home/components/vc/version-control.component.ts | 2 +- ui-ngx/src/app/modules/home/components/vc/version-control.scss | 2 +- .../widget/action/manage-widget-actions-dialog.component.html | 2 +- .../widget/action/manage-widget-actions-dialog.component.ts | 2 +- .../widget/action/manage-widget-actions.component.html | 2 +- .../widget/action/manage-widget-actions.component.models.ts | 2 +- .../widget/action/manage-widget-actions.component.scss | 2 +- .../widget/action/manage-widget-actions.component.ts | 2 +- .../widget/action/widget-action-dialog.component.html | 2 +- .../components/widget/action/widget-action-dialog.component.ts | 2 +- .../config/basic/alarm/alarm-count-basic-config.component.html | 2 +- .../config/basic/alarm/alarm-count-basic-config.component.ts | 2 +- .../basic/alarm/alarms-table-basic-config.component.html | 2 +- .../config/basic/alarm/alarms-table-basic-config.component.ts | 2 +- .../home/components/widget/config/basic/basic-config.scss | 2 +- .../widget/config/basic/basic-widget-config.module.ts | 2 +- .../basic/button/action-button-basic-config.component.html | 2 +- .../basic/button/action-button-basic-config.component.ts | 2 +- .../basic/button/command-button-basic-config.component.html | 2 +- .../basic/button/command-button-basic-config.component.ts | 2 +- .../basic/button/power-button-basic-config.component.html | 2 +- .../config/basic/button/power-button-basic-config.component.ts | 2 +- .../basic/button/segmented-button-basic-config.component.html | 2 +- .../basic/button/segmented-button-basic-config.component.ts | 2 +- .../basic/button/toggle-button-basic-config.component.html | 2 +- .../basic/button/toggle-button-basic-config.component.ts | 2 +- .../config/basic/cards/aggregated-data-key-row.component.html | 2 +- .../config/basic/cards/aggregated-data-key-row.component.scss | 2 +- .../config/basic/cards/aggregated-data-key-row.component.ts | 2 +- .../basic/cards/aggregated-data-keys-panel.component.html | 2 +- .../basic/cards/aggregated-data-keys-panel.component.scss | 2 +- .../config/basic/cards/aggregated-data-keys-panel.component.ts | 2 +- .../cards/aggregated-value-card-basic-config.component.html | 2 +- .../cards/aggregated-value-card-basic-config.component.ts | 2 +- .../config/basic/cards/label-card-basic-config.component.html | 2 +- .../config/basic/cards/label-card-basic-config.component.ts | 2 +- .../basic/cards/label-value-card-basic-config.component.html | 2 +- .../basic/cards/label-value-card-basic-config.component.ts | 2 +- .../basic/cards/mobile-app-qr-code-basic-config.component.html | 2 +- .../basic/cards/mobile-app-qr-code-basic-config.component.ts | 2 +- .../basic/cards/progress-bar-basic-config.component.html | 2 +- .../config/basic/cards/progress-bar-basic-config.component.ts | 2 +- .../config/basic/cards/simple-card-basic-config.component.html | 2 +- .../config/basic/cards/simple-card-basic-config.component.ts | 2 +- .../basic/cards/timeseries-table-basic-config.component.html | 2 +- .../basic/cards/timeseries-table-basic-config.component.ts | 2 +- .../cards/unread-notification-basic-config.component.html | 2 +- .../basic/cards/unread-notification-basic-config.component.ts | 2 +- .../config/basic/cards/value-card-basic-config.component.html | 2 +- .../config/basic/cards/value-card-basic-config.component.ts | 2 +- .../basic/cards/value-chart-card-basic-config.component.html | 2 +- .../basic/cards/value-chart-card-basic-config.component.ts | 2 +- .../config/basic/chart/bar-chart-basic-config.component.ts | 2 +- .../chart/bar-chart-with-labels-basic-config.component.html | 2 +- .../chart/bar-chart-with-labels-basic-config.component.ts | 2 +- .../config/basic/chart/comparison-key-row.component.html | 2 +- .../config/basic/chart/comparison-key-row.component.scss | 2 +- .../widget/config/basic/chart/comparison-key-row.component.ts | 2 +- .../config/basic/chart/comparison-keys-table.component.html | 2 +- .../config/basic/chart/comparison-keys-table.component.scss | 2 +- .../config/basic/chart/comparison-keys-table.component.ts | 2 +- .../config/basic/chart/doughnut-basic-config.component.ts | 2 +- .../widget/config/basic/chart/flot-basic-config.component.html | 2 +- .../widget/config/basic/chart/flot-basic-config.component.ts | 2 +- .../basic/chart/latest-chart-basic-config.component.html | 2 +- .../config/basic/chart/latest-chart-basic-config.component.ts | 2 +- .../config/basic/chart/pie-chart-basic-config.component.ts | 2 +- .../basic/chart/polar-area-chart-basic-config.component.ts | 2 +- .../config/basic/chart/radar-chart-basic-config.component.ts | 2 +- .../config/basic/chart/range-chart-basic-config.component.html | 2 +- .../config/basic/chart/range-chart-basic-config.component.ts | 2 +- .../basic/chart/time-series-chart-basic-config.component.html | 2 +- .../basic/chart/time-series-chart-basic-config.component.ts | 2 +- .../widget/config/basic/common/data-key-row.component.html | 2 +- .../widget/config/basic/common/data-key-row.component.scss | 2 +- .../widget/config/basic/common/data-key-row.component.ts | 2 +- .../widget/config/basic/common/data-keys-panel.component.html | 2 +- .../widget/config/basic/common/data-keys-panel.component.scss | 2 +- .../widget/config/basic/common/data-keys-panel.component.ts | 2 +- .../config/basic/common/widget-actions-panel.component.html | 2 +- .../config/basic/common/widget-actions-panel.component.ts | 2 +- .../basic/entity/entities-table-basic-config.component.html | 2 +- .../basic/entity/entities-table-basic-config.component.ts | 2 +- .../basic/entity/entity-count-basic-config.component.html | 2 +- .../config/basic/entity/entity-count-basic-config.component.ts | 2 +- .../basic/gauge/analog-gauge-basic-config.component.html | 2 +- .../config/basic/gauge/analog-gauge-basic-config.component.ts | 2 +- .../basic/gauge/compass-gauge-basic-config.component.html | 2 +- .../config/basic/gauge/compass-gauge-basic-config.component.ts | 2 +- .../gauge/digital-simple-gauge-basic-config.component.html | 2 +- .../basic/gauge/digital-simple-gauge-basic-config.component.ts | 2 +- .../config/basic/gauge/radial-gauge-basic-config.component.ts | 2 +- .../gauge/thermometer-scale-gauge-basic-config.component.ts | 2 +- .../basic/indicator/battery-level-basic-config.component.html | 2 +- .../basic/indicator/battery-level-basic-config.component.ts | 2 +- .../indicator/liquid-level-card-basic-config.component.html | 2 +- .../indicator/liquid-level-card-basic-config.component.ts | 2 +- .../indicator/signal-strength-basic-config.component.html | 2 +- .../basic/indicator/signal-strength-basic-config.component.ts | 2 +- .../basic/indicator/status-widget-basic-config.component.html | 2 +- .../basic/indicator/status-widget-basic-config.component.ts | 2 +- .../widget/config/basic/map/map-basic-config.component.html | 2 +- .../widget/config/basic/map/map-basic-config.component.ts | 2 +- .../config/basic/rpc/single-switch-basic-config.component.html | 2 +- .../config/basic/rpc/single-switch-basic-config.component.ts | 2 +- .../widget/config/basic/rpc/slider-basic-config.component.html | 2 +- .../widget/config/basic/rpc/slider-basic-config.component.ts | 2 +- .../config/basic/rpc/value-stepper-basic-config.component.html | 2 +- .../config/basic/rpc/value-stepper-basic-config.component.ts | 2 +- .../basic/scada/scada-symbol-basic-config.component.html | 2 +- .../config/basic/scada/scada-symbol-basic-config.component.ts | 2 +- .../weather/wind-speed-direction-basic-config.component.html | 2 +- .../weather/wind-speed-direction-basic-config.component.ts | 2 +- .../home/components/widget/config/datasource.component.html | 2 +- .../components/widget/config/datasource.component.models.ts | 2 +- .../home/components/widget/config/datasource.component.scss | 2 +- .../home/components/widget/config/datasource.component.ts | 2 +- .../home/components/widget/config/datasources.component.html | 2 +- .../home/components/widget/config/datasources.component.scss | 2 +- .../home/components/widget/config/datasources.component.ts | 2 +- .../home/components/widget/config/target-device.component.html | 2 +- .../home/components/widget/config/target-device.component.ts | 2 +- .../widget/config/timewindow-config-panel.component.html | 2 +- .../widget/config/timewindow-config-panel.component.ts | 2 +- .../widget/config/timewindow-style-panel.component.html | 2 +- .../widget/config/timewindow-style-panel.component.scss | 2 +- .../widget/config/timewindow-style-panel.component.ts | 2 +- .../components/widget/config/timewindow-style.component.html | 2 +- .../components/widget/config/timewindow-style.component.ts | 2 +- .../widget/config/widget-config-components.module.ts | 2 +- .../components/widget/config/widget-config.component.models.ts | 2 +- .../widget/dialog/custom-dialog-container.component.ts | 2 +- .../home/components/widget/dialog/custom-dialog.component.ts | 2 +- .../home/components/widget/dialog/custom-dialog.service.ts | 2 +- .../components/widget/dialog/embed-dashboard-dialog-token.ts | 2 +- .../widget/dialog/embed-dashboard-dialog.component.html | 2 +- .../widget/dialog/embed-dashboard-dialog.component.scss | 2 +- .../widget/dialog/embed-dashboard-dialog.component.ts | 2 +- .../modules/home/components/widget/dynamic-widget.component.ts | 2 +- .../home/components/widget/lib/action/action-widget.models.ts | 2 +- .../home/components/widget/lib/action/action-widget.scss | 2 +- .../widget/lib/alarm/alarms-table-widget.component.html | 2 +- .../widget/lib/alarm/alarms-table-widget.component.scss | 2 +- .../widget/lib/alarm/alarms-table-widget.component.ts | 2 +- .../home/components/widget/lib/analogue-compass.models.ts | 2 +- .../app/modules/home/components/widget/lib/analogue-compass.ts | 2 +- .../home/components/widget/lib/analogue-gauge.models.ts | 2 +- .../home/components/widget/lib/analogue-linear-gauge.models.ts | 2 +- .../home/components/widget/lib/analogue-linear-gauge.ts | 2 +- .../home/components/widget/lib/analogue-radial-gauge.models.ts | 2 +- .../home/components/widget/lib/analogue-radial-gauge.ts | 2 +- .../widget/lib/button/action-button-widget.component.html | 2 +- .../widget/lib/button/action-button-widget.component.scss | 2 +- .../widget/lib/button/action-button-widget.component.ts | 2 +- .../widget/lib/button/action-button-widget.models.ts | 2 +- .../widget/lib/button/command-button-widget.component.html | 2 +- .../widget/lib/button/command-button-widget.component.scss | 2 +- .../widget/lib/button/command-button-widget.component.ts | 2 +- .../widget/lib/button/command-button-widget.models.ts | 2 +- .../widget/lib/button/segmented-button-widget.models.ts | 2 +- .../widget/lib/button/toggle-button-widget.component.html | 2 +- .../widget/lib/button/toggle-button-widget.component.scss | 2 +- .../widget/lib/button/toggle-button-widget.component.ts | 2 +- .../widget/lib/button/toggle-button-widget.models.ts | 2 +- .../widget/lib/button/two-segment-button-widget.component.html | 2 +- .../widget/lib/button/two-segment-button-widget.component.scss | 2 +- .../widget/lib/button/two-segment-button-widget.component.ts | 2 +- .../modules/home/components/widget/lib/canvas-digital-gauge.ts | 2 +- .../lib/cards/aggregated-value-card-widget.component.html | 2 +- .../lib/cards/aggregated-value-card-widget.component.scss | 2 +- .../widget/lib/cards/aggregated-value-card-widget.component.ts | 2 +- .../widget/lib/cards/aggregated-value-card.models.ts | 2 +- .../widget/lib/cards/label-card-widget.component.html | 2 +- .../widget/lib/cards/label-card-widget.component.scss | 2 +- .../components/widget/lib/cards/label-card-widget.component.ts | 2 +- .../components/widget/lib/cards/label-card-widget.models.ts | 2 +- .../widget/lib/cards/label-value-card-widget.component.html | 2 +- .../widget/lib/cards/label-value-card-widget.component.scss | 2 +- .../widget/lib/cards/label-value-card-widget.component.ts | 2 +- .../widget/lib/cards/label-value-card-widget.models.ts | 2 +- .../widget/lib/cards/mobile-app-qr-code-widget.models.ts | 2 +- .../lib/cards/notification-type-filter-panel.component.html | 2 +- .../lib/cards/notification-type-filter-panel.component.scss | 2 +- .../lib/cards/notification-type-filter-panel.component.ts | 2 +- .../widget/lib/cards/progress-bar-widget.component.html | 2 +- .../widget/lib/cards/progress-bar-widget.component.scss | 2 +- .../widget/lib/cards/progress-bar-widget.component.ts | 2 +- .../components/widget/lib/cards/progress-bar-widget.models.ts | 2 +- .../widget/lib/cards/unread-notification-widget.component.html | 2 +- .../widget/lib/cards/unread-notification-widget.component.scss | 2 +- .../widget/lib/cards/unread-notification-widget.component.ts | 2 +- .../widget/lib/cards/unread-notification-widget.models.ts | 2 +- .../widget/lib/cards/value-card-widget.component.html | 2 +- .../widget/lib/cards/value-card-widget.component.scss | 2 +- .../components/widget/lib/cards/value-card-widget.component.ts | 2 +- .../components/widget/lib/cards/value-card-widget.models.ts | 2 +- .../widget/lib/cards/value-chart-card-widget.component.html | 2 +- .../widget/lib/cards/value-chart-card-widget.component.scss | 2 +- .../widget/lib/cards/value-chart-card-widget.component.ts | 2 +- .../widget/lib/cards/value-chart-card-widget.models.ts | 2 +- .../components/widget/lib/chart/bar-chart-widget.component.ts | 2 +- .../components/widget/lib/chart/bar-chart-widget.models.ts | 2 +- .../lib/chart/bar-chart-with-labels-widget.component.html | 2 +- .../lib/chart/bar-chart-with-labels-widget.component.scss | 2 +- .../widget/lib/chart/bar-chart-with-labels-widget.component.ts | 2 +- .../widget/lib/chart/bar-chart-with-labels-widget.models.ts | 2 +- .../home/components/widget/lib/chart/bars-chart.models.ts | 2 +- .../app/modules/home/components/widget/lib/chart/bars-chart.ts | 2 +- .../modules/home/components/widget/lib/chart/chart.models.ts | 2 +- .../components/widget/lib/chart/doughnut-widget.component.ts | 2 +- .../home/components/widget/lib/chart/doughnut-widget.models.ts | 2 +- .../home/components/widget/lib/chart/echarts-widget.models.ts | 2 +- .../widget/lib/chart/latest-chart-widget.component.html | 2 +- .../components/widget/lib/chart/latest-chart.component.html | 2 +- .../components/widget/lib/chart/latest-chart.component.scss | 2 +- .../home/components/widget/lib/chart/latest-chart.component.ts | 2 +- .../home/components/widget/lib/chart/latest-chart.models.ts | 2 +- .../modules/home/components/widget/lib/chart/latest-chart.ts | 2 +- .../components/widget/lib/chart/pie-chart-widget.component.ts | 2 +- .../components/widget/lib/chart/pie-chart-widget.models.ts | 2 +- .../home/components/widget/lib/chart/pie-chart.models.ts | 2 +- .../app/modules/home/components/widget/lib/chart/pie-chart.ts | 2 +- .../components/widget/lib/chart/polar-area-widget.component.ts | 2 +- .../components/widget/lib/chart/polar-area-widget.models.ts | 2 +- .../widget/lib/chart/radar-chart-widget.component.ts | 2 +- .../components/widget/lib/chart/radar-chart-widget.models.ts | 2 +- .../home/components/widget/lib/chart/radar-chart.models.ts | 2 +- .../modules/home/components/widget/lib/chart/radar-chart.ts | 2 +- .../widget/lib/chart/range-chart-widget.component.html | 2 +- .../widget/lib/chart/range-chart-widget.component.scss | 2 +- .../widget/lib/chart/range-chart-widget.component.ts | 2 +- .../components/widget/lib/chart/range-chart-widget.models.ts | 2 +- .../widget/lib/chart/time-series-chart-bar.models.ts | 2 +- .../widget/lib/chart/time-series-chart-state.models.ts | 2 +- .../widget/lib/chart/time-series-chart-tooltip.models.ts | 2 +- .../widget/lib/chart/time-series-chart-widget.component.html | 2 +- .../widget/lib/chart/time-series-chart-widget.component.scss | 2 +- .../widget/lib/chart/time-series-chart-widget.component.ts | 2 +- .../widget/lib/chart/time-series-chart-widget.models.ts | 2 +- .../components/widget/lib/chart/time-series-chart.models.ts | 2 +- .../home/components/widget/lib/chart/time-series-chart.ts | 2 +- .../components/widget/lib/count/count-widget.component.html | 2 +- .../components/widget/lib/count/count-widget.component.scss | 2 +- .../home/components/widget/lib/count/count-widget.component.ts | 2 +- .../home/components/widget/lib/count/count-widget.models.ts | 2 +- .../date-range-navigator-panel.component.html | 2 +- .../date-range-navigator-panel.component.scss | 2 +- .../date-range-navigator/date-range-navigator.component.html | 2 +- .../date-range-navigator/date-range-navigator.component.scss | 2 +- .../lib/date-range-navigator/date-range-navigator.component.ts | 2 +- .../lib/date-range-navigator/date-range-navigator.models.ts | 2 +- .../modules/home/components/widget/lib/digital-gauge.models.ts | 2 +- .../app/modules/home/components/widget/lib/digital-gauge.ts | 2 +- .../components/widget/lib/display-columns-panel.component.html | 2 +- .../components/widget/lib/display-columns-panel.component.scss | 2 +- .../components/widget/lib/display-columns-panel.component.ts | 2 +- .../components/widget/lib/edges-overview-widget.component.html | 2 +- .../components/widget/lib/edges-overview-widget.component.scss | 2 +- .../components/widget/lib/edges-overview-widget.component.ts | 2 +- .../home/components/widget/lib/edges-overview-widget.models.ts | 2 +- .../widget/lib/entity/entities-hierarchy-widget.component.html | 2 +- .../widget/lib/entity/entities-hierarchy-widget.component.scss | 2 +- .../widget/lib/entity/entities-hierarchy-widget.component.ts | 2 +- .../widget/lib/entity/entities-hierarchy-widget.models.ts | 2 +- .../widget/lib/entity/entities-table-widget.component.html | 2 +- .../widget/lib/entity/entities-table-widget.component.scss | 2 +- .../widget/lib/entity/entities-table-widget.component.ts | 2 +- .../home/components/widget/lib/flot-widget.component.html | 2 +- .../home/components/widget/lib/flot-widget.component.ts | 2 +- .../modules/home/components/widget/lib/flot-widget.models.ts | 2 +- .../src/app/modules/home/components/widget/lib/flot-widget.ts | 2 +- .../widget/lib/home-page/add-doc-link-dialog.component.html | 2 +- .../widget/lib/home-page/add-doc-link-dialog.component.scss | 2 +- .../widget/lib/home-page/add-doc-link-dialog.component.ts | 2 +- .../widget/lib/home-page/add-quick-link-dialog.component.html | 2 +- .../widget/lib/home-page/add-quick-link-dialog.component.scss | 2 +- .../widget/lib/home-page/add-quick-link-dialog.component.ts | 2 +- .../widget/lib/home-page/cluster-info-table.component.html | 2 +- .../widget/lib/home-page/cluster-info-table.component.scss | 2 +- .../widget/lib/home-page/cluster-info-table.component.ts | 2 +- .../widget/lib/home-page/configured-features.component.html | 2 +- .../widget/lib/home-page/configured-features.component.scss | 2 +- .../widget/lib/home-page/configured-features.component.ts | 2 +- .../components/widget/lib/home-page/doc-link.component.html | 2 +- .../home/components/widget/lib/home-page/doc-link.component.ts | 2 +- .../widget/lib/home-page/doc-links-widget.component.html | 2 +- .../widget/lib/home-page/doc-links-widget.component.ts | 2 +- .../widget/lib/home-page/edit-links-dialog.component.html | 2 +- .../widget/lib/home-page/edit-links-dialog.component.scss | 2 +- .../widget/lib/home-page/edit-links-dialog.component.ts | 2 +- .../home-page/getting-started-completed-dialog.component.html | 2 +- .../home-page/getting-started-completed-dialog.component.scss | 2 +- .../home-page/getting-started-completed-dialog.component.ts | 2 +- .../widget/lib/home-page/getting-started-widget.component.html | 2 +- .../widget/lib/home-page/getting-started-widget.component.scss | 2 +- .../widget/lib/home-page/getting-started-widget.component.ts | 2 +- .../home/components/widget/lib/home-page/home-page-widget.scss | 2 +- .../widget/lib/home-page/home-page-widgets.module.ts | 2 +- .../home/components/widget/lib/home-page/home-page.scss | 2 +- .../home/components/widget/lib/home-page/link.component.scss | 2 +- .../widget/lib/home-page/links-widget.component.scss | 2 +- .../components/widget/lib/home-page/quick-link.component.html | 2 +- .../components/widget/lib/home-page/quick-link.component.ts | 2 +- .../widget/lib/home-page/quick-links-widget.component.html | 2 +- .../widget/lib/home-page/quick-links-widget.component.ts | 2 +- .../lib/home-page/recent-dashboards-widget.component.html | 2 +- .../lib/home-page/recent-dashboards-widget.component.scss | 2 +- .../widget/lib/home-page/recent-dashboards-widget.component.ts | 2 +- .../widget/lib/home-page/usage-info-widget.component.html | 2 +- .../widget/lib/home-page/usage-info-widget.component.scss | 2 +- .../widget/lib/home-page/usage-info-widget.component.ts | 2 +- .../widget/lib/home-page/version-info.component.html | 2 +- .../widget/lib/home-page/version-info.component.scss | 2 +- .../components/widget/lib/home-page/version-info.component.ts | 2 +- .../widget/lib/indicator/battery-level-widget.component.html | 2 +- .../widget/lib/indicator/battery-level-widget.component.scss | 2 +- .../widget/lib/indicator/battery-level-widget.component.ts | 2 +- .../widget/lib/indicator/battery-level-widget.models.ts | 2 +- .../widget/lib/indicator/liquid-level-widget.component.html | 2 +- .../widget/lib/indicator/liquid-level-widget.component.scss | 2 +- .../widget/lib/indicator/liquid-level-widget.component.ts | 2 +- .../widget/lib/indicator/liquid-level-widget.models.ts | 2 +- .../widget/lib/indicator/signal-strength-widget.component.html | 2 +- .../widget/lib/indicator/signal-strength-widget.component.scss | 2 +- .../widget/lib/indicator/signal-strength-widget.component.ts | 2 +- .../widget/lib/indicator/signal-strength-widget.models.ts | 2 +- .../widget/lib/indicator/status-widget.component.html | 2 +- .../widget/lib/indicator/status-widget.component.scss | 2 +- .../components/widget/lib/indicator/status-widget.component.ts | 2 +- .../components/widget/lib/indicator/status-widget.models.ts | 2 +- .../components/widget/lib/json-input-widget.component.html | 2 +- .../components/widget/lib/json-input-widget.component.scss | 2 +- .../home/components/widget/lib/json-input-widget.component.ts | 2 +- .../modules/home/components/widget/lib/legend.component.html | 2 +- .../modules/home/components/widget/lib/legend.component.scss | 2 +- .../app/modules/home/components/widget/lib/legend.component.ts | 2 +- .../modules/home/components/widget/lib/maps-legacy/circle.ts | 2 +- .../components/widget/lib/maps-legacy/common-maps-utils.ts | 2 +- .../maps-legacy/dialogs/select-entity-dialog.component.html | 2 +- .../maps-legacy/dialogs/select-entity-dialog.component.scss | 2 +- .../lib/maps-legacy/dialogs/select-entity-dialog.component.ts | 2 +- .../home/components/widget/lib/maps-legacy/leaflet-map.ts | 2 +- .../home/components/widget/lib/maps-legacy/map-models.ts | 2 +- .../components/widget/lib/maps-legacy/map-widget.interface.ts | 2 +- .../home/components/widget/lib/maps-legacy/map-widget2.ts | 2 +- .../home/components/widget/lib/maps-legacy/maps-utils.ts | 2 +- .../home/components/widget/lib/maps-legacy/markers.scss | 2 +- .../modules/home/components/widget/lib/maps-legacy/markers.ts | 2 +- .../modules/home/components/widget/lib/maps-legacy/polygon.ts | 2 +- .../modules/home/components/widget/lib/maps-legacy/polyline.ts | 2 +- .../components/widget/lib/maps-legacy/providers/google-map.ts | 2 +- .../components/widget/lib/maps-legacy/providers/here-map.ts | 2 +- .../components/widget/lib/maps-legacy/providers/image-map.ts | 2 +- .../widget/lib/maps-legacy/providers/openstreet-map.ts | 2 +- .../components/widget/lib/maps-legacy/providers/public-api.ts | 2 +- .../components/widget/lib/maps-legacy/providers/tencent-map.ts | 2 +- .../widget/lib/maps/data-layer/circles-data-layer.ts | 2 +- .../components/widget/lib/maps/data-layer/data-layer-utils.ts | 2 +- .../widget/lib/maps/data-layer/latest-map-data-layer.ts | 2 +- .../components/widget/lib/maps/data-layer/map-data-layer.ts | 2 +- .../widget/lib/maps/data-layer/markers-data-layer.ts | 2 +- .../widget/lib/maps/data-layer/polygons-data-layer.ts | 2 +- .../components/widget/lib/maps/data-layer/shapes-data-layer.ts | 2 +- .../components/widget/lib/maps/data-layer/trips-data-layer.ts | 2 +- .../src/app/modules/home/components/widget/lib/maps/geo-map.ts | 2 +- .../app/modules/home/components/widget/lib/maps/image-map.ts | 2 +- .../home/components/widget/lib/maps/leaflet/leaflet-tb.ts | 2 +- .../app/modules/home/components/widget/lib/maps/map-layer.ts | 2 +- .../home/components/widget/lib/maps/map-widget.component.html | 2 +- .../home/components/widget/lib/maps/map-widget.component.scss | 2 +- .../home/components/widget/lib/maps/map-widget.component.ts | 2 +- .../home/components/widget/lib/maps/map-widget.models.ts | 2 +- .../src/app/modules/home/components/widget/lib/maps/map.scss | 2 +- ui-ngx/src/app/modules/home/components/widget/lib/maps/map.ts | 2 +- .../widget/lib/maps/panels/map-timeline-panel.component.html | 2 +- .../widget/lib/maps/panels/map-timeline-panel.component.scss | 2 +- .../widget/lib/maps/panels/map-timeline-panel.component.ts | 2 +- .../lib/maps/panels/select-map-entity-panel.component.html | 2 +- .../lib/maps/panels/select-map-entity-panel.component.scss | 2 +- .../lib/maps/panels/select-map-entity-panel.component.ts | 2 +- .../home/components/widget/lib/markdown-widget.component.html | 2 +- .../home/components/widget/lib/markdown-widget.component.ts | 2 +- .../widget/lib/mobile-app-qrcode-widget.component.html | 2 +- .../widget/lib/mobile-app-qrcode-widget.component.scss | 2 +- .../widget/lib/mobile-app-qrcode-widget.component.ts | 2 +- .../components/widget/lib/multiple-input-widget.component.html | 2 +- .../components/widget/lib/multiple-input-widget.component.scss | 2 +- .../components/widget/lib/multiple-input-widget.component.ts | 2 +- .../widget/lib/navigation-card-widget.component.html | 2 +- .../widget/lib/navigation-card-widget.component.scss | 2 +- .../components/widget/lib/navigation-card-widget.component.ts | 2 +- .../widget/lib/navigation-cards-widget.component.html | 2 +- .../widget/lib/navigation-cards-widget.component.scss | 2 +- .../components/widget/lib/navigation-cards-widget.component.ts | 2 +- .../components/widget/lib/photo-camera-input.component.html | 2 +- .../components/widget/lib/photo-camera-input.component.scss | 2 +- .../home/components/widget/lib/photo-camera-input.component.ts | 2 +- .../home/components/widget/lib/qrcode-widget.component.html | 2 +- .../home/components/widget/lib/qrcode-widget.component.ts | 2 +- .../modules/home/components/widget/lib/rpc/knob.component.html | 2 +- .../modules/home/components/widget/lib/rpc/knob.component.scss | 2 +- .../modules/home/components/widget/lib/rpc/knob.component.ts | 2 +- .../components/widget/lib/rpc/led-indicator.component.html | 2 +- .../components/widget/lib/rpc/led-indicator.component.scss | 2 +- .../home/components/widget/lib/rpc/led-indicator.component.ts | 2 +- .../widget/lib/rpc/persistent-add-dialog.component.html | 2 +- .../widget/lib/rpc/persistent-add-dialog.component.scss | 2 +- .../widget/lib/rpc/persistent-add-dialog.component.ts | 2 +- .../widget/lib/rpc/persistent-details-dialog.component.html | 2 +- .../widget/lib/rpc/persistent-details-dialog.component.scss | 2 +- .../widget/lib/rpc/persistent-details-dialog.component.ts | 2 +- .../widget/lib/rpc/persistent-filter-panel.component.html | 2 +- .../widget/lib/rpc/persistent-filter-panel.component.scss | 2 +- .../widget/lib/rpc/persistent-filter-panel.component.ts | 2 +- .../components/widget/lib/rpc/persistent-table.component.html | 2 +- .../components/widget/lib/rpc/persistent-table.component.scss | 2 +- .../components/widget/lib/rpc/persistent-table.component.ts | 2 +- .../widget/lib/rpc/power-button-widget.component.html | 2 +- .../widget/lib/rpc/power-button-widget.component.scss | 2 +- .../components/widget/lib/rpc/power-button-widget.component.ts | 2 +- .../components/widget/lib/rpc/power-button-widget.models.ts | 2 +- .../home/components/widget/lib/rpc/round-switch.component.html | 2 +- .../home/components/widget/lib/rpc/round-switch.component.scss | 2 +- .../home/components/widget/lib/rpc/round-switch.component.ts | 2 +- .../home/components/widget/lib/rpc/rpc-widgets.module.ts | 2 +- .../widget/lib/rpc/single-switch-widget.component.html | 2 +- .../widget/lib/rpc/single-switch-widget.component.scss | 2 +- .../widget/lib/rpc/single-switch-widget.component.ts | 2 +- .../components/widget/lib/rpc/single-switch-widget.models.ts | 2 +- .../components/widget/lib/rpc/slider-widget.component.html | 2 +- .../components/widget/lib/rpc/slider-widget.component.scss | 2 +- .../home/components/widget/lib/rpc/slider-widget.component.ts | 2 +- .../home/components/widget/lib/rpc/slider-widget.models.ts | 2 +- .../home/components/widget/lib/rpc/switch.component.html | 2 +- .../home/components/widget/lib/rpc/switch.component.scss | 2 +- .../modules/home/components/widget/lib/rpc/switch.component.ts | 2 +- .../widget/lib/rpc/value-stepper-widget.component.html | 2 +- .../widget/lib/rpc/value-stepper-widget.component.scss | 2 +- .../widget/lib/rpc/value-stepper-widget.component.ts | 2 +- .../components/widget/lib/rpc/value-stepper-widget.models.ts | 2 +- .../widget/lib/scada/scada-symbol-widget.component.html | 2 +- .../widget/lib/scada/scada-symbol-widget.component.scss | 2 +- .../widget/lib/scada/scada-symbol-widget.component.ts | 2 +- .../components/widget/lib/scada/scada-symbol-widget.models.ts | 2 +- .../home/components/widget/lib/scada/scada-symbol.models.ts | 2 +- .../app/modules/home/components/widget/lib/settings.models.ts | 2 +- .../settings/alarm/alarm-count-widget-settings.component.html | 2 +- .../settings/alarm/alarm-count-widget-settings.component.ts | 2 +- .../settings/alarm/alarms-table-key-settings.component.html | 2 +- .../lib/settings/alarm/alarms-table-key-settings.component.ts | 2 +- .../settings/alarm/alarms-table-widget-settings.component.html | 2 +- .../settings/alarm/alarms-table-widget-settings.component.ts | 2 +- .../button/action-button-widget-settings.component.html | 2 +- .../settings/button/action-button-widget-settings.component.ts | 2 +- .../button/command-button-widget-settings.component.html | 2 +- .../button/command-button-widget-settings.component.ts | 2 +- .../button/power-button-widget-settings.component.html | 2 +- .../settings/button/power-button-widget-settings.component.ts | 2 +- .../button/segmented-button-widget-settings.component.html | 2 +- .../button/segmented-button-widget-settings.component.ts | 2 +- .../button/toggle-button-widget-settings.component.html | 2 +- .../settings/button/toggle-button-widget-settings.component.ts | 2 +- .../cards/aggregated-value-card-key-settings.component.html | 2 +- .../cards/aggregated-value-card-key-settings.component.ts | 2 +- .../cards/aggregated-value-card-widget-settings.component.html | 2 +- .../cards/aggregated-value-card-widget-settings.component.ts | 2 +- .../cards/dashboard-state-widget-settings.component.html | 2 +- .../cards/dashboard-state-widget-settings.component.ts | 2 +- .../cards/edge-quick-overview-widget-settings.component.html | 2 +- .../cards/edge-quick-overview-widget-settings.component.ts | 2 +- .../settings/cards/html-card-widget-settings.component.html | 2 +- .../lib/settings/cards/html-card-widget-settings.component.ts | 2 +- .../settings/cards/label-card-widget-settings.component.html | 2 +- .../lib/settings/cards/label-card-widget-settings.component.ts | 2 +- .../cards/label-value-card-widget-settings.component.html | 2 +- .../cards/label-value-card-widget-settings.component.ts | 2 +- .../lib/settings/cards/label-widget-label.component.html | 2 +- .../lib/settings/cards/label-widget-label.component.scss | 2 +- .../widget/lib/settings/cards/label-widget-label.component.ts | 2 +- .../lib/settings/cards/label-widget-settings.component.html | 2 +- .../lib/settings/cards/label-widget-settings.component.ts | 2 +- .../lib/settings/cards/markdown-widget-settings.component.html | 2 +- .../lib/settings/cards/markdown-widget-settings.component.ts | 2 +- .../cards/mobile-app-qr-code-widget-settings.component.html | 2 +- .../cards/mobile-app-qr-code-widget-settings.component.ts | 2 +- .../settings/cards/progress-bar-widget-settings.component.html | 2 +- .../settings/cards/progress-bar-widget-settings.component.ts | 2 +- .../lib/settings/cards/qrcode-widget-settings.component.html | 2 +- .../lib/settings/cards/qrcode-widget-settings.component.ts | 2 +- .../settings/cards/simple-card-widget-settings.component.html | 2 +- .../settings/cards/simple-card-widget-settings.component.ts | 2 +- .../cards/timeseries-table-key-settings.component.html | 2 +- .../settings/cards/timeseries-table-key-settings.component.ts | 2 +- .../cards/timeseries-table-latest-key-settings.component.html | 2 +- .../cards/timeseries-table-latest-key-settings.component.ts | 2 +- .../cards/timeseries-table-widget-settings.component.html | 2 +- .../cards/timeseries-table-widget-settings.component.ts | 2 +- .../cards/unread-notification-widget-settings.component.html | 2 +- .../cards/unread-notification-widget-settings.component.ts | 2 +- .../settings/cards/value-card-widget-settings.component.html | 2 +- .../lib/settings/cards/value-card-widget-settings.component.ts | 2 +- .../cards/value-chart-card-widget-settings.component.html | 2 +- .../cards/value-chart-card-widget-settings.component.ts | 2 +- .../lib/settings/chart/bar-chart-widget-settings.component.ts | 2 +- .../chart/bar-chart-with-labels-widget-settings.component.html | 2 +- .../chart/bar-chart-with-labels-widget-settings.component.ts | 2 +- .../lib/settings/chart/chart-widget-settings.component.html | 2 +- .../lib/settings/chart/chart-widget-settings.component.ts | 2 +- .../chart/doughnut-chart-widget-settings.component.html | 2 +- .../settings/chart/doughnut-chart-widget-settings.component.ts | 2 +- .../lib/settings/chart/doughnut-widget-settings.component.ts | 2 +- .../lib/settings/chart/flot-bar-key-settings.component.html | 2 +- .../lib/settings/chart/flot-bar-key-settings.component.ts | 2 +- .../lib/settings/chart/flot-bar-widget-settings.component.html | 2 +- .../lib/settings/chart/flot-bar-widget-settings.component.ts | 2 +- .../widget/lib/settings/chart/flot-key-settings.component.html | 2 +- .../widget/lib/settings/chart/flot-key-settings.component.ts | 2 +- .../lib/settings/chart/flot-latest-key-settings.component.html | 2 +- .../lib/settings/chart/flot-latest-key-settings.component.ts | 2 +- .../lib/settings/chart/flot-line-key-settings.component.html | 2 +- .../lib/settings/chart/flot-line-key-settings.component.ts | 2 +- .../settings/chart/flot-line-widget-settings.component.html | 2 +- .../lib/settings/chart/flot-line-widget-settings.component.ts | 2 +- .../lib/settings/chart/flot-pie-key-settings.component.html | 2 +- .../lib/settings/chart/flot-pie-key-settings.component.ts | 2 +- .../lib/settings/chart/flot-pie-widget-settings.component.html | 2 +- .../lib/settings/chart/flot-pie-widget-settings.component.ts | 2 +- .../widget/lib/settings/chart/flot-threshold.component.html | 2 +- .../widget/lib/settings/chart/flot-threshold.component.ts | 2 +- .../lib/settings/chart/flot-widget-settings.component.html | 2 +- .../lib/settings/chart/flot-widget-settings.component.ts | 2 +- .../widget/lib/settings/chart/label-data-key.component.html | 2 +- .../widget/lib/settings/chart/label-data-key.component.scss | 2 +- .../widget/lib/settings/chart/label-data-key.component.ts | 2 +- .../settings/chart/latest-chart-widget-settings.component.html | 2 +- .../settings/chart/latest-chart-widget-settings.component.ts | 2 +- .../lib/settings/chart/pie-chart-widget-settings.component.ts | 2 +- .../chart/polar-area-chart-widget-settings.component.ts | 2 +- .../settings/chart/radar-chart-widget-settings.component.ts | 2 +- .../settings/chart/range-chart-widget-settings.component.html | 2 +- .../settings/chart/range-chart-widget-settings.component.ts | 2 +- .../chart/time-series-chart-key-settings.component.html | 2 +- .../settings/chart/time-series-chart-key-settings.component.ts | 2 +- .../chart/time-series-chart-line-settings.component.html | 2 +- .../chart/time-series-chart-line-settings.component.ts | 2 +- .../chart/time-series-chart-widget-settings.component.html | 2 +- .../chart/time-series-chart-widget-settings.component.ts | 2 +- .../common/action/action-settings-button.component.html | 2 +- .../lib/settings/common/action/action-settings-button.scss | 2 +- .../common/action/action-settings-panel.component.scss | 2 +- .../common/action/custom-action-pretty-editor.component.html | 2 +- .../common/action/custom-action-pretty-editor.component.scss | 2 +- .../common/action/custom-action-pretty-editor.component.ts | 2 +- .../action/custom-action-pretty-resources-tabs.component.html | 2 +- .../action/custom-action-pretty-resources-tabs.component.scss | 2 +- .../action/custom-action-pretty-resources-tabs.component.ts | 2 +- .../widget/lib/settings/common/action/custom-action.models.ts | 2 +- .../action/get-value-action-settings-panel.component.html | 2 +- .../common/action/get-value-action-settings-panel.component.ts | 2 +- .../common/action/get-value-action-settings.component.ts | 2 +- .../settings/common/action/map-item-tooltips.component.html | 2 +- .../lib/settings/common/action/map-item-tooltips.component.ts | 2 +- .../settings/common/action/mobile-action-editor.component.html | 2 +- .../settings/common/action/mobile-action-editor.component.ts | 2 +- .../lib/settings/common/action/mobile-action-editor.models.ts | 2 +- .../action/set-value-action-settings-panel.component.html | 2 +- .../common/action/set-value-action-settings-panel.component.ts | 2 +- .../common/action/set-value-action-settings.component.ts | 2 +- .../common/action/widget-action-settings-panel.component.html | 2 +- .../common/action/widget-action-settings-panel.component.ts | 2 +- .../settings/common/action/widget-action-settings.component.ts | 2 +- .../lib/settings/common/action/widget-action.component.html | 2 +- .../lib/settings/common/action/widget-action.component.ts | 2 +- .../widget/lib/settings/common/advanced-range.component.html | 2 +- .../widget/lib/settings/common/advanced-range.component.scss | 2 +- .../widget/lib/settings/common/advanced-range.component.ts | 2 +- .../settings/common/alias/entity-alias-select.component.html | 2 +- .../common/alias/entity-alias-select.component.models.ts | 2 +- .../settings/common/alias/entity-alias-select.component.scss | 2 +- .../lib/settings/common/alias/entity-alias-select.component.ts | 2 +- .../common/auto-date-format-settings-panel.component.html | 2 +- .../common/auto-date-format-settings-panel.component.scss | 2 +- .../common/auto-date-format-settings-panel.component.ts | 2 +- .../settings/common/auto-date-format-settings.component.html | 2 +- .../lib/settings/common/auto-date-format-settings.component.ts | 2 +- .../settings/common/background-settings-panel.component.html | 2 +- .../settings/common/background-settings-panel.component.scss | 2 +- .../lib/settings/common/background-settings-panel.component.ts | 2 +- .../lib/settings/common/background-settings.component.html | 2 +- .../lib/settings/common/background-settings.component.scss | 2 +- .../lib/settings/common/background-settings.component.ts | 2 +- .../common/button/widget-button-appearance.component.html | 2 +- .../common/button/widget-button-appearance.component.ts | 2 +- .../button/widget-button-custom-style-panel.component.html | 2 +- .../button/widget-button-custom-style-panel.component.scss | 2 +- .../button/widget-button-custom-style-panel.component.ts | 2 +- .../common/button/widget-button-custom-style.component.html | 2 +- .../common/button/widget-button-custom-style.component.scss | 2 +- .../common/button/widget-button-custom-style.component.ts | 2 +- .../widget-button-toggle-custom-style-panel.component.html | 2 +- .../widget-button-toggle-custom-style-panel.component.scss | 2 +- .../widget-button-toggle-custom-style-panel.component.ts | 2 +- .../button/widget-button-toggle-custom-style.component.html | 2 +- .../button/widget-button-toggle-custom-style.component.scss | 2 +- .../button/widget-button-toggle-custom-style.component.ts | 2 +- .../common/chart/chart-animation-settings.component.html | 2 +- .../common/chart/chart-animation-settings.component.ts | 2 +- .../settings/common/chart/chart-bar-settings.component.html | 2 +- .../lib/settings/common/chart/chart-bar-settings.component.ts | 2 +- .../settings/common/chart/chart-fill-settings.component.html | 2 +- .../lib/settings/common/chart/chart-fill-settings.component.ts | 2 +- .../time-series-chart-axis-settings-button.component.html | 2 +- .../chart/time-series-chart-axis-settings-button.component.ts | 2 +- .../chart/time-series-chart-axis-settings-panel.component.html | 2 +- .../chart/time-series-chart-axis-settings-panel.component.scss | 2 +- .../chart/time-series-chart-axis-settings-panel.component.ts | 2 +- .../chart/time-series-chart-axis-settings.component.html | 2 +- .../common/chart/time-series-chart-axis-settings.component.ts | 2 +- .../chart/time-series-chart-grid-settings.component.html | 2 +- .../common/chart/time-series-chart-grid-settings.component.ts | 2 +- .../common/chart/time-series-chart-state-row.component.html | 2 +- .../common/chart/time-series-chart-state-row.component.scss | 2 +- .../common/chart/time-series-chart-state-row.component.ts | 2 +- .../common/chart/time-series-chart-states-panel.component.html | 2 +- .../common/chart/time-series-chart-states-panel.component.scss | 2 +- .../common/chart/time-series-chart-states-panel.component.ts | 2 +- .../chart/time-series-chart-threshold-row.component.html | 2 +- .../chart/time-series-chart-threshold-row.component.scss | 2 +- .../common/chart/time-series-chart-threshold-row.component.ts | 2 +- .../time-series-chart-threshold-settings-panel.component.html | 2 +- .../time-series-chart-threshold-settings-panel.component.scss | 2 +- .../time-series-chart-threshold-settings-panel.component.ts | 2 +- .../chart/time-series-chart-threshold-settings.component.html | 2 +- .../chart/time-series-chart-threshold-settings.component.ts | 2 +- .../chart/time-series-chart-thresholds-panel.component.html | 2 +- .../chart/time-series-chart-thresholds-panel.component.scss | 2 +- .../chart/time-series-chart-thresholds-panel.component.ts | 2 +- .../common/chart/time-series-chart-y-axes-panel.component.html | 2 +- .../common/chart/time-series-chart-y-axes-panel.component.scss | 2 +- .../common/chart/time-series-chart-y-axes-panel.component.ts | 2 +- .../common/chart/time-series-chart-y-axis-row.component.html | 2 +- .../common/chart/time-series-chart-y-axis-row.component.scss | 2 +- .../common/chart/time-series-chart-y-axis-row.component.ts | 2 +- ...ime-series-no-aggregation-bar-width-settings.component.html | 2 +- .../time-series-no-aggregation-bar-width-settings.component.ts | 2 +- .../widget/lib/settings/common/color-range-list.component.html | 2 +- .../widget/lib/settings/common/color-range-list.component.scss | 2 +- .../widget/lib/settings/common/color-range-list.component.ts | 2 +- .../lib/settings/common/color-range-panel.component.html | 2 +- .../widget/lib/settings/common/color-range-panel.component.ts | 2 +- .../lib/settings/common/color-range-settings.component.html | 2 +- .../lib/settings/common/color-range-settings.component.ts | 2 +- .../lib/settings/common/color-settings-panel.component.html | 2 +- .../lib/settings/common/color-settings-panel.component.scss | 2 +- .../lib/settings/common/color-settings-panel.component.ts | 2 +- .../widget/lib/settings/common/color-settings.component.html | 2 +- .../widget/lib/settings/common/color-settings.component.ts | 2 +- .../lib/settings/common/count-widget-settings.component.html | 2 +- .../lib/settings/common/count-widget-settings.component.ts | 2 +- .../widget/lib/settings/common/css-size-input.component.html | 2 +- .../widget/lib/settings/common/css-size-input.component.ts | 2 +- .../widget/lib/settings/common/css-unit-select.component.html | 2 +- .../widget/lib/settings/common/css-unit-select.component.ts | 2 +- .../lib/settings/common/date-format-select.component.html | 2 +- .../widget/lib/settings/common/date-format-select.component.ts | 2 +- .../settings/common/date-format-settings-panel.component.html | 2 +- .../settings/common/date-format-settings-panel.component.scss | 2 +- .../settings/common/date-format-settings-panel.component.ts | 2 +- .../common/dynamic-form/dynamic-form-array.component.html | 2 +- .../common/dynamic-form/dynamic-form-array.component.scss | 2 +- .../common/dynamic-form/dynamic-form-array.component.ts | 2 +- .../common/dynamic-form/dynamic-form-properties.component.html | 2 +- .../common/dynamic-form/dynamic-form-properties.component.scss | 2 +- .../common/dynamic-form/dynamic-form-properties.component.ts | 2 +- .../dynamic-form/dynamic-form-property-panel.component.html | 2 +- .../dynamic-form/dynamic-form-property-panel.component.scss | 2 +- .../dynamic-form/dynamic-form-property-panel.component.ts | 2 +- .../dynamic-form/dynamic-form-property-row.component.html | 2 +- .../dynamic-form/dynamic-form-property-row.component.scss | 2 +- .../common/dynamic-form/dynamic-form-property-row.component.ts | 2 +- .../dynamic-form/dynamic-form-select-item-row.component.html | 2 +- .../dynamic-form/dynamic-form-select-item-row.component.scss | 2 +- .../dynamic-form/dynamic-form-select-item-row.component.ts | 2 +- .../dynamic-form/dynamic-form-select-items.component.html | 2 +- .../dynamic-form/dynamic-form-select-items.component.scss | 2 +- .../common/dynamic-form/dynamic-form-select-items.component.ts | 2 +- .../settings/common/dynamic-form/dynamic-form.component.html | 2 +- .../settings/common/dynamic-form/dynamic-form.component.scss | 2 +- .../lib/settings/common/dynamic-form/dynamic-form.component.ts | 2 +- .../lib/settings/common/entity-alias-input.component.html | 2 +- .../lib/settings/common/entity-alias-input.component.scss | 2 +- .../widget/lib/settings/common/entity-alias-input.component.ts | 2 +- .../lib/settings/common/filter/filter-select.component.html | 2 +- .../settings/common/filter/filter-select.component.models.ts | 2 +- .../lib/settings/common/filter/filter-select.component.ts | 2 +- .../lib/settings/common/font-settings-panel.component.html | 2 +- .../lib/settings/common/font-settings-panel.component.scss | 2 +- .../lib/settings/common/font-settings-panel.component.ts | 2 +- .../widget/lib/settings/common/font-settings.component.html | 2 +- .../widget/lib/settings/common/font-settings.component.ts | 2 +- .../widget/lib/settings/common/gradient.component.html | 2 +- .../widget/lib/settings/common/gradient.component.scss | 2 +- .../widget/lib/settings/common/gradient.component.ts | 2 +- .../lib/settings/common/image-cards-select.component.html | 2 +- .../lib/settings/common/image-cards-select.component.scss | 2 +- .../widget/lib/settings/common/image-cards-select.component.ts | 2 +- .../indicator/status-widget-state-settings.component.html | 2 +- .../common/indicator/status-widget-state-settings.component.ts | 2 +- .../settings/common/key/data-key-config-dialog.component.html | 2 +- .../settings/common/key/data-key-config-dialog.component.scss | 2 +- .../settings/common/key/data-key-config-dialog.component.ts | 2 +- .../lib/settings/common/key/data-key-config.component.html | 2 +- .../lib/settings/common/key/data-key-config.component.ts | 2 +- .../lib/settings/common/key/data-key-input.component.html | 2 +- .../lib/settings/common/key/data-key-input.component.scss | 2 +- .../widget/lib/settings/common/key/data-key-input.component.ts | 2 +- .../widget/lib/settings/common/key/data-keys.component.html | 2 +- .../lib/settings/common/key/data-keys.component.models.ts | 2 +- .../widget/lib/settings/common/key/data-keys.component.scss | 3 +-- .../widget/lib/settings/common/key/data-keys.component.ts | 2 +- .../widget/lib/settings/common/legend-config.component.html | 2 +- .../widget/lib/settings/common/legend-config.component.ts | 2 +- .../common/map/additional-map-data-source-row.component.html | 2 +- .../common/map/additional-map-data-source-row.component.scss | 2 +- .../common/map/additional-map-data-source-row.component.ts | 2 +- .../common/map/additional-map-data-sources.component.html | 2 +- .../common/map/additional-map-data-sources.component.scss | 2 +- .../common/map/additional-map-data-sources.component.ts | 2 +- .../common/map/data-layer-color-settings-panel.component.html | 2 +- .../common/map/data-layer-color-settings-panel.component.scss | 2 +- .../common/map/data-layer-color-settings-panel.component.ts | 2 +- .../common/map/data-layer-color-settings.component.html | 2 +- .../settings/common/map/data-layer-color-settings.component.ts | 2 +- .../common/map/data-layer-pattern-settings.component.html | 2 +- .../common/map/data-layer-pattern-settings.component.ts | 2 +- .../common/map/image-map-source-settings.component.html | 2 +- .../settings/common/map/image-map-source-settings.component.ts | 2 +- .../settings/common/map/map-action-button-row.component.html | 2 +- .../lib/settings/common/map/map-action-button-row.component.ts | 2 +- .../common/map/map-action-buttons-settings.component.html | 2 +- .../common/map/map-action-buttons-settings.component.ts | 2 +- .../settings/common/map/map-data-layer-dialog.component.html | 2 +- .../settings/common/map/map-data-layer-dialog.component.scss | 2 +- .../lib/settings/common/map/map-data-layer-dialog.component.ts | 2 +- .../lib/settings/common/map/map-data-layer-row.component.html | 2 +- .../lib/settings/common/map/map-data-layer-row.component.scss | 2 +- .../lib/settings/common/map/map-data-layer-row.component.ts | 2 +- .../lib/settings/common/map/map-data-layers.component.html | 2 +- .../lib/settings/common/map/map-data-layers.component.scss | 2 +- .../lib/settings/common/map/map-data-layers.component.ts | 2 +- .../lib/settings/common/map/map-data-source-row.component.html | 2 +- .../lib/settings/common/map/map-data-source-row.component.scss | 2 +- .../lib/settings/common/map/map-data-source-row.component.ts | 2 +- .../lib/settings/common/map/map-data-sources.component.html | 2 +- .../lib/settings/common/map/map-data-sources.component.scss | 3 +-- .../lib/settings/common/map/map-data-sources.component.ts | 2 +- .../lib/settings/common/map/map-layer-row.component.html | 2 +- .../lib/settings/common/map/map-layer-row.component.scss | 2 +- .../widget/lib/settings/common/map/map-layer-row.component.ts | 2 +- .../common/map/map-layer-settings-panel.component.html | 2 +- .../common/map/map-layer-settings-panel.component.scss | 2 +- .../settings/common/map/map-layer-settings-panel.component.ts | 2 +- .../widget/lib/settings/common/map/map-layers.component.html | 2 +- .../widget/lib/settings/common/map/map-layers.component.scss | 2 +- .../widget/lib/settings/common/map/map-layers.component.ts | 2 +- .../widget/lib/settings/common/map/map-settings.component.html | 2 +- .../lib/settings/common/map/map-settings.component.models.ts | 2 +- .../widget/lib/settings/common/map/map-settings.component.ts | 2 +- .../settings/common/map/map-tooltip-tag-actions.component.html | 2 +- .../settings/common/map/map-tooltip-tag-actions.component.scss | 2 +- .../settings/common/map/map-tooltip-tag-actions.component.ts | 2 +- .../common/map/marker-clustering-settings.component.html | 2 +- .../common/map/marker-clustering-settings.component.ts | 2 +- .../lib/settings/common/map/marker-icon-shapes.component.html | 2 +- .../lib/settings/common/map/marker-icon-shapes.component.scss | 2 +- .../lib/settings/common/map/marker-icon-shapes.component.ts | 2 +- .../common/map/marker-image-settings-panel.component.html | 2 +- .../common/map/marker-image-settings-panel.component.scss | 2 +- .../common/map/marker-image-settings-panel.component.ts | 2 +- .../settings/common/map/marker-image-settings.component.html | 2 +- .../lib/settings/common/map/marker-image-settings.component.ts | 2 +- .../settings/common/map/marker-shape-settings.component.html | 2 +- .../lib/settings/common/map/marker-shape-settings.component.ts | 2 +- .../lib/settings/common/map/marker-shapes.component.html | 2 +- .../lib/settings/common/map/marker-shapes.component.scss | 2 +- .../widget/lib/settings/common/map/marker-shapes.component.ts | 2 +- .../common/map/shape-fill-image-settings-panel.component.html | 2 +- .../common/map/shape-fill-image-settings-panel.component.scss | 2 +- .../common/map/shape-fill-image-settings-panel.component.ts | 2 +- .../common/map/shape-fill-image-settings.component.html | 2 +- .../settings/common/map/shape-fill-image-settings.component.ts | 2 +- .../common/map/shape-fill-stripe-settings-panel.component.html | 2 +- .../common/map/shape-fill-stripe-settings-panel.component.scss | 2 +- .../common/map/shape-fill-stripe-settings-panel.component.ts | 2 +- .../common/map/shape-fill-stripe-settings.component.html | 2 +- .../common/map/shape-fill-stripe-settings.component.ts | 2 +- .../settings/common/map/trip-timeline-settings.component.html | 3 +-- .../settings/common/map/trip-timeline-settings.component.ts | 2 +- .../common/scada/scada-symbol-object-settings.component.html | 2 +- .../common/scada/scada-symbol-object-settings.component.scss | 2 +- .../common/scada/scada-symbol-object-settings.component.ts | 2 +- .../common/scada/scada-symbol-object-settings.models.ts | 2 +- .../lib/settings/common/value-source-data-key.component.html | 2 +- .../lib/settings/common/value-source-data-key.component.scss | 2 +- .../lib/settings/common/value-source-data-key.component.ts | 2 +- .../widget/lib/settings/common/value-source.component.html | 2 +- .../widget/lib/settings/common/value-source.component.ts | 2 +- .../widget/lib/settings/common/widget-font.component.html | 2 +- .../widget/lib/settings/common/widget-font.component.ts | 2 +- .../lib/settings/common/widget-settings-common.module.ts | 2 +- .../lib/settings/common/widget/widget-settings.component.html | 2 +- .../lib/settings/common/widget/widget-settings.component.scss | 2 +- .../lib/settings/common/widget/widget-settings.component.ts | 2 +- .../settings/control/device-key-autocomplete.component.html | 2 +- .../lib/settings/control/device-key-autocomplete.component.ts | 2 +- .../control/knob-control-widget-settings.component.html | 2 +- .../settings/control/knob-control-widget-settings.component.ts | 2 +- .../control/led-indicator-widget-settings.component.html | 2 +- .../control/led-indicator-widget-settings.component.ts | 2 +- .../control/persistent-table-widget-settings.component.html | 2 +- .../control/persistent-table-widget-settings.component.ts | 2 +- .../control/round-switch-widget-settings.component.html | 2 +- .../settings/control/round-switch-widget-settings.component.ts | 2 +- .../lib/settings/control/rpc-button-style.component.html | 2 +- .../widget/lib/settings/control/rpc-button-style.component.ts | 2 +- .../settings/control/rpc-shell-widget-settings.component.html | 2 +- .../settings/control/rpc-shell-widget-settings.component.ts | 2 +- .../control/rpc-terminal-widget-settings.component.html | 2 +- .../settings/control/rpc-terminal-widget-settings.component.ts | 2 +- .../settings/control/send-rpc-widget-settings.component.html | 2 +- .../lib/settings/control/send-rpc-widget-settings.component.ts | 2 +- .../control/single-switch-widget-settings.component.html | 2 +- .../control/single-switch-widget-settings.component.ts | 2 +- .../control/slide-toggle-widget-settings.component.html | 2 +- .../settings/control/slide-toggle-widget-settings.component.ts | 2 +- .../lib/settings/control/slider-widget-settings.component.html | 2 +- .../lib/settings/control/slider-widget-settings.component.ts | 2 +- .../control/switch-control-widget-settings.component.html | 2 +- .../control/switch-control-widget-settings.component.ts | 2 +- .../lib/settings/control/switch-rpc-settings.component.html | 2 +- .../lib/settings/control/switch-rpc-settings.component.ts | 2 +- .../update-device-attribute-widget-settings.component.html | 2 +- .../update-device-attribute-widget-settings.component.ts | 2 +- .../control/value-stepper-widget-settings.component.html | 2 +- .../control/value-stepper-widget-settings.component.ts | 2 +- .../date/date-range-navigator-widget-settings.component.html | 2 +- .../date/date-range-navigator-widget-settings.component.ts | 2 +- .../entity/entities-hierarchy-widget-settings.component.html | 2 +- .../entity/entities-hierarchy-widget-settings.component.ts | 2 +- .../settings/entity/entities-table-key-settings.component.html | 2 +- .../settings/entity/entities-table-key-settings.component.ts | 2 +- .../entity/entities-table-widget-settings.component.html | 2 +- .../entity/entities-table-widget-settings.component.ts | 2 +- .../entity/entity-count-widget-settings.component.html | 2 +- .../settings/entity/entity-count-widget-settings.component.ts | 2 +- ...gateway-config-single-device-widget-settings.component.html | 2 +- .../gateway-config-single-device-widget-settings.component.ts | 2 +- .../gateway/gateway-config-widget-settings.component.html | 2 +- .../gateway/gateway-config-widget-settings.component.ts | 2 +- .../gateway/gateway-events-widget-settings.component.html | 2 +- .../gateway/gateway-events-widget-settings.component.ts | 2 +- .../lib/settings/gateway/gateway-logs-settings.component.html | 2 +- .../lib/settings/gateway/gateway-logs-settings.component.ts | 2 +- .../gateway/gateway-service-rpc-settings.component.html | 2 +- .../settings/gateway/gateway-service-rpc-settings.component.ts | 2 +- .../gauge/analogue-compass-widget-settings.component.html | 2 +- .../gauge/analogue-compass-widget-settings.component.ts | 2 +- .../gauge/analogue-gauge-widget-settings.component.html | 2 +- .../settings/gauge/analogue-gauge-widget-settings.component.ts | 2 +- .../gauge/analogue-linear-gauge-widget-settings.component.ts | 2 +- .../gauge/analogue-radial-gauge-widget-settings.component.ts | 2 +- .../gauge/digital-gauge-widget-settings.component.html | 2 +- .../settings/gauge/digital-gauge-widget-settings.component.ts | 2 +- .../widget/lib/settings/gauge/tick-value.component.html | 2 +- .../widget/lib/settings/gauge/tick-value.component.ts | 2 +- .../settings/gpio/gpio-control-widget-settings.component.html | 2 +- .../settings/gpio/gpio-control-widget-settings.component.ts | 2 +- .../widget/lib/settings/gpio/gpio-item.component.html | 2 +- .../widget/lib/settings/gpio/gpio-item.component.scss | 2 +- .../components/widget/lib/settings/gpio/gpio-item.component.ts | 2 +- .../settings/gpio/gpio-panel-widget-settings.component.html | 2 +- .../lib/settings/gpio/gpio-panel-widget-settings.component.ts | 2 +- .../home-page/doc-links-widget-settings.component.html | 2 +- .../settings/home-page/doc-links-widget-settings.component.ts | 2 +- .../home-page/quick-links-widget-settings.component.html | 2 +- .../home-page/quick-links-widget-settings.component.ts | 2 +- .../indicator/battery-level-widget-settings.component.html | 2 +- .../indicator/battery-level-widget-settings.component.ts | 2 +- .../indicator/liquid-level-card-widget-settings.component.html | 2 +- .../indicator/liquid-level-card-widget-settings.component.ts | 2 +- .../indicator/signal-strength-widget-settings.component.html | 2 +- .../indicator/signal-strength-widget-settings.component.ts | 2 +- .../settings/indicator/status-widget-settings.component.html | 2 +- .../lib/settings/indicator/status-widget-settings.component.ts | 2 +- .../lib/settings/input/datakey-select-option.component.html | 2 +- .../lib/settings/input/datakey-select-option.component.scss | 2 +- .../lib/settings/input/datakey-select-option.component.ts | 2 +- .../input/device-claiming-widget-settings.component.html | 2 +- .../input/device-claiming-widget-settings.component.ts | 2 +- .../input/photo-camera-input-widget-settings.component.html | 2 +- .../input/photo-camera-input-widget-settings.component.ts | 2 +- .../input/update-attribute-general-settings.component.html | 2 +- .../input/update-attribute-general-settings.component.ts | 2 +- .../update-boolean-attribute-widget-settings.component.html | 2 +- .../update-boolean-attribute-widget-settings.component.ts | 2 +- .../input/update-date-attribute-widget-settings.component.html | 2 +- .../input/update-date-attribute-widget-settings.component.ts | 2 +- .../update-double-attribute-widget-settings.component.html | 2 +- .../input/update-double-attribute-widget-settings.component.ts | 2 +- .../update-image-attribute-widget-settings.component.html | 2 +- .../input/update-image-attribute-widget-settings.component.ts | 2 +- .../update-integer-attribute-widget-settings.component.html | 2 +- .../update-integer-attribute-widget-settings.component.ts | 2 +- .../input/update-json-attribute-widget-settings.component.html | 2 +- .../input/update-json-attribute-widget-settings.component.ts | 2 +- .../update-location-attribute-widget-settings.component.html | 2 +- .../update-location-attribute-widget-settings.component.ts | 2 +- .../update-multiple-attributes-key-settings.component.html | 2 +- .../input/update-multiple-attributes-key-settings.component.ts | 2 +- .../update-multiple-attributes-widget-settings.component.html | 2 +- .../update-multiple-attributes-widget-settings.component.ts | 2 +- .../update-string-attribute-widget-settings.component.html | 2 +- .../input/update-string-attribute-widget-settings.component.ts | 2 +- .../lib/settings/map/legacy/circle-settings.component.html | 2 +- .../lib/settings/map/legacy/circle-settings.component.ts | 2 +- .../lib/settings/map/legacy/common-map-settings.component.html | 2 +- .../lib/settings/map/legacy/common-map-settings.component.ts | 2 +- .../map/legacy/datasources-key-autocomplete.component.html | 2 +- .../map/legacy/datasources-key-autocomplete.component.ts | 2 +- .../map/legacy/google-map-provider-settings.component.html | 2 +- .../map/legacy/google-map-provider-settings.component.ts | 2 +- .../map/legacy/here-map-provider-settings.component.html | 2 +- .../map/legacy/here-map-provider-settings.component.ts | 2 +- .../map/legacy/image-map-provider-settings.component.html | 2 +- .../map/legacy/image-map-provider-settings.component.ts | 2 +- .../lib/settings/map/legacy/map-editor-settings.component.html | 2 +- .../lib/settings/map/legacy/map-editor-settings.component.ts | 2 +- .../settings/map/legacy/map-provider-settings.component.html | 2 +- .../lib/settings/map/legacy/map-provider-settings.component.ts | 2 +- .../lib/settings/map/legacy/map-settings-legacy.component.html | 2 +- .../lib/settings/map/legacy/map-settings-legacy.component.ts | 2 +- .../map/legacy/map-widget-settings-legacy.component.html | 2 +- .../map/legacy/map-widget-settings-legacy.component.ts | 2 +- .../map/legacy/marker-clustering-settings.component.html | 2 +- .../map/legacy/marker-clustering-settings.component.ts | 2 +- .../lib/settings/map/legacy/markers-settings.component.html | 2 +- .../lib/settings/map/legacy/markers-settings.component.ts | 2 +- .../map/legacy/openstreet-map-provider-settings.component.html | 2 +- .../map/legacy/openstreet-map-provider-settings.component.ts | 2 +- .../lib/settings/map/legacy/polygon-settings.component.html | 2 +- .../lib/settings/map/legacy/polygon-settings.component.ts | 2 +- .../lib/settings/map/legacy/route-map-settings.component.html | 2 +- .../lib/settings/map/legacy/route-map-settings.component.ts | 2 +- .../map/legacy/route-map-widget-settings.component.html | 2 +- .../settings/map/legacy/route-map-widget-settings.component.ts | 2 +- .../map/legacy/tencent-map-provider-settings.component.html | 2 +- .../map/legacy/tencent-map-provider-settings.component.ts | 2 +- .../map/legacy/trip-animation-common-settings.component.html | 2 +- .../map/legacy/trip-animation-common-settings.component.ts | 2 +- .../map/legacy/trip-animation-marker-settings.component.html | 2 +- .../map/legacy/trip-animation-marker-settings.component.ts | 2 +- .../map/legacy/trip-animation-path-settings.component.html | 2 +- .../map/legacy/trip-animation-path-settings.component.ts | 2 +- .../map/legacy/trip-animation-point-settings.component.html | 2 +- .../map/legacy/trip-animation-point-settings.component.ts | 2 +- .../map/legacy/trip-animation-widget-settings.component.html | 2 +- .../map/legacy/trip-animation-widget-settings.component.ts | 2 +- .../widget/lib/settings/map/map-widget-settings.component.html | 2 +- .../widget/lib/settings/map/map-widget-settings.component.ts | 2 +- .../navigation/navigation-card-widget-settings.component.html | 2 +- .../navigation/navigation-card-widget-settings.component.ts | 2 +- .../navigation/navigation-cards-widget-settings.component.html | 2 +- .../navigation/navigation-cards-widget-settings.component.ts | 2 +- .../settings/scada/scada-symbol-widget-settings.component.html | 2 +- .../settings/scada/scada-symbol-widget-settings.component.ts | 2 +- .../wind-speed-direction-widget-settings.component.html | 2 +- .../weather/wind-speed-direction-widget-settings.component.ts | 2 +- .../components/widget/lib/settings/widget-settings.module.ts | 2 +- .../home/components/widget/lib/settings/widget-settings.scss | 2 +- .../modules/home/components/widget/lib/table-widget.models.ts | 2 +- .../app/modules/home/components/widget/lib/table-widget.scss | 2 +- .../widget/lib/timeseries-table-widget.component.html | 2 +- .../widget/lib/timeseries-table-widget.component.scss | 2 +- .../components/widget/lib/timeseries-table-widget.component.ts | 2 +- .../widget/lib/trip-animation/trip-animation.component.html | 2 +- .../widget/lib/trip-animation/trip-animation.component.scss | 2 +- .../widget/lib/trip-animation/trip-animation.component.ts | 2 +- .../lib/weather/wind-speed-direction-widget.component.html | 2 +- .../lib/weather/wind-speed-direction-widget.component.scss | 2 +- .../lib/weather/wind-speed-direction-widget.component.ts | 2 +- .../widget/lib/weather/wind-speed-direction-widget.models.ts | 2 +- .../modules/home/components/widget/widget-component.service.ts | 2 +- .../modules/home/components/widget/widget-components.module.ts | 2 +- .../home/components/widget/widget-config.component.html | 2 +- .../home/components/widget/widget-config.component.scss | 2 +- .../modules/home/components/widget/widget-config.component.ts | 2 +- .../home/components/widget/widget-container.component.html | 2 +- .../home/components/widget/widget-container.component.scss | 2 +- .../home/components/widget/widget-container.component.ts | 2 +- .../home/components/widget/widget-preview.component.html | 2 +- .../home/components/widget/widget-preview.component.scss | 2 +- .../modules/home/components/widget/widget-preview.component.ts | 2 +- .../app/modules/home/components/widget/widget.component.html | 2 +- .../app/modules/home/components/widget/widget.component.scss | 2 +- .../src/app/modules/home/components/widget/widget.component.ts | 2 +- .../home/components/wizard/device-wizard-dialog.component.html | 2 +- .../home/components/wizard/device-wizard-dialog.component.scss | 2 +- .../home/components/wizard/device-wizard-dialog.component.ts | 2 +- .../dialogs/add-entities-to-customer-dialog.component.html | 2 +- .../home/dialogs/add-entities-to-customer-dialog.component.ts | 2 +- .../home/dialogs/add-entities-to-edge-dialog.component.html | 2 +- .../home/dialogs/add-entities-to-edge-dialog.component.ts | 2 +- .../home/dialogs/assign-to-customer-dialog.component.html | 2 +- .../home/dialogs/assign-to-customer-dialog.component.ts | 2 +- ui-ngx/src/app/modules/home/dialogs/home-dialogs.module.ts | 2 +- ui-ngx/src/app/modules/home/dialogs/home-dialogs.service.ts | 2 +- ui-ngx/src/app/modules/home/home-routing.module.ts | 2 +- ui-ngx/src/app/modules/home/home.component.html | 2 +- ui-ngx/src/app/modules/home/home.component.scss | 2 +- ui-ngx/src/app/modules/home/home.component.ts | 2 +- ui-ngx/src/app/modules/home/home.module.ts | 2 +- ui-ngx/src/app/modules/home/menu/menu-link.component.html | 2 +- ui-ngx/src/app/modules/home/menu/menu-link.component.scss | 2 +- ui-ngx/src/app/modules/home/menu/menu-link.component.ts | 2 +- ui-ngx/src/app/modules/home/menu/menu-toggle.component.html | 2 +- ui-ngx/src/app/modules/home/menu/menu-toggle.component.scss | 2 +- ui-ngx/src/app/modules/home/menu/menu-toggle.component.ts | 2 +- ui-ngx/src/app/modules/home/menu/side-menu.component.html | 2 +- ui-ngx/src/app/modules/home/menu/side-menu.component.scss | 2 +- ui-ngx/src/app/modules/home/menu/side-menu.component.ts | 2 +- .../src/app/modules/home/models/dashboard-component.models.ts | 2 +- .../app/modules/home/models/datasource/attribute-datasource.ts | 2 +- .../app/modules/home/models/datasource/entity-datasource.ts | 2 +- .../app/modules/home/models/datasource/relation-datasource.ts | 2 +- .../modules/home/models/entity/entities-table-config.models.ts | 2 +- .../app/modules/home/models/entity/entity-component.models.ts | 2 +- .../home/models/entity/entity-details-page-component.models.ts | 2 +- .../home/models/entity/entity-table-component.models.ts | 2 +- .../src/app/modules/home/models/searchable-component.models.ts | 2 +- ui-ngx/src/app/modules/home/models/services.map.ts | 2 +- ui-ngx/src/app/modules/home/models/widget-component.models.ts | 2 +- .../app/modules/home/pages/account/account-routing.module.ts | 2 +- ui-ngx/src/app/modules/home/pages/account/account.module.ts | 2 +- .../src/app/modules/home/pages/admin/admin-routing.module.ts | 2 +- ui-ngx/src/app/modules/home/pages/admin/admin.module.ts | 2 +- .../home/pages/admin/auto-commit-admin-settings.component.html | 2 +- .../home/pages/admin/auto-commit-admin-settings.component.ts | 2 +- .../modules/home/pages/admin/general-settings.component.html | 2 +- .../modules/home/pages/admin/general-settings.component.scss | 2 +- .../app/modules/home/pages/admin/general-settings.component.ts | 2 +- .../app/modules/home/pages/admin/home-settings.component.html | 2 +- .../app/modules/home/pages/admin/home-settings.component.scss | 2 +- .../app/modules/home/pages/admin/home-settings.component.ts | 2 +- .../app/modules/home/pages/admin/mail-server.component.html | 2 +- .../app/modules/home/pages/admin/mail-server.component.scss | 2 +- .../src/app/modules/home/pages/admin/mail-server.component.ts | 2 +- .../pages/admin/oauth2/clients/client-dialog.component.html | 2 +- .../home/pages/admin/oauth2/clients/client-dialog.component.ts | 2 +- .../admin/oauth2/clients/client-table-header.component.html | 2 +- .../admin/oauth2/clients/client-table-header.component.ts | 2 +- .../home/pages/admin/oauth2/clients/client.component.html | 2 +- .../home/pages/admin/oauth2/clients/client.component.scss | 2 +- .../home/pages/admin/oauth2/clients/client.component.ts | 2 +- .../admin/oauth2/clients/clients-table-config.resolver.ts | 2 +- .../pages/admin/oauth2/domains/domain-table-config.resolver.ts | 2 +- .../admin/oauth2/domains/domain-table-header.component.html | 2 +- .../admin/oauth2/domains/domain-table-header.component.ts | 2 +- .../home/pages/admin/oauth2/domains/domain.component.html | 2 +- .../home/pages/admin/oauth2/domains/domain.component.ts | 2 +- .../modules/home/pages/admin/oauth2/oauth2-routing.module.ts | 2 +- .../src/app/modules/home/pages/admin/oauth2/oauth2.module.ts | 2 +- .../app/modules/home/pages/admin/queue/queue.component.html | 2 +- .../src/app/modules/home/pages/admin/queue/queue.component.ts | 2 +- .../home/pages/admin/queue/queues-table-config.resolver.ts | 2 +- .../home/pages/admin/repository-admin-settings.component.html | 2 +- .../home/pages/admin/repository-admin-settings.component.ts | 2 +- .../pages/admin/resource/js-library-table-config.resolver.ts | 2 +- .../admin/resource/js-library-table-header.component.html | 2 +- .../pages/admin/resource/js-library-table-header.component.ts | 2 +- .../home/pages/admin/resource/js-resource.component.html | 2 +- .../modules/home/pages/admin/resource/js-resource.component.ts | 2 +- .../pages/admin/resource/resource-library-tabs.component.html | 2 +- .../pages/admin/resource/resource-library-tabs.component.ts | 2 +- .../home/pages/admin/resource/resource-tabs.component.html | 2 +- .../home/pages/admin/resource/resource-tabs.component.ts | 2 +- .../modules/home/pages/admin/resource/resources-datasource.ts | 2 +- .../admin/resource/resources-library-table-config.resolve.ts | 2 +- .../pages/admin/resource/resources-table-header.component.html | 2 +- .../pages/admin/resource/resources-table-header.component.ts | 2 +- .../modules/home/pages/admin/security-settings.component.html | 2 +- .../modules/home/pages/admin/security-settings.component.scss | 2 +- .../modules/home/pages/admin/security-settings.component.ts | 2 +- .../home/pages/admin/send-test-sms-dialog.component.html | 2 +- .../modules/home/pages/admin/send-test-sms-dialog.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/admin/settings-card.scss | 2 +- .../app/modules/home/pages/admin/sms-provider.component.html | 2 +- .../app/modules/home/pages/admin/sms-provider.component.scss | 2 +- .../src/app/modules/home/pages/admin/sms-provider.component.ts | 2 +- .../modules/home/pages/admin/trendz-settings.component.html | 2 +- .../modules/home/pages/admin/trendz-settings.component.scss | 2 +- .../app/modules/home/pages/admin/trendz-settings.component.ts | 2 +- .../home/pages/admin/two-factor-auth-settings.component.html | 2 +- .../home/pages/admin/two-factor-auth-settings.component.scss | 2 +- .../home/pages/admin/two-factor-auth-settings.component.ts | 2 +- .../app/modules/home/pages/ai-model/ai-model-routing.module.ts | 2 +- .../home/pages/ai-model/ai-model-table-config.resolve.ts | 2 +- .../home/pages/ai-model/ai-model-table-header.component.html | 2 +- .../home/pages/ai-model/ai-model-table-header.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/ai-model/ai-model.module.ts | 2 +- .../src/app/modules/home/pages/alarm/alarm-routing.module.ts | 2 +- ui-ngx/src/app/modules/home/pages/alarm/alarm.module.ts | 2 +- .../modules/home/pages/api-usage/api-usage-routing.module.ts | 2 +- .../src/app/modules/home/pages/api-usage/api-usage.module.ts | 2 +- .../home/pages/asset-profile/asset-profile-routing.module.ts | 2 +- .../home/pages/asset-profile/asset-profile-tabs.component.html | 2 +- .../home/pages/asset-profile/asset-profile-tabs.component.ts | 2 +- .../modules/home/pages/asset-profile/asset-profile.module.ts | 2 +- .../asset-profile/asset-profiles-table-config.resolver.ts | 2 +- .../src/app/modules/home/pages/asset/asset-routing.module.ts | 2 +- .../modules/home/pages/asset/asset-table-header.component.html | 2 +- .../modules/home/pages/asset/asset-table-header.component.ts | 2 +- .../src/app/modules/home/pages/asset/asset-tabs.component.html | 2 +- .../src/app/modules/home/pages/asset/asset-tabs.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/asset/asset.component.html | 2 +- ui-ngx/src/app/modules/home/pages/asset/asset.component.scss | 2 +- ui-ngx/src/app/modules/home/pages/asset/asset.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/asset/asset.module.ts | 2 +- .../modules/home/pages/asset/assets-table-config.resolver.ts | 2 +- .../modules/home/pages/audit-log/audit-log-routing.module.ts | 2 +- .../src/app/modules/home/pages/audit-log/audit-log.module.ts | 2 +- .../app/modules/home/pages/customer/customer-routing.module.ts | 2 +- .../modules/home/pages/customer/customer-tabs.component.html | 2 +- .../app/modules/home/pages/customer/customer-tabs.component.ts | 2 +- .../app/modules/home/pages/customer/customer.component.html | 2 +- .../app/modules/home/pages/customer/customer.component.scss | 2 +- .../src/app/modules/home/pages/customer/customer.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/customer/customer.module.ts | 2 +- .../home/pages/customer/customers-table-config.resolver.ts | 2 +- .../modules/home/pages/dashboard/dashboard-form.component.html | 2 +- .../modules/home/pages/dashboard/dashboard-form.component.scss | 2 +- .../modules/home/pages/dashboard/dashboard-form.component.ts | 2 +- .../modules/home/pages/dashboard/dashboard-routing.module.ts | 2 +- .../modules/home/pages/dashboard/dashboard-tabs.component.html | 2 +- .../modules/home/pages/dashboard/dashboard-tabs.component.ts | 2 +- .../src/app/modules/home/pages/dashboard/dashboard.module.ts | 2 +- .../home/pages/dashboard/dashboards-table-config.resolver.ts | 2 +- .../dashboard/make-dashboard-public-dialog.component.html | 2 +- .../pages/dashboard/make-dashboard-public-dialog.component.ts | 2 +- .../dashboard/manage-dashboard-customers-dialog.component.html | 2 +- .../dashboard/manage-dashboard-customers-dialog.component.ts | 2 +- .../home/pages/device-profile/device-profile-routing.module.ts | 2 +- .../pages/device-profile/device-profile-tabs.component.html | 2 +- .../home/pages/device-profile/device-profile-tabs.component.ts | 2 +- .../modules/home/pages/device-profile/device-profile.module.ts | 2 +- .../device-profile/device-profiles-table-config.resolver.ts | 2 +- .../data/coap-device-transport-configuration.component.html | 2 +- .../data/coap-device-transport-configuration.component.ts | 2 +- .../device/data/default-device-configuration.component.html | 2 +- .../device/data/default-device-configuration.component.ts | 2 +- .../data/default-device-transport-configuration.component.html | 2 +- .../data/default-device-transport-configuration.component.ts | 2 +- .../home/pages/device/data/device-configuration.component.html | 2 +- .../home/pages/device/data/device-configuration.component.ts | 2 +- .../modules/home/pages/device/data/device-data.component.html | 2 +- .../modules/home/pages/device/data/device-data.component.ts | 2 +- .../device/data/device-transport-configuration.component.html | 2 +- .../device/data/device-transport-configuration.component.ts | 2 +- .../data/lwm2m-device-transport-configuration.component.html | 2 +- .../data/lwm2m-device-transport-configuration.component.ts | 2 +- .../data/mqtt-device-transport-configuration.component.html | 2 +- .../data/mqtt-device-transport-configuration.component.ts | 2 +- .../data/snmp-device-transport-configuration.component.html | 2 +- .../data/snmp-device-transport-configuration.component.ts | 2 +- .../device/device-check-connectivity-dialog.component.html | 2 +- .../device/device-check-connectivity-dialog.component.scss | 2 +- .../pages/device/device-check-connectivity-dialog.component.ts | 2 +- .../home/pages/device/device-credentials-dialog.component.html | 2 +- .../home/pages/device/device-credentials-dialog.component.scss | 2 +- .../home/pages/device/device-credentials-dialog.component.ts | 2 +- .../src/app/modules/home/pages/device/device-routing.module.ts | 2 +- .../home/pages/device/device-table-header.component.html | 2 +- .../modules/home/pages/device/device-table-header.component.ts | 2 +- .../app/modules/home/pages/device/device-tabs.component.html | 2 +- .../src/app/modules/home/pages/device/device-tabs.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/device/device.component.html | 2 +- ui-ngx/src/app/modules/home/pages/device/device.component.scss | 2 +- ui-ngx/src/app/modules/home/pages/device/device.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/device/device.module.ts | 2 +- .../modules/home/pages/device/devices-table-config.resolver.ts | 2 +- .../home/pages/edge/edge-instructions-dialog.component.html | 2 +- .../home/pages/edge/edge-instructions-dialog.component.scss | 2 +- .../home/pages/edge/edge-instructions-dialog.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/edge/edge-routing.module.ts | 2 +- .../modules/home/pages/edge/edge-table-header.component.html | 2 +- .../app/modules/home/pages/edge/edge-table-header.component.ts | 2 +- .../src/app/modules/home/pages/edge/edge-tabs.component.html | 2 +- ui-ngx/src/app/modules/home/pages/edge/edge-tabs.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/edge/edge.component.html | 2 +- ui-ngx/src/app/modules/home/pages/edge/edge.component.scss | 2 +- ui-ngx/src/app/modules/home/pages/edge/edge.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/edge/edge.module.ts | 2 +- .../app/modules/home/pages/edge/edges-table-config.resolver.ts | 2 +- .../app/modules/home/pages/entities/entities-routing.module.ts | 2 +- ui-ngx/src/app/modules/home/pages/entities/entities.module.ts | 2 +- .../home/pages/entity-view/entity-view-routing.module.ts | 2 +- .../pages/entity-view/entity-view-table-header.component.html | 2 +- .../pages/entity-view/entity-view-table-header.component.ts | 2 +- .../home/pages/entity-view/entity-view-tabs.component.html | 2 +- .../home/pages/entity-view/entity-view-tabs.component.ts | 2 +- .../modules/home/pages/entity-view/entity-view.component.html | 2 +- .../modules/home/pages/entity-view/entity-view.component.scss | 2 +- .../modules/home/pages/entity-view/entity-view.component.ts | 2 +- .../app/modules/home/pages/entity-view/entity-view.module.ts | 2 +- .../pages/entity-view/entity-views-table-config.resolver.ts | 2 +- .../app/modules/home/pages/features/features-routing.module.ts | 2 +- ui-ngx/src/app/modules/home/pages/features/features.module.ts | 2 +- .../app/modules/home/pages/gateways/gateways-routing.module.ts | 2 +- ui-ngx/src/app/modules/home/pages/gateways/gateways.module.ts | 2 +- .../modules/home/pages/home-links/home-links-routing.module.ts | 2 +- .../modules/home/pages/home-links/home-links.component.html | 2 +- .../modules/home/pages/home-links/home-links.component.scss | 2 +- .../app/modules/home/pages/home-links/home-links.component.ts | 2 +- .../src/app/modules/home/pages/home-links/home-links.module.ts | 2 +- ui-ngx/src/app/modules/home/pages/home-pages.models.ts | 2 +- ui-ngx/src/app/modules/home/pages/home-pages.module.ts | 2 +- .../pages/mobile/applications/applications-routing.module.ts | 2 +- .../home/pages/mobile/applications/applications.module.ts | 2 +- .../pages/mobile/applications/mobile-app-dialog.component.html | 2 +- .../pages/mobile/applications/mobile-app-dialog.component.ts | 2 +- .../mobile/applications/mobile-app-table-config.resolver.ts | 2 +- .../mobile/applications/mobile-app-table-header.component.html | 2 +- .../mobile/applications/mobile-app-table-header.component.scss | 2 +- .../mobile/applications/mobile-app-table-header.component.ts | 2 +- .../home/pages/mobile/applications/mobile-app.component.html | 2 +- .../home/pages/mobile/applications/mobile-app.component.scss | 2 +- .../home/pages/mobile/applications/mobile-app.component.ts | 2 +- .../pages/mobile/applications/remove-app-dialog.component.html | 2 +- .../pages/mobile/applications/remove-app-dialog.component.scss | 2 +- .../pages/mobile/applications/remove-app-dialog.component.ts | 2 +- .../modules/home/pages/mobile/bundes/bundles-routing.module.ts | 2 +- .../src/app/modules/home/pages/mobile/bundes/bundles.module.ts | 2 +- .../mobile/bundes/layout/add-mobile-page-dialog.component.html | 2 +- .../mobile/bundes/layout/add-mobile-page-dialog.component.scss | 2 +- .../mobile/bundes/layout/add-mobile-page-dialog.component.ts | 2 +- .../bundes/layout/custom-mobile-page-panel.component.html | 2 +- .../bundes/layout/custom-mobile-page-panel.component.scss | 2 +- .../mobile/bundes/layout/custom-mobile-page-panel.component.ts | 2 +- .../mobile/bundes/layout/custom-mobile-page.component.html | 2 +- .../mobile/bundes/layout/custom-mobile-page.component.scss | 2 +- .../pages/mobile/bundes/layout/custom-mobile-page.component.ts | 2 +- .../bundes/layout/default-mobile-page-panel.component.html | 2 +- .../bundes/layout/default-mobile-page-panel.component.scss | 2 +- .../bundes/layout/default-mobile-page-panel.component.ts | 2 +- .../pages/mobile/bundes/layout/mobile-layout.component.html | 2 +- .../pages/mobile/bundes/layout/mobile-layout.component.scss | 2 +- .../home/pages/mobile/bundes/layout/mobile-layout.component.ts | 2 +- .../mobile/bundes/layout/mobile-page-item-row.component.html | 2 +- .../mobile/bundes/layout/mobile-page-item-row.component.scss | 2 +- .../mobile/bundes/layout/mobile-page-item-row.component.ts | 2 +- .../bundes/mobile-app-configuration-dialog.component.html | 2 +- .../bundes/mobile-app-configuration-dialog.component.scss | 2 +- .../mobile/bundes/mobile-app-configuration-dialog.component.ts | 2 +- .../pages/mobile/bundes/mobile-bundle-dialog.component.html | 2 +- .../pages/mobile/bundes/mobile-bundle-dialog.component.scss | 2 +- .../home/pages/mobile/bundes/mobile-bundle-dialog.component.ts | 2 +- .../pages/mobile/bundes/mobile-bundle-table-config.resolve.ts | 2 +- .../mobile/bundes/mobile-bundle-table-header.component.html | 2 +- .../mobile/bundes/mobile-bundle-table-header.component.scss | 2 +- .../mobile/bundes/mobile-bundle-table-header.component.ts | 2 +- .../modules/home/pages/mobile/common/common-mobile.module.ts | 2 +- .../home/pages/mobile/common/editor-panel.component.html | 2 +- .../home/pages/mobile/common/editor-panel.component.scss | 2 +- .../modules/home/pages/mobile/common/editor-panel.component.ts | 2 +- .../src/app/modules/home/pages/mobile/mobile-routing.module.ts | 2 +- ui-ngx/src/app/modules/home/pages/mobile/mobile.module.ts | 2 +- .../mobile-qr-code-widget-settings-routing.module.ts | 2 +- .../mobile-qr-code-widget-settings.component.html | 2 +- .../mobile-qr-code-widget-settings.component.scss | 2 +- .../qr-code-widget/mobile-qr-code-widget-settings.component.ts | 2 +- .../qr-code-widget/mobile-qr-code-widget-settings.module.ts | 2 +- .../inbox/inbox-notification-dialog.component.html | 2 +- .../inbox/inbox-notification-dialog.component.scss | 2 +- .../notification/inbox/inbox-notification-dialog.component.ts | 2 +- .../pages/notification/inbox/inbox-table-config.resolver.ts | 2 +- .../pages/notification/inbox/inbox-table-header.component.html | 2 +- .../pages/notification/inbox/inbox-table-header.component.ts | 2 +- .../home/pages/notification/notification-routing.module.ts | 2 +- .../app/modules/home/pages/notification/notification.module.ts | 2 +- .../recipient/recipient-notification-dialog.component.html | 2 +- .../recipient/recipient-notification-dialog.component.scss | 2 +- .../recipient/recipient-notification-dialog.component.ts | 2 +- .../notification/recipient/recipient-table-config.resolver.ts | 2 +- .../pages/notification/rule/escalation-form.component.html | 2 +- .../pages/notification/rule/escalation-form.component.scss | 2 +- .../home/pages/notification/rule/escalation-form.component.ts | 2 +- .../home/pages/notification/rule/escalations.component.html | 2 +- .../home/pages/notification/rule/escalations.component.ts | 2 +- .../notification/rule/rule-notification-dialog.component.html | 2 +- .../notification/rule/rule-notification-dialog.component.scss | 2 +- .../notification/rule/rule-notification-dialog.component.ts | 2 +- .../home/pages/notification/rule/rule-table-config.resolver.ts | 2 +- .../pages/notification/sent/sent-error-dialog.component.html | 2 +- .../pages/notification/sent/sent-error-dialog.component.scss | 2 +- .../pages/notification/sent/sent-error-dialog.component.ts | 2 +- .../notification/sent/sent-notification-dialog.component.html | 2 +- .../notification/sent/sent-notification-dialog.component.scss | 2 +- .../notification/sent/sent-notification-dialog.componet.ts | 2 +- .../home/pages/notification/sent/sent-table-config.resolver.ts | 2 +- .../settings/notification-setting-form.component.html | 2 +- .../settings/notification-setting-form.component.scss | 2 +- .../settings/notification-setting-form.component.ts | 2 +- .../settings/notification-settings-routing.modules.ts | 2 +- .../notification/settings/notification-settings.component.html | 2 +- .../notification/settings/notification-settings.component.scss | 2 +- .../notification/settings/notification-settings.component.ts | 2 +- .../notification-action-button-configuration.component.html | 2 +- .../notification-action-button-configuration.component.ts | 2 +- .../notification-template-configuration.component.html | 2 +- .../notification-template-configuration.component.scss | 2 +- .../notification-template-configuration.component.ts | 2 +- .../home/pages/notification/template/template-configuration.ts | 2 +- .../template/template-notification-dialog.component.html | 2 +- .../template/template-notification-dialog.component.scss | 2 +- .../template/template-notification-dialog.component.ts | 2 +- .../notification/template/template-table-config.resolver.ts | 2 +- .../modules/home/pages/ota-update/ota-update-routing.module.ts | 2 +- .../home/pages/ota-update/ota-update-table-config.resolve.ts | 2 +- .../home/pages/ota-update/ota-update-tabs.component.html | 2 +- .../modules/home/pages/ota-update/ota-update-tabs.component.ts | 2 +- .../modules/home/pages/ota-update/ota-update.component.html | 2 +- .../app/modules/home/pages/ota-update/ota-update.component.ts | 2 +- .../src/app/modules/home/pages/ota-update/ota-update.module.ts | 2 +- .../app/modules/home/pages/profile/profile-routing.module.ts | 2 +- .../src/app/modules/home/pages/profile/profile.component.html | 2 +- .../src/app/modules/home/pages/profile/profile.component.scss | 2 +- ui-ngx/src/app/modules/home/pages/profile/profile.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/profile/profile.module.ts | 2 +- .../app/modules/home/pages/profiles/profiles-routing.module.ts | 2 +- ui-ngx/src/app/modules/home/pages/profiles/profiles.module.ts | 2 +- ui-ngx/src/app/modules/home/pages/public-api.ts | 2 +- .../home/pages/rulechain/add-rule-node-dialog.component.html | 2 +- .../home/pages/rulechain/add-rule-node-dialog.component.scss | 2 +- .../pages/rulechain/add-rule-node-link-dialog.component.html | 2 +- .../pages/rulechain/add-rule-node-link-dialog.component.scss | 2 +- .../rulechain/create-nested-rulechain-dialog.component.html | 2 +- .../modules/home/pages/rulechain/link-labels.component.html | 2 +- .../app/modules/home/pages/rulechain/link-labels.component.ts | 2 +- .../src/app/modules/home/pages/rulechain/rule-node-colors.scss | 2 +- .../home/pages/rulechain/rule-node-config.component.html | 2 +- .../home/pages/rulechain/rule-node-config.component.scss | 2 +- .../modules/home/pages/rulechain/rule-node-config.component.ts | 2 +- .../home/pages/rulechain/rule-node-details.component.html | 2 +- .../home/pages/rulechain/rule-node-details.component.scss | 2 +- .../home/pages/rulechain/rule-node-details.component.ts | 2 +- .../modules/home/pages/rulechain/rule-node-link.component.html | 2 +- .../modules/home/pages/rulechain/rule-node-link.component.ts | 2 +- .../modules/home/pages/rulechain/rulechain-page.component.html | 2 +- .../modules/home/pages/rulechain/rulechain-page.component.scss | 2 +- .../modules/home/pages/rulechain/rulechain-page.component.ts | 2 +- .../app/modules/home/pages/rulechain/rulechain-page.models.ts | 2 +- .../app/modules/home/pages/rulechain/rulechain-page.module.ts | 2 +- .../modules/home/pages/rulechain/rulechain-routing.module.ts | 2 +- .../modules/home/pages/rulechain/rulechain-tabs.component.html | 2 +- .../modules/home/pages/rulechain/rulechain-tabs.component.ts | 2 +- .../app/modules/home/pages/rulechain/rulechain.component.html | 2 +- .../app/modules/home/pages/rulechain/rulechain.component.scss | 2 +- .../app/modules/home/pages/rulechain/rulechain.component.ts | 2 +- .../src/app/modules/home/pages/rulechain/rulechain.module.ts | 2 +- .../home/pages/rulechain/rulechains-table-config.resolver.ts | 2 +- .../app/modules/home/pages/rulechain/rulenode.component.html | 2 +- .../app/modules/home/pages/rulechain/rulenode.component.scss | 2 +- .../src/app/modules/home/pages/rulechain/rulenode.component.ts | 2 +- .../scada-symbol-behavior-panel.component.html | 2 +- .../scada-symbol-behavior-panel.component.scss | 2 +- .../scada-symbol-behavior-panel.component.ts | 2 +- .../scada-symbol-behavior-row.component.html | 2 +- .../scada-symbol-behavior-row.component.scss | 2 +- .../metadata-components/scada-symbol-behavior-row.component.ts | 2 +- .../metadata-components/scada-symbol-behaviors.component.html | 2 +- .../metadata-components/scada-symbol-behaviors.component.scss | 2 +- .../metadata-components/scada-symbol-behaviors.component.ts | 2 +- .../scada-symbol-metadata-components.module.ts | 2 +- .../scada-symbol-metadata-tag-function-panel.component.html | 2 +- .../scada-symbol-metadata-tag-function-panel.component.scss | 2 +- .../scada-symbol-metadata-tag-function-panel.component.ts | 2 +- .../scada-symbol-metadata-tag.component.html | 2 +- .../scada-symbol-metadata-tag.component.scss | 2 +- .../metadata-components/scada-symbol-metadata-tag.component.ts | 2 +- .../scada-symbol-metadata-tags.component.html | 2 +- .../scada-symbol-metadata-tags.component.scss | 2 +- .../scada-symbol-metadata-tags.component.ts | 2 +- .../metadata-components/scada-symbol-metadata.component.html | 2 +- .../metadata-components/scada-symbol-metadata.component.scss | 2 +- .../metadata-components/scada-symbol-metadata.component.ts | 2 +- .../home/pages/scada-symbol/scada-symbol-editor.component.html | 2 +- .../home/pages/scada-symbol/scada-symbol-editor.component.scss | 2 +- .../home/pages/scada-symbol/scada-symbol-editor.component.ts | 2 +- .../home/pages/scada-symbol/scada-symbol-editor.models.ts | 2 +- .../pages/scada-symbol/scada-symbol-tooltip.component.scss | 2 +- .../home/pages/scada-symbol/scada-symbol-tooltip.components.ts | 2 +- .../home/pages/scada-symbol/scada-symbol.component.html | 2 +- .../home/pages/scada-symbol/scada-symbol.component.scss | 2 +- .../modules/home/pages/scada-symbol/scada-symbol.component.ts | 2 +- .../app/modules/home/pages/scada-symbol/scada-symbol.module.ts | 2 +- .../authentication-dialog/authentication-dialog.component.scss | 2 +- .../authentication-dialog/authentication-dialog.map.ts | 2 +- .../backup-code-auth-dialog.component.html | 2 +- .../authentication-dialog/backup-code-auth-dialog.component.ts | 2 +- .../authentication-dialog/email-auth-dialog.component.html | 2 +- .../authentication-dialog/email-auth-dialog.component.ts | 2 +- .../authentication-dialog/sms-auth-dialog.component.html | 2 +- .../authentication-dialog/sms-auth-dialog.component.ts | 2 +- .../authentication-dialog/totp-auth-dialog.component.html | 2 +- .../authentication-dialog/totp-auth-dialog.component.ts | 2 +- .../app/modules/home/pages/security/security-routing.module.ts | 2 +- .../app/modules/home/pages/security/security.component.html | 2 +- .../app/modules/home/pages/security/security.component.scss | 2 +- .../src/app/modules/home/pages/security/security.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/security/security.module.ts | 2 +- .../home/pages/tenant-profile/tenant-profile-routing.module.ts | 2 +- .../pages/tenant-profile/tenant-profile-tabs.component.html | 2 +- .../home/pages/tenant-profile/tenant-profile-tabs.component.ts | 2 +- .../modules/home/pages/tenant-profile/tenant-profile.module.ts | 2 +- .../tenant-profile/tenant-profiles-table-config.resolver.ts | 2 +- .../src/app/modules/home/pages/tenant/tenant-routing.module.ts | 2 +- .../app/modules/home/pages/tenant/tenant-tabs.component.html | 2 +- .../src/app/modules/home/pages/tenant/tenant-tabs.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/tenant/tenant.component.html | 2 +- ui-ngx/src/app/modules/home/pages/tenant/tenant.component.scss | 2 +- ui-ngx/src/app/modules/home/pages/tenant/tenant.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/tenant/tenant.module.ts | 2 +- .../modules/home/pages/tenant/tenants-table-config.resolver.ts | 2 +- .../home/pages/user/activation-link-dialog.component.html | 2 +- .../home/pages/user/activation-link-dialog.component.ts | 2 +- .../app/modules/home/pages/user/add-user-dialog.component.html | 2 +- .../app/modules/home/pages/user/add-user-dialog.component.scss | 2 +- .../app/modules/home/pages/user/add-user-dialog.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/user/user-routing.module.ts | 2 +- .../src/app/modules/home/pages/user/user-tabs.component.html | 2 +- ui-ngx/src/app/modules/home/pages/user/user-tabs.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/user/user.component.html | 2 +- ui-ngx/src/app/modules/home/pages/user/user.component.scss | 2 +- ui-ngx/src/app/modules/home/pages/user/user.component.ts | 2 +- ui-ngx/src/app/modules/home/pages/user/user.module.ts | 2 +- .../app/modules/home/pages/user/users-table-config.resolver.ts | 2 +- ui-ngx/src/app/modules/home/pages/vc/vc-routing.module.ts | 2 +- ui-ngx/src/app/modules/home/pages/vc/vc.module.ts | 2 +- .../pages/widget/save-widget-type-as-dialog.component.html | 2 +- .../home/pages/widget/save-widget-type-as-dialog.component.ts | 2 +- .../home/pages/widget/select-widget-type-dialog.component.html | 2 +- .../home/pages/widget/select-widget-type-dialog.component.scss | 2 +- .../home/pages/widget/select-widget-type-dialog.component.ts | 2 +- .../app/modules/home/pages/widget/widget-editor.component.html | 2 +- .../app/modules/home/pages/widget/widget-editor.component.scss | 2 +- .../app/modules/home/pages/widget/widget-editor.component.ts | 2 +- .../src/app/modules/home/pages/widget/widget-editor.models.ts | 2 +- .../modules/home/pages/widget/widget-library-routing.module.ts | 2 +- .../src/app/modules/home/pages/widget/widget-library.module.ts | 2 +- .../home/pages/widget/widget-type-autocomplete.component.html | 2 +- .../home/pages/widget/widget-type-autocomplete.component.scss | 2 +- .../home/pages/widget/widget-type-autocomplete.component.ts | 2 +- .../modules/home/pages/widget/widget-type-tabs.component.html | 2 +- .../modules/home/pages/widget/widget-type-tabs.component.ts | 2 +- .../app/modules/home/pages/widget/widget-type.component.html | 2 +- .../src/app/modules/home/pages/widget/widget-type.component.ts | 2 +- .../home/pages/widget/widget-types-table-config.resolver.ts | 2 +- .../home/pages/widget/widgets-bundle-dialog.component.html | 2 +- .../home/pages/widget/widgets-bundle-dialog.component.scss | 2 +- .../home/pages/widget/widgets-bundle-dialog.component.ts | 2 +- .../home/pages/widget/widgets-bundle-tabs.component.html | 2 +- .../modules/home/pages/widget/widgets-bundle-tabs.component.ts | 2 +- .../home/pages/widget/widgets-bundle-widgets.component.html | 2 +- .../home/pages/widget/widgets-bundle-widgets.component.scss | 2 +- .../home/pages/widget/widgets-bundle-widgets.component.ts | 2 +- .../modules/home/pages/widget/widgets-bundle.component.html | 2 +- .../modules/home/pages/widget/widgets-bundle.component.scss | 2 +- .../app/modules/home/pages/widget/widgets-bundle.component.ts | 2 +- .../home/pages/widget/widgets-bundles-table-config.resolver.ts | 2 +- ui-ngx/src/app/modules/home/public-api.ts | 2 +- ui-ngx/src/app/modules/login/login-routing.module.ts | 2 +- ui-ngx/src/app/modules/login/login.module.ts | 2 +- .../modules/login/pages/login/create-password.component.html | 2 +- .../modules/login/pages/login/create-password.component.scss | 2 +- .../app/modules/login/pages/login/create-password.component.ts | 2 +- .../app/modules/login/pages/login/link-expired.component.html | 2 +- .../app/modules/login/pages/login/link-expired.component.scss | 2 +- .../app/modules/login/pages/login/link-expired.component.ts | 2 +- ui-ngx/src/app/modules/login/pages/login/login.component.html | 2 +- ui-ngx/src/app/modules/login/pages/login/login.component.scss | 2 +- ui-ngx/src/app/modules/login/pages/login/login.component.ts | 2 +- .../login/pages/login/reset-password-request.component.html | 2 +- .../login/pages/login/reset-password-request.component.scss | 2 +- .../login/pages/login/reset-password-request.component.ts | 2 +- .../modules/login/pages/login/reset-password.component.html | 2 +- .../modules/login/pages/login/reset-password.component.scss | 2 +- .../app/modules/login/pages/login/reset-password.component.ts | 2 +- .../login/pages/login/two-factor-auth-login.component.html | 2 +- .../login/pages/login/two-factor-auth-login.component.scss | 2 +- .../login/pages/login/two-factor-auth-login.component.ts | 2 +- ui-ngx/src/app/shared/adapter/custom-datatime-adapter.ts | 2 +- ui-ngx/src/app/shared/animations/speed-dial-fab.animations.ts | 2 +- ui-ngx/src/app/shared/components/breadcrumb.component.html | 2 +- ui-ngx/src/app/shared/components/breadcrumb.component.scss | 2 +- ui-ngx/src/app/shared/components/breadcrumb.component.ts | 2 +- ui-ngx/src/app/shared/components/breadcrumb.ts | 2 +- .../app/shared/components/button/copy-button.component.html | 2 +- .../app/shared/components/button/copy-button.component.scss | 2 +- .../src/app/shared/components/button/copy-button.component.ts | 2 +- .../shared/components/button/toggle-password.component.html | 2 +- .../app/shared/components/button/toggle-password.component.ts | 2 +- .../components/button/widget-button-toggle.component.html | 2 +- .../components/button/widget-button-toggle.component.scss | 2 +- .../shared/components/button/widget-button-toggle.component.ts | 2 +- .../app/shared/components/button/widget-button.component.html | 2 +- .../app/shared/components/button/widget-button.component.scss | 2 +- .../app/shared/components/button/widget-button.component.ts | 2 +- .../src/app/shared/components/button/widget-button.models.ts | 2 +- ui-ngx/src/app/shared/components/cheatsheet.component.ts | 2 +- .../src/app/shared/components/circular-progress.directive.ts | 2 +- ui-ngx/src/app/shared/components/color-input.component.html | 2 +- ui-ngx/src/app/shared/components/color-input.component.scss | 2 +- ui-ngx/src/app/shared/components/color-input.component.ts | 2 +- .../components/color-picker/color-picker-panel.component.html | 2 +- .../components/color-picker/color-picker-panel.component.scss | 2 +- .../components/color-picker/color-picker-panel.component.ts | 2 +- .../shared/components/color-picker/color-picker.component.html | 2 +- .../shared/components/color-picker/color-picker.component.scss | 2 +- .../shared/components/color-picker/color-picker.component.ts | 2 +- .../shared/components/color-picker/hex-input.component.html | 2 +- .../shared/components/color-picker/hex-input.component.scss | 2 +- .../app/shared/components/color-picker/hex-input.component.ts | 2 +- ui-ngx/src/app/shared/components/contact.component.html | 2 +- ui-ngx/src/app/shared/components/contact.component.ts | 2 +- .../app/shared/components/country-autocomplete.component.html | 2 +- .../app/shared/components/country-autocomplete.component.ts | 2 +- ui-ngx/src/app/shared/components/css.component.html | 2 +- ui-ngx/src/app/shared/components/css.component.scss | 2 +- ui-ngx/src/app/shared/components/css.component.ts | 2 +- .../shared/components/dashboard-autocomplete.component.html | 2 +- .../app/shared/components/dashboard-autocomplete.component.ts | 2 +- .../shared/components/dashboard-select-panel.component.html | 2 +- .../shared/components/dashboard-select-panel.component.scss | 2 +- .../app/shared/components/dashboard-select-panel.component.ts | 2 +- .../src/app/shared/components/dashboard-select.component.html | 2 +- .../src/app/shared/components/dashboard-select.component.scss | 2 +- ui-ngx/src/app/shared/components/dashboard-select.component.ts | 2 +- .../components/dashboard-state-autocomplete.component.html | 2 +- .../components/dashboard-state-autocomplete.component.ts | 2 +- ui-ngx/src/app/shared/components/dialog.component.ts | 2 +- .../app/shared/components/dialog/alert-dialog.component.html | 2 +- .../app/shared/components/dialog/alert-dialog.component.scss | 2 +- .../src/app/shared/components/dialog/alert-dialog.component.ts | 2 +- .../components/dialog/color-picker-dialog.component.html | 2 +- .../components/dialog/color-picker-dialog.component.scss | 2 +- .../shared/components/dialog/color-picker-dialog.component.ts | 2 +- .../app/shared/components/dialog/confirm-dialog.component.html | 2 +- .../app/shared/components/dialog/confirm-dialog.component.scss | 2 +- .../app/shared/components/dialog/confirm-dialog.component.ts | 2 +- .../entity-conflict-dialog.component.html | 2 +- .../entity-conflict-dialog.component.scss | 2 +- .../entity-conflict-dialog/entity-conflict-dialog.component.ts | 2 +- .../shared/components/dialog/error-alert-dialog.component.html | 2 +- .../shared/components/dialog/error-alert-dialog.component.scss | 2 +- .../shared/components/dialog/error-alert-dialog.component.ts | 2 +- .../components/dialog/json-object-edit-dialog.component.html | 2 +- .../components/dialog/json-object-edit-dialog.component.ts | 2 +- .../components/dialog/material-icons-dialog.component.html | 2 +- .../components/dialog/material-icons-dialog.component.scss | 2 +- .../components/dialog/material-icons-dialog.component.ts | 2 +- .../components/dialog/node-script-test-dialog.component.html | 2 +- .../components/dialog/node-script-test-dialog.component.scss | 2 +- .../components/dialog/node-script-test-dialog.component.ts | 2 +- .../app/shared/components/dialog/todo-dialog.component.html | 2 +- .../app/shared/components/dialog/todo-dialog.component.scss | 2 +- .../src/app/shared/components/dialog/todo-dialog.component.ts | 2 +- .../shared/components/directives/component-outlet.directive.ts | 2 +- .../components/directives/sring-template-outlet.directive.ts | 2 +- .../components/directives/tb-json-to-string.directive.ts | 2 +- .../components/entity/entity-autocomplete.component.html | 2 +- .../shared/components/entity/entity-autocomplete.component.ts | 2 +- .../components/entity/entity-gateway-select.component.html | 2 +- .../components/entity/entity-gateway-select.component.ts | 2 +- .../components/entity/entity-key-autocomplete.component.html | 2 +- .../components/entity/entity-key-autocomplete.component.ts | 2 +- .../shared/components/entity/entity-keys-list.component.html | 2 +- .../app/shared/components/entity/entity-keys-list.component.ts | 2 +- .../shared/components/entity/entity-list-select.component.html | 2 +- .../shared/components/entity/entity-list-select.component.scss | 2 +- .../shared/components/entity/entity-list-select.component.ts | 2 +- .../app/shared/components/entity/entity-list.component.html | 2 +- .../src/app/shared/components/entity/entity-list.component.ts | 2 +- .../app/shared/components/entity/entity-select.component.html | 2 +- .../app/shared/components/entity/entity-select.component.scss | 2 +- .../app/shared/components/entity/entity-select.component.ts | 2 +- .../entity/entity-subtype-autocomplete.component.html | 2 +- .../components/entity/entity-subtype-autocomplete.component.ts | 2 +- .../components/entity/entity-subtype-list.component.html | 2 +- .../shared/components/entity/entity-subtype-list.component.ts | 2 +- .../components/entity/entity-subtype-select.component.html | 2 +- .../components/entity/entity-subtype-select.component.scss | 2 +- .../components/entity/entity-subtype-select.component.ts | 2 +- .../shared/components/entity/entity-type-list.component.html | 2 +- .../app/shared/components/entity/entity-type-list.component.ts | 2 +- .../shared/components/entity/entity-type-select.component.html | 2 +- .../shared/components/entity/entity-type-select.component.scss | 2 +- .../shared/components/entity/entity-type-select.component.ts | 2 +- ui-ngx/src/app/shared/components/fab-toolbar.component.html | 2 +- ui-ngx/src/app/shared/components/fab-toolbar.component.scss | 2 +- ui-ngx/src/app/shared/components/fab-toolbar.component.ts | 2 +- ui-ngx/src/app/shared/components/file-input.component.html | 2 +- ui-ngx/src/app/shared/components/file-input.component.scss | 2 +- ui-ngx/src/app/shared/components/file-input.component.ts | 2 +- .../app/shared/components/footer-fab-buttons.component.html | 2 +- .../app/shared/components/footer-fab-buttons.component.scss | 2 +- .../src/app/shared/components/footer-fab-buttons.component.ts | 2 +- ui-ngx/src/app/shared/components/footer.component.html | 2 +- ui-ngx/src/app/shared/components/footer.component.scss | 2 +- ui-ngx/src/app/shared/components/footer.component.ts | 2 +- ui-ngx/src/app/shared/components/fullscreen.directive.ts | 2 +- .../src/app/shared/components/grid/scroll-grid-datasource.ts | 2 +- .../src/app/shared/components/grid/scroll-grid.component.html | 2 +- .../src/app/shared/components/grid/scroll-grid.component.scss | 2 +- ui-ngx/src/app/shared/components/grid/scroll-grid.component.ts | 2 +- ui-ngx/src/app/shared/components/help-markdown.component.html | 2 +- ui-ngx/src/app/shared/components/help-markdown.component.scss | 2 +- ui-ngx/src/app/shared/components/help-markdown.component.ts | 2 +- ui-ngx/src/app/shared/components/help-popup.component.html | 2 +- ui-ngx/src/app/shared/components/help-popup.component.scss | 2 +- ui-ngx/src/app/shared/components/help-popup.component.ts | 2 +- ui-ngx/src/app/shared/components/help.component.html | 2 +- ui-ngx/src/app/shared/components/help.component.ts | 2 +- .../src/app/shared/components/hint-tooltip-icon.component.html | 2 +- .../src/app/shared/components/hint-tooltip-icon.component.scss | 2 +- .../src/app/shared/components/hint-tooltip-icon.component.ts | 2 +- ui-ngx/src/app/shared/components/hotkeys.directive.ts | 2 +- ui-ngx/src/app/shared/components/html.component.html | 2 +- ui-ngx/src/app/shared/components/html.component.scss | 2 +- ui-ngx/src/app/shared/components/html.component.ts | 2 +- ui-ngx/src/app/shared/components/icon.component.ts | 2 +- ui-ngx/src/app/shared/components/image-input.component.html | 2 +- ui-ngx/src/app/shared/components/image-input.component.scss | 2 +- ui-ngx/src/app/shared/components/image-input.component.ts | 2 +- .../shared/components/image/embed-image-dialog.component.html | 2 +- .../shared/components/image/embed-image-dialog.component.scss | 2 +- .../shared/components/image/embed-image-dialog.component.ts | 2 +- .../shared/components/image/gallery-image-input.component.html | 2 +- .../shared/components/image/gallery-image-input.component.scss | 2 +- .../shared/components/image/gallery-image-input.component.ts | 2 +- .../app/shared/components/image/image-dialog.component.html | 2 +- .../app/shared/components/image/image-dialog.component.scss | 2 +- .../src/app/shared/components/image/image-dialog.component.ts | 2 +- .../components/image/image-gallery-dialog.component.html | 2 +- .../components/image/image-gallery-dialog.component.scss | 2 +- .../shared/components/image/image-gallery-dialog.component.ts | 2 +- .../app/shared/components/image/image-gallery.component.html | 2 +- .../app/shared/components/image/image-gallery.component.scss | 2 +- .../src/app/shared/components/image/image-gallery.component.ts | 2 +- .../shared/components/image/image-references.component.html | 2 +- .../shared/components/image/image-references.component.scss | 2 +- .../app/shared/components/image/image-references.component.ts | 2 +- ui-ngx/src/app/shared/components/image/images-datasource.ts | 2 +- .../image/multiple-gallery-image-input.component.html | 2 +- .../image/multiple-gallery-image-input.component.scss | 2 +- .../components/image/multiple-gallery-image-input.component.ts | 2 +- .../shared/components/image/scada-symbol-input.component.html | 2 +- .../shared/components/image/scada-symbol-input.component.scss | 2 +- .../shared/components/image/scada-symbol-input.component.ts | 2 +- .../shared/components/image/upload-image-dialog.component.html | 2 +- .../shared/components/image/upload-image-dialog.component.ts | 2 +- .../app/shared/components/js-func-module-row.component.html | 2 +- .../app/shared/components/js-func-module-row.component.scss | 2 +- .../src/app/shared/components/js-func-module-row.component.ts | 2 +- .../src/app/shared/components/js-func-modules.component.html | 2 +- .../src/app/shared/components/js-func-modules.component.scss | 2 +- ui-ngx/src/app/shared/components/js-func-modules.component.ts | 2 +- ui-ngx/src/app/shared/components/js-func.component.html | 2 +- ui-ngx/src/app/shared/components/js-func.component.scss | 2 +- ui-ngx/src/app/shared/components/js-func.component.ts | 2 +- ui-ngx/src/app/shared/components/json-content.component.html | 2 +- ui-ngx/src/app/shared/components/json-content.component.scss | 2 +- ui-ngx/src/app/shared/components/json-content.component.ts | 2 +- .../src/app/shared/components/json-object-edit.component.html | 2 +- .../src/app/shared/components/json-object-edit.component.scss | 2 +- ui-ngx/src/app/shared/components/json-object-edit.component.ts | 2 +- .../src/app/shared/components/json-object-view.component.html | 2 +- .../src/app/shared/components/json-object-view.component.scss | 2 +- ui-ngx/src/app/shared/components/json-object-view.component.ts | 2 +- ui-ngx/src/app/shared/components/kv-map.component.html | 2 +- ui-ngx/src/app/shared/components/kv-map.component.scss | 2 +- ui-ngx/src/app/shared/components/kv-map.component.ts | 2 +- ui-ngx/src/app/shared/components/led-light.component.html | 2 +- ui-ngx/src/app/shared/components/led-light.component.ts | 2 +- ui-ngx/src/app/shared/components/logo.component.html | 2 +- ui-ngx/src/app/shared/components/logo.component.scss | 2 +- ui-ngx/src/app/shared/components/logo.component.ts | 2 +- .../src/app/shared/components/markdown-editor.component.html | 2 +- .../src/app/shared/components/markdown-editor.component.scss | 2 +- ui-ngx/src/app/shared/components/markdown-editor.component.ts | 2 +- ui-ngx/src/app/shared/components/markdown.component.html | 2 +- ui-ngx/src/app/shared/components/markdown.component.scss | 2 +- ui-ngx/src/app/shared/components/markdown.component.ts | 2 +- ui-ngx/src/app/shared/components/marked-options.service.ts | 2 +- .../app/shared/components/material-icon-select.component.html | 2 +- .../app/shared/components/material-icon-select.component.scss | 2 +- .../app/shared/components/material-icon-select.component.ts | 2 +- ui-ngx/src/app/shared/components/material-icons.component.html | 2 +- ui-ngx/src/app/shared/components/material-icons.component.scss | 2 +- ui-ngx/src/app/shared/components/material-icons.component.ts | 2 +- .../shared/components/message-type-autocomplete.component.html | 2 +- .../shared/components/message-type-autocomplete.component.ts | 2 +- .../app/shared/components/mqtt-version-select.component.html | 2 +- .../src/app/shared/components/mqtt-version-select.component.ts | 2 +- .../app/shared/components/multiple-image-input.component.html | 2 +- .../app/shared/components/multiple-image-input.component.scss | 2 +- .../app/shared/components/multiple-image-input.component.ts | 2 +- ui-ngx/src/app/shared/components/nav-tree.component.html | 2 +- ui-ngx/src/app/shared/components/nav-tree.component.scss | 2 +- ui-ngx/src/app/shared/components/nav-tree.component.ts | 2 +- .../shared/components/notification/notification.component.html | 2 +- .../shared/components/notification/notification.component.scss | 2 +- .../shared/components/notification/notification.component.ts | 2 +- .../notification/template-autocomplete.component.html | 2 +- .../notification/template-autocomplete.component.scss | 2 +- .../components/notification/template-autocomplete.component.ts | 2 +- .../ota-package/ota-package-autocomplete.component.html | 2 +- .../ota-package/ota-package-autocomplete.component.scss | 2 +- .../ota-package/ota-package-autocomplete.component.ts | 2 +- ui-ngx/src/app/shared/components/page.component.ts | 2 +- ui-ngx/src/app/shared/components/phone-input.component.html | 2 +- ui-ngx/src/app/shared/components/phone-input.component.scss | 2 +- ui-ngx/src/app/shared/components/phone-input.component.ts | 2 +- ui-ngx/src/app/shared/components/popover.component.scss | 2 +- ui-ngx/src/app/shared/components/popover.component.ts | 2 +- ui-ngx/src/app/shared/components/popover.models.ts | 2 +- ui-ngx/src/app/shared/components/popover.service.ts | 2 +- .../src/app/shared/components/protobuf-content.component.html | 2 +- .../src/app/shared/components/protobuf-content.component.scss | 2 +- ui-ngx/src/app/shared/components/protobuf-content.component.ts | 2 +- ui-ngx/src/app/shared/components/public-api.ts | 2 +- .../shared/components/queue/queue-autocomplete.component.html | 2 +- .../shared/components/queue/queue-autocomplete.component.scss | 2 +- .../shared/components/queue/queue-autocomplete.component.ts | 2 +- .../relation/relation-type-autocomplete.component.html | 2 +- .../relation/relation-type-autocomplete.component.ts | 2 +- .../components/resource/resource-autocomplete.component.html | 2 +- .../components/resource/resource-autocomplete.component.ts | 2 +- .../components/resource/resources-in-use-dialog.component.html | 2 +- .../components/resource/resources-in-use-dialog.component.scss | 2 +- .../components/resource/resources-in-use-dialog.component.ts | 2 +- .../rule-chain/rule-chain-select-panel.component.html | 2 +- .../rule-chain/rule-chain-select-panel.component.scss | 2 +- .../components/rule-chain/rule-chain-select-panel.component.ts | 2 +- .../components/rule-chain/rule-chain-select.component.html | 2 +- .../components/rule-chain/rule-chain-select.component.scss | 2 +- .../components/rule-chain/rule-chain-select.component.ts | 2 +- ui-ngx/src/app/shared/components/script-lang.component.html | 2 +- ui-ngx/src/app/shared/components/script-lang.component.scss | 2 +- ui-ngx/src/app/shared/components/script-lang.component.ts | 2 +- .../components/slack-conversation-autocomplete.component.html | 2 +- .../components/slack-conversation-autocomplete.component.scss | 2 +- .../components/slack-conversation-autocomplete.component.ts | 2 +- ui-ngx/src/app/shared/components/snack-bar-component.html | 2 +- ui-ngx/src/app/shared/components/snack-bar-component.scss | 2 +- .../src/app/shared/components/socialshare-panel.component.html | 2 +- .../src/app/shared/components/socialshare-panel.component.scss | 2 +- .../src/app/shared/components/socialshare-panel.component.ts | 2 +- .../app/shared/components/string-autocomplete.component.html | 2 +- .../app/shared/components/string-autocomplete.component.scss | 2 +- .../src/app/shared/components/string-autocomplete.component.ts | 2 +- .../src/app/shared/components/string-items-list.component.html | 2 +- .../src/app/shared/components/string-items-list.component.ts | 2 +- ui-ngx/src/app/shared/components/svg-xml.component.html | 2 +- ui-ngx/src/app/shared/components/svg-xml.component.scss | 2 +- ui-ngx/src/app/shared/components/svg-xml.component.ts | 2 +- .../app/shared/components/table/table-datasource.abstract.ts | 2 +- ui-ngx/src/app/shared/components/tb-anchor.component.ts | 2 +- ui-ngx/src/app/shared/components/tb-checkbox.component.html | 2 +- ui-ngx/src/app/shared/components/tb-checkbox.component.ts | 2 +- ui-ngx/src/app/shared/components/tb-error.component.ts | 2 +- .../aggregation-options-config-panel.component.html | 2 +- .../aggregation-options-config-panel.component.scss | 2 +- .../aggregation/aggregation-options-config-panel.component.ts | 2 +- .../time/aggregation/aggregation-type-select.component.html | 2 +- .../time/aggregation/aggregation-type-select.component.scss | 2 +- .../time/aggregation/aggregation-type-select.component.ts | 2 +- .../time/aggregation/grouping-interval-options.component.html | 2 +- .../time/aggregation/grouping-interval-options.component.scss | 2 +- .../time/aggregation/grouping-interval-options.component.ts | 2 +- .../app/shared/components/time/datapoints-limit.component.html | 2 +- .../app/shared/components/time/datapoints-limit.component.scss | 2 +- .../app/shared/components/time/datapoints-limit.component.ts | 2 +- .../app/shared/components/time/datetime-period.component.html | 2 +- .../app/shared/components/time/datetime-period.component.scss | 2 +- .../app/shared/components/time/datetime-period.component.ts | 2 +- ui-ngx/src/app/shared/components/time/datetime.component.html | 2 +- ui-ngx/src/app/shared/components/time/datetime.component.scss | 2 +- ui-ngx/src/app/shared/components/time/datetime.component.ts | 2 +- .../time/history-selector/history-selector.component.html | 2 +- .../time/history-selector/history-selector.component.scss | 2 +- .../time/history-selector/history-selector.component.ts | 2 +- .../time/interval-options-config-panel.component.html | 2 +- .../time/interval-options-config-panel.component.scss | 2 +- .../components/time/interval-options-config-panel.component.ts | 2 +- .../shared/components/time/quick-time-interval.component.html | 2 +- .../shared/components/time/quick-time-interval.component.scss | 2 +- .../shared/components/time/quick-time-interval.component.ts | 2 +- .../src/app/shared/components/time/timeinterval.component.html | 2 +- .../src/app/shared/components/time/timeinterval.component.scss | 2 +- .../src/app/shared/components/time/timeinterval.component.ts | 2 +- .../components/time/timewindow-config-dialog.component.html | 2 +- .../components/time/timewindow-config-dialog.component.scss | 2 +- .../components/time/timewindow-config-dialog.component.ts | 2 +- ui-ngx/src/app/shared/components/time/timewindow-form.scss | 2 +- .../app/shared/components/time/timewindow-panel.component.html | 2 +- .../app/shared/components/time/timewindow-panel.component.scss | 2 +- .../app/shared/components/time/timewindow-panel.component.ts | 2 +- .../src/app/shared/components/time/timewindow.component.html | 2 +- .../src/app/shared/components/time/timewindow.component.scss | 2 +- ui-ngx/src/app/shared/components/time/timewindow.component.ts | 2 +- .../app/shared/components/time/timezone-panel.component.html | 2 +- .../app/shared/components/time/timezone-panel.component.scss | 2 +- .../src/app/shared/components/time/timezone-panel.component.ts | 2 +- .../app/shared/components/time/timezone-select.component.html | 2 +- .../app/shared/components/time/timezone-select.component.ts | 2 +- ui-ngx/src/app/shared/components/time/timezone.component.html | 2 +- ui-ngx/src/app/shared/components/time/timezone.component.scss | 2 +- ui-ngx/src/app/shared/components/time/timezone.component.ts | 2 +- ui-ngx/src/app/shared/components/toast.directive.ts | 2 +- ui-ngx/src/app/shared/components/toggle-header.component.html | 2 +- ui-ngx/src/app/shared/components/toggle-header.component.scss | 2 +- ui-ngx/src/app/shared/components/toggle-header.component.ts | 2 +- ui-ngx/src/app/shared/components/toggle-select.component.html | 2 +- ui-ngx/src/app/shared/components/toggle-select.component.scss | 2 +- ui-ngx/src/app/shared/components/toggle-select.component.ts | 2 +- ui-ngx/src/app/shared/components/tokens.ts | 2 +- ui-ngx/src/app/shared/components/unit-input.component.html | 2 +- ui-ngx/src/app/shared/components/unit-input.component.scss | 2 +- ui-ngx/src/app/shared/components/unit-input.component.ts | 2 +- .../app/shared/components/unit-settings-panel.component.html | 2 +- .../app/shared/components/unit-settings-panel.component.scss | 2 +- .../src/app/shared/components/unit-settings-panel.component.ts | 2 +- ui-ngx/src/app/shared/components/user-menu.component.html | 2 +- ui-ngx/src/app/shared/components/user-menu.component.scss | 2 +- ui-ngx/src/app/shared/components/user-menu.component.ts | 2 +- ui-ngx/src/app/shared/components/value-input.component.html | 2 +- ui-ngx/src/app/shared/components/value-input.component.scss | 2 +- ui-ngx/src/app/shared/components/value-input.component.ts | 2 +- .../shared/components/vc/branch-autocomplete.component.html | 2 +- .../shared/components/vc/branch-autocomplete.component.scss | 2 +- .../app/shared/components/vc/branch-autocomplete.component.ts | 2 +- .../app/shared/components/widgets-bundle-search.component.html | 2 +- .../app/shared/components/widgets-bundle-search.component.scss | 2 +- .../app/shared/components/widgets-bundle-search.component.ts | 2 +- .../app/shared/components/widgets-bundle-select.component.html | 2 +- .../app/shared/components/widgets-bundle-select.component.scss | 2 +- .../app/shared/components/widgets-bundle-select.component.ts | 2 +- ui-ngx/src/app/shared/decorators/coercion.ts | 2 +- ui-ngx/src/app/shared/decorators/enumerable.ts | 2 +- ui-ngx/src/app/shared/decorators/public-api.ts | 2 +- ui-ngx/src/app/shared/directives/context-menu.directive.ts | 2 +- .../src/app/shared/directives/ellipsis-chip-list.directive.ts | 2 +- ui-ngx/src/app/shared/directives/public-api.ts | 2 +- .../app/shared/directives/truncate-with-tooltip.directive.ts | 2 +- .../shared/import-export/export-resource-dialog.component.html | 2 +- .../shared/import-export/export-resource-dialog.component.ts | 2 +- .../app/shared/import-export/import-dialog-csv.component.html | 2 +- .../app/shared/import-export/import-dialog-csv.component.scss | 2 +- .../app/shared/import-export/import-dialog-csv.component.ts | 2 +- .../src/app/shared/import-export/import-dialog.component.html | 2 +- ui-ngx/src/app/shared/import-export/import-dialog.component.ts | 2 +- ui-ngx/src/app/shared/import-export/import-export.models.ts | 2 +- ui-ngx/src/app/shared/import-export/import-export.service.ts | 2 +- .../import-export/table-columns-assignment.component.html | 2 +- .../import-export/table-columns-assignment.component.scss | 2 +- .../shared/import-export/table-columns-assignment.component.ts | 2 +- ui-ngx/src/app/shared/legacy/json-form-utils.ts | 2 +- ui-ngx/src/app/shared/legacy/json-form.models.ts | 2 +- ui-ngx/src/app/shared/models/ace/ace.models.ts | 2 +- ui-ngx/src/app/shared/models/ace/completion.models.ts | 2 +- ui-ngx/src/app/shared/models/ace/service-completion.models.ts | 2 +- ui-ngx/src/app/shared/models/ace/tbel-utils.models.ts | 2 +- ui-ngx/src/app/shared/models/ace/tbel/mode-tbel.js | 2 +- ui-ngx/src/app/shared/models/ace/tbel/worker-tbel.js | 2 +- ui-ngx/src/app/shared/models/ace/widget-completion.models.ts | 2 +- ui-ngx/src/app/shared/models/action-widget-settings.models.ts | 2 +- ui-ngx/src/app/shared/models/ai-model.models.ts | 2 +- ui-ngx/src/app/shared/models/alarm.models.ts | 2 +- ui-ngx/src/app/shared/models/alias.models.ts | 2 +- ui-ngx/src/app/shared/models/api-usage.models.ts | 2 +- ui-ngx/src/app/shared/models/asset.models.ts | 2 +- ui-ngx/src/app/shared/models/audit-log.models.ts | 2 +- ui-ngx/src/app/shared/models/authority.enum.ts | 2 +- ui-ngx/src/app/shared/models/base-data.ts | 2 +- ui-ngx/src/app/shared/models/beautify.models.ts | 2 +- ui-ngx/src/app/shared/models/calculated-field.models.ts | 2 +- ui-ngx/src/app/shared/models/color.models.ts | 2 +- ui-ngx/src/app/shared/models/common.ts | 2 +- ui-ngx/src/app/shared/models/component-descriptor.models.ts | 2 +- ui-ngx/src/app/shared/models/constants.ts | 2 +- ui-ngx/src/app/shared/models/contact-based.model.ts | 2 +- ui-ngx/src/app/shared/models/country.models.ts | 2 +- ui-ngx/src/app/shared/models/customer.model.ts | 2 +- ui-ngx/src/app/shared/models/dashboard.models.ts | 2 +- ui-ngx/src/app/shared/models/device.models.ts | 2 +- ui-ngx/src/app/shared/models/dynamic-form.models.ts | 2 +- ui-ngx/src/app/shared/models/edge.models.ts | 2 +- ui-ngx/src/app/shared/models/entity-type.models.ts | 2 +- ui-ngx/src/app/shared/models/entity-view.models.ts | 2 +- ui-ngx/src/app/shared/models/entity.models.ts | 2 +- ui-ngx/src/app/shared/models/error.models.ts | 2 +- ui-ngx/src/app/shared/models/event.models.ts | 2 +- ui-ngx/src/app/shared/models/icon.models.ts | 2 +- ui-ngx/src/app/shared/models/id/ai-model-id.ts | 2 +- ui-ngx/src/app/shared/models/id/alarm-comment-id.ts | 2 +- ui-ngx/src/app/shared/models/id/alarm-id.ts | 2 +- ui-ngx/src/app/shared/models/id/asset-id.ts | 2 +- ui-ngx/src/app/shared/models/id/asset-profile-id.ts | 2 +- ui-ngx/src/app/shared/models/id/audit-log-id.ts | 2 +- ui-ngx/src/app/shared/models/id/calculated-field-id.ts | 2 +- ui-ngx/src/app/shared/models/id/customer-id.ts | 2 +- ui-ngx/src/app/shared/models/id/dashboard-id.ts | 2 +- ui-ngx/src/app/shared/models/id/device-credentials-id.ts | 2 +- ui-ngx/src/app/shared/models/id/device-id.ts | 2 +- ui-ngx/src/app/shared/models/id/device-profile-id.ts | 2 +- ui-ngx/src/app/shared/models/id/domain-id.ts | 2 +- ui-ngx/src/app/shared/models/id/edge-id.ts | 2 +- ui-ngx/src/app/shared/models/id/entity-id.ts | 2 +- ui-ngx/src/app/shared/models/id/entity-view-id.ts | 2 +- ui-ngx/src/app/shared/models/id/event-id.ts | 2 +- ui-ngx/src/app/shared/models/id/has-uuid.ts | 2 +- ui-ngx/src/app/shared/models/id/mobile-app-bundle-id.ts | 2 +- ui-ngx/src/app/shared/models/id/mobile-app-id.ts | 2 +- ui-ngx/src/app/shared/models/id/notification-id.ts | 2 +- ui-ngx/src/app/shared/models/id/notification-request-id.ts | 2 +- ui-ngx/src/app/shared/models/id/notification-rule-id.ts | 2 +- ui-ngx/src/app/shared/models/id/notification-target-id.ts | 2 +- ui-ngx/src/app/shared/models/id/notification-template-id.ts | 2 +- ui-ngx/src/app/shared/models/id/oauth2-client-id.ts | 2 +- ui-ngx/src/app/shared/models/id/ota-package-id.ts | 2 +- ui-ngx/src/app/shared/models/id/public-api.ts | 2 +- ui-ngx/src/app/shared/models/id/queue-id.ts | 2 +- ui-ngx/src/app/shared/models/id/rpc-id.ts | 2 +- ui-ngx/src/app/shared/models/id/rule-chain-id.ts | 2 +- ui-ngx/src/app/shared/models/id/rule-node-id.ts | 2 +- ui-ngx/src/app/shared/models/id/tb-resource-id.ts | 2 +- ui-ngx/src/app/shared/models/id/tenant-id.ts | 2 +- ui-ngx/src/app/shared/models/id/tenant-profile-id.ts | 2 +- ui-ngx/src/app/shared/models/id/user-id.ts | 2 +- ui-ngx/src/app/shared/models/id/widget-type-id.ts | 2 +- ui-ngx/src/app/shared/models/id/widgets-bundle-id.ts | 2 +- ui-ngx/src/app/shared/models/jquery-event.models.ts | 2 +- ui-ngx/src/app/shared/models/js-function.models.ts | 2 +- ui-ngx/src/app/shared/models/limited-api.models.ts | 2 +- ui-ngx/src/app/shared/models/login.models.ts | 2 +- ui-ngx/src/app/shared/models/lwm2m-security-config.models.ts | 2 +- ui-ngx/src/app/shared/models/material.models.ts | 2 +- ui-ngx/src/app/shared/models/mobile-app.models.ts | 2 +- ui-ngx/src/app/shared/models/mqtt.models.ts | 2 +- ui-ngx/src/app/shared/models/notification.models.ts | 2 +- ui-ngx/src/app/shared/models/oauth2.models.ts | 2 +- ui-ngx/src/app/shared/models/ota-package.models.ts | 2 +- ui-ngx/src/app/shared/models/overlay.models.ts | 2 +- ui-ngx/src/app/shared/models/page/page-data.ts | 2 +- ui-ngx/src/app/shared/models/page/page-link.ts | 2 +- ui-ngx/src/app/shared/models/page/public-api.ts | 2 +- ui-ngx/src/app/shared/models/page/sort-order.ts | 2 +- ui-ngx/src/app/shared/models/public-api.ts | 2 +- ui-ngx/src/app/shared/models/query/query.models.ts | 2 +- ui-ngx/src/app/shared/models/queue.models.ts | 2 +- ui-ngx/src/app/shared/models/regex.constants.ts | 2 +- ui-ngx/src/app/shared/models/relation.models.ts | 2 +- ui-ngx/src/app/shared/models/resource.models.ts | 2 +- ui-ngx/src/app/shared/models/rpc.models.ts | 2 +- ui-ngx/src/app/shared/models/rule-chain.models.ts | 2 +- ui-ngx/src/app/shared/models/rule-node.models.ts | 2 +- ui-ngx/src/app/shared/models/settings.models.ts | 2 +- ui-ngx/src/app/shared/models/telemetry/telemetry.models.ts | 2 +- ui-ngx/src/app/shared/models/tenant.model.ts | 2 +- ui-ngx/src/app/shared/models/time/time.models.ts | 2 +- ui-ngx/src/app/shared/models/trendz-settings.models.ts | 2 +- ui-ngx/src/app/shared/models/two-factor-auth.models.ts | 2 +- ui-ngx/src/app/shared/models/unit.models.ts | 2 +- ui-ngx/src/app/shared/models/units/absorbed-dose-rate.ts | 2 +- ui-ngx/src/app/shared/models/units/acceleration.ts | 2 +- ui-ngx/src/app/shared/models/units/acidity.ts | 2 +- ui-ngx/src/app/shared/models/units/air-quality-index.ts | 2 +- ui-ngx/src/app/shared/models/units/amount-of-substance.ts | 2 +- ui-ngx/src/app/shared/models/units/angle.ts | 2 +- ui-ngx/src/app/shared/models/units/angular-acceleration.ts | 2 +- ui-ngx/src/app/shared/models/units/area-density.ts | 2 +- ui-ngx/src/app/shared/models/units/area.ts | 2 +- ui-ngx/src/app/shared/models/units/capacitance.ts | 2 +- ui-ngx/src/app/shared/models/units/catalytic-activity.ts | 2 +- ui-ngx/src/app/shared/models/units/catalytic-concentration.ts | 2 +- ui-ngx/src/app/shared/models/units/charge.ts | 2 +- ui-ngx/src/app/shared/models/units/current-density.ts | 2 +- ui-ngx/src/app/shared/models/units/data-transfer-rate.ts | 2 +- ui-ngx/src/app/shared/models/units/density.ts | 2 +- ui-ngx/src/app/shared/models/units/digital.ts | 2 +- ui-ngx/src/app/shared/models/units/dimension-ratio.ts | 2 +- ui-ngx/src/app/shared/models/units/dynamic-viscosity.ts | 2 +- ui-ngx/src/app/shared/models/units/earthquake-magnitude.ts | 2 +- ui-ngx/src/app/shared/models/units/electric-charge-density.ts | 2 +- ui-ngx/src/app/shared/models/units/electric-current.ts | 2 +- ui-ngx/src/app/shared/models/units/electric-dipole-moment.ts | 2 +- ui-ngx/src/app/shared/models/units/electric-field-strength.ts | 2 +- ui-ngx/src/app/shared/models/units/electric-flux.ts | 2 +- ui-ngx/src/app/shared/models/units/electric-permittivity.ts | 2 +- ui-ngx/src/app/shared/models/units/electric-polarizability.ts | 2 +- ui-ngx/src/app/shared/models/units/electrical-conductance.ts | 2 +- ui-ngx/src/app/shared/models/units/electrical-conductivity.ts | 2 +- ui-ngx/src/app/shared/models/units/energy-density.ts | 2 +- ui-ngx/src/app/shared/models/units/energy.ts | 2 +- ui-ngx/src/app/shared/models/units/force.ts | 2 +- ui-ngx/src/app/shared/models/units/frequency.ts | 2 +- ui-ngx/src/app/shared/models/units/fuel-efficiency.ts | 2 +- ui-ngx/src/app/shared/models/units/heat-capacity.ts | 2 +- ui-ngx/src/app/shared/models/units/illuminance.ts | 2 +- ui-ngx/src/app/shared/models/units/inductance.ts | 2 +- ui-ngx/src/app/shared/models/units/kinematic-viscosity.ts | 2 +- ui-ngx/src/app/shared/models/units/length.ts | 2 +- ui-ngx/src/app/shared/models/units/light-exposure.ts | 2 +- ui-ngx/src/app/shared/models/units/liner-charge-density.ts | 2 +- ui-ngx/src/app/shared/models/units/logarithmic-ratio.ts | 2 +- ui-ngx/src/app/shared/models/units/luminous-efficacy.ts | 2 +- ui-ngx/src/app/shared/models/units/luminous-flux.ts | 2 +- ui-ngx/src/app/shared/models/units/luminous-intensity.ts | 2 +- ui-ngx/src/app/shared/models/units/magnetic-field-gradient.ts | 2 +- ui-ngx/src/app/shared/models/units/magnetic-flux-density.ts | 2 +- ui-ngx/src/app/shared/models/units/magnetic-flux.ts | 2 +- ui-ngx/src/app/shared/models/units/magnetic-moment.ts | 2 +- ui-ngx/src/app/shared/models/units/magnetic-permeability.ts | 2 +- ui-ngx/src/app/shared/models/units/mass-fraction.ts | 2 +- ui-ngx/src/app/shared/models/units/mass.ts | 2 +- ui-ngx/src/app/shared/models/units/molar-concentration.ts | 2 +- ui-ngx/src/app/shared/models/units/molar-energy.ts | 2 +- ui-ngx/src/app/shared/models/units/molar-heat-capacity.ts | 2 +- ui-ngx/src/app/shared/models/units/molar-mass.ts | 2 +- ui-ngx/src/app/shared/models/units/number-concentration.ts | 2 +- ui-ngx/src/app/shared/models/units/parts-per-million.ts | 2 +- ui-ngx/src/app/shared/models/units/power-density.ts | 2 +- ui-ngx/src/app/shared/models/units/power.ts | 2 +- ui-ngx/src/app/shared/models/units/pressure.ts | 2 +- ui-ngx/src/app/shared/models/units/radiance.ts | 2 +- ui-ngx/src/app/shared/models/units/radiant-intensity.ts | 2 +- ui-ngx/src/app/shared/models/units/radiation-dose.ts | 2 +- ui-ngx/src/app/shared/models/units/radioactive-decay.ts | 2 +- .../src/app/shared/models/units/radioactivity-concentration.ts | 2 +- ui-ngx/src/app/shared/models/units/radioactivity.ts | 2 +- ui-ngx/src/app/shared/models/units/reciprocal-length.ts | 2 +- ui-ngx/src/app/shared/models/units/resistance.ts | 2 +- ui-ngx/src/app/shared/models/units/reynolds-number.ts | 2 +- ui-ngx/src/app/shared/models/units/signal-level.ts | 2 +- ui-ngx/src/app/shared/models/units/solid-angle.ts | 2 +- ui-ngx/src/app/shared/models/units/specific-energy.ts | 2 +- ui-ngx/src/app/shared/models/units/specific-heat-capacity.ts | 2 +- ui-ngx/src/app/shared/models/units/specific-humidity.ts | 2 +- ui-ngx/src/app/shared/models/units/specific-volume.ts | 2 +- ui-ngx/src/app/shared/models/units/speed.ts | 2 +- ui-ngx/src/app/shared/models/units/surface-charge-density.ts | 2 +- ui-ngx/src/app/shared/models/units/surface-tension.ts | 2 +- ui-ngx/src/app/shared/models/units/temperature.ts | 2 +- ui-ngx/src/app/shared/models/units/thermal-conductivity.ts | 2 +- ui-ngx/src/app/shared/models/units/time.ts | 2 +- ui-ngx/src/app/shared/models/units/torque.ts | 2 +- ui-ngx/src/app/shared/models/units/turbidity.ts | 2 +- ui-ngx/src/app/shared/models/units/voltage.ts | 2 +- ui-ngx/src/app/shared/models/units/volume-flow.ts | 2 +- ui-ngx/src/app/shared/models/units/volume.ts | 2 +- ui-ngx/src/app/shared/models/usage.models.ts | 2 +- ui-ngx/src/app/shared/models/user-settings.models.ts | 2 +- ui-ngx/src/app/shared/models/user.model.ts | 2 +- ui-ngx/src/app/shared/models/vc.models.ts | 2 +- ui-ngx/src/app/shared/models/websocket/websocket.models.ts | 2 +- ui-ngx/src/app/shared/models/widget-settings.models.ts | 2 +- ui-ngx/src/app/shared/models/widget.models.ts | 2 +- .../src/app/shared/models/widget/maps/map-model.definition.ts | 2 +- ui-ngx/src/app/shared/models/widget/maps/map.models.ts | 2 +- .../src/app/shared/models/widget/maps/marker-shape.models.ts | 2 +- ui-ngx/src/app/shared/models/widget/public-api.ts | 2 +- .../src/app/shared/models/widget/rpc/knob.component.models.ts | 2 +- ui-ngx/src/app/shared/models/widget/widget-model.definition.ts | 2 +- ui-ngx/src/app/shared/models/widgets-bundle.model.ts | 2 +- ui-ngx/src/app/shared/models/window-message.model.ts | 2 +- ui-ngx/src/app/shared/pipe/custom-translate.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/date-ago.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/duration-left.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/enum-to-array.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/file-size.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/highlight.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/image.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/key-value-not-empty.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/keyboard-shortcut.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/milliseconds-to-time-string.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/nospace.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/public-api.ts | 2 +- ui-ngx/src/app/shared/pipe/safe.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/selectable-columns.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/short-number.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/tbJson.pipe.ts | 2 +- ui-ngx/src/app/shared/pipe/truncate.pipe.ts | 2 +- ui-ngx/src/app/shared/public-api.ts | 2 +- ui-ngx/src/app/shared/services/custom-paginator-intl.ts | 2 +- ui-ngx/src/app/shared/shared.module.ts | 2 +- ui-ngx/src/assets/fonts/material-icons.css | 2 +- ui-ngx/src/environments/environment.prod.ts | 2 +- ui-ngx/src/environments/environment.ts | 2 +- ui-ngx/src/form.scss | 2 +- ui-ngx/src/index.html | 2 +- ui-ngx/src/main.ts | 2 +- ui-ngx/src/polyfills.ts | 2 +- ui-ngx/src/scss/animations.scss | 2 +- ui-ngx/src/scss/constants.scss | 2 +- ui-ngx/src/scss/fonts.scss | 2 +- ui-ngx/src/scss/mixins.scss | 2 +- ui-ngx/src/styles.scss | 2 +- ui-ngx/src/theme-overwrites.scss | 2 +- ui-ngx/src/theme.scss | 2 +- ui-ngx/src/theme/datepicker-theme.scss | 2 +- ui-ngx/src/typings/jquery.flot.typings.d.ts | 2 +- ui-ngx/src/typings/jquery.jstree.typings.d.ts | 2 +- ui-ngx/src/typings/jquery.typings.d.ts | 2 +- ui-ngx/src/typings/leaflet-extend-tb.d.ts | 2 +- ui-ngx/src/typings/leaflet-geoman-extend.d.ts | 2 +- ui-ngx/src/typings/rawloader.typings.d.ts | 2 +- ui-ngx/src/typings/split.js.typings.d.ts | 2 +- ui-ngx/src/typings/utils.d.ts | 2 +- ui-ngx/src/zone-flags.ts | 2 +- ui-ngx/tailwind.config.js | 2 +- 7544 files changed, 7544 insertions(+), 7554 deletions(-) diff --git a/.github/release.yml b/.github/release.yml index 1dad5d274f..70852dcbb2 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -1,5 +1,5 @@ # -# Copyright © 2016-2025 The Thingsboard Authors +# 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. diff --git a/.github/workflows/check-configuration-files.yml b/.github/workflows/check-configuration-files.yml index 561b7d0019..0ea9d61923 100644 --- a/.github/workflows/check-configuration-files.yml +++ b/.github/workflows/check-configuration-files.yml @@ -1,5 +1,5 @@ # -# Copyright © 2016-2025 The Thingsboard Authors +# 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. diff --git a/.github/workflows/license-header-format.yml b/.github/workflows/license-header-format.yml index 20a1c1350a..0ac41c7bc8 100644 --- a/.github/workflows/license-header-format.yml +++ b/.github/workflows/license-header-format.yml @@ -1,5 +1,5 @@ # -# Copyright © 2016-2025 The Thingsboard Authors +# 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. diff --git a/application/pom.xml b/application/pom.xml index 9f3b79b3f5..36dfcac42f 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -1,6 +1,6 @@ -
Date: Wed, 7 Jan 2026 15:09:58 +0200 Subject: [PATCH 139/579] Update license headers --- .../actors/calculatedField/CalculatedFieldAlarmActionMsg.java | 2 +- .../calculatedField/CalculatedFieldArgumentResetMsg.java | 2 +- .../calculatedField/CalculatedFieldEntityActionEventMsg.java | 2 +- .../actors/calculatedField/CalculatedFieldReevaluateMsg.java | 2 +- .../calculatedField/CalculatedFieldRelationActionMsg.java | 2 +- .../org/thingsboard/server/controller/ApiKeyController.java | 2 +- .../exception/ThingsboardEntitiesLimitExceededResponse.java | 2 +- .../service/cf/AbstractCalculatedFieldProcessingService.java | 2 +- .../server/service/cf/AlarmCalculatedFieldResult.java | 2 +- .../java/org/thingsboard/server/service/cf/OwnerService.java | 2 +- .../server/service/cf/PropagationCalculatedFieldResult.java | 2 +- .../server/service/cf/TelemetryCalculatedFieldResult.java | 2 +- .../RelatedEntitiesAggregationCalculatedFieldState.java | 2 +- .../ctx/state/aggregation/RelatedEntitiesArgumentEntry.java | 2 +- .../service/cf/ctx/state/aggregation/function/AggEntry.java | 2 +- .../cf/ctx/state/aggregation/function/AvgAggEntry.java | 2 +- .../cf/ctx/state/aggregation/function/BaseAggEntry.java | 2 +- .../cf/ctx/state/aggregation/function/CountAggEntry.java | 2 +- .../ctx/state/aggregation/function/CountUniqueAggEntry.java | 2 +- .../cf/ctx/state/aggregation/function/MaxAggEntry.java | 2 +- .../cf/ctx/state/aggregation/function/MinAggEntry.java | 2 +- .../cf/ctx/state/aggregation/function/SumAggEntry.java | 2 +- .../cf/ctx/state/aggregation/single/AggIntervalEntry.java | 2 +- .../ctx/state/aggregation/single/AggIntervalEntryStatus.java | 2 +- .../aggregation/single/EntityAggregationArgumentEntry.java | 2 +- .../single/EntityAggregationCalculatedFieldState.java | 2 +- .../service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java | 2 +- .../server/service/cf/ctx/state/alarm/AlarmEvalResult.java | 2 +- .../server/service/cf/ctx/state/alarm/AlarmRuleState.java | 2 +- .../cf/ctx/state/geofencing/GeofencingArgumentEntry.java | 2 +- .../ctx/state/geofencing/GeofencingCalculatedFieldState.java | 2 +- .../service/cf/ctx/state/geofencing/GeofencingEvalResult.java | 2 +- .../service/cf/ctx/state/geofencing/GeofencingZoneState.java | 2 +- .../cf/ctx/state/geofencing/ScheduledRefreshSupported.java | 2 +- .../cf/ctx/state/propagation/PropagationArgumentEntry.java | 2 +- .../state/propagation/PropagationCalculatedFieldState.java | 2 +- .../service/edge/rpc/fetch/AiModelEdgeEventFetcher.java | 2 +- .../service/edge/rpc/processor/ai/AiModelEdgeProcessor.java | 2 +- .../service/edge/rpc/processor/ai/AiModelProcessor.java | 2 +- .../service/edge/rpc/processor/ai/BaseAiModelProcessor.java | 2 +- .../service/edge/rpc/processor/user/BaseUserProcessor.java | 2 +- .../server/service/edge/rpc/processor/user/UserProcessor.java | 2 +- .../org/thingsboard/server/service/edqs/EdqsSyncState.java | 2 +- .../service/security/auth/AbstractAuthenticationProvider.java | 2 +- .../server/service/security/auth/MfaConfigurationToken.java | 2 +- .../security/auth/extractor/ApiKeyHeaderTokenExtractor.java | 2 +- .../security/auth/extractor/JwtHeaderTokenExtractor.java | 2 +- .../security/auth/pat/ApiKeyAuthenticationProvider.java | 2 +- .../service/security/auth/pat/ApiKeyAuthenticationToken.java | 2 +- .../auth/pat/ApiKeyTokenAuthenticationProcessingFilter.java | 2 +- .../service/security/model/token/ApiKeyAuthRequest.java | 2 +- .../security/permission/MfaConfigurationPermissions.java | 2 +- .../thingsboard/server/service/ttl/ApiKeysCleanUpService.java | 2 +- .../service/user/cache/DefaultUserAuthDetailsCache.java | 2 +- .../server/service/user/cache/UserAuthDetailsCache.java | 2 +- .../test/java/org/thingsboard/server/cf/AlarmRulesTest.java | 2 +- .../server/cf/CalculatedFieldCurrentOwnerTest.java | 2 +- .../server/cf/EntityAggregationCalculatedFieldTest.java | 2 +- .../cf/RelatedEntitiesAggregationCalculatedFieldTest.java | 2 +- .../thingsboard/server/controller/ApiKeyControllerTest.java | 2 +- .../java/org/thingsboard/server/edge/AiModelEdgeTest.java | 2 +- .../org/thingsboard/server/edge/EdgeStatsIntegrationTest.java | 2 +- .../cf/ctx/state/GeofencingCalculatedFieldStateTest.java | 2 +- .../cf/ctx/state/GeofencingValueArgumentEntryTest.java | 2 +- .../server/service/cf/ctx/state/GeofencingZoneStateTest.java | 2 +- .../service/cf/ctx/state/PropagationArgumentEntryTest.java | 2 +- .../cf/ctx/state/PropagationCalculatedFieldStateTest.java | 2 +- .../RelatedEntitiesAggregationCalculatedFieldStateTest.java | 2 +- .../cf/ctx/state/RelatedEntitiesArgumentEntryTest.java | 2 +- .../security/auth/pat/ApiKeyAuthenticationProviderTest.java | 2 +- .../rpc/sql/RpcLwm2mIntegrationInitReadCompositeAllTest.java | 2 +- .../sql/RpcLwm2mIntegrationInitReadCompositeByObjectTest.java | 2 +- .../AbstractSecurityLwM2MIntegrationDtlsCidLength16Test.java | 2 +- .../AbstractSecurityLwM2MIntegrationDtlsCidLength2Test.java | 2 +- .../AbstractSecurityLwM2MIntegrationDtlsCidLength4Test.java | 2 +- .../PskLwm2mIntegrationDtlsCidLengthTest.java | 2 +- .../PskLwm2mIntegrationDtlsCidLengthTest.java | 2 +- .../PskLwm2mIntegrationDtlsCidLengthTest.java | 2 +- .../sql/NoSecLwM2MIntegrationBS3SectionTriggerTest.java | 2 +- ...cLwM2MIntegrationBSLwm2mOnlyNoneTriggerOneSectionTest.java | 2 +- .../security/sql/NoSecLwM2MIntegrationBSNoTriggerTest.java | 2 +- .../sql/NoSecLwM2MIntegrationBSOnlyTriggerOneSectionTest.java | 2 +- .../security/sql/NoSecLwM2MIntegrationBSTriggerTest.java | 2 +- .../thingsboard/server/utils/CalculatedFieldUtilsTest.java | 2 +- .../java/org/thingsboard/server/dao/pat/ApiKeyService.java | 2 +- .../thingsboard/server/common/data/NameConflictPolicy.java | 2 +- .../thingsboard/server/common/data/NameConflictStrategy.java | 2 +- .../org/thingsboard/server/common/data/UniquifyStrategy.java | 2 +- .../org/thingsboard/server/common/data/UserAuthDetails.java | 2 +- .../server/common/data/alarm/AlarmCommentSubType.java | 2 +- .../thingsboard/server/common/data/alarm/rule/AlarmRule.java | 2 +- .../common/data/alarm/rule/condition/AlarmCondition.java | 2 +- .../common/data/alarm/rule/condition/AlarmConditionType.java | 2 +- .../common/data/alarm/rule/condition/AlarmConditionValue.java | 2 +- .../data/alarm/rule/condition/DurationAlarmCondition.java | 2 +- .../data/alarm/rule/condition/RepeatingAlarmCondition.java | 2 +- .../data/alarm/rule/condition/SimpleAlarmCondition.java | 2 +- .../rule/condition/expression/AlarmConditionExpression.java | 2 +- .../condition/expression/AlarmConditionExpressionType.java | 2 +- .../alarm/rule/condition/expression/AlarmConditionFilter.java | 2 +- .../alarm/rule/condition/expression/ComplexOperation.java | 2 +- .../condition/expression/SimpleAlarmConditionExpression.java | 2 +- .../condition/expression/TbelAlarmConditionExpression.java | 2 +- .../expression/predicate/BooleanFilterPredicate.java | 2 +- .../expression/predicate/ComplexFilterPredicate.java | 2 +- .../condition/expression/predicate/FilterPredicateType.java | 2 +- .../condition/expression/predicate/KeyFilterPredicate.java | 2 +- .../condition/expression/predicate/NoDataFilterPredicate.java | 2 +- .../expression/predicate/NumericFilterPredicate.java | 2 +- .../expression/predicate/SimpleKeyFilterPredicate.java | 2 +- .../condition/expression/predicate/StringFilterPredicate.java | 2 +- .../data/alarm/rule/condition/schedule/AlarmSchedule.java | 2 +- .../data/alarm/rule/condition/schedule/AlarmScheduleType.java | 2 +- .../data/alarm/rule/condition/schedule/AnyTimeSchedule.java | 2 +- .../alarm/rule/condition/schedule/CustomTimeSchedule.java | 2 +- .../alarm/rule/condition/schedule/CustomTimeScheduleItem.java | 2 +- .../alarm/rule/condition/schedule/SpecificTimeSchedule.java | 2 +- .../server/common/data/cf/CalculatedFieldFilter.java | 2 +- .../server/common/data/cf/CalculatedFieldInfo.java | 2 +- .../cf/configuration/AlarmCalculatedFieldConfiguration.java | 2 +- .../ArgumentsBasedCalculatedFieldConfiguration.java | 2 +- .../cf/configuration/AttributesImmediateOutputStrategy.java | 2 +- .../server/common/data/cf/configuration/AttributesOutput.java | 2 +- .../data/cf/configuration/AttributesOutputStrategy.java | 2 +- .../cf/configuration/AttributesRuleChainOutputStrategy.java | 2 +- .../data/cf/configuration/CFArgumentDynamicSourceType.java | 2 +- .../configuration/CfArgumentDynamicSourceConfiguration.java | 2 +- .../ExpressionBasedCalculatedFieldConfiguration.java | 2 +- .../common/data/cf/configuration/HasRelationPathLevel.java | 2 +- .../server/common/data/cf/configuration/OutputStrategy.java | 2 +- .../common/data/cf/configuration/OutputStrategyType.java | 2 +- .../PropagationCalculatedFieldConfiguration.java | 2 +- .../RelationPathQueryDynamicSourceConfiguration.java | 2 +- .../ScheduledUpdateSupportedCalculatedFieldConfiguration.java | 2 +- .../cf/configuration/TimeSeriesImmediateOutputStrategy.java | 2 +- .../server/common/data/cf/configuration/TimeSeriesOutput.java | 2 +- .../data/cf/configuration/TimeSeriesOutputStrategy.java | 2 +- .../cf/configuration/TimeSeriesRuleChainOutputStrategy.java | 2 +- .../common/data/cf/configuration/aggregation/AggFunction.java | 2 +- .../data/cf/configuration/aggregation/AggFunctionInput.java | 2 +- .../common/data/cf/configuration/aggregation/AggInput.java | 2 +- .../common/data/cf/configuration/aggregation/AggKeyInput.java | 2 +- .../common/data/cf/configuration/aggregation/AggMetric.java | 2 +- ...elatedEntitiesAggregationCalculatedFieldConfiguration.java | 2 +- .../single/EntityAggregationCalculatedFieldConfiguration.java | 2 +- .../aggregation/single/interval/AggInterval.java | 2 +- .../aggregation/single/interval/AggIntervalType.java | 2 +- .../aggregation/single/interval/BaseAggInterval.java | 2 +- .../aggregation/single/interval/CustomInterval.java | 2 +- .../aggregation/single/interval/DayInterval.java | 2 +- .../aggregation/single/interval/HourInterval.java | 2 +- .../aggregation/single/interval/MonthInterval.java | 2 +- .../aggregation/single/interval/QuarterInterval.java | 2 +- .../configuration/aggregation/single/interval/Watermark.java | 2 +- .../aggregation/single/interval/WeekInterval.java | 2 +- .../aggregation/single/interval/WeekSunSatInterval.java | 2 +- .../aggregation/single/interval/YearInterval.java | 2 +- .../data/cf/configuration/geofencing/EntityCoordinates.java | 2 +- .../geofencing/GeofencingCalculatedFieldConfiguration.java | 2 +- .../data/cf/configuration/geofencing/GeofencingEvent.java | 2 +- .../cf/configuration/geofencing/GeofencingPresenceStatus.java | 2 +- .../cf/configuration/geofencing/GeofencingReportStrategy.java | 2 +- .../configuration/geofencing/GeofencingTransitionEvent.java | 2 +- .../cf/configuration/geofencing/ZoneGroupConfiguration.java | 2 +- .../data/device/credentials/lwm2m/Lwm2mServerIdentifier.java | 2 +- .../info/EntitiesLimitIncreaseRequestNotificationInfo.java | 2 +- .../notification/targets/platform/SystemLevelUsersFilter.java | 2 +- .../java/org/thingsboard/server/common/data/pat/ApiKey.java | 2 +- .../org/thingsboard/server/common/data/pat/ApiKeyInfo.java | 2 +- .../server/common/data/query/AvailableEntityKeys.java | 2 +- .../server/common/data/relation/EntityRelationPathQuery.java | 2 +- .../server/common/data/relation/RelationPathLevel.java | 2 +- .../server/exception/ThingsboardRuntimeException.java | 2 +- .../server/common/data/cf/configuration/ArgumentTest.java | 2 +- .../data/cf/configuration/CalculatedFieldOutputTest.java | 2 +- .../PropagationCalculatedFieldConfigurationTest.java | 2 +- .../RelationPathQueryDynamicSourceConfigurationTest.java | 2 +- ...eduledUpdateSupportedCalculatedFieldConfigurationTest.java | 2 +- ...edEntitiesAggregationCalculatedFieldConfigurationTest.java | 2 +- .../EntityAggregationCalculatedFieldConfigurationTest.java | 2 +- .../aggregation/single/interval/AggIntervalTest.java | 2 +- .../cf/configuration/geofencing/EntityCoordinatesTest.java | 2 +- .../GeofencingCalculatedFieldConfigurationTest.java | 2 +- .../configuration/geofencing/ZoneGroupConfigurationTest.java | 2 +- .../common/msg/CalculatedFieldStatePartitionRestoreMsg.java | 2 +- .../org/thingsboard/script/api/tbel/TbelCfGeofencingArg.java | 2 +- .../org/thingsboard/script/api/tbel/TbelCfPropagationArg.java | 2 +- .../script/api/tbel/TbelCfRelatedEntitiesArgumentValue.java | 2 +- .../common/util/geo/CirclePerimeterDefinition.java | 2 +- .../org/thingsboard/common/util/geo/PerimeterDefinition.java | 2 +- .../common/util/geo/PerimeterDefinitionDeserializer.java | 2 +- .../common/util/geo/PerimeterDefinitionSerializer.java | 2 +- .../common/util/geo/PolygonPerimeterDefinition.java | 2 +- .../common/util/geo/PerimeterDefinitionDeserializerTest.java | 2 +- .../common/util/geo/PerimeterDefinitionSerializerTest.java | 2 +- .../server/dao/model/sql/AbstractApiKeyInfoEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/ApiKeyEntity.java | 2 +- .../thingsboard/server/dao/model/sql/ApiKeyInfoEntity.java | 2 +- .../java/org/thingsboard/server/dao/pat/ApiKeyCacheKey.java | 2 +- .../org/thingsboard/server/dao/pat/ApiKeyCaffeineCache.java | 2 +- .../main/java/org/thingsboard/server/dao/pat/ApiKeyDao.java | 2 +- .../java/org/thingsboard/server/dao/pat/ApiKeyEvictEvent.java | 2 +- .../java/org/thingsboard/server/dao/pat/ApiKeyInfoDao.java | 2 +- .../java/org/thingsboard/server/dao/pat/ApiKeyRedisCache.java | 2 +- .../org/thingsboard/server/dao/pat/ApiKeyServiceImpl.java | 2 +- .../server/dao/service/validator/ApiKeyDataValidator.java | 2 +- .../org/thingsboard/server/dao/sql/pat/ApiKeyRepository.java | 2 +- .../java/org/thingsboard/server/dao/sql/pat/JpaApiKeyDao.java | 2 +- .../org/thingsboard/server/dao/sql/pat/JpaApiKeyInfoDao.java | 2 +- .../org/thingsboard/server/dao/service/ApiKeyServiceTest.java | 2 +- .../monitoring/data/notification/InfoNotification.java | 2 +- .../server/msa/connectivity/JavaRestClientTest.java | 2 +- .../rule/engine/telemetry/TbCalculatedFieldsNodeTest.java | 2 +- ui-ngx/src/app/core/http/api-key.service.ts | 2 +- ui-ngx/src/app/core/services/calculated-field-form.service.ts | 2 +- .../alarm-rules/alarm-rule-details-dialog.component.html | 2 +- .../alarm-rules/alarm-rule-details-dialog.component.ts | 2 +- .../components/alarm-rules/alarm-rule-dialog.component.html | 2 +- .../components/alarm-rules/alarm-rule-dialog.component.scss | 3 +-- .../components/alarm-rules/alarm-rule-dialog.component.ts | 2 +- .../alarm-rules/alarm-rule-filter-config.component.html | 2 +- .../alarm-rules/alarm-rule-filter-config.component.scss | 3 +-- .../alarm-rules/alarm-rule-filter-config.component.ts | 2 +- .../alarm-rules/alarm-rule-table-header.component.html | 2 +- .../alarm-rules/alarm-rule-table-header.component.scss | 3 +-- .../alarm-rules/alarm-rule-table-header.component.ts | 2 +- .../modules/home/components/alarm-rules/alarm-rule.module.ts | 2 +- .../home/components/alarm-rules/alarm-rules-table-config.ts | 2 +- .../components/alarm-rules/alarm-rules-table.component.html | 2 +- .../components/alarm-rules/alarm-rules-table.component.scss | 2 +- .../components/alarm-rules/alarm-rules-table.component.ts | 2 +- .../home/components/alarm-rules/alarm-rules.component.html | 2 +- .../home/components/alarm-rules/alarm-rules.component.ts | 2 +- .../alarm-rules/cf-alarm-rule-condition-dialog.component.html | 2 +- .../alarm-rules/cf-alarm-rule-condition-dialog.component.ts | 2 +- .../alarm-rules/cf-alarm-rule-condition.component.html | 2 +- .../alarm-rules/cf-alarm-rule-condition.component.scss | 2 +- .../alarm-rules/cf-alarm-rule-condition.component.ts | 2 +- .../home/components/alarm-rules/cf-alarm-rule.component.html | 2 +- .../home/components/alarm-rules/cf-alarm-rule.component.scss | 2 +- .../home/components/alarm-rules/cf-alarm-rule.component.ts | 2 +- .../alarm-rules/cf-alarm-rules-dialog.component.scss | 2 +- .../alarm-rules/cf-alarm-schedule-dialog.component.html | 2 +- .../alarm-rules/cf-alarm-schedule-dialog.component.ts | 2 +- .../components/alarm-rules/cf-alarm-schedule.component.html | 2 +- .../components/alarm-rules/cf-alarm-schedule.component.ts | 2 +- .../alarm-rules/create-cf-alarm-rules.component.html | 3 +-- .../alarm-rules/create-cf-alarm-rules.component.scss | 2 +- .../components/alarm-rules/create-cf-alarm-rules.component.ts | 2 +- .../alarm-rule-complex-filter-predicate-dialog.component.html | 2 +- .../alarm-rule-complex-filter-predicate-dialog.component.ts | 2 +- .../filter/alarm-rule-filter-dialog.component.html | 2 +- .../filter/alarm-rule-filter-dialog.component.scss | 2 +- .../alarm-rules/filter/alarm-rule-filter-dialog.component.ts | 4 ++-- .../alarm-rules/filter/alarm-rule-filter-list.component.html | 2 +- .../alarm-rules/filter/alarm-rule-filter-list.component.scss | 3 +-- .../alarm-rules/filter/alarm-rule-filter-list.component.ts | 2 +- .../filter/alarm-rule-filter-predicate-list.component.html | 2 +- .../filter/alarm-rule-filter-predicate-list.component.scss | 2 +- .../filter/alarm-rule-filter-predicate-list.component.ts | 2 +- .../alarm-rule-filter-predicate-no-data-value.component.html | 2 +- .../alarm-rule-filter-predicate-no-data-value.component.ts | 2 +- .../filter/alarm-rule-filter-predicate-value.component.html | 2 +- .../filter/alarm-rule-filter-predicate-value.component.ts | 2 +- .../filter/alarm-rule-filter-predicate.component.html | 2 +- .../filter/alarm-rule-filter-predicate.component.ts | 2 +- .../alarm-rules/filter/alarm-rule-filter-text.component.html | 2 +- .../alarm-rules/filter/alarm-rule-filter-text.component.scss | 2 +- .../alarm-rules/filter/alarm-rule-filter-text.component.ts | 2 +- .../home/components/api-key/add-api-key-dialog.component.html | 2 +- .../home/components/api-key/add-api-key-dialog.component.scss | 2 +- .../home/components/api-key/add-api-key-dialog.component.ts | 2 +- .../api-key/api-key-generated-dialog.component.html | 2 +- .../api-key/api-key-generated-dialog.component.scss | 2 +- .../components/api-key/api-key-generated-dialog.component.ts | 2 +- .../modules/home/components/api-key/api-keys-table-config.ts | 2 +- .../components/api-key/api-keys-table-dialog.component.html | 2 +- .../components/api-key/api-keys-table-dialog.component.ts | 2 +- .../home/components/api-key/api-keys-table.component.html | 2 +- .../home/components/api-key/api-keys-table.component.scss | 2 +- .../home/components/api-key/api-keys-table.component.ts | 2 +- .../api-key/edit-api-key-description-panel.component.html | 3 +-- .../api-key/edit-api-key-description-panel.component.scss | 3 +-- .../api-key/edit-api-key-description-panel.component.ts | 2 +- .../home/components/audit-log/audit-log-filter.component.html | 3 +-- .../home/components/audit-log/audit-log-filter.component.scss | 2 +- .../home/components/audit-log/audit-log-filter.component.ts | 2 +- .../home/components/audit-log/audit-log-header.component.html | 2 +- .../home/components/audit-log/audit-log-header.component.ts | 2 +- .../calculated-fields/calculated-field.component.html | 2 +- .../calculated-fields/calculated-field.component.scss | 2 +- .../calculated-fields/calculated-field.component.ts | 2 +- .../components/calculated-fields/calculated-field.module.ts | 2 +- .../calculated-field-argument-panel.component.html | 2 +- .../calculated-field-arguments-table.module.ts | 2 +- .../entity-aggregation-arguments-table.component.ts | 2 +- .../propagate-arguments-table.component.ts | 2 +- .../related-aggregation-arguments-table.component.ts | 2 +- .../components/common/calculated-field-panel.scss | 2 +- .../entity-aggregation-component.component.html | 2 +- .../entity-aggregation-component.component.ts | 2 +- .../entity-aggregation-component.module.ts | 2 +- ...lculated-field-geofencing-zone-groups-panel.component.html | 2 +- ...lculated-field-geofencing-zone-groups-panel.component.scss | 2 +- ...calculated-field-geofencing-zone-groups-panel.component.ts | 2 +- ...lculated-field-geofencing-zone-groups-table.component.html | 2 +- ...calculated-field-geofencing-zone-groups-table.component.ts | 2 +- .../geofencing-configuration.component.html | 2 +- .../geofencing-configuration.component.ts | 2 +- .../geofencing-configuration.module.ts | 2 +- .../metrics/calculated-field-metrics-panel.component.html | 2 +- .../metrics/calculated-field-metrics-panel.component.ts | 2 +- .../metrics/calculated-field-metrics-table.component.html | 2 +- .../metrics/calculated-field-metrics-table.component.ts | 2 +- .../metrics/calculated-field-metrics-table.module.ts | 2 +- .../components/output/calculated-field-output.component.html | 2 +- .../components/output/calculated-field-output.component.scss | 2 +- .../components/output/calculated-field-output.component.ts | 2 +- .../components/output/calculated-field-output.module.ts | 2 +- .../propagation-configuration.component.html | 2 +- .../propagation-configuration.component.ts | 2 +- .../propagation-configuration.module.ts | 2 +- .../related-entities-aggregation-component.component.html | 2 +- .../related-entities-aggregation-component.component.scss | 2 +- .../related-entities-aggregation-component.component.ts | 2 +- .../related-entities-aggregation-component.module.ts | 2 +- .../simple-configuration/simple-configuration.component.html | 2 +- .../simple-configuration/simple-configuration.component.ts | 2 +- .../simple-configuration/simple-configuration.module.ts | 2 +- .../calculated-fields-filter-config.component.html | 2 +- .../calculated-fields-filter-config.component.scss | 3 +-- .../table-header/calculated-fields-filter-config.component.ts | 2 +- .../table-header/calculated-fields-header.component.html | 2 +- .../table-header/calculated-fields-header.component.scss | 3 +-- .../table-header/calculated-fields-header.component.ts | 2 +- .../widget/lib/cards/api-usage-widget.component.html | 2 +- .../widget/lib/cards/api-usage-widget.component.scss | 2 +- .../components/widget/lib/cards/api-usage-widget.component.ts | 2 +- .../widget/lib/maps/data-layer/polylines-data-layer.ts | 2 +- .../lib/settings/cards/api-usage-data-key-row.component.html | 2 +- .../lib/settings/cards/api-usage-data-key-row.component.scss | 2 +- .../lib/settings/cards/api-usage-data-key-row.component.ts | 2 +- .../lib/settings/cards/api-usage-settings.component.models.ts | 2 +- .../settings/cards/api-usage-widget-settings.component.html | 2 +- .../settings/cards/api-usage-widget-settings.component.scss | 2 +- .../lib/settings/cards/api-usage-widget-settings.component.ts | 2 +- .../widget/lib/settings/common/axis-scale-row.component.html | 2 +- .../widget/lib/settings/common/axis-scale-row.component.ts | 2 +- .../src/app/modules/home/dialogs/events-dialog.component.ts | 2 +- .../modules/home/pages/alarm/alarm-rules-tabs.component.html | 2 +- .../modules/home/pages/alarm/alarm-rules-tabs.component.ts | 2 +- .../pages/calculated-fields/calculated-field-page.module.ts | 2 +- .../calculated-fields/calculated-fields-routing.module.ts | 2 +- .../calculated-fields/calculated-fields-tabs.component.html | 2 +- .../calculated-fields/calculated-fields-tabs.component.ts | 2 +- .../dashboard/import-dashboard-file-dialog.component.html | 2 +- .../pages/dashboard/import-dashboard-file-dialog.component.ts | 2 +- .../pages/login/force-two-factor-auth-login.component.html | 2 +- .../pages/login/force-two-factor-auth-login.component.scss | 2 +- .../pages/login/force-two-factor-auth-login.component.ts | 2 +- ui-ngx/src/app/shared/components/button/public-api.ts | 2 +- .../shared/components/dialog/dynamic/dynamic-dialog.module.ts | 2 +- .../app/shared/components/dialog/dynamic/dynamic-dialog.ts | 2 +- .../components/dialog/dynamic/dynamic-overlay-container.ts | 2 +- .../app/shared/components/dialog/dynamic/dynamic-overlay.ts | 2 +- .../dialog/entity-limit-exceeded-dialog.component.html | 2 +- .../dialog/entity-limit-exceeded-dialog.component.scss | 2 +- .../dialog/entity-limit-exceeded-dialog.component.ts | 2 +- .../components/password-requirements-tooltip.component.html | 2 +- .../components/password-requirements-tooltip.component.scss | 3 +-- .../components/password-requirements-tooltip.component.ts | 2 +- .../components/string-pattern-autocomplete.component.html | 2 +- .../components/string-pattern-autocomplete.component.scss | 2 +- .../components/string-pattern-autocomplete.component.ts | 2 +- ui-ngx/src/app/shared/models/alarm-rule.models.ts | 2 +- ui-ngx/src/app/shared/models/api-key.models.ts | 2 +- ui-ngx/src/app/shared/models/id/api-key-id.ts | 2 +- ui-ngx/src/app/shared/models/password.models.ts | 2 +- .../models/widget/home-widgets/api-usage-model.definition.ts | 2 +- ui-ngx/src/app/shared/pipe/date-expiration.pipe.ts | 2 +- 380 files changed, 381 insertions(+), 392 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldAlarmActionMsg.java b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldAlarmActionMsg.java index 3202296345..26b00bdfe2 100644 --- a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldAlarmActionMsg.java +++ b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldAlarmActionMsg.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldArgumentResetMsg.java b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldArgumentResetMsg.java index 8b5927827e..3bb7f47843 100644 --- a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldArgumentResetMsg.java +++ b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldArgumentResetMsg.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityActionEventMsg.java b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityActionEventMsg.java index 6fc191e3db..582a150f9c 100644 --- a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityActionEventMsg.java +++ b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityActionEventMsg.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldReevaluateMsg.java b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldReevaluateMsg.java index b617736ee0..74308fc35d 100644 --- a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldReevaluateMsg.java +++ b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldReevaluateMsg.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldRelationActionMsg.java b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldRelationActionMsg.java index 4d8e1cf561..70e1136afe 100644 --- a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldRelationActionMsg.java +++ b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldRelationActionMsg.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java b/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java index efe83f6949..2c6ae69ca5 100644 --- a/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java +++ b/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/exception/ThingsboardEntitiesLimitExceededResponse.java b/application/src/main/java/org/thingsboard/server/exception/ThingsboardEntitiesLimitExceededResponse.java index c1faabb569..268fae2b1f 100644 --- a/application/src/main/java/org/thingsboard/server/exception/ThingsboardEntitiesLimitExceededResponse.java +++ b/application/src/main/java/org/thingsboard/server/exception/ThingsboardEntitiesLimitExceededResponse.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java b/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java index ec645085e6..fed1e82e96 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/AlarmCalculatedFieldResult.java b/application/src/main/java/org/thingsboard/server/service/cf/AlarmCalculatedFieldResult.java index 7d45b289fa..5130979a51 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/AlarmCalculatedFieldResult.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/AlarmCalculatedFieldResult.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/OwnerService.java b/application/src/main/java/org/thingsboard/server/service/cf/OwnerService.java index 269d90e5e4..5cd913531b 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/OwnerService.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/OwnerService.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/PropagationCalculatedFieldResult.java b/application/src/main/java/org/thingsboard/server/service/cf/PropagationCalculatedFieldResult.java index 09ec5b6ed7..2beaf999b6 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/PropagationCalculatedFieldResult.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/PropagationCalculatedFieldResult.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/TelemetryCalculatedFieldResult.java b/application/src/main/java/org/thingsboard/server/service/cf/TelemetryCalculatedFieldResult.java index 7325815595..497921d834 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/TelemetryCalculatedFieldResult.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/TelemetryCalculatedFieldResult.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java index 1edfea70a3..357e3b66d3 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesArgumentEntry.java index 0a5c850e4f..1939318e7a 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesArgumentEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/AggEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/AggEntry.java index c4b93fd91d..79bf1bdf25 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/AggEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/AggEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/AvgAggEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/AvgAggEntry.java index e063ff2ea2..ee06ae1529 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/AvgAggEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/AvgAggEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/BaseAggEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/BaseAggEntry.java index 8ca523938d..471eb5555d 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/BaseAggEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/BaseAggEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/CountAggEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/CountAggEntry.java index 09116985d2..1b0514fb9b 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/CountAggEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/CountAggEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/CountUniqueAggEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/CountUniqueAggEntry.java index 90587fce27..76209ae042 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/CountUniqueAggEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/CountUniqueAggEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/MaxAggEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/MaxAggEntry.java index 6d734a5a08..b006d8fcd9 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/MaxAggEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/MaxAggEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/MinAggEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/MinAggEntry.java index e517ad305f..2ce561d381 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/MinAggEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/MinAggEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/SumAggEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/SumAggEntry.java index fe29d27b7e..3639e36249 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/SumAggEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/function/SumAggEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/AggIntervalEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/AggIntervalEntry.java index 338e667dd2..5b7b28fe1e 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/AggIntervalEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/AggIntervalEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/AggIntervalEntryStatus.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/AggIntervalEntryStatus.java index fbf344e5d3..a6cb8766d5 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/AggIntervalEntryStatus.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/AggIntervalEntryStatus.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationArgumentEntry.java index c0a0603390..b59c5d4742 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationArgumentEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java index 99bddc374c..0929eb7ea0 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java index 0853b923c3..1719c95f7a 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmEvalResult.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmEvalResult.java index 2569f837fa..805af09907 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmEvalResult.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmEvalResult.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmRuleState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmRuleState.java index cf7b1ce108..19c48272cc 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmRuleState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmRuleState.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingArgumentEntry.java index a3305ea52d..f73d8825f0 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingArgumentEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingCalculatedFieldState.java index a6bf9f8d6a..05cc378209 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingCalculatedFieldState.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingEvalResult.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingEvalResult.java index c6bf3dd65e..e0530f621d 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingEvalResult.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingEvalResult.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingZoneState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingZoneState.java index f4b303a7bb..9fe51bbf22 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingZoneState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingZoneState.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/ScheduledRefreshSupported.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/ScheduledRefreshSupported.java index f43959443a..4a532ea03d 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/ScheduledRefreshSupported.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/ScheduledRefreshSupported.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationArgumentEntry.java index 8130598b91..7b8b393371 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationArgumentEntry.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationCalculatedFieldState.java index 8613e0c062..d7c43b01d7 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/propagation/PropagationCalculatedFieldState.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/AiModelEdgeEventFetcher.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/AiModelEdgeEventFetcher.java index 8cba05402b..f5ce48f696 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/AiModelEdgeEventFetcher.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/AiModelEdgeEventFetcher.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/AiModelEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/AiModelEdgeProcessor.java index 1b70b8bd32..afb44d4607 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/AiModelEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/AiModelEdgeProcessor.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/AiModelProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/AiModelProcessor.java index f66421167a..c8ae278608 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/AiModelProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/AiModelProcessor.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/BaseAiModelProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/BaseAiModelProcessor.java index c6d50abe28..ccc54f75d9 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/BaseAiModelProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ai/BaseAiModelProcessor.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/BaseUserProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/BaseUserProcessor.java index ede8c94af0..f3c710ffed 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/BaseUserProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/BaseUserProcessor.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserProcessor.java index dd9659c1f4..9e6a289386 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserProcessor.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/edqs/EdqsSyncState.java b/application/src/main/java/org/thingsboard/server/service/edqs/EdqsSyncState.java index 07945cea8b..9ea2f7cc8d 100644 --- a/application/src/main/java/org/thingsboard/server/service/edqs/EdqsSyncState.java +++ b/application/src/main/java/org/thingsboard/server/service/edqs/EdqsSyncState.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/AbstractAuthenticationProvider.java b/application/src/main/java/org/thingsboard/server/service/security/auth/AbstractAuthenticationProvider.java index e05aba5d18..4da933e774 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/AbstractAuthenticationProvider.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/AbstractAuthenticationProvider.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/MfaConfigurationToken.java b/application/src/main/java/org/thingsboard/server/service/security/auth/MfaConfigurationToken.java index b52404bac2..048ba1ff26 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/MfaConfigurationToken.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/MfaConfigurationToken.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/extractor/ApiKeyHeaderTokenExtractor.java b/application/src/main/java/org/thingsboard/server/service/security/auth/extractor/ApiKeyHeaderTokenExtractor.java index 34f8b91414..4165726bca 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/extractor/ApiKeyHeaderTokenExtractor.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/extractor/ApiKeyHeaderTokenExtractor.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/extractor/JwtHeaderTokenExtractor.java b/application/src/main/java/org/thingsboard/server/service/security/auth/extractor/JwtHeaderTokenExtractor.java index 4bee44bf51..d48be8899c 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/extractor/JwtHeaderTokenExtractor.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/extractor/JwtHeaderTokenExtractor.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProvider.java b/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProvider.java index fe62f496b6..162a780bbb 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProvider.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProvider.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationToken.java b/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationToken.java index ee76cc46a3..0665f23298 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationToken.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationToken.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyTokenAuthenticationProcessingFilter.java b/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyTokenAuthenticationProcessingFilter.java index 1a91315505..789efe6ad0 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyTokenAuthenticationProcessingFilter.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyTokenAuthenticationProcessingFilter.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/security/model/token/ApiKeyAuthRequest.java b/application/src/main/java/org/thingsboard/server/service/security/model/token/ApiKeyAuthRequest.java index 8d4fb967d7..fee06eea55 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/model/token/ApiKeyAuthRequest.java +++ b/application/src/main/java/org/thingsboard/server/service/security/model/token/ApiKeyAuthRequest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/security/permission/MfaConfigurationPermissions.java b/application/src/main/java/org/thingsboard/server/service/security/permission/MfaConfigurationPermissions.java index b901030a67..4fe8b4d127 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/permission/MfaConfigurationPermissions.java +++ b/application/src/main/java/org/thingsboard/server/service/security/permission/MfaConfigurationPermissions.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/ttl/ApiKeysCleanUpService.java b/application/src/main/java/org/thingsboard/server/service/ttl/ApiKeysCleanUpService.java index c677db7108..895fed555d 100644 --- a/application/src/main/java/org/thingsboard/server/service/ttl/ApiKeysCleanUpService.java +++ b/application/src/main/java/org/thingsboard/server/service/ttl/ApiKeysCleanUpService.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/user/cache/DefaultUserAuthDetailsCache.java b/application/src/main/java/org/thingsboard/server/service/user/cache/DefaultUserAuthDetailsCache.java index 488f9c2a36..e4ed589e16 100644 --- a/application/src/main/java/org/thingsboard/server/service/user/cache/DefaultUserAuthDetailsCache.java +++ b/application/src/main/java/org/thingsboard/server/service/user/cache/DefaultUserAuthDetailsCache.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/main/java/org/thingsboard/server/service/user/cache/UserAuthDetailsCache.java b/application/src/main/java/org/thingsboard/server/service/user/cache/UserAuthDetailsCache.java index 042d329f71..c7614bcc5e 100644 --- a/application/src/main/java/org/thingsboard/server/service/user/cache/UserAuthDetailsCache.java +++ b/application/src/main/java/org/thingsboard/server/service/user/cache/UserAuthDetailsCache.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/cf/AlarmRulesTest.java b/application/src/test/java/org/thingsboard/server/cf/AlarmRulesTest.java index 15567191ff..cf94940e07 100644 --- a/application/src/test/java/org/thingsboard/server/cf/AlarmRulesTest.java +++ b/application/src/test/java/org/thingsboard/server/cf/AlarmRulesTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldCurrentOwnerTest.java b/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldCurrentOwnerTest.java index 6c6401f088..52180a888d 100644 --- a/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldCurrentOwnerTest.java +++ b/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldCurrentOwnerTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/cf/EntityAggregationCalculatedFieldTest.java b/application/src/test/java/org/thingsboard/server/cf/EntityAggregationCalculatedFieldTest.java index 66c11a06a6..6c08fc1458 100644 --- a/application/src/test/java/org/thingsboard/server/cf/EntityAggregationCalculatedFieldTest.java +++ b/application/src/test/java/org/thingsboard/server/cf/EntityAggregationCalculatedFieldTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/cf/RelatedEntitiesAggregationCalculatedFieldTest.java b/application/src/test/java/org/thingsboard/server/cf/RelatedEntitiesAggregationCalculatedFieldTest.java index eb1e6905ca..10a7b46282 100644 --- a/application/src/test/java/org/thingsboard/server/cf/RelatedEntitiesAggregationCalculatedFieldTest.java +++ b/application/src/test/java/org/thingsboard/server/cf/RelatedEntitiesAggregationCalculatedFieldTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java index 167839e7f3..9c7f7a898d 100644 --- a/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/edge/AiModelEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/AiModelEdgeTest.java index 8daed92a9a..4b23ec3cf9 100644 --- a/application/src/test/java/org/thingsboard/server/edge/AiModelEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/AiModelEdgeTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/edge/EdgeStatsIntegrationTest.java b/application/src/test/java/org/thingsboard/server/edge/EdgeStatsIntegrationTest.java index dd393e6849..e6cad9da6a 100644 --- a/application/src/test/java/org/thingsboard/server/edge/EdgeStatsIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/EdgeStatsIntegrationTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingCalculatedFieldStateTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingCalculatedFieldStateTest.java index 6a3d57d839..06b632f659 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingCalculatedFieldStateTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingCalculatedFieldStateTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingValueArgumentEntryTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingValueArgumentEntryTest.java index d274da2434..2e550b8b74 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingValueArgumentEntryTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingValueArgumentEntryTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingZoneStateTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingZoneStateTest.java index 9b15fbc98a..40d1ae83b1 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingZoneStateTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingZoneStateTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationArgumentEntryTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationArgumentEntryTest.java index 8a5e3df1ba..596720d213 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationArgumentEntryTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationArgumentEntryTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationCalculatedFieldStateTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationCalculatedFieldStateTest.java index 2ceafd8c0a..44154d26dd 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationCalculatedFieldStateTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationCalculatedFieldStateTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesAggregationCalculatedFieldStateTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesAggregationCalculatedFieldStateTest.java index 5085c64ef2..fba53c278a 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesAggregationCalculatedFieldStateTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesAggregationCalculatedFieldStateTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesArgumentEntryTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesArgumentEntryTest.java index c357e2c30b..db8ce32df6 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesArgumentEntryTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/RelatedEntitiesArgumentEntryTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProviderTest.java b/application/src/test/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProviderTest.java index bd20299baf..e9c36b1ebd 100644 --- a/application/src/test/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProviderTest.java +++ b/application/src/test/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProviderTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationInitReadCompositeAllTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationInitReadCompositeAllTest.java index 62af7f00f3..ea23d2a61d 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationInitReadCompositeAllTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationInitReadCompositeAllTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationInitReadCompositeByObjectTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationInitReadCompositeByObjectTest.java index aea9755d0c..6c5f04da77 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationInitReadCompositeByObjectTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationInitReadCompositeByObjectTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength16Test.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength16Test.java index 1f5d2d9f19..faa6872b3b 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength16Test.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength16Test.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength2Test.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength2Test.java index 1cb657e4a4..3ab6de4cd3 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength2Test.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength2Test.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength4Test.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength4Test.java index 56e544243f..168b260227 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength4Test.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength4Test.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_1/PskLwm2mIntegrationDtlsCidLengthTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_1/PskLwm2mIntegrationDtlsCidLengthTest.java index b2c06495fc..d39afdd504 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_1/PskLwm2mIntegrationDtlsCidLengthTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_1/PskLwm2mIntegrationDtlsCidLengthTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_16/PskLwm2mIntegrationDtlsCidLengthTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_16/PskLwm2mIntegrationDtlsCidLengthTest.java index 579614d98e..45b52c6ddd 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_16/PskLwm2mIntegrationDtlsCidLengthTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_16/PskLwm2mIntegrationDtlsCidLengthTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_4/PskLwm2mIntegrationDtlsCidLengthTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_4/PskLwm2mIntegrationDtlsCidLengthTest.java index 6994e19fbf..aa281020a7 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_4/PskLwm2mIntegrationDtlsCidLengthTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_4/PskLwm2mIntegrationDtlsCidLengthTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBS3SectionTriggerTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBS3SectionTriggerTest.java index af8284484d..8b7195141a 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBS3SectionTriggerTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBS3SectionTriggerTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSLwm2mOnlyNoneTriggerOneSectionTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSLwm2mOnlyNoneTriggerOneSectionTest.java index 4fceba60f3..d386c60135 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSLwm2mOnlyNoneTriggerOneSectionTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSLwm2mOnlyNoneTriggerOneSectionTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSNoTriggerTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSNoTriggerTest.java index b218c39aec..46deafd0a4 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSNoTriggerTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSNoTriggerTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSOnlyTriggerOneSectionTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSOnlyTriggerOneSectionTest.java index 5510cdf614..deacc8167e 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSOnlyTriggerOneSectionTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSOnlyTriggerOneSectionTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSTriggerTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSTriggerTest.java index b007d16bde..9ba19fbbfa 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSTriggerTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/NoSecLwM2MIntegrationBSTriggerTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/application/src/test/java/org/thingsboard/server/utils/CalculatedFieldUtilsTest.java b/application/src/test/java/org/thingsboard/server/utils/CalculatedFieldUtilsTest.java index f4bb9bc4c9..1e2273af7c 100644 --- a/application/src/test/java/org/thingsboard/server/utils/CalculatedFieldUtilsTest.java +++ b/application/src/test/java/org/thingsboard/server/utils/CalculatedFieldUtilsTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/pat/ApiKeyService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/pat/ApiKeyService.java index 2fb67d2052..798549cf85 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/pat/ApiKeyService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/pat/ApiKeyService.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/NameConflictPolicy.java b/common/data/src/main/java/org/thingsboard/server/common/data/NameConflictPolicy.java index 1685dbc933..8386c32387 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/NameConflictPolicy.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/NameConflictPolicy.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/NameConflictStrategy.java b/common/data/src/main/java/org/thingsboard/server/common/data/NameConflictStrategy.java index 9624b8c978..ab43448f28 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/NameConflictStrategy.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/NameConflictStrategy.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/UniquifyStrategy.java b/common/data/src/main/java/org/thingsboard/server/common/data/UniquifyStrategy.java index 5c9841f096..addf0b8b07 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/UniquifyStrategy.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/UniquifyStrategy.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/UserAuthDetails.java b/common/data/src/main/java/org/thingsboard/server/common/data/UserAuthDetails.java index 3bb05e8fee..f71b1a7f73 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/UserAuthDetails.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/UserAuthDetails.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmCommentSubType.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmCommentSubType.java index 08bdf71e37..80d08a594d 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmCommentSubType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmCommentSubType.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/AlarmRule.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/AlarmRule.java index 7dcf7ffe66..93370c0c30 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/AlarmRule.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/AlarmRule.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmCondition.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmCondition.java index 073d9347fa..1d50f3343c 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmCondition.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmCondition.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmConditionType.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmConditionType.java index fd98ed2984..4810a74f99 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmConditionType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmConditionType.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmConditionValue.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmConditionValue.java index fab3a78ab3..d55faf6fbf 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmConditionValue.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmConditionValue.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/DurationAlarmCondition.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/DurationAlarmCondition.java index 22733ab78d..0a4a995ab0 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/DurationAlarmCondition.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/DurationAlarmCondition.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/RepeatingAlarmCondition.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/RepeatingAlarmCondition.java index 7919a6a22a..28472d0556 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/RepeatingAlarmCondition.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/RepeatingAlarmCondition.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/SimpleAlarmCondition.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/SimpleAlarmCondition.java index 8e2a7593b0..73dfac9e60 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/SimpleAlarmCondition.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/SimpleAlarmCondition.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionExpression.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionExpression.java index 0502a10105..e02d438c0d 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionExpression.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionExpression.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionExpressionType.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionExpressionType.java index f0b8f5253d..b683188436 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionExpressionType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionExpressionType.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionFilter.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionFilter.java index 4c6df3825d..448d4586ff 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionFilter.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionFilter.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/ComplexOperation.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/ComplexOperation.java index 21c28fa552..492fc683dd 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/ComplexOperation.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/ComplexOperation.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/SimpleAlarmConditionExpression.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/SimpleAlarmConditionExpression.java index b0afbcc7ba..ec5407b19d 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/SimpleAlarmConditionExpression.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/SimpleAlarmConditionExpression.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/TbelAlarmConditionExpression.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/TbelAlarmConditionExpression.java index 2562e19be4..e7a24dff72 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/TbelAlarmConditionExpression.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/TbelAlarmConditionExpression.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/BooleanFilterPredicate.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/BooleanFilterPredicate.java index 94dced5fe4..15731ae1fb 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/BooleanFilterPredicate.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/BooleanFilterPredicate.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/ComplexFilterPredicate.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/ComplexFilterPredicate.java index 4e24ea28ba..5fa7c17107 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/ComplexFilterPredicate.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/ComplexFilterPredicate.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/FilterPredicateType.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/FilterPredicateType.java index 687b39932e..3b5fa638d8 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/FilterPredicateType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/FilterPredicateType.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/KeyFilterPredicate.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/KeyFilterPredicate.java index ca4531c123..24f7a6acf6 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/KeyFilterPredicate.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/KeyFilterPredicate.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/NoDataFilterPredicate.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/NoDataFilterPredicate.java index 82b366f6ae..d6f733d2c1 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/NoDataFilterPredicate.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/NoDataFilterPredicate.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/NumericFilterPredicate.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/NumericFilterPredicate.java index 4bc547695b..5622836c93 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/NumericFilterPredicate.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/NumericFilterPredicate.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/SimpleKeyFilterPredicate.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/SimpleKeyFilterPredicate.java index 0ea4cbf1eb..952a5c2d46 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/SimpleKeyFilterPredicate.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/SimpleKeyFilterPredicate.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/StringFilterPredicate.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/StringFilterPredicate.java index 913c12ca1c..1053f21271 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/StringFilterPredicate.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/StringFilterPredicate.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AlarmSchedule.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AlarmSchedule.java index e7394c94bd..e764a9fb46 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AlarmSchedule.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AlarmSchedule.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AlarmScheduleType.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AlarmScheduleType.java index d18d92834e..73e9e80159 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AlarmScheduleType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AlarmScheduleType.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AnyTimeSchedule.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AnyTimeSchedule.java index e84f767f5b..2d0454c16e 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AnyTimeSchedule.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AnyTimeSchedule.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/CustomTimeSchedule.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/CustomTimeSchedule.java index b084494d28..bbb1fd0390 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/CustomTimeSchedule.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/CustomTimeSchedule.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/CustomTimeScheduleItem.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/CustomTimeScheduleItem.java index 8a2bb97c39..47d60e732b 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/CustomTimeScheduleItem.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/CustomTimeScheduleItem.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/SpecificTimeSchedule.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/SpecificTimeSchedule.java index 7242d2c9cd..733081b81f 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/SpecificTimeSchedule.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/SpecificTimeSchedule.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldFilter.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldFilter.java index babe2b58ad..81a50e69c4 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldFilter.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldFilter.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldInfo.java index b72613e86f..68b60d30a5 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldInfo.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AlarmCalculatedFieldConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AlarmCalculatedFieldConfiguration.java index 6f3cdbdd3c..ef3869fccb 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AlarmCalculatedFieldConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AlarmCalculatedFieldConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ArgumentsBasedCalculatedFieldConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ArgumentsBasedCalculatedFieldConfiguration.java index 294335e665..1dd87a3974 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ArgumentsBasedCalculatedFieldConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ArgumentsBasedCalculatedFieldConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesImmediateOutputStrategy.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesImmediateOutputStrategy.java index 81874002cb..2a17232f0f 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesImmediateOutputStrategy.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesImmediateOutputStrategy.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesOutput.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesOutput.java index 578af5c6ea..e672c90ed0 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesOutput.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesOutput.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesOutputStrategy.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesOutputStrategy.java index 057fb7d8d7..02b453b20a 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesOutputStrategy.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesOutputStrategy.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesRuleChainOutputStrategy.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesRuleChainOutputStrategy.java index f39efadb86..5d0b4a3abe 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesRuleChainOutputStrategy.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/AttributesRuleChainOutputStrategy.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/CFArgumentDynamicSourceType.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/CFArgumentDynamicSourceType.java index a9d374015b..192694b32a 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/CFArgumentDynamicSourceType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/CFArgumentDynamicSourceType.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/CfArgumentDynamicSourceConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/CfArgumentDynamicSourceConfiguration.java index 6a0f0c25ca..90c4b3fa39 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/CfArgumentDynamicSourceConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/CfArgumentDynamicSourceConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ExpressionBasedCalculatedFieldConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ExpressionBasedCalculatedFieldConfiguration.java index 17e6a0ba80..5b25d7ca11 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ExpressionBasedCalculatedFieldConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ExpressionBasedCalculatedFieldConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/HasRelationPathLevel.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/HasRelationPathLevel.java index 40e7441a9b..0a71bb7bad 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/HasRelationPathLevel.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/HasRelationPathLevel.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/OutputStrategy.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/OutputStrategy.java index 66b156ca8a..c34c1040e2 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/OutputStrategy.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/OutputStrategy.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/OutputStrategyType.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/OutputStrategyType.java index 4f5234acb5..454f312ebd 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/OutputStrategyType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/OutputStrategyType.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/PropagationCalculatedFieldConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/PropagationCalculatedFieldConfiguration.java index 0044822555..4c796b25b0 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/PropagationCalculatedFieldConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/PropagationCalculatedFieldConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/RelationPathQueryDynamicSourceConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/RelationPathQueryDynamicSourceConfiguration.java index 6595e00f1a..208bb3cc80 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/RelationPathQueryDynamicSourceConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/RelationPathQueryDynamicSourceConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ScheduledUpdateSupportedCalculatedFieldConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ScheduledUpdateSupportedCalculatedFieldConfiguration.java index e1e8ca1a9b..f5b45c6d5c 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ScheduledUpdateSupportedCalculatedFieldConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ScheduledUpdateSupportedCalculatedFieldConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesImmediateOutputStrategy.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesImmediateOutputStrategy.java index a24bfc8683..33be67e5a6 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesImmediateOutputStrategy.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesImmediateOutputStrategy.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesOutput.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesOutput.java index 5c6a907290..a16b9cab89 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesOutput.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesOutput.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesOutputStrategy.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesOutputStrategy.java index 303c180c46..327cad3d5f 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesOutputStrategy.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesOutputStrategy.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesRuleChainOutputStrategy.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesRuleChainOutputStrategy.java index 0b17594869..d4ebb231a2 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesRuleChainOutputStrategy.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/TimeSeriesRuleChainOutputStrategy.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggFunction.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggFunction.java index cd0e3f66d4..c29ef61beb 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggFunction.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggFunction.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggFunctionInput.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggFunctionInput.java index f6df80952e..ce29e20ea4 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggFunctionInput.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggFunctionInput.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggInput.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggInput.java index 06929de81c..32db324db9 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggInput.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggInput.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggKeyInput.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggKeyInput.java index 1a00a18a9d..55aed3b59a 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggKeyInput.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggKeyInput.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggMetric.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggMetric.java index 355ca2c72d..ea841e24eb 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggMetric.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/AggMetric.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/RelatedEntitiesAggregationCalculatedFieldConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/RelatedEntitiesAggregationCalculatedFieldConfiguration.java index ecbab0ab94..3b0df7ed82 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/RelatedEntitiesAggregationCalculatedFieldConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/RelatedEntitiesAggregationCalculatedFieldConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/EntityAggregationCalculatedFieldConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/EntityAggregationCalculatedFieldConfiguration.java index 488db86870..53235136bb 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/EntityAggregationCalculatedFieldConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/EntityAggregationCalculatedFieldConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggInterval.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggInterval.java index 3d38ebc1f6..2eada7f165 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggInterval.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggInterval.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggIntervalType.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggIntervalType.java index 1d39f14a03..4f98bc08de 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggIntervalType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggIntervalType.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/BaseAggInterval.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/BaseAggInterval.java index 0c0801dea9..8f77215568 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/BaseAggInterval.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/BaseAggInterval.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/CustomInterval.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/CustomInterval.java index 24bfa26d8d..3b72f309d8 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/CustomInterval.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/CustomInterval.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/DayInterval.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/DayInterval.java index 2ad0ce24d3..1ff5ed25c2 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/DayInterval.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/DayInterval.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/HourInterval.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/HourInterval.java index 3ce366bc75..f20387db82 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/HourInterval.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/HourInterval.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/MonthInterval.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/MonthInterval.java index 3ce121459b..3e2dee2eaf 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/MonthInterval.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/MonthInterval.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/QuarterInterval.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/QuarterInterval.java index 96fcfc0dc8..6a9123f76f 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/QuarterInterval.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/QuarterInterval.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/Watermark.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/Watermark.java index b07e6a3012..7f1a53fd57 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/Watermark.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/Watermark.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/WeekInterval.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/WeekInterval.java index 0f70adc5ad..311a5254ef 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/WeekInterval.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/WeekInterval.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/WeekSunSatInterval.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/WeekSunSatInterval.java index 2c4482f0b4..732b82446a 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/WeekSunSatInterval.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/WeekSunSatInterval.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/YearInterval.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/YearInterval.java index 441f3913a9..9f1015f01e 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/YearInterval.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/YearInterval.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/EntityCoordinates.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/EntityCoordinates.java index ad31293061..83d6275441 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/EntityCoordinates.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/EntityCoordinates.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingCalculatedFieldConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingCalculatedFieldConfiguration.java index acefd5ff26..2d1abd0024 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingCalculatedFieldConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingCalculatedFieldConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingEvent.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingEvent.java index a6ee0cfcd6..973524c9f8 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingEvent.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingEvent.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingPresenceStatus.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingPresenceStatus.java index 38977cb650..e17d97aa3f 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingPresenceStatus.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingPresenceStatus.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingReportStrategy.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingReportStrategy.java index a7937bb93c..3acb67d12a 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingReportStrategy.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingReportStrategy.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingTransitionEvent.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingTransitionEvent.java index d7cf996fa7..a4af68a519 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingTransitionEvent.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingTransitionEvent.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/ZoneGroupConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/ZoneGroupConfiguration.java index a06cb242cf..cf2827a47e 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/ZoneGroupConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/geofencing/ZoneGroupConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/Lwm2mServerIdentifier.java b/common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/Lwm2mServerIdentifier.java index f4f020776b..33a845074c 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/Lwm2mServerIdentifier.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/Lwm2mServerIdentifier.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntitiesLimitIncreaseRequestNotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntitiesLimitIncreaseRequestNotificationInfo.java index 208b43282e..f00014567d 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntitiesLimitIncreaseRequestNotificationInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntitiesLimitIncreaseRequestNotificationInfo.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/SystemLevelUsersFilter.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/SystemLevelUsersFilter.java index 20233f7e49..9d5cfed5a8 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/SystemLevelUsersFilter.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/SystemLevelUsersFilter.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKey.java b/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKey.java index a48be1c9c4..d305c218ce 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKey.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKey.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKeyInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKeyInfo.java index 41f7e49cdc..bfb9e3cabb 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKeyInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKeyInfo.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/query/AvailableEntityKeys.java b/common/data/src/main/java/org/thingsboard/server/common/data/query/AvailableEntityKeys.java index 4cac646908..a20d0dca55 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/query/AvailableEntityKeys.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/query/AvailableEntityKeys.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/relation/EntityRelationPathQuery.java b/common/data/src/main/java/org/thingsboard/server/common/data/relation/EntityRelationPathQuery.java index a81e3e0c86..3a4d8f0f99 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/relation/EntityRelationPathQuery.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/relation/EntityRelationPathQuery.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationPathLevel.java b/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationPathLevel.java index c04ca09e79..cff16586e5 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationPathLevel.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationPathLevel.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/main/java/org/thingsboard/server/exception/ThingsboardRuntimeException.java b/common/data/src/main/java/org/thingsboard/server/exception/ThingsboardRuntimeException.java index 0a0b8ca718..3ae5f23e82 100644 --- a/common/data/src/main/java/org/thingsboard/server/exception/ThingsboardRuntimeException.java +++ b/common/data/src/main/java/org/thingsboard/server/exception/ThingsboardRuntimeException.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/ArgumentTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/ArgumentTest.java index ec99b29fe8..2fbbd66478 100644 --- a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/ArgumentTest.java +++ b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/ArgumentTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/CalculatedFieldOutputTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/CalculatedFieldOutputTest.java index 52afa47fbd..ebf56824fe 100644 --- a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/CalculatedFieldOutputTest.java +++ b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/CalculatedFieldOutputTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/PropagationCalculatedFieldConfigurationTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/PropagationCalculatedFieldConfigurationTest.java index 9c77f1bd21..7430c6eec0 100644 --- a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/PropagationCalculatedFieldConfigurationTest.java +++ b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/PropagationCalculatedFieldConfigurationTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/RelationPathQueryDynamicSourceConfigurationTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/RelationPathQueryDynamicSourceConfigurationTest.java index 1a6ea5de3b..9e89bf7045 100644 --- a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/RelationPathQueryDynamicSourceConfigurationTest.java +++ b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/RelationPathQueryDynamicSourceConfigurationTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/ScheduledUpdateSupportedCalculatedFieldConfigurationTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/ScheduledUpdateSupportedCalculatedFieldConfigurationTest.java index 15a191be97..23e0f1add3 100644 --- a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/ScheduledUpdateSupportedCalculatedFieldConfigurationTest.java +++ b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/ScheduledUpdateSupportedCalculatedFieldConfigurationTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/aggregation/RelatedEntitiesAggregationCalculatedFieldConfigurationTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/aggregation/RelatedEntitiesAggregationCalculatedFieldConfigurationTest.java index 18a16de161..f68bef5ef2 100644 --- a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/aggregation/RelatedEntitiesAggregationCalculatedFieldConfigurationTest.java +++ b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/aggregation/RelatedEntitiesAggregationCalculatedFieldConfigurationTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/EntityAggregationCalculatedFieldConfigurationTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/EntityAggregationCalculatedFieldConfigurationTest.java index 9311bcead7..8a1509b650 100644 --- a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/EntityAggregationCalculatedFieldConfigurationTest.java +++ b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/EntityAggregationCalculatedFieldConfigurationTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggIntervalTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggIntervalTest.java index f376f7b552..fd1a70d02f 100644 --- a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggIntervalTest.java +++ b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/aggregation/single/interval/AggIntervalTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/geofencing/EntityCoordinatesTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/geofencing/EntityCoordinatesTest.java index a8ee18c7d7..5f4655dd46 100644 --- a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/geofencing/EntityCoordinatesTest.java +++ b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/geofencing/EntityCoordinatesTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingCalculatedFieldConfigurationTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingCalculatedFieldConfigurationTest.java index 2e9d5e4a88..2f391435b2 100644 --- a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingCalculatedFieldConfigurationTest.java +++ b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/geofencing/GeofencingCalculatedFieldConfigurationTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/geofencing/ZoneGroupConfigurationTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/geofencing/ZoneGroupConfigurationTest.java index e354a05af9..158eb9762a 100644 --- a/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/geofencing/ZoneGroupConfigurationTest.java +++ b/common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/geofencing/ZoneGroupConfigurationTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/message/src/main/java/org/thingsboard/server/common/msg/CalculatedFieldStatePartitionRestoreMsg.java b/common/message/src/main/java/org/thingsboard/server/common/msg/CalculatedFieldStatePartitionRestoreMsg.java index b16e2adb85..948c68108c 100644 --- a/common/message/src/main/java/org/thingsboard/server/common/msg/CalculatedFieldStatePartitionRestoreMsg.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/CalculatedFieldStatePartitionRestoreMsg.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfGeofencingArg.java b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfGeofencingArg.java index 0fa0f4a5bf..16748f79f9 100644 --- a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfGeofencingArg.java +++ b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfGeofencingArg.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfPropagationArg.java b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfPropagationArg.java index 83d7e81a86..b6cfa2c863 100644 --- a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfPropagationArg.java +++ b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfPropagationArg.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfRelatedEntitiesArgumentValue.java b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfRelatedEntitiesArgumentValue.java index 02d641d576..58a310b3f5 100644 --- a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfRelatedEntitiesArgumentValue.java +++ b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbelCfRelatedEntitiesArgumentValue.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/util/src/main/java/org/thingsboard/common/util/geo/CirclePerimeterDefinition.java b/common/util/src/main/java/org/thingsboard/common/util/geo/CirclePerimeterDefinition.java index 4d5390a27a..15b91f5a2e 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/geo/CirclePerimeterDefinition.java +++ b/common/util/src/main/java/org/thingsboard/common/util/geo/CirclePerimeterDefinition.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/util/src/main/java/org/thingsboard/common/util/geo/PerimeterDefinition.java b/common/util/src/main/java/org/thingsboard/common/util/geo/PerimeterDefinition.java index 7c7f2cd1a3..218596b543 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/geo/PerimeterDefinition.java +++ b/common/util/src/main/java/org/thingsboard/common/util/geo/PerimeterDefinition.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/util/src/main/java/org/thingsboard/common/util/geo/PerimeterDefinitionDeserializer.java b/common/util/src/main/java/org/thingsboard/common/util/geo/PerimeterDefinitionDeserializer.java index e60e314fe0..9ddddbdf9e 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/geo/PerimeterDefinitionDeserializer.java +++ b/common/util/src/main/java/org/thingsboard/common/util/geo/PerimeterDefinitionDeserializer.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/util/src/main/java/org/thingsboard/common/util/geo/PerimeterDefinitionSerializer.java b/common/util/src/main/java/org/thingsboard/common/util/geo/PerimeterDefinitionSerializer.java index d27aafecc0..76b86ee2a4 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/geo/PerimeterDefinitionSerializer.java +++ b/common/util/src/main/java/org/thingsboard/common/util/geo/PerimeterDefinitionSerializer.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/util/src/main/java/org/thingsboard/common/util/geo/PolygonPerimeterDefinition.java b/common/util/src/main/java/org/thingsboard/common/util/geo/PolygonPerimeterDefinition.java index 2d8ca6ef56..b0720ae04a 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/geo/PolygonPerimeterDefinition.java +++ b/common/util/src/main/java/org/thingsboard/common/util/geo/PolygonPerimeterDefinition.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/util/src/test/java/org/thingsboard/common/util/geo/PerimeterDefinitionDeserializerTest.java b/common/util/src/test/java/org/thingsboard/common/util/geo/PerimeterDefinitionDeserializerTest.java index 5c00847861..631c442786 100644 --- a/common/util/src/test/java/org/thingsboard/common/util/geo/PerimeterDefinitionDeserializerTest.java +++ b/common/util/src/test/java/org/thingsboard/common/util/geo/PerimeterDefinitionDeserializerTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/common/util/src/test/java/org/thingsboard/common/util/geo/PerimeterDefinitionSerializerTest.java b/common/util/src/test/java/org/thingsboard/common/util/geo/PerimeterDefinitionSerializerTest.java index d316d1c398..bed15db25b 100644 --- a/common/util/src/test/java/org/thingsboard/common/util/geo/PerimeterDefinitionSerializerTest.java +++ b/common/util/src/test/java/org/thingsboard/common/util/geo/PerimeterDefinitionSerializerTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractApiKeyInfoEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractApiKeyInfoEntity.java index ff41f566bc..6fe6ce625f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractApiKeyInfoEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractApiKeyInfoEntity.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ApiKeyEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ApiKeyEntity.java index 0942b0b5af..47a12e9a71 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ApiKeyEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ApiKeyEntity.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ApiKeyInfoEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ApiKeyInfoEntity.java index 1ca6336027..8889d0d2f1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ApiKeyInfoEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ApiKeyInfoEntity.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyCacheKey.java b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyCacheKey.java index a655ac1c25..ea733cdef3 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyCacheKey.java +++ b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyCacheKey.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyCaffeineCache.java b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyCaffeineCache.java index 48eab7a32c..7ffc48ee86 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyCaffeineCache.java +++ b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyCaffeineCache.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyDao.java b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyDao.java index 20448bb25c..d71d6502cf 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyDao.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyEvictEvent.java b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyEvictEvent.java index d39149f11a..681e89e122 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyEvictEvent.java +++ b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyEvictEvent.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyInfoDao.java b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyInfoDao.java index 5b7b2022c5..8b7e1fd2ef 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyInfoDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyInfoDao.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyRedisCache.java b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyRedisCache.java index eee0b8dc31..e79ddb69f2 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyRedisCache.java +++ b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyRedisCache.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyServiceImpl.java index 6f1ec5d94c..17a3e2bda3 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyServiceImpl.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ApiKeyDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ApiKeyDataValidator.java index 7b2ebe9d40..2420a54cdf 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ApiKeyDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ApiKeyDataValidator.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/pat/ApiKeyRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/pat/ApiKeyRepository.java index 8b96776d4d..e3e560725c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/pat/ApiKeyRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/pat/ApiKeyRepository.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/pat/JpaApiKeyDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/pat/JpaApiKeyDao.java index 76bd7e52b6..61ca7bd142 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/pat/JpaApiKeyDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/pat/JpaApiKeyDao.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/pat/JpaApiKeyInfoDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/pat/JpaApiKeyInfoDao.java index f152f672d4..0ce3d0d1bc 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/pat/JpaApiKeyInfoDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/pat/JpaApiKeyInfoDao.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/ApiKeyServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/ApiKeyServiceTest.java index 2ccf658b61..f345c34c0d 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/ApiKeyServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/ApiKeyServiceTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/data/notification/InfoNotification.java b/monitoring/src/main/java/org/thingsboard/monitoring/data/notification/InfoNotification.java index 6aa42cbf2b..b2b73414de 100644 --- a/monitoring/src/main/java/org/thingsboard/monitoring/data/notification/InfoNotification.java +++ b/monitoring/src/main/java/org/thingsboard/monitoring/data/notification/InfoNotification.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/JavaRestClientTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/JavaRestClientTest.java index 5b98f4859b..c9ebfad3e2 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/JavaRestClientTest.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/JavaRestClientTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbCalculatedFieldsNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbCalculatedFieldsNodeTest.java index 755f282dde..e4203d6497 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbCalculatedFieldsNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbCalculatedFieldsNodeTest.java @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/ui-ngx/src/app/core/http/api-key.service.ts b/ui-ngx/src/app/core/http/api-key.service.ts index e2789dfab7..a1b85ae1a6 100644 --- a/ui-ngx/src/app/core/http/api-key.service.ts +++ b/ui-ngx/src/app/core/http/api-key.service.ts @@ -1,5 +1,5 @@ /// -/// Copyright © 2016-2025 The Thingsboard Authors +/// 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. diff --git a/ui-ngx/src/app/core/services/calculated-field-form.service.ts b/ui-ngx/src/app/core/services/calculated-field-form.service.ts index cc3e495c17..673b97abe4 100644 --- a/ui-ngx/src/app/core/services/calculated-field-form.service.ts +++ b/ui-ngx/src/app/core/services/calculated-field-form.service.ts @@ -1,5 +1,5 @@ /// -/// Copyright © 2016-2025 The Thingsboard Authors +/// 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. diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-details-dialog.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-details-dialog.component.html index 97bd25836a..413b72e614 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-details-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-details-dialog.component.html @@ -1,6 +1,6 @@ -
@for (createAlarmRuleControl of createAlarmRulesFormArray().controls; track createAlarmRuleControl; let index = $index) {
diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.scss b/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.scss index c00cf6af9c..7250c86ab2 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.scss +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.scss @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts index d5ec210f34..1c56cdbbad 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts @@ -1,5 +1,5 @@ /// -/// Copyright © 2016-2025 The Thingsboard Authors +/// 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. diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.html index c0c5a72d77..194e1cb715 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.html @@ -1,6 +1,6 @@ -
{{ 'api-key.edit-description' | translate }}
diff --git a/ui-ngx/src/app/modules/home/components/api-key/edit-api-key-description-panel.component.scss b/ui-ngx/src/app/modules/home/components/api-key/edit-api-key-description-panel.component.scss index 607339a886..5dcf029470 100644 --- a/ui-ngx/src/app/modules/home/components/api-key/edit-api-key-description-panel.component.scss +++ b/ui-ngx/src/app/modules/home/components/api-key/edit-api-key-description-panel.component.scss @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2025 The Thingsboard Authors + * 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. @@ -14,7 +14,6 @@ * limitations under the License. */ - .tb-edit-api-key-description-panel { --mdc-outlined-text-field-outline-color: rgba(0,0,0,0.12); diff --git a/ui-ngx/src/app/modules/home/components/api-key/edit-api-key-description-panel.component.ts b/ui-ngx/src/app/modules/home/components/api-key/edit-api-key-description-panel.component.ts index 80985f6121..1614ea1ed3 100644 --- a/ui-ngx/src/app/modules/home/components/api-key/edit-api-key-description-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/api-key/edit-api-key-description-panel.component.ts @@ -1,5 +1,5 @@ /// -/// Copyright © 2016-2025 The Thingsboard Authors +/// 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. diff --git a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.html b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.html index 8d53bdd99b..fd5311ba42 100644 --- a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.html +++ b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.html @@ -1,6 +1,6 @@ -
@@ -97,14 +98,16 @@
- + @if (isEditValue) { + + }
alarm-rule.no-clear-alarm-rule diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts index 0092bf2132..5ca7b36165 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts @@ -53,7 +53,7 @@ import { EntityService } from '@core/http/entity.service'; @Component({ selector: 'tb-alarm-rules', templateUrl: './alarm-rules.component.html', - styleUrls: [] + styleUrls: ['./alarm-rule-dialog.component.scss'] }) export class AlarmRulesComponent extends EntityComponent { @@ -175,7 +175,8 @@ export class AlarmRulesComponent extends EntityComponent
@@ -75,7 +76,7 @@ matTooltip="{{ 'calculated-fields.test-script-function' | translate }}" matTooltipPosition="above" class="tb-mat-32" - [disabled]="!argumentsList.length" + [disabled]="!argumentsList.length || readonly" (click)="onTestScript($event)"> bug_report @@ -84,7 +85,7 @@
@@ -111,7 +112,7 @@ required> } @else { - {{ 'alarm-rule.no-filter-preview' | translate }} + {{ 'alarm-rule.no-filter-preview' | translate }} }
@@ -135,7 +136,7 @@ {{ 'alarm-rule.condition-type-hint' | translate }}
} - @if (conditionFormGroup.get('type').value == AlarmConditionType.DURATION) { + @if (conditionFormGroup.get('type').value === AlarmConditionType.DURATION) {
{{ 'alarm-rule.value' | translate }}
@@ -167,7 +168,7 @@
- } @else if (conditionFormGroup.get('type').value == AlarmConditionType.REPEATING) { + } @else if (conditionFormGroup.get('type').value === AlarmConditionType.REPEATING) {
{{ 'alarm-rule.value' | translate }}
diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition-dialog.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition-dialog.component.ts index 6f691ecd21..05bf08880f 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition-dialog.component.ts @@ -196,6 +196,10 @@ export class CfAlarmRuleConditionDialogComponent extends DialogComponent -
@@ -63,7 +63,7 @@
-
+
@@ -90,7 +90,7 @@
-
diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.html index b0ea9f406e..122c52b08f 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.html @@ -49,7 +49,7 @@
} @if (!createAlarmRulesFormArray().controls.length) { - + alarm-rule.add-create-alarm-rule-prompt } diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.html index c0c5a72d77..9fec85d745 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.html @@ -52,10 +52,12 @@ cdkFocusInitial> {{'action.cancel' | translate }} - + @if (!readonly) { + + }
diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.ts index 403a0be8ca..70fed16663 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.ts @@ -36,6 +36,7 @@ export interface AlarmRuleComplexFilterPredicateDialogData { valueType: EntityKeyValueType; arguments: Record; argumentInUse: string; + readonly: boolean; } @Component({ @@ -63,6 +64,8 @@ export class AlarmRuleComplexFilterPredicateDialogComponent extends arguments = this.data.arguments; + readonly = this.data.readonly; + constructor(protected store: Store, protected router: Router, @Inject(MAT_DIALOG_DATA) public data: AlarmRuleComplexFilterPredicateDialogData, @@ -73,6 +76,10 @@ export class AlarmRuleComplexFilterPredicateDialogComponent extends this.isAdd = this.data.isAdd; this.complexFilterFormGroup.patchValue(this.data.complexPredicate, {emitEvent: false}); + + if (this.readonly) { + this.complexFilterFormGroup.disable({emitEvent: false}); + } } cancel(): void { diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-dialog.component.html b/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-dialog.component.html index 800e78c9d3..081ce44e88 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-dialog.component.html @@ -46,7 +46,7 @@ } - + filter.value-type.value-type @@ -93,10 +93,12 @@ cdkFocusInitial> {{ 'action.cancel' | translate }} - + @if (!readonly) { + + }
diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-dialog.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-dialog.component.ts index fbd19a7a47..312954aa5a 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-dialog.component.ts @@ -39,6 +39,7 @@ isAdd: boolean; arguments: Record; usedArguments: Array; + readonly: boolean; } @Component({ @@ -66,6 +67,8 @@ export class AlarmRuleFilterDialogComponent extends DialogComponent; + readonly = this.data.readonly; + constructor(protected store: Store, protected router: Router, @Inject(MAT_DIALOG_DATA) public data: AlarmRuleFilterDialogData, @@ -114,6 +117,10 @@ export class AlarmRuleFilterDialogComponent extends DialogComponent
-
{{ filterControl.value?.argument }}
-
{{ FilterPredicateTypeTranslationMap.get(filterControl.value?.valueType) | translate }}
+
{{ filterControl.value?.argument }}
+
{{ FilterPredicateTypeTranslationMap.get(filterControl.value?.valueType) | translate }}
diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate.component.ts index 647d294268..c2a5601739 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate.component.ts @@ -203,6 +203,7 @@ export class AlarmRuleFilterPredicateComponent implements ControlValueAccessor, isAdd: false, arguments: this.arguments, argumentInUse: this.argumentInUse, + readonly: this.disabled } }).afterClosed().subscribe( (result) => { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html index 1150b5b2a6..6e2297b958 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.html @@ -101,6 +101,7 @@ [entityName]="entityName" [ownerId]="ownerId" [tenantId]="tenantId" + [isEditValue]="isEditValue" > } @case (CalculatedFieldType.PROPAGATION) { @@ -111,6 +112,7 @@ [tenantId]="tenantId" [ownerId]="ownerId" [testScript]="onTestScript.bind(this)" + [isEditValue]="isEditValue" > } @case (CalculatedFieldType.RELATED_ENTITIES_AGGREGATION) { @@ -120,6 +122,7 @@ [entityName]="entityName" [tenantId]="tenantId" [testScript]="onTestScript.bind(this)" + [isEditValue]="isEditValue" > } @case (CalculatedFieldType.ENTITY_AGGREGATION) { @@ -128,6 +131,7 @@ [entityId]="entityId" [entityName]="entityName" [tenantId]="tenantId" + [isEditValue]="isEditValue" > } @default { @@ -139,6 +143,7 @@ [tenantId]="tenantId" [isScript]="entityForm.get('type').value === CalculatedFieldType.SCRIPT" [testScript]="onTestScript.bind(this)" + [isEditValue]="isEditValue" > } } diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.html index c61ce4c467..e3eb3f524c 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.html @@ -93,7 +93,7 @@
- @if (disable) { + @if (!isEditValue) {
diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.ts index 6f281b8e25..d7312db7a1 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.ts @@ -14,7 +14,7 @@ /// limitations under the License. /// -import { Component, forwardRef, Input } from '@angular/core'; +import { booleanAttribute, Component, forwardRef, Input } from '@angular/core'; import { ControlValueAccessor, FormBuilder, @@ -87,6 +87,8 @@ export class EntityAggregationComponentComponent implements ControlValueAccessor @Input() testScript: (expression?: string) => Observable; + @Input({transform: booleanAttribute}) isEditValue = true; + readonly minAllowedAggregationIntervalInSecForCF = getCurrentAuthState(this.store).minAllowedAggregationIntervalInSecForCF; readonly intermediateAggregationIntervalInSecForCF = getCurrentAuthState(this.store).intermediateAggregationIntervalInSecForCF; readonly DayInSec = DAY / SECOND; diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.html b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.html index d661f5021a..cf3ba5209e 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.html +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.html @@ -96,7 +96,7 @@
- @if (disable) { + @if (!isEditValue) { \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n Name\r\n \r\n \r\n Gateway name is required.\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n", + "customHtml": "
\r\n \r\n

Add gateway

\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n Name\r\n \r\n \r\n Gateway name is required.\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n", "customCss": ".add-entity-form {\r\n min-width: 400px !important;\r\n}\r\n\r\n.add-entity-form .boolean-value-input {\r\n padding-left: 5px;\r\n}\r\n\r\n.add-entity-form .boolean-value-input .checkbox-label {\r\n margin-bottom: 8px;\r\n color: rgba(0,0,0,0.54);\r\n font-size: 12px;\r\n}\r\n\r\n.relations-list .header {\r\n padding-right: 5px;\r\n padding-bottom: 5px;\r\n padding-left: 5px;\r\n}\r\n\r\n.relations-list .header .cell {\r\n padding-right: 5px;\r\n padding-left: 5px;\r\n font-size: 12px;\r\n font-weight: 700;\r\n color: rgba(0, 0, 0, .54);\r\n white-space: nowrap;\r\n}\r\n\r\n.relations-list .mat-form-field-infix {\r\n width: auto !important;\r\n}\r\n\r\n.relations-list .body {\r\n padding-right: 5px;\r\n padding-bottom: 15px;\r\n padding-left: 5px;\r\n}\r\n\r\n.relations-list .body .row {\r\n padding-top: 5px;\r\n}\r\n\r\n.relations-list .body .cell {\r\n padding-right: 5px;\r\n padding-left: 5px;\r\n}\r\n\r\n.relations-list .body .md-button {\r\n margin: 0;\r\n}\r\n\r\n", - "customFunction": "let $injector = widgetContext.$scope.$injector;\r\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\r\nlet assetService = $injector.get(widgetContext.servicesMap.get('assetService'));\r\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\r\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\r\nlet entityRelationService = $injector.get(widgetContext.servicesMap.get('entityRelationService'));\r\nlet userSettingsService = $injector.get(widgetContext.servicesMap.get('userSettingsService'));\r\n\r\nopenAddEntityDialog();\r\n\r\nfunction openAddEntityDialog() {\r\n customDialog.customDialog(htmlTemplate, AddEntityDialogController).subscribe();\r\n}\r\n\r\nfunction AddEntityDialogController(instance) {\r\n let vm = instance;\r\n let userSettings;\r\n userSettingsService.loadUserSettings().subscribe(settings=> {\r\n userSettings = settings;\r\n if (!userSettings.createdGatewaysCount) userSettings.createdGatewaysCount = 0;\r\n });\r\n \r\n\r\n vm.addEntityFormGroup = vm.fb.group({\r\n entityName: ['', [vm.validators.required]],\r\n entityType: ['DEVICE'],\r\n entityLabel: [''],\r\n type: ['', [vm.validators.required]],\r\n });\r\n\r\n vm.cancel = function() {\r\n vm.dialogRef.close(null);\r\n };\r\n\r\n\r\n vm.save = function($event) {\r\n vm.addEntityFormGroup.markAsPristine();\r\n saveEntityObservable().subscribe(\r\n function (device) {\r\n widgetContext.updateAliases();\r\n userSettingsService.putUserSettings({ createdGatewaysCount: ++userSettings.createdGatewaysCount }).subscribe(_=>{\r\n });\r\n vm.dialogRef.close(null);\r\n openCommandDialog(device, $event);\r\n }\r\n );\r\n };\r\n \r\n function openCommandDialog(device, $event) {\r\n vm.device = device;\r\n let openCommandAction = widgetContext.actionsApi.getActionDescriptors(\"actionCellButton\").find(action => action.name == \"Launch command\");\r\n setTimeout(() => {\r\n widgetContext.actionsApi.handleWidgetAction($event, openCommandAction, device.id, device.name, {newDevice: true});\r\n });\r\n goToConfigState();\r\n }\r\n\r\n \r\n function goToConfigState() {\r\n const stateParams = {};\r\n stateParams.entityId = vm.device.id;\r\n stateParams.entityName = vm.device.name;\r\n const newStateParams = {\r\n targetEntityParamName: 'default',\r\n new_gateway: {\r\n entityId: vm.device.id,\r\n entityName: vm.device.name\r\n }\r\n }\r\n const params = {...stateParams, ...newStateParams};\r\n widgetContext.stateController.openState('gateway_details', params, false);\r\n }\r\n\r\n function saveEntityObservable() {\r\n const formValues = vm.addEntityFormGroup.value;\r\n let entity = {\r\n name: formValues.entityName,\r\n type: formValues.type,\r\n label: formValues.entityLabel,\r\n additionalInfo: {\r\n gateway: true\r\n }\r\n };\r\n return deviceService.saveDevice(entity);\r\n }\r\n}\r\n", + "customFunction": "let $injector = widgetContext.$scope.$injector;\r\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\r\nlet assetService = $injector.get(widgetContext.servicesMap.get('assetService'));\r\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\r\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\r\nlet entityRelationService = $injector.get(widgetContext.servicesMap.get('entityRelationService'));\r\nlet userSettingsService = $injector.get(widgetContext.servicesMap.get('userSettingsService'));\r\n\r\nopenAddEntityDialog();\r\n\r\nfunction openAddEntityDialog() {\r\n customDialog.customDialog(htmlTemplate, AddEntityDialogController).subscribe();\r\n}\r\n\r\nfunction AddEntityDialogController(instance) {\r\n let vm = instance;\r\n let userSettings;\r\n userSettingsService.loadUserSettings().subscribe(settings=> {\r\n userSettings = settings;\r\n if (!userSettings.createdGatewaysCount) userSettings.createdGatewaysCount = 0;\r\n });\r\n \r\n\r\n vm.addEntityFormGroup = vm.fb.group({\r\n entityName: ['', [vm.validators.required, vm.validators.pattern(/.*\\S.*/)]],\r\n entityType: ['DEVICE'],\r\n entityLabel: [''],\r\n type: ['', [vm.validators.required]],\r\n });\r\n\r\n vm.cancel = function() {\r\n vm.dialogRef.close(null);\r\n };\r\n\r\n\r\n vm.save = function($event) {\r\n vm.addEntityFormGroup.markAsPristine();\r\n saveEntityObservable().subscribe(\r\n function (device) {\r\n widgetContext.updateAliases();\r\n userSettingsService.putUserSettings({ createdGatewaysCount: ++userSettings.createdGatewaysCount }).subscribe(_=>{\r\n });\r\n vm.dialogRef.close(null);\r\n openCommandDialog(device, $event);\r\n }\r\n );\r\n };\r\n \r\n function openCommandDialog(device, $event) {\r\n vm.device = device;\r\n let openCommandAction = widgetContext.actionsApi.getActionDescriptors(\"actionCellButton\").find(action => action.name == \"Launch command\");\r\n setTimeout(() => {\r\n widgetContext.actionsApi.handleWidgetAction($event, openCommandAction, device.id, device.name, {newDevice: true});\r\n });\r\n goToConfigState();\r\n }\r\n\r\n \r\n function goToConfigState() {\r\n const stateParams = {};\r\n stateParams.entityId = vm.device.id;\r\n stateParams.entityName = vm.device.name;\r\n const newStateParams = {\r\n targetEntityParamName: 'default',\r\n new_gateway: {\r\n entityId: vm.device.id,\r\n entityName: vm.device.name\r\n }\r\n }\r\n const params = {...stateParams, ...newStateParams};\r\n widgetContext.stateController.openState('gateway_details', params, false);\r\n }\r\n\r\n function saveEntityObservable() {\r\n const formValues = vm.addEntityFormGroup.value;\r\n let entity = {\r\n name: formValues.entityName.trim(),\r\n type: formValues.type,\r\n label: formValues.entityLabel,\r\n additionalInfo: {\r\n gateway: true\r\n }\r\n };\r\n return deviceService.saveDevice(entity);\r\n }\r\n}\r\n", "customResources": [], "openInSeparateDialog": false, "openInPopover": false, @@ -318,37 +285,6 @@ "dataKeys": [] } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1680685647526, - "endTimeMs": 1680772047526 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "#fff", "color": "rgba(0, 0, 0, 0.87)", @@ -369,7 +305,6 @@ "pageSize": 1024, "noDataDisplayMessage": "", "showLegend": false, - "useDashboardTimewindow": true, "borderRadius": "4px" }, "row": 0, @@ -424,37 +359,6 @@ ] } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1680769601167, - "endTimeMs": 1680856001167 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "#FFFFFF01", "color": "rgba(0, 0, 0, 0.87)", @@ -474,8 +378,7 @@ }, "pageSize": 1024, "noDataDisplayMessage": "", - "showLegend": false, - "useDashboardTimewindow": true + "showLegend": false }, "row": 0, "col": 0, @@ -553,8 +456,8 @@ "units": null, "decimals": null, "funcBody": null, - "usePostProcessing": true, - "postFuncBody": "var newValue = value == 'true' ? \"Active\" : \"Inactive\";\nreturn newValue;" + "usePostProcessing": false, + "postFuncBody": null }, { "name": "ALL_ERRORS_COUNT", @@ -571,6 +474,20 @@ "color": "#03a9f4", "settings": {}, "_hash": 0.007837366355011532 + }, + { + "name": "lastConnectTime", + "type": "attribute", + "label": "lastConnectTime", + "color": "#ff9800", + "settings": {} + }, + { + "name": "lastDisconnectTime", + "type": "attribute", + "label": "lastDisconnectTime", + "color": "#673ab7", + "settings": {} } ], "alarmFilterConfig": { @@ -612,37 +529,6 @@ ] } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1683116949383, - "endTimeMs": 1683203349383 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "#fff", "color": "rgba(0, 0, 0, 0.87)", @@ -650,9 +536,9 @@ "settings": { "useMarkdownTextFunction": true, "markdownTextPattern": "# Markdown/HTML card \\n - **Current entity**: **${entityName}**. \\n - **Current value**: **${Random}**.", - "markdownTextFunction": "var blockData = '';\nvar connectorsIndex = ctx.actionsApi.getActionDescriptors('elementClick').findIndex(action => action.name == \"Connectors\");\nvar logsIndex = ctx.actionsApi.getActionDescriptors('elementClick').findIndex(action => action.name == \"Logs\");\nfunction generateMatHeader(index) {\n if (index !== undefined && index > -1) {\n return ``\n } else {\n return \"\"\n }\n}\nfunction createDataBlock(value, label, dividerStyle, mobile, index) {\n blockData += `\n \n
\n \n ${generateMatHeader(index)}\n ${label}\n
\n ${ctx.sanitizer.sanitize(1, value)}\n `;\n}\ncreateDataBlock(data[0].Status, \"Status\", data[0].Status === \"Active\" ? 'divider-green' : 'divider-red');\ncreateDataBlock(data[0].Name, \"Gateway Name\", '', ctx.isMobile);\nif (data[0].Version) {\n createDataBlock(data[0].Version, \"Gateway Version\", '');\n}\ncreateDataBlock(data[0].Type, \"Gateway Type\", '');\ncreateDataBlock(\n `${(data[1] ? data[1].count : 0)} `\n + \" | \" +\n `${(data[2] ? data[2][\"count 2\"] : 0)} `\n , \"Devices (Active | Inactive)\", '');\ncreateDataBlock(\n `${(data[0].active_connectors ? JSON.parse(data[0].active_connectors).length : 0)} `\n + \" | \" +\n `${(data[0].inactive_connectors ? JSON.parse(data[0].inactive_connectors).length : 0)} `\n , \"Connectors (Enabled | Disabled)\", '', '', connectorsIndex);\ncreateDataBlock(data[0].ALL_ERRORS_COUNT || 0, \"Errors\", (data[0].ALL_ERRORS_COUNT || 0) === 0 ? 'divider-green' : 'divider-red', '', logsIndex);\nreturn `
${blockData}
`;", + "markdownTextFunction": "var blockData = '';\n\nfunction createDataBlock(value, label, dividerStyle, mobile, id) {\n blockData += `\n \n
\n \n ${id ? `` : ``}\n ${label}\n \n ${ctx.sanitizer.sanitize(1, value)}\n
`;\n}\nconst lastConnectTime = Number(data[0].lastConnectTime);\nconst lastDisconnectTime = Number(data[0].lastDisconnectTime);\nconst isActive =\n data[0].Status === 'true' &&\n (!lastDisconnectTime || lastConnectTime > lastDisconnectTime);\ncreateDataBlock(isActive ? \"{{'gateway.active' | translate }}\" : \"{{'gateway.inactive' | translate}}\", \"{{ 'gateway.status-widget.status' | translate }}\", isActive ? \"divider-green\" : \"divider-red\");\ncreateDataBlock(data[0].Name, \"{{ 'gateway.status-widget.gateway-name' | translate }}\", '', ctx.isMobile);\n\nif (data[0].Version) {\n createDataBlock(data[0].Version, \"{{ 'gateway.status-widget.gateway-version' | translate }}\", '');\n}\n\ncreateDataBlock(data[0].Type, \"{{ 'gateway.status-widget.gateway-type' | translate }}\", '');\n\ncreateDataBlock(\n `${(data[1] ? data[1].count : 0)} `\n + \" | \" +\n `${(data[2] ? data[2][\"count 2\"] : 0)} `\n , \"{{ 'gateway.status-widget.devices' | translate }} {{ 'gateway.status-widget.active-inactive' | translate }}\", '');\n \ncreateDataBlock(\n `${(data[0].active_connectors ? JSON.parse(data[0].active_connectors).length : 0)} `\n + \" | \" +\n `${(data[0].inactive_connectors ? JSON.parse(data[0].inactive_connectors).length : 0)} `\n , \"{{ 'gateway.status-widget.connectors' | translate }} {{ 'gateway.status-widget.enabled-disabled' | translate }}\", '', '', 'connectors');\n \ncreateDataBlock(data[0].ALL_ERRORS_COUNT || 0, \"{{ 'gateway.status-widget.errors' | translate }}\", (data[0].ALL_ERRORS_COUNT || 0) === 0 ? 'divider-green' : 'divider-red', '', 'logs');\n\nreturn `
${blockData}
`;", "applyDefaultMarkdownStyle": false, - "markdownCss": ".divider {\n position: absolute;\n width: 3px;\n top: 8px;\n border-radius: 2px;\n bottom: 8px;\n border: 1px solid rgba(31, 70, 144, 1);\n background-color: rgba(31, 70, 144, 1);\n left: 10px;\n}\n.divider-green .divider {\n border: 1px solid rgb(25,128,56);\n background-color: rgb(25,128,56);\n}\n\n.divider-green .mat-mdc-card-content {\n color: rgb(25,128,56);\n}\n\n.divider-red .divider {\n border: 1px solid rgb(203,37,48);\n background-color: rgb(203,37,48);\n}\n\n.divider-red .mat-mdc-card-content {\n color: rgb(203,37,48);\n}\n\n.mdc-card {\n position: relative;\n padding-left: 10px;\n margin-bottom: 1px;\n}\n\n.mat-mdc-card-subtitle {\n font-weight: 400;\n font-size: 12px;\n}\n\n.mat-mdc-card-header {\n padding: 8px 16px 0;\n}\n\n.mat-mdc-card-content:last-child {\n padding-bottom: 8px;\n font-size: 16px;\n}\n\n.cards-container {\n height: calc(100% - 1px);\n justify-content: stretch;\n align-items: center;\n margin-bottom: 1px;\n}\n\n::ng-deep.tb-home-widget-link > div {\n flex-grow: 1;\n cursor: pointer;\n}\n\n .tb-home-widget-link {\n width: 100%;\n }\n\n .tb-home-widget-link:hover::after{\n color: inherit;\n }\n \n .tb-home-widget-link::after{\n content: 'arrow_forward';\n display: inline-block;\n transform: rotate(315deg);\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 18px;\n color: rgba(0, 0, 0, 0.12);\n vertical-align: bottom;\n margin-left: 6px;\n}" + "markdownCss": ".divider {\n position: absolute;\n width: 3px;\n top: 8px;\n border-radius: 2px;\n bottom: 8px;\n border: 1px solid rgba(31, 70, 144, 1);\n background-color: rgba(31, 70, 144, 1);\n left: 10px;\n}\n.divider-green .divider {\n border: 1px solid rgb(25,128,56);\n background-color: rgb(25,128,56);\n}\n\n.divider-green .mat-mdc-card-content {\n color: rgb(25,128,56);\n}\n\n.divider-red .divider {\n border: 1px solid rgb(203,37,48);\n background-color: rgb(203,37,48);\n}\n\n.divider-red .mat-mdc-card-content {\n color: rgb(203,37,48);\n}\n\n.mdc-card {\n position: relative;\n padding-left: 10px;\n margin-bottom: 1px;\n}\n\n.mat-mdc-card-subtitle {\n font-weight: 400;\n font-size: 12px;\n}\n\n.mat-mdc-card-header {\n padding: 8px 16px 0;\n}\n\n.mat-mdc-card-content:last-child {\n padding-bottom: 8px;\n font-size: 16px;\n}\n\n.cards-container {\n height: calc(100% - 1px);\n justify-content: stretch;\n align-items: center;\n margin-bottom: 1px;\n}\n\n::ng-deep.tb-home-widget-link > div {\n flex-grow: 1;\n}\n\n.tb-home-widget-link {\n cursor: pointer;\n width: 100%;\n}\n\n.tb-home-widget-link:hover::after{\n color: inherit;\n}\n \n.tb-home-widget-link::after{\n content: 'arrow_forward';\n display: inline-block;\n transform: rotate(315deg);\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 18px;\n color: rgba(0, 0, 0, 0.12);\n vertical-align: bottom;\n margin-left: 6px;\n}" }, "title": "Connectors", "showTitleIcon": false, @@ -667,18 +553,16 @@ "fontWeight": 400 }, "showLegend": false, - "useDashboardTimewindow": true, "margin": "0", "widgetCss": "", "pageSize": 1024, "noDataDisplayMessage": "", "enableDataExport": false, - "displayTimewindow": true, "borderRadius": "4px", "actions": { "elementClick": [ { - "name": "Connectors", + "name": "connectors", "icon": "more_horiz", "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", @@ -692,7 +576,7 @@ "id": "ee7216d8-ad7a-20db-1abc-2531e221f24c" }, { - "name": "Logs", + "name": "logs", "icon": "more_horiz", "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", @@ -711,7 +595,7 @@ "row": 0, "col": 0, "id": "79f59106-758f-c428-8b93-4341faea705d", - "typeFullFqn": "system.cards.markdown_card" + "typeFullFqn": "system.gateway_widgets.markdown_card" }, "60dcf518-8fc3-3539-8ff8-ce94bda39f3a": { "type": "alarm", @@ -872,9 +756,6 @@ } ], "timewindow": { - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false, "hideAggregation": false, "hideAggInterval": false, "hideTimezone": false, @@ -1042,7 +923,6 @@ "fontSize": "16px", "fontWeight": 400 }, - "useDashboardTimewindow": true, "showLegend": false, "actions": {}, "datasources": [], @@ -1239,7 +1119,6 @@ "fontSize": "16px", "fontWeight": 400 }, - "useDashboardTimewindow": true, "showLegend": false, "actions": {}, "datasources": [], @@ -1550,7 +1429,6 @@ "fontSize": "16px", "fontWeight": 400 }, - "useDashboardTimewindow": true, "showLegend": false, "actions": {}, "datasources": [], @@ -1584,44 +1462,13 @@ "dataKeys": [] } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1685437116892, - "endTimeMs": 1685523516892 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "#fff", "color": "rgba(0, 0, 0, 0.87)", "padding": "8px", "settings": { "useMarkdownTextFunction": false, - "markdownTextPattern": "
\r\n \r\n
", + "markdownTextPattern": "
\r\n \r\n
", "applyDefaultMarkdownStyle": false, "markdownCss": ".action-buttons-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex-direction: row;\r\n height: 100%;\r\n width: 100%;\r\n align-content: center;\r\n}\r\n\r\nbutton {\r\n flex-grow: 1;\r\n margin: 10px;\r\n min-width: 150px;\r\n height: auto;\r\n line-height: 36px;\n}" }, @@ -1638,11 +1485,10 @@ "fontWeight": 400 }, "showLegend": false, - "useDashboardTimewindow": true, "actions": { "elementClick": [ { - "name": "Launch command", + "name": "launchCommand", "icon": "more_horiz", "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", @@ -1671,7 +1517,7 @@ "row": 0, "col": 0, "id": "fb9df382-6ef3-4aa6-bc13-8bf8e300ba19", - "typeFullFqn": "system.cards.markdown_card" + "typeFullFqn": "system.gateway_widgets.markdown_card" }, "61d149e8-b249-5526-e5d7-6ad58413982e": { "type": "latest", @@ -1704,37 +1550,6 @@ ] } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1685437116892, - "endTimeMs": 1685523516892 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "#fff", "color": "rgba(0, 0, 0, 0.87)", @@ -1742,7 +1557,7 @@ "settings": { "useMarkdownTextFunction": true, "markdownTextPattern": "# Markdown/HTML card \\n - **Current entity**: **${entityName}**. \\n - **Current value**: **${Random}**.", - "markdownTextFunction": "let buttonsHtml = \"\" \nctx.actionsApi.getActionDescriptors('elementClick').forEach((btn, index)=>{\n let disabled = false;\n if (index == 2) {\n disabled = data[0] && data[0].RemoteLoggingLevel ? data[0].RemoteLoggingLevel == \"NONE\" : true;\n } else if (index == 3) {\n const conf = data[0].general_configuration ? JSON.parse(data[0].general_configuration) : {};\n disabled = typeof conf.statistics?.enable === 'boolean' && !conf.statistics.enable;\n } else if (index == 4) {\n const conf = data[0].general_configuration ? JSON.parse(data[0].general_configuration) : {};\n disabled = !conf.remoteShell;\n }\n buttonsHtml += ``\n});\n\nreturn `
${buttonsHtml}
`;", + "markdownTextFunction": "const conf = data[0].general_configuration ? JSON.parse(data[0].general_configuration) : {};\nconst disabledLogsBtn = data[0] && data[0].RemoteLoggingLevel ? data[0].RemoteLoggingLevel == \"NONE\" : true;\nconst disabledStatisticsBtn = typeof conf.statistics?.enable === 'boolean' && !conf.statistics.enable;\nconst disabledRemoteShellBtn = !conf.remoteShell;\nreturn `
\n \n \n \n \n \n \n
`;\n", "applyDefaultMarkdownStyle": false, "markdownCss": ".action-buttons-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex-direction: row;\r\n height: 100%;\r\n width: 100%;\r\n align-content: start;\r\n}\r\n\r\nbutton {\r\n flex-grow: 1;\r\n margin: 10px;\r\n min-width: 150px;\r\n height: auto;\r\n line-height: 36px;\n}" }, @@ -1759,11 +1574,10 @@ "fontWeight": 400 }, "showLegend": false, - "useDashboardTimewindow": true, "actions": { "elementClick": [ { - "name": "General configuration", + "name": "generalConfiguration", "icon": "more_horiz", "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", @@ -1777,7 +1591,7 @@ "id": "337c767b-3217-d3d3-b955-7b0bd0858a1d" }, { - "name": "Connectors configuration", + "name": "connectorsConfiguration", "icon": "more_horiz", "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", @@ -1791,7 +1605,7 @@ "id": "00469ea7-f4c4-e39d-a735-c74b6ba6a026" }, { - "name": "Logs", + "name": "logs", "icon": "more_horiz", "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", @@ -1805,7 +1619,7 @@ "id": "d8607421-28b4-7c3b-949b-f69c3a46b461" }, { - "name": "Statistics", + "name": "statistics", "icon": "more_horiz", "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", @@ -1824,7 +1638,7 @@ "id": "425ba0d8-8e26-18a5-881d-bebe27fb2a7a" }, { - "name": "Remote Shell", + "name": "remoteShell", "icon": "more_horiz", "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", @@ -1838,7 +1652,7 @@ "id": "2c4c7dcc-009f-64eb-5f1b-a991df6d25a2" }, { - "name": "RPC", + "name": "rpc", "icon": "more_horiz", "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", @@ -1862,7 +1676,7 @@ "row": 0, "col": 0, "id": "61d149e8-b249-5526-e5d7-6ad58413982e", - "typeFullFqn": "system.cards.markdown_card" + "typeFullFqn": "system.gateway_widgets.markdown_card" }, "3d661190-7463-ba61-6793-503c85af67ec": { "type": "latest", @@ -1891,37 +1705,6 @@ } } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1686652103417, - "endTimeMs": 1686738503417 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "#fff", "color": "rgba(0, 0, 0, 0.87)", @@ -1946,8 +1729,6 @@ "fontWeight": 400 }, "showLegend": false, - "useDashboardTimewindow": true, - "displayTimewindow": true, "widgetCss": "", "pageSize": 1024, "noDataDisplayMessage": "", @@ -1957,44 +1738,13 @@ "row": 0, "col": 0, "id": "3d661190-7463-ba61-6793-503c85af67ec", - "typeFullFqn": "system.cards.markdown_card" + "typeFullFqn": "system.gateway_widgets.markdown_card" }, "1615bd4e-c0a4-c32c-3706-3c83214cb8d7": { "type": "latest", "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -2023,7 +1773,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -2103,7 +1852,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -2138,37 +1886,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -2197,7 +1914,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -2277,7 +1993,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -2312,37 +2027,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -2371,7 +2055,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -2451,7 +2134,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -2485,37 +2167,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -2544,7 +2195,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -2624,7 +2274,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -2658,37 +2307,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -2717,7 +2335,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -2797,7 +2414,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -2831,37 +2447,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -2890,7 +2475,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -2970,7 +2554,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -3004,37 +2587,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -3063,7 +2615,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -3143,7 +2694,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -3177,37 +2727,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -3236,7 +2755,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -3316,7 +2834,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -3350,37 +2867,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -3409,7 +2895,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -3489,7 +2974,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -3523,37 +3007,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -3582,7 +3035,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -3662,7 +3114,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -3696,37 +3147,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -3755,7 +3175,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -3835,7 +3254,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -3869,37 +3287,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -3928,7 +3315,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -4008,7 +3394,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -4042,37 +3427,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -4101,7 +3455,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -4181,7 +3534,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -4215,37 +3567,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -4274,7 +3595,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -4354,7 +3674,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -4388,37 +3707,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -4447,7 +3735,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -4527,7 +3814,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -4561,37 +3847,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -4620,7 +3875,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -4700,7 +3954,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -4734,37 +3987,6 @@ "sizeX": 7.5, "sizeY": 6.5, "config": { - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1684327643501, - "endTimeMs": 1684414043501 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 200 - } - }, "showTitle": true, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -4793,7 +4015,6 @@ "fontWeight": 400, "padding": "5px 10px 5px 10px" }, - "useDashboardTimewindow": false, "showLegend": false, "datasources": [ { @@ -4873,7 +4094,6 @@ } } ], - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "widgetStyle": {}, @@ -4903,7 +4123,7 @@ "typeFullFqn": "system.cards.entities_table" }, "b4194e1e-97af-ed0b-a6a4-70011c71c579": { - "typeFullFqn": "system.cards.markdown_card", + "typeFullFqn": "system.gateway_widgets.markdown_card", "type": "latest", "sizeX": 5, "sizeY": 3.5, @@ -4930,37 +4150,6 @@ } } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1732109250067, - "endTimeMs": 1732195650067 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "#fff", "color": "rgba(0, 0, 0, 0.87)", @@ -4968,7 +4157,7 @@ "settings": { "useMarkdownTextFunction": true, "markdownTextPattern": "let buttonsHtml = \"\" \nctx.actionsApi.getActionDescriptors('elementClick').forEach((btn, index)=>{\n let disabled = false;\n if (index == 2) {\n disabled = data[0] && data[0].RemoteLoggingLevel ? data[0].RemoteLoggingLevel == \"NONE\" : true;\n } else if (index == 4) {\n const conf = data[0].general_configuration ? JSON.parse(data[0].general_configuration) : {};\n disabled = !conf.remoteShell;\n }\n buttonsHtml += ``\n});\n\nreturn `
${buttonsHtml}
`;", - "markdownTextFunction": "const states = ['storage_statistics', 'machine_statistics', 'custom_statistics'];\nconst currentState = ctx.stateController.getStateId();\nlet buttonsHtml = \"\";\nlet disabled = false;\nconst buttonName = \nctx.actionsApi.getActionDescriptors('elementClick').forEach((btn, index)=>{\n if (states[index] === 'custom_statistics') {\n const conf = data[0].general_configuration ? JSON.parse(data[0].general_configuration) : {};\n disabled = !conf.statistics?.enableCustom;\n }\n buttonsHtml += ``\n});\n\nreturn `
${buttonsHtml}
`;", + "markdownTextFunction": "const currentState = ctx.stateController.getStateId();\nconst conf = data[0].general_configuration ? JSON.parse(data[0].general_configuration) : {};\nconst disabled = !conf.statistics?.enableCustom;\nreturn `
\n\n\n\n
`;", "applyDefaultMarkdownStyle": false, "markdownCss": ".action-buttons-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex-direction: row;\r\n height: 100%;\r\n width: 100%;\r\n align-content: start;\r\n}\r\n\r\nbutton {\r\n flex-grow: 1;\r\n margin: 10px;\r\n min-width: 150px;\r\n height: auto;\r\n line-height: 36px;\r\n}" }, @@ -4985,51 +4174,40 @@ "fontWeight": 400 }, "showLegend": false, - "useDashboardTimewindow": true, - "displayTimewindow": true, "actions": { "elementClick": [ { - "name": "Storage", + "name": "storage_statistics", "icon": "more_horiz", "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", - "type": "updateDashboardState", - "targetDashboardStateId": "storage_statistics", - "setEntityId": true, - "stateEntityParamName": null, - "openRightLayout": false, + "type": "custom", + "customFunction": "widgetContext.stateController.updateState('storage_statistics', widgetContext.stateController.getStateParams(), false);\nwidgetContext.$scope.markdownWidget.onDataUpdated();", "openInSeparateDialog": false, "openInPopover": false, - "id": "fc4c338d-5799-f7dc-9ecb-448e65f8045d" + "id": "56342fb4-e698-1db3-a8f1-34a3b44735c5" }, { - "name": "Machine", + "name": "machine_statistics", "icon": "more_horiz", "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", - "type": "updateDashboardState", - "targetDashboardStateId": "machine_statistics", - "setEntityId": true, - "stateEntityParamName": null, - "openRightLayout": false, + "type": "custom", + "customFunction": "widgetContext.stateController.updateState('machine_statistics', widgetContext.stateController.getStateParams(), false);\nwidgetContext.$scope.markdownWidget.onDataUpdated();", "openInSeparateDialog": false, "openInPopover": false, - "id": "b35fc758-b21a-f5d3-e968-3572f1bb9ad4" + "id": "dffa7e63-2382-12fa-ef1c-13e162b1acaf" }, { - "name": "Custom", + "name": "custom_statistics", "icon": "more_horiz", "useShowWidgetActionFunction": null, "showWidgetActionFunction": "return true;", - "type": "updateDashboardState", - "targetDashboardStateId": "custom_statistics", - "setEntityId": true, - "stateEntityParamName": null, - "openRightLayout": false, + "type": "custom", + "customFunction": "widgetContext.stateController.updateState('custom_statistics', widgetContext.stateController.getStateParams(), false);\nwidgetContext.$scope.markdownWidget.onDataUpdated();", "openInSeparateDialog": false, "openInPopover": false, - "id": "fcff099d-8164-08fd-7ffa-e1565772f368" + "id": "f6d267d0-3e3e-d519-bf7f-836fd59fd10f" } ] }, @@ -5045,7 +4223,7 @@ "id": "b4194e1e-97af-ed0b-a6a4-70011c71c579" }, "3a005e49-327c-beaa-8d19-c36b833001f0": { - "typeFullFqn": "system.cards.markdown_card", + "typeFullFqn": "system.gateway_widgets.markdown_card", "type": "latest", "sizeX": 5, "sizeY": 3.5, @@ -5057,37 +4235,6 @@ "dataKeys": [] } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1733234218432, - "endTimeMs": 1733320618432 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "#fff", "color": "rgba(0, 0, 0, 0.87)", @@ -5191,39 +4338,6 @@ ] } ], - "timewindow": { - "hideAggregation": false, - "hideAggInterval": false, - "hideTimezone": false, - "selectedTab": 0, - "realtime": { - "realtimeType": 0, - "interval": 300000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_MONTH_SO_FAR", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 300000, - "timewindowMs": 86400000, - "fixedTimewindow": { - "startTimeMs": 1733156328824, - "endTimeMs": 1733242728824 - }, - "quickInterval": "CURRENT_MONTH_SO_FAR", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 5000 - } - }, "showTitle": true, "backgroundColor": "rgba(0, 0, 0, 0)", "color": null, @@ -5347,24 +4461,7 @@ "pageSize": 1024, "noDataDisplayMessage": "", "useDashboardTimewindow": true, - "displayTimewindow": false, "decimals": 0, - "timewindowStyle": { - "showIcon": true, - "iconSize": "24px", - "icon": null, - "iconPosition": "left", - "font": { - "size": 12, - "sizeUnit": "px", - "family": "Roboto", - "weight": "400", - "style": "normal", - "lineHeight": "16px" - }, - "color": "rgba(0, 0, 0, 0.38)", - "displayTypePrefix": false - }, "titleColor": "rgba(0, 0, 0, 0.87)", "borderRadius": "5px", "enableDataExport": false @@ -5443,39 +4540,6 @@ ] } ], - "timewindow": { - "hideAggregation": false, - "hideAggInterval": false, - "hideTimezone": false, - "selectedTab": 0, - "realtime": { - "realtimeType": 0, - "interval": 300000, - "timewindowMs": 86400000, - "quickInterval": "CURRENT_MONTH_SO_FAR", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 2, - "interval": 7200000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1733156705839, - "endTimeMs": 1733243105839 - }, - "quickInterval": "CURRENT_MONTH_SO_FAR", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "NONE", - "limit": 5000 - } - }, "showTitle": true, "backgroundColor": "rgba(0, 0, 0, 0)", "color": null, @@ -5599,24 +4663,7 @@ "pageSize": 1024, "noDataDisplayMessage": "", "useDashboardTimewindow": true, - "displayTimewindow": false, "decimals": 0, - "timewindowStyle": { - "showIcon": true, - "iconSize": "24px", - "icon": null, - "iconPosition": "left", - "font": { - "size": 12, - "sizeUnit": "px", - "family": "Roboto", - "weight": "400", - "style": "normal", - "lineHeight": "16px" - }, - "color": "rgba(0, 0, 0, 0.38)", - "displayTypePrefix": false - }, "titleColor": "rgba(0, 0, 0, 0.87)", "borderRadius": "5px", "enableDataExport": false @@ -6811,37 +5858,6 @@ } } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1733240126084, - "endTimeMs": 1733326526084 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "rgb(255, 255, 255)", "color": "rgba(0, 0, 0, 0.87)", @@ -6852,8 +5868,6 @@ }, "title": "HTML Card", "dropShadow": true, - "useDashboardTimewindow": true, - "displayTimewindow": true, "enableFullscreen": false, "margin": "16px 16px 16px 0", "borderRadius": "5px", @@ -7451,7 +6465,7 @@ "id": "7543e668-35b7-bb97-2f14-163399f8d038" }, "7f3ebf9f-d967-44fe-fbe4-4667a2abcf88": { - "typeFullFqn": "system.cards.markdown_card", + "typeFullFqn": "system.gateway_widgets.markdown_card", "type": "latest", "sizeX": 5, "sizeY": 3.5, @@ -7512,37 +6526,6 @@ } } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1733155841882, - "endTimeMs": 1733242241882 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "#fff", "color": "rgba(0, 0, 0, 0.87)", @@ -7567,8 +6550,6 @@ "fontWeight": 400 }, "showLegend": false, - "useDashboardTimewindow": true, - "displayTimewindow": true, "borderRadius": "5px", "widgetCss": "", "pageSize": 1024, @@ -7580,7 +6561,7 @@ "id": "7f3ebf9f-d967-44fe-fbe4-4667a2abcf88" }, "ea75a492-d149-9a53-b45f-840a0ce42a40": { - "typeFullFqn": "system.cards.markdown_card", + "typeFullFqn": "system.gateway_widgets.markdown_card", "type": "latest", "sizeX": 5, "sizeY": 3.5, @@ -7655,37 +6636,6 @@ } } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1733155841882, - "endTimeMs": 1733242241882 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "#fff", "color": "rgba(0, 0, 0, 0.87)", @@ -7710,8 +6660,6 @@ "fontWeight": 400 }, "showLegend": false, - "useDashboardTimewindow": true, - "displayTimewindow": true, "borderRadius": "5px", "widgetCss": "", "pageSize": 1024, @@ -7723,7 +6671,7 @@ "id": "ea75a492-d149-9a53-b45f-840a0ce42a40" }, "13b57ab5-e5ed-701c-4c67-5bb1198e9a53": { - "typeFullFqn": "system.cards.markdown_card", + "typeFullFqn": "system.gateway_widgets.markdown_card", "type": "latest", "sizeX": 5, "sizeY": 3.5, @@ -7798,37 +6746,6 @@ } } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1733155841882, - "endTimeMs": 1733242241882 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "#fff", "color": "rgba(0, 0, 0, 0.87)", @@ -7853,8 +6770,6 @@ "fontWeight": 400 }, "showLegend": false, - "useDashboardTimewindow": true, - "displayTimewindow": true, "borderRadius": "5px", "widgetCss": "", "pageSize": 1024, @@ -7866,7 +6781,7 @@ "id": "13b57ab5-e5ed-701c-4c67-5bb1198e9a53" }, "867613d5-9440-fac1-9156-cd8773df5c97": { - "typeFullFqn": "system.cards.markdown_card", + "typeFullFqn": "system.gateway_widgets.markdown_card", "type": "latest", "sizeX": 5, "sizeY": 3.5, @@ -7878,37 +6793,6 @@ "dataKeys": [] } ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1733234218432, - "endTimeMs": 1733320618432 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, "showTitle": false, "backgroundColor": "#fff", "color": "rgba(0, 0, 0, 0.87)", @@ -7927,495 +6811,20 @@ "titleTooltip": "", "dropShadow": false, "enableFullscreen": false, - "widgetStyle": {}, - "titleStyle": { - "fontSize": "16px", - "fontWeight": 400 - }, - "showLegend": false, - "widgetCss": "", - "pageSize": 1024, - "noDataDisplayMessage": "", - "enableDataExport": false - }, - "row": 0, - "col": 0, - "id": "867613d5-9440-fac1-9156-cd8773df5c97" - }, - "56274c38-33fc-fe9d-aa39-ff3e1215276b": { - "typeFullFqn": "system.cards.markdown_card", - "type": "latest", - "sizeX": 5, - "sizeY": 3.5, - "config": { - "datasources": [ - { - "type": "entity", - "name": "", - "entityAliasId": "a2f01c66-96cf-49c5-303f-e6f21c559ee8", - "dataKeys": [ - { - "name": "general_configuration", - "type": "attribute", - "label": "general_configuration", - "color": "#2196f3", - "settings": {}, - "_hash": 0.5374662835906896 - } - ], - "alarmFilterConfig": { - "statusList": [ - "ACTIVE" - ] - } - } - ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1732109250067, - "endTimeMs": 1732195650067 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, - "showTitle": false, - "backgroundColor": "#fff", - "color": "rgba(0, 0, 0, 0.87)", - "padding": "8px", - "settings": { - "useMarkdownTextFunction": true, - "markdownTextPattern": "let buttonsHtml = \"\" \nctx.actionsApi.getActionDescriptors('elementClick').forEach((btn, index)=>{\n let disabled = false;\n if (index == 2) {\n disabled = data[0] && data[0].RemoteLoggingLevel ? data[0].RemoteLoggingLevel == \"NONE\" : true;\n } else if (index == 4) {\n const conf = data[0].general_configuration ? JSON.parse(data[0].general_configuration) : {};\n disabled = !conf.remoteShell;\n }\n buttonsHtml += ``\n});\n\nreturn `
${buttonsHtml}
`;", - "markdownTextFunction": "const states = ['storage_statistics', 'machine_statistics', 'custom_statistics'];\nconst currentState = ctx.stateController.getStateId();\nlet buttonsHtml = \"\";\nlet disabled = false;\nconst buttonName = \nctx.actionsApi.getActionDescriptors('elementClick').forEach((btn, index)=>{\n if (states[index] === 'custom_statistics') {\n const conf = data[0].general_configuration ? JSON.parse(data[0].general_configuration) : {};\n disabled = !conf.statistics?.enableCustom;\n }\n buttonsHtml += ``\n});\n\nreturn `
${buttonsHtml}
`;", - "applyDefaultMarkdownStyle": false, - "markdownCss": ".action-buttons-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex-direction: row;\r\n height: 100%;\r\n width: 100%;\r\n align-content: start;\r\n}\r\n\r\nbutton {\r\n flex-grow: 1;\r\n margin: 10px;\r\n min-width: 150px;\r\n height: auto;\r\n line-height: 36px;\r\n}" - }, - "title": "Markdown/HTML Card", - "showTitleIcon": false, - "iconColor": "rgba(0, 0, 0, 0.87)", - "iconSize": "24px", - "titleTooltip": "", - "dropShadow": true, - "enableFullscreen": false, - "widgetStyle": {}, - "titleStyle": { - "fontSize": "16px", - "fontWeight": 400 - }, - "showLegend": false, - "useDashboardTimewindow": true, - "displayTimewindow": true, - "actions": { - "elementClick": [ - { - "name": "Storage", - "icon": "more_horiz", - "useShowWidgetActionFunction": null, - "showWidgetActionFunction": "return true;", - "type": "updateDashboardState", - "targetDashboardStateId": "storage_statistics", - "setEntityId": true, - "stateEntityParamName": null, - "openRightLayout": false, - "openInSeparateDialog": false, - "openInPopover": false, - "id": "fc4c338d-5799-f7dc-9ecb-448e65f8045d" - }, - { - "name": "Machine", - "icon": "more_horiz", - "useShowWidgetActionFunction": null, - "showWidgetActionFunction": "return true;", - "type": "updateDashboardState", - "targetDashboardStateId": "machine_statistics", - "setEntityId": true, - "stateEntityParamName": null, - "openRightLayout": false, - "openInSeparateDialog": false, - "openInPopover": false, - "id": "b35fc758-b21a-f5d3-e968-3572f1bb9ad4" - }, - { - "name": "Custom", - "icon": "more_horiz", - "useShowWidgetActionFunction": null, - "showWidgetActionFunction": "return true;", - "type": "updateDashboardState", - "targetDashboardStateId": "custom_statistics", - "setEntityId": true, - "stateEntityParamName": null, - "openRightLayout": false, - "openInSeparateDialog": false, - "openInPopover": false, - "id": "10a5a4b6-71fb-f51c-2836-bb360938127f" - } - ] - }, - "borderRadius": "5px", - "widgetCss": "", - "pageSize": 1024, - "noDataDisplayMessage": "", - "margin": "16px 16px 0 0", - "enableDataExport": false - }, - "row": 0, - "col": 0, - "id": "56274c38-33fc-fe9d-aa39-ff3e1215276b" - }, - "38063fe5-1bd8-695b-a40b-92c1aed19831": { - "typeFullFqn": "system.gateway_widgets.gateway_status", - "type": "latest", - "sizeX": 7.5, - "sizeY": 3, - "config": { - "datasources": [ - { - "type": "entity", - "name": "function", - "entityAliasId": "a2f01c66-96cf-49c5-303f-e6f21c559ee8", - "dataKeys": [ - { - "name": "active", - "type": "attribute", - "label": "active", - "color": "#2196f3", - "settings": {}, - "_hash": 0.07932656697286933 - }, - { - "name": "lastDisconnectTime", - "type": "attribute", - "label": "lastDisconnectTime", - "color": "#4caf50", - "settings": {}, - "_hash": 0.06662431625551446 - }, - { - "name": "lastConnectTime", - "type": "attribute", - "label": "lastConnectTime", - "color": "#f44336", - "settings": {}, - "_hash": 0.28485659401606434 - } - ], - "alarmFilterConfig": { - "statusList": [ - "ACTIVE" - ] - } - } - ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1733240126084, - "endTimeMs": 1733326526084 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, - "showTitle": false, - "backgroundColor": "rgb(255, 255, 255)", - "color": "rgba(0, 0, 0, 0.87)", - "padding": "", - "settings": { - "cardHtml": "
HTML code here
", - "cardCss": ".card {\n font-weight: bold;\n font-size: 32px;\n color: #999;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}" - }, - "title": "HTML Card", - "dropShadow": true, - "useDashboardTimewindow": true, - "displayTimewindow": true, - "enableFullscreen": false, - "margin": "16px 16px 16px 0", - "borderRadius": "5px", - "widgetStyle": {}, - "widgetCss": "", - "pageSize": 1024, - "noDataDisplayMessage": "", - "enableDataExport": false - }, - "row": 0, - "col": 0, - "id": "38063fe5-1bd8-695b-a40b-92c1aed19831" - }, - "e48e7a66-a30e-2494-b0c0-dd3249944286": { - "typeFullFqn": "system.gateway_widgets.gateway_status", - "type": "latest", - "sizeX": 7.5, - "sizeY": 3, - "config": { - "datasources": [ - { - "type": "entity", - "name": "function", - "entityAliasId": "a2f01c66-96cf-49c5-303f-e6f21c559ee8", - "dataKeys": [ - { - "name": "active", - "type": "attribute", - "label": "active", - "color": "#2196f3", - "settings": {}, - "_hash": 0.07932656697286933 - }, - { - "name": "lastDisconnectTime", - "type": "attribute", - "label": "lastDisconnectTime", - "color": "#4caf50", - "settings": {}, - "_hash": 0.06662431625551446 - }, - { - "name": "lastConnectTime", - "type": "attribute", - "label": "lastConnectTime", - "color": "#f44336", - "settings": {}, - "_hash": 0.28485659401606434 - } - ], - "alarmFilterConfig": { - "statusList": [ - "ACTIVE" - ] - } - } - ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1733240126084, - "endTimeMs": 1733326526084 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, - "showTitle": false, - "backgroundColor": "rgb(255, 255, 255)", - "color": "rgba(0, 0, 0, 0.87)", - "padding": "", - "settings": { - "cardHtml": "
HTML code here
", - "cardCss": ".card {\n font-weight: bold;\n font-size: 32px;\n color: #999;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}" - }, - "title": "HTML Card", - "dropShadow": true, - "useDashboardTimewindow": true, - "displayTimewindow": true, - "enableFullscreen": false, - "margin": "16px 16px 16px 0", - "borderRadius": "5px", - "widgetStyle": {}, - "widgetCss": "", - "pageSize": 1024, - "noDataDisplayMessage": "", - "enableDataExport": false - }, - "row": 0, - "col": 0, - "id": "e48e7a66-a30e-2494-b0c0-dd3249944286" - }, - "3a1f2fe6-7da9-15aa-777d-383e0ac01520": { - "typeFullFqn": "system.cards.markdown_card", - "type": "latest", - "sizeX": 5, - "sizeY": 3.5, - "config": { - "datasources": [ - { - "type": "entity", - "name": "", - "entityAliasId": "a2f01c66-96cf-49c5-303f-e6f21c559ee8", - "dataKeys": [], - "alarmFilterConfig": { - "statusList": [ - "ACTIVE" - ] - } - } - ], - "timewindow": { - "displayValue": "", - "selectedTab": 0, - "realtime": { - "realtimeType": 1, - "interval": 1000, - "timewindowMs": 60000, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideQuickInterval": false - }, - "history": { - "historyType": 0, - "interval": 1000, - "timewindowMs": 60000, - "fixedTimewindow": { - "startTimeMs": 1732109250067, - "endTimeMs": 1732195650067 - }, - "quickInterval": "CURRENT_DAY", - "hideInterval": false, - "hideLastInterval": false, - "hideFixedInterval": false, - "hideQuickInterval": false - }, - "aggregation": { - "type": "AVG", - "limit": 25000 - } - }, - "showTitle": false, - "backgroundColor": "#fff", - "color": "rgba(0, 0, 0, 0.87)", - "padding": "8px", - "settings": { - "useMarkdownTextFunction": true, - "markdownTextPattern": "let buttonsHtml = \"\" \nctx.actionsApi.getActionDescriptors('elementClick').forEach((btn, index)=>{\n let disabled = false;\n if (index == 2) {\n disabled = data[0] && data[0].RemoteLoggingLevel ? data[0].RemoteLoggingLevel == \"NONE\" : true;\n } else if (index == 4) {\n const conf = data[0].general_configuration ? JSON.parse(data[0].general_configuration) : {};\n disabled = !conf.remoteShell;\n }\n buttonsHtml += ``\n});\n\nreturn `
${buttonsHtml}
`;", - "markdownTextFunction": "const states = ['storage_statistics', 'machine_statistics', 'custom_statistics'];\nconst currentState = ctx.stateController.getStateId();\nlet buttonsHtml = \"\";\nconst buttonName = \nctx.actionsApi.getActionDescriptors('elementClick').forEach((btn, index)=>{\n buttonsHtml += ``\n});\n\nreturn `
${buttonsHtml}
`;", - "applyDefaultMarkdownStyle": false, - "markdownCss": ".action-buttons-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex-direction: row;\r\n height: 100%;\r\n width: 100%;\r\n align-content: start;\r\n}\r\n\r\nbutton {\r\n flex-grow: 1;\r\n margin: 10px;\r\n min-width: 150px;\r\n height: auto;\r\n line-height: 36px;\r\n}" - }, - "title": "Markdown/HTML Card", - "showTitleIcon": false, - "iconColor": "rgba(0, 0, 0, 0.87)", - "iconSize": "24px", - "titleTooltip": "", - "dropShadow": true, - "enableFullscreen": false, - "widgetStyle": {}, - "titleStyle": { - "fontSize": "16px", - "fontWeight": 400 - }, - "showLegend": false, - "useDashboardTimewindow": true, - "displayTimewindow": true, - "actions": { - "elementClick": [ - { - "name": "Storage", - "icon": "more_horiz", - "useShowWidgetActionFunction": null, - "showWidgetActionFunction": "return true;", - "type": "updateDashboardState", - "targetDashboardStateId": "storage_statistics", - "setEntityId": true, - "stateEntityParamName": null, - "openRightLayout": false, - "openInSeparateDialog": false, - "openInPopover": false, - "id": "fc4c338d-5799-f7dc-9ecb-448e65f8045d" - }, - { - "name": "Machine", - "icon": "more_horiz", - "useShowWidgetActionFunction": null, - "showWidgetActionFunction": "return true;", - "type": "updateDashboardState", - "targetDashboardStateId": "machine_statistics", - "setEntityId": true, - "stateEntityParamName": null, - "openRightLayout": false, - "openInSeparateDialog": false, - "openInPopover": false, - "id": "b35fc758-b21a-f5d3-e968-3572f1bb9ad4" - }, - { - "name": "Custom", - "icon": "more_horiz", - "useShowWidgetActionFunction": null, - "showWidgetActionFunction": "return true;", - "type": "updateDashboardState", - "targetDashboardStateId": "custom_statistics", - "setEntityId": true, - "stateEntityParamName": null, - "openRightLayout": false, - "openInSeparateDialog": false, - "openInPopover": false, - "id": "fcff099d-8164-08fd-7ffa-e1565772f368" - } - ] + "widgetStyle": {}, + "titleStyle": { + "fontSize": "16px", + "fontWeight": 400 }, - "borderRadius": "5px", + "showLegend": false, "widgetCss": "", "pageSize": 1024, "noDataDisplayMessage": "", - "margin": "16px 16px 0 0", "enableDataExport": false }, "row": 0, "col": 0, - "id": "3a1f2fe6-7da9-15aa-777d-383e0ac01520" + "id": "867613d5-9440-fac1-9156-cd8773df5c97" }, "7a34986a-ec7f-4c64-84f9-338cf1626722": { "typeFullFqn": "system.gateway_widgets.gateway_custom_statistics", @@ -8436,11 +6845,6 @@ } } ], - "timewindow": { - "realtime": { - "timewindowMs": 60000 - } - }, "showTitle": false, "backgroundColor": "#fff", "color": "rgba(0, 0, 0, 0.87)", @@ -8485,7 +6889,6 @@ }, "mobileHeight": null, "useDashboardTimewindow": true, - "displayTimewindow": true, "showTitleIcon": false, "titleTooltip": "", "margin": "16px", @@ -8499,6 +6902,146 @@ "row": 0, "col": 0, "id": "7a34986a-ec7f-4c64-84f9-338cf1626722" + }, + "699b8980-7180-3600-ec29-6af50325a2e1": { + "type": "latest", + "sizeX": 7.5, + "sizeY": 6.5, + "config": { + "showTitle": true, + "backgroundColor": "rgb(255, 255, 255)", + "color": "rgba(0, 0, 0, 0.87)", + "padding": "4px", + "settings": { + "entitiesTitle": "Devices", + "enableSearch": true, + "enableSelectColumnDisplay": true, + "enableStickyHeader": true, + "enableStickyAction": true, + "reserveSpaceForHiddenAction": "true", + "displayEntityName": true, + "entityNameColumnTitle": "Device Name", + "displayEntityLabel": false, + "displayEntityType": false, + "displayPagination": true, + "defaultPageSize": 10, + "defaultSortOrder": "entityName", + "useRowStyleFunction": false + }, + "title": "Devices", + "dropShadow": true, + "enableFullscreen": true, + "titleStyle": { + "fontSize": "16px", + "fontWeight": 400, + "padding": "5px 10px 5px 10px" + }, + "showLegend": false, + "datasources": [ + { + "type": "entity", + "name": null, + "entityAliasId": "a75d9031-ba51-8da4-81be-de65061b72f4", + "filterId": "774c2598-a4fe-e813-87aa-bf00b78043a3", + "dataKeys": [ + { + "name": "type", + "type": "entityField", + "label": "Device Type", + "color": "#2196f3", + "settings": {}, + "_hash": 0.3129929097366162, + "aggregationType": null, + "units": null, + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "active", + "type": "attribute", + "label": "Status", + "color": "#4caf50", + "settings": { + "columnWidth": "0px", + "useCellStyleFunction": false, + "useCellContentFunction": true, + "cellContentFunction": "let cssClass;\r\nswitch (value) {\r\n case \"Active\":\r\n cssClass = \"status status-active\";\r\n break;\r\n case \"Inactive\":\r\n default:\r\n cssClass = \"status status-inactive\";\r\n break;\r\n }\r\n \r\n return `${value}`;", + "defaultColumnVisibility": "visible", + "columnSelectionToDisplay": "enabled" + }, + "_hash": 0.5969880627410065, + "aggregationType": null, + "units": null, + "decimals": null, + "funcBody": null, + "usePostProcessing": true, + "postFuncBody": "return value == 'true' ? \"Active\": \"Inactive\";" + }, + { + "name": "connectorName", + "type": "attribute", + "label": "Connector Name", + "color": "#f44336", + "settings": {}, + "_hash": 0.012483045440007778, + "aggregationType": null, + "units": null, + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + }, + { + "name": "connectorType", + "type": "attribute", + "label": "Connector Type", + "color": "#ffc107", + "settings": {}, + "_hash": 0.6004192233378134, + "aggregationType": null, + "units": null, + "decimals": null, + "funcBody": null, + "usePostProcessing": null, + "postFuncBody": null + } + ], + "alarmFilterConfig": { + "statusList": [ + "ACTIVE" + ] + } + } + ], + "showTitleIcon": false, + "titleTooltip": "", + "widgetStyle": {}, + "widgetCss": ".status {\r\n border-radius: 20px;\r\n font-weight: 500;\r\n padding: 5px 15px;\r\n }\r\n\r\n .status-active {\r\n color: green;\r\n background: rgba(0, 128, 0, 0.1);\r\n }\r\n\r\n .status-inactive {\r\n color: red;\r\n background: rgba(255, 0, 0, 0.1);\r\n }\r\n", + "pageSize": 1024, + "noDataDisplayMessage": "", + "enableDataExport": false, + "actions": { + "actionCellButton": [ + { + "name": "Show Device Info", + "icon": "info", + "useShowWidgetActionFunction": null, + "showWidgetActionFunction": "return true;", + "type": "custom", + "customFunction": "const url = `${window.location.origin + widgetContext.utils.getEntityDetailsPageURL(entityId.id, entityId.entityType)}`;\nwindow.open(url, '_blank');", + "openInSeparateDialog": false, + "openInPopover": false, + "id": "89e0155f-c2c5-8d17-324c-280f8e11ffab" + } + ] + } + }, + "row": 0, + "col": 0, + "id": "699b8980-7180-3600-ec29-6af50325a2e1", + "typeFullFqn": "system.cards.entities_table" } }, "states": { @@ -8886,7 +7429,7 @@ "mobileOrder": 2, "mobileHeight": null }, - "56274c38-33fc-fe9d-aa39-ff3e1215276b": { + "b4194e1e-97af-ed0b-a6a4-70011c71c579": { "sizeX": 5, "sizeY": 12, "resizable": true, @@ -8895,7 +7438,7 @@ "mobileOrder": 1, "mobileHeight": 3 }, - "38063fe5-1bd8-695b-a40b-92c1aed19831": { + "bc199c75-00da-ca8a-dd0d-16da97a9fa53": { "sizeX": 5, "sizeY": 2, "row": 12, @@ -9521,31 +8064,40 @@ } } }, + "gateway_devices_knx": { + "name": "gateway_devices_knx", + "root": false, + "layouts": { + "main": { + "widgets": { + "699b8980-7180-3600-ec29-6af50325a2e1": { + "sizeX": 24, + "sizeY": 11, + "row": 0, + "col": 0 + } + }, + "gridSettings": { + "backgroundColor": "#eeeeee", + "columns": 24, + "margin": 0, + "outerMargin": true, + "backgroundSizeMode": "100%", + "autoFillHeight": false, + "backgroundImageUrl": null, + "mobileAutoFillHeight": false, + "mobileRowHeight": 70, + "layoutType": "default" + } + } + } + }, "custom_statistics": { "name": "Custom statistics", "root": false, "layouts": { "main": { "widgets": { - "e48e7a66-a30e-2494-b0c0-dd3249944286": { - "sizeX": 4, - "sizeY": 2, - "preserveAspectRatio": false, - "resizable": true, - "row": 12, - "col": 20, - "mobileOrder": 3, - "mobileHeight": 2 - }, - "3a1f2fe6-7da9-15aa-777d-383e0ac01520": { - "sizeX": 4, - "sizeY": 12, - "resizable": true, - "row": 0, - "col": 20, - "mobileOrder": 1, - "mobileHeight": 3 - }, "7a34986a-ec7f-4c64-84f9-338cf1626722": { "sizeX": 20, "sizeY": 14, @@ -9554,6 +8106,21 @@ "col": 0, "resizable": true, "mobileOrder": 2 + }, + "b4194e1e-97af-ed0b-a6a4-70011c71c579": { + "sizeX": 4, + "sizeY": 12, + "resizable": true, + "row": 0, + "col": 20 + }, + "bc199c75-00da-ca8a-dd0d-16da97a9fa53": { + "sizeX": 4, + "sizeY": 2, + "preserveAspectRatio": false, + "resizable": true, + "row": 12, + "col": 20 } }, "gridSettings": { @@ -9573,6 +8140,32 @@ } } } + }, + "gateway_status": { + "name": "gateway_status", + "root": false, + "layouts": { + "main": { + "widgets": { + "bc199c75-00da-ca8a-dd0d-16da97a9fa53": { + "sizeX": 5, + "sizeY": 3, + "preserveAspectRatio": false, + "resizable": true, + "row": 0, + "col": 0 + } + }, + "gridSettings": { + "layoutType": "default", + "backgroundColor": "#eeeeee", + "columns": 24, + "margin": 10, + "outerMargin": true, + "backgroundSizeMode": "100%" + } + } + } } }, "entityAliases": { @@ -9992,6 +8585,39 @@ ], "editable": true }, + "774c2598-a4fe-e813-87aa-bf00b78043a3": { + "id": "774c2598-a4fe-e813-87aa-bf00b78043a3", + "filter": "gateway_devices_knx", + "keyFilters": [ + { + "key": { + "type": "ATTRIBUTE", + "key": "connectorType" + }, + "valueType": "STRING", + "predicates": [ + { + "keyFilterPredicate": { + "operation": "EQUAL", + "value": { + "defaultValue": "knx", + "dynamicValue": null + }, + "ignoreCase": false, + "type": "STRING" + }, + "userInfo": { + "editable": true, + "label": "", + "autogeneratedLabel": true, + "order": 0 + } + } + ] + } + ], + "editable": true + }, "92a7d208-c143-ea20-5162-1da584532830": { "id": "92a7d208-c143-ea20-5162-1da584532830", "filter": "gateway_devices_bacnet", From 294c7ff661836a2e8c37e71713eacf59fe6c9171 Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Mon, 19 Jan 2026 11:09:42 +0200 Subject: [PATCH 200/579] fixed tests --- .../dao/service/CalculatedFieldServiceTest.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/CalculatedFieldServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/CalculatedFieldServiceTest.java index 97e06ed879..ba914c6d35 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/CalculatedFieldServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/CalculatedFieldServiceTest.java @@ -17,11 +17,13 @@ package org.thingsboard.server.dao.service; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.thingsboard.server.common.data.AttributeScope; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.cf.CalculatedField; import org.thingsboard.server.common.data.cf.CalculatedFieldType; import org.thingsboard.server.common.data.cf.configuration.Argument; import org.thingsboard.server.common.data.cf.configuration.ArgumentType; +import org.thingsboard.server.common.data.cf.configuration.AttributesOutput; import org.thingsboard.server.common.data.cf.configuration.CalculatedFieldConfiguration; import org.thingsboard.server.common.data.cf.configuration.ReferencedEntityKey; import org.thingsboard.server.common.data.cf.configuration.RelationPathQueryDynamicSourceConfiguration; @@ -36,8 +38,8 @@ import org.thingsboard.server.common.data.relation.EntitySearchDirection; import org.thingsboard.server.common.data.relation.RelationPathLevel; import org.thingsboard.server.dao.cf.CalculatedFieldService; import org.thingsboard.server.dao.device.DeviceService; -import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.dao.tenant.TbTenantProfileCache; +import org.thingsboard.server.exception.DataValidationException; import java.util.ArrayList; import java.util.List; @@ -103,6 +105,10 @@ public class CalculatedFieldServiceTest extends AbstractServiceTest { zoneGroupConfiguration.setRefDynamicSourceConfiguration(dynamicSourceConfiguration); cfg.setZoneGroups(Map.of("allowed", zoneGroupConfiguration)); + AttributesOutput out = new AttributesOutput(); + out.setScope(AttributeScope.SERVER_SCOPE); + cfg.setOutput(out); + // Get tenant profile min. int min = tbTenantProfileCache.get(tenantId) .getDefaultProfileConfiguration() @@ -157,6 +163,10 @@ public class CalculatedFieldServiceTest extends AbstractServiceTest { zoneGroupConfiguration.setRefDynamicSourceConfiguration(dynamicSourceConfiguration); cfg.setZoneGroups(Map.of("allowed", zoneGroupConfiguration)); + AttributesOutput out = new AttributesOutput(); + out.setScope(AttributeScope.SERVER_SCOPE); + cfg.setOutput(out); + // Create & save Calculated Field CalculatedField cf = new CalculatedField(); cf.setTenantId(tenantId); @@ -191,6 +201,10 @@ public class CalculatedFieldServiceTest extends AbstractServiceTest { zoneGroupConfiguration.setRefDynamicSourceConfiguration(dynamicSourceConfiguration); cfg.setZoneGroups(Map.of("allowed", zoneGroupConfiguration)); + AttributesOutput out = new AttributesOutput(); + out.setScope(AttributeScope.SERVER_SCOPE); + cfg.setOutput(out); + // Get tenant profile min. int min = tbTenantProfileCache.get(tenantId) .getDefaultProfileConfiguration() From 793bf085490daa0d2a44065b41a2144b188f79ed Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Mon, 19 Jan 2026 11:22:09 +0200 Subject: [PATCH 201/579] UI: update branch --- application/src/main/resources/thingsboard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 5b6b3bed23..63aae7382d 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1330,7 +1330,7 @@ transport: # URL of gateways dashboard repository repository_url: "${TB_GATEWAY_DASHBOARD_SYNC_REPOSITORY_URL:https://github.com/thingsboard/gateway-management-extensions-dist.git}" # Branch of gateways dashboard repository to work with - branch: "${TB_GATEWAY_DASHBOARD_SYNC_BRANCH:release/4.2}" + branch: "${TB_GATEWAY_DASHBOARD_SYNC_BRANCH:release/4.2.0}" # Fetch frequency in hours for gateways dashboard repository fetch_frequency: "${TB_GATEWAY_DASHBOARD_SYNC_FETCH_FREQUENCY:24}" From b71333e2cc13524a8386c56d43f3ee26eee11b37 Mon Sep 17 00:00:00 2001 From: ArtemDzhereleiko Date: Mon, 19 Jan 2026 11:38:17 +0200 Subject: [PATCH 202/579] UI: Gateway release 4.3.0 --- application/src/main/resources/thingsboard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 63aae7382d..072e18af69 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1330,7 +1330,7 @@ transport: # URL of gateways dashboard repository repository_url: "${TB_GATEWAY_DASHBOARD_SYNC_REPOSITORY_URL:https://github.com/thingsboard/gateway-management-extensions-dist.git}" # Branch of gateways dashboard repository to work with - branch: "${TB_GATEWAY_DASHBOARD_SYNC_BRANCH:release/4.2.0}" + branch: "${TB_GATEWAY_DASHBOARD_SYNC_BRANCH:release/4.3.0}" # Fetch frequency in hours for gateways dashboard repository fetch_frequency: "${TB_GATEWAY_DASHBOARD_SYNC_FETCH_FREQUENCY:24}" From 760250f4391d529149977af1e9b9246adb4e6295 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Mon, 19 Jan 2026 12:01:36 +0200 Subject: [PATCH 203/579] UI: Fixed types build --- ui-ngx/src/app/shared/models/calculated-field.models.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/shared/models/calculated-field.models.ts b/ui-ngx/src/app/shared/models/calculated-field.models.ts index 9257d12100..201d23f7d0 100644 --- a/ui-ngx/src/app/shared/models/calculated-field.models.ts +++ b/ui-ngx/src/app/shared/models/calculated-field.models.ts @@ -91,7 +91,7 @@ export enum CalculatedFieldType { ALARM = 'ALARM', } -interface CalculatedFieldTypeTranslate { +export interface CalculatedFieldTypeTranslate { name: string; hint?: string; } From 73c822ea56ca58712997ae320bcfe6f211c39f2f Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Mon, 19 Jan 2026 17:19:03 +0200 Subject: [PATCH 204/579] UI: Added local hi_IN and updated locales da_DK, de_DE, fr_FR, it_IT, ja_JP, nl_NL, tr_TR --- .../assets/locale/locale.constant-da_DK.json | 712 +- .../assets/locale/locale.constant-de_DE.json | 731 +- .../assets/locale/locale.constant-en_US.json | 1 + .../assets/locale/locale.constant-fr_FR.json | 715 +- .../assets/locale/locale.constant-hi_IN.json | 9547 +++++++++++++ .../assets/locale/locale.constant-it_IT.json | 721 +- .../assets/locale/locale.constant-ja_JP.json | 11699 ++++++++++++++-- .../assets/locale/locale.constant-nl_NL.json | 719 +- .../assets/locale/locale.constant-tr_TR.json | 886 +- 9 files changed, 23915 insertions(+), 1816 deletions(-) create mode 100644 ui-ngx/src/assets/locale/locale.constant-hi_IN.json 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 c0554d1cca..69ab79f43b 100644 --- a/ui-ngx/src/assets/locale/locale.constant-da_DK.json +++ b/ui-ngx/src/assets/locale/locale.constant-da_DK.json @@ -78,6 +78,7 @@ "show-more": "Vis mere", "dont-show-again": "Vis ikke igen", "see-documentation": "Se dokumentation", + "see-debug-events": "Se debug-hændelser", "clear": "Ryd", "upload": "Upload", "delete-anyway": "Slet alligevel", @@ -485,6 +486,7 @@ "2fa": { "2fa": "To-faktor autentificering", "available-providers": "Tilgængelige udbydere", + "available-providers-required": "Mindst én 2FA-udbyder skal være konfigureret.", "issuer-name": "Udsteders navn", "issuer-name-required": "Udsteders navn er påkrævet.", "max-verification-failures-before-user-lockout": "Maks. antal verificeringsfejl før kontolåsning", @@ -513,7 +515,9 @@ "verification-message-template-required": "Skabelon for verificeringsbesked er påkrævet.", "within-time": "Inden for tid (sek)", "within-time-pattern": "Tiden skal være et positivt heltal.", - "within-time-required": "Tid er påkrævet." + "within-time-required": "Tid er påkrævet.", + "force-2fa": "Gennemtving tofaktorgodkendelse", + "enforce-for": "Gennemtving for" }, "jwt": { "security-settings": "JWT sikkerhedsindstillinger", @@ -545,16 +549,11 @@ "slack-settings": "Slack-indstillinger", "mobile-settings": "Mobilindstillinger", "firebase-service-account-file": "Firebase servicekonto-legitimationsoplysninger JSON-fil", - "select-firebase-service-account-file": "Træk og slip din Firebase servicekonto-legitimationsfil eller ", - "trendz": "Trendz", - "trendz-settings": "Trendz-indstillinger", - "trendz-url": "Trendz URL", - "trendz-url-required": "Trendz URL er påkrævet", - "trendz-api-key": "Trendz API-nøgle", - "trendz-enable": "Aktivér Trendz" + "select-firebase-service-account-file": "Træk og slip din Firebase servicekonto-legitimationsfil eller " }, "alarm": { "alarm": "Alarm", + "alarm-list": "Alarmliste", "alarms": "Alarmer", "all-alarms": "Alle alarmer", "select-alarm": "Vælg alarm", @@ -655,7 +654,16 @@ "alarm-type": "Alarmtype", "enter-alarm-type": "Indtast alarmtype", "no-alarm-types-matching": "Ingen alarmtyper matcher '{{entitySubtype}}'.", - "alarm-type-list-empty": "Ingen alarmtyper valgt." + "alarm-type-list-empty": "Ingen alarmtyper valgt.", + "system-comments": { + "acked-by-user": "Alarmen blev kvitteret af bruger {{userName}}", + "cleared-by-user": "Alarmen blev ryddet af bruger {{userName}}", + "assigned-to-user": "Alarmen blev tildelt af bruger {{userName}} til bruger {{assigneeName}}", + "unassigned-to-user": "Alarmens tildeling blev fjernet af bruger {{userName}}", + "unassigned-from-deleted-user": "Alarmens tildeling blev fjernet, fordi bruger {{userName}} - blev slettet", + "comment-deleted": "Bruger {{userName}} slettede sin kommentar", + "severity-changed": "Alarmens alvorlighed blev opdateret fra {{oldSeverity}} til {{newSeverity}}" + } }, "alarm-activity": { "add": "Tilføj en kommentar...", @@ -760,6 +768,7 @@ "name-max-length": "Navn skal være mindre end 256 tegn", "label-max-length": "Etiket skal være mindre end 256 tegn", "description": "Beskrivelse", + "description-required": "Beskrivelse er påkrævet.", "type": "Type", "type-required": "Type er påkrævet.", "details": "Detaljer", @@ -873,6 +882,9 @@ "alarms-created-monthly-activity": "Månedlig aktivitet for oprettede alarmer", "data-points": "Datapunkter", "data-points-storage-days": "Opbevaringsdage for datapunkter", + "data-points-storage-days-hourly-activity": "Datalagringsdage for datapunkter – timeaktivitet", + "data-points-storage-days-daily-activity": "Datalagringsdage for datapunkter – dagsaktivitet", + "data-points-storage-days-monthly-activity": "Datalagringsdage for datapunkter – månedsaktivitet", "device-api": "Enheds-API", "email": "E-mail", "email-messages": "E-mail-beskeder", @@ -906,6 +918,7 @@ "rule-node": "Rule Node", "sms": "SMS", "sms-messages": "SMS-beskeder", + "sms-messages-hourly-activity": "SMS-beskeder – timeaktivitet", "sms-messages-daily-activity": "Daglig aktivitet for SMS-beskeder", "sms-messages-monthly-activity": "Månedlig aktivitet for SMS-beskeder", "successful": "${entityName} succesfuld", @@ -915,13 +928,40 @@ "telemetry-persistence-hourly-activity": "Timebaseret aktivitet for telemetri-persistens", "telemetry-persistence-monthly-activity": "Månedlig aktivitet for telemetri-persistens", "transport": "Transport", - "transport-daily-activity": "Daglig transportaktivitet", - "transport-data-points": "Transport-datapunkter", - "transport-hourly-activity": "Timebaseret transportaktivitet", - "transport-messages": "Transportbeskeder", - "transport-monthly-activity": "Månedlig transportaktivitet", + "transport-msg-hourly-activity": "Transportbeskeder – timeaktivitet", + "transport-msg-daily-activity": "Transportbeskeder – dagsaktivitet", + "transport-msg-monthly-activity": "Transportbeskeder – månedsaktivitet", + "transport-daily-activity": "Transport – dagsaktivitet", + "transport-data-points": "Transportdatapunkter", + "transport-data-points-hourly-activity": "Transportdatapunkter – timeaktivitet", + "transport-data-points-daily-activity": "Transportdatapunkter – dagsaktivitet", + "transport-data-points-monthly-activity": "Transportdatapunkter – månedsaktivitet", "view-details": "Vis detaljer", - "view-statistics": "Vis statistik" + "view-statistics": "Vis statistik", + "transport-messages": "Transportbeskeder", + "transport-messages-hourly-activity": "Transportbeskeder – timeaktivitet", + "transport-data-point-hourly-activity": "Transportdatapunkt – timeaktivitet", + "javascript-function-executions": "JavaScript-funktionsudførsler", + "javascript-function-executions-hourly-activity": "JavaScript-funktionsudførsler – timeaktivitet", + "javascript-function-executions-daily-activity": "JavaScript-funktionsudførsler – dagsaktivitet", + "javascript-function-executions-monthly-activity": "JavaScript-funktionsudførsler – månedsaktivitet", + "tbel-function-executions": "TBEL-funktionsudførsler", + "tbel-function-executions-hourly-activity": "TBEL-funktionsudførsler – timeaktivitet", + "tbel-function-executions-daily-activity": "TBEL-funktionsudførsler – dagsaktivitet", + "tbel-function-executions-monthly-activity": "TBEL-funktionsudførsler – månedsaktivitet", + "created-reports": "Oprettede rapporter", + "created-reports-hourly-activity": "Oprettede rapporter – timeaktivitet", + "created-reports-daily-activity": "Oprettede rapporter – dagsaktivitet", + "created-reports-monthly-activity": "Oprettede rapporter – månedsaktivitet", + "emails": "Emails", + "emails-hourly-activity": "Emails – timeaktivitet", + "emails-daily-activity": "Emails – dagsaktivitet", + "emails-monthly-activity": "Emails – månedsaktivitet", + "status": { + "enabled": "Aktiveret", + "disabled": "Deaktiveret", + "warning": "Advarsel" + } }, "api-limit": { "cassandra-write-queries-core": "REST API Cassandra-skriveforespørgsler", @@ -946,6 +986,40 @@ "edge-uplink-messages": "Edge-oplinkbeskeder", "edge-uplink-messages-per-edge": "Edge-oplinkbeskeder pr. edge" }, + "api-key": { + "api-key": "API-nøgle", + "api-keys": "API-nøgler", + "delete-api-key-title": "Er du sikker på, at du vil slette API-nøglen '{{name}}'?", + "delete-api-key-text": "Vær forsigtig, efter bekræftelsen kan nøglen ikke gendannes.", + "delete-api-keys-title": "Er du sikker på, at du vil slette { count, plural, =1 {1 API-nøgle} other {# API-nøgler} }?", + "delete-api-keys-text": "Vær forsigtig, efter bekræftelsen kan alle valgte nøgler ikke gendannes.", + "expiration-date": "Udløbsdato", + "date": "Dato", + "description": "Beskrivelse", + "disable": "Deaktiver", + "edit-description": "Rediger beskrivelse", + "enable": "Aktivér API-nøgle ", + "expiration-time": "Udløbstid", + "expiration-time-never": "Aldrig", + "expiration-time-custom": "Tilpasset", + "generate": "Generér", + "generate-title": "Generér API-nøgle", + "generate-text": "Bemærk: API-nøglen arver tilladelserne fra den bruger, den oprettes til.", + "generated-api-key-title": "API-nøgle genereret. Lad os tjekke forbindelsen!", + "generated-api-key-copy": "Sørg for at kopiere og gemme din API-nøgle nu, da du ikke kan se den igen.", + "generated-api-key-command": "Brug følgende instruktioner til at tjekke forbindelsen. Som resultat bør du modtage oplysninger om den aktuelle bruger:", + "generated-api-key-insecure-url": "Hvis du udfører kommandoer over en usikker HTTP-forbindelse, sendes din API-nøgle ukrypteret, hvilket gør den sårbar over for opsnapning.", + "list": "{ count, plural, =1 {Én API-nøgle} other {Liste over # API-nøgler} }", + "manage": "Administrér", + "manage-api-keys": "Administrér API-nøgler", + "no-found": "Ingen API-nøgler fundet", + "selected-api-keys": "{ count, plural, =1 {1 API-nøgle} other {# API-nøgler} } valgt", + "search": "Søg efter API-nøgler", + "status": "Status", + "status-active": "Aktiv", + "status-inactive": "Inaktiv", + "status-expired": "Udløbet" + }, "audit-log": { "audit": "Revision", "audit-logs": "Revisionslogge", @@ -999,7 +1073,11 @@ "type-provision-failure": "Klargøring af device mislykkedes", "type-timeseries-updated": "Telemetri opdateret", "type-timeseries-deleted": "Telemetri slettet", - "type-sms-sent": "SMS sendt" + "type-sms-sent": "SMS sendt", + "any-type": "Enhver type", + "audit-log-filter-title": "Auditlogfilter", + "filter-title": "Filter", + "filter-types": "Auditlogtyper" }, "debug-settings": { "label": "Fejlfindingskonfiguration", @@ -1020,12 +1098,25 @@ "selected-fields": "{ count, plural, =1 {1 beregnet felt} other {# beregnede felter} } valgt", "type": { "simple": "Simpel", - "script": "Script" + "simple-hint": "Simpel aritmetisk beregning baseret på inputargumenter.", + "script": "Script", + "script-hint": "Beregning over definerede argumenter ved brug af et TBEL-script.", + "geofencing": "Geofencing", + "geofencing-hint": "Evaluering af entitetens GPS-position og overgange i forhold til konfigurerede geofencing-zonegrupper.", + "propagation": "Propagering", + "propagation-hint": "Propagering af data til overordnede eller underordnede entiteter baseret på relationsretning og -type.", + "related-entities-aggregation": "Aggregering af relaterede entiteter", + "related-entities-aggregation-hint": "Aggregering af seneste data fra relaterede entiteter.", + "time-series-data-aggregation": "Aggregering af tidsseriedata", + "time-series-data-aggregation-hint": "Aggregering af historiske data fra en aktuel entitet." }, + "preview": "Forhåndsvisning", "arguments": "Argumenter", "decimals-by-default": "Decimaler som standard", "debugging": "Fejlfinding af beregnet felt", + "calculated-field-details": "Detaljer for beregnet felt", "argument-name": "Argumentnavn", + "name": "Navn", "datasource": "Datakilde", "add-argument": "Tilføj argument", "test-script-function": "Test scriptfunktion", @@ -1037,8 +1128,9 @@ "argument-asset": "Aktiv", "argument-customer": "Kunde", "argument-tenant": "Aktuel lejer", + "argument-owner": "Nuværende ejer", + "argument-relation-query": "Relaterede entiteter", "argument-type": "Argumenttype", - "see-debug-events": "Se fejlsøgningshændelser", "attribute": "Attribut", "copy-argument-name": "Kopiér argumentnavn", "timeseries-key": "Tidsserienøgle", @@ -1051,12 +1143,14 @@ "shared-attributes": "Delte attributter", "attribute-key": "Attributnøgle", "default-value": "Standardværdi", + "default-value-required": "Standardværdi er påkrævet.", "limit": "Maks. værdier", "time-window": "Tidsvindue", "customer-name": "Kundenavn", "asset-name": "Aktivnavn", "timeseries": "Tidsserie", "output": "Output", + "output-hint": "Definerer, hvordan output behandles.", "create": "Opret nyt beregnet felt", "file": "Beregnet felt-fil", "invalid-file-error": "Ugyldigt filformat. Sørg for, at filen er en gyldig JSON-fil.", @@ -1070,8 +1164,174 @@ "delete-multiple-text": "Vær forsigtig, efter bekræftelse vil alle valgte beregnede felter blive fjernet og alle relaterede data ikke kunne gendannes.", "test-with-this-message": "Test med denne meddelelse", "use-latest-timestamp": "Brug seneste tidsstempel", + "entity-coordinates": "Entitetkoordinater", + "latitude-time-series-key": "Breddegradstidsserienøgle", + "latitude-time-series-key-required": "Breddegradstidsserienøgle er påkrævet.", + "longitude-time-series-key": "Længdegradstidsserienøgle", + "longitude-time-series-key-required": "Længdegradstidsserienøgle er påkrævet.", + "geofencing-zone-groups": "Geofencingzonegrupper", + "geofencing-zone-groups-settings": "Geofencingzonegruppeindstillinger", + "target-zone": "Målzone", + "perimeter-key": "Perimeternøgle", + "report-strategy": "Rapporteringsstrategi", + "no-zone-configured": "Mindst én zone er påkrævet.", + "no-zone-configured-required": "Mindst én zonegruppe skal være konfigureret.", + "add-zone-group": "Tilføj zonegruppe", + "report-transition-event-only": "Kun overgangshændelser", + "report-presence-status-only": "Kun tilstedeværelsesstatus", + "report-transition-event-and-presence": "Tilstedeværelsesstatus og overgangshændelser", + "perimeter-attribute-key": "Perimeterattributnøgle", + "perimeter-attribute-key-required": "Perimeterattributnøgle er påkrævet.", + "perimeter-attribute-key-pattern": "Perimeterattributnøgle er ugyldig.", + "entity-zone-relationship": "Sti fra Entitet til zoner", + "direction": "Relationsretning", + "direction-from": "Fra entitet til zone", + "direction-to": "Fra zone til entitet", + "relation-type": "Relationstype", + "create-relation-with-matched-zones": "Opret relationer for kildeentitet med matchende zoner", + "relation-level": "Relationsniveau", + "fetch-last-available-level": "Hent kun senest tilgængelige niveau", + "zone-group-refresh-interval": "Opdateringsinterval for zonegrupper", + "copy-zone-group-name": "Kopiér zonegruppenavn", + "open-details-page": "Åbn entitetens detaljeside", + "level": "Niveau", + "direction-level": "Retning", + "direction-up": "Op", + "direction-up-parent": "Op til overordnet", + "direction-down": "Ned", + "direction-down-child": "Ned til underordnet", + "add-level": "Tilføj niveau", + "delete-level": "Slet niveau", + "no-level": "Intet niveau konfigureret", + "levels-required": "Mindst ét niveau skal være konfigureret.", + "max-allowed-levels-error": "Relationsniveau overskrider det maksimalt tilladte.", + "propagation-path-related-entities": "Propageringssti til relaterede entiteter", + "propagate-type": { + "arguments-only": "Kun argumenter", + "expression-result": "Beregningsresultat" + }, + "script": "Script", + "data-propagate": "Data, der skal propageres", + "output-key": "Outputnøgle", + "copy-output-key": "Kopiér outputnøgle", + "aggregation-path-related-entities": "Aggregeringssti til relaterede entiteter", + "deduplication-interval": "Deduplikeringsinterval", + "deduplication-interval-min": "Deduplikeringsinterval skal være mindst {{ sec }} sekunder.", + "deduplication-interval-hint": "Minimumstid mellem telemetriaggregeringer.", + "deduplication-interval-required": "Deduplikeringsinterval er påkrævet.", + "calculated-field-filter-title": "Filter for beregnet felt", + "filter-title": "Filter", + "calculated-field-types": "Typer af beregnede felter", + "events": "Hændelser", + "any-type": "Enhver type", + "metrics": { + "metrics": "Metrikker", + "metrics-empty": "Mindst én metrik skal være konfigureret.", + "metric-name": "Metriknavn", + "metric-name-required": "Metriknavn er påkrævet.", + "metric-name-pattern": "Metriknavn er ugyldigt.", + "metric-name-duplicate": "Der findes allerede en metrik med dette navn.", + "metric-name-max-length": "Metriknavn skal være under 256 tegn.", + "metric-name-forbidden": "Metriknavn er reserveret og kan ikke bruges.", + "copy-metric-name": "Kopiér metriknavn", + "argument-name": "Argumentnavn", + "aggregation": "Aggregering", + "aggregation-type": { + "avg": "Gennemsnit", + "min": "Minimum", + "max": "Maksimum", + "sum": "Sum", + "count": "Antal", + "count-unique": "Antal unikke" + }, + "filtered": "Filtreret", + "value-source": "Værdikilde", + "value-source-hint": "Definerer, hvordan værdien til aggregering hentes.", + "value-source-type": { + "key": "Nøgle", + "function": "Funktion" + }, + "no-metrics-configured": "Mindst én metrik er påkrævet.", + "add-metric": "Tilføj metrik", + "max-metrics": "Maksimalt antal metrikker er nået.", + "metric-settings": "Metrikindstillinger", + "filter": "Filter", + "filter-hint": "Aktiverer filtrering af entiteter under aggregering. Filterfunktionen skal returnere en boolesk værdi og kan bruge alle konfigurerede argumenter." + }, + "output-strategy": { + "strategy": "Strategi", + "process-right-away": "Behandl med det samme", + "process-rule-chains": "Behandl via Regelkæder", + "save-time-series": "Gem i tidsserie", + "save-database": "Gem i database", + "save-latest-values": "Gem i seneste værdier", + "send-web-sockets": "Send til WebSockets", + "save-calculated-fields": "Send til beregnede felter", + "update-attribute-only-on-value-change": "Opdater attribut kun ved værdiskift", + "send-attributes-updated-notification": "Send notifikation om opdaterede attributter", + "ttl": "Tilpasset TTL", + "ttl-required": "TTL er påkrævet", + "ttl-min": "Kun 0 som minimum-TTL er tilladt", + "processing-parameters": "Behandlingsparametre", + "hint": { + "strategy": "Styrer, om resultatet behandles med det samme eller sendes til en regelkæde til yderligere behandling.", + "processing-options": "Behandlingsmuligheder", + "update-attribute-only-on-value-change": "Opdaterer attribut ved hver indgående besked, uanset om værdien har ændret sig. Dette øger API-forbrug og reducerer ydeevnen.", + "update-attribute-only-on-value-change-enabled": "Opdaterer attribut kun, når værdien ændrer sig. Hvis værdien er uændret, opdateres tidsstempler ikke, og der sendes ikke notifikationer.", + "send-attributes-updated-notification": "Sender en Attributter opdateret-hændelse til standardregel kæden.", + "save-time-series": "Gemmer tidsseriedata i tabellen ts_kv i databasen.", + "save-database": "Gemmer attributdata i databasen.", + "save-latest-values": "Opdaterer tidsseriedata i tabellen ts_kv_latest i databasen, hvis den nye værdi er nyere.", + "send-web-sockets-attribute": "Notificerer WebSocket-abonnementer om opdateringer af attributdata.", + "send-web-sockets-time-series": "Notificerer WebSocket-abonnementer om opdateringer af tidsseriedata.", + "save-calculated-fields-attribute": "Notificerer beregnede felter om opdateringer af attributdata.", + "save-calculated-fields-time-series": "Notificerer beregnede felter om opdateringer af tidsseriedata.", + "ttl": "Definerer opbevaringsperioden for tidsseriedata. Hvis deaktiveret, bruges Lejerprofil-TTL." + } + }, + "aggregate-interval-type": "Aggregeringsintervaltype", + "aggregate-interval-value": "Aggregeringsintervalværdi", + "aggregate-interval-value-required": "Aggregeringsintervalværdi er påkrævet.", + "aggregate-interval-value-min": "Aggregeringsintervalværdi skal være mindst { sec, plural, =0 {0 sekund} =1 {1 sekund} other {# sekunder} }.", + "aggregate-interval-value-step-multiple-of": "Aggregeringsintervalværdi skal være en divisor eller et multiplum af 1 dag.", + "aggregate-period": { + "hour": "Time", + "day": "Dag", + "week": "Uge (man - søn)", + "week-sun-sat": "Uge (søn - lør)", + "month": "Måned", + "quarter": "Kvartal", + "year": "År", + "custom": "Tilpasset" + }, + "aggregate-period-hint-offset": "Dit aggregeringsinterval vil være: {{ interval }}", + "aggregate-period-hint-offset-and-so-on": "Dit aggregeringsinterval vil være: {{ interval }} og så videre.", + "entity-aggregation": { + "argument-hint": "Data vil blive hentet fra den aktuelle entitet.", + "argument-title-hint": "Definerer de inputargumenter, der bruges til aggregering.", + "argument-setting-hint": "Seneste telemetri er den eneste tilgængelige argumenttype for dette beregnede felt.", + "aggregation-interval": "Aggregeringsinterval", + "aggregation-interval-hint": "Definerer, hvor ofte aggregering udføres. Eksempel: hver 1 time aggregerer data kl. 00:00, 01:00, 02:00 osv. Aggregeringsresultater lagres med tidsstemplet, der svarer til starten af aggregeringsintervallet.", + "apply-offset": "Anvend forskydning på aggregeringsinterval", + "apply-offset-hint": "Definerer, hvor meget starten af hver aggregeringsperiode skal forskydes (f.eks. +10 minutter - 00:10, 01:10).", + "offset-value": "Forskydningsværdi", + "offset-value-required": "Forskydningsværdi er påkrævet.", + "offset-value-min": "Forskydningsværdi skal være et positivt heltal.", + "offset-value-max": "Forskydningsværdi skal være mindre end aggregeringsintervalværdien.", + "wait-delay": "Anvend ventetimeout for forsinket telemetri", + "wait-delay-hint": "Definerer, hvor længe der skal ventes på forsinket telemetri, efter intervallet slutter. Hvis sådan telemetri ankommer, genberegnes resultatet for det interval.", + "duration": "Varighed", + "duration-required": "Varighed er påkrævet.", + "duration-min": "Varighed skal være mindst 1 minut.", + "duration-hint": "Hvor længe der skal ventes på forsinkede data, efter intervallet slutter.", + "produce-intermediate-result": "Generér mellemliggende resultat", + "produce-intermediate-result-hint": "Beregner metrikker i det aktuelle interval for at generere et mellemliggende resultat. Opdateringer sker ikke oftere end én gang hver {{ time }}." + }, "hint": { "arguments-simple-with-rolling": "Beregnet felt af typen simpel må ikke indeholde nøgler med tidsserieglidningstype.", + "arguments-propagate-arguments-with-rolling": "Typen 'Time series rolling' er inkompatibel med propagering af 'Kun argumenter'.", + "arguments-propagate-argument-entity-type": "Entitetstypen er inkompatibel med propagering af 'Kun argumenter'.", + "arguments-propagate-argument-must-current-entity": "Mindst ét argument skal konfigureres med kildenhedstypen 'Aktuel entitet'.", "arguments-empty": "Argumenter må ikke være tomme.", "expression-required": "Udtryk er påkrævet.", "expression-invalid": "Udtryk er ugyldigt", @@ -1081,12 +1341,218 @@ "argument-name-duplicate": "Argument med dette navn findes allerede.", "argument-name-max-length": "Argumentnavn skal være under 256 tegn.", "argument-name-forbidden": "Argumentnavn er reserveret og kan ikke anvendes.", + "output-key-required": "Outputnøgle er påkrævet.", + "output-key-pattern": "Outputnøgle er ugyldig.", + "output-key-duplicate": "Der findes allerede en nøgle med dette navn.", + "output-key-max-length": "Outputnøgle skal være under 256 tegn.", + "output-key-forbidden": "Outputnøgle er reserveret og kan ikke bruges.", + "entity-type-required": "Entitetstype er påkrævet", + "name-required": "Navn er påkrævet.", + "name-pattern": "Navn er ugyldigt.", + "name-duplicate": "Der findes allerede et navn med dette navn.", + "name-max-length": "Navn skal være under 256 tegn.", + "name-forbidden": "Navn er reserveret og kan ikke bruges.", "argument-type-required": "Argumenttype er påkrævet.", "max-args": "Maksimalt antal argumenter er nået.", "decimals-range": "Standard decimaler skal være et tal mellem 0 og 15.", "expression": "Standardudtryk demonstrerer, hvordan man omregner temperatur fra Fahrenheit til Celsius.", "arguments-entity-not-found": "Målentitet for argument ikke fundet.", - "use-latest-timestamp": "Hvis aktiveret, vil den beregnede værdi blive gemt med det nyeste tidsstempel fra argumenternes telemetri i stedet for serverens tid." + "use-latest-timestamp": "Hvis aktiveret, vil den beregnede værdi blive gemt med det nyeste tidsstempel fra argumenternes telemetri i stedet for serverens tid.", + "entity-coordinates": "Angiv de tidsserienøgler, der leverer entitetens GPS-koordinater (breddegrad og længdegrad).", + "geofencing-zone-groups": "Definér én eller flere geofencingzonegrupper, der skal kontrolleres (f.eks. 'allowedZones', 'restrictedZones'). Hver gruppe skal have et unikt navn, som bruges som præfiks for telemetrinøgler for beregnet felt-output.", + "perimeter-attribute-key": "Angiv attributnøglen, der indeholder definitionen af geofencingzonens perimeter. Perimeteren hentes altid fra serversideattributter for zoneentiteten.", + "report-strategy": "Tilstedeværelsesstatus rapporterer, om entiteten aktuelt er INDE i eller UDE af zonegruppen. Overgangshændelser rapporterer, hvornår entiteten GIK IND I eller FORLOD zonegruppen.", + "create-relation-with-matched-zones": "Opret og vedligehold automatisk relationer mellem entiteten og de zoner, den aktuelt er inde i. Relationer fjernes, når entiteten forlader en zone, og oprettes, når den går ind i en ny.", + "relation-type-required": "Relationstype er påkrævet.", + "relation-level-required": "Relationsniveau er påkrævet.", + "relation-level-min": "Minimumsværdi for relationsniveau er 1.", + "relation-level-max": "Maksimumværdi for relationsniveau er {{max}}.", + "geofencing-empty": "Mindst én zonegruppe skal være konfigureret.", + "geofencing-entity-not-found": "Geofencingmålsentitet blev ikke fundet.", + "max-geofencing-zone": "Maksimalt antal geofencingzoner er nået.", + "zone-group-refresh-interval": "Definerer, hvor ofte zonegrupper, der er konfigureret via relaterede entiteter, opdateres.", + "zone-group-refresh-interval-required": "Opdateringsinterval for zonegrupper er påkrævet.", + "zone-group-refresh-interval-min": "Opdateringsinterval for zonegrupper skal være mindst {{ min }} sekunder.", + "propagation-path-related-entities": "Definerer en direkte sti på ét enkelt niveau til en relateret entitet baseret på den valgte retning og relationstype.", + "data-propagate": "Definerer de data, der skal propageres fra argumenterne konfigureret nedenfor. 'Kun argumenter' bruger de hentede data direkte, mens 'Beregningsresultat' beregner en ny værdi ud fra disse data.", + "aggregation-path-related-entities": "Definerer en aggregeringssti på ét enkelt niveau via direkte relationer med overordnede eller underordnede entiteter, baseret på retning og relationstype. Kun relationer mellem enheds-, asset-, kunde- og lejerentiteter understøttes.", + "arguments-aggregation": "Definerer de inputargumenter, der bruges til filtrering og aggregering.", + "setting-arguments-aggregation": "Data vil blive hentet fra relaterede entiteter, der er konfigureret i aggregeringsstien.", + "metrics": "Definerer metrikker, der aggregeres baseret på konfigurerede argumenter.", + "entity-aggregation-metrics": "Definerer metrikker, der aggregeres baseret på konfigurerede argumenter over de angivne tidsintervaller.", + "import-invalid-calculated-field-type": "Kan ikke importere beregnet felt: Ugyldig struktur for beregnet felt.", + "simple-expression-title": "Aritmetisk udtryk, der definerer, hvordan den beregnede værdi beregnes.", + "script-title": "TBEL-script, der definerer beregningslogikken og outputværdierne.", + "simple-arguments": "Aritmetisk udtryk, der definerer, hvordan den beregnede værdi beregnes.", + "script-arguments": "Definerer de inputargumenter, der er tilgængelige for scriptet." + } + }, + "alarm-rule": { + "alarm-rules-tab": "Alarmregler", + "alarm-rule": "Alarmregel", + "alarm-rules": "Alarmregler", + "alarm-rules-old": "Gammel", + "alarm-rules-actual": "Aktuel", + "severities": "Alvorlighedsgrader", + "cleared": "Rydningsbetingelse", + "delete-title": "Er du sikker på, at du vil slette alarmreglen '{{title}}'?", + "delete-text": "Vær forsigtig, efter bekræftelsen kan alarmreglen og alle relaterede data ikke gendannes.", + "delete-multiple-title": "Er du sikker på, at du vil slette { count, plural, =1 {1 alarmregel} other {# alarmregler} }?", + "delete-multiple-text": "Vær forsigtig, efter bekræftelsen vil alle valgte alarmregler blive fjernet, og alle relaterede data kan ikke gendannes.", + "create": "Opret ny alarmregel", + "add": "Tilføj alarmregel", + "copy": "Kopiér alarmregelkonfiguration", + "details": "Detaljer for alarmregel", + "no-found": "Ingen alarmregler fundet", + "list": "{ count, plural, =1 {Én alarmregel} other {Liste over # alarmregler} }", + "selected-fields": "{ count, plural, =1 {1 alarmregel} other {# alarmregler} } valgt", + "import": "Importér alarmregel", + "file": "Alarmregelfil", + "export": "Eksportér alarmregel", + "export-failed-error": "Kan ikke eksportere alarmregel: {{error}}", + "entity-type": "Entitetstype", + "entity-type-required": "Entitetstype er påkrævet.", + "alarm-type": "Alarmtype", + "alarm-type-hint": "Unik identifikator (f.eks. HighTempAlarm) inden for alarmoprinderens omfang (Enhed, Asset osv.) for at undgå konflikter.", + "alarm-type-required": "Alarmtype er påkrævet.", + "alarm-type-pattern": "Alarmtype er ugyldig.", + "alarm-type-max-length": "Alarmtype skal være under 256 tegn.", + "clear-alarm": "Ryd alarm", + "value-argument": "Argument", + "value-argument-required": "Argument er påkrævet.", + "static-settings": "Statiske indstillinger", + "configuration": "Konfiguration", + "static-schedule": "Statisk", + "dynamic-schedule": "Dynamisk", + "operation-and": "OG", + "operation-or": "ELLER", + "condition-during": "I løbet af {{during}}", + "condition-during-dynamic": "I løbet af \"{{ attribute }}\"", + "condition-repeat-times": "Gentages { count, plural, =1 {1 gang} other {# gange} }", + "condition-repeat-times-dynamic": "Gentages \"{{ attribute }}\" gange", + "filter-preview": "Forhåndsvisning af filter", + "condition-settings": "Betingelsesindstillinger", + "static": "Statisk", + "dynamic": "Dynamisk", + "argument-filters": "Argumentfiltre", + "argument-name": "Argumentnavn", + "value-type": "Værditype", + "general": "Generelt", + "filters": "Filtre", + "date-time-hint": "Argumentet skal være i epoch-millisekunder. Eksempel: 1698839340000 svarer til 2023-11-01 12:49:00 UTC.", + "operation": "Operation", + "value-source": "Værdikilde", + "value": "Værdi", + "ignore-case": "Ignorer store/små bogstaver", + "condition": "Betingelse", + "script": "Script", + "add-filter": "Tilføj argumentfilter", + "edit-filter": "Argumentfilter", + "remove-filter": "Fjern argumentfilter", + "no-filter": "Mindst ét filter er påkrævet.", + "conditions": { + "simple": "Simpel", + "duration": "Varighed", + "repeating": "Gentagende" + }, + "schedule-title": "Tidsplan", + "edit-schedule": "Rediger alarmtidsplan", + "schedule-type": "Tidsplanlægger-type", + "schedule-type-required": "Tidsplanlægger-type er påkrævet.", + "schedule": { + "any-time": "Aktiv hele tiden", + "specific-time": "Aktiv på et bestemt tidspunkt", + "custom": "Tilpasset" + }, + "schedule-day": { + "monday": "Mandag", + "tuesday": "Tirsdag", + "wednesday": "Onsdag", + "thursday": "Torsdag", + "friday": "Fredag", + "saturday": "Lørdag", + "sunday": "Søndag" + }, + "schedule-days": "Dage", + "schedule-time": "Tid", + "schedule-time-from": "Fra", + "schedule-time-to": "Til", + "schedule-days-of-week-required": "Mindst én ugedag skal vælges.", + "tbel": "TBEL", + "expression-type": { + "simple": "Simpel", + "script": "Script" + }, + "operation-type": { + "and": "Og", + "or": "Eller" + }, + "filter-predicate-type": { + "string": "Streng", + "numeric": "Numerisk", + "boolean": "Boolesk", + "complex": "Kompleks" + }, + "alarm-rule-additional-info": "Yderligere info", + "edit-alarm-rule-additional-info": "Rediger yderligere info", + "alarm-rule-additional-info-placeholder": "Angiv venligst dine kommentarer og justeringer her for at vise dem i Alarmdetaljer under Yderligere info", + "alarm-rule-additional-info-hint": "Tip: brug ${Argumentnavn} til at erstatte værdier for de argumenter, der bruges i alarmregelbetingelsen.", + "alarm-rule-additional-info-icon-hint": "Brug Argumentnavn til at erstatte værdier for de argumenter, der bruges i alarmregelbetingelsen.", + "alarm-rule-mobile-dashboard": "Mobilt Dashboard", + "alarm-rule-mobile-dashboard-hint": "Bruges af mobilapplikationen som et Dashboard til alarmdetaljer.", + "alarm-rule-no-mobile-dashboard": "Intet Dashboard valgt", + "alarm-rule-condition": "Alarmregelbetingelse", + "enter-alarm-rule-condition-prompt": "Tilføj betingelse", + "enter-alarm-rule-clear-condition-prompt": "Tilføj rydningsbetingelse", + "edit-alarm-rule-condition": "Alarmbetingelse", + "condition-type": "Betingelsestype", + "condition-type-hint": "\"Varighed\"- og \"Gentagende\"-mulighederne er ikke tilgængelige, når operationen \"Mangler i\" bruges i filtret.", + "select-alarm-severity": "Vælg alarmens alvorlighedsgrad", + "add-create-alarm-rule-prompt": "Mindst én udløserbetingelse er påkrævet.", + "add-create-alarm-rule": "Tilføj udløserbetingelse", + "add-clear-alarm-rule": "Tilføj rydningsbetingelse", + "condition-duration": "Betingelsesvarighed", + "condition-duration-value": "Varighedsværdi", + "condition-duration-time-unit": "Tidsenhed", + "condition-duration-value-range": "Varighedsværdi skal være i intervallet fra 1 til 2147483647.", + "condition-duration-value-pattern": "Varighedsværdi skal være heltal.", + "condition-duration-value-required": "Varighedsværdi er påkrævet.", + "condition-duration-time-unit-required": "Tidsenhed er påkrævet.", + "condition-repeating-value": "Antal hændelser", + "condition-repeating-value-hint": "Opdatering af ethvert alarmregelargument vil blive talt som en hændelse", + "condition-repeating-value-range": "Antal hændelser skal være i intervallet fra 1 til 2147483647.", + "condition-repeating-value-pattern": "Antal hændelser skal være heltal.", + "condition-repeating-value-required": "Antal hændelser er påkrævet.", + "create-conditions": "Udløserbetingelser", + "clear-condition": "Rydningsbetingelse", + "no-clear-alarm-rule": "Ingen rydningsbetingelse konfigureret.", + "advanced-settings": "Avancerede indstillinger", + "propagate-alarm": "Propagér alarm til relaterede entiteter", + "alarm-rule-relation-types-list": "Relationstyper", + "alarm-rule-relation-types-list-hint": "Definerer relationstyper til filtrering af de relaterede entiteter. Hvis ikke angivet, vil alarmen blive propageret til alle relaterede entiteter.", + "propagate-alarm-to-owner": "Propagér alarm til entitetens ejer (Kunde eller Lejer)", + "propagate-alarm-to-tenant": "Propagér alarm til Lejer", + "alarm-rule-filter-title": "Alarmregelfilter", + "filter-title": "Filter", + "debugging": "Fejlfinding af alarmregel", + "any-type": "Enhver type", + "enter-alarm-rule-type": "Angiv alarmtype", + "no-alarm-rule-types-matching": "Der blev ikke fundet nogen alarmtyper, der matcher '{{entitySubtype}}'.", + "alarm-rule-type-list-empty": "Ingen alarmtyper valgt.", + "alarm-rule-type-list": "Liste over alarmtyper", + "alarm-rule-entity-list": "Entitetsliste", + "missing-for": "mangler i", + "time-unit": "Enhed", + "mode": "Tilstand", + "type": "Type", + "value-required": "Værdi er påkrævet.", + "min-value": "Værdien skal være 1 eller højere.", + "argument-in-use": "Argumentet bruges som generelt argument.", + "import-invalid-alarm-rule-type": "Kan ikke importere alarmregel: Ugyldig struktur for alarmregel.", + "no-filter-preview": "Intet filter angivet", + "filter-operation": { + "and": "Og", + "or": "Eller" } }, "ai-models": { @@ -1193,6 +1659,7 @@ "contact": { "country": "Land", "country-required": "Land er påkrævet.", + "country-object-required": "Vælg venligst et gyldigt land fra listen.", "city": "By", "state": "Stat / Provins", "postal-code": "Postnummer", @@ -1229,6 +1696,8 @@ "documentation": "Dokumentation", "time-left": "{{time}} tilbage", "output": "Output", + "sort-asc": "Stigende", + "sort-desc": "Faldende", "suffix": { "s": "s", "ms": "ms" @@ -1365,6 +1834,8 @@ "mobile-order": "Dashboardrækkefølge i mobilapplikation", "mobile-hide": "Skjul dashboard i mobilapplikation", "update-image": "Opdatér dashboardbillede", + "update-new-version": "Upload ny version", + "upload-file-to-update": "Upload fil for at opdatere", "take-screenshot": "Tag skærmbillede", "select-widget-title": "Vælg widget", "select-widget-value": "{{title}}: vælg widget", @@ -1733,6 +2204,8 @@ "bootstrap-tab": "Bootstrap-klient", "bootstrap-server": "Bootstrap-server", "lwm2m-server": "LwM2M-server", + "client-reboot": "Trigger for registreringsopdatering", + "bootstrap-reboot": "Trigger for bootstrap-anmodning", "client-publicKey-or-id": "Klientens offentlige nøgle eller ID", "client-publicKey-or-id-required": "Klientens offentlige nøgle eller ID er påkrævet.", "client-publicKey-or-id-tooltip-psk": "PSK-identifikator er en vilkårlig identifikator op til 128 bytes som beskrevet i standarden [RFC7925].\nDen SKAL konverteres til en streng og kodes med UTF-8.", @@ -1780,7 +2253,6 @@ "unable-delete-device-alias-text": "Enhedsalias '{{deviceAlias}}' kan ikke slettes, da det bruges af følgende widget(s):
{{widgetsList}}", "is-gateway": "Er gateway", "overwrite-activity-time": "Overskriv aktivitetstid for tilsluttet enhed", - "device-filter": "Enhedsfilter", "device-filter-title": "Enhedsfilter", "filter-title": "Filter", "device-state": "Enhedstilstand", @@ -2234,6 +2706,7 @@ "short-id-required": "Kort server-ID er påkrævet.", "short-id-range": "Kort server-ID skal være mellem {{ min }} og {{ max }}.", "short-id-pattern": "Kort server-ID skal være et positivt heltal.", + "short-id-pattern-bs": "Kort server-ID må kun være null", "lifetime": "Klientens registreringslevetid", "lifetime-required": "Registreringslevetid er påkrævet.", "lifetime-pattern": "Registreringslevetid skal være et positivt heltal.", @@ -2328,7 +2801,9 @@ "composite-all-description": "Alle ressourcer observeres med en enkelt sammensat Observe-anmodning (mere effektivt, mindre fleksibelt)", "composite-by-object": "Sammensat efter objekt", "composite-by-object-description": "Ressourcer grupperes efter objekttype og observeres via separate sammensatte Observe-anmodninger (balanceret tilgang)" - } + }, + "init-attr-tel-as-obs-strategy": "Initialisér attributter og telemetri ved hjælp af Observe-strategien", + "init-attr-tel-as-obs-strategy-hint": "Hvis false - initialiseres attributter og telemetri ved at læse deres værdier én ad gangen.\\nHvis true - initialiseres attributter og telemetri ved at abonnere på deres værdier ved hjælp af Observe-strategien." }, "snmp": { "add-communication-config": "Tilføj kommunikationskonfiguration", @@ -2644,6 +3119,8 @@ "type-rulenodes": "Regelnoder", "list-of-rulenodes": "{ count, plural, =1 {Én regelnode} other {Liste over # regelnoder} }", "rulenode-name-starts-with": "Regelnoder, hvis navne starter med '{{prefix}}'", + "type-api-key": "API-nøgle", + "type-api-keys": "API-nøgler", "type-current-customer": "Aktuel kunde", "type-current-tenant": "Aktuel lejer", "type-current-user": "Aktuel bruger", @@ -2665,6 +3142,7 @@ "details": "Enhedsdetaljer", "no-entities-prompt": "Ingen enheder fundet", "no-data": "Ingen data at vise", + "show-all-columns": "Vis alle", "columns-to-display": "Kolonner at vise", "type-api-usage-state": "API-brugsstatus", "type-edge": "Edge", @@ -2710,7 +3188,15 @@ "list-of-mobile-apps": "{ count, plural, =1 {Én mobilapplikation} other {Liste over # mobilapplikationer} }", "type-mobile-app-bundle": "Mobilpakke", "type-mobile-app-bundles": "Mobilpakker", - "list-of-mobile-app-bundles": "{ count, plural, =1 {Én mobilpakke} other {Liste over # mobilpakker} }" + "list-of-mobile-app-bundles": "{ count, plural, =1 {Én mobilpakke} other {Liste over # mobilpakker} }", + "limit-reached": "Grænse nået", + "limit-reached-text": "Du har nået grænsen på {{ entities }}. For at tilføje flere skal du bede din systemadministrator om at øge din {{ entity }}-grænse.", + "request-limit-increase": "Anmod om øgning af grænse", + "request-sysadmin-text": "Er du systemadministratoren?", + "login-here": "Log ind her", + "to-increase-limit": "for at øge grænsen.", + "increase-limit-request-sent-title": "Vi har sendt en automatisk anmodning til din systemadministrator om at øge grænsen", + "increase-limit-request-sent-text": "Giv dem venligst lidt tid til at gennemgå anmodningen og opdatere indstillingerne. Du skal muligvis genindlæse denne side for at se ændringerne." }, "entity-field": { "created-time": "Oprettelsestidspunkt", @@ -3798,7 +4284,8 @@ "password-link-sent-message": "Nulstillingslink er sendt", "email": "Email", "invalid-email-format": "Ugyldigt emailformat.", - "login-with": "Log ind med {{name}}", + "sign-in-with": "Log ind med {{name}}", + "sign-in-to-your-account": "Log ind på din konto", "or": "eller", "error": "Loginfejl", "verify-your-identity": "Bekræft din identitet", @@ -3817,7 +4304,51 @@ "activation-link-expired": "Aktiveringslinket er udløbet", "activation-link-expired-message": "Linket til at aktivere din profil er udløbet. Du kan vende tilbage til login-siden for at modtage en ny email.", "reset-password-link-expired": "Nulstillingslinket for adgangskode er udløbet", - "reset-password-link-expired-message": "Linket til at nulstille din adgangskode er udløbet. Du kan vende tilbage til login-siden for at modtage en ny email." + "reset-password-link-expired-message": "Linket til at nulstille din adgangskode er udløbet. Du kan vende tilbage til login-siden for at modtage en ny email.", + "two-fa": "Tofaktorgodkendelse", + "two-fa-required": "Tofaktorgodkendelse er påkrævet", + "set-up-verification-method": "Opsæt en verifikationsmetode for at fortsætte", + "set-up-verification-method-login": "Opsæt en verifikationsmetode eller log ind", + "enable-authenticator-app": "Aktivér godkendelsesapp", + "enable-authenticator-app-description": "Indtast venligst sikkerhedskoden fra din godkendelsesapp", + "enable-authenticator-sms": "Aktivér SMS-godkendelse", + "enable-authenticator-sms-description": "Indtast den 6-cifrede kode, vi lige har sendt til ", + "enable-authenticator-email": "Aktivér email-godkendelse", + "enable-authenticator-email-description": "En sikkerhedskode er blevet sendt til din emailadresse på ", + "enter-key-manually": "eller indtast denne 32-cifrede nøgle manuelt:", + "continue": "Fortsæt", + "confirm": "Bekræft", + "authenticator-app-success": "Godkendelsesapp blev aktiveret", + "authenticator-app-success-description": "Næste gang du logger ind, skal du angive en tofaktorgodkendelseskode", + "authenticator-sms-success": "SMS-godkendelse blev aktiveret", + "authenticator-sms-success-description": "Næste gang du logger ind, bliver du bedt om at indtaste sikkerhedskoden, som sendes til telefonnummeret", + "authenticator-email-success": "Email-godkendelse blev aktiveret", + "authenticator-email-success-description": "Næste gang du logger ind, bliver du bedt om at indtaste sikkerhedskoden, som sendes til din emailadresse", + "authenticator-backup-code-success": "Backupkode blev aktiveret", + "authenticator-backup-code-success-description": "Næste gang du logger ind, bliver du bedt om at indtaste sikkerhedskoden eller bruge en af backupkoderne.", + "add-verification-method": "Tilføj verifikationsmetode", + "get-backup-code": "Hent backupkode", + "copy-key": "Kopiér nøgle", + "send-code": "Send kode", + "email-label": "Email", + "email-description": "Indtast en email, der skal bruges som din godkendelse.", + "sms-description": "Indtast et telefonnummer, der skal bruges som din godkendelse.", + "backup-code-description": "Print koderne, så du har dem ved hånden, når du skal bruge dem til at logge ind på din konto. Du kan bruge hver backupkode én gang.", + "backup-code-warn": "Når du forlader denne side, kan disse koder ikke vises igen. Opbevar dem sikkert ved hjælp af mulighederne nedenfor.", + "download-txt": "Download (txt)", + "print": "Udskriv", + "verification-code": "6-cifret kode", + "verification-code-invalid": "Ugyldigt format for verifikationskode", + "verification-code-incorrect": "Verifikationskoden er forkert", + "verification-code-many-request": "For mange anmodninger om at kontrollere verifikationskode", + "scan-qr-code": "Scan denne QR-kode med din verifikationsapp", + "phone-input": { + "phone-input-label": "Telefonnummer", + "phone-input-required": "Telefonnummer er påkrævet", + "phone-input-validation": "Telefonnummer er ugyldigt eller ikke muligt", + "phone-input-pattern": "Ugyldigt telefonnummer. Skal være i E.164-format, f.eks. {{phoneNumber}}", + "phone-input-hint": "Telefonnummer i E.164-format, f.eks. {{phoneNumber}}" + } }, "mobile": { "add-application": "Tilføj applikation", @@ -4185,6 +4716,7 @@ "api-usage-limit": "API-brugsgrænse", "device-activity": "Enhedsaktivitet", "entities-limit": "Enhedsgrænse", + "entities-limit-increase-request": "Anmodning om øgning af entitetsgrænse", "entity-action": "Enhedshandling", "general": "Generelt", "rule-engine-lifecycle-event": "Livscyklushændelse for Rule Engine", @@ -4402,6 +4934,12 @@ "at-least": "Mindst:", "character": "{ count, plural, =1 {1 tegn} other {# tegn} }", "digit": "{ count, plural, =1 {1 ciffer} other {# cifre} }", + "password-tooltip-min-length": "Mindst {{minimumLength}} tegn langt", + "password-tooltip-max-length": "Højst {{maximumLength}} tegn langt", + "password-tooltip-uppercase": "{{minimumUppercaseLetters}} stort bogstav", + "password-tooltip-lowercase": "{{minimumLowercaseLetters}} lille bogstav", + "password-tooltip-digit": "{{minimumDigits}} tal", + "password-tooltip-special-characters": "{{minimumSpecialCharacters}} specialtegn", "incorrect-password-try-again": "Forkert adgangskode. Prøv igen", "lowercase-letter": "{ count, plural, =1 {1 lille bogstav} other {# små bogstaver} }", "new-passwords-not-match": "De nye adgangskoder matcher ikke", @@ -4460,7 +4998,8 @@ "additional-info": "Yderligere info (JSON)", "invalid-additional-info": "Kunne ikke fortolke JSON for yderligere info.", "no-relations-text": "Ingen relationer fundet", - "not": "Ikke" + "not": "Ikke", + "copy-type": "Kopiér type" }, "resource": { "add": "Tilføj ressource", @@ -5411,7 +5950,7 @@ "time-series": "Tidsserier", "latest": "Seneste værdier", "web-sockets": "WebSockets", - "calculated-fields": "Beregnet felter" + "calculated-fields-and-alarm-rules": "Beregnede felter og alarmregler" }, "save-attribute": { "processing-settings": "Behandlingsindstillinger", @@ -5606,7 +6145,8 @@ "bad-request-params": "Ugyldige forespørgselsparametre", "item-not-found": "Element ikke fundet", "too-many-requests": "For mange forespørgsler", - "too-many-updates": "For mange opdateringer" + "too-many-updates": "For mange opdateringer", + "entities-limit-exceeded": "Entitetsgrænse overskredet" }, "tenant": { "tenant": "Lejer", @@ -5744,6 +6284,27 @@ "max-arguments-per-cf": "Maksimalt antal argumenter pr. beregnet felt", "max-arguments-per-cf-range": "Maksimalt antal argumenter pr. beregnet felt kan ikke være negativt", "max-arguments-per-cf-required": "Maksimalt antal argumenter pr. beregnet felt er påkrævet", + "max-related-level-per-argument": "Maksimalt relationsniveau pr. argumentet 'Relaterede entiteter'", + "max-related-level-per-argument-range": "Maks. antal for relationsniveau pr. argumentet 'Relaterede entiteter' kan ikke være mindre end '1'", + "max-related-level-per-argument-required": "Maks. antal for relationsniveau pr. argumentet 'Relaterede entiteter' er påkrævet", + "min-allowed-scheduled-update-interval": "Min. tilladt opdateringsinterval for argumenter af typen 'Relaterede entiteter' (sekunder)", + "min-allowed-scheduled-update-interval-range": "Min. tilladt opdateringsinterval kan ikke være negativt", + "min-allowed-deduplication-interval": "Min. tilladt deduplikeringsinterval (sekunder)", + "min-allowed-deduplication-interval-range": "Min. tilladt deduplikeringsintervalværdi kan ikke være negativ", + "min-allowed-deduplication-interval-required": "Min. tilladt deduplikeringsinterval er påkrævet", + "intermediate-aggregation-interval": "Mellemliggende aggregeringsinterval (sekunder)", + "intermediate-aggregation-interval-range": "Mellemliggende aggregeringsintervalværdi kan ikke være mindre end '1'", + "intermediate-aggregation-interval-required": "Mellemliggende aggregeringsinterval er påkrævet", + "reevaluation-check-interval": "Kontrolinterval for revurdering (sekunder)", + "reevaluation-check-interval-range": "Kontrolinterval for revurdering kan ikke være mindre end '1'", + "reevaluation-check-interval-required": "Kontrolinterval for revurdering er påkrævet", + "alarms-reevaluation-interval": "Revurderingsinterval for alarmer (sekunder)", + "alarms-reevaluation-interval-range": "Revurderingsinterval for alarmer kan ikke være mindre end '1'", + "alarms-reevaluation-interval-required": "Revurderingsinterval for alarmer er påkrævet", + "min-allowed-aggregation-interval": "Min. tilladt aggregeringsinterval (sekunder)", + "min-allowed-aggregation-interval-range": "Min. tilladt aggregeringsintervalværdi kan ikke være negativ", + "min-allowed-aggregation-interval-required": "Min. tilladt aggregeringsinterval er påkrævet", + "min-allowed-scheduled-update-interval-required": "Min. tilladt opdateringsintervals minimumsværdi er påkrævet", "max-state-size": "Maksimal tilstandsstørrelse i KB", "max-state-size-range": "Maksimal tilstandsstørrelse i KB kan ikke være negativ", "max-state-size-required": "Maksimal tilstandsstørrelse i KB er påkrævet", @@ -5819,6 +6380,10 @@ "ws-limit-max-subscriptions-per-regular-user": "Maksimalt antal abonnementer pr. almindelig bruger", "ws-limit-max-subscriptions-per-public-user": "Maksimalt antal abonnementer pr. offentlig bruger", "ws-limit-updates-per-session": "WS-opdateringer pr. session", + "relation-search-entity-limit": "Entitetsgrænse for relationssøgning", + "relation-search-entity-limit-hint": "Begrænser antallet af entiteter, der opløses på det sidste niveau i relationsstien. Gælder for argumenter af typen 'Relaterede entiteter' og propageringsfelter.", + "relation-search-entity-limit-required": "Entitetsgrænse for relationssøgning er påkrævet", + "relation-search-entity-limit-range": "Entitetsgrænse for relationssøgning kan ikke være mindre end '1'", "rate-limits": { "add-limit": "Tilføj begrænsning", "and-also-less-than": "og også mindre end", @@ -6004,7 +6569,9 @@ "default-agg-interval": "Standard grupperingsinterval", "edit-intervals-list-hint": "Liste over tilgængelige intervalmuligheder kan specificeres.", "edit-grouping-intervals-list-hint": "Det er muligt at konfigurere listen over grupperingsintervaller og standard grupperingsinterval.", - "all": "Alle" + "all": "Alle", + "save-current-settings-as-default": "Gem aktuelle indstillinger som standardtidsvindue", + "hide-option-from-end-users": "Skjul indstillingen for slutbrugere" }, "tooltip": { "trigger": "Udløser", @@ -6658,7 +7225,8 @@ "export-relations": "Eksporter relationer", "export-attributes": "Eksporter attributter", "export-credentials": "Eksporter legitimationsoplysninger", - "export-calculated-fields": "Eksporter beregnede felter", + "export-calculated-fields": "Eksportér beregnede felter \nog alarmregler", + "export-alarm-rules": "Eksportér alarmregler", "entity-versions": "Entitetsversioner", "versions": "Versioner", "created-time": "Oprettelsestidspunkt", @@ -6675,7 +7243,8 @@ "load-relations": "Indlæs relationer", "load-attributes": "Indlæs attributter", "load-credentials": "Indlæs legitimationsoplysninger", - "load-calculated-fields": "Indlæs beregnede felter", + "load-calculated-fields": "Indlæs beregnede felter og alarmregler", + "load-alarm-rules": "Indlæs alarmregler", "compare-with-current": "Sammenlign med nuværende", "diff-entity-with-version": "Forskel fra entitetsversion '{{versionName}}'", "previous-difference": "Forrige forskel", @@ -6885,7 +7454,23 @@ "scan-qr-code": "Scan QR-kode", "make-phone-call": "Foretag telefonopkald", "get-location": "Hent telefonplacering", - "take-screenshot": "Tag skærmbillede" + "take-screenshot": "Tag skærmbillede", + "handle-provision-success-function": "Håndtér funktion ved vellykket provisionering", + "get-location-function": "Hent placeringsfunktion", + "process-launch-result-function": "Behandl funktion for startresultat", + "get-phone-number-function": "Hent telefonnummerfunktion", + "process-image-function": "Behandl billedfunktion", + "process-qr-code-function": "Behandl QR-kodefunktion", + "process-location-function": "Behandl placeringsfunktion", + "handle-empty-result-function": "Håndtér funktion for tomt resultat", + "handle-error-function": "Håndtér fejlfunktion", + "handle-non-mobile-fallback-function": "Håndtér fallbackfunktion for ikke-mobil", + "save-to-gallery": "Gem i galleri", + "provision-type": "Provisioneringstype", + "auto": "Auto", + "wi-fi": "Wi-Fi", + "ble": "BLE", + "soft-ap": "Soft AP" }, "custom-action-function": "Brugerdefineret handlingsfunktion", "custom-pretty-function": "Brugerdefineret handling (med HTML-skabelon) funktion", @@ -6894,7 +7479,8 @@ "marker": "Markør", "polygon": "Polygon", "rectangle": "Rektangel", - "circle": "Cirkel" + "circle": "Cirkel", + "polyline": "Polylinje" }, "place-map-item": "Placér kortelement", "map-item-tooltip": { @@ -6906,7 +7492,9 @@ "continue-draw-polygon": "Fortsæt med at tegne polygon", "finish-draw-polygon": "Afslut tegning af polygon", "start-draw-circle": "Start med at tegne cirkel", - "finish-draw-circle": "Afslut tegning af cirkel" + "finish-draw-circle": "Afslut tegning af cirkel", + "start-draw-polyline": "Start tegning af polylinje", + "finish-draw-polyline": "Afslut tegning af polylinje" } }, "widgets-bundle": { @@ -7472,6 +8060,14 @@ "update-animation-delay": "Opdater animationsforsinkelse" }, "chart-axis": { + "limit": "Grænse", + "source": "Kilde", + "key-value": "Nøgle / Værdi", + "value-required": "Værdi er påkrævet.", + "entity-key-required": "Entitetsnøgle er påkrævet.", + "key-required": "Nøgle er påkrævet.", + "scale-limits": "Skalagrænser", + "scale-appearance": "Skalaudseende", "scale": "Skala", "scale-min": "min", "scale-max": "maks", @@ -8016,7 +8612,10 @@ "add-radio-option": "Tilføj radiomulighed", "radio-label-position": "Etiketposition", "radio-label-position-before": "Før", - "radio-label-position-after": "Efter" + "radio-label-position-after": "Efter", + "save-image": "Gem billede", + "save-to-gallery": "Gem automatisk optagne billeder i Billedgalleriet", + "public-image": "Gør billedet tilgængeligt for enhver uautoriseret bruger" }, "invalid-qr-code-text": "Ugyldig inputtekst til QR-kode. Input skal være af typen streng", "qr-code": { @@ -8311,7 +8910,8 @@ "trips": "Rejser", "markers": "Markører", "polygons": "Polygoner", - "circles": "Cirkler" + "circles": "Cirkler", + "polylines": "Polylinjer" }, "data-layer": { "source": "Kilde", @@ -8508,6 +9108,25 @@ "finish-circle-hint-with-entity": "Cirkel for '{{entityName}}': klik for at afslutte og gemme cirkel", "finish-circle-hint": "Cirkel: klik for at afslutte tegning" }, + "polyline": { + "polyline-key": "Polylinjenøgle", + "polyline-key-required": "Polylinjenøgle er påkrævet", + "no-polylines": "Ingen polylinjer konfigureret", + "add-polylines": "Tilføj polylinje", + "polyline-configuration": "Polylinjekonfiguration", + "remove-polyline": "Fjern polylinje", + "edit": "Rediger polylinje", + "cut": "Beskær polylinjeområde", + "rotate": "Rotér polylinje", + "remove-polyline-for": "Fjern polylinje for '{{entityName}}'", + "draw-polyline": "Tegn polylinje", + "polyline-place-first-point-hint-with-entity": "Polylinje for '{{entityName}}': klik for at placere første punkt", + "polyline-place-first-point-hint": "Polylinje: klik for at placere første punkt", + "finish-polyline-hint-with-entity": "Polylinje for '{{entityName}}': klik for at afslutte tegningen", + "finish-polyline-hint": "Polylinje: klik for at afslutte tegningen", + "polyline-place-first-point-cut-hint": "Klik for at placere første punkt", + "finish-polyline-cut-hint": "Klik på den første markør for at afslutte og gemme" + }, "select-entity": "Vælg enhed", "select-entity-hint": "Tip: klik på kortet efter valg for at angive position" }, @@ -8949,6 +9568,7 @@ "show-empty-space-hidden-action": "Vis tomt mellemrum i stedet for skjult cellehandling", "dont-reserve-space-hidden-action": "Reserver ikke plads til skjulte handlingsknapper", "display-timestamp": "Tidsstempel", + "timestamp-column-name": "Tidsstempel", "display-pagination": "Vis sidetal", "default-page-size": "Standard sidestørrelse", "page-step-settings": "Indstillinger for sidetrin", @@ -9010,7 +9630,9 @@ "alarm-column-error": "Mindst én alarmkolonne skal angives", "table-tabs": "Tabeller i faner", "show-cell-actions-menu-mobile": "Vis cellehandlingsmenu i mobiltilstand", - "disable-sorting": "Deaktiver sortering" + "disable-sorting": "Deaktiver sortering", + "sort-by": "Sortér faner efter", + "sort-timestamp-option": "Oprettelsestid" }, "latest-chart": { "total": "Total", @@ -9502,11 +10124,28 @@ "content": "

Ved at oprette dashboards til slutbrugere kan en kundebruger kun se sine egne enheder, mens data fra andre kunder skjules.

Følg dokumentationen for at lære, hvordan du gør det:

" } } + }, + "api-usage": { + "api-usage": "API-forbrug", + "label": "Etiket", + "state-name": "Tilstandsnavn", + "status": "Status", + "status-required": "Status er påkrævet.", + "limit": "Maks. grænse", + "limit-required": "Maks. grænse er påkrævet.", + "current-number": "Aktuelt antal", + "current-number-required": "Aktuelt antal er påkrævet.", + "add-key": "Tilføj nøgle", + "no-key": "Ingen nøgle", + "delete-key": "Slet nøgle", + "target-dashboard-state": "Mål-dashboardtilstand", + "go-to-main-state": "Gå til standardvisning" } }, "icon": { "icon": "Ikon", "icons": "Ikoner", + "custom": "Tilpasset", "select-icon": "Vælg ikon", "material-icons": "Materialeikoner", "show-all": "Vis alle ikoner", @@ -9547,6 +10186,7 @@ "items-per-page-separator": "af" }, "language": { + "auto": "Auto", "language": "Sprog" } } \ No newline at end of file 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 e22e4429c0..78a744a68d 100644 --- a/ui-ngx/src/assets/locale/locale.constant-de_DE.json +++ b/ui-ngx/src/assets/locale/locale.constant-de_DE.json @@ -78,6 +78,7 @@ "show-more": "Mehr anzeigen", "dont-show-again": "Nicht erneut anzeigen", "see-documentation": "Dokumentation ansehen", + "see-debug-events": "Debug-Ereignisse ansehen", "clear": "Löschen", "upload": "Hochladen", "delete-anyway": "Trotzdem löschen", @@ -167,10 +168,10 @@ "number-from-required": "Telefonnummer Von ist erforderlich.", "number-to": "Telefonnummer An", "number-to-required": "Telefonnummer An ist erforderlich.", - "phone-number-hint": "Telefonnummer im E.164-Format, z. B. +19995550123", - "phone-number-hint-twilio": "Telefonnummer im E.164-Format/SID der Telefonnummer/SID des Messaging-Dienstes, z. B. +19995550123/PNXXX/MGXXX", - "phone-number-pattern": "Ungültige Telefonnummer. Sollte im E.164-Format vorliegen, z. B. +19995550123.", - "phone-number-pattern-twilio": "Ungültige Telefonnummer. Sollte im E.164-Format/SID der Telefonnummer/SID des Messaging-Dienstes vorliegen, z. B. +19995550123/PNXXX/MGXXX.", + "phone-number-hint": "Telefonnummer im E.164-Format, z.B. +19995550123", + "phone-number-hint-twilio": "Telefonnummer im E.164-Format/SID der Telefonnummer/SID des Messaging-Dienstes, z.B. +19995550123/PNXXX/MGXXX", + "phone-number-pattern": "Ungültige Telefonnummer. Sollte im E.164-Format vorliegen, z.B. +19995550123.", + "phone-number-pattern-twilio": "Ungültige Telefonnummer. Sollte im E.164-Format/SID der Telefonnummer/SID des Messaging-Dienstes vorliegen, z.B. +19995550123/PNXXX/MGXXX.", "sms-message": "SMS-Nachricht", "sms-message-required": "SMS-Nachricht ist erforderlich.", "sms-message-max-length": "SMS-Nachricht darf nicht länger als 1600 Zeichen sein", @@ -485,6 +486,7 @@ "2fa": { "2fa": "Zwei-Faktor-Authentifizierung", "available-providers": "Verfügbare Anbieter", + "available-providers-required": "Mindestens ein 2FA-Anbieter muss konfiguriert werden.", "issuer-name": "Ausstellername", "issuer-name-required": "Ausstellername ist erforderlich.", "max-verification-failures-before-user-lockout": "Maximale Verifizierungsfehler vor Kontosperrung", @@ -513,7 +515,9 @@ "verification-message-template-required": "Nachrichtenvorlage ist erforderlich.", "within-time": "Innerhalb von (Sek.)", "within-time-pattern": "Zeit muss eine positive Ganzzahl sein.", - "within-time-required": "Zeit ist erforderlich." + "within-time-required": "Zeit ist erforderlich.", + "force-2fa": "Zwei-Faktor-Authentifizierung erzwingen", + "enforce-for": "Erzwingen für" }, "jwt": { "security-settings": "JWT-Sicherheitseinstellungen", @@ -545,16 +549,11 @@ "slack-settings": "Slack-Einstellungen", "mobile-settings": "Mobile Einstellungen", "firebase-service-account-file": "Firebase-Service-Konto-Anmeldeinformationen (JSON-Datei)", - "select-firebase-service-account-file": "Ziehen Sie Ihre Firebase-Service-Konto-Datei hierher oder ", - "trendz": "Trendz", - "trendz-settings": "Trendz-Einstellungen", - "trendz-url": "Trendz-URL", - "trendz-url-required": "Trendz-URL ist erforderlich", - "trendz-api-key": "Trendz-API-Schlüssel", - "trendz-enable": "Trendz aktivieren" + "select-firebase-service-account-file": "Ziehen Sie Ihre Firebase-Service-Konto-Datei hierher oder " }, "alarm": { "alarm": "Alarm", + "alarm-list": "Alarmliste", "alarms": "Alarme", "all-alarms": "Alle Alarme", "select-alarm": "Alarm auswählen", @@ -655,7 +654,16 @@ "alarm-type": "Alarmtyp", "enter-alarm-type": "Alarmtyp eingeben", "no-alarm-types-matching": "Keine Alarmtypen gefunden, die mit '{{entitySubtype}}' übereinstimmen.", - "alarm-type-list-empty": "Keine Alarmtypen ausgewählt." + "alarm-type-list-empty": "Keine Alarmtypen ausgewählt.", + "system-comments": { + "acked-by-user": "Alarm wurde von Benutzer {{userName}} bestätigt", + "cleared-by-user": "Alarm wurde von Benutzer {{userName}} gelöscht", + "assigned-to-user": "Alarm wurde von Benutzer {{userName}} Benutzer {{assigneeName}} zugewiesen", + "unassigned-to-user": "Zuweisung des Alarms wurde von Benutzer {{userName}} aufgehoben", + "unassigned-from-deleted-user": "Zuweisung des Alarms wurde aufgehoben, weil Benutzer {{userName}} gelöscht wurde", + "comment-deleted": "Benutzer {{userName}} hat seinen Kommentar gelöscht", + "severity-changed": "Alarmschweregrad wurde von {{oldSeverity}} auf {{newSeverity}} aktualisiert" + } }, "alarm-activity": { "add": "Kommentar hinzufügen...", @@ -760,6 +768,7 @@ "name-max-length": "Name sollte weniger als 256 Zeichen haben", "label-max-length": "Label sollte weniger als 256 Zeichen haben", "description": "Beschreibung", + "description-required": "Beschreibung ist erforderlich.", "type": "Typ", "type-required": "Typ ist erforderlich.", "details": "Details", @@ -873,6 +882,9 @@ "alarms-created-monthly-activity": "Monatliche Aktivität der Alarm-Erstellung", "data-points": "Datenpunkte", "data-points-storage-days": "Speicherzeitraum der Datenpunkte (in Tagen)", + "data-points-storage-days-hourly-activity": "Stichpunkt-Speichertage stündliche Aktivität", + "data-points-storage-days-daily-activity": "Stichpunkt-Speichertage tägliche Aktivität", + "data-points-storage-days-monthly-activity": "Stichpunkt-Speichertage monatliche Aktivität", "device-api": "Geräte-API", "email": "E-Mail", "email-messages": "E-Mail-Nachrichten", @@ -906,6 +918,7 @@ "rule-node": "Regelknoten", "sms": "SMS", "sms-messages": "SMS-Nachrichten", + "sms-messages-hourly-activity": "SMS-Nachrichten stündliche Aktivität", "sms-messages-daily-activity": "Tägliche Aktivität der SMS-Nachrichten", "sms-messages-monthly-activity": "Monatliche Aktivität der SMS-Nachrichten", "successful": "${entityName} Erfolgreich", @@ -915,13 +928,40 @@ "telemetry-persistence-hourly-activity": "Stündliche Aktivität der Telemetriepersistenz", "telemetry-persistence-monthly-activity": "Monatliche Aktivität der Telemetriepersistenz", "transport": "Transport", + "transport-msg-hourly-activity": "Transportnachrichten stündliche Aktivität", + "transport-msg-daily-activity": "Transportnachrichten tägliche Aktivität", + "transport-msg-monthly-activity": "Transportnachrichten monatliche Aktivität", "transport-daily-activity": "Tägliche Transportaktivität", "transport-data-points": "Transportierte Datenpunkte", - "transport-hourly-activity": "Stündliche Transportaktivität", - "transport-messages": "Transportnachrichten", - "transport-monthly-activity": "Monatliche Transportaktivität", + "transport-data-points-hourly-activity": "Transportdatenpunkte stündliche Aktivität", + "transport-data-points-daily-activity": "Transportdatenpunkte tägliche Aktivität", + "transport-data-points-monthly-activity": "Transportdatenpunkte monatliche Aktivität", "view-details": "Details anzeigen", - "view-statistics": "Statistiken anzeigen" + "view-statistics": "Statistiken anzeigen", + "transport-messages": "Transportnachrichten", + "transport-messages-hourly-activity": "Transportnachrichten stündliche Aktivität", + "transport-data-point-hourly-activity": "Transportdatenpunkt stündliche Aktivität", + "javascript-function-executions": "Ausführungen von JavaScript-Funktionen", + "javascript-function-executions-hourly-activity": "Ausführungen von JavaScript-Funktionen stündliche Aktivität", + "javascript-function-executions-daily-activity": "Ausführungen von JavaScript-Funktionen tägliche Aktivität", + "javascript-function-executions-monthly-activity": "Ausführungen von JavaScript-Funktionen monatliche Aktivität", + "tbel-function-executions": "Ausführungen von TBEL-Funktionen", + "tbel-function-executions-hourly-activity": "Ausführungen von TBEL-Funktionen stündliche Aktivität", + "tbel-function-executions-daily-activity": "Ausführungen von TBEL-Funktionen tägliche Aktivität", + "tbel-function-executions-monthly-activity": "Ausführungen von TBEL-Funktionen monatliche Aktivität", + "created-reports": "Erstellte Berichte", + "created-reports-hourly-activity": "Erstellte Berichte stündliche Aktivität", + "created-reports-daily-activity": "Erstellte Berichte tägliche Aktivität", + "created-reports-monthly-activity": "Erstellte Berichte monatliche Aktivität", + "emails": "E-Mails", + "emails-hourly-activity": "E-Mails stündliche Aktivität", + "emails-daily-activity": "E-Mails tägliche Aktivität", + "emails-monthly-activity": "E-Mails monatliche Aktivität", + "status": { + "enabled": "Aktiviert", + "disabled": "Deaktiviert", + "warning": "Warnung" + } }, "api-limit": { "cassandra-write-queries-core": "REST-API Cassandra-Schreibabfragen", @@ -946,6 +986,40 @@ "edge-uplink-messages": "Edge-Uplink-Nachrichten", "edge-uplink-messages-per-edge": "Edge-Uplink-Nachrichten pro Edge" }, + "api-key": { + "api-key": "API-Schlüssel", + "api-keys": "API-Schlüssel", + "delete-api-key-title": "Möchten Sie den API-Schlüssel '{{name}}' wirklich löschen?", + "delete-api-key-text": "Achtung, nach der Bestätigung kann der Schlüssel nicht wiederhergestellt werden.", + "delete-api-keys-title": "Möchten Sie { count, plural, =1 {1 API-Schlüssel} other {# API-Schlüssel} } wirklich löschen?", + "delete-api-keys-text": "Achtung, nach der Bestätigung können alle ausgewählten Schlüssel nicht wiederhergestellt werden.", + "expiration-date": "Ablaufdatum", + "date": "Datum", + "description": "Beschreibung", + "disable": "Deaktivieren", + "edit-description": "Beschreibung bearbeiten", + "enable": "API-Schlüssel aktivieren ", + "expiration-time": "Ablaufzeit", + "expiration-time-never": "Nie", + "expiration-time-custom": "Benutzerdefiniert", + "generate": "Generieren", + "generate-title": "API-Schlüssel generieren", + "generate-text": "Hinweis: Der API-Schlüssel übernimmt die Berechtigungen des Benutzers, für den er erstellt wird.", + "generated-api-key-title": "API-Schlüssel generiert. Lassen Sie uns die Verbindung prüfen!", + "generated-api-key-copy": "Stellen Sie sicher, dass Sie Ihren API-Schlüssel jetzt kopieren und speichern, da Sie ihn nicht erneut anzeigen können.", + "generated-api-key-command": "Verwenden Sie die folgenden Anweisungen, um die Verbindung zu prüfen. Als Ergebnis sollten Sie die aktuellen Benutzerinformationen erhalten:", + "generated-api-key-insecure-url": "Das Ausführen von Befehlen über eine unsichere HTTP-Verbindung sendet Ihren API-Schlüssel unverschlüsselt und macht ihn anfällig für Abfangen.", + "list": "{ count, plural, =1 {Ein API-Schlüssel} other {Liste von # API-Schlüsseln} }", + "manage": "Verwalten", + "manage-api-keys": "API-Schlüssel verwalten", + "no-found": "Keine API-Schlüssel gefunden", + "selected-api-keys": "{ count, plural, =1 {1 API-Schlüssel} other {# API-Schlüssel} } ausgewählt", + "search": "API-Schlüssel suchen", + "status": "Status", + "status-active": "Aktiv", + "status-inactive": "Inaktiv", + "status-expired": "Abgelaufen" + }, "audit-log": { "audit": "Audit", "audit-logs": "Audit-Protokolle", @@ -999,7 +1073,11 @@ "type-provision-failure": "Gerätebereitstellung fehlgeschlagen", "type-timeseries-updated": "Telemetrie aktualisiert", "type-timeseries-deleted": "Telemetrie gelöscht", - "type-sms-sent": "SMS gesendet" + "type-sms-sent": "SMS gesendet", + "any-type": "Beliebiger Typ", + "audit-log-filter-title": "Audit-Protokoll-Filter", + "filter-title": "Filter", + "filter-types": "Audit-Protokoll-Typen" }, "debug-settings": { "label": "Debug-Konfiguration", @@ -1020,12 +1098,25 @@ "selected-fields": "{ count, plural, =1 {1 berechnetes Feld} other {# berechnete Felder} } ausgewählt", "type": { "simple": "Einfach", - "script": "Skript" + "simple-hint": "Einfache arithmetische Berechnung basierend auf Eingabeargumenten.", + "script": "Skript", + "script-hint": "Berechnung über definierte Argumente mithilfe eines TBEL-Skripts.", + "geofencing": "Geofencing", + "geofencing-hint": "Auswertung der GPS-Position der Entität und von Übergängen gegenüber konfigurierten Geofencing-Zonengruppen.", + "propagation": "Weitergabe", + "propagation-hint": "Weitergabe von Daten an übergeordnete oder untergeordnete Entitäten basierend auf Beziehungsrichtung und -typ.", + "related-entities-aggregation": "Aggregation verwandter Entitäten", + "related-entities-aggregation-hint": "Aggregation der neuesten Daten aus verwandten Entitäten.", + "time-series-data-aggregation": "Aggregation von Zeitreihendaten", + "time-series-data-aggregation-hint": "Aggregation historischer Daten aus einer aktuellen Entität." }, + "preview": "Vorschau", "arguments": "Argumente", "decimals-by-default": "Standard-Dezimalstellen", "debugging": "Berechnetes Feld Debugging", + "calculated-field-details": "Details zum berechneten Feld", "argument-name": "Argumentname", + "name": "Name", "datasource": "Datenquelle", "add-argument": "Argument hinzufügen", "test-script-function": "Skriptfunktion testen", @@ -1037,8 +1128,9 @@ "argument-asset": "Asset", "argument-customer": "Kunde", "argument-tenant": "Aktueller Mandant", + "argument-owner": "Aktueller Eigentümer", + "argument-relation-query": "Verwandte Entitäten", "argument-type": "Argumenttyp", - "see-debug-events": "Debug-Ereignisse anzeigen", "attribute": "Attribut", "copy-argument-name": "Argumentnamen kopieren", "timeseries-key": "Zeitreihen-Schlüssel", @@ -1051,12 +1143,14 @@ "shared-attributes": "Geteilte Attribute", "attribute-key": "Attribut-Schlüssel", "default-value": "Standardwert", + "default-value-required": "Standardwert ist erforderlich.", "limit": "Maximale Werte", "time-window": "Zeitfenster", "customer-name": "Kundenname", "asset-name": "Asset-Name", "timeseries": "Zeitreihe", "output": "Ausgabe", + "output-hint": "Legt fest, wie die Ausgabe verarbeitet wird.", "create": "Neues berechnetes Feld erstellen", "file": "Berechnetes Feld-Datei", "invalid-file-error": "Ungültiges Dateiformat. Bitte stellen Sie sicher, dass die Datei eine gültige JSON-Datei ist.", @@ -1070,9 +1164,175 @@ "delete-multiple-text": "Vorsicht, nach der Bestätigung werden alle ausgewählten berechneten Felder entfernt und alle zugehörigen Daten unwiederbringlich gelöscht.", "test-with-this-message": "Mit dieser Nachricht testen", "use-latest-timestamp": "Letzten Zeitstempel verwenden", + "entity-coordinates": "Entitätskoordinaten", + "latitude-time-series-key": "Breitengrad-Zeitreihenschlüssel", + "latitude-time-series-key-required": "Breitengrad-Zeitreihenschlüssel ist erforderlich.", + "longitude-time-series-key": "Längengrad-Zeitreihenschlüssel", + "longitude-time-series-key-required": "Längengrad-Zeitreihenschlüssel ist erforderlich.", + "geofencing-zone-groups": "Geofencing-Zonengruppen", + "geofencing-zone-groups-settings": "Einstellungen der Geofencing-Zonengruppe", + "target-zone": "Zielzone", + "perimeter-key": "Umfangsschlüssel", + "report-strategy": "Meldestrategie", + "no-zone-configured": "Mindestens eine Zone ist erforderlich.", + "no-zone-configured-required": "Mindestens eine Zonengruppe muss konfiguriert werden.", + "add-zone-group": "Zonengruppe hinzufügen", + "report-transition-event-only": "Nur Übergangsereignisse", + "report-presence-status-only": "Nur Anwesenheitsstatus", + "report-transition-event-and-presence": "Anwesenheitsstatus und Übergangsereignisse", + "perimeter-attribute-key": "Umfangsattributschlüssel", + "perimeter-attribute-key-required": "Umfangsattributschlüssel ist erforderlich.", + "perimeter-attribute-key-pattern": "Umfangsattributschlüssel ist ungültig.", + "entity-zone-relationship": "Pfad von der Entität zu den Zonen", + "direction": "Beziehungsrichtung", + "direction-from": "Von der Entität zur Zone", + "direction-to": "Von der Zone zur Entität", + "relation-type": "Beziehungstyp", + "create-relation-with-matched-zones": "Beziehungen für die Quellentität mit übereinstimmenden Zonen erstellen", + "relation-level": "Beziehungsebene", + "fetch-last-available-level": "Nur letzte verfügbare Ebene abrufen", + "zone-group-refresh-interval": "Aktualisierungsintervall der Zonengruppen", + "copy-zone-group-name": "Name der Zonengruppe kopieren", + "open-details-page": "Detailseite der Entität öffnen", + "level": "Ebene", + "direction-level": "Richtung", + "direction-up": "Nach oben", + "direction-up-parent": "Nach oben zum übergeordneten Element", + "direction-down": "Nach unten", + "direction-down-child": "Nach unten zum untergeordneten Element", + "add-level": "Ebene hinzufügen", + "delete-level": "Ebene löschen", + "no-level": "Keine Ebene konfiguriert", + "levels-required": "Mindestens eine Ebene muss konfiguriert werden.", + "max-allowed-levels-error": "Beziehungsebene überschreitet das maximal Zulässige.", + "propagation-path-related-entities": "Weitergabepfad zu verwandten Entitäten", + "propagate-type": { + "arguments-only": "Nur Argumente", + "expression-result": "Berechnungsergebnis" + }, + "script": "Skript", + "data-propagate": "Weiterzugebende Daten", + "output-key": "Ausgabeschlüssel", + "copy-output-key": "Ausgabeschlüssel kopieren", + "aggregation-path-related-entities": "Aggregationspfad zu verwandten Entitäten", + "deduplication-interval": "Deduplizierungsintervall", + "deduplication-interval-min": "Deduplizierungsintervall muss mindestens {{ sec }} Sekunden betragen.", + "deduplication-interval-hint": "Mindestzeit zwischen Telemetrieaggregationen.", + "deduplication-interval-required": "Deduplizierungsintervall ist erforderlich.", + "calculated-field-filter-title": "Filter für berechnete Felder", + "filter-title": "Filter", + "calculated-field-types": "Typen berechneter Felder", + "events": "Ereignisse", + "any-type": "Beliebiger Typ", + "metrics": { + "metrics": "Metriken", + "metrics-empty": "Mindestens eine Metrik muss konfiguriert werden.", + "metric-name": "Metrikname", + "metric-name-required": "Metrikname ist erforderlich.", + "metric-name-pattern": "Metrikname ist ungültig.", + "metric-name-duplicate": "Eine Metrik mit diesem Namen existiert bereits.", + "metric-name-max-length": "Der Metrikname sollte kürzer als 256 Zeichen sein.", + "metric-name-forbidden": "Der Metrikname ist reserviert und kann nicht verwendet werden.", + "copy-metric-name": "Metrikname kopieren", + "argument-name": "Argumentname", + "aggregation": "Aggregation", + "aggregation-type": { + "avg": "Durchschnitt", + "min": "Minimum", + "max": "Maximum", + "sum": "Summe", + "count": "Anzahl", + "count-unique": "Eindeutige Anzahl" + }, + "filtered": "Gefiltert", + "value-source": "Wertquelle", + "value-source-hint": "Legt fest, wie der Wert für die Aggregation ermittelt wird.", + "value-source-type": { + "key": "Schlüssel", + "function": "Funktion" + }, + "no-metrics-configured": "Mindestens eine Metrik ist erforderlich.", + "add-metric": "Metrik hinzufügen", + "max-metrics": "Maximale Anzahl an Metriken erreicht.", + "metric-settings": "Metrikeinstellungen", + "filter": "Filter", + "filter-hint": "Aktiviert die Filterung von Entitäten während der Aggregation. Die Filterfunktion muss einen booleschen Wert zurückgeben und kann alle konfigurierten Argumente verwenden." + }, + "output-strategy": { + "strategy": "Strategie", + "process-right-away": "Sofort verarbeiten", + "process-rule-chains": "Über Regelketten verarbeiten", + "save-time-series": "In Zeitreihe speichern", + "save-database": "In Datenbank speichern", + "save-latest-values": "In neueste Werte speichern", + "send-web-sockets": "An WebSockets senden", + "save-calculated-fields": "An Berechnete Felder senden", + "update-attribute-only-on-value-change": "Attribut nur bei Wertänderung aktualisieren", + "send-attributes-updated-notification": "Benachrichtigung über aktualisierte Attribute senden", + "ttl": "Benutzerdefinierte TTL", + "ttl-required": "TTL ist erforderlich", + "ttl-min": "Als minimales TTL ist nur 0 zulässig", + "processing-parameters": "Verarbeitungsparameter", + "hint": { + "strategy": "Steuert, ob das Ergebnis sofort verarbeitet oder zur zusätzlichen Verarbeitung an eine Regelkette gesendet wird.", + "processing-options": "Verarbeitungsoptionen", + "update-attribute-only-on-value-change": "Aktualisiert das Attribut bei jeder eingehenden Nachricht, unabhängig davon, ob sich der Wert geändert hat. Dies erhöht die API-Nutzung und verringert die Performance.", + "update-attribute-only-on-value-change-enabled": "Aktualisiert das Attribut nur, wenn sich der Wert ändert. Wenn der Wert unverändert ist, werden Zeitstempel nicht aktualisiert und Benachrichtigungen nicht gesendet.", + "send-attributes-updated-notification": "Sendet ein Ereignis „Attribute aktualisiert“ an die Standard-Regelkette.", + "save-time-series": "Speichert Zeitreihendaten in der Tabelle ts_kv in der Datenbank.", + "save-database": "Speichert Attributdaten in der Datenbank.", + "save-latest-values": "Aktualisiert Zeitreihendaten in der Tabelle ts_kv_latest in der Datenbank, wenn der neue Wert aktueller ist.", + "send-web-sockets-attribute": "Benachrichtigt WebSocket-Abonnements über Aktualisierungen der Attributdaten.", + "send-web-sockets-time-series": "Benachrichtigt WebSocket-Abonnements über Aktualisierungen der Zeitreihendaten.", + "save-calculated-fields-attribute": "Benachrichtigt Berechnete Felder über Aktualisierungen der Attributdaten.", + "save-calculated-fields-time-series": "Benachrichtigt Berechnete Felder über Aktualisierungen der Zeitreihendaten.", + "ttl": "Definiert die Aufbewahrungsdauer für Zeitreihendaten. Wenn deaktiviert, wird die TTL des Mandantenprofils verwendet." + } + }, + "aggregate-interval-type": "Aggregationsintervalltyp", + "aggregate-interval-value": "Aggregationsintervallwert", + "aggregate-interval-value-required": "Aggregationsintervallwert ist erforderlich.", + "aggregate-interval-value-min": "Aggregationsintervallwert muss mindestens { sec, plural, =0 {0 Sekunde} =1 {1 Sekunde} other {# Sekunden} } betragen.", + "aggregate-interval-value-step-multiple-of": "Aggregationsintervallwert muss ein Teiler oder ein Vielfaches von 1 Tag sein.", + "aggregate-period": { + "hour": "Stunde", + "day": "Tag", + "week": "Woche (Mo - So)", + "week-sun-sat": "Woche (So - Sa)", + "month": "Monat", + "quarter": "Quartal", + "year": "Jahr", + "custom": "Benutzerdefiniert" + }, + "aggregate-period-hint-offset": "Ihr Aggregationsintervall wird sein: {{ interval }}", + "aggregate-period-hint-offset-and-so-on": "Ihr Aggregationsintervall wird sein: {{ interval }} und so weiter.", + "entity-aggregation": { + "argument-hint": "Daten werden von der aktuellen Entität abgerufen.", + "argument-title-hint": "Legt die für die Aggregation verwendeten Eingabeargumente fest.", + "argument-setting-hint": "Neueste Telemetrie ist der einzige verfügbare Argumenttyp für dieses berechnete Feld.", + "aggregation-interval": "Aggregationsintervall", + "aggregation-interval-hint": "Legt fest, wie oft die Aggregation durchgeführt wird. Beispiel: Alle 1 Stunde werden Daten um 00:00, 01:00, 02:00 usw. aggregiert. Aggregationsergebnisse werden mit dem Zeitstempel gespeichert, der dem Beginn des Aggregationsintervalls entspricht.", + "apply-offset": "Offset auf Aggregationsintervall anwenden", + "apply-offset-hint": "Legt fest, um wie viel der Beginn jeder Aggregationsperiode verschoben wird (z. B. +10 Minuten – 00:10, 01:10).", + "offset-value": "Offset-Wert", + "offset-value-required": "Offset-Wert ist erforderlich.", + "offset-value-min": "Offset-Wert muss eine positive ganze Zahl sein.", + "offset-value-max": "Offset-Wert sollte kleiner als der Aggregationsintervallwert sein.", + "wait-delay": "Await-Timeout für verzögerte Telemetrie anwenden", + "wait-delay-hint": "Legt fest, wie lange nach dem Ende des Intervalls auf verzögerte Telemetrie gewartet wird. Wenn solche Telemetrie eintrifft, wird das Ergebnis für dieses Intervall neu berechnet.", + "duration": "Dauer", + "duration-required": "Dauer ist erforderlich.", + "duration-min": "Dauer sollte mindestens 1 Minute betragen.", + "duration-hint": "Wie lange nach dem Ende des Intervalls auf verzögerte Daten gewartet wird.", + "produce-intermediate-result": "Zwischenergebnis erzeugen", + "produce-intermediate-result-hint": "Berechnet Metriken während des aktuellen Intervalls, um ein Zwischenergebnis zu erzeugen. Aktualisierungen erfolgen nicht häufiger als einmal alle {{ time }}." + }, "hint": { - "arguments-simple-with-rolling": "Einfacher Feldtyp darf keine Schlüssel mit Zeitreihen-Rollup-Typ enthalten.", - "arguments-empty": "Argumente dürfen nicht leer sein.", + "arguments-simple-with-rolling": "Ein berechnetes Feld vom Typ „Einfach“ sollte keine Schlüssel mit dem Zeitreihen-Rolling-Typ enthalten.", + "arguments-propagate-arguments-with-rolling": "Der Typ „Zeitreihen-Rolling“ ist nicht kompatibel mit der Weitergabe „Nur Argumente“.", + "arguments-propagate-argument-entity-type": "Der Entitätstyp ist nicht kompatibel mit der Weitergabe „Nur Argumente“.", + "arguments-propagate-argument-must-current-entity": "Mindestens ein Argument muss mit dem Quellentitätstyp „Aktuelle Entität“ konfiguriert werden.", + "arguments-empty": "Mindestens ein Argument sollte angegeben werden.", "expression-required": "Ausdruck ist erforderlich.", "expression-invalid": "Ausdruck ist ungültig", "expression-max-length": "Ausdruck sollte weniger als 255 Zeichen enthalten.", @@ -1081,12 +1341,218 @@ "argument-name-duplicate": "Ein Argument mit diesem Namen existiert bereits.", "argument-name-max-length": "Argumentname sollte weniger als 256 Zeichen enthalten.", "argument-name-forbidden": "Argumentname ist reserviert und darf nicht verwendet werden.", + "output-key-required": "Ausgabeschlüssel ist erforderlich.", + "output-key-pattern": "Ausgabeschlüssel ist ungültig.", + "output-key-duplicate": "Ein Schlüssel mit diesem Namen existiert bereits.", + "output-key-max-length": "Ausgabeschlüssel sollte kürzer als 256 Zeichen sein.", + "output-key-forbidden": "Ausgabeschlüssel ist reserviert und kann nicht verwendet werden.", + "entity-type-required": "Entitätstyp ist erforderlich", + "name-required": "Name ist erforderlich.", + "name-pattern": "Name ist ungültig.", + "name-duplicate": "Ein Name mit diesem Namen existiert bereits.", + "name-max-length": "Name sollte kürzer als 256 Zeichen sein.", + "name-forbidden": "Name ist reserviert und kann nicht verwendet werden.", "argument-type-required": "Argumenttyp ist erforderlich.", "max-args": "Maximale Anzahl an Argumenten erreicht.", "decimals-range": "Standard-Dezimalstellen sollten eine Zahl zwischen 0 und 15 sein.", "expression": "Standardausdruck demonstriert, wie eine Temperatur von Fahrenheit in Celsius umgewandelt wird.", "arguments-entity-not-found": "Zielentität des Arguments nicht gefunden.", - "use-latest-timestamp": "Wenn aktiviert, wird der berechnete Wert mit dem neuesten Zeitstempel aus der Telemetrie der Argumente gespeichert, anstatt mit der Serverzeit." + "use-latest-timestamp": "Wenn aktiviert, wird der berechnete Wert mit dem neuesten Zeitstempel aus der Telemetrie der Argumente gespeichert, anstatt mit der Serverzeit.", + "entity-coordinates": "Geben Sie die Zeitreihenschlüssel an, die die GPS-Koordinaten der Entität (Breitengrad und Längengrad) bereitstellen.", + "geofencing-zone-groups": "Definieren Sie eine oder mehrere Geofencing-Zonengruppen zur Prüfung (z. B. 'allowedZones', 'restrictedZones'). Jede Gruppe muss einen eindeutigen Namen haben, der als Präfix für Telemetrieschlüssel der Ausgabe des berechneten Feldes verwendet wird.", + "perimeter-attribute-key": "Legen Sie den Attributschlüssel fest, der die Definition des Geofencing-Zonenumfangs enthält. Der Umfang wird immer aus serverseitigen Attributen der Zonenentität übernommen.", + "report-strategy": "Der Anwesenheitsstatus meldet, ob sich die Entität aktuell INNERHALB oder AUSSERHALB der Zonengruppe befindet. Übergangsereignisse melden, wann die Entität die Zonengruppe BETRETEN oder VERLASSEN hat.", + "create-relation-with-matched-zones": "Erstellt und pflegt automatisch Beziehungen zwischen der Entität und den Zonen, in denen sie sich aktuell befindet. Beziehungen werden entfernt, wenn die Entität eine Zone verlässt, und erstellt, wenn sie eine neue betritt.", + "relation-type-required": "Beziehungstyp ist erforderlich.", + "relation-level-required": "Beziehungsebene ist erforderlich.", + "relation-level-min": "Der minimale Wert der Beziehungsebene ist 1.", + "relation-level-max": "Der maximale Wert der Beziehungsebene ist {{max}}.", + "geofencing-empty": "Mindestens eine Zonengruppe muss konfiguriert werden.", + "geofencing-entity-not-found": "Geofencing-Zielentität nicht gefunden.", + "max-geofencing-zone": "Maximale Anzahl an Geofencing-Zonen erreicht.", + "zone-group-refresh-interval": "Legt fest, wie oft Zonengruppen, die über verwandte Entitäten konfiguriert sind, aktualisiert werden.", + "zone-group-refresh-interval-required": "Aktualisierungsintervall der Zonengruppen ist erforderlich.", + "zone-group-refresh-interval-min": "Aktualisierungsintervall der Zonengruppe sollte mindestens {{ min }} Sekunden betragen.", + "propagation-path-related-entities": "Definiert einen direkten, einstufigen Pfad zu einer verwandten Entität basierend auf der ausgewählten Richtung und dem Beziehungstyp. Es werden nur Beziehungen zwischen Geräte-, Asset-, Kunden- und Mandantenentitäten unterstützt. Maximale Anzahl der über den Beziehungspfad aufgelösten Entitäten ist {{ max }}.", + "data-propagate": "Legt die Daten fest, die aus den unten konfigurierten Argumenten weitergegeben werden. 'Nur Argumente' verwendet die abgerufenen Daten direkt, während 'Berechnungsergebnis' aus diesen Daten einen neuen Wert berechnet.", + "aggregation-path-related-entities": "Definiert einen einstufigen Aggregationspfad über direkte Beziehungen zu übergeordneten oder untergeordneten Entitäten, basierend auf Richtung und Beziehungstyp. Es werden nur Beziehungen zwischen Geräte-, Asset-, Kunden- und Mandantenentitäten unterstützt. Maximale Anzahl der über den Beziehungspfad aufgelösten Entitäten ist {{ max }}.", + "arguments-aggregation": "Legt die Eingabeargumente fest, die für Filterung und Aggregation verwendet werden.", + "setting-arguments-aggregation": "Daten werden von verwandten Entitäten abgerufen, die im Aggregationspfad konfiguriert sind.", + "metrics": "Legt Metriken fest, die basierend auf konfigurierten Argumenten aggregiert werden.", + "entity-aggregation-metrics": "Legt Metriken fest, die basierend auf konfigurierten Argumenten über die angegebenen Zeitintervalle aggregiert werden.", + "import-invalid-calculated-field-type": "Berechnetes Feld kann nicht importiert werden: Ungültige Struktur des berechneten Feldes.", + "simple-expression-title": "Arithmetischer Ausdruck, der definiert, wie der berechnete Wert ermittelt wird.", + "script-title": "TBEL-Skript, das die Berechnungslogik und Ausgabewerte definiert.", + "simple-arguments": "Arithmetischer Ausdruck, der definiert, wie der berechnete Wert ermittelt wird.", + "script-arguments": "Legt die Eingabeargumente fest, die dem Skript zur Verfügung stehen." + } + }, + "alarm-rule": { + "alarm-rules-tab": "Alarmregeln", + "alarm-rule": "Alarmregel", + "alarm-rules": "Alarmregeln", + "alarm-rules-old": "Alt", + "alarm-rules-actual": "Aktuell", + "severities": "Schweregrade", + "cleared": "Löschbedingung", + "delete-title": "Möchten Sie die Alarmregel '{{title}}' wirklich löschen?", + "delete-text": "Achtung, nach der Bestätigung können die Alarmregel und alle zugehörigen Daten nicht wiederhergestellt werden.", + "delete-multiple-title": "Möchten Sie { count, plural, =1 {1 Alarmregel} other {# Alarmregeln} } wirklich löschen?", + "delete-multiple-text": "Achtung, nach der Bestätigung werden alle ausgewählten Alarmregeln entfernt und alle zugehörigen Daten können nicht wiederhergestellt werden.", + "create": "Neue Alarmregel erstellen", + "add": "Alarmregel hinzufügen", + "copy": "Alarmregelkonfiguration kopieren", + "details": "Details zur Alarmregel", + "no-found": "Keine Alarmregeln gefunden", + "list": "{ count, plural, =1 {Eine Alarmregel} other {Liste von # Alarmregeln} }", + "selected-fields": "{ count, plural, =1 {1 Alarmregel} other {# Alarmregeln} } ausgewählt", + "import": "Alarmregel importieren", + "file": "Alarmregeldatei", + "export": "Alarmregel exportieren", + "export-failed-error": "Alarmregel kann nicht exportiert werden: {{error}}", + "entity-type": "Entitätstyp", + "entity-type-required": "Entitätstyp ist erforderlich.", + "alarm-type": "Alarmtyp", + "alarm-type-hint": "Eindeutiger Bezeichner (z. B. HighTempAlarm) innerhalb des Gültigkeitsbereichs des Alarmerstellers (Gerät, Asset usw.), um Konflikte zu vermeiden.", + "alarm-type-required": "Alarmtyp ist erforderlich.", + "alarm-type-pattern": "Alarmtyp ist ungültig.", + "alarm-type-max-length": "Alarmtyp sollte kürzer als 256 Zeichen sein.", + "clear-alarm": "Alarm löschen", + "value-argument": "Argument", + "value-argument-required": "Argument ist erforderlich.", + "static-settings": "Statische Einstellungen", + "configuration": "Konfiguration", + "static-schedule": "Statisch", + "dynamic-schedule": "Dynamisch", + "operation-and": "UND", + "operation-or": "ODER", + "condition-during": "Während {{during}}", + "condition-during-dynamic": "Während \"{{ attribute }}\"", + "condition-repeat-times": "Wiederholt sich { count, plural, =1 {1 Mal} other {# Mal} }", + "condition-repeat-times-dynamic": "Wiederholt sich \"{{ attribute }}\"-mal", + "filter-preview": "Filtervorschau", + "condition-settings": "Bedingungseinstellungen", + "static": "Statisch", + "dynamic": "Dynamisch", + "argument-filters": "Argumentfilter", + "argument-name": "Argumentname", + "value-type": "Werttyp", + "general": "Allgemein", + "filters": "Filter", + "date-time-hint": "Das Argument muss in Epoch-Millisekunden angegeben werden. Beispiel: 1698839340000 entspricht 2023-11-01 12:49:00 UTC.", + "operation": "Operation", + "value-source": "Wertquelle", + "value": "Wert", + "ignore-case": "Groß-/Kleinschreibung ignorieren", + "condition": "Bedingung", + "script": "Skript", + "add-filter": "Argumentfilter hinzufügen", + "edit-filter": "Argumentfilter", + "remove-filter": "Argumentfilter entfernen", + "no-filter": "Mindestens ein Filter ist erforderlich.", + "conditions": { + "simple": "Einfach", + "duration": "Dauer", + "repeating": "Wiederholend" + }, + "schedule-title": "Zeitplan", + "edit-schedule": "Alarmzeitplan bearbeiten", + "schedule-type": "Zeitplanertyp", + "schedule-type-required": "Zeitplanertyp ist erforderlich.", + "schedule": { + "any-time": "Immer aktiv", + "specific-time": "Zu einer bestimmten Zeit aktiv", + "custom": "Benutzerdefiniert" + }, + "schedule-day": { + "monday": "Montag", + "tuesday": "Dienstag", + "wednesday": "Mittwoch", + "thursday": "Donnerstag", + "friday": "Freitag", + "saturday": "Samstag", + "sunday": "Sonntag" + }, + "schedule-days": "Tage", + "schedule-time": "Zeit", + "schedule-time-from": "Von", + "schedule-time-to": "Bis", + "schedule-days-of-week-required": "Mindestens ein Wochentag muss ausgewählt werden.", + "tbel": "TBEL", + "expression-type": { + "simple": "Einfach", + "script": "Skript" + }, + "operation-type": { + "and": "Und", + "or": "Oder" + }, + "filter-predicate-type": { + "string": "String", + "numeric": "Numerisch", + "boolean": "Boolesch", + "complex": "Komplex" + }, + "alarm-rule-additional-info": "Zusätzliche Informationen", + "edit-alarm-rule-additional-info": "Zusätzliche Informationen bearbeiten", + "alarm-rule-additional-info-placeholder": "Bitte geben Sie hier Ihre Kommentare und Anpassungen ein, um sie in den Alarmdetails unter „Zusätzliche Informationen“ anzuzeigen", + "alarm-rule-additional-info-hint": "Hinweis: Verwenden Sie ${Argumentname}, um Werte der Argumente zu ersetzen, die in der Alarmregelbedingung verwendet werden.", + "alarm-rule-additional-info-icon-hint": "Verwenden Sie den Argumentnamen, um Werte der Argumente zu ersetzen, die in der Alarmregelbedingung verwendet werden.", + "alarm-rule-mobile-dashboard": "Mobiles Dashboard", + "alarm-rule-mobile-dashboard-hint": "Wird von der mobilen Anwendung als Dashboard für Alarmdetails verwendet.", + "alarm-rule-no-mobile-dashboard": "Kein Dashboard ausgewählt", + "alarm-rule-condition": "Alarmregelbedingung", + "enter-alarm-rule-condition-prompt": "Bedingung hinzufügen", + "enter-alarm-rule-clear-condition-prompt": "Löschbedingung hinzufügen", + "edit-alarm-rule-condition": "Alarmbedingung", + "condition-type": "Bedingungstyp", + "condition-type-hint": "Die Optionen „Dauer“ und „Wiederholend“ sind nicht verfügbar, wenn im Filter die Operation „Missing for“ verwendet wird.", + "select-alarm-severity": "Alarmschweregrad auswählen", + "add-create-alarm-rule-prompt": "Mindestens eine Auslösebedingung ist erforderlich.", + "add-create-alarm-rule": "Auslösebedingung hinzufügen", + "add-clear-alarm-rule": "Löschbedingung hinzufügen", + "condition-duration": "Bedingungsdauer", + "condition-duration-value": "Dauerwert", + "condition-duration-time-unit": "Zeiteinheit", + "condition-duration-value-range": "Der Dauerwert muss im Bereich von 1 bis 2147483647 liegen.", + "condition-duration-value-pattern": "Der Dauerwert muss eine ganze Zahl sein.", + "condition-duration-value-required": "Dauerwert ist erforderlich.", + "condition-duration-time-unit-required": "Zeiteinheit ist erforderlich.", + "condition-repeating-value": "Anzahl der Ereignisse", + "condition-repeating-value-hint": "Die Aktualisierung eines beliebigen Alarmregelarguments wird als Ereignis gezählt", + "condition-repeating-value-range": "Die Anzahl der Ereignisse muss im Bereich von 1 bis 2147483647 liegen.", + "condition-repeating-value-pattern": "Die Anzahl der Ereignisse muss eine ganze Zahl sein.", + "condition-repeating-value-required": "Anzahl der Ereignisse ist erforderlich.", + "create-conditions": "Auslösebedingungen", + "clear-condition": "Löschbedingung", + "no-clear-alarm-rule": "Keine Löschbedingung konfiguriert.", + "advanced-settings": "Erweiterte Einstellungen", + "propagate-alarm": "Alarm an verwandte Entitäten weitergeben", + "alarm-rule-relation-types-list": "Beziehungstypen", + "alarm-rule-relation-types-list-hint": "Legt Beziehungstypen fest, um die verwandten Entitäten zu filtern. Wenn nicht festgelegt, wird der Alarm an alle verwandten Entitäten weitergegeben.", + "propagate-alarm-to-owner": "Alarm an den Entitätseigentümer weitergeben (Kunde oder Mandant)", + "propagate-alarm-to-tenant": "Alarm an den Mandanten weitergeben", + "alarm-rule-filter-title": "Alarmregel-Filter", + "filter-title": "Filter", + "debugging": "Alarmregel-Debugging", + "any-type": "Beliebiger Typ", + "enter-alarm-rule-type": "Alarmtyp eingeben", + "no-alarm-rule-types-matching": "Keine Alarmtypen gefunden, die zu '{{entitySubtype}}' passen.", + "alarm-rule-type-list-empty": "Keine Alarmtypen ausgewählt.", + "alarm-rule-type-list": "Liste der Alarmtypen", + "alarm-rule-entity-list": "Entitätsliste", + "missing-for": "fehlt seit", + "time-unit": "Einheit", + "mode": "Modus", + "type": "Typ", + "value-required": "Wert ist erforderlich.", + "min-value": "Wert muss 1 oder größer sein.", + "argument-in-use": "Argument wird als allgemeines Argument verwendet.", + "import-invalid-alarm-rule-type": "Alarmregel kann nicht importiert werden: Ungültige Alarmregelstruktur.", + "no-filter-preview": "Kein Filter angegeben", + "filter-operation": { + "and": "Und", + "or": "Oder" } }, "ai-models": { @@ -1193,6 +1659,7 @@ "contact": { "country": "Land", "country-required": "Land ist erforderlich.", + "country-object-required": "Bitte wählen Sie ein gültiges Land aus der Liste aus.", "city": "Stadt", "state": "Bundesland / Provinz", "postal-code": "PLZ / Postleitzahl", @@ -1229,6 +1696,8 @@ "documentation": "Dokumentation", "time-left": "{{time}} verbleibend", "output": "Ausgabe", + "sort-asc": "Aufsteigend", + "sort-desc": "Absteigend", "suffix": { "s": "s", "ms": "ms" @@ -1365,6 +1834,8 @@ "mobile-order": "Reihenfolge des Dashboards in mobiler App", "mobile-hide": "Dashboard in mobiler App ausblenden", "update-image": "Dashboard-Bild aktualisieren", + "update-new-version": "Neue Version hochladen", + "upload-file-to-update": "Datei zum Aktualisieren hochladen", "take-screenshot": "Screenshot erstellen", "select-widget-title": "Widget auswählen", "select-widget-value": "{{title}}: Widget auswählen", @@ -1733,6 +2204,8 @@ "bootstrap-tab": "Bootstrap-Client", "bootstrap-server": "Bootstrap-Server", "lwm2m-server": "LwM2M-Server", + "client-reboot": "Registrierungsupdate-Trigger", + "bootstrap-reboot": "Bootstrap-Anforderungs-Trigger", "client-publicKey-or-id": "Öffentlicher Client-Schlüssel oder ID", "client-publicKey-or-id-required": "Öffentlicher Client-Schlüssel oder ID ist erforderlich.", "client-publicKey-or-id-tooltip-psk": "Die PSK-Kennung ist eine beliebige PSK-Kennung bis zu 128 Byte, wie im Standard [RFC7925] beschrieben.\nDie PSK-Kennung MUSS zuerst in eine Zeichenkette umgewandelt und dann mittels UTF-8 in Oktetten codiert werden.", @@ -1780,7 +2253,6 @@ "unable-delete-device-alias-text": "Gerätealias '{{deviceAlias}}' kann nicht gelöscht werden, da er in folgenden Widgets verwendet wird:
{{widgetsList}}", "is-gateway": "Ist Gateway", "overwrite-activity-time": "Aktivitätszeit für verbundenes Gerät überschreiben", - "device-filter": "Gerätefilter", "device-filter-title": "Gerätefilter", "filter-title": "Filter", "device-state": "Gerätestatus", @@ -2234,7 +2706,8 @@ "short-id-required": "Kurze Server-ID ist erforderlich.", "short-id-range": "Kurze Server-ID sollte im Bereich von {{ min }} bis {{ max }} liegen.", "short-id-pattern": "Kurze Server-ID muss eine positive Ganzzahl sein.", - "lifetime": "Registrierungslebensdauer des Clients", + "short-id-pattern-bs": "Kurze Server-ID darf nur null sein", + "lifetime": "Lebensdauer der Client-Registrierung", "lifetime-required": "Registrierungslebensdauer des Clients ist erforderlich.", "lifetime-pattern": "Registrierungslebensdauer muss eine positive Ganzzahl sein.", "default-min-period": "Minimale Periode zwischen zwei Benachrichtigungen (s)", @@ -2328,7 +2801,9 @@ "composite-all-description": "Alle Ressourcen werden mit einer einzigen zusammengefassten Beobachtungsanfrage überwacht (effizienter, weniger flexibel)", "composite-by-object": "Nach Objekten zusammengefasst", "composite-by-object-description": "Ressourcen werden nach Objekttyp gruppiert und mit separaten zusammengefassten Beobachtungsanfragen überwacht (ausgewogener Ansatz)" - } + }, + "init-attr-tel-as-obs-strategy": "Attribute und Telemetrie mithilfe der Observe-Strategie initialisieren", + "init-attr-tel-as-obs-strategy-hint": "Wenn false – werden Attribute und Telemetrie initialisiert, indem ihre Werte einzeln gelesen werden.\\nWenn true – werden Attribute und Telemetrie initialisiert, indem ihre Werte über die Observe-Strategie abonniert werden." }, "snmp": { "add-communication-config": "Kommunikationskonfiguration hinzufügen", @@ -2644,6 +3119,8 @@ "type-rulenodes": "Regelknoten", "list-of-rulenodes": "{ count, plural, =1 {Ein Regelknoten} other {Liste von # Regelknoten} }", "rulenode-name-starts-with": "Regelknoten, deren Name mit '{{prefix}}' beginnt", + "type-api-key": "API-Schlüssel", + "type-api-keys": "API-Schlüssel", "type-current-customer": "Aktueller Kunde", "type-current-tenant": "Aktueller Tenant", "type-current-user": "Aktueller Benutzer", @@ -2665,6 +3142,7 @@ "details": "Entitätsdetails", "no-entities-prompt": "Keine Entitäten gefunden", "no-data": "Keine Daten zur Anzeige vorhanden", + "show-all-columns": "Alle anzeigen", "columns-to-display": "Anzuzeigende Spalten", "type-api-usage-state": "API-Nutzungsstatus", "type-edge": "Edge", @@ -2710,7 +3188,15 @@ "list-of-mobile-apps": "{ count, plural, =1 {Eine mobile Anwendung} other {Liste von # mobilen Anwendungen} }", "type-mobile-app-bundle": "Mobile-Bundle", "type-mobile-app-bundles": "Mobile-Bundles", - "list-of-mobile-app-bundles": "{ count, plural, =1 {Ein Mobile-Bundle} other {Liste von # Mobile-Bundles} }" + "list-of-mobile-app-bundles": "{ count, plural, =1 {Ein Mobile-Bundle} other {Liste von # Mobile-Bundles} }", + "limit-reached": "Limit erreicht", + "limit-reached-text": "Sie haben das Limit von {{ entities }} erreicht. Um weitere hinzuzufügen, bitten Sie bitte Ihren Systemadministrator, Ihr {{ entity }}-Limit zu erhöhen.", + "request-limit-increase": "Limiterhöhung anfordern", + "request-sysadmin-text": "Sind Sie der Systemadministrator?", + "login-here": "Hier anmelden", + "to-increase-limit": "um das Limit zu erhöhen.", + "increase-limit-request-sent-title": "Wir haben eine automatische Anfrage an Ihren Systemadministrator gesendet, um das Limit zu erhöhen", + "increase-limit-request-sent-text": "Bitte geben Sie ihm etwas Zeit, die Anfrage zu prüfen und die Einstellungen zu aktualisieren. Möglicherweise müssen Sie diese Seite aktualisieren, um die Änderungen zu sehen." }, "entity-field": { "created-time": "Erstellungszeit", @@ -3060,7 +3546,7 @@ "edit": "Filter bearbeiten", "name": "Filtername", "name-required": "Filtername ist erforderlich.", - "duplicate-filter": "Ein Filter mit demselben Namen ist bereits vorhanden.", + "duplicate-filter": "Ein Filter mit demselben Namen existiert bereits.", "filters": "Filter", "unable-delete-filter-title": "Filter kann nicht gelöscht werden", "unable-delete-filter-text": "Filter '{{filter}}' kann nicht gelöscht werden, da er von folgendem/n Widget(s) verwendet wird:
{{widgetsList}}", @@ -3787,6 +4273,7 @@ "two-factor-authentication": "Zwei-Faktor-Authentifizierung", "passwords-mismatch-error": "Die eingegebenen Passwörter müssen übereinstimmen!", "password-again": "Passwort wiederholen", + "sign-in": "Bitte anmelden", "username": "Benutzername (E-Mail)", "remember-me": "Angemeldet bleiben", "forgot-password": "Passwort vergessen?", @@ -3797,7 +4284,8 @@ "password-link-sent-message": "Link zum Zurücksetzen wurde gesendet", "email": "E-Mail", "invalid-email-format": "Ungültiges E-Mail-Format.", - "login-with": "Anmelden mit {{name}}", + "sign-in-with": "Anmelden mit {{name}}", + "sign-in-to-your-account": "Bei Ihrem Konto anmelden", "or": "oder", "error": "Anmeldefehler", "verify-your-identity": "Identität bestätigen", @@ -3816,7 +4304,51 @@ "activation-link-expired": "Aktivierungslink ist abgelaufen", "activation-link-expired-message": "Der Link zur Aktivierung Ihres Profils ist abgelaufen. Sie können zur Anmeldeseite zurückkehren, um eine neue E-Mail zu erhalten.", "reset-password-link-expired": "Link zum Zurücksetzen des Passworts ist abgelaufen", - "reset-password-link-expired-message": "Der Link zum Zurücksetzen Ihres Passworts ist abgelaufen. Sie können zur Anmeldeseite zurückkehren, um eine neue E-Mail zu erhalten." + "reset-password-link-expired-message": "Der Link zum Zurücksetzen Ihres Passworts ist abgelaufen. Sie können zur Anmeldeseite zurückkehren, um eine neue E-Mail zu erhalten.", + "two-fa": "Zwei-Faktor-Authentifizierung", + "two-fa-required": "Zwei-Faktor-Authentifizierung ist erforderlich", + "set-up-verification-method": "Richten Sie eine Verifizierungsmethode ein, um fortzufahren", + "set-up-verification-method-login": "Richten Sie eine Verifizierungsmethode ein oder melden Sie sich an", + "enable-authenticator-app": "Authenticator-App aktivieren", + "enable-authenticator-app-description": "Bitte geben Sie den Sicherheitscode aus Ihrer Authenticator-App ein", + "enable-authenticator-sms": "SMS-Authenticator aktivieren", + "enable-authenticator-sms-description": "Geben Sie den 6-stelligen Code ein, den wir gerade gesendet haben an ", + "enable-authenticator-email": "E-Mail-Authenticator aktivieren", + "enable-authenticator-email-description": "Ein Sicherheitscode wurde an Ihre E-Mail-Adresse gesendet an ", + "enter-key-manually": "oder geben Sie diesen 32-stelligen Schlüssel manuell ein:", + "continue": "Weiter", + "confirm": "Bestätigen", + "authenticator-app-success": "Authenticator-App erfolgreich aktiviert", + "authenticator-app-success-description": "Beim nächsten Anmelden müssen Sie einen Code zur Zwei-Faktor-Authentifizierung angeben", + "authenticator-sms-success": "SMS-Authenticator erfolgreich aktiviert", + "authenticator-sms-success-description": "Beim nächsten Anmelden werden Sie aufgefordert, den Sicherheitscode einzugeben, der an die Telefonnummer gesendet wird", + "authenticator-email-success": "E-Mail-Authenticator erfolgreich aktiviert", + "authenticator-email-success-description": "Beim nächsten Anmelden werden Sie aufgefordert, den Sicherheitscode einzugeben, der an Ihre E-Mail-Adresse gesendet wird", + "authenticator-backup-code-success": "Backup-Code erfolgreich aktiviert", + "authenticator-backup-code-success-description": "Beim nächsten Anmelden werden Sie aufgefordert, den Sicherheitscode einzugeben oder einen der Backup-Codes zu verwenden.", + "add-verification-method": "Verifizierungsmethode hinzufügen", + "get-backup-code": "Backup-Code abrufen", + "copy-key": "Schlüssel kopieren", + "send-code": "Code senden", + "email-label": "E-Mail", + "email-description": "Geben Sie eine E-Mail-Adresse ein, die Sie als Authenticator verwenden möchten.", + "sms-description": "Geben Sie eine Telefonnummer ein, die Sie als Authenticator verwenden möchten.", + "backup-code-description": "Drucken Sie die Codes aus, damit Sie sie griffbereit haben, wenn Sie sie zum Anmelden bei Ihrem Konto benötigen. Sie können jeden Backup-Code einmal verwenden.", + "backup-code-warn": "Sobald Sie diese Seite verlassen, können diese Codes nicht erneut angezeigt werden. Bewahren Sie sie sicher auf, indem Sie die folgenden Optionen verwenden.", + "download-txt": "Herunterladen (txt)", + "print": "Drucken", + "verification-code": "6-stelliger Code", + "verification-code-invalid": "Ungültiges Format des Verifizierungscodes", + "verification-code-incorrect": "Verifizierungscode ist falsch", + "verification-code-many-request": "Zu viele Anfragen zur Prüfung des Verifizierungscodes", + "scan-qr-code": "Scannen Sie diesen QR-Code mit Ihrer Verifizierungs-App", + "phone-input": { + "phone-input-label": "Telefonnummer", + "phone-input-required": "Telefonnummer ist erforderlich", + "phone-input-validation": "Telefonnummer ist ungültig oder nicht möglich", + "phone-input-pattern": "Ungültige Telefonnummer. Muss im E.164-Format sein, z. B. {{phoneNumber}}", + "phone-input-hint": "Telefonnummer im E.164-Format, z. B. {{phoneNumber}}" + } }, "mobile": { "add-application": "Anwendung hinzufügen", @@ -4184,6 +4716,7 @@ "api-usage-limit": "API-Nutzungslimit", "device-activity": "Geräteaktivität", "entities-limit": "Entitätenlimit", + "entities-limit-increase-request": "Anfrage zur Erhöhung des Entitätenlimits", "entity-action": "Entitätsaktion", "general": "Allgemein", "rule-engine-lifecycle-event": "Lebenszyklusereignis der Rule Engine", @@ -4401,6 +4934,12 @@ "at-least": "Mindestens:", "character": "{ count, plural, =1 {1 Zeichen} other {# Zeichen} }", "digit": "{ count, plural, =1 {1 Ziffer} other {# Ziffern} }", + "password-tooltip-min-length": "Mindestens {{minimumLength}} Zeichen lang", + "password-tooltip-max-length": "Höchstens {{maximumLength}} Zeichen lang", + "password-tooltip-uppercase": "{{minimumUppercaseLetters}} Großbuchstabe", + "password-tooltip-lowercase": "{{minimumLowercaseLetters}} Kleinbuchstabe", + "password-tooltip-digit": "{{minimumDigits}} Zahl", + "password-tooltip-special-characters": "{{minimumSpecialCharacters}} Sonderzeichen", "incorrect-password-try-again": "Falsches Passwort. Bitte versuchen Sie es erneut", "lowercase-letter": "{ count, plural, =1 {1 Kleinbuchstabe} other {# Kleinbuchstaben} }", "new-passwords-not-match": "Die neuen Passwörter stimmen nicht überein", @@ -4459,7 +4998,8 @@ "additional-info": "Zusätzliche Informationen (JSON)", "invalid-additional-info": "Zusätzliche Info-JSON kann nicht geparst werden.", "no-relations-text": "Keine Beziehungen gefunden", - "not": "Nicht" + "not": "Nicht", + "copy-type": "Typ kopieren" }, "resource": { "add": "Ressource hinzufügen", @@ -5410,7 +5950,7 @@ "time-series": "Zeitreihe", "latest": "Neueste Werte", "web-sockets": "WebSockets", - "calculated-fields": "Berechnete Felder" + "calculated-fields-and-alarm-rules": "Berechnete Felder und Alarmregeln" }, "save-attribute": { "processing-settings": "Verarbeitungseinstellungen", @@ -5605,7 +6145,8 @@ "bad-request-params": "Ungültige Anfrageparameter", "item-not-found": "Element nicht gefunden", "too-many-requests": "Zu viele Anfragen", - "too-many-updates": "Zu viele Aktualisierungen" + "too-many-updates": "Zu viele Aktualisierungen", + "entities-limit-exceeded": "Entitätenlimit überschritten" }, "tenant": { "tenant": "Mieter", @@ -5743,6 +6284,27 @@ "max-arguments-per-cf": "Maximale Argumente pro berechnetem Feld", "max-arguments-per-cf-range": "Maximale Argumente pro berechnetem Feld dürfen nicht negativ sein", "max-arguments-per-cf-required": "Maximale Argumente pro berechnetem Feld sind erforderlich", + "max-related-level-per-argument": "Maximale Beziehungsebene pro Argument „Verwandte Entitäten“", + "max-related-level-per-argument-range": "Die maximale Beziehungsebene pro Argument „Verwandte Entitäten“ darf nicht kleiner als „1“ sein", + "max-related-level-per-argument-required": "Die maximale Beziehungsebene pro Argument „Verwandte Entitäten“ ist erforderlich", + "min-allowed-scheduled-update-interval": "Minimal zulässiges Aktualisierungsintervall für Argumente „Verwandte Entitäten“ (Sekunden)", + "min-allowed-scheduled-update-interval-range": "Der Mindestwert für das minimal zulässige Aktualisierungsintervall darf nicht negativ sein", + "min-allowed-deduplication-interval": "Minimal zulässiges Deduplizierungsintervall (Sekunden)", + "min-allowed-deduplication-interval-range": "Der Wert des minimal zulässigen Deduplizierungsintervalls darf nicht negativ sein", + "min-allowed-deduplication-interval-required": "Minimal zulässiges Deduplizierungsintervall ist erforderlich", + "intermediate-aggregation-interval": "Intermediäres Aggregationsintervall (Sekunden)", + "intermediate-aggregation-interval-range": "Der Wert des intermediären Aggregationsintervalls darf nicht kleiner als „1“ sein", + "intermediate-aggregation-interval-required": "Intermediäres Aggregationsintervall ist erforderlich", + "reevaluation-check-interval": "Intervall für Neubewertungsprüfung (Sekunden)", + "reevaluation-check-interval-range": "Der Wert des Intervalls für die Neubewertungsprüfung darf nicht kleiner als „1“ sein", + "reevaluation-check-interval-required": "Intervall für Neubewertungsprüfung ist erforderlich", + "alarms-reevaluation-interval": "Intervall für Alarmneubewertung (Sekunden)", + "alarms-reevaluation-interval-range": "Der Wert des Intervalls für Alarmneubewertung darf nicht kleiner als „1“ sein", + "alarms-reevaluation-interval-required": "Intervall für Alarmneubewertung ist erforderlich", + "min-allowed-aggregation-interval": "Minimal zulässiges Aggregationsintervall (Sekunden)", + "min-allowed-aggregation-interval-range": "Der Wert des minimal zulässigen Aggregationsintervalls darf nicht negativ sein", + "min-allowed-aggregation-interval-required": "Minimal zulässiges Aggregationsintervall ist erforderlich", + "min-allowed-scheduled-update-interval-required": "Der Mindestwert für das minimal zulässige Aktualisierungsintervall ist erforderlich", "max-state-size": "Maximale Zustandsgröße in KB", "max-state-size-range": "Maximale Zustandsgröße darf nicht negativ sein", "max-state-size-required": "Maximale Zustandsgröße ist erforderlich", @@ -5818,6 +6380,10 @@ "ws-limit-max-subscriptions-per-regular-user": "Maximale Abonnements pro normalem Benutzer", "ws-limit-max-subscriptions-per-public-user": "Maximale Abonnements pro öffentlichem Benutzer", "ws-limit-updates-per-session": "WebSocket-Aktualisierungen pro Sitzung", + "relation-search-entity-limit": "Entitätslimit für Beziehungssuche", + "relation-search-entity-limit-hint": "Begrenzt die Anzahl der Entitäten, die auf der letzten Ebene des Beziehungspfads aufgelöst werden. Gilt für Argumente „Verwandte Entitäten“ und Weitergabefelder.", + "relation-search-entity-limit-required": "Entitätslimit für Beziehungssuche ist erforderlich", + "relation-search-entity-limit-range": "Entitätslimit für Beziehungssuche darf nicht kleiner als „1“ sein", "rate-limits": { "add-limit": "Limit hinzufügen", "and-also-less-than": "und außerdem kleiner als", @@ -6003,7 +6569,9 @@ "default-agg-interval": "Standard-Gruppierungsintervall", "edit-intervals-list-hint": "Liste verfügbarer Intervalloptionen kann angegeben werden.", "edit-grouping-intervals-list-hint": "Gruppierungsintervallliste und Standardintervall konfigurierbar.", - "all": "Alle" + "all": "Alle", + "save-current-settings-as-default": "Aktuelle Einstellungen als Standard-Zeitfenster speichern", + "hide-option-from-end-users": "Option vor Endbenutzern ausblenden" }, "tooltip": { "trigger": "Auslöser", @@ -6657,7 +7225,8 @@ "export-relations": "Beziehungen exportieren", "export-attributes": "Attribute exportieren", "export-credentials": "Zugangsdaten exportieren", - "export-calculated-fields": "Berechnete Felder exportieren", + "export-calculated-fields": "Berechnete Felder \nund Alarmregeln exportieren", + "export-alarm-rules": "Alarmregeln exportieren", "entity-versions": "Entitätsversionen", "versions": "Versionen", "created-time": "Erstellungszeit", @@ -6675,6 +7244,7 @@ "load-attributes": "Attribute laden", "load-credentials": "Zugangsdaten laden", "load-calculated-fields": "Berechnete Felder laden", + "load-alarm-rules": "Alarmregeln laden", "compare-with-current": "Mit aktueller vergleichen", "diff-entity-with-version": "Unterschiede mit Entitätsversion '{{versionName}}'", "previous-difference": "Vorheriger Unterschied", @@ -6884,7 +7454,23 @@ "scan-qr-code": "QR-Code scannen", "make-phone-call": "Anruf tätigen", "get-location": "Standort des Telefons abrufen", - "take-screenshot": "Screenshot erstellen" + "take-screenshot": "Screenshot erstellen", + "handle-provision-success-function": "Funktion zum Verarbeiten eines erfolgreichen Provisionings", + "get-location-function": "Funktion zum Abrufen des Standorts", + "process-launch-result-function": "Funktion zum Verarbeiten des Start-Ergebnisses", + "get-phone-number-function": "Funktion zum Abrufen der Telefonnummer", + "process-image-function": "Funktion zum Verarbeiten des Bildes", + "process-qr-code-function": "Funktion zum Verarbeiten des QR-Codes", + "process-location-function": "Funktion zum Verarbeiten des Standorts", + "handle-empty-result-function": "Funktion zum Verarbeiten eines leeren Ergebnisses", + "handle-error-function": "Funktion zum Verarbeiten eines Fehlers", + "handle-non-mobile-fallback-function": "Fallback-Funktion für Nicht-Mobile", + "save-to-gallery": "In Galerie speichern", + "provision-type": "Provisioning-Typ", + "auto": "Auto", + "wi-fi": "WLAN", + "ble": "BLE", + "soft-ap": "Soft AP" }, "custom-action-function": "Benutzerdefinierte Aktionsfunktion", "custom-pretty-function": "Benutzerdefinierte Aktion (mit HTML-Vorlage) Funktion", @@ -6893,7 +7479,8 @@ "marker": "Markierung", "polygon": "Polygon", "rectangle": "Rechteck", - "circle": "Kreis" + "circle": "Kreis", + "polyline": "Polylinie" }, "place-map-item": "Kartenelement platzieren", "map-item-tooltip": { @@ -6905,7 +7492,9 @@ "continue-draw-polygon": "Polygon weiterzeichnen", "finish-draw-polygon": "Polygonzeichnen beenden", "start-draw-circle": "Kreis zeichnen starten", - "finish-draw-circle": "Kreiszeichnen beenden" + "finish-draw-circle": "Kreiszeichnen beenden", + "start-draw-polyline": "Polylinie zeichnen starten", + "finish-draw-polyline": "Polylinie zeichnen abschließen" } }, "widgets-bundle": { @@ -7471,7 +8060,15 @@ "update-animation-delay": "Verzögerung der Aktualisierungsanimation" }, "chart-axis": { - "scale": "Skalierung", + "limit": "Limit", + "source": "Quelle", + "key-value": "Schlüssel / Wert", + "value-required": "Wert ist erforderlich.", + "entity-key-required": "Entitätsschlüssel ist erforderlich.", + "key-required": "Schlüssel ist erforderlich.", + "scale-limits": "Skalengrenzen", + "scale-appearance": "Skalendesign", + "scale": "Skala", "scale-min": "min", "scale-max": "max", "scale-auto": "Auto" @@ -8015,19 +8612,22 @@ "add-radio-option": "Optionsfeldoption hinzufügen", "radio-label-position": "Labelposition", "radio-label-position-before": "Vorher", - "radio-label-position-after": "Nachher" + "radio-label-position-after": "Nachher", + "save-image": "Bild speichern", + "save-to-gallery": "Aufgenommene Bilder automatisch in der Bildergalerie speichern", + "public-image": "Macht das Bild für jeden nicht autorisierten Benutzer verfügbar" }, "invalid-qr-code-text": "Ungültiger Eingabetext für QR-Code. Eingabe sollte vom Typ String sein", "qr-code": { "use-qr-code-text-function": "QR-Code-Textfunktion verwenden", - "qr-code-text-pattern": "QR-Code-Textmuster (z. B. '${entityName} | ${keyName} - ein Text.')", + "qr-code-text-pattern": "QR-Code-Textmuster (z.B. '${entityName} | ${keyName} - ein Text.')", "qr-code-text-pattern-hint": "QR-Code-Textmuster verwendet den Wert des zuerst gefundenen Schlüssels in den Entitäten im Entitätsalias.", "qr-code-text-pattern-required": "QR-Code-Textmuster ist erforderlich.", "qr-code-text-function": "QR-Code-Textfunktion" }, "label-widget": { "label-pattern": "Muster", - "label-pattern-hint": "Hinweis: z. B. 'Text ${keyName} Einheiten.' oder ${#<key index>} Einheiten", + "label-pattern-hint": "Hinweis: z.B. 'Text ${keyName} Einheiten.' oder ${#<key index>} Einheiten", "label-pattern-required": "Muster ist erforderlich", "label-position": "Position (Prozent relativ zum Hintergrund)", "x-pos": "X", @@ -8310,7 +8910,8 @@ "trips": "Reisen", "markers": "Marker", "polygons": "Polygone", - "circles": "Kreise" + "circles": "Kreise", + "polylines": "Polylinien" }, "data-layer": { "source": "Quelle", @@ -8507,8 +9108,27 @@ "finish-circle-hint-with-entity": "Kreis für '{{entityName}}': Klicken, um Kreis zu beenden und zu speichern", "finish-circle-hint": "Kreis: Klicken, um Zeichnung zu beenden" }, + "polyline": { + "polyline-key": "Polylinienschlüssel", + "polyline-key-required": "Polylinienschlüssel ist erforderlich", + "no-polylines": "Keine Polylinien konfiguriert", + "add-polylines": "Polylinie hinzufügen", + "polyline-configuration": "Polylinienkonfiguration", + "remove-polyline": "Polylinie entfernen", + "edit": "Polylinie bearbeiten", + "cut": "Polylinienbereich ausschneiden", + "rotate": "Polylinie drehen", + "remove-polyline-for": "Polylinie für '{{entityName}}' entfernen", + "draw-polyline": "Polylinie zeichnen", + "polyline-place-first-point-hint-with-entity": "Polylinie für '{{entityName}}': Klicken, um den ersten Punkt zu setzen", + "polyline-place-first-point-hint": "Polylinie: Klicken, um den ersten Punkt zu setzen", + "finish-polyline-hint-with-entity": "Polylinie für '{{entityName}}': Klicken, um das Zeichnen abzuschließen", + "finish-polyline-hint": "Polylinie: Klicken, um das Zeichnen abzuschließen", + "polyline-place-first-point-cut-hint": "Klicken, um den ersten Punkt zu setzen", + "finish-polyline-cut-hint": "Klicken Sie auf den ersten Marker, um abzuschließen und zu speichern" + }, "select-entity": "Entität auswählen", - "select-entity-hint": "Hinweis: Nach Auswahl auf die Karte klicken, um Position festzulegen" + "select-entity-hint": "Hinweis: Nach der Auswahl auf die Karte klicken, um die Position festzulegen" }, "select-entity": "Entität auswählen", "select-entity-hint": "Hinweis: Nach der Auswahl auf die Karte klicken, um die Position festzulegen", @@ -8948,6 +9568,7 @@ "show-empty-space-hidden-action": "Leeren Platz anstelle der versteckten Zellaktion anzeigen", "dont-reserve-space-hidden-action": "Keinen Platz für versteckte Aktionsschaltflächen reservieren", "display-timestamp": "Zeitstempel anzeigen", + "timestamp-column-name": "Zeitstempel", "display-pagination": "Seitennummerierung anzeigen", "default-page-size": "Standard-Seitengröße", "page-step-settings": "Seitenschritteinstellungen", @@ -9009,7 +9630,9 @@ "alarm-column-error": "Mindestens eine Alarmspalte muss angegeben werden", "table-tabs": "Tabellen-Tabs", "show-cell-actions-menu-mobile": "Zellenaktions-Dropdownmenü im mobilen Modus anzeigen", - "disable-sorting": "Sortierung deaktivieren" + "disable-sorting": "Sortierung deaktivieren", + "sort-by": "Tabs sortieren nach", + "sort-timestamp-option": "Erstellungszeit" }, "latest-chart": { "total": "Gesamt", @@ -9501,11 +10124,28 @@ "content": "

Durch die Erstellung von Dashboards für Endbenutzer kann ein Kundenbenutzer nur seine eigenen Geräte sehen, während Daten anderer Kunden verborgen bleiben.

Folgen Sie der Dokumentation, um zu erfahren, wie es geht:

" } } + }, + "api-usage": { + "api-usage": "API-Nutzung", + "label": "Label", + "state-name": "Statusname", + "status": "Status", + "status-required": "Status ist erforderlich.", + "limit": "Maximales Limit", + "limit-required": "Maximales Limit ist erforderlich.", + "current-number": "Aktuelle Anzahl", + "current-number-required": "Aktuelle Anzahl ist erforderlich.", + "add-key": "Schlüssel hinzufügen", + "no-key": "Kein Schlüssel", + "delete-key": "Schlüssel löschen", + "target-dashboard-state": "Ziel-Dashboardstatus", + "go-to-main-state": "Zur Standardansicht wechseln" } }, "icon": { "icon": "Symbol", "icons": "Symbole", + "custom": "Benutzerdefiniert", "select-icon": "Symbol auswählen", "material-icons": "Materialsymbole", "show-all": "Alle Symbole anzeigen", @@ -9546,6 +10186,7 @@ "items-per-page-separator": "von" }, "language": { + "auto": "Auto", "language": "Sprache" } } \ No newline at end of file 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 944713c95f..6506f0ca58 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -10216,6 +10216,7 @@ "es_ES": "español (España)", "fa_IR": "فارسی (ایران)", "fr_FR": "français (France)", + "hi_IN": "हिन्दी (भारत)", "it_IT": "italiano (Italia)", "ja_JP": "日本語 (日本)", "ka_GE": "ქართული (საქართველო)", 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 4e7b15d650..989b252cc2 100644 --- a/ui-ngx/src/assets/locale/locale.constant-fr_FR.json +++ b/ui-ngx/src/assets/locale/locale.constant-fr_FR.json @@ -78,6 +78,7 @@ "show-more": "Afficher plus", "dont-show-again": "Ne plus afficher", "see-documentation": "Voir la documentation", + "see-debug-events": "Voir les événements de débogage", "clear": "Effacer", "upload": "Téléverser", "delete-anyway": "Supprimer quand même", @@ -485,6 +486,7 @@ "2fa": { "2fa": "Authentification à deux facteurs", "available-providers": "Fournisseurs disponibles", + "available-providers-required": "Au moins un fournisseur 2FA doit être configuré.", "issuer-name": "Nom de l'émetteur", "issuer-name-required": "Le nom de l'émetteur est requis.", "max-verification-failures-before-user-lockout": "Nombre maximal d'échecs de vérification avant verrouillage de l'utilisateur", @@ -513,7 +515,9 @@ "verification-message-template-required": "Le modèle de message de vérification est requis.", "within-time": "Délai (sec)", "within-time-pattern": "Le délai doit être un entier positif.", - "within-time-required": "Le délai est requis." + "within-time-required": "Le délai est requis.", + "force-2fa": "Appliquer l’authentification à deux facteurs", + "enforce-for": "Appliquer à" }, "jwt": { "security-settings": "Paramètres de sécurité JWT", @@ -545,16 +549,11 @@ "slack-settings": "Paramètres Slack", "mobile-settings": "Paramètres mobiles", "firebase-service-account-file": "Fichier JSON des identifiants du compte de service Firebase", - "select-firebase-service-account-file": "Glissez-déposez votre fichier d'identifiants de compte de service Firebase ou ", - "trendz": "Trendz", - "trendz-settings": "Paramètres Trendz", - "trendz-url": "URL Trendz", - "trendz-url-required": "L'URL Trendz est requise", - "trendz-api-key": "Clé API Trendz", - "trendz-enable": "Activer Trendz" + "select-firebase-service-account-file": "Glissez-déposez votre fichier d'identifiants de compte de service Firebase ou " }, "alarm": { "alarm": "Alarme", + "alarm-list": "Liste des alarmes", "alarms": "Alarmes", "all-alarms": "Toutes les alarmes", "select-alarm": "Sélectionner une alarme", @@ -655,7 +654,16 @@ "alarm-type": "Type d'alarme", "enter-alarm-type": "Entrer le type d'alarme", "no-alarm-types-matching": "Aucun type d'alarme correspondant à '{{entitySubtype}}' n'a été trouvé.", - "alarm-type-list-empty": "Aucun type d'alarme sélectionné." + "alarm-type-list-empty": "Aucun type d'alarme sélectionné.", + "system-comments": { + "acked-by-user": "L’alarme a été acquittée par l’utilisateur {{userName}}", + "cleared-by-user": "L’alarme a été effacée par l’utilisateur {{userName}}", + "assigned-to-user": "L’alarme a été assignée par l’utilisateur {{userName}} à l’utilisateur {{assigneeName}}", + "unassigned-to-user": "L’alarme a été désassignée par l’utilisateur {{userName}}", + "unassigned-from-deleted-user": "L’alarme a été désassignée car l’utilisateur {{userName}} a été supprimé", + "comment-deleted": "L’utilisateur {{userName}} a supprimé son commentaire", + "severity-changed": "La sévérité de l’alarme a été mise à jour de {{oldSeverity}} à {{newSeverity}}" + } }, "alarm-activity": { "add": "Ajouter un commentaire...", @@ -760,6 +768,7 @@ "name-max-length": "Le nom doit contenir moins de 256 caractères", "label-max-length": "L'étiquette doit contenir moins de 256 caractères", "description": "Description", + "description-required": "La description est requise.", "type": "Type", "type-required": "Le type est requis.", "details": "Détails", @@ -873,6 +882,9 @@ "alarms-created-monthly-activity": "Activité mensuelle des alarmes créées", "data-points": "Points de données", "data-points-storage-days": "Durée de conservation des points de données (jours)", + "data-points-storage-days-hourly-activity": "Activité horaire des jours de stockage des points de données", + "data-points-storage-days-daily-activity": "Activité quotidienne des jours de stockage des points de données", + "data-points-storage-days-monthly-activity": "Activité mensuelle des jours de stockage des points de données", "device-api": "API des appareils", "email": "E-mail", "email-messages": "Messages e-mail", @@ -906,6 +918,7 @@ "rule-node": "Nœud de règle", "sms": "SMS", "sms-messages": "Messages SMS", + "sms-messages-hourly-activity": "Activité horaire des messages SMS", "sms-messages-daily-activity": "Activité quotidienne des SMS", "sms-messages-monthly-activity": "Activité mensuelle des SMS", "successful": "${entityName} Réussis", @@ -915,13 +928,40 @@ "telemetry-persistence-hourly-activity": "Activité horaire de persistance", "telemetry-persistence-monthly-activity": "Activité mensuelle de persistance", "transport": "Transport", + "transport-msg-hourly-activity": "Activité horaire des messages de transport", + "transport-msg-daily-activity": "Activité quotidienne des messages de transport", + "transport-msg-monthly-activity": "Activité mensuelle des messages de transport", "transport-daily-activity": "Activité quotidienne de transport", "transport-data-points": "Points de données de transport", - "transport-hourly-activity": "Activité horaire de transport", - "transport-messages": "Messages de transport", - "transport-monthly-activity": "Activité mensuelle de transport", + "transport-data-points-hourly-activity": "Activité horaire des points de données de transport", + "transport-data-points-daily-activity": "Activité quotidienne des points de données de transport", + "transport-data-points-monthly-activity": "Activité mensuelle des points de données de transport", "view-details": "Voir les détails", - "view-statistics": "Voir les statistiques" + "view-statistics": "Voir les statistiques", + "transport-messages": "Messages de transport", + "transport-messages-hourly-activity": "Activité horaire des messages de transport", + "transport-data-point-hourly-activity": "Activité horaire du point de données de transport", + "javascript-function-executions": "Exécutions de fonctions JavaScript", + "javascript-function-executions-hourly-activity": "Activité horaire des exécutions de fonctions JavaScript", + "javascript-function-executions-daily-activity": "Activité quotidienne des exécutions de fonctions JavaScript", + "javascript-function-executions-monthly-activity": "Activité mensuelle des exécutions de fonctions JavaScript", + "tbel-function-executions": "Exécutions de fonctions TBEL", + "tbel-function-executions-hourly-activity": "Activité horaire des exécutions de fonctions TBEL", + "tbel-function-executions-daily-activity": "Activité quotidienne des exécutions de fonctions TBEL", + "tbel-function-executions-monthly-activity": "Activité mensuelle des exécutions de fonctions TBEL", + "created-reports": "Rapports créés", + "created-reports-hourly-activity": "Activité horaire des rapports créés", + "created-reports-daily-activity": "Activité quotidienne des rapports créés", + "created-reports-monthly-activity": "Activité mensuelle des rapports créés", + "emails": "Emails", + "emails-hourly-activity": "Activité horaire des Emails", + "emails-daily-activity": "Activité quotidienne des Emails", + "emails-monthly-activity": "Activité mensuelle des Emails", + "status": { + "enabled": "Activé", + "disabled": "Désactivé", + "warning": "Avertissement" + } }, "api-limit": { "cassandra-write-queries-core": "Requêtes d’écriture Cassandra via l’API REST", @@ -946,6 +986,40 @@ "edge-uplink-messages": "Messages montants Edge", "edge-uplink-messages-per-edge": "Messages montants Edge par instance" }, + "api-key": { + "api-key": "Clé API", + "api-keys": "Clés API", + "delete-api-key-title": "Êtes-vous sûr de vouloir supprimer la clé API '{{name}}' ?", + "delete-api-key-text": "Attention : après confirmation, la clé deviendra irrécupérable.", + "delete-api-keys-title": "Êtes-vous sûr de vouloir supprimer { count, plural, =1 {1 clé API} other {# clés API} } ?", + "delete-api-keys-text": "Attention : après confirmation, toutes les clés sélectionnées deviendront irrécupérables.", + "expiration-date": "Date d’expiration", + "date": "date", + "description": "Description", + "disable": "Désactiver", + "edit-description": "Modifier la description", + "enable": "Activer la clé API ", + "expiration-time": "Heure d’expiration", + "expiration-time-never": "Jamais", + "expiration-time-custom": "Personnalisé", + "generate": "Générer", + "generate-title": "Générer une clé API", + "generate-text": "Remarque : la clé API hérite des autorisations de l’utilisateur pour lequel elle est créée.", + "generated-api-key-title": "Clé API générée. Vérifions la connectivité !", + "generated-api-key-copy": "Assurez-vous de copier et d’enregistrer votre clé API maintenant, car vous ne pourrez plus l’afficher.", + "generated-api-key-command": "Utilisez les instructions suivantes pour vérifier la connectivité. En résultat, vous devriez recevoir les informations de l’utilisateur actuel :", + "generated-api-key-insecure-url": "L’exécution de commandes via une connexion HTTP non sécurisée enverra votre clé API sans chiffrement, la rendant vulnérable à l’interception.", + "list": "{ count, plural, =1 {Une clé API} other {Liste de # clés API} }", + "manage": "Gérer", + "manage-api-keys": "Gérer les clés API", + "no-found": "Aucune clé API trouvée", + "selected-api-keys": "{ count, plural, =1 {1 clé API} other {# clés API} } sélectionné(s)", + "search": "Rechercher des clés API", + "status": "Statut", + "status-active": "Actif", + "status-inactive": "Inactif", + "status-expired": "Expiré" + }, "audit-log": { "audit": "Audit", "audit-logs": "Journaux d'audit", @@ -999,7 +1073,11 @@ "type-provision-failure": "Le provisionnement de l'appareil a échoué", "type-timeseries-updated": "Télémétrie mise à jour", "type-timeseries-deleted": "Télémétrie supprimée", - "type-sms-sent": "SMS envoyé" + "type-sms-sent": "SMS envoyé", + "any-type": "Tout type", + "audit-log-filter-title": "Filtre du journal d’audit", + "filter-title": "Filtre", + "filter-types": "Types de journal d’audit" }, "debug-settings": { "label": "Configuration de débogage", @@ -1020,12 +1098,25 @@ "selected-fields": "{ count, plural, =1 {1 champ calculé} other {# champs calculés} } sélectionné(s)", "type": { "simple": "Simple", - "script": "Script" + "simple-hint": "Calcul arithmétique simple basé sur les arguments d’entrée.", + "script": "Script", + "script-hint": "Calcul sur des arguments définis à l’aide d’un script TBEL.", + "geofencing": "Géorepérage", + "geofencing-hint": "Évaluation de la position GPS de l’entité et des transitions par rapport aux groupes de zones de géorepérage configurés.", + "propagation": "Propagation", + "propagation-hint": "Propagation des données vers les entités parentes ou enfants en fonction de la direction et du type de relation.", + "related-entities-aggregation": "Agrégation des entités associées", + "related-entities-aggregation-hint": "Agrégation des dernières données des entités associées.", + "time-series-data-aggregation": "Agrégation des données de séries temporelles", + "time-series-data-aggregation-hint": "Agrégation des données historiques d’une entité actuelle." }, + "preview": "Aperçu", "arguments": "Arguments", "decimals-by-default": "Décimales par défaut", "debugging": "Débogage du champ calculé", + "calculated-field-details": "Détails du champ calculé", "argument-name": "Nom de l'argument", + "name": "Nom", "datasource": "Source de données", "add-argument": "Ajouter un argument", "test-script-function": "Tester la fonction script", @@ -1037,8 +1128,9 @@ "argument-asset": "Actif", "argument-customer": "Client", "argument-tenant": "Tenant actuel", + "argument-owner": "Propriétaire actuel", + "argument-relation-query": "Entités associées", "argument-type": "Type d'argument", - "see-debug-events": "Voir les événements de débogage", "attribute": "Attribut", "copy-argument-name": "Copier le nom de l'argument", "timeseries-key": "Clé de série temporelle", @@ -1051,12 +1143,14 @@ "shared-attributes": "Attributs partagés", "attribute-key": "Clé d'attribut", "default-value": "Valeur par défaut", + "default-value-required": "La valeur par défaut est requise.", "limit": "Valeurs max.", "time-window": "Fenêtre temporelle", "customer-name": "Nom du client", "asset-name": "Nom de l’actif", "timeseries": "Séries temporelles", "output": "Sortie", + "output-hint": "Définit la façon dont la sortie est traitée.", "create": "Créer un nouveau champ calculé", "file": "Fichier de champ calculé", "invalid-file-error": "Format de fichier invalide. Veuillez vous assurer que le fichier est un JSON valide.", @@ -1070,9 +1164,175 @@ "delete-multiple-text": "Attention, après confirmation, tous les champs calculés sélectionnés seront supprimés et les données associées seront irrécupérables.", "test-with-this-message": "Tester avec ce message", "use-latest-timestamp": "Utiliser le dernier horodatage", + "entity-coordinates": "Coordonnées de l’entité", + "latitude-time-series-key": "Clé de série temporelle de latitude", + "latitude-time-series-key-required": "La clé de série temporelle de latitude est requise.", + "longitude-time-series-key": "Clé de série temporelle de longitude", + "longitude-time-series-key-required": "La clé de série temporelle de longitude est requise.", + "geofencing-zone-groups": "Groupes de zones de géorepérage", + "geofencing-zone-groups-settings": "Paramètres des groupes de zones de géorepérage", + "target-zone": "Zone cible", + "perimeter-key": "Clé de périmètre", + "report-strategy": "Stratégie de rapport", + "no-zone-configured": "Au moins une zone est requise.", + "no-zone-configured-required": "Au moins un groupe de zones doit être configuré.", + "add-zone-group": "Ajouter un groupe de zones", + "report-transition-event-only": "Événements de transition uniquement", + "report-presence-status-only": "Statut de présence uniquement", + "report-transition-event-and-presence": "Statut de présence et événements de transition", + "perimeter-attribute-key": "Clé d’attribut de périmètre", + "perimeter-attribute-key-required": "La clé d’attribut de périmètre est requise.", + "perimeter-attribute-key-pattern": "La clé d’attribut de périmètre n’est pas valide.", + "entity-zone-relationship": "Chemin de l’entité vers les zones", + "direction": "Direction de la relation", + "direction-from": "De l’entité vers la zone", + "direction-to": "De la zone vers l’entité", + "relation-type": "Type de relation", + "create-relation-with-matched-zones": "Créer des relations pour l’entité source avec les zones correspondantes", + "relation-level": "Niveau de relation", + "fetch-last-available-level": "Récupérer uniquement le dernier niveau disponible", + "zone-group-refresh-interval": "Intervalle d’actualisation des groupes de zones", + "copy-zone-group-name": "Copier le nom du groupe de zones", + "open-details-page": "Ouvrir la page des détails de l’entité", + "level": "Niveau", + "direction-level": "Direction", + "direction-up": "Vers le haut", + "direction-up-parent": "Vers le haut jusqu’au parent", + "direction-down": "Vers le bas", + "direction-down-child": "Vers le bas jusqu’à l’enfant", + "add-level": "Ajouter un niveau", + "delete-level": "Supprimer le niveau", + "no-level": "Aucun niveau configuré", + "levels-required": "Au moins un niveau doit être configuré.", + "max-allowed-levels-error": "Le niveau de relation dépasse le maximum autorisé.", + "propagation-path-related-entities": "Chemin de propagation vers les entités associées", + "propagate-type": { + "arguments-only": "Arguments uniquement", + "expression-result": "Résultat du calcul" + }, + "script": "Script", + "data-propagate": "Données à propager", + "output-key": "Clé de sortie", + "copy-output-key": "Copier la clé de sortie", + "aggregation-path-related-entities": "Chemin d’agrégation vers les entités associées", + "deduplication-interval": "Intervalle de déduplication", + "deduplication-interval-min": "L’intervalle de déduplication doit être d’au moins {{ sec }} secondes.", + "deduplication-interval-hint": "Temps minimum entre les agrégations de télémétrie.", + "deduplication-interval-required": "L’intervalle de déduplication est requis.", + "calculated-field-filter-title": "Filtre des champs calculés", + "filter-title": "Filtre", + "calculated-field-types": "Types de champs calculés", + "events": "Événements", + "any-type": "Tout type", + "metrics": { + "metrics": "Métriques", + "metrics-empty": "Au moins une métrique doit être configurée.", + "metric-name": "Nom de la métrique", + "metric-name-required": "Le nom de la métrique est requis.", + "metric-name-pattern": "Le nom de la métrique n’est pas valide.", + "metric-name-duplicate": "Une métrique portant ce nom existe déjà.", + "metric-name-max-length": "Le nom de la métrique doit comporter moins de 256 caractères.", + "metric-name-forbidden": "Le nom de la métrique est réservé et ne peut pas être utilisé.", + "copy-metric-name": "Copier le nom de la métrique", + "argument-name": "Nom de l’argument", + "aggregation": "Agrégation", + "aggregation-type": { + "avg": "Moyenne", + "min": "Minimum", + "max": "Maximum", + "sum": "Somme", + "count": "Nombre", + "count-unique": "Nombre d’éléments uniques" + }, + "filtered": "Filtré", + "value-source": "Source de la valeur", + "value-source-hint": "Définit comment la valeur à agréger est obtenue.", + "value-source-type": { + "key": "Clé", + "function": "Fonction" + }, + "no-metrics-configured": "Au moins une métrique est requise.", + "add-metric": "Ajouter une métrique", + "max-metrics": "Nombre maximum de métriques atteint.", + "metric-settings": "Paramètres de la métrique", + "filter": "Filtre", + "filter-hint": "Permet de filtrer les entités lors de l’agrégation. La fonction de filtre doit renvoyer une valeur booléenne et peut utiliser tous les arguments configurés." + }, + "output-strategy": { + "strategy": "Stratégie", + "process-right-away": "Traiter immédiatement", + "process-rule-chains": "Traiter via les chaînes de règles", + "save-time-series": "Enregistrer dans les séries temporelles", + "save-database": "Enregistrer dans la base de données", + "save-latest-values": "Enregistrer dans les dernières valeurs", + "send-web-sockets": "Envoyer vers WebSockets", + "save-calculated-fields": "Envoyer vers les champs calculés", + "update-attribute-only-on-value-change": "Mettre à jour l’attribut uniquement en cas de changement de valeur", + "send-attributes-updated-notification": "Envoyer une notification de mise à jour des attributs", + "ttl": "TTL personnalisé", + "ttl-required": "Le TTL est requis", + "ttl-min": "Seul un TTL minimum de 0 est autorisé", + "processing-parameters": "Paramètres de traitement", + "hint": { + "strategy": "Contrôle si le résultat est traité immédiatement ou envoyé à une chaîne de règles pour un traitement supplémentaire.", + "processing-options": "Options de traitement", + "update-attribute-only-on-value-change": "Met à jour l’attribut à chaque message entrant, que la valeur ait changé ou non. Cela augmente l’utilisation de l’API et réduit les performances.", + "update-attribute-only-on-value-change-enabled": "Met à jour l’attribut uniquement lorsque la valeur change. Si la valeur est inchangée, les horodatages ne sont pas mis à jour et les notifications ne sont pas envoyées.", + "send-attributes-updated-notification": "Envoie un événement « Attributes Updated » à la chaîne de règles par défaut.", + "save-time-series": "Enregistre les données de séries temporelles dans la table ts_kv de la base de données.", + "save-database": "Enregistre les données d’attribut dans la base de données.", + "save-latest-values": "Met à jour les données de séries temporelles dans la table ts_kv_latest de la base de données si la nouvelle valeur est plus récente.", + "send-web-sockets-attribute": "Notifie les abonnements WebSocket des mises à jour des données d’attribut.", + "send-web-sockets-time-series": "Notifie les abonnements WebSocket des mises à jour des données de séries temporelles.", + "save-calculated-fields-attribute": "Notifie les champs calculés des mises à jour des données d’attribut.", + "save-calculated-fields-time-series": "Notifie les champs calculés des mises à jour des données de séries temporelles.", + "ttl": "Définit la durée de conservation des données de séries temporelles. Si désactivé, le TTL du profil de locataire est utilisé." + } + }, + "aggregate-interval-type": "Type d’intervalle d’agrégation", + "aggregate-interval-value": "Valeur de l’intervalle d’agrégation", + "aggregate-interval-value-required": "La valeur de l’intervalle d’agrégation est requise.", + "aggregate-interval-value-min": "La valeur de l’intervalle d’agrégation doit être d’au moins { sec, plural, =0 {0 seconde} =1 {1 seconde} other {# secondes} }.", + "aggregate-interval-value-step-multiple-of": "La valeur de l’intervalle d’agrégation doit être un diviseur ou un multiple d’un jour.", + "aggregate-period": { + "hour": "Heure", + "day": "Jour", + "week": "Semaine (lun. - dim.)", + "week-sun-sat": "Semaine (dim. - sam.)", + "month": "Mois", + "quarter": "Trimestre", + "year": "Année", + "custom": "Personnalisé" + }, + "aggregate-period-hint-offset": "Votre intervalle d’agrégation sera : {{ interval }}", + "aggregate-period-hint-offset-and-so-on": "Votre intervalle d’agrégation sera : {{ interval }} et ainsi de suite.", + "entity-aggregation": { + "argument-hint": "Les données seront récupérées à partir de l’entité actuelle.", + "argument-title-hint": "Définit les arguments d’entrée utilisés pour l’agrégation.", + "argument-setting-hint": "La dernière télémétrie est le seul type d’argument disponible pour ce champ calculé.", + "aggregation-interval": "Intervalle d’agrégation", + "aggregation-interval-hint": "Définit la fréquence d’exécution de l’agrégation. Exemple : toutes les 1 heures, les données sont agrégées à 00:00, 01:00, 02:00, etc. Les résultats de l’agrégation sont stockés avec l’horodatage correspondant au début de l’intervalle d’agrégation.", + "apply-offset": "Appliquer un décalage à l’intervalle d’agrégation", + "apply-offset-hint": "Définit de combien décaler le début de chaque période d’agrégation (p. ex., +10 minutes – 00:10, 01:10).", + "offset-value": "Valeur du décalage", + "offset-value-required": "La valeur du décalage est requise.", + "offset-value-min": "La valeur du décalage doit être un entier positif.", + "offset-value-max": "La valeur du décalage doit être inférieure à la valeur de l’intervalle d’agrégation.", + "wait-delay": "Appliquer un délai d’attente pour la télémétrie retardée", + "wait-delay-hint": "Définit combien de temps attendre la télémétrie retardée après la fin de l’intervalle. Si une telle télémétrie arrive, le résultat de cet intervalle sera recalculé.", + "duration": "Durée", + "duration-required": "La durée est requise.", + "duration-min": "La durée doit être d’au moins 1 minute.", + "duration-hint": "Durée d’attente des données retardées après la fin de l’intervalle.", + "produce-intermediate-result": "Produire un résultat intermédiaire", + "produce-intermediate-result-hint": "Calcule les métriques pendant l’intervalle actuel afin de produire un résultat intermédiaire. Les mises à jour n’ont lieu pas plus d’une fois toutes les {{ time }}." + }, "hint": { - "arguments-simple-with-rolling": "Un champ calculé de type simple ne doit pas contenir de clés avec déroulement de séries temporelles.", - "arguments-empty": "Les arguments ne doivent pas être vides.", + "arguments-simple-with-rolling": "Un champ calculé de type simple ne doit pas contenir de clés avec le type « Série temporelle glissante ».", + "arguments-propagate-arguments-with-rolling": "Le type « Série temporelle glissante » est incompatible avec la propagation « Arguments uniquement ».", + "arguments-propagate-argument-entity-type": "Le type d’entité est incompatible avec la propagation « Arguments uniquement ».", + "arguments-propagate-argument-must-current-entity": "Au moins un argument doit être configuré avec le type d’entité source « Entité actuelle ».", + "arguments-empty": "Au moins un argument doit être spécifié.", "expression-required": "L'expression est requise.", "expression-invalid": "L'expression est invalide.", "expression-max-length": "La longueur de l'expression doit être inférieure à 255 caractères.", @@ -1081,12 +1341,218 @@ "argument-name-duplicate": "Un argument avec ce nom existe déjà.", "argument-name-max-length": "Le nom de l'argument doit contenir moins de 256 caractères.", "argument-name-forbidden": "Ce nom d'argument est réservé et ne peut pas être utilisé.", + "output-key-required": "La clé de sortie est requise.", + "output-key-pattern": "La clé de sortie n’est pas valide.", + "output-key-duplicate": "Une clé portant ce nom existe déjà.", + "output-key-max-length": "La clé de sortie doit comporter moins de 256 caractères.", + "output-key-forbidden": "La clé de sortie est réservée et ne peut pas être utilisée.", + "entity-type-required": "Le type d’entité est requis.", + "name-required": "Le nom est requis.", + "name-pattern": "Le nom n’est pas valide.", + "name-duplicate": "Un nom identique existe déjà.", + "name-max-length": "Le nom doit comporter moins de 256 caractères.", + "name-forbidden": "Le nom est réservé et ne peut pas être utilisé.", "argument-type-required": "Le type d'argument est requis.", "max-args": "Nombre maximal d'arguments atteint.", "decimals-range": "Le nombre de décimales par défaut doit être compris entre 0 et 15.", "expression": "L'expression par défaut montre comment convertir une température de Fahrenheit en Celsius.", "arguments-entity-not-found": "L'entité cible de l'argument est introuvable.", - "use-latest-timestamp": "Si activé, la valeur calculée sera enregistrée avec l’horodatage le plus récent parmi la télémétrie des arguments, au lieu de celui du serveur." + "use-latest-timestamp": "Si activé, la valeur calculée sera enregistrée avec l’horodatage le plus récent parmi la télémétrie des arguments, au lieu de celui du serveur.", + "entity-coordinates": "Spécifiez les clés de série temporelle qui fournissent les coordonnées GPS de l’entité (latitude et longitude).", + "geofencing-zone-groups": "Définissez un ou plusieurs groupes de zones de géorepérage à vérifier (p. ex. « allowedZones », « restrictedZones »). Chaque groupe doit avoir un nom unique, utilisé comme préfixe pour les clés de télémétrie de sortie du champ calculé.", + "perimeter-attribute-key": "Définissez la clé d’attribut qui contient la définition du périmètre de la zone de géorepérage. Le périmètre est toujours récupéré à partir des attributs côté serveur de l’entité de zone.", + "report-strategy": "Le statut de présence indique si l’entité est actuellement À L’INTÉRIEUR ou À L’EXTÉRIEUR du groupe de zones. Les événements de transition indiquent quand l’entité est ENTRÉE dans le groupe de zones ou l’a QUITTÉ.", + "create-relation-with-matched-zones": "Créer et maintenir automatiquement des relations entre l’entité et les zones dans lesquelles elle se trouve actuellement. Les relations sont supprimées lorsque l’entité quitte une zone et créées lorsqu’elle entre dans une nouvelle zone.", + "relation-type-required": "Le type de relation est requis.", + "relation-level-required": "Le niveau de relation est requis.", + "relation-level-min": "La valeur minimale du niveau de relation est 1.", + "relation-level-max": "La valeur maximale du niveau de relation est {{max}}.", + "geofencing-empty": "Au moins un groupe de zones doit être configuré.", + "geofencing-entity-not-found": "L’entité cible de géorepérage est introuvable.", + "max-geofencing-zone": "Nombre maximum de zones de géorepérage atteint.", + "zone-group-refresh-interval": "Définit la fréquence d’actualisation des groupes de zones configurés via des entités associées.", + "zone-group-refresh-interval-required": "L’intervalle d’actualisation des groupes de zones est requis.", + "zone-group-refresh-interval-min": "L’intervalle d’actualisation des groupes de zones doit être d’au moins {{ min }} secondes.", + "propagation-path-related-entities": "Définit un chemin direct à un seul niveau vers une entité associée, selon la direction sélectionnée et le type de relation. Seules les relations entre les entités d’appareil, d’actif, de client et de locataire sont prises en charge. Le nombre maximal d’entités résolues par le chemin de relation est de {{ max }}.", + "data-propagate": "Définit les données à propager à partir des arguments configurés ci-dessous. « Arguments uniquement » utilise directement les données récupérées, tandis que « Résultat de l’expression » calcule une nouvelle valeur à partir de ces données.", + "aggregation-path-related-entities": "Définit un chemin d’agrégation à un seul niveau via des relations directes avec des entités parentes ou enfants, selon la direction et le type de relation. Seules les relations entre les entités d’appareil, d’actif, de client et de locataire sont prises en charge. Le nombre maximal d’entités résolues par le chemin de relation est de {{ max }}.", + "arguments-aggregation": "Définit les arguments d’entrée utilisés pour le filtrage et l’agrégation.", + "setting-arguments-aggregation": "Les données seront récupérées à partir des entités associées configurées dans le chemin d’agrégation.", + "metrics": "Définit les métriques agrégées en fonction des arguments configurés.", + "entity-aggregation-metrics": "Définit les métriques agrégées en fonction des arguments configurés sur les intervalles de temps spécifiés.", + "import-invalid-calculated-field-type": "Impossible d’importer le champ calculé : structure de champ calculé non valide.", + "simple-expression-title": "Expression arithmétique qui définit la manière dont la valeur calculée est déterminée.", + "script-title": "Script TBEL qui définit la logique de calcul et les valeurs de sortie.", + "simple-arguments": "Expression arithmétique qui définit la manière dont la valeur calculée est déterminée.", + "script-arguments": "Définit les arguments d’entrée disponibles pour le script." + } + }, + "alarm-rule": { + "alarm-rules-tab": "Règles d’alarme", + "alarm-rule": "Règle d’alarme", + "alarm-rules": "Règles d’alarme", + "alarm-rules-old": "Anciennes", + "alarm-rules-actual": "Actuelles", + "severities": "Sévérités", + "cleared": "Condition d’effacement", + "delete-title": "Êtes-vous sûr de vouloir supprimer la règle d’alarme « {{title}} » ?", + "delete-text": "Attention : après confirmation, la règle d’alarme et toutes les données associées deviendront irrécupérables.", + "delete-multiple-title": "Êtes-vous sûr de vouloir supprimer { count, plural, =1 {1 règle d’alarme} other {# règles d’alarme} } ?", + "delete-multiple-text": "Attention : après confirmation, toutes les règles d’alarme sélectionnées seront supprimées et toutes les données associées deviendront irrécupérables.", + "create": "Créer une nouvelle règle d’alarme", + "add": "Ajouter une règle d’alarme", + "copy": "Copier la configuration de la règle d’alarme", + "details": "Détails de la règle d’alarme", + "no-found": "Aucune règle d’alarme trouvée", + "list": "{ count, plural, =1 {Une règle d’alarme} other {Liste de # règles d’alarme} }", + "selected-fields": "{ count, plural, =1 {1 règle d’alarme} other {# règles d’alarme} } sélectionné(s)", + "import": "Importer une règle d’alarme", + "file": "Fichier de règle d’alarme", + "export": "Exporter la règle d’alarme", + "export-failed-error": "Impossible d’exporter la règle d’alarme : {{error}}", + "entity-type": "Type d’entité", + "entity-type-required": "Le type d’entité est requis.", + "alarm-type": "Type d’alarme", + "alarm-type-hint": "Identifiant unique (p. ex. HighTempAlarm) dans le périmètre de l’émetteur de l’alarme (Appareil, Actif, etc.) afin d’éviter les conflits.", + "alarm-type-required": "Le type d’alarme est requis.", + "alarm-type-pattern": "Le type d’alarme n’est pas valide.", + "alarm-type-max-length": "Le type d’alarme doit comporter moins de 256 caractères.", + "clear-alarm": "Effacer l’alarme", + "value-argument": "Argument", + "value-argument-required": "L’argument est requis.", + "static-settings": "Paramètres statiques", + "configuration": "Configuration", + "static-schedule": "Statique", + "dynamic-schedule": "Dynamique", + "operation-and": "ET", + "operation-or": "OU", + "condition-during": "Pendant {{during}}", + "condition-during-dynamic": "Pendant « {{ attribute }} »", + "condition-repeat-times": "Répète { count, plural, =1 {1 fois} other {# fois} }", + "condition-repeat-times-dynamic": "Répète « {{ attribute }} » fois", + "filter-preview": "Aperçu du filtre", + "condition-settings": "Paramètres de condition", + "static": "Statique", + "dynamic": "Dynamique", + "argument-filters": "Filtres d’arguments", + "argument-name": "Nom de l’argument", + "value-type": "Type de valeur", + "general": "Général", + "filters": "Filtres", + "date-time-hint": "L’argument doit être en millisecondes epoch. Exemple : 1698839340000 correspond à 2023-11-01 12:49:00 UTC.", + "operation": "Opération", + "value-source": "Source de la valeur", + "value": "Valeur", + "ignore-case": "Ignorer la casse", + "condition": "Condition", + "script": "Script", + "add-filter": "Ajouter un filtre d’argument", + "edit-filter": "Filtre d’argument", + "remove-filter": "Supprimer le filtre d’argument", + "no-filter": "Au moins un filtre est requis.", + "conditions": { + "simple": "Simple", + "duration": "Durée", + "repeating": "Répétition" + }, + "schedule-title": "Planification", + "edit-schedule": "Modifier la planification de l’alarme", + "schedule-type": "Type de planificateur", + "schedule-type-required": "Le type de planificateur est requis.", + "schedule": { + "any-time": "Active en permanence", + "specific-time": "Active à une heure précise", + "custom": "Personnalisé" + }, + "schedule-day": { + "monday": "Lundi", + "tuesday": "Mardi", + "wednesday": "Mercredi", + "thursday": "Jeudi", + "friday": "Vendredi", + "saturday": "Samedi", + "sunday": "Dimanche" + }, + "schedule-days": "Jours", + "schedule-time": "Heure", + "schedule-time-from": "De", + "schedule-time-to": "À", + "schedule-days-of-week-required": "Au moins un jour de la semaine doit être sélectionné.", + "tbel": "TBEL", + "expression-type": { + "simple": "Simple", + "script": "Script" + }, + "operation-type": { + "and": "ET", + "or": "OU" + }, + "filter-predicate-type": { + "string": "Chaîne", + "numeric": "Numérique", + "boolean": "Booléen", + "complex": "Complexe" + }, + "alarm-rule-additional-info": "Informations supplémentaires", + "edit-alarm-rule-additional-info": "Modifier les informations supplémentaires", + "alarm-rule-additional-info-placeholder": "Veuillez fournir ici vos commentaires et ajustements afin de les afficher dans les détails de l’alarme, sous « Informations supplémentaires »", + "alarm-rule-additional-info-hint": "Astuce : utiliser ${Nom de l’argument} pour substituer les valeurs des arguments utilisés dans la condition de la règle d’alarme.", + "alarm-rule-additional-info-icon-hint": "Utiliser le nom de l’argument pour substituer les valeurs des arguments utilisés dans la condition de la règle d’alarme.", + "alarm-rule-mobile-dashboard": "Tableau de bord mobile", + "alarm-rule-mobile-dashboard-hint": "Utilisé par l’application mobile comme tableau de bord des détails de l’alarme.", + "alarm-rule-no-mobile-dashboard": "Aucun tableau de bord sélectionné", + "alarm-rule-condition": "Condition de la règle d’alarme", + "enter-alarm-rule-condition-prompt": "Ajouter une condition", + "enter-alarm-rule-clear-condition-prompt": "Ajouter une condition d’effacement", + "edit-alarm-rule-condition": "Condition d’alarme", + "condition-type": "Type de condition", + "condition-type-hint": "Les options \"Durée\" et \"Répétition\" ne sont pas disponibles lorsque l’opération \"Manquant pendant\" est utilisée dans le filtre.", + "select-alarm-severity": "Sélectionner la sévérité de l’alarme", + "add-create-alarm-rule-prompt": "Au moins une condition de déclenchement est requise.", + "add-create-alarm-rule": "Ajouter une condition de déclenchement", + "add-clear-alarm-rule": "Ajouter une condition d’effacement", + "condition-duration": "Durée de la condition", + "condition-duration-value": "Valeur de la durée", + "condition-duration-time-unit": "Unité de temps", + "condition-duration-value-range": "La valeur de la durée doit être comprise entre 1 et 2147483647.", + "condition-duration-value-pattern": "La valeur de la durée doit être un entier.", + "condition-duration-value-required": "La valeur de la durée est requise.", + "condition-duration-time-unit-required": "L’unité de temps est requise.", + "condition-repeating-value": "Nombre d’événements", + "condition-repeating-value-hint": "La mise à jour de n’importe quel argument de la règle d’alarme sera comptabilisée comme un événement", + "condition-repeating-value-range": "Le nombre d’événements doit être compris entre 1 et 2147483647.", + "condition-repeating-value-pattern": "Le nombre d’événements doit être un entier.", + "condition-repeating-value-required": "Le nombre d’événements est requis.", + "create-conditions": "Conditions de déclenchement", + "clear-condition": "Condition d’effacement", + "no-clear-alarm-rule": "Aucune condition d’effacement configurée.", + "advanced-settings": "Paramètres avancés", + "propagate-alarm": "Propager l’alarme vers les entités associées", + "alarm-rule-relation-types-list": "Types de relation", + "alarm-rule-relation-types-list-hint": "Définit les types de relation pour filtrer les entités associées. Si non défini, l’alarme sera propagée à toutes les entités associées.", + "propagate-alarm-to-owner": "Propager l’alarme vers le propriétaire de l’entité (Client ou Locataire)", + "propagate-alarm-to-tenant": "Propager l’alarme vers le Locataire", + "alarm-rule-filter-title": "Filtre de règle d’alarme", + "filter-title": "Filtre", + "debugging": "Débogage des règles d’alarme", + "any-type": "Tout type", + "enter-alarm-rule-type": "Saisir le type d’alarme", + "no-alarm-rule-types-matching": "Aucun type d’alarme correspondant à « {{entitySubtype}} » n’a été trouvé.", + "alarm-rule-type-list-empty": "Aucun type d’alarme sélectionné.", + "alarm-rule-type-list": "Liste des types d’alarme", + "alarm-rule-entity-list": "Liste des entités", + "missing-for": "manquant pendant", + "time-unit": "Unité", + "mode": "Mode", + "type": "Type", + "value-required": "La valeur est requise.", + "min-value": "La valeur doit être supérieure ou égale à 1.", + "argument-in-use": "L’argument est utilisé comme argument général.", + "import-invalid-alarm-rule-type": "Impossible d’importer la règle d’alarme : structure de règle d’alarme non valide.", + "no-filter-preview": "Aucun filtre spécifié", + "filter-operation": { + "and": "ET", + "or": "OU" } }, "ai-models": { @@ -1193,6 +1659,7 @@ "contact": { "country": "Pays", "country-required": "Le pays est requis.", + "country-object-required": "Veuillez sélectionner un pays valide dans la liste.", "city": "Ville", "state": "État / Province", "postal-code": "Code postal / ZIP", @@ -1229,6 +1696,8 @@ "documentation": "Documentation", "time-left": "{{time}} restantes", "output": "Sortie", + "sort-asc": "Croissant", + "sort-desc": "Décroissant", "suffix": { "s": "s", "ms": "ms" @@ -1365,6 +1834,8 @@ "mobile-order": "Ordre du tableau de bord dans l'application mobile", "mobile-hide": "Masquer le tableau de bord dans l'application mobile", "update-image": "Mettre à jour l'image du tableau de bord", + "update-new-version": "Téléverser une nouvelle version", + "upload-file-to-update": "Téléverser le fichier pour mettre à jour", "take-screenshot": "Prendre une capture d’écran", "select-widget-title": "Sélectionner un widget", "select-widget-value": "{{title}} : sélectionner un widget", @@ -1733,6 +2204,8 @@ "bootstrap-tab": "Client Bootstrap", "bootstrap-server": "Serveur Bootstrap", "lwm2m-server": "Serveur LwM2M", + "client-reboot": "Déclencheur de mise à jour d’enregistrement", + "bootstrap-reboot": "Déclencheur de requête de bootstrap", "client-publicKey-or-id": "Clé publique ou ID du client", "client-publicKey-or-id-required": "La clé publique ou l'ID du client est requis.", "client-publicKey-or-id-tooltip-psk": "L'identifiant PSK est un identifiant PSK arbitraire jusqu'à 128 octets, comme décrit dans la norme [RFC7925].\nL'identifiant PSK DOIT d'abord être converti en chaîne de caractères, puis encodé en octets en utilisant UTF-8.", @@ -1780,7 +2253,6 @@ "unable-delete-device-alias-text": "L'alias de l'appareil '{{deviceAlias}}' ne peut pas être supprimé car il est utilisé par le(s) widget(s) suivant(s) :
{{widgetsList}}", "is-gateway": "Est une passerelle", "overwrite-activity-time": "Écraser l'heure d'activité de l'appareil connecté", - "device-filter": "Filtre d'appareil", "device-filter-title": "Filtre d'appareil", "filter-title": "Filtre", "device-state": "État de l'appareil", @@ -2234,6 +2706,7 @@ "short-id-required": "L’ID court du serveur est requis.", "short-id-range": "L’ID court du serveur doit être compris entre {{ min }} et {{ max }}.", "short-id-pattern": "L’ID court doit être un entier positif.", + "short-id-pattern-bs": "L’ID court du serveur doit être uniquement null", "lifetime": "Durée d’enregistrement du client", "lifetime-required": "La durée d’enregistrement du client est requise.", "lifetime-pattern": "La durée d’enregistrement doit être un entier positif.", @@ -2328,7 +2801,9 @@ "composite-all-description": "Toutes les ressources sont observées avec une seule requête Observe Composite (plus efficace, moins flexible)", "composite-by-object": "Composite par objets", "composite-by-object-description": "Les ressources sont regroupées par type d’objet et observées via des requêtes Observe Composite distinctes (approche équilibrée)" - } + }, + "init-attr-tel-as-obs-strategy": "Initialiser les attributs et la télémétrie en utilisant la stratégie Observe", + "init-attr-tel-as-obs-strategy-hint": "Si false - les attributs et la télémétrie sont initialisés en lisant leurs valeurs une par une.\\nSi true - les attributs et la télémétrie sont initialisés en s’abonnant à leurs valeurs via la stratégie Observe." }, "snmp": { "add-communication-config": "Ajouter une configuration de communication", @@ -2644,6 +3119,8 @@ "type-rulenodes": "Nœuds de règle", "list-of-rulenodes": "{ count, plural, =1 {Un nœud de règle} other {Liste de # nœuds de règle} }", "rulenode-name-starts-with": "Nœuds de règle dont le nom commence par '{{prefix}}'", + "type-api-key": "Clé API", + "type-api-keys": "Clés API", "type-current-customer": "Client actuel", "type-current-tenant": "Locataire actuel", "type-current-user": "Utilisateur actuel", @@ -2665,6 +3142,7 @@ "details": "Détails de l'entité", "no-entities-prompt": "Aucune entité trouvée", "no-data": "Aucune donnée à afficher", + "show-all-columns": "Tout afficher", "columns-to-display": "Colonnes à afficher", "type-api-usage-state": "État d'utilisation de l'API", "type-edge": "Edge", @@ -2710,7 +3188,15 @@ "list-of-mobile-apps": "{ count, plural, =1 {Une application mobile} other {Liste de # applications mobiles} }", "type-mobile-app-bundle": "Pack mobile", "type-mobile-app-bundles": "Packs mobiles", - "list-of-mobile-app-bundles": "{ count, plural, =1 {Un bundle mobile} other {Liste de # bundles mobiles} }" + "list-of-mobile-app-bundles": "{ count, plural, =1 {Un bundle mobile} other {Liste de # bundles mobiles} }", + "limit-reached": "Limite atteinte", + "limit-reached-text": "Vous avez atteint la limite de {{ entities }}. Pour en ajouter davantage, veuillez demander à votre administrateur système d’augmenter votre limite de {{ entity }}.", + "request-limit-increase": "Demander une augmentation de limite", + "request-sysadmin-text": "Êtes-vous l’administrateur système ?", + "login-here": "Se connecter ici", + "to-increase-limit": "pour augmenter la limite.", + "increase-limit-request-sent-title": "Nous avons envoyé une demande automatisée à votre administrateur système pour augmenter la limite", + "increase-limit-request-sent-text": "Veuillez leur laisser un peu de temps pour examiner la demande et mettre à jour les paramètres. Vous devrez peut-être actualiser cette page pour voir les modifications." }, "entity-field": { "created-time": "Date de création", @@ -3787,6 +4273,7 @@ "two-factor-authentication": "Authentification à deux facteurs", "passwords-mismatch-error": "Les mots de passe saisis doivent être identiques !", "password-again": "Ressaisir le mot de passe", + "sign-in": "Veuillez vous connecter", "username": "Nom d'utilisateur (email)", "remember-me": "Se souvenir de moi", "forgot-password": "Mot de passe oublié ?", @@ -3797,7 +4284,8 @@ "password-link-sent-message": "Le lien de réinitialisation a été envoyé", "email": "Email", "invalid-email-format": "Format d'email invalide.", - "login-with": "Connexion avec {{name}}", + "sign-in-with": "Se connecter avec {{name}}", + "sign-in-to-your-account": "Se connecter à votre compte", "or": "ou", "error": "Erreur de connexion", "verify-your-identity": "Vérifiez votre identité", @@ -3816,7 +4304,51 @@ "activation-link-expired": "Le lien d'activation a expiré", "activation-link-expired-message": "Le lien d’activation de votre profil a expiré. Vous pouvez revenir à la page de connexion pour recevoir un nouvel email.", "reset-password-link-expired": "Le lien de réinitialisation du mot de passe a expiré", - "reset-password-link-expired-message": "Le lien de réinitialisation du mot de passe a expiré. Vous pouvez revenir à la page de connexion pour recevoir un nouvel email." + "reset-password-link-expired-message": "Le lien de réinitialisation du mot de passe a expiré. Vous pouvez revenir à la page de connexion pour recevoir un nouvel email.", + "two-fa": "Authentification à deux facteurs", + "two-fa-required": "L’authentification à deux facteurs est requise", + "set-up-verification-method": "Configurer une méthode de vérification pour continuer", + "set-up-verification-method-login": "Configurer une méthode de vérification ou se connecter", + "enable-authenticator-app": "Activer l’application d’authentification", + "enable-authenticator-app-description": "Veuillez saisir le code de sécurité de votre application d’authentification", + "enable-authenticator-sms": "Activer l’authentificateur SMS", + "enable-authenticator-sms-description": "Saisissez le code à 6 chiffres que nous venons d’envoyer à ", + "enable-authenticator-email": "Activer l’authentificateur Email", + "enable-authenticator-email-description": "Un code de sécurité a été envoyé à votre adresse email à ", + "enter-key-manually": "ou saisissez manuellement cette clé à 32 chiffres :", + "continue": "Continuer", + "confirm": "Confirmer", + "authenticator-app-success": "Application d’authentification activée avec succès", + "authenticator-app-success-description": "La prochaine fois que vous vous connecterez, vous devrez fournir un code d’authentification à deux facteurs", + "authenticator-sms-success": "Authentificateur SMS activé avec succès", + "authenticator-sms-success-description": "La prochaine fois que vous vous connecterez, vous serez invité à saisir le code de sécurité qui sera envoyé au numéro de téléphone", + "authenticator-email-success": "Authentificateur Email activé avec succès", + "authenticator-email-success-description": "La prochaine fois que vous vous connecterez, vous serez invité à saisir le code de sécurité qui sera envoyé à votre adresse email", + "authenticator-backup-code-success": "Code de secours activé avec succès", + "authenticator-backup-code-success-description": "La prochaine fois que vous vous connecterez, vous serez invité à saisir le code de sécurité ou à utiliser l’un des codes de secours.", + "add-verification-method": "Ajouter une méthode de vérification", + "get-backup-code": "Obtenir un code de secours", + "copy-key": "Copier la clé", + "send-code": "Envoyer le code", + "email-label": "Email", + "email-description": "Saisissez un email à utiliser comme authentificateur.", + "sms-description": "Saisissez un numéro de téléphone à utiliser comme authentificateur.", + "backup-code-description": "Imprimez les codes afin de les avoir à portée de main lorsque vous en aurez besoin pour vous connecter à votre compte. Vous pouvez utiliser chaque code de secours une seule fois.", + "backup-code-warn": "Une fois que vous quittez cette page, ces codes ne peuvent plus être affichés. Stockez-les en toute sécurité à l’aide des options ci-dessous.", + "download-txt": "Télécharger (txt)", + "print": "Imprimer", + "verification-code": "Code à 6 chiffres", + "verification-code-invalid": "Format du code de vérification non valide", + "verification-code-incorrect": "Le code de vérification est incorrect", + "verification-code-many-request": "Trop de demandes pour vérifier le code de vérification", + "scan-qr-code": "Scannez ce code QR avec votre application de vérification", + "phone-input": { + "phone-input-label": "Numéro de téléphone", + "phone-input-required": "Le numéro de téléphone est requis", + "phone-input-validation": "Le numéro de téléphone n’est pas valide ou n’est pas possible", + "phone-input-pattern": "Numéro de téléphone non valide. Doit être au format E.164, ex. {{phoneNumber}}", + "phone-input-hint": "Numéro de téléphone au format E.164, ex. {{phoneNumber}}" + } }, "mobile": { "add-application": "Ajouter une application", @@ -4184,6 +4716,7 @@ "api-usage-limit": "Limite d'utilisation de l'API", "device-activity": "Activité de l'appareil", "entities-limit": "Limite d'entités", + "entities-limit-increase-request": "Demande d’augmentation de la limite d’entités", "entity-action": "Action sur l'entité", "general": "Général", "rule-engine-lifecycle-event": "Événement du cycle de vie du moteur de règles", @@ -4401,6 +4934,12 @@ "at-least": "Au moins :", "character": "{ count, plural, =1 {1 caractère} other {# caractères} }", "digit": "{ count, plural, =1 {1 chiffre} other {# chiffres} }", + "password-tooltip-min-length": "Au moins {{minimumLength}} caractères", + "password-tooltip-max-length": "Au plus {{maximumLength}} caractères", + "password-tooltip-uppercase": "{{minimumUppercaseLetters}} caractère(s) en majuscule", + "password-tooltip-lowercase": "{{minimumLowercaseLetters}} caractère(s) en minuscule", + "password-tooltip-digit": "{{minimumDigits}} chiffre(s)", + "password-tooltip-special-characters": "{{minimumSpecialCharacters}} caractère(s) spécial(s)", "incorrect-password-try-again": "Mot de passe incorrect. Veuillez réessayer", "lowercase-letter": "{ count, plural, =1 {1 lettre minuscule} other {# lettres minuscules} }", "new-passwords-not-match": "Les nouveaux mots de passe ne correspondent pas", @@ -4459,7 +4998,8 @@ "additional-info": "Informations supplémentaires (JSON)", "invalid-additional-info": "Impossible d’analyser le JSON des informations supplémentaires.", "no-relations-text": "Aucune relation trouvée", - "not": "Non" + "not": "Non", + "copy-type": "Copier le type" }, "resource": { "add": "Ajouter une ressource", @@ -5410,7 +5950,7 @@ "time-series": "Séries temporelles", "latest": "Dernières valeurs", "web-sockets": "WebSockets", - "calculated-fields": "Champs calculés" + "calculated-fields-and-alarm-rules": "Champs calculés et règles d'alarme" }, "save-attribute": { "processing-settings": "Paramètres de traitement", @@ -5605,7 +6145,8 @@ "bad-request-params": "Paramètres de requête incorrects", "item-not-found": "Élément introuvable", "too-many-requests": "Trop de requêtes", - "too-many-updates": "Trop de mises à jour" + "too-many-updates": "Trop de mises à jour", + "entities-limit-exceeded": "Limite d’entités dépassée" }, "tenant": { "tenant": "Locataire", @@ -5743,6 +6284,27 @@ "max-arguments-per-cf": "Nombre maximal d’arguments par champ calculé", "max-arguments-per-cf-range": "Le nombre maximal d’arguments ne peut pas être négatif", "max-arguments-per-cf-required": "Le nombre maximal d’arguments est requis", + "max-related-level-per-argument": "Niveau de relation maximal par argument « Entités associées »", + "max-related-level-per-argument-range": "Le nombre maximal du niveau de relation par argument « Entités associées » ne peut pas être inférieur à « 1 »", + "max-related-level-per-argument-required": "Le nombre maximal du niveau de relation par argument « Entités associées » est requis", + "min-allowed-scheduled-update-interval": "Intervalle minimal de mise à jour autorisé pour les arguments « Entités associées » (secondes)", + "min-allowed-scheduled-update-interval-range": "La valeur minimale de l’intervalle de mise à jour autorisé ne peut pas être négative", + "min-allowed-deduplication-interval": "Intervalle minimal de déduplication autorisé (secondes)", + "min-allowed-deduplication-interval-range": "La valeur minimale de l’intervalle de déduplication autorisé ne peut pas être négative", + "min-allowed-deduplication-interval-required": "L’intervalle minimal de déduplication autorisé est requis", + "intermediate-aggregation-interval": "Intervalle d’agrégation intermédiaire (secondes)", + "intermediate-aggregation-interval-range": "La valeur de l’intervalle d’agrégation intermédiaire ne peut pas être inférieure à « 1 »", + "intermediate-aggregation-interval-required": "L’intervalle d’agrégation intermédiaire est requis", + "reevaluation-check-interval": "Intervalle de vérification de la réévaluation (secondes)", + "reevaluation-check-interval-range": "La valeur de l’intervalle de vérification de la réévaluation ne peut pas être inférieure à « 1 »", + "reevaluation-check-interval-required": "L’intervalle de vérification de la réévaluation est requis", + "alarms-reevaluation-interval": "Intervalle de réévaluation des alarmes (secondes)", + "alarms-reevaluation-interval-range": "La valeur de l’intervalle de réévaluation des alarmes ne peut pas être inférieure à « 1 »", + "alarms-reevaluation-interval-required": "L’intervalle de réévaluation des alarmes est requis", + "min-allowed-aggregation-interval": "Intervalle minimal d’agrégation autorisé (secondes)", + "min-allowed-aggregation-interval-range": "La valeur minimale de l’intervalle d’agrégation autorisé ne peut pas être négative", + "min-allowed-aggregation-interval-required": "L’intervalle minimal d’agrégation autorisé est requis", + "min-allowed-scheduled-update-interval-required": "La valeur minimale de l’intervalle de mise à jour autorisé est requise", "max-state-size": "Taille maximale de l'état (en Ko)", "max-state-size-range": "La taille maximale ne peut pas être négative", "max-state-size-required": "La taille maximale de l'état est requise", @@ -5818,6 +6380,10 @@ "ws-limit-max-subscriptions-per-regular-user": "Nombre maximal d’abonnements par utilisateur régulier", "ws-limit-max-subscriptions-per-public-user": "Nombre maximal d’abonnements par utilisateur public", "ws-limit-updates-per-session": "Mises à jour WS par session", + "relation-search-entity-limit": "Limite de recherche d’entités par relation", + "relation-search-entity-limit-hint": "Limite le nombre d’entités résolues au dernier niveau du chemin de relation. S’applique aux arguments « Entités associées » et aux champs de propagation.", + "relation-search-entity-limit-required": "La limite de recherche d’entités par relation est requise.", + "relation-search-entity-limit-range": "La limite de recherche d’entités par relation ne peut pas être inférieure à « 1 »", "rate-limits": { "add-limit": "Ajouter une limite", "and-also-less-than": "et aussi inférieur à", @@ -6003,7 +6569,9 @@ "default-agg-interval": "Intervalle de regroupement par défaut", "edit-intervals-list-hint": "Il est possible de spécifier la liste des options d’intervalle disponibles.", "edit-grouping-intervals-list-hint": "Il est possible de configurer la liste des intervalles de regroupement et l’intervalle par défaut.", - "all": "Tous" + "all": "Tous", + "save-current-settings-as-default": "Enregistrer les paramètres actuels comme fenêtre temporelle par défaut", + "hide-option-from-end-users": "Masquer l’option aux utilisateurs finaux" }, "tooltip": { "trigger": "Déclencheur", @@ -6657,7 +7225,8 @@ "export-relations": "Exporter les relations", "export-attributes": "Exporter les attributs", "export-credentials": "Exporter les identifiants", - "export-calculated-fields": "Exporter les champs calculés", + "export-calculated-fields": "Exporter les champs calculés \net les règles d’alarme", + "export-alarm-rules": "Exporter les règles d’alarme", "entity-versions": "Versions des entités", "versions": "Versions", "created-time": "Date de création", @@ -6675,6 +7244,7 @@ "load-attributes": "Charger les attributs", "load-credentials": "Charger les identifiants", "load-calculated-fields": "Charger les champs calculés", + "load-alarm-rules": "Charger les règles d’alarme", "compare-with-current": "Comparer avec l'actuel", "diff-entity-with-version": "Comparer avec la version d'entité '{{versionName}}'", "previous-difference": "Différence précédente", @@ -6884,7 +7454,23 @@ "scan-qr-code": "Scanner le code QR", "make-phone-call": "Passer un appel téléphonique", "get-location": "Obtenir la localisation du téléphone", - "take-screenshot": "Faire une capture d'écran" + "take-screenshot": "Faire une capture d'écran", + "handle-provision-success-function": "Gérer la fonction de succès du provisionnement", + "get-location-function": "Obtenir la fonction de localisation", + "process-launch-result-function": "Traiter la fonction de résultat de lancement", + "get-phone-number-function": "Obtenir la fonction de numéro de téléphone", + "process-image-function": "Traiter la fonction d’image", + "process-qr-code-function": "Traiter la fonction de code QR", + "process-location-function": "Traiter la fonction de localisation", + "handle-empty-result-function": "Gérer la fonction de résultat vide", + "handle-error-function": "Gérer la fonction d’erreur", + "handle-non-mobile-fallback-function": "Gérer la fonction de repli non mobile", + "save-to-gallery": "Enregistrer dans la galerie", + "provision-type": "Type de provisionnement", + "auto": "Auto", + "wi-fi": "Wi-Fi", + "ble": "BLE", + "soft-ap": "Soft AP" }, "custom-action-function": "Fonction d'action personnalisée", "custom-pretty-function": "Fonction d'action personnalisée (avec modèle HTML)", @@ -6893,7 +7479,8 @@ "marker": "Marqueur", "polygon": "Polygone", "rectangle": "Rectangle", - "circle": "Cercle" + "circle": "Cercle", + "polyline": "Polyligne" }, "place-map-item": "Placer un élément cartographique", "map-item-tooltip": { @@ -6905,7 +7492,9 @@ "continue-draw-polygon": "Continuer le dessin du polygone", "finish-draw-polygon": "Terminer le dessin du polygone", "start-draw-circle": "Commencer à dessiner un cercle", - "finish-draw-circle": "Terminer le dessin du cercle" + "finish-draw-circle": "Terminer le dessin du cercle", + "start-draw-polyline": "Commencer à dessiner une polyligne", + "finish-draw-polyline": "Terminer le dessin de la polyligne" } }, "widgets-bundle": { @@ -7471,6 +8060,14 @@ "update-animation-delay": "Délai de l’animation de mise à jour" }, "chart-axis": { + "limit": "Limite", + "source": "Source", + "key-value": "Clé / valeur", + "value-required": "La valeur est requise.", + "entity-key-required": "La clé d’entité est requise.", + "key-required": "La clé est requise.", + "scale-limits": "Limites d’échelle", + "scale-appearance": "Apparence de l’échelle", "scale": "Échelle", "scale-min": "min", "scale-max": "max", @@ -8015,7 +8612,10 @@ "add-radio-option": "Ajouter une option radio", "radio-label-position": "Position de l’étiquette", "radio-label-position-before": "Avant", - "radio-label-position-after": "Après" + "radio-label-position-after": "Après", + "save-image": "Enregistrer l’image", + "save-to-gallery": "Enregistrer automatiquement les images capturées dans la galerie d’images", + "public-image": "Rendre l’image disponible pour tout utilisateur non autorisé" }, "invalid-qr-code-text": "Texte saisi invalide pour le code QR. L'entrée doit être une chaîne de caractères", "qr-code": { @@ -8310,7 +8910,8 @@ "trips": "Trajets", "markers": "Marqueurs", "polygons": "Polygones", - "circles": "Cercles" + "circles": "Cercles", + "polylines": "Polylignes" }, "data-layer": { "source": "Source", @@ -8507,11 +9108,30 @@ "finish-circle-hint-with-entity": "Cercle pour '{{entityName}}' : cliquez pour terminer et enregistrer le cercle", "finish-circle-hint": "Cercle : cliquez pour terminer le dessin" }, + "polyline": { + "polyline-key": "Clé de polyligne", + "polyline-key-required": "La clé de polyligne est requise", + "no-polylines": "Aucune polyligne configurée", + "add-polylines": "Ajouter une polyligne", + "polyline-configuration": "Configuration de la polyligne", + "remove-polyline": "Supprimer la polyligne", + "edit": "Modifier la polyligne", + "cut": "Couper la zone de polyligne", + "rotate": "Faire pivoter la polyligne", + "remove-polyline-for": "Supprimer la polyligne pour « {{entityName}} »", + "draw-polyline": "Dessiner une polyligne", + "polyline-place-first-point-hint-with-entity": "Polyligne pour « {{entityName}} » : cliquer pour placer le premier point", + "polyline-place-first-point-hint": "Polyligne : cliquer pour placer le premier point", + "finish-polyline-hint-with-entity": "Polyligne pour « {{entityName}} » : cliquer pour terminer le dessin", + "finish-polyline-hint": "Polyligne : cliquer pour terminer le dessin", + "polyline-place-first-point-cut-hint": "Cliquer pour placer le premier point", + "finish-polyline-cut-hint": "Cliquer sur le premier marqueur pour terminer et enregistrer" + }, "select-entity": "Sélectionner une entité", - "select-entity-hint": "Astuce : après sélection, cliquez sur la carte pour définir la position" + "select-entity-hint": "Astuce : après la sélection, cliquer sur la carte pour définir la position" }, "select-entity": "Sélectionner une entité", - "select-entity-hint": "Astuce : après la sélection, cliquez sur la carte pour définir la position", + "select-entity-hint": "Astuce : après la sélection, cliquer sur la carte pour définir la position", "tooltips": { "placeMarker": "Cliquez pour placer l’entité '{{entityName}}'", "firstVertex": "Polygone pour '{{entityName}}' : cliquez pour placer le premier point", @@ -8948,6 +9568,7 @@ "show-empty-space-hidden-action": "Afficher un espace vide à la place du bouton d'action masqué", "dont-reserve-space-hidden-action": "Ne pas réserver d'espace pour les boutons d'action masqués", "display-timestamp": "Horodatage", + "timestamp-column-name": "Horodatage", "display-pagination": "Afficher la pagination", "default-page-size": "Taille de page par défaut", "page-step-settings": "Paramètres de pas de page", @@ -9009,7 +9630,9 @@ "alarm-column-error": "Au moins une colonne d'alarme doit être spécifiée", "table-tabs": "Onglets du tableau", "show-cell-actions-menu-mobile": "Afficher le menu déroulant d'actions des cellules en mode mobile", - "disable-sorting": "Désactiver le tri" + "disable-sorting": "Désactiver le tri", + "sort-by": "Trier les onglets par", + "sort-timestamp-option": "Date de création" }, "latest-chart": { "total": "Total", @@ -9501,11 +10124,28 @@ "content": "

En créant des tableaux de bord pour les utilisateurs finaux, un utilisateur client ne peut voir que ses propres appareils. Les données d'autres clients lui seront invisibles.

Suivez la documentation pour savoir comment procéder :

" } } + }, + "api-usage": { + "api-usage": "Utilisation de l’API", + "label": "Libellé", + "state-name": "Nom de l’état", + "status": "Statut", + "status-required": "Le statut est requis.", + "limit": "Limite max", + "limit-required": "La limite max est requise.", + "current-number": "Nombre actuel", + "current-number-required": "Le nombre actuel est requis.", + "add-key": "Ajouter une clé", + "no-key": "Aucune clé", + "delete-key": "Supprimer la clé", + "target-dashboard-state": "État cible du tableau de bord", + "go-to-main-state": "Aller à la vue par défaut" } }, "icon": { "icon": "Icône", "icons": "Icônes", + "custom": "Personnalisé", "select-icon": "Sélectionner une icône", "material-icons": "Icônes Material", "show-all": "Afficher toutes les icônes", @@ -9546,6 +10186,7 @@ "items-per-page-separator": "sur" }, "language": { + "auto": "Auto", "language": "Langue" } } \ No newline at end of file diff --git a/ui-ngx/src/assets/locale/locale.constant-hi_IN.json b/ui-ngx/src/assets/locale/locale.constant-hi_IN.json new file mode 100644 index 0000000000..864a229e5d --- /dev/null +++ b/ui-ngx/src/assets/locale/locale.constant-hi_IN.json @@ -0,0 +1,9547 @@ +{ + "access": { + "unauthorized": "अनधिकृत", + "unauthorized-access": "अनधिकृत अभिगम", + "unauthorized-access-text": "इस संसाधन तक पहुँच के लिए आपको साइन इन करना आवश्यक है!", + "access-forbidden": "अभिगम निषिद्ध", + "access-forbidden-text": "आपके पास इस स्थान तक पहुँच अधिकार नहीं हैं!
यदि आप अभी भी इस स्थान तक पहुँच प्राप्त करना चाहते हैं, तो किसी दूसरे उपयोगकर्ता से साइन इन करने का प्रयास करें।", + "refresh-token-expired": "सत्र समाप्त हो गया है", + "refresh-token-failed": "सत्र को रीफ़्रेश नहीं किया जा सका", + "permission-denied": "अनुमति अस्वीकृत", + "permission-denied-text": "आपके पास यह कार्य करने की अनुमति नहीं है!" + }, + "account": { + "account": "खाता", + "notification-settings": "सूचना सेटिंग्स" + }, + "action": { + "activate": "सक्रिय करें", + "suspend": "निलंबित करें", + "save": "सहेजें", + "saveAs": "इस रूप में सहेजें", + "move": "स्थानांतरित करें", + "cancel": "रद्द करें", + "ok": "ठीक है", + "delete": "हटाएँ", + "add": "जोड़ें", + "yes": "हाँ", + "no": "नहीं", + "update": "अपडेट करें", + "remove": "निकालें", + "search": "खोजें", + "clear-search": "खोज साफ़ करें", + "assign": "सौंपें", + "unassign": "असाइन हटाएँ", + "share": "साझा करें", + "make-private": "निजी बनाएँ", + "apply": "लागू करें", + "apply-changes": "परिवर्तनों को लागू करें", + "edit-mode": "संपादन मोड", + "enter-edit-mode": "संपादन मोड में जाएँ", + "decline-changes": "परिवर्तनों को अस्वीकार करें", + "decline": "अस्वीकार करें", + "close": "बंद करें", + "back": "वापस", + "run": "चलाएँ", + "sign-in": "साइन इन करें!", + "edit": "संपादित करें", + "view": "देखें", + "create": "बनाएँ", + "drag": "खींचें", + "refresh": "ताज़ा करें", + "undo": "पूर्ववत करें", + "copy": "कॉपी करें", + "paste": "पेस्ट करें", + "copy-reference": "संदर्भ कॉपी करें", + "paste-reference": "संदर्भ पेस्ट करें", + "import": "आयात करें", + "export": "निर्यात करें", + "share-via": "{{provider}} के माध्यम से साझा करें", + "select": "चयन करें", + "continue": "जारी रखें", + "discard-changes": "परिवर्तनों को त्यागें", + "download": "डाउनलोड करें", + "next": "अगला", + "next-with-label": "अगला: {{label}}", + "read-more": "और पढ़ें", + "hide": "छुपाएँ", + "test": "परीक्षण करें", + "done": "हो गया", + "print": "प्रिंट करें", + "restore": "पुनर्स्थापित करें", + "confirm": "पुष्टि करें", + "more": "अधिक", + "less": "कम", + "skip": "छोड़ें", + "send": "भेजें", + "reset": "रीसेट करें", + "show-more": "और दिखाएँ", + "dont-show-again": "दोबारा न दिखाएँ", + "see-documentation": "दस्तावेज़ देखें", + "clear": "साफ़ करें", + "upload": "अपलोड करें", + "delete-anyway": "फिर भी हटाएँ", + "delete-selected": "चयनित हटाएँ", + "set": "सेट करें" + }, + "aggregation": { + "aggregation": "संकलन", + "function": "डेटा संकलन फ़ंक्शन", + "limit": "अधिकतम मान", + "group-interval": "समूहीकरण अंतराल", + "min": "न्यूनतम", + "max": "अधिकतम", + "avg": "औसत", + "sum": "योग", + "count": "गणना", + "none": "कोई नहीं" + }, + "admin": { + "settings": "सेटिंग्स", + "general": "सामान्य", + "general-settings": "सामान्य सेटिंग्स", + "home-settings": "होम सेटिंग्स", + "home": "होम", + "outgoing-mail": "मेल सर्वर", + "outgoing-mail-settings": "आउटगोइंग मेल सर्वर सेटिंग्स", + "system-settings": "सिस्टम सेटिंग्स", + "test-mail-sent": "परीक्षण मेल सफलतापूर्वक भेजा गया!", + "base-url": "बेस URL", + "base-url-required": "बेस URL आवश्यक है।", + "prohibit-different-url": "क्लाइंट रिक्वेस्ट हेडर से होस्टनेम का उपयोग निषिद्ध करें", + "prohibit-different-url-hint": "यह सेटिंग प्रोडक्शन वातावरण के लिए सक्षम होनी चाहिए। इसे अक्षम करने पर सुरक्षा समस्याएँ हो सकती हैं", + "device-connectivity": { + "device-connectivity": "डिवाइस कनेक्टिविटी", + "http-s": "HTTP(s)", + "mqtt-s": "MQTT(s)", + "coap-s": "COAP(s)", + "http": "HTTP", + "https": "HTTPs", + "mqtt": "MQTT", + "mqtts": "MQTTs", + "coap": "COAP", + "coaps": "COAPs", + "hint": "यदि होस्ट या पोर्ट फ़ील्ड खाली हैं, तो डिफ़ॉल्ट प्रोटोकॉल मान का उपयोग किया जाएगा।", + "host": "होस्ट", + "port": "पोर्ट", + "port-pattern": "पोर्ट एक धनात्मक पूर्णांक होना चाहिए।", + "port-range": "पोर्ट 1 से 65535 की सीमा में होना चाहिए।" + }, + "mail-from": "प्रेषक ईमेल पता", + "mail-from-required": "प्रेषक ईमेल पता आवश्यक है।", + "smtp-protocol": "SMTP प्रोटोकॉल", + "smtp-host": "SMTP होस्ट", + "smtp-host-required": "SMTP होस्ट आवश्यक है।", + "smtp-port": "SMTP पोर्ट", + "smtp-port-required": "आपको SMTP पोर्ट देना होगा।", + "smtp-port-invalid": "यह वैध SMTP पोर्ट जैसा नहीं लगता।", + "timeout-msec": "टाइमआउट (मिलीसेकंड)", + "timeout-required": "टाइमआउट आवश्यक है।", + "timeout-invalid": "यह वैध टाइमआउट जैसा नहीं लगता।", + "enable-tls": "TLS सक्षम करें", + "tls-version": "TLS संस्करण", + "enable-proxy": "प्रॉक्सी सक्षम करें", + "proxy-host": "प्रॉक्सी होस्ट", + "proxy-host-required": "प्रॉक्सी होस्ट आवश्यक है।", + "proxy-port": "प्रॉक्सी पोर्ट", + "proxy-port-required": "प्रॉक्सी पोर्ट आवश्यक है।", + "proxy-port-range": "प्रॉक्सी पोर्ट 1 से 65535 की सीमा में होना चाहिए।", + "proxy-user": "प्रॉक्सी उपयोगकर्ता", + "proxy-password": "प्रॉक्सी पासवर्ड", + "change-password": "पासवर्ड बदलें", + "send-test-mail": "टेस्ट मेल भेजें", + "sms-provider": "SMS प्रदाता", + "sms-provider-settings": "SMS प्रदाता सेटिंग्स", + "sms-provider-type": "SMS प्रदाता प्रकार", + "sms-provider-type-required": "SMS प्रदाता प्रकार आवश्यक है।", + "sms-provider-type-aws-sns": "Amazon SNS", + "sms-provider-type-twilio": "Twilio", + "sms-provider-type-smpp": "SMPP", + "aws-access-key-id": "AWS Access Key ID", + "aws-access-key-id-required": "AWS Access Key ID आवश्यक है", + "aws-secret-access-key": "AWS Secret Access Key", + "aws-secret-access-key-required": "AWS Secret Access Key आवश्यक है", + "aws-region": "AWS Region", + "aws-region-required": "AWS Region आवश्यक है", + "number-from": "स्रोत फोन नंबर", + "number-from-required": "स्रोत फोन नंबर आवश्यक है।", + "number-to": "गंतव्य फोन नंबर", + "number-to-required": "गंतव्य फोन नंबर आवश्यक है।", + "phone-number-hint": "फ़ोन नंबर E.164 फ़ॉर्मेट में, उदाहरण: +19995550123", + "phone-number-hint-twilio": "फ़ोन नंबर E.164 फ़ॉर्मेट/फोन नंबर के SID/मैसेजिंग सर्विस SID में, उदाहरण: +19995550123/PNXXX/MGXXX", + "phone-number-pattern": "अमान्य फोन नंबर। E.164 फ़ॉर्मेट में होना चाहिए, उदाहरण: +19995550123.", + "phone-number-pattern-twilio": "अमान्य फोन नंबर। E.164 फ़ॉर्मेट/फोन नंबर के SID/मैसेजिंग सर्विस SID में होना चाहिए, उदाहरण: +19995550123/PNXXX/MGXXX.", + "sms-message": "SMS संदेश", + "sms-message-required": "SMS संदेश आवश्यक है।", + "sms-message-max-length": "SMS संदेश 1600 अक्षरों से अधिक लंबा नहीं हो सकता", + "twilio-account-sid": "Twilio Account SID", + "twilio-account-sid-required": "Twilio Account SID आवश्यक है", + "twilio-account-token": "Twilio Account Token", + "twilio-account-token-required": "Twilio Account Token आवश्यक है", + "send-test-sms": "परीक्षण SMS भेजें", + "test-sms-sent": "परीक्षण SMS सफलतापूर्वक भेजा गया!", + "security-settings": "सुरक्षा सेटिंग्स", + "password-policy": "पासवर्ड नीति", + "minimum-password-length": "न्यूनतम पासवर्ड लंबाई", + "minimum-password-length-required": "न्यूनतम पासवर्ड लंबाई आवश्यक है", + "minimum-password-length-range": "न्यूनतम पासवर्ड लंबाई 6 से 50 की सीमा में होनी चाहिए", + "maximum-password-length": "अधिकतम पासवर्ड लंबाई", + "maximum-password-length-min": "अधिकतम पासवर्ड लंबाई कम-से-कम 6 होनी चाहिए", + "maximum-password-length-less-min": "अधिकतम पासवर्ड लंबाई न्यूनतम लंबाई से अधिक होनी चाहिए", + "minimum-uppercase-letters": "बड़े अक्षरों की न्यूनतम संख्या", + "minimum-uppercase-letters-range": "बड़े अक्षरों की न्यूनतम संख्या नकारात्मक नहीं हो सकती", + "minimum-lowercase-letters": "छोटे अक्षरों की न्यूनतम संख्या", + "minimum-lowercase-letters-range": "छोटे अक्षरों की न्यूनतम संख्या नकारात्मक नहीं हो सकती", + "minimum-digits": "अंकों की न्यूनतम संख्या", + "minimum-digits-range": "अंकों की न्यूनतम संख्या नकारात्मक नहीं हो सकती", + "minimum-special-characters": "विशेष अक्षरों की न्यूनतम संख्या", + "minimum-special-characters-range": "विशेष अक्षरों की न्यूनतम संख्या नकारात्मक नहीं हो सकती", + "password-expiration-period-days": "पासवर्ड समाप्ति अवधि (दिनों में)", + "password-expiration-period-days-range": "पासवर्ड समाप्ति अवधि (दिनों में) नकारात्मक नहीं हो सकती", + "password-reuse-frequency-days": "पासवर्ड पुन: उपयोग आवृत्ति (दिनों में)", + "password-reuse-frequency-days-range": "पासवर्ड पुन: उपयोग आवृत्ति (दिनों में) नकारात्मक नहीं हो सकती", + "allow-whitespace": "व्हाइटस्पेस की अनुमति दें", + "force-reset-password-if-no-valid": "अमान्य होने पर पासवर्ड रीसेट करने के लिए बाध्य करें", + "force-reset-password-if-no-valid-hint": "कृपया इस फ़ीचर को सक्षम करते समय सावधान रहें: यह अमान्य पासवर्ड वाले उपयोगकर्ताओं को ईमेल के माध्यम से अपना पासवर्ड रीसेट करने की आवश्यकता होगी।", + "general-policy": "सामान्य नीति", + "max-failed-login-attempts": "खाता लॉक होने से पहले असफल लॉगिन प्रयासों की अधिकतम संख्या", + "minimum-max-failed-login-attempts-range": "असफल लॉगिन प्रयासों की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "user-lockout-notification-email": "उपयोगकर्ता खाता लॉक होने की स्थिति में, ईमेल पर सूचना भेजें", + "user-activation-token-ttl": "उपयोगकर्ता सक्रियण लिंक TTL (घंटों में)", + "user-activation-token-ttl-range": "उपयोगकर्ता सक्रियण लिंक TTL 1 से 24 घंटे की सीमा में होना चाहिए", + "password-reset-token-ttl": "पासवर्ड रीसेट लिंक TTL (घंटों में)", + "password-reset-token-ttl-range": "पासवर्ड रीसेट लिंक TTL 1 से 24 घंटे की सीमा में होना चाहिए", + "mobile-secret-key-length": "मोबाइल सीक्रेट कुंजी की लंबाई", + "mobile-secret-key-length-range": "मोबाइल सीक्रेट कुंजी की लंबाई धनात्मक होनी चाहिए", + "domain-name": "डोमेन नाम", + "domain-name-unique": "डोमेन नाम और प्रोटोकॉल अद्वितीय होने चाहिए।", + "domain-name-max-length": "डोमेन नाम 256 अक्षरों से कम होना चाहिए", + "error-verification-url": "डोमेन नाम में '/' और ':' चिन्ह नहीं होने चाहिए। उदाहरण: thingsboard.io", + "connection-settings": "कनेक्शन सेटिंग्स", + "oauth2": { + "access-token-uri": "ऐक्सेस टोकन URI", + "access-token-uri-required": "ऐक्सेस टोकन URI आवश्यक है।", + "activate-user": "उपयोगकर्ता को सक्रिय करें", + "add-domain": "डोमेन जोड़ें", + "delete-domain": "डोमेन हटाएँ", + "add-provider": "प्रोवाइडर जोड़ें", + "delete-provider": "प्रोवाइडर हटाएँ", + "allow-user-creation": "उपयोगकर्ता बनाने की अनुमति दें", + "always-fullscreen": "हमेशा फुलस्क्रीन", + "authorization-uri": "ऑथराइजेशन URI", + "authorization-uri-required": "ऑथराइजेशन URI आवश्यक है।", + "add-client": "OAuth 2.0 क्लाइंट जोड़ें", + "client-details": "OAuth 2.0 क्लाइंट विवरण", + "client": "OAuth 2.0 क्लाइंट", + "clients": "OAuth 2.0 क्लाइंट्स", + "no-oauth2-clients": "कोई OAuth 2.0 क्लाइंट नहीं मिला", + "search-oauth2-clients": "OAuth 2.0 क्लाइंट्स खोजें", + "delete-client-title": "क्या आप वाकई OAuth 2.0 क्लाइंट '{{clientName}}' हटाना चाहते हैं?", + "delete-client-text": "सावधान रहें, पुष्टि के बाद क्लाइंट और उससे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "delete-mobile-app-title": "क्या आप वाकई मोबाइल एप्लिकेशन '{{applicationName}}' हटाना चाहते हैं?", + "delete-mobile-app-text": "सावधान रहें, पुष्टि के बाद मोबाइल एप्लिकेशन और उससे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "title": "शीर्षक", + "client-title-required": "शीर्षक आवश्यक है", + "client-title-max-length": "शीर्षक 100 अक्षरों से कम होना चाहिए", + "advanced-settings": "उन्नत सेटिंग्स", + "domain-details": "डोमेन विवरण", + "no-domains": "कोई डोमेन नहीं मिला", + "search-domains": "डोमेन खोजें", + "mobile-app-details": "मोबाइल एप्लिकेशन विवरण", + "add-mobile-app": "मोबाइल एप्लिकेशन जोड़ें", + "no-mobile-apps": "कोई मोबाइल एप्लिकेशन नहीं मिला", + "search-mobile-apps": "मोबाइल एप्लिकेशन खोजें", + "send-token": "टोकन भेजें", + "create-new": "नया बनाएँ", + "client-authentication-method": "क्लाइंट प्रमाणीकरण विधि", + "client-id": "क्लाइंट ID", + "client-id-required": "क्लाइंट ID आवश्यक है।", + "client-id-max-length": "क्लाइंट ID 256 अक्षरों से कम होना चाहिए", + "client-secret": "क्लाइंट सीक्रेट", + "client-secret-required": "क्लाइंट सीक्रेट आवश्यक है।", + "client-secret-max-length": "क्लाइंट सीक्रेट 2049 अक्षरों से कम होना चाहिए", + "custom-setting": "कस्टम सेटिंग्स", + "customer-name-pattern": "ग्राहक नाम पैटर्न", + "customer-name-pattern-max-length": "ग्राहक नाम पैटर्न 256 अक्षरों से कम होना चाहिए", + "default-dashboard-name": "डिफ़ॉल्ट डैशबोर्ड नाम", + "default-dashboard-name-max-length": "डिफ़ॉल्ट डैशबोर्ड नाम 256 अक्षरों से कम होना चाहिए", + "delete-domain-text": "सावधान रहें, पुष्टि के बाद डोमेन और सभी प्रदाता डेटा उपलब्ध नहीं रहेगा।", + "delete-domain-title": "क्या आप वाकई डोमेन '{{domainName}}' हटाना चाहते हैं?", + "delete-registration-text": "सावधान रहें, पुष्टि के बाद प्रदाता का डेटा उपलब्ध नहीं रहेगा।", + "delete-registration-title": "क्या आप वाकई प्रदाता '{{name}}' हटाना चाहते हैं?", + "email-attribute-key": "ईमेल विशेषता कुंजी", + "email-attribute-key-required": "ईमेल विशेषता कुंजी आवश्यक है।", + "email-attribute-key-max-length": "ईमेल विशेषता कुंजी 32 अक्षरों से कम होना चाहिए", + "first-name-attribute-key": "पहले नाम की विशेषता कुंजी", + "first-name-attribute-key-max-length": "पहले नाम की विशेषता कुंजी 32 अक्षरों से कम होना चाहिए", + "general": "सामान्य", + "jwk-set-uri": "JSON वेब की (JWK) URI", + "last-name-attribute-key": "अंतिम नाम की विशेषता कुंजी", + "last-name-attribute-key-max-length": "अंतिम नाम की विशेषता कुंजी 32 अक्षरों से कम होना चाहिए", + "login-button-icon": "लॉगिन बटन आइकन", + "login-button-label": "प्रदाता लेबल", + "login-button-label-placeholder": " $(Provider label) से लॉगिन करें", + "login-button-label-required": "लेबल आवश्यक है।", + "login-provider": "लॉगिन प्रदाता", + "mapper": "मैपर", + "new-domain": "नया डोमेन", + "oauth2": "OAuth 2.0", + "password-max-length": "पासवर्ड 256 अक्षरों से कम होना चाहिए", + "redirect-uri-template": "रीडायरेक्ट URI टेम्पलेट", + "copy-redirect-uri": "रीडायरेक्ट URI कॉपी करें", + "registration-id": "पंजीकरण ID", + "registration-id-required": "पंजीकरण ID आवश्यक है।", + "registration-id-unique": "पंजीकरण ID सिस्टम के लिए अद्वितीय होना चाहिए।", + "scope": "स्कोप", + "scope-required": "स्कोप आवश्यक है।", + "tenant-name-pattern": "टेनेंट नाम पैटर्न", + "tenant-name-pattern-required": "टेनेंट नाम पैटर्न आवश्यक है।", + "tenant-name-pattern-max-length": "टेनेंट नाम पैटर्न 256 अक्षरों से कम होना चाहिए", + "tenant-name-strategy": "टेनेंट नाम रणनीति", + "type": "मैपर प्रकार", + "uri-pattern-error": "अमान्य URI फ़ॉर्मेट।", + "url": "URL", + "url-pattern": "अमान्य URL फ़ॉर्मेट।", + "url-required": "URL आवश्यक है।", + "url-max-length": "URL 256 अक्षरों से कम होना चाहिए", + "user-info-uri": "उपयोगकर्ता जानकारी URI", + "user-info-uri-required": "उपयोगकर्ता जानकारी URI आवश्यक है।", + "username-max-length": "उपयोगकर्ता नाम 256 अक्षरों से कम होना चाहिए", + "user-name-attribute-name": "उपयोगकर्ता नाम विशेषता कुंजी", + "user-name-attribute-name-required": "उपयोगकर्ता नाम विशेषता कुंजी आवश्यक है", + "protocol": "प्रोटोकॉल", + "domain-schema-http": "HTTP", + "domain-schema-https": "HTTPS", + "domain-schema-mixed": "HTTP+HTTPS", + "enable": "OAuth 2.0 सेटिंग्स सक्षम करें", + "disable": "OAuth 2.0 सेटिंग्स अक्षम करें", + "edge": "Edge पर प्रसार करें", + "edge-enable": "Edge पर प्रसार सक्षम करें", + "edge-disable": "Edge पर प्रसार अक्षम करें", + "domains": "डोमेन", + "mobile-apps": "मोबाइल एप्लिकेशन", + "mobile-package": "एप्लिकेशन पैकेज", + "mobile-package-placeholder": "उदा.: my.example.app", + "mobile-package-hint": "Android के लिए: आपका अपना अद्वितीय Application ID. iOS के लिए: Product bundle identifier.", + "mobile-package-unique": "एप्लिकेशन पैकेज अद्वितीय होना चाहिए।", + "mobile-package-required": "एप्लिकेशन पैकेज आवश्यक है।", + "mobile-package-max-length": "एप्लिकेशन पैकेज 256 अक्षरों से कम होना चाहिए", + "mobile-package-spaces": "एप्लिकेशन पैकेज में रिक्त स्थान नहीं होने चाहिए", + "mobile-app-secret": "एप्लिकेशन सीक्रेट", + "mobile-app-secret-hint": "Base64 एन्कोडेड स्ट्रिंग जो कम से कम 512 बिट डेटा का प्रतिनिधित्व करती हो।", + "mobile-app-secret-required": "एप्लिकेशन सीक्रेट आवश्यक है।", + "mobile-app-secret-min-length": "एप्लिकेशन सीक्रेट में कम से कम 512 बिट डेटा होना आवश्यक है।", + "mobile-app-secret-base64": "एप्लिकेशन सीक्रेट base64 फ़ॉर्मेट में होना चाहिए।", + "invalid-mobile-app-secret": "एप्लिकेशन सीक्रेट में केवल अल्फ़ान्यूमेरिक वर्ण होने चाहिए और इसकी लंबाई 16 से 2048 अक्षरों के बीच होनी चाहिए।", + "copy-mobile-app-secret": "एप्लिकेशन सीक्रेट कॉपी करें", + "delete-mobile-app": "एप्लिकेशन जानकारी हटाएँ", + "providers": "प्रदाता", + "platform-web": "वेब", + "platform-android": "Android", + "platform-ios": "iOS", + "all-platforms": "सभी प्लेटफ़ॉर्म", + "smtp-provider": "SMTP प्रदाता", + "allowed-platforms": "अनुमत प्लेटफ़ॉर्म", + "authentication": "प्रमाणीकरण", + "basic": "बेसिक", + "provider": "प्रदाता", + "redirect-url": "रीडायरेक्ट URI", + "domain-name": "डोमेन नाम", + "domain-name-required": "डोमेन नाम आवश्यक है", + "redirect-url-template": "रीडायरेक्ट URI टेम्पलेट", + "microsoft-tenant-id": "डायरेक्टरी (टेनेंट) ID", + "microsoft-tenant-id-required": "डायरेक्टरी (टेनेंट) ID आवश्यक है", + "token-uri": "टोकन URI", + "token-uri-required": "टोकन URI आवश्यक है", + "redirect-uri": "रीडायरेक्ट URI", + "google-provider": "Google", + "microsoft-provider": "Office 365", + "sendgrid-provider": "Sendgrid", + "custom-provider": "कस्टम", + "generate-access-token": "एक्सेस टोकन जनरेट करें", + "update-access-token": "एक्सेस टोकन अपडेट करें", + "access-token-status": "एक्सेस टोकन स्थिति:", + "token-status-generated": "जनरेट किया गया", + "token-status-not-generated": "जनरेट नहीं किया गया" + }, + "smpp-provider": { + "smpp-version": "SMPP संस्करण", + "smpp-host": "SMPP होस्ट", + "smpp-host-required": "SMPP होस्ट आवश्यक है", + "smpp-port": "SMPP पोर्ट", + "smpp-port-required": "SMPP पोर्ट आवश्यक है", + "system-id": "सिस्टम ID", + "system-id-required": "सिस्टम ID आवश्यक है", + "password": "पासवर्ड", + "password-required": "पासवर्ड आवश्यक है", + "type-settings": "टाइप सेटिंग्स", + "source-settings": "सोर्स सेटिंग्स", + "destination-settings": "डेस्टिनेशन सेटिंग्स", + "additional-settings": "अतिरिक्त सेटिंग्स", + "system-type": "सिस्टम प्रकार", + "bind-type": "बाइंड प्रकार", + "service-type": "सर्विस प्रकार", + "source-address": "सोर्स पता", + "source-ton": "सोर्स TON", + "source-npi": "सोर्स NPI", + "destination-ton": "डेस्टिनेशन TON (Type of Number)", + "destination-npi": "डेस्टिनेशन NPI (Numbering Plan Identification)", + "address-range": "पते की रेंज", + "coding-scheme": "कोडिंग स्कीम", + "bind-type-tx": "ट्रांसमीटर", + "bind-type-rx": "रिसीवर", + "bind-type-trx": "ट्रांससीवर", + "ton-unknown": "अज्ञात", + "ton-international": "अंतरराष्ट्रीय", + "ton-national": "राष्ट्रीय", + "ton-network-specific": "नेटवर्क विशिष्ट", + "ton-subscriber-number": "सब्सक्राइबर नंबर", + "ton-alphanumeric": "अल्फ़ान्यूमेरिक", + "ton-abbreviated": "संक्षिप्त", + "npi-unknown": "0 - अज्ञात", + "npi-isdn": "1 - ISDN/टेलीफोन नंबरिंग प्लान (E163/E164)", + "npi-data-numbering-plan": "3 - डेटा नंबरिंग प्लान (X.121)", + "npi-telex-numbering-plan": "4 - टेलेक्स नंबरिंग प्लान (F.69)", + "npi-land-mobile": "6 - लैंड मोबाइल (E.212)", + "npi-national-numbering-plan": "8 - राष्ट्रीय नंबरिंग प्लान", + "npi-private-numbering-plan": "9 - निजी नंबरिंग प्लान", + "npi-ermes-numbering-plan": "10 - ERMES नंबरिंग प्लान (ETSI DE/PS 3 01-3)", + "npi-internet": "13 - इंटरनेट (IP)", + "npi-wap-client-id": "18 - WAP क्लाइंट Id (WAP Forum द्वारा परिभाषित किया जाना है)", + "scheme-smsc": "0 - SMSC डिफ़ॉल्ट अल्फ़ाबेट (short और long code के लिए ASCII और toll-free के लिए GSM)", + "scheme-ia5": "1 - IA5 (short और long code के लिए ASCII, toll-free के लिए Latin 9 (ISO-8859-9))", + "scheme-octet-unspecified-2": "2 - Octet Unspecified (8-bit binary)", + "scheme-latin-1": "3 - Latin 1 (ISO-8859-1)", + "scheme-octet-unspecified-4": "4 - Octet Unspecified (8-bit binary)", + "scheme-jis": "5 - JIS (X 0208-1990)", + "scheme-cyrillic": "6 - Cyrillic (ISO-8859-5)", + "scheme-latin-hebrew": "7 - Latin/Hebrew (ISO-8859-8)", + "scheme-ucs-utf": "8 - UCS2/UTF-16 (ISO/IEC-10646)", + "scheme-pictogram-encoding": "9 - पिक्टोग्राम एन्कोडिंग", + "scheme-music-codes": "10 - म्यूजिक कोड्स (ISO-2022-JP)", + "scheme-extended-kanji-jis": "13 - एक्सटेंडेड Kanji JIS (X 0212-1990)", + "scheme-korean-graphic-character-set": "14 - कोरियन ग्राफ़िक कैरेक्टर सेट (KS C 5601/KS X 1001)" + }, + "queue-select-name": "क्यू नाम चुनें", + "queue-name": "नाम", + "queue-name-required": "क्यू नाम आवश्यक है!", + "queues": "क्यूज़", + "queue-partitions": "पार्टिशन", + "queue-submit-strategy": "सबमिट स्ट्रेटेजी", + "queue-processing-strategy": "प्रोसेसिंग स्ट्रेटेजी", + "queue-configuration": "क्यू कॉन्फ़िगरेशन", + "repository-settings": "रिपॉज़िटरी सेटिंग्स", + "repository": "रिपॉज़िटरी", + "repository-url": "रिपॉज़िटरी URL", + "repository-url-required": "रिपॉज़िटरी URL आवश्यक है।", + "default-branch": "डिफ़ॉल्ट ब्रांच नाम", + "repository-read-only": "केवल पढ़ने के लिए", + "show-merge-commits": "मर्ज कमिट दिखाएँ", + "authentication-settings": "प्रमाणीकरण सेटिंग्स", + "auth-method": "प्रमाणीकरण विधि", + "auth-method-username-password": "पासवर्ड / एक्सेस टोकन", + "auth-method-username-password-hint": "GitHub उपयोगकर्ताओं को रिपॉज़िटरी पर लिखने की अनुमति वाले एक्सेस tokens का उपयोग करना आवश्यक है।", + "auth-method-private-key": "प्राइवेट की", + "password-access-token": "पासवर्ड / एक्सेस टोकन", + "change-password-access-token": "पासवर्ड / एक्सेस टोकन बदलें", + "private-key": "प्राइवेट की", + "drop-private-key-file-or": "प्राइवेट की फ़ाइल को ड्रैग और ड्रॉप करें या", + "passphrase": "पासफ़्रेज़", + "enter-passphrase": "पासफ़्रेज़ दर्ज करें", + "change-passphrase": "पासफ़्रेज़ बदलें", + "check-access": "एक्सेस जाँचें", + "check-repository-access-success": "रिपॉज़िटरी एक्सेस सफलतापूर्वक सत्यापित हो गया!", + "delete-repository-settings-title": "क्या आप वाकई रिपॉज़िटरी सेटिंग्स हटाना चाहते हैं?", + "delete-repository-settings-text": "सावधान रहें, पुष्टि के बाद रिपॉज़िटरी सेटिंग्स हटा दी जाएँगी और वर्ज़न कंट्रोल फ़ीचर उपलब्ध नहीं रहेगा।", + "auto-commit-settings": "ऑटो-कमिट सेटिंग्स", + "auto-commit": "ऑटो-कमिट", + "auto-commit-entities": "ऑटो-कमिट एंटिटीज़", + "no-auto-commit-entities-prompt": "ऑटो-कमिट के लिए कोई एंटिटी कॉन्फ़िगर नहीं की गई है", + "delete-auto-commit-settings-title": "क्या आप वाकई ऑटो-कमिट सेटिंग्स हटाना चाहते हैं?", + "delete-auto-commit-settings-text": "सावधान रहें, पुष्टि के बाद ऑटो-कमिट सेटिंग्स हटा दी जाएँगी और सभी एंटिटीज़ के लिए ऑटो-कमिट अक्षम हो जाएगा।", + "mobile-app": { + "mobile-app": "मोबाइल ऐप", + "mobile-app-qr-code-widget-settings": "मोबाइल ऐप QR कोड विजेट सेटिंग्स", + "applications": "एप्लिकेशन", + "default": "डिफ़ॉल्ट", + "custom": "कस्टम", + "android": "Android", + "ios": "iOS", + "appearance": "दिखावट", + "appearance-on-home-page": "होम पेज पर दिखावट", + "enabled": "सक्रिय", + "disabled": "निष्क्रिय", + "badges": "बैज", + "label": "लेबल", + "label-required": "लेबल आवश्यक है", + "label-max-length": "लेबल 50 अक्षरों से कम या बराबर होना चाहिए", + "right": "दायाँ", + "left": "बायाँ", + "set": "सेट करें", + "preview": "पूर्वावलोकन", + "connect-mobile-app": "मोबाइल ऐप कनेक्ट करें", + "use-system-settings": "सिस्टम सेटिंग्स का उपयोग करें" + }, + "2fa": { + "2fa": "दो-कारक प्रमाणीकरण", + "available-providers": "उपलब्ध प्रदाता", + "issuer-name": "जारीकर्ता नाम", + "issuer-name-required": "जारीकर्ता नाम आवश्यक है।", + "max-verification-failures-before-user-lockout": "उपयोगकर्ता लॉक होने से पहले अधिकतम सत्यापन विफलताएँ", + "max-verification-failures-before-user-lockout-pattern": "अधिकतम सत्यापन विफलताएँ धनात्मक पूर्णांक होनी चाहिए।", + "number-of-checking-attempts": "जाँच प्रयासों की संख्या", + "number-of-checking-attempts-pattern": "जाँच प्रयासों की संख्या धनात्मक पूर्णांक होनी चाहिए।", + "number-of-checking-attempts-required": "जाँच प्रयासों की संख्या आवश्यक है।", + "number-of-codes": "कोड की संख्या", + "number-of-codes-pattern": "कोड की संख्या धनात्मक पूर्णांक होनी चाहिए।", + "number-of-codes-required": "कोड की संख्या आवश्यक है।", + "provider": "प्रदाता", + "retry-verification-code-period": "सत्यापन कोड पुनः प्रयास अवधि", + "retry-verification-code-period-pattern": "न्यूनतम अवधि 5 सेकंड है।", + "retry-verification-code-period-required": "सत्यापन कोड पुनः प्रयास अवधि आवश्यक है।", + "total-allowed-time-for-verification": "सत्यापन के लिए कुल अनुमत समय", + "total-allowed-time-for-verification-pattern": "न्यूनतम कुल अनुमत समय 60 सेकंड है।", + "total-allowed-time-for-verification-required": "कुल अनुमत समय आवश्यक है।", + "use-system-two-factor-auth-settings": "सिस्टम दो-कारक प्रमाणीकरण सेटिंग्स का उपयोग करें", + "verification-code-check-rate-limit": "सत्यापन कोड जाँच दर सीमा", + "verification-code-lifetime": "सत्यापन कोड जीवनकाल", + "verification-code-lifetime-pattern": "सत्यापन कोड जीवनकाल धनात्मक पूर्णांक होना चाहिए।", + "verification-code-lifetime-required": "सत्यापन कोड जीवनकाल आवश्यक है।", + "verification-message-template": "सत्यापन संदेश टेम्पलेट", + "verification-limitations": "सत्यापन सीमाएँ", + "verification-message-template-pattern": "सत्यापन संदेश में यह पैटर्न होना चाहिए: ${code}", + "verification-message-template-required": "सत्यापन संदेश टेम्पलेट आवश्यक है।", + "within-time": "समय के भीतर", + "within-time-pattern": "समय धनात्मक पूर्णांक होना चाहिए।", + "within-time-required": "समय आवश्यक है।" + }, + "jwt": { + "security-settings": "JWT सुरक्षा सेटिंग्स", + "issuer-name": "जारीकर्ता नाम", + "issuer-name-required": "जारीकर्ता नाम आवश्यक है।", + "signings-key": "साइनिंग की", + "signings-key-hint": "Base64 एन्कोडेड स्ट्रिंग जो कम से कम 512 बिट डेटा का प्रतिनिधित्व करती हो।", + "signings-key-required": "साइनिंग की आवश्यक है।", + "signings-key-min-length": "साइनिंग की में कम से कम 512 बिट डेटा होना आवश्यक है।", + "signings-key-base64": "साइनिंग की base64 फ़ॉर्मेट में होनी चाहिए।", + "expiration-time": "टोकन समाप्ति समय (सेकंड में)", + "expiration-time-required": "टोकन समाप्ति समय आवश्यक है।", + "expiration-time-max": "अधिकतम अनुमत समय 2147483647 सेकंड (68 वर्ष) है।", + "expiration-time-min": "न्यूनतम समय 60 सेकंड (1 मिनट) है।", + "refresh-expiration-time": "रिफ़्रेश टोकन समाप्ति समय (सेकंड में)", + "refresh-expiration-time-required": "रिफ़्रेश टोकन समाप्ति समय आवश्यक है।", + "refresh-expiration-time-max": "अधिकतम अनुमत समय 2147483647 सेकंड (68 वर्ष) है।", + "refresh-expiration-time-min": "न्यूनतम समय 900 सेकंड (15 मिनट) है।", + "refresh-expiration-time-less-token": "रिफ़्रेश टोकन का समय टोकन समय से अधिक होना चाहिए।", + "generate-key": "की जनरेट करें", + "info-header": "सभी उपयोगकर्ताओं को दोबारा लॉगिन करना होगा", + "info-message": "JWT साइनिंग की बदलने से जारी किए गए सभी टोकन अमान्य हो जाएँगे। सभी उपयोगकर्ताओं को दोबारा लॉगिन करना पड़ेगा। इसका असर उन स्क्रिप्ट्स पर भी पड़ेगा जो Rest API/Websockets का उपयोग करती हैं।" + }, + "resources": "संसाधन", + "notifications": "सूचनाएँ", + "notifications-settings": "सूचना सेटिंग्स", + "slack-api-token": "Slack API टोकन", + "slack": "Slack", + "slack-settings": "Slack सेटिंग्स", + "mobile-settings": "मोबाइल सेटिंग्स", + "firebase-service-account-file": "Firebase सर्विस अकाउंट क्रेडेंशियल्स JSON फ़ाइल", + "select-firebase-service-account-file": "अपनी Firebase सर्विस अकाउंट क्रेडेंशियल्स फ़ाइल को ड्रैग और ड्रॉप करें या ", + "trendz": "Trendz", + "trendz-settings": "Trendz सेटिंग्स", + "trendz-url": "Trendz URL", + "trendz-url-required": "Trendz URL आवश्यक है", + "trendz-api-key": "Trendz API की", + "trendz-enable": "Trendz सक्षम करें" + }, + "alarm": { + "alarm": "अलार्म", + "alarms": "अलार्म", + "all-alarms": "सभी अलार्म", + "select-alarm": "अलार्म चुनें", + "no-alarms-matching": "'{{entity}}' से मेल खाता कोई अलार्म नहीं मिला।", + "alarm-required": "अलार्म आवश्यक है", + "alarm-filter": "अलार्म फ़िल्टर", + "filter": "फ़िल्टर", + "alarm-status": "अलार्म स्थिति", + "alarm-status-list": "अलार्म स्थिति सूची", + "any-status": "कोई भी स्थिति", + "search-status": { + "ANY": "कोई भी", + "ACTIVE": "सक्रिय", + "CLEARED": "क्लियर किया गया", + "ACK": "स्वीकृत", + "UNACK": "अस्वीकृत" + }, + "display-status": { + "ACTIVE_UNACK": "सक्रिय अस्वीकृत", + "ACTIVE_ACK": "सक्रिय स्वीकृत", + "CLEARED_UNACK": "क्लियर किया गया अस्वीकृत", + "CLEARED_ACK": "क्लियर किया गया स्वीकृत" + }, + "no-alarms-prompt": "कोई अलार्म नहीं मिला", + "created-time": "निर्माण समय", + "type": "प्रकार", + "severity": "गंभीरता", + "originator": "स्रोत", + "originator-type": "स्रोत प्रकार", + "details": "विवरण", + "originator-label": "स्रोत लेबल", + "assign": "असाइन करें", + "assignments": "असाइनमेंट", + "assignee": "असाइन प्राप्तकर्ता", + "assignee-id": "असाइन प्राप्तकर्ता ID", + "assignee-first-name": "असाइन प्राप्तकर्ता पहला नाम", + "assignee-last-name": "असाइन प्राप्तकर्ता अंतिम नाम", + "assignee-email": "असाइन प्राप्तकर्ता ईमेल", + "unassigned": "असाइन नहीं", + "user-deleted": "उपयोगकर्ता हटाया गया", + "assignee-not-set": "सभी", + "status": "स्थिति", + "alarm-details": "अलार्म विवरण", + "start-time": "आरंभ समय", + "assign-time": "असाइन समय", + "end-time": "समाप्ति समय", + "ack-time": "स्वीकार किए जाने का समय", + "clear-time": "क्लियर किए जाने का समय", + "duration": "अवधि", + "alarm-severity": "अलार्म गंभीरता", + "alarm-severity-list": "अलार्म गंभीरता सूची", + "any-severity": "कोई भी गंभीरता", + "severity-critical": "क्रिटिकल", + "severity-major": "मेजर", + "severity-minor": "माइनर", + "severity-warning": "चेतावनी", + "severity-indeterminate": "अनिर्धारित", + "acknowledge": "स्वीकार करें", + "clear": "क्लियर करें", + "delete": "हटाएँ", + "search": "अलार्म खोजें", + "selected-alarms": "{ count, plural, =1 {1 अलार्म} other {# अलार्म} } चुना गया", + "no-data": "दिखाने के लिए कोई डेटा नहीं", + "polling-interval": "अलार्म पोलिंग अंतराल (सेकंड)", + "polling-interval-required": "अलार्म पोलिंग अंतराल आवश्यक है।", + "min-polling-interval-message": "कम-से-कम 1 सेकंड का पोलिंग अंतराल अनुमत है।", + "aknowledge-alarms-title": "{ count, plural, =1 {1 अलार्म} other {# अलार्म} } स्वीकार करें", + "aknowledge-alarms-text": "क्या आप वाकई { count, plural, =1 {1 अलार्म} other {# अलार्म} } स्वीकार करना चाहते हैं?", + "aknowledge-alarm-title": "अलार्म स्वीकार करें", + "aknowledge-alarm-text": "क्या आप वाकई अलार्म स्वीकार करना चाहते हैं?", + "selected-alarms-are-acknowledged": "चयनित अलार्म पहले से ही स्वीकार किए जा चुके हैं", + "clear-alarms-title": "{ count, plural, =1 {1 अलार्म} other {# अलार्म} } क्लियर करें", + "clear-alarms-text": "क्या आप वाकई { count, plural, =1 {1 अलार्म} other {# अलार्म} } क्लियर करना चाहते हैं?", + "clear-alarm-title": "अलार्म क्लियर करें", + "clear-alarm-text": "क्या आप वाकई अलार्म क्लियर करना चाहते हैं?", + "delete-alarms-title": "{ count, plural, =1 {1 अलार्म} other {# अलार्म} } हटाएँ", + "delete-alarms-text": "क्या आप वाकई { count, plural, =1 {1 अलार्म} other {# अलार्म} } हटाना चाहते हैं?", + "selected-alarms-are-cleared": "चयनित अलार्म पहले से ही क्लियर किए जा चुके हैं", + "alarm-status-filter": "अलार्म स्टेटस फ़िल्टर", + "alarm-filter-title": "अलार्म फ़िल्टर", + "assigned": "असाइन किया गया", + "filter-title": "फ़िल्टर", + "max-count-load": "लोड करने के लिए अलार्म की अधिकतम संख्या (0 - असीमित)", + "max-count-load-required": "लोड करने के लिए अलार्म की अधिकतम संख्या आवश्यक है।", + "max-count-load-error-min": "न्यूनतम मान 0 है।", + "fetch-size": "फ़ेच साइज़", + "fetch-size-required": "फ़ेच साइज़ आवश्यक है।", + "fetch-size-error-min": "न्यूनतम मान 10 है।", + "alarm-types": "अलार्म प्रकार", + "alarm-type-list": "अलार्म प्रकार सूची", + "any-type": "कोई भी प्रकार", + "assigned-to-current-user": "वर्तमान उपयोगकर्ता को असाइन किया गया", + "assigned-to-me": "मुझे असाइन किया गया", + "search-propagated-alarms": "प्रसारित अलार्म खोजें", + "comments": "अलार्म टिप्पणियाँ", + "show-more": "और दिखाएँ", + "additional-info": "अतिरिक्त जानकारी", + "alarm-type": "अलार्म प्रकार", + "enter-alarm-type": "अलार्म प्रकार दर्ज करें", + "no-alarm-types-matching": "'{{entitySubtype}}' से मेल खाता कोई अलार्म प्रकार नहीं मिला।", + "alarm-type-list-empty": "कोई अलार्म प्रकार चुना नहीं गया है।" + }, + "alarm-activity": { + "add": "टिप्पणी जोड़ें...", + "alarm-comment": "अलार्म टिप्पणी", + "comments": "टिप्पणियाँ", + "delete-alarm-comment": "क्या आप यह टिप्पणी हटाना चाहते हैं?", + "refresh": "रिफ़्रेश करें", + "oldest-first": "सबसे पुरानी पहले", + "newest-first": "सबसे नई पहले", + "activity": "गतिविधि", + "export": "CSV में एक्सपोर्ट करें", + "author": "लेखक", + "created-date": "निर्माण तिथि", + "edited-date": "संपादन तिथि", + "text": "पाठ", + "system": "सिस्टम" + }, + "alias": { + "add": "उपनाम जोड़ें", + "edit": "उपनाम संपादित करें", + "name": "उपनाम नाम", + "name-required": "उपनाम नाम आवश्यक है", + "duplicate-alias": "इसी नाम वाला उपनाम पहले से मौजूद है।", + "filter-type-single-entity": "एकल एंटिटी", + "filter-type-entity-list": "एंटिटी सूची", + "filter-type-entity-name": "एंटिटी नाम", + "filter-type-entity-type": "एंटिटी प्रकार", + "filter-type-state-entity": "डैशबोर्ड स्टेट से एंटिटी", + "filter-type-state-entity-description": "डैशबोर्ड स्टेट पैरामीटर से ली गई एंटिटी", + "filter-type-asset-type": "एसेट प्रकार", + "filter-type-asset-type-description": "प्रकार '{{assetTypes}}' के एसेट", + "filter-type-asset-type-and-name-description": "प्रकार '{{assetTypes}}' के एसेट जिनका नाम '{{prefix}}' से शुरू होता है", + "filter-type-device-type": "डिवाइस प्रकार", + "filter-type-device-type-description": "प्रकार '{{deviceTypes}}' के डिवाइस", + "filter-type-device-type-and-name-description": "प्रकार '{{deviceTypes}}' के डिवाइस जिनका नाम '{{prefix}}' से शुरू होता है", + "filter-type-entity-view-type": "एंटिटी व्यू प्रकार", + "filter-type-entity-view-type-description": "प्रकार '{{entityViewTypes}}' के एंटिटी व्यू", + "filter-type-entity-view-type-and-name-description": "प्रकार '{{entityViewTypes}}' के एंटिटी व्यू जिनका नाम '{{prefix}}' से शुरू होता है", + "filter-type-edge-type": "Edge प्रकार", + "filter-type-edge-type-description": "प्रकार '{{edgeTypes}}' के Edge", + "filter-type-edge-type-and-name-description": "प्रकार '{{edgeTypes}}' के Edge जिनका नाम '{{prefix}}' से शुरू होता है", + "filter-type-relations-query": "रिलेशन क्वेरी", + "filter-type-relations-query-description": "{{entities}} जिनके पास {{relationType}} रिलेशन {{direction}} {{rootEntity}} है", + "filter-type-edge-search-query": "Edge सर्च क्वेरी", + "filter-type-edge-search-query-description": "टाइप {{edgeTypes}} वाले Edge जिनके पास {{relationType}} रिलेशन {{direction}} {{rootEntity}} है", + "filter-type-asset-search-query": "एसेट सर्च क्वेरी", + "filter-type-asset-search-query-description": "टाइप {{assetTypes}} वाले एसेट जिनके पास {{relationType}} रिलेशन {{direction}} {{rootEntity}} है", + "filter-type-device-search-query": "डिवाइस सर्च क्वेरी", + "filter-type-device-search-query-description": "टाइप {{deviceTypes}} वाले डिवाइस जिनके पास {{relationType}} रिलेशन {{direction}} {{rootEntity}} है", + "filter-type-entity-view-search-query": "एंटिटी व्यू सर्च क्वेरी", + "filter-type-entity-view-search-query-description": "टाइप {{entityViewTypes}} वाले एंटिटी व्यू जिनके पास {{relationType}} रिलेशन {{direction}} {{rootEntity}} है", + "filter-type-apiUsageState": "API उपयोग स्थिति", + "entity-filter": "एंटिटी फ़िल्टर", + "resolve-multiple": "कई एंटिटीज़ के रूप में रिज़ॉल्व करें", + "resolve-multiple-hint": "सभी फ़िल्टर की गई एंटिटीज़ से डेटा को एक साथ दिखाने के लिए सक्षम करें। \nअक्षम होने पर, विजेट केवल चयनित एंटिटी से डेटा दिखाता है।", + "filter-type": "फ़िल्टर प्रकार", + "filter-type-required": "फ़िल्टर प्रकार आवश्यक है।", + "entity-filter-no-entity-matched": "निर्दिष्ट फ़िल्टर से मेल खाती कोई एंटिटी नहीं मिली।", + "no-entity-filter-specified": "कोई एंटिटी फ़िल्टर निर्दिष्ट नहीं है", + "root-state-entity": "डैशबोर्ड स्टेट एंटिटी को रूट के रूप में उपयोग करें", + "last-level-relation": "केवल अंतिम स्तर का रिलेशन फ़ेच करें", + "root-entity": "रूट एंटिटी", + "state-entity-parameter-name": "स्टेट एंटिटी पैरामीटर नाम", + "default-state-entity": "डिफ़ॉल्ट स्टेट एंटिटी", + "default-entity-parameter-name": "डिफ़ॉल्ट रूप से", + "query-options": "क्वेरी विकल्प", + "max-relation-level": "अधिकतम रिलेशन स्तर", + "unlimited-level": "असीमित स्तर", + "state-entity": "डैशबोर्ड स्टेट एंटिटी", + "all-entities": "सभी एंटिटीज़", + "any-relation": "कोई भी" + }, + "asset": { + "asset": "एसेट", + "assets": "एसेट", + "management": "एसेट प्रबंधन", + "view-assets": "एसेट देखें", + "add": "एसेट जोड़ें", + "asset-type-max-length": "एसेट प्रकार 256 अक्षरों से कम होना चाहिए", + "assign-to-customer": "कस्टमर को असाइन करें", + "assign-asset-to-customer": "एसेट को कस्टमर को असाइन करें", + "assign-asset-to-customer-text": "कृपया कस्टमर को असाइन करने के लिए एसेट चुनें", + "no-assets-text": "कोई एसेट नहीं मिला", + "assign-to-customer-text": "कृपया एसेट को असाइन करने के लिए कस्टमर चुनें", + "public": "पब्लिक", + "assignedToCustomer": "कस्टमर को असाइन किया गया", + "make-public": "एसेट को पब्लिक बनाएं", + "make-private": "एसेट को प्राइवेट बनाएं", + "unassign-from-customer": "कस्टमर से अनअसाइन करें", + "delete": "एसेट हटाएँ", + "asset-public": "एसेट पब्लिक है", + "asset-type": "एसेट प्रकार", + "asset-type-required": "एसेट प्रकार आवश्यक है।", + "select-asset-type": "एसेट प्रकार चुनें", + "enter-asset-type": "एसेट प्रोफ़ाइल दर्ज करें", + "any-asset": "कोई भी एसेट", + "no-asset-types-matching": "'{{entitySubtype}}' से मेल खाता कोई एसेट प्रकार नहीं मिला।", + "asset-type-list-empty": "कोई एसेट प्रकार चयनित नहीं है।", + "asset-types": "एसेट प्रकार", + "name": "नाम", + "name-required": "नाम आवश्यक है।", + "name-max-length": "नाम 256 अक्षरों से कम होना चाहिए", + "label-max-length": "लेबल 256 अक्षरों से कम होना चाहिए", + "description": "विवरण", + "type": "प्रकार", + "type-required": "प्रकार आवश्यक है।", + "details": "विवरण", + "events": "घटनाएँ", + "add-asset-text": "नया एसेट जोड़ें", + "asset-details": "एसेट विवरण", + "assign-assets": "एसेट असाइन करें", + "assign-assets-text": "कस्टमर को { count, plural, =1 {1 एसेट} other {# एसेट} } असाइन करें", + "assign-asset-to-edge-title": "एसेट को Edge पर असाइन करें", + "assign-asset-to-edge-text": "कृपया Edge को असाइन करने के लिए एसेट चुनें", + "delete-assets": "एसेट हटाएँ", + "unassign-assets": "एसेट अनअसाइन करें", + "unassign-assets-action-title": "कस्टमर से { count, plural, =1 {1 एसेट} other {# एसेट} } अनअसाइन करें", + "assign-new-asset": "नया एसेट असाइन करें", + "delete-asset-title": "क्या आप वाकई एसेट '{{assetName}}' हटाना चाहते हैं?", + "delete-asset-text": "सावधान रहें, पुष्टि के बाद एसेट और उससे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "delete-assets-title": "क्या आप वाकई { count, plural, =1 {1 एसेट} other {# एसेट} } हटाना चाहते हैं?", + "delete-assets-action-title": "{ count, plural, =1 {1 एसेट} other {# एसेट} } हटाएँ", + "delete-assets-text": "सावधान रहें, पुष्टि के बाद सभी चयनित एसेट हटा दिए जाएँगे और उनसे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "make-public-asset-title": "क्या आप वाकई एसेट '{{assetName}}' को पब्लिक बनाना चाहते हैं?", + "make-public-asset-text": "पुष्टि के बाद एसेट और उसका सारा डेटा पब्लिक हो जाएगा और अन्य द्वारा एक्सेस किया जा सकेगा।", + "make-private-asset-title": "क्या आप वाकई एसेट '{{assetName}}' को प्राइवेट बनाना चाहते हैं?", + "make-private-asset-text": "पुष्टि के बाद एसेट और उसका सारा डेटा प्राइवेट हो जाएगा और अन्य द्वारा एक्सेस नहीं किया जा सकेगा।", + "unassign-asset-title": "क्या आप वाकई एसेट '{{assetName}}' को अनअसाइन करना चाहते हैं?", + "unassign-asset-text": "पुष्टि के बाद एसेट अनअसाइन हो जाएगा और कस्टमर द्वारा एक्सेस नहीं किया जा सकेगा।", + "unassign-asset": "एसेट अनअसाइन करें", + "unassign-assets-title": "क्या आप वाकई { count, plural, =1 {1 एसेट} other {# एसेट} } को अनअसाइन करना चाहते हैं?", + "unassign-assets-text": "पुष्टि के बाद सभी चयनित एसेट अनअसाइन हो जाएँगे और कस्टमर द्वारा एक्सेस नहीं किए जा सकेंगे।", + "copyId": "एसेट ID कॉपी करें", + "idCopiedMessage": "एसेट ID क्लिपबोर्ड पर कॉपी कर दी गई है", + "select-asset": "एसेट चुनें", + "no-assets-matching": "'{{entity}}' से मेल खाता कोई एसेट नहीं मिला।", + "asset-required": "एसेट आवश्यक है।", + "name-starts-with": "एसेट नाम अभिव्यक्ति", + "help-text": "ज़रूरत के अनुसार '%' का उपयोग करें: '%asset_name_contains%', '%asset_name_ends', 'asset_starts_with'.", + "search": "एसेट खोजें", + "import": "एसेट आयात करें", + "asset-file": "एसेट फ़ाइल", + "label": "लेबल", + "assign-asset-to-edge": "एसेट को Edge पर असाइन करें", + "unassign-asset-from-edge": "एसेट अनअसाइन करें", + "unassign-asset-from-edge-title": "क्या आप वाकई एसेट '{{assetName}}' को अनअसाइन करना चाहते हैं?", + "unassign-asset-from-edge-text": "पुष्टि के बाद एसेट अनअसाइन हो जाएगा और Edge द्वारा एक्सेस नहीं किया जा सकेगा।", + "unassign-assets-from-edge-title": "क्या आप वाकई { count, plural, =1 {1 एसेट} other {# एसेट} } को अनअसाइन करना चाहते हैं?", + "unassign-assets-from-edge-text": "पुष्टि के बाद सभी चयनित एसेट अनअसाइन हो जाएँगे और Edge द्वारा एक्सेस नहीं किए जा सकेंगे।", + "selected-assets": "{ count, plural, =1 {1 एसेट} other {# एसेट} } चयनित" + }, + "attribute": { + "attributes": "विशेषताएँ", + "latest-telemetry": "नवीनतम टेलीमेट्री", + "no-latest-telemetry": "कोई नवीनतम टेलीमेट्री नहीं", + "attributes-scope": "एंटिटी विशेषताओं का स्कोप", + "scope-telemetry": "टेलीमेट्री", + "scope-latest-telemetry": "नवीनतम टेलीमेट्री", + "scope-client": "क्लाइंट विशेषताएँ", + "scope-server": "सर्वर विशेषताएँ", + "scope-shared": "साझा विशेषताएँ", + "scope-client-short": "क्लाइंट", + "scope-server-short": "सर्वर", + "scope-shared-short": "साझा", + "scope-latest-short": "नवीनतम", + "scope-any": "कोई भी", + "add": "विशेषता जोड़ें", + "key": "कुंजी", + "key-max-length": "कुंजी 256 अक्षरों से कम होनी चाहिए", + "last-update-time": "अंतिम अपडेट समय", + "key-required": "विशेषता कुंजी आवश्यक है।", + "value": "मान", + "value-required": "विशेषता मान आवश्यक है।", + "telemetry-key-required": "टेलीमेट्री कुंजी आवश्यक है", + "telemetry-value-required": "टेलीमेट्री मान आवश्यक है", + "delete-attributes-title": "क्या आप वाकई { count, plural, =1 {1 विशेषता} other {# विशेषताएँ} } हटाना चाहते हैं?", + "delete-attributes-text": "सावधान रहें, पुष्टि के बाद सभी चयनित विशेषताएँ हटा दी जाएँगी।", + "delete-attributes": "विशेषताएँ हटाएँ", + "enter-attribute-value": "विशेषता मान दर्ज करें", + "show-on-widget": "विजेट पर दिखाएँ", + "widget-mode": "विजेट मोड", + "next-widget": "अगला विजेट", + "prev-widget": "पिछला विजेट", + "add-to-dashboard": "डैशबोर्ड में जोड़ें", + "add-widget-to-dashboard": "डैशबोर्ड में विजेट जोड़ें", + "selected-attributes": "{ count, plural, =1 {1 विशेषता} other {# विशेषताएँ} } चयनित", + "selected-telemetry": "{ count, plural, =1 {1 टेलीमेट्री यूनिट} other {# टेलीमेट्री यूनिट} } चयनित", + "no-attributes-text": "कोई विशेषताएँ नहीं मिलीं", + "no-telemetry-text": "कोई टेलीमेट्री नहीं मिली", + "copy-key": "कुंजी कॉपी करें", + "add-telemetry": "टेलीमेट्री जोड़ें", + "copy-value": "मान कॉपी करें", + "delete-timeseries": { + "start-time": "आरंभ समय", + "ends-on": "समाप्ति तिथि", + "strategy": "रणनीति", + "delete-strategy": "डिलीट रणनीति", + "all-data": "सभी डेटा हटाएँ", + "all-data-except-latest-value": "नवीनतम मान को छोड़कर सभी डेटा हटाएँ", + "latest-value": "नवीनतम मान हटाएँ", + "all-data-for-time-period": "निर्दिष्ट समय अवधि के लिए सभी डेटा हटाएँ", + "rewrite-latest-value": "नवीनतम मान पुनः लिखें" + } + }, + "api-usage": { + "api-features": "API सुविधाएँ", + "api-usage": "API उपयोग", + "alarm": "अलार्म", + "alarms-created": "बनाए गए अलार्म", + "queue-stats": "क्यू आँकड़े", + "processing-failures-and-timeouts": "प्रोसेसिंग विफलताएँ और टाइमआउट", + "exceptions": "अपवाद", + "alarms-created-daily-activity": "बनाए गए अलार्म की दैनिक गतिविधि", + "alarms-created-hourly-activity": "बनाए गए अलार्म की प्रति घंटा गतिविधि", + "alarms-created-monthly-activity": "बनाए गए अलार्म की मासिक गतिविधि", + "data-points": "डेटा पॉइंट", + "data-points-storage-days": "डेटा पॉइंट भंडारण (दिनों में)", + "device-api": "डिवाइस API", + "email": "ईमेल", + "email-messages": "ईमेल संदेश", + "email-messages-daily-activity": "ईमेल संदेशों की दैनिक गतिविधि", + "email-messages-monthly-activity": "ईमेल संदेशों की मासिक गतिविधि", + "executions": "निष्पादन", + "scripts": "स्क्रिप्ट", + "scripts-hourly-activity": "स्क्रिप्ट की प्रति घंटा गतिविधि", + "scripts-daily-activity": "स्क्रिप्ट की दैनिक गतिविधि", + "scripts-monthly-activity": "स्क्रिप्ट की मासिक गतिविधि", + "javascript": "JavaScript", + "javascript-executions": "JavaScript निष्पादन", + "tbel": "TBEL", + "tbel-executions": "TBEL निष्पादन", + "latest-error": "नवीनतम त्रुटि", + "messages": "संदेश", + "notifications": "सूचनाएँ", + "notifications-email-sms": "सूचनाएँ (Email/SMS)", + "notifications-hourly-activity": "सूचनाओं की प्रति घंटा गतिविधि", + "permanent-failures": "${entityName} स्थायी विफलताएँ", + "permanent-timeouts": "${entityName} स्थायी टाइमआउट", + "processing-failures": "${entityName} प्रोसेसिंग विफलताएँ", + "processing-timeouts": "${entityName} प्रोसेसिंग टाइमआउट", + "rule-chain": "रूल चेन", + "rule-engine": "रूल इंजन", + "rule-engine-daily-activity": "रूल इंजन की दैनिक सक्रियता", + "rule-engine-executions": "रूल इंजन निष्पादन", + "rule-engine-hourly-activity": "रूल इंजन की प्रति घंटा सक्रियता", + "rule-engine-monthly-activity": "रूल इंजन की मासिक सक्रियता", + "rule-engine-statistics": "रूल इंजन सांख्यिकी", + "rule-node": "रूल नोड", + "sms": "एसएमएस", + "sms-messages": "एसएमएस संदेश", + "sms-messages-daily-activity": "एसएमएस संदेशों की दैनिक सक्रियता", + "sms-messages-monthly-activity": "एसएमएस संदेशों की मासिक सक्रियता", + "successful": "${entityName} सफल", + "telemetry": "टेलीमेट्री", + "telemetry-persistence": "टेलीमेट्री परसिस्टेंस", + "telemetry-persistence-daily-activity": "टेलीमेट्री परसिस्टेंस दैनिक गतिविधि", + "telemetry-persistence-hourly-activity": "टेलीमेट्री परसिस्टेंस प्रति घंटा गतिविधि", + "telemetry-persistence-monthly-activity": "टेलीमेट्री परसिस्टेंस मासिक गतिविधि", + "transport": "ट्रांसपोर्ट", + "transport-daily-activity": "ट्रांसपोर्ट की दैनिक सक्रियता", + "transport-data-points": "ट्रांसपोर्ट डेटा पॉइंट्स", + "transport-messages": "ट्रांसपोर्ट संदेश", + "view-details": "विवरण देखें", + "view-statistics": "सांख्यिकी देखें" + }, + "api-limit": { + "cassandra-write-queries-core": "Rest API Cassandra लिखने की क्वेरीज़", + "cassandra-read-queries-core": "Rest API और WS टेलीमेट्री Cassandra पढ़ने की क्वेरीज़", + "cassandra-write-queries-rule-engine": "Rule Engine टेलीमेट्री Cassandra लिखने की क्वेरीज़", + "cassandra-read-queries-rule-engine": "Rule Engine टेलीमेट्री Cassandra पढ़ने की क्वेरीज़", + "cassandra-write-queries-monolith": "Monolith टेलीमेट्री Cassandra लिखने की क्वेरीज़", + "cassandra-read-queries-monolith": "Monolith टेलीमेट्री Cassandra पढ़ने की क्वेरीज़", + "entity-version-creation": "एंटिटी वर्ज़न निर्माण", + "entity-version-load": "एंटिटी वर्ज़न लोड", + "notification-requests": "सूचना अनुरोध", + "notification-requests-per-rule": "प्रति Rule के सूचना अनुरोध", + "rest-api-requests": "REST API अनुरोध", + "rest-api-requests-per-customer": "प्रति कस्टमर REST API अनुरोध", + "transport-messages": "ट्रांसपोर्ट संदेश", + "transport-messages-per-device": "प्रति डिवाइस ट्रांसपोर्ट संदेश", + "transport-messages-per-gateway": "प्रति Gateway ट्रांसपोर्ट संदेश", + "transport-messages-per-gateway-device": "प्रति Gateway डिवाइस ट्रांसपोर्ट संदेश", + "ws-updates-per-session": "प्रति सत्र WS अपडेट", + "edge-events": "Edge ईवेंट", + "edge-events-per-edge": "प्रति Edge ईवेंट", + "edge-uplink-messages": "Edge uplink संदेश", + "edge-uplink-messages-per-edge": "प्रति Edge uplink संदेश" + }, + "audit-log": { + "audit": "ऑडिट", + "audit-logs": "ऑडिट लॉग", + "timestamp": "टाइमस्टैम्प", + "entity-type": "एंटिटी प्रकार", + "entity-name": "एंटिटी नाम", + "user": "उपयोगकर्ता", + "type": "प्रकार", + "status": "स्थिति", + "details": "विवरण", + "type-added": "जोड़ा गया", + "type-deleted": "हटाया गया", + "type-updated": "अपडेट किया गया", + "type-attributes-updated": "विशेषताएँ अपडेट की गईं", + "type-attributes-deleted": "विशेषताएँ हटाई गईं", + "type-rpc-call": "RPC कॉल", + "type-credentials-updated": "क्रेडेंशियल्स अपडेट किए गए", + "type-assigned-to-customer": "कस्टमर को असाइन किया गया", + "type-unassigned-from-customer": "कस्टमर से अनअसाइन किया गया", + "type-assigned-to-edge": "Edge को असाइन किया गया", + "type-unassigned-from-edge": "Edge से अनअसाइन किया गया", + "type-activated": "सक्रिय किया गया", + "type-suspended": "निलंबित किया गया", + "type-credentials-read": "क्रेडेंशियल्स पढ़े गए", + "type-attributes-read": "विशेषताएँ पढ़ी गईं", + "type-relation-add-or-update": "रिलेशन अपडेट किया गया", + "type-relation-delete": "रिलेशन हटाया गया", + "type-relations-delete": "सभी रिलेशन हटाए गए", + "type-alarm-ack": "अलार्म स्वीकार किया गया", + "type-alarm-clear": "अलार्म क्लियर किया गया", + "type-alarm-delete": "अलार्म हटाया गया", + "type-alarm-assign": "अलार्म असाइन किया गया", + "type-alarm-unassign": "अलार्म अनअसाइन किया गया", + "type-added-comment": "टिप्पणी जोड़ी गई", + "type-updated-comment": "टिप्पणी अपडेट की गई", + "type-deleted-comment": "टिप्पणी हटाई गई", + "type-login": "लॉगिन", + "type-logout": "लॉगआउट", + "type-lockout": "लॉकआउट", + "status-success": "सफलता", + "status-failure": "विफलता", + "audit-log-details": "ऑडिट लॉग विवरण", + "no-audit-logs-prompt": "कोई लॉग नहीं मिला", + "action-data": "कार्रवाई डेटा", + "failure-details": "विफलता विवरण", + "search": "ऑडिट लॉग खोजें", + "clear-search": "खोज साफ़ करें", + "type-assigned-from-tenant": "टेनेंट से असाइन किया गया", + "type-assigned-to-tenant": "टेनेंट को असाइन किया गया", + "type-provision-success": "डिवाइस प्रोविज़न किया गया", + "type-provision-failure": "डिवाइस प्रोविज़निंग विफल रही", + "type-timeseries-updated": "टेलीमेट्री अपडेट की गई", + "type-timeseries-deleted": "टेलीमेट्री हटाई गई", + "type-sms-sent": "SMS भेजा गया" + }, + "debug-settings": { + "label": "डिबग कॉन्फ़िगरेशन", + "on-failure": "केवल विफलताएँ (24/7)", + "all-messages": "सभी संदेश ({{time}})", + "failures": "विफलताएँ", + "entity": "एंटिटी", + "hint": { + "main-limited": "प्रति {{time}} अधिकतम {{msg}} {{entity}} डिबग संदेश रिकॉर्ड किए जाएँगे।", + "on-failure": "केवल त्रुटि संदेश लॉग करें।", + "all-messages": "सभी डिबग संदेश लॉग करें।" + } + }, + "calculated-fields": { + "expression": "व्यंजक", + "no-found": "कोई कैलक्युलेटेड फ़ील्ड नहीं मिला", + "list": "{ count, plural, =1 {एक कैलक्युलेटेड फ़ील्ड} other {# कैलक्युलेटेड फ़ील्ड्स की सूची} }", + "selected-fields": "{ count, plural, =1 {1 कैलक्युलेटेड फ़ील्ड} other {# कैलक्युलेटेड फ़ील्ड्स} } चुना गया", + "type": { + "simple": "सिंपल", + "script": "स्क्रिप्ट" + }, + "arguments": "आर्गुमेंट्स", + "decimals-by-default": "डिफ़ॉल्ट दशमलव", + "debugging": "कैलक्युलेटेड फ़ील्ड डिबगिंग", + "argument-name": "आर्गुमेंट नाम", + "datasource": "डेटा स्रोत", + "add-argument": "आर्गुमेंट जोड़ें", + "test-script-function": "स्क्रिप्ट फ़ंक्शन टेस्ट करें", + "no-arguments": "कोई आर्गुमेंट कॉन्फ़िगर नहीं है", + "argument-settings": "आर्गुमेंट सेटिंग्स", + "argument-current": "करेंट एंटिटी", + "argument-current-tenant": "करेंट टेनेंट", + "argument-device": "डिवाइस", + "argument-asset": "एसेट", + "argument-customer": "कस्टमर", + "argument-tenant": "करेंट टेनेंट", + "argument-owner": "करेंट ओनर", + "argument-type": "आर्गुमेंट प्रकार", + "attribute": "विशेषता", + "copy-argument-name": "आर्गुमेंट नाम कॉपी करें", + "timeseries-key": "टाइम सीरीज़ कुंजी", + "device-name": "डिवाइस नाम", + "latest-telemetry": "नवीनतम टेलीमेट्री", + "rolling": "टाइम सीरीज़ रोलिंग", + "attribute-scope": "विशेषता स्कोप", + "server-attributes": "सर्वर विशेषताएँ", + "client-attributes": "क्लाइंट विशेषताएँ", + "shared-attributes": "शेयर्ड विशेषताएँ", + "attribute-key": "विशेषता कुंजी", + "default-value": "डिफ़ॉल्ट मान", + "limit": "अधिकतम मान", + "time-window": "टाइम विंडो", + "customer-name": "कस्टमर नाम", + "asset-name": "एसेट नाम", + "timeseries": "टाइम सीरीज़", + "output": "आउटपुट", + "create": "नई कैलक्युलेटेड फ़ील्ड बनाएँ", + "file": "कैलक्युलेटेड फ़ील्ड फ़ाइल", + "invalid-file-error": "अमान्य फ़ाइल फ़ॉर्मेट। कृपया सुनिश्चित करें कि फ़ाइल एक मान्य JSON फ़ाइल है।", + "import": "कैलक्युलेटेड फ़ील्ड इम्पोर्ट करें", + "export": "कैलक्युलेटेड फ़ील्ड एक्सपोर्ट करें", + "export-failed-error": "कैलक्युलेटेड फ़ील्ड एक्सपोर्ट नहीं हो सका: {{error}}", + "output-type": "आउटपुट प्रकार", + "delete-title": "क्या आप वाकई कैलक्युलेटेड फ़ील्ड '{{title}}' को हटाना चाहते हैं?", + "delete-text": "सावधान रहें, पुष्टि के बाद कैलक्युलेटेड फ़ील्ड और उससे संबंधित सभी डेटा हमेशा के लिए मिटा दिए जाएँगे।", + "delete-multiple-title": "क्या आप वाकई { count, plural, =1 {1 कैलक्युलेटेड फ़ील्ड} other {# कैलक्युलेटेड फ़ील्ड्स} } को हटाना चाहते हैं?", + "delete-multiple-text": "सावधान रहें, पुष्टि के बाद सभी चुनी हुई कैलक्युलेटेड फ़ील्ड्स हटा दी जाएँगी और उनसे संबंधित सारा डेटा हमेशा के लिए मिटा दिया जाएगा।", + "test-with-this-message": "इस संदेश के साथ परीक्षण करें", + "use-latest-timestamp": "नवीनतम टाइमस्टैम्प का उपयोग करें", + "hint": { + "arguments-simple-with-rolling": "सिंपल टाइप की कैलक्युलेटेड फ़ील्ड में 'टाइम सीरीज़ रोलिंग' टाइप की कीज़ नहीं होनी चाहिए।", + "arguments-empty": "आर्गुमेंट्स खाली नहीं होने चाहिए।", + "expression-required": "एक्सप्रेशन आवश्यक है।", + "expression-invalid": "एक्सप्रेशन अमान्य है।", + "expression-max-length": "एक्सप्रेशन की लंबाई 255 अक्षरों से कम होनी चाहिए।", + "argument-name-required": "आर्गुमेंट नाम आवश्यक है।", + "argument-name-pattern": "आर्गुमेंट नाम अमान्य है।", + "argument-name-duplicate": "ऐसे नाम वाला आर्गुमेंट पहले से मौजूद है।", + "argument-name-max-length": "आर्गुमेंट नाम 256 अक्षरों से कम होना चाहिए।", + "argument-name-forbidden": "यह आर्गुमेंट नाम आरक्षित है और इसका उपयोग नहीं किया जा सकता।", + "argument-type-required": "आर्गुमेंट टाइप आवश्यक है।", + "max-args": "आर्गुमेंट्स की अधिकतम संख्या पूरी हो चुकी है।", + "decimals-range": "डिफ़ॉल्ट दशमलव 0 से 15 के बीच की संख्या होनी चाहिए।", + "expression": "डिफ़ॉल्ट एक्सप्रेशन दिखाता है कि तापमान को फ़ारेनहाइट से सेल्सियस में कैसे बदला जाए।", + "arguments-entity-not-found": "आर्गुमेंट की लक्षित एंटिटी नहीं मिली।", + "use-latest-timestamp": "अगर सक्षम किया गया, तो कैलक्युलेटेड मान को सर्वर समय की बजाय आर्गुमेंट्स की टेलीमेट्री के नवीनतम टाइमस्टैम्प के साथ सेव किया जाएगा।" + } + }, + "ai-models": { + "ai-models": "AI मॉडल्स", + "ai-model": "AI मॉडल", + "model": "मॉडल", + "name": "नाम", + "ai-provider": "AI प्रदाता", + "no-found": "कोई AI मॉडल नहीं मिला", + "list": "{ count, plural, =1 {एक मॉडल} other {# मॉडलों की सूची} }", + "selected-fields": "{ count, plural, =1 {1 मॉडल} other {# मॉडल्स} } चयनित", + "add": "मॉडल जोड़ें", + "delete-model-title": "क्या आप वाकई मॉडल '{{modelName}}' हटाना चाहते हैं?", + "delete-model-text": "सावधान रहें, पुष्टि के बाद मॉडल और उससे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "delete-models-title": "क्या आप वाकई { count, plural, =1 {1 मॉडल} other {# मॉडल्स} } हटाना चाहते हैं?", + "delete-models-text": "सावधान रहें, पुष्टि के बाद सभी चयनित मॉडल्स हटा दिए जाएँगे और उनसे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "ai-providers": { + "openai": "OpenAI", + "azure-openai": "Azure OpenAI", + "google-ai-gemini": "Google AI Gemini", + "google-vertex-ai-gemini": "Google Vertex AI Gemini", + "mistral-ai": "Mistral AI", + "anthropic": "Anthropic", + "amazon-bedrock": "Amazon Bedrock", + "github-models": "GitHub Models", + "ollama": "Ollama" + }, + "name-required": "नाम आवश्यक है।", + "name-max-length": "नाम 255 अक्षरों या उससे कम का होना चाहिए।", + "provider": "प्रदाता", + "api-key": "API कुंजी", + "api-key-required": "API कुंजी आवश्यक है।", + "api-key-open-ai-required": "आधिकारिक OpenAI API का उपयोग करते समय API कुंजी आवश्यक है।", + "project-id": "प्रोजेक्ट ID", + "project-id-required": "प्रोजेक्ट ID आवश्यक है।", + "location": "स्थान", + "location-required": "स्थान आवश्यक है।", + "service-account-key-file": "सर्विस अकाउंट की फ़ाइल", + "service-account-key-file-required": "सर्विस अकाउंट की फ़ाइल आवश्यक है।", + "no-file": "कोई फ़ाइल चयनित नहीं है।", + "drop-file": "फ़ाइल यहाँ छोड़ें या फ़ाइल चुनने के लिए क्लिक करें।", + "personal-access-token": "पर्सनल ऐक्सेस टोकन", + "personal-access-token-required": "पर्सनल ऐکسेस टोकन आवश्यक है।", + "configuration": "कॉन्फ़िगरेशन", + "model-id": "मॉडल ID", + "model-id-required": "मॉडल ID आवश्यक है।", + "deployment-name": "डिप्लॉयमेंट नाम", + "deployment-name-required": "डिप्लॉयमेंट नाम आवश्यक है।", + "set": "सेट करें", + "region": "रीजन", + "region-required": "रीजन आवश्यक है।", + "access-key-id": "ऐक्सेस की ID", + "access-key-id-required": "ऐक्सेस की ID आवश्यक है।", + "secret-access-key": "सीक्रेट ऐक्सेस की", + "secret-access-key-required": "सीक्रेट ऐक्सेस की आवश्यक है।", + "temperature": "टेम्परेचर", + "temperature-hint": "मॉडल के आउटपुट में रैंडमनेस के स्तर को समायोजित करता है। अधिक मान रैंडमनेस बढ़ाते हैं, जबकि कम मान उसे घटाते हैं।", + "temperature-min": "0 या उससे अधिक होना चाहिए।", + "top-p": "टॉप P", + "top-p-hint": "मॉडल के चुनने के लिए सबसे संभावित टोकन्स का एक पूल बनाता है। अधिक मान बड़ा और अधिक विविध पूल बनाते हैं, जबकि कम मान छोटा पूल बनाते हैं।", + "top-p-min-max": "0 से बड़ा और अधिकतम 1 होना चाहिए।", + "top-k": "टॉप K", + "top-k-hint": "मॉडल के विकल्पों को \"K\" सबसे संभावित टोकन्स के एक निश्चित सेट तक सीमित करता है।", + "top-k-min": "0 या उससे अधिक होना चाहिए।", + "presence-penalty": "प्रेज़ेन्स पेनल्टी", + "presence-penalty-hint": "यदि कोई टोकन पहले से टेक्स्ट में आ चुका है, तो उसकी संभावना पर एक स्थिर पेनल्टी लागू करता है।", + "frequency-penalty": "फ़्रीक्वेंसी पेनल्टी", + "frequency-penalty-hint": "टोकन की संभावना पर ऐसी पेनल्टी लागू करता है जो टेक्स्ट में उसकी आवृत्ति के आधार पर बढ़ती है।", + "max-output-tokens": "अधिकतम आउटपुट टोकन्स", + "max-output-tokens-hint": "एक ही रिस्पॉन्स में मॉडल कितने अधिकतम टोकन्स जेनरेट कर सकता है,\nइसे सेट करता है।", + "context-length": "कॉन्टेक्स्ट लंबाई", + "context-length-hint": "कॉन्टेक्स्ट विंडो का आकार टोकन्स में परिभाषित करता है। यह मान मॉडल के लिए कुल मेमोरी लिमिट सेट करता है, जिसमें उपयोगकर्ता का इनपुट और जेनरेट किया गया रिस्पॉन्स दोनों शामिल होते हैं।", + "endpoint": "एंडपॉइंट", + "endpoint-required": "एंडपॉइंट आवश्यक है।", + "baseurl": "Base URL", + "baseurl-required": "Base URL आवश्यक है।", + "service-version": "सर्विस संस्करण", + "check-connectivity": "कनेक्टिविटी जाँचें", + "check-connectivity-success": "टेस्ट अनुरोध सफल रहा", + "check-connectivity-failed": "टेस्ट अनुरोध असफल रहा", + "no-model-matching": "'{{entity}}' से मेल खाते कोई मॉडल नहीं मिले।", + "model-required": "मॉडल आवश्यक है।", + "no-model-text": "कोई मॉडल नहीं मिला।", + "authentication": "प्रमाणीकरण", + "authentication-basic-hint": "मानक HTTP बेसिक प्रमाणीकरण का उपयोग करता है। उपयोगकर्ता नाम और पासवर्ड को जोड़ा जाएगा, Base64-एन्कोड किया जाएगा और प्रत्येक अनुरोध के साथ Ollama सर्वर को भेजी जाने वाली \"प्राधिकरण\" हेडर में शामिल किया जाएगा।", + "authentication-token-hint": "Bearer टोकन प्रमाणीकरण का उपयोग करता है। दिया गया टोकन सीधे \"प्राधिकरण\" हेडर में Ollama सर्वर को भेजे जाने वाले प्रत्येक अनुरोध के साथ भेजा जाएगा।", + "authentication-type": { + "none": "कोई नहीं", + "basic": "बेसिक", + "token": "टोकन" + }, + "username": "उपयोगकर्ता नाम", + "username-required": "उपयोगकर्ता नाम आवश्यक है।", + "password": "पासवर्ड", + "password-required": "पासवर्ड आवश्यक है।", + "token": "टोकन", + "token-required": "टोकन आवश्यक है।" + }, + "confirm-on-exit": { + "message": "आपके पास बिना सहेजे गए परिवर्तन हैं। क्या आप वाकई इस पेज से बाहर जाना चाहते हैं?", + "html-message": "आपके पास बिना सहेजे गए परिवर्तन हैं.
क्या आप वाकई इस पेज से बाहर जाना चाहते हैं?", + "title": "बिना सहेजे गए परिवर्तन" + }, + "contact": { + "country": "देश", + "country-required": "देश आवश्यक है।", + "city": "शहर", + "state": "राज्य / प्रांत", + "postal-code": "ज़िप / डाक कोड", + "postal-code-invalid": "अमान्य ज़िप / डाक कोड फ़ॉर्मेट।", + "address": "पता", + "address2": "पता 2", + "phone": "फ़ोन", + "email": "ईमेल", + "no-address": "कोई पता नहीं", + "no-country-found": "कोई देश नहीं मिला।", + "no-country-matching": "'{{country}}' से मेल खाता कोई देश नहीं मिला।", + "state-max-length": "राज्य की लंबाई 256 से कम होनी चाहिए", + "phone-max-length": "फ़ोन नंबर 256 अक्षरों से कम होना चाहिए", + "city-max-length": "निर्दिष्ट शहर 256 अक्षरों से कम होना चाहिए" + }, + "common": { + "name": "नाम", + "type": "प्रकार", + "general": "सामान्य", + "username": "उपयोगकर्ता नाम", + "password": "पासवर्ड", + "data": "डेटा", + "timestamp": "टाइमस्टैम्प", + "enter-username": "उपयोगकर्ता नाम दर्ज करें", + "enter-password": "पासवर्ड दर्ज करें", + "enter-search": "खोज लिखें", + "created-time": "बनाए जाने का समय", + "disabled": "निष्क्रिय", + "loading": "लोड हो रहा है...", + "proceed": "आगे बढ़ें", + "open-details-page": "विवरण पृष्ठ खोलें", + "not-found": "नहीं मिला", + "value": "मान", + "documentation": "प्रलेखन", + "time-left": "{{time}} बाकी", + "output": "आउटपुट", + "suffix": { + "s": "s", + "ms": "ms" + }, + "hint": { + "name-required": "नाम आवश्यक है।", + "name-pattern": "नाम अमान्य है।", + "name-max-length": "नाम 256 अक्षरों से कम होना चाहिए।", + "title-required": "शीर्षक आवश्यक है।", + "title-pattern": "शीर्षक अमान्य है।", + "title-max-length": "शीर्षक 256 अक्षरों से कम होना चाहिए।", + "key-required": "कुंजी आवश्यक है।", + "key-pattern": "कुंजी अमान्य है।", + "key-max-length": "कुंजी 256 अक्षरों से कम होनी चाहिए।" + }, + "required-fields": "आवश्यक फ़ील्ड्स भरी नहीं गई हैं" + }, + "content-type": { + "json": "JSON", + "text": "टेक्स्ट", + "binary": "बाइनरी (Base64)" + }, + "color": { + "color": "रंग" + }, + "customer": { + "customer": "कस्टमर", + "customers": "कस्टमर", + "management": "कस्टमर प्रबंधन", + "dashboard": "कस्टमर डैशबोर्ड", + "dashboards": "कस्टमर डैशबोर्ड्स", + "devices": "कस्टमर डिवाइस", + "entity-views": "कस्टमर एंटिटी व्यूज़", + "assets": "कस्टमर एसेट", + "public-dashboards": "सार्वजनिक डैशबोर्ड्स", + "public-devices": "सार्वजनिक डिवाइस", + "public-assets": "सार्वजनिक एसेट", + "public-entity-views": "सार्वजनिक एंटिटी व्यूज़", + "add": "कस्टमर जोड़ें", + "delete": "कस्टमर हटाएँ", + "manage-customer-users": "कस्टमर उपयोगकर्ता प्रबंधित करें", + "manage-customer-devices": "कस्टमर डिवाइस प्रबंधित करें", + "manage-customer-dashboards": "कस्टमर डैशबोर्ड्स प्रबंधित करें", + "manage-public-devices": "सार्वजनिक डिवाइस प्रबंधित करें", + "manage-public-dashboards": "सार्वजनिक डैशबोर्ड्स प्रबंधित करें", + "manage-customer-assets": "कस्टमर एसेट प्रबंधित करें", + "manage-customer-edges": "कस्टमर Edge प्रबंधित करें", + "manage-public-assets": "सार्वजनिक एसेट प्रबंधित करें", + "add-customer-text": "नया कस्टमर जोड़ें", + "no-customers-text": "कोई कस्टमर नहीं मिला", + "customer-details": "कस्टमर विवरण", + "delete-customer-title": "क्या आप वाकई कस्टमर '{{customerTitle}}' को हटाना चाहते हैं?", + "delete-customer-text": "सावधान रहें, पुष्टि के बाद कस्टमर और उससे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "delete-customers-title": "क्या आप वाकई { count, plural, =1 {1 कस्टमर} other {# कस्टमर} } हटाना चाहते हैं?", + "delete-customers-action-title": "{ count, plural, =1 {1 कस्टमर} other {# कस्टमर} } हटाएँ", + "delete-customers-text": "सावधान रहें, पुष्टि के बाद सभी चयनित कस्टमर हटा दिए जाएँगे और उनसे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "manage-users": "उपयोगकर्ता प्रबंधित करें", + "manage-assets": "एसेट प्रबंधित करें", + "manage-devices": "डिवाइस प्रबंधित करें", + "manage-dashboards": "डैशबोर्ड्स प्रबंधित करें", + "title": "शीर्षक", + "title-required": "शीर्षक आवश्यक है।", + "title-max-length": "शीर्षक 256 अक्षरों से कम होना चाहिए", + "description": "विवरण", + "details": "विवरण", + "events": "इवेंट्स", + "copyId": "कस्टमर Id कॉपी करें", + "idCopiedMessage": "कस्टमर Id क्लिपबोर्ड में कॉपी कर दी गई है", + "select-customer": "कस्टमर चुनें", + "no-customers-matching": "'{{entity}}' से मेल खाते कोई कस्टमर नहीं मिले।", + "customer-required": "कस्टमर आवश्यक है।", + "select-default-customer": "डिफ़ॉल्ट कस्टमर चुनें", + "default-customer": "डिफ़ॉल्ट कस्टमर", + "default-customer-required": "टेनेंट स्तर पर डैशबोर्ड डिबग करने के लिए डिफ़ॉल्ट कस्टमर आवश्यक है", + "search": "कस्टमर खोजें", + "selected-customers": "{ count, plural, =1 {1 कस्टमर} other {# कस्टमर} } चयनित", + "edges": "कस्टमर Edge इंस्टेंस", + "manage-edges": "Edge इंस्टेंस प्रबंधित करें" + }, + "css-size": { + "size-value-required": "आकार मान आवश्यक है", + "invalid-size-value": "आकार मान अमान्य है" + }, + "date": { + "last-update-n-ago": "अंतिम अपडेट N पहले", + "last-update-n-ago-text": "अंतिम अपडेट {{ agoText }}", + "custom-date": "कस्टम तिथि", + "format": "प्रारूप", + "preview": "पूर्वावलोकन", + "auto": "ऑटो", + "time-granularity-formats": "समय ग्रैन्युलैरिटी प्रारूप", + "unit-year": "वर्ष", + "unit-month": "महीने", + "unit-day": "दिन", + "unit-hour": "घंटे", + "unit-minute": "मिनट", + "unit-second": "सेकंड", + "unit-millisecond": "मिलीसेकंड" + }, + "datetime": { + "date-from": "तिथि से", + "time-from": "समय से", + "date-to": "तिथि तक", + "time-to": "समय तक", + "from": "से", + "to": "तक" + }, + "dashboard": { + "dashboard": "डैशबोर्ड", + "dashboards": "डैशबोर्ड्स", + "management": "डैशबोर्ड प्रबंधन", + "view-dashboards": "डैशबोर्ड्स देखें", + "add": "डैशबोर्ड जोड़ें", + "assign-dashboard-to-customer": "डैशबोर्ड(स) कस्टमर को असाइन करें", + "assign-dashboard-to-customer-text": "कृपया वे डैशबोर्ड चुनें जिन्हें कस्टमर को असाइन करना है", + "assign-to-customer-text": "कृपया वह कस्टमर चुनें जिसे डैशबोर्ड(स) असाइन करना है", + "assign-to-customer": "कस्टमर को असाइन करें", + "unassign-from-customer": "कस्टमर से अनअसाइन करें", + "make-public": "डैशबोर्ड को सार्वजनिक करें", + "make-private": "डैशबोर्ड को निजी करें", + "manage-assigned-customers": "असाइन किए गए कस्टमर प्रबंधित करें", + "assigned-customers": "असाइन किए गए कस्टमर", + "assign-to-customers": "डैशबोर्ड(स) कस्टमर्स को असाइन करें", + "assign-to-customers-text": "कृपया वे कस्टमर्स चुनें जिन्हें डैशबोर्ड(स) असाइन करना है", + "unassign-from-customers": "डैशबोर्ड(स) कस्टमर्स से अनअसाइन करें", + "unassign-from-customers-text": "कृपया वे कस्टमर्स चुनें जिन्हें डैशबोर्ड(स) से अनअसाइन करना है", + "no-dashboards-text": "कोई डैशबोर्ड नहीं मिला", + "no-widgets": "कोई विजेट कॉन्फ़िगर नहीं है", + "add-widget": "नया विजेट जोड़ें", + "add-widget-button-text": "विजेट जोड़ें", + "title": "शीर्षक", + "image": "डैशबोर्ड छवि", + "mobile-app-settings": "मोबाइल एप्लिकेशन सेटिंग्स", + "mobile-order": "मोबाइल एप्लिकेशन में डैशबोर्ड क्रम", + "mobile-hide": "मोबाइल एप्लिकेशन में डैशबोर्ड छिपाएँ", + "update-image": "डैशबोर्ड छवि अपडेट करें", + "take-screenshot": "स्क्रीनशॉट लें", + "select-widget-title": "विजेट चुनें", + "select-widget-value": "{{title}}: विजेट चुनें", + "select-widget-subtitle": "उपलब्ध विजेट प्रकारों की सूची", + "delete": "डैशबोर्ड हटाएँ", + "title-required": "शीर्षक आवश्यक है।", + "title-max-length": "शीर्षक 256 अक्षरों से कम होना चाहिए", + "description": "विवरण", + "details": "विवरण", + "dashboard-details": "डैशबोर्ड विवरण", + "add-dashboard-text": "नया डैशबोर्ड जोड़ें", + "assign-dashboards": "डैशबोर्ड्स असाइन करें", + "assign-new-dashboard": "नया डैशबोर्ड असाइन करें", + "assign-dashboards-text": "कस्टमर्स को { count, plural, =1 {1 डैशबोर्ड} other {# डैशबोर्ड्स} } असाइन करें", + "unassign-dashboards-action-text": "कस्टमर्स से { count, plural, =1 {1 डैशबोर्ड} other {# डैशबोर्ड्स} } अनअसाइन करें", + "delete-dashboards": "डैशबोर्ड्स हटाएँ", + "unassign-dashboards": "डैशबोर्ड्स अनअसाइन करें", + "unassign-dashboards-action-title": "कस्टमर से { count, plural, =1 {1 डैशबोर्ड} other {# डैशबोर्ड्स} } अनअसाइन करें", + "delete-dashboard-title": "क्या आप वाकई डैशबोर्ड '{{dashboardTitle}}' हटाना चाहते हैं?", + "delete-dashboard-text": "सावधान रहें, पुष्टि के बाद डैशबोर्ड और उससे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "delete-dashboards-title": "क्या आप वाकई { count, plural, =1 {1 डैशबोर्ड} other {# डैशबोर्ड्स} } हटाना चाहते हैं?", + "delete-dashboards-action-title": "{ count, plural, =1 {1 डैशबोर्ड} other {# डैशबोर्ड्स} } हटाएँ", + "delete-dashboards-text": "सावधान रहें, पुष्टि के बाद सभी चयनित डैशबोर्ड्स हटा दिए जाएँगे और उनसे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "unassign-dashboard-title": "क्या आप वाकई डैशबोर्ड '{{dashboardTitle}}' को अनअसाइन करना चाहते हैं?", + "unassign-dashboard-text": "पुष्टि के बाद डैशबोर्ड अनअसाइन कर दिया जाएगा और कस्टमर द्वारा एक्सेस नहीं किया जा सकेगा।", + "unassign-dashboard": "डैशबोर्ड अनअसाइन करें", + "unassign-dashboards-title": "क्या आप वाकई { count, plural, =1 {1 डैशबोर्ड} other {# डैशबोर्ड्स} } को अनअसाइन करना चाहते हैं?", + "unassign-dashboards-text": "पुष्टि के बाद सभी चयनित डैशबोर्ड्स अनअसाइन कर दिए जाएँगे और कस्टमर द्वारा एक्सेस नहीं किए जा सकेंगे।", + "public-dashboard-title": "डैशबोर्ड अब सार्वजनिक है", + "public-dashboard-text": "आपका डैशबोर्ड {{dashboardTitle}} अब सार्वजनिक है और इस सार्वजनिक लिंक से उपलब्ध है:", + "public-dashboard-notice": "नोट: उनका डेटा एक्सेस करने के लिए संबंधित डिवाइस को सार्वजनिक बनाना न भूलें।", + "make-private-dashboard-title": "क्या आप वाकई डैशबोर्ड '{{dashboardTitle}}' को निजी बनाना चाहते हैं?", + "make-private-dashboard-text": "पुष्टि के बाद डैशबोर्ड निजी कर दिया जाएगा और अन्य उपयोगकर्ता इसे एक्सेस नहीं कर पाएँगे।", + "make-private-dashboard": "डैशबोर्ड को निजी बनाएँ", + "socialshare-text": "'{{dashboardTitle}}' ThingsBoard द्वारा संचालित", + "socialshare-title": "'{{dashboardTitle}}' ThingsBoard द्वारा संचालित", + "select-dashboard": "डैशबोर्ड चुनें", + "no-dashboards-matching": "'{{entity}}' से मेल खाते कोई डैशबोर्ड नहीं मिले।", + "dashboard-required": "डैशबोर्ड आवश्यक है।", + "select-existing": "मौजूदा डैशबोर्ड चुनें", + "create-new": "नया डैशबोर्ड बनाएँ", + "new-dashboard-title": "नए डैशबोर्ड का शीर्षक", + "open-dashboard": "डैशबोर्ड खोलें", + "set-background": "बैकग्राउंड सेट करें", + "background-color": "बैकग्राउंड रंग", + "background-image": "बैकग्राउंड छवि", + "background-size-mode": "बैकग्राउंड आकार मोड", + "no-image": "कोई छवि चयनित नहीं है", + "empty-image": "कोई छवि नहीं", + "drop-image": "कोई छवि यहाँ छोड़ें या अपलोड करने के लिए फ़ाइल चुनने हेतु क्लिक करें।", + "maximum-upload-file-size": "अधिकतम अपलोड फ़ाइल आकार: {{ size }}", + "cannot-upload-file": "फ़ाइल अपलोड नहीं कर सकते", + "settings": "सेटिंग्स", + "move-all-widgets": "सभी विजेट्स को स्थानांतरित करें", + "move-by": "इतना स्थानांतरित करें", + "cols": "कॉलम", + "rows": "पंक्तियाँ", + "layout": "लेआउट", + "layout-type-default": "डिफ़ॉल्ट", + "layout-type-scada": "SCADA", + "layout-type-divider": "डिवाइडर", + "layout-settings-type": "लेआउट सेटिंग्स: {{ type }} ब्रेकपॉइंट", + "columns-count": "कॉलम की संख्या", + "columns-count-required": "कॉलम की संख्या आवश्यक है।", + "min-columns-count-message": "न्यूनतम कॉलम संख्या केवल 10 हो सकती है।", + "max-columns-count-message": "अधिकतम कॉलम संख्या केवल 1000 हो सकती है।", + "min-layout-width": "न्यूनतम लेआउट चौड़ाई", + "columns-suffix": "कॉलम", + "widgets-margins": "विजेट्स के बीच की मार्जिन", + "margin-required": "मार्जिन मान आवश्यक है।", + "min-margin-message": "न्यूनतम मार्जिन मान केवल 0 हो सकता है।", + "max-margin-message": "अधिकतम मार्जिन मान केवल 50 हो सकता है।", + "horizontal-margin": "क्षैतिज मार्जिन", + "horizontal-margin-required": "क्षैतिज मार्जिन मान आवश्यक है।", + "min-horizontal-margin-message": "न्यूनतम क्षैतिज मार्जिन मान केवल 0 हो सकता है।", + "max-horizontal-margin-message": "अधिकतम क्षैतिज मार्जिन मान केवल 50 हो सकता है।", + "vertical-margin": "ऊर्ध्वाधर मार्जिन", + "vertical-margin-required": "ऊर्ध्वाधर मार्जिन मान आवश्यक है।", + "min-vertical-margin-message": "न्यूनतम ऊर्ध्वाधर मार्जिन मान केवल 0 हो सकता है।", + "max-vertical-margin-message": "अधिकतम ऊर्ध्वाधर मार्जिन मान केवल 50 हो सकता है।", + "apply-outer-margin": "लेआउट के किनारों पर मार्जिन लागू करें", + "autofill-height": "लेआउट की ऊँचाई स्वतः भरें", + "mobile-layout": "मोबाइल लेआउट सेटिंग्स", + "mobile-row-height": "मोबाइल रो ऊँचाई", + "mobile-row-height-required": "मोबाइल रो ऊँचाई का मान आवश्यक है।", + "min-mobile-row-height-message": "न्यूनतम मोबाइल रो ऊँचाई मान केवल 5 पिक्सेल हो सकता है।", + "max-mobile-row-height-message": "अधिकतम मोबाइल रो ऊँचाई मान केवल 200 पिक्सेल हो सकता है।", + "row-height": "रो ऊँचाई", + "row-height-required": "रो ऊँचाई का मान आवश्यक है।", + "min-row-height-message": "न्यूनतम रो ऊँचाई मान केवल 5 पिक्सेल हो सकता है।", + "max-row-height-message": "अधिकतम रो ऊँचाई मान केवल 200 पिक्सेल हो सकता है।", + "display-first-in-mobile-view": "मोबाइल व्यू में सबसे पहले दिखाएँ", + "title-settings": "शीर्षक सेटिंग्स", + "display-title": "डैशबोर्ड शीर्षक दिखाएँ", + "title-color": "शीर्षक रंग", + "toolbar-settings": "टूलबार सेटिंग्स", + "hide-toolbar": "टूलबार छिपाएँ", + "toolbar-always-open": "टूलबार को हमेशा खुला रखें", + "display-dashboards-selection": "डैशबोर्ड चयन दिखाएँ", + "display-entities-selection": "एंटिटी चयन दिखाएँ", + "display-filters": "फ़िल्टर दिखाएँ", + "display-dashboard-timewindow": "समय विंडो दिखाएँ", + "display-dashboard-export": "एक्सपोर्ट विकल्प दिखाएँ", + "display-update-dashboard-image": "डैशबोर्ड इमेज अपडेट विकल्प दिखाएँ", + "dashboard-logo-settings": "डैशबोर्ड लोगो सेटिंग्स", + "display-dashboard-logo": "डैशबोर्ड फुलस्क्रीन मोड में लोगो दिखाएँ", + "dashboard-logo-image": "डैशबोर्ड लोगो इमेज", + "advanced-settings": "एडवांस्ड सेटिंग्स", + "dashboard-css": "डैशबोर्ड CSS", + "import": "डैशबोर्ड इम्पोर्ट करें", + "export": "डैशबोर्ड एक्सपोर्ट करें", + "export-failed-error": "डैशबोर्ड एक्सपोर्ट नहीं किया जा सका: {{error}}", + "export-prompt": "डैशबोर्ड इमेज और संसाधन एम्बेड करें", + "create-new-dashboard": "नया डैशबोर्ड बनाएँ", + "dashboard-file": "डैशबोर्ड फ़ाइल", + "invalid-dashboard-file-error": "डैशबोर्ड इम्पोर्ट नहीं किया जा सका: डैशबोर्ड डेटा संरचना अमान्य है।", + "dashboard-import-missing-aliases-title": "इम्पोर्ट किए गए डैशबोर्ड द्वारा उपयोग किए गए उपनाम (aliases) कॉन्फ़िगर करें", + "create-new-widget": "नया विजेट बनाएँ", + "import-widget": "विजेट इम्पोर्ट करें", + "widget-file": "विजेट फ़ाइल", + "invalid-widget-file-error": "विजेट इम्पोर्ट नहीं किया जा सका: विजेट डेटा संरचना अमान्य है।", + "widget-import-missing-aliases-title": "इम्पोर्ट किए गए विजेट द्वारा उपयोग किए गए उपनाम (aliases) कॉन्फ़िगर करें", + "open-toolbar": "डैशबोर्ड टूलबार खोलें", + "close-toolbar": "टूलबार बंद करें", + "configuration-error": "कॉन्फ़िगरेशन त्रुटि", + "alias-resolution-error-title": "डैशबोर्ड उपनाम कॉन्फ़िगरेशन त्रुटि", + "invalid-aliases-config": "कुछ उपनाम फ़िल्टर के लिए मेल खाते डिवाइस नहीं मिल सके।
कृपया इस समस्या के समाधान के लिए अपने व्यवस्थापक से संपर्क करें।", + "select-devices": "डिवाइस चुनें", + "assignedToCustomer": "कस्टमर को असाइन किया गया", + "assignedToCustomers": "कस्टमर्स को असाइन किया गया", + "public": "सार्वजनिक", + "copyId": "डैशबोर्ड Id कॉपी करें", + "idCopiedMessage": "डैशबोर्ड Id क्लिपबोर्ड में कॉपी कर दी गई है", + "public-link": "सार्वजनिक लिंक", + "copy-public-link": "सार्वजनिक लिंक कॉपी करें", + "public-link-copied-message": "डैशबोर्ड का सार्वजनिक लिंक क्लिपबोर्ड में कॉपी कर दिया गया है", + "manage-states": "डैशबोर्ड स्टेट्स प्रबंधित करें", + "states": "डैशबोर्ड स्टेट्स", + "states-short": "स्टेट्स", + "search-states": "डैशबोर्ड स्टेट्स खोजें", + "selected-states": "{ count, plural, =1 {1 डैशबोर्ड स्टेट} other {# डैशबोर्ड स्टेट्स} } चयनित", + "edit-state": "डैशबोर्ड स्टेट संपादित करें", + "delete-state": "डैशबोर्ड स्टेट हटाएँ", + "add-state": "डैशबोर्ड स्टेट जोड़ें", + "no-states-text": "कोई स्टेट नहीं मिला", + "state": "डैशबोर्ड स्टेट", + "state-name": "नाम", + "state-name-required": "डैशबोर्ड स्टेट नाम आवश्यक है।", + "state-id": "स्टेट Id", + "state-id-required": "डैशबोर्ड स्टेट Id आवश्यक है।", + "state-id-exists": "एक ही Id वाला डैशबोर्ड स्टेट पहले से मौजूद है।", + "is-root-state": "रूट स्टेट", + "delete-state-title": "डैशबोर्ड स्टेट हटाएँ", + "delete-state-text": "क्या आप वाकई '{{stateName}}' नाम वाले डैशबोर्ड स्टेट को हटाना चाहते हैं?", + "show-details": "विवरण दिखाएँ", + "hide-details": "विवरण छिपाएँ", + "select-state": "लक्षित स्टेट चुनें", + "state-controller": "स्टेट कंट्रोलर", + "state-controller-default": "स्टैटिक (अप्रचलित)", + "search": "डैशबोर्ड्स खोजें", + "selected-dashboards": "{ count, plural, =1 {1 डैशबोर्ड} other {# डैशबोर्ड्स} } चयनित", + "home-dashboard": "होम डैशबोर्ड", + "home-dashboard-hide-toolbar": "होम डैशबोर्ड टूलबार छिपाएँ", + "unassign-dashboard-from-edge-text": "पुष्टि के बाद डैशबोर्ड अनअसाइन कर दिया जाएगा और Edge द्वारा एक्सेस नहीं किया जा सकेगा।", + "unassign-dashboards-from-edge-title": "क्या आप वाकई { count, plural, =1 {1 डैशबोर्ड} other {# डैशबोर्ड्स} } को अनअसाइन करना चाहते हैं?", + "unassign-dashboards-from-edge-text": "पुष्टि के बाद सभी चयनित डैशबोर्ड्स अनअसाइन कर दिए जाएँगे और Edge द्वारा एक्सेस नहीं किए जा सकेंगे।", + "assign-dashboard-to-edge": "डैशबोर्ड(स) को Edge पर असाइन करें", + "assign-dashboard-to-edge-text": "कृपया वे डैशबोर्ड चुनें जिन्हें Edge को असाइन करना है", + "non-existent-dashboard-state-error": "Id \"{{ stateId }}\" वाला डैशबोर्ड स्टेट नहीं मिला", + "edit-mode": "एडिट मोड", + "duplicate-state-action": "स्टेट डुप्लिकेट करें", + "breakpoint-value": "ब्रेकपॉइंट ({{ value }})", + "breakpoints-id": { + "default": "डिफ़ॉल्ट", + "xs": "मोबाइल (xs)", + "sm": "टैबलेट (sm)", + "md": "लैपटॉप (md)", + "lg": "डेस्कटॉप (lg)", + "xl": "डेस्कटॉप (xl)" + }, + "view-format-type-grid": "ग्रिड", + "view-format-type-list": "सूची", + "view-format": "व्यू फ़ॉर्मेट" + }, + "datakey": { + "settings": "सेटिंग्स", + "general": "सामान्य", + "advanced": "एडवांस्ड", + "key": "कुंजी", + "keys": "कुंजियाँ", + "label": "लेबल", + "color": "रंग", + "units": "मान के बगल में दिखाने के लिए विशेष चिह्न", + "decimals": "दशमलव के बाद अंकों की संख्या", + "data-generation-func": "डेटा जनरेशन फ़ंक्शन", + "use-data-post-processing-func": "डेटा पोस्ट-प्रोसेसिंग फ़ंक्शन का उपयोग करें", + "configuration": "डेटा कुंजी कॉन्फ़िगरेशन", + "timeseries": "टाइम सीरीज़", + "attributes": "विशेषताएँ", + "entity-field": "एंटिटी फ़ील्ड", + "alarm": "अलार्म फ़ील्ड्स", + "timeseries-required": "एंटिटी टाइम सीरीज़ आवश्यक हैं।", + "timeseries-or-attributes-required": "एंटिटी टाइम सीरीज़/विशेषताएँ आवश्यक हैं।", + "alarm-fields-timeseries-or-attributes-required": "अलार्म फ़ील्ड्स या एंटिटी टाइम सीरीज़/विशेषताएँ आवश्यक हैं।", + "maximum-timeseries-or-attributes": "अधिकतम { count, plural, =1 {1 टाइम सीरीज़/विशेषता की अनुमति है।} other {# टाइम सीरीज़/विशेषताओं की अनुमति है} }", + "alarm-fields-required": "अलार्म फ़ील्ड्स आवश्यक हैं।", + "function-types": "फ़ंक्शन प्रकार", + "function-type": "फ़ंक्शन प्रकार", + "function-types-required": "फ़ंक्शन प्रकार आवश्यक हैं।", + "data-keys": "डेटा कुंजियाँ", + "data-key": "डेटा कुंजी", + "data-keys-required": "डेटा कुंजियाँ आवश्यक हैं।", + "data-key-required": "डेटा कुंजी आवश्यक है।", + "alarm-keys": "अलार्म डेटा कुंजियाँ", + "alarm-key": "अलार्म डेटा कुंजी", + "alarm-key-functions": "अलार्म कुंजी फ़ंक्शंस", + "alarm-key-function": "अलार्म कुंजी फ़ंक्शन", + "latest-keys": "नवीनतम डेटा कुंजियाँ", + "latest-key": "नवीनतम डेटा कुंजी", + "latest-key-functions": "नवीनतम कुंजी फ़ंक्शंस", + "latest-key-function": "नवीनतम कुंजी फ़ंक्शन", + "timeseries-keys": "टाइम सीरीज़ डेटा कुंजियाँ", + "timeseries-key": "टाइम सीरीज़ डेटा कुंजी", + "timeseries-key-functions": "टाइम सीरीज़ कुंजी फ़ंक्शंस", + "timeseries-key-function": "टाइम सीरीज़ कुंजी फ़ंक्शन", + "maximum-function-types": "अधिकतम { count, plural, =1 {1 फ़ंक्शन प्रकार की अनुमति है।} other {# फ़ंक्शन प्रकारों की अनुमति है} }", + "time-description": "वर्तमान मान का टाइमस्टैम्प;", + "value-description": "वर्तमान मान;", + "prev-value-description": "पिछले फ़ंक्शन कॉल का परिणाम;", + "time-prev-description": "पिछले मान का टाइमस्टैम्प;", + "prev-orig-value-description": "मूल पिछला मान;", + "aggregation": "एग्रीगेशन", + "aggregation-type-hint-common": "प्रदर्शन कारणों से, एग्रीगेटेड मानों की गणना केवल निश्चित समय अंतरालों (जैसे \"वर्तमान दिन\", \"वर्तमान माह\" आदि) के लिए उपलब्ध है और 'पिछले 30 मिनट' या 'पिछले 24 घंटे' जैसे स्लाइडिंग विंडो अंतरालों के लिए उपलब्ध नहीं है।", + "aggregation-type-none-hint": "नवीनतम मान लें।", + "aggregation-type-min-hint": "चयनित समय विंडो के भीतर डेटा पॉइंट्स में न्यूनतम मान खोजें।", + "aggregation-type-max-hint": "चयनित समय विंडो के भीतर डेटा पॉइंट्स में अधिकतम मान खोजें।", + "aggregation-type-avg-hint": "चयनित समय विंडो के भीतर डेटा पॉइंट्स का औसत मान निकालें।", + "aggregation-type-sum-hint": "चयनित समय विंडो के भीतर सभी डेटा पॉइंट्स के मानों का योग करें।", + "aggregation-type-count-hint": "चयनित समय विंडो के भीतर डेटा पॉइंट्स की कुल संख्या।", + "delta-calculation": "डेल्टा कैलक्युलेशन", + "enable-delta-calculation": "डेल्टा कैलक्युलेशन सक्षम करें", + "enable-delta-calculation-hint": "सक्षम होने पर, चयनित समय विंडो और निर्दिष्ट तुलना अवधि के लिए एग्रीगेटेड मानों के आधार पर डेटा कुंजी का मान गणना किया जाता है। प्रदर्शन कारणों से, डेल्टा कैलक्युलेशन केवल इतिहास समय विंडो के लिए उपलब्ध है, रियल-टाइम मानों के लिए नहीं। उदाहरण के लिए, आप कल की ऊर्जा खपत और परसों की ऊर्जा खपत के बीच डेल्टा की गणना कर सकते हैं।", + "delta-calculation-result": "डेल्टा कैलक्युलेशन परिणाम", + "delta-calculation-result-previous-value": "पिछला मान", + "delta-calculation-result-delta-absolute": "डेल्टा (पूर्ण)", + "delta-calculation-result-delta-percent": "डेल्टा (प्रतिशत)", + "source": "स्रोत", + "latest": "नवीनतम", + "latest-value": "नवीनतम मान", + "delta": "डेल्टा", + "percent": "प्रतिशत", + "absolute": "पूर्ण" + }, + "datasource": { + "type": "डेटा स्रोत प्रकार", + "name": "नाम", + "label": "लेबल", + "add-datasource-prompt": "कृपया डेटा स्रोत जोड़ें" + }, + "details": { + "details": "विवरण", + "edit-mode": "एडिट मोड", + "edit-json": "JSON संपादित करें", + "toggle-edit-mode": "एडिट मोड बदलें" + }, + "device": { + "device": "डिवाइस", + "device-required": "डिवाइस आवश्यक है।", + "devices": "डिवाइस", + "management": "डिवाइस प्रबंधन", + "view-devices": "डिवाइस देखें", + "device-alias": "डिवाइस उपनाम", + "device-type-max-length": "डिवाइस प्रकार 256 अक्षरों से कम होना चाहिए", + "aliases": "डिवाइस उपनाम", + "no-alias-matching": "'{{alias}}' नहीं मिला।", + "no-aliases-found": "कोई उपनाम नहीं मिला।", + "no-key-matching": "'{{key}}' नहीं मिला।", + "no-keys-found": "कोई कुंजी नहीं मिली।", + "create-new-alias": "नया उपनाम बनाएँ!", + "create-new-key": "नई कुंजी बनाएँ!", + "duplicate-alias-error": "डुप्लिकेट उपनाम '{{alias}}' मिला।
डैशबोर्ड के भीतर डिवाइस उपनाम यूनिक होने चाहिए।", + "configure-alias": "'{{alias}}' उपनाम कॉन्फ़िगर करें", + "no-devices-matching": "'{{entity}}' से मेल खाते कोई डिवाइस नहीं मिले।", + "alias": "उपनाम", + "alias-required": "डिवाइस उपनाम आवश्यक है।", + "remove-alias": "डिवाइस उपनाम हटाएँ", + "add-alias": "डिवाइस उपनाम जोड़ें", + "name-starts-with": "डिवाइस नाम अभिव्यक्ति", + "help-text": "आवश्यकता अनुसार '%' का उपयोग करें: '%device_name_contains%', '%device_name_ends', 'device_starts_with'.", + "device-list": "डिवाइस सूची", + "use-device-name-filter": "फ़िल्टर का उपयोग करें", + "device-list-empty": "कोई डिवाइस चयनित नहीं है।", + "device-name-filter-required": "डिवाइस नाम फ़िल्टर आवश्यक है।", + "device-name-filter-no-device-matched": "'{{device}}' से शुरू होने वाले कोई डिवाइस नहीं मिले।", + "add": "डिवाइस जोड़ें", + "assign-to-customer": "कस्टमर को असाइन करें", + "assign-device-to-customer": "डिवाइस(स) कस्टमर को असाइन करें", + "assign-device-to-customer-text": "कृपया वे डिवाइस चुनें जिन्हें कस्टमर को असाइन करना है", + "make-public": "डिवाइस को सार्वजनिक करें", + "make-private": "डिवाइस को निजी करें", + "no-devices-text": "कोई डिवाइस नहीं मिला", + "assign-to-customer-text": "कृपया वह कस्टमर चुनें जिसे डिवाइस(स) असाइन करना है", + "device-details": "डिवाइस विवरण", + "add-device-text": "नया डिवाइस जोड़ें", + "credentials": "क्रेडेंशियल्स", + "manage-credentials": "क्रेडेंशियल्स प्रबंधित करें", + "delete": "डिवाइस हटाएँ", + "assign-devices": "डिवाइस असाइन करें", + "assign-devices-text": "कस्टमर को { count, plural, =1 {1 डिवाइस} other {# डिवाइस} } असाइन करें", + "delete-devices": "डिवाइस हटाएँ", + "unassign-from-customer": "कस्टमर से अनअसाइन करें", + "unassign-devices": "डिवाइस अनअसाइन करें", + "unassign-devices-action-title": "कस्टमर से { count, plural, =1 {1 डिवाइस} other {# डिवाइस} } अनअसाइन करें", + "unassign-device-from-edge-title": "क्या आप वाकई डिवाइस '{{deviceName}}' को Edge से अनअसाइन करना चाहते हैं?", + "unassign-device-from-edge-text": "पुष्टि के बाद डिवाइस अनअसाइन कर दिया जाएगा और Edge द्वारा एक्सेस नहीं किया जा सकेगा।", + "unassign-devices-from-edge": "Edge से डिवाइस अनअसाइन करें", + "assign-new-device": "नया डिवाइस असाइन करें", + "make-public-device-title": "क्या आप वाकई डिवाइस '{{deviceName}}' को सार्वजनिक बनाना चाहते हैं?", + "make-public-device-text": "पुष्टि के बाद डिवाइस और उसका सारा डेटा सार्वजनिक हो जाएगा और अन्य के लिए सुलभ होगा।", + "make-private-device-title": "क्या आप वाकई डिवाइस '{{deviceName}}' को निजी बनाना चाहते हैं?", + "make-private-device-text": "पुष्टि के बाद डिवाइस और उसका सारा डेटा निजी हो जाएगा और अन्य के लिए सुलभ नहीं होगा।", + "view-credentials": "क्रेडेंशियल्स देखें", + "delete-device-title": "क्या आप वाकई डिवाइस '{{deviceName}}' को हटाना चाहते हैं?", + "delete-device-text": "सावधान रहें, पुष्टि के बाद डिवाइस और उससे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "delete-devices-title": "क्या आप वाकई { count, plural, =1 {1 डिवाइस} other {# डिवाइस} } हटाना चाहते हैं?", + "delete-devices-action-title": "{ count, plural, =1 {1 डिवाइस} other {# डिवाइस} } हटाएँ", + "delete-devices-text": "सावधान रहें, पुष्टि के बाद सभी चयनित डिवाइस हटा दिए जाएँगे और उनसे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "unassign-device-title": "क्या आप वाकई डिवाइस '{{deviceName}}' को अनअसाइन करना चाहते हैं?", + "unassign-device-text": "पुष्टि के बाद डिवाइस अनअसाइन कर दिया जाएगा और कस्टमर द्वारा एक्सेस नहीं किया जा सकेगा।", + "unassign-device": "डिवाइस अनअसाइन करें", + "unassign-devices-title": "क्या आप वाकई { count, plural, =1 {1 डिवाइस} other {# डिवाइस} } को अनअसाइन करना चाहते हैं?", + "unassign-devices-text": "पुष्टि के बाद सभी चयनित डिवाइस अनअसाइन कर दिए जाएँगे और कस्टमर द्वारा एक्सेस नहीं किए जा सकेंगे।", + "device-credentials": "डिवाइस क्रेडेंशियल्स", + "loading-device-credentials": "डिवाइस क्रेडेंशियल्स लोड किए जा रहे हैं...", + "credentials-type": "क्रेडेंशियल्स प्रकार", + "access-token": "ऐक्सेस टोकन", + "access-token-required": "ऐक्सेस टोकन आवश्यक है।", + "access-token-invalid": "ऐक्सेस टोकन की लंबाई 1 से 32 अक्षरों के बीच होनी चाहिए।", + "certificate-pem-format": "PEM प्रारूप में प्रमाणपत्र", + "certificate-pem-format-required": "प्रमाणपत्र आवश्यक है।", + "copy-access-token": "ऐक्सेस टोकन कॉपी करें", + "copy-certificate": "प्रमाणपत्र कॉपी करें", + "copy-client-id": "क्लाइंट ID कॉपी करें", + "copy-user-name": "यूज़र नाम कॉपी करें", + "copy-password": "पासवर्ड कॉपी करें", + "generate-client-id": "क्लाइंट ID जेनरेट करें", + "generate-user-name": "यूज़र नाम जेनरेट करें", + "generate-password": "पासवर्ड जेनरेट करें", + "generate-access-token": "ऐक्सेस टोकन जेनरेट करें", + "lwm2m-security-config": { + "identity": "क्लाइंट पहचान", + "identity-required": "क्लाइंट पहचान आवश्यक है।", + "identity-tooltip": "PSK पहचानकर्ता (identifier) एक मनमाना PSK पहचानकर्ता होता है जिसकी लंबाई अधिकतम 128 बाइट तक हो सकती है, जैसा कि मानक [RFC7925] में वर्णित है।\nPSK पहचानकर्ता को पहले एक कैरेक्टर स्ट्रिंग में बदला जाना चाहिए और फिर UTF-8 का उपयोग करके ऑक्टेट्स में एनकोड किया जाना चाहिए।", + "client-key": "क्लाइंट कुंजी", + "client-key-required": "क्लाइंट कुंजी आवश्यक है।", + "client-key-tooltip-prk": "RPK सार्वजनिक कुंजी या आईडी मानक [RFC7250] के अनुरूप होनी चाहिए और Base64 फॉर्मेट में एनकोड की जानी चाहिए!", + "client-key-tooltip-psk": "PSK कुंजी मानक [RFC4279] के अनुरूप होनी चाहिए और HexDec फॉर्मेट में हो: 32, 64, 128 अक्षर!", + "endpoint": "एंडपॉइंट क्लाइंट नाम", + "endpoint-required": "एंडपॉइंट क्लाइंट नाम आवश्यक है।", + "client-public-key": "क्लाइंट सार्वजनिक कुंजी", + "client-public-key-hint": "यदि क्लाइंट सार्वजनिक कुंजी खाली है, तो विश्वसनीय प्रमाणपत्र का उपयोग किया जाएगा", + "client-public-key-tooltip": "X509 सार्वजनिक कुंजी DER-encoded X509v3 फॉर्मेट में होनी चाहिए, केवल EC algorithm को सपोर्ट करनी चाहिए और फिर Base64 फॉर्मेट में एनकोड की जानी चाहिए!", + "mode": "सुरक्षा कॉन्फ़िगरेशन मोड", + "client-tab": "क्लाइंट सुरक्षा कॉन्फ़िगरेशन", + "client-certificate": "क्लाइंट प्रमाणपत्र", + "bootstrap-tab": "Bootstrap क्लाइंट", + "bootstrap-server": "Bootstrap सर्वर", + "lwm2m-server": "LwM2M सर्वर", + "client-publicKey-or-id": "क्लाइंट सार्वजनिक कुंजी या आईडी", + "client-publicKey-or-id-required": "क्लाइंट सार्वजनिक कुंजी या आईडी आवश्यक है।", + "client-publicKey-or-id-tooltip-psk": "PSK पहचानकर्ता (identifier) एक मनमाना PSK पहचानकर्ता होता है जिसकी लंबाई अधिकतम 128 बाइट तक हो सकती है, जैसा कि मानक [RFC7925] में वर्णित है।\nPSK पहचानकर्ता को पहले एक कैरेक्टर स्ट्रिंग में बदला जाना चाहिए और फिर UTF-8 का उपयोग करके ऑक्टेट्स में एनकोड किया जाना चाहिए।", + "client-publicKey-or-id-tooltip-rpk": "RPK सार्वजनिक कुंजी या आईडी मानक [RFC7250] के अनुरूप होनी चाहिए और Base64 फॉर्मेट में एनकोड की जानी चाहिए!", + "client-publicKey-or-id-tooltip-x509": "X509 सार्वजनिक कुंजी DER-encoded X509v3 फॉर्मेट में होनी चाहिए, केवल EC algorithm को सपोर्ट करनी चाहिए और फिर Base64 फॉर्मेट में एनकोड की जानी चाहिए।", + "client-secret-key": "क्लाइंट सीक्रेट कुंजी", + "client-secret-key-required": "क्लाइंट सीक्रेट कुंजी आवश्यक है।", + "client-secret-key-tooltip-psk": "PSK कुंजी मानक [RFC4279] के अनुरूप होनी चाहिए और HexDec फॉर्मेट में हो: 32, 64, 128 अक्षर!", + "client-secret-key-tooltip-prk": "RPK सीक्रेट कुंजी PKCS_8 फॉर्मेट (DER एनकोडिंग, मानक [RFC5958]) में होनी चाहिए और फिर Base64 फॉर्मेट में एनकोड की जानी चाहिए!", + "client-secret-key-tooltip-x509": "X509 सीक्रेट कुंजी PKCS_8 फॉर्मेट (DER एनकोडिंग, मानक [RFC5958]) में होनी चाहिए और फिर Base64 फॉर्मेट में एनकोड की जानी चाहिए!" + }, + "client-id": "क्लाइंट ID", + "client-id-pattern": "अमान्य वर्ण शामिल है।", + "user-name": "यूज़र नाम", + "user-name-required": "यूज़र नाम आवश्यक है।", + "client-id-or-user-name-necessary": "क्लाइंट ID और/या यूज़र नाम आवश्यक हैं", + "password": "पासवर्ड", + "secret": "सीक्रेट", + "secret-required": "सीक्रेट आवश्यक है।", + "device-type": "डिवाइस प्रोफ़ाइल", + "device-type-required": "डिवाइस प्रकार आवश्यक है।", + "select-device-type": "डिवाइस प्रकार चुनें", + "enter-device-type": "डिवाइस प्रोफ़ाइल दर्ज करें", + "any-device": "कोई भी डिवाइस", + "no-device-types-matching": "कोई डिवाइस प्रोफ़ाइल '{{entitySubtype}}' से मेल नहीं खाती।", + "device-type-list-empty": "कोई डिवाइस प्रोफ़ाइल चयनित नहीं है!", + "device-profile-type-list-empty": "कम से कम एक डिवाइस प्रोफ़ाइल चयनित होनी चाहिए।", + "device-types": "डिवाइस प्रकार", + "name": "नाम", + "name-required": "नाम आवश्यक है।", + "name-max-length": "नाम 256 अक्षरों से कम होना चाहिए", + "label-max-length": "लेबल 256 अक्षरों से कम होना चाहिए", + "description": "विवरण", + "label": "लेबल", + "events": "इवेंट्स", + "details": "विवरण", + "copyId": "डिवाइस Id कॉपी करें", + "copyAccessToken": "ऐक्सेस टोकन कॉपी करें", + "copy-mqtt-authentication": "MQTT क्रेडेंशियल्स कॉपी करें", + "idCopiedMessage": "डिवाइस Id क्लिपबोर्ड में कॉपी कर दी गई है", + "accessTokenCopiedMessage": "डिवाइस ऐक्सेस टोकन क्लिपबोर्ड में कॉपी कर दिया गया है", + "mqtt-authentication-copied-message": "डिवाइस MQTT ऑथेंटिकेशन क्लिपबोर्ड में कॉपी कर दिया गया है", + "assignedToCustomer": "कस्टमर को असाइन किया गया", + "unable-delete-device-alias-title": "डिवाइस उपनाम हटाने में असमर्थ", + "unable-delete-device-alias-text": "डिवाइस उपनाम '{{deviceAlias}}' हटाया नहीं जा सकता क्योंकि इसका उपयोग इन विजेट(s) द्वारा किया जा रहा है:
{{widgetsList}}", + "is-gateway": "Gateway है", + "overwrite-activity-time": "कनेक्टेड डिवाइस के गतिविधि समय को ओवरराइट करें", + "device-filter-title": "डिवाइस फ़िल्टर", + "filter-title": "फ़िल्टर", + "device-state": "डिवाइस स्थिति", + "state": "स्थिति", + "any": "कोई भी", + "active": "सक्रिय", + "inactive": "निष्क्रिय", + "public": "सार्वजनिक", + "device-public": "डिवाइस सार्वजनिक है", + "select-device": "डिवाइस चुनें", + "import": "डिवाइस इम्पोर्ट करें", + "device-file": "डिवाइस फ़ाइल", + "search": "डिवाइस खोजें", + "selected-devices": "{ count, plural, =1 {1 डिवाइस} other {# डिवाइस} } चयनित", + "device-configuration": "डिवाइस कॉन्फ़िगरेशन", + "transport-configuration": "ट्रांसपोर्ट कॉन्फ़िगरेशन", + "wizard": { + "device-details": "डिवाइस विवरण" + }, + "unassign-devices-from-edge-title": "क्या आप वाकई { count, plural, =1 {1 डिवाइस} other {# डिवाइस} } को अनअसाइन करना चाहते हैं?", + "unassign-devices-from-edge-text": "पुष्टि के बाद सभी चयनित डिवाइस अनअसाइन कर दिए जाएँगे और Edge द्वारा एक्सेस नहीं किए जा सकेंगे।", + "time": "समय", + "connectivity": { + "check-connectivity": "कनेक्टिविटी जाँचें", + "device-created-check-connectivity": "डिवाइस बना दिया गया है। चलिए कनेक्टिविटी जाँचते हैं!", + "loading-check-connectivity-command": "कनेक्टिविटी जाँचने वाले कमांड लोड किए जा रहे हैं...", + "use-following-instructions": "शेल का उपयोग करके डिवाइस की ओर से टेलीमेट्री भेजने के लिए निम्न निर्देशों का उपयोग करें", + "execute-following-command": "निम्न कमांड चलाएँ", + "install-curl-windows": "Windows 10 b17063 से cURL डिफ़ॉल्ट रूप से उपलब्ध है", + "install-curl-macos": "Mac OS X 10.2 6C115 (Jaguar) से cURL डिफ़ॉल्ट रूप से उपलब्ध है", + "install-mqtt-windows": "mosquitto_pub को डाउनलोड, इंस्टॉल, सेटअप और रन करने के लिए दिए गए निर्देशों का उपयोग करें", + "install-coap-client": "coap-client को डाउनलोड, इंस्टॉल, सेटअप और रन करने के लिए दिए गए निर्देशों का उपयोग करें", + "install-necessary-client-tools": "आवश्यक क्लाइंट टूल्स इंस्टॉल करें", + "mqtts-x509-command": "MQTT के माध्यम से X509 ऑथराइजेशन के साथ डिवाइस कनेक्ट करने के लिए निम्न डॉक्यूमेंटेशन का उपयोग करें", + "coaps-x509-command": "CoAP over DTLS के माध्यम से X509 ऑथराइजेशन के साथ डिवाइस कनेक्ट करने के लिए निम्न डॉक्यूमेंटेशन का उपयोग करें", + "snmp-command": "डिवाइस को SNMP के माध्यम से कनेक्ट करने के लिए निम्न डॉक्यूमेंटेशन का उपयोग करें।", + "sparkplug-command": "डिवाइस को MQTT Sparkplug के माध्यम से कनेक्ट करने के लिए निम्न डॉक्यूमेंटेशन का उपयोग करें।", + "lwm2m-command": "डिवाइस को LWM2M के माध्यम से कनेक्ट करने के लिए निम्न डॉक्यूमेंटेशन का उपयोग करें।" + } + }, + "dynamic-form": { + "property": { + "properties": "प्रॉपर्टीज़", + "property": "प्रॉपर्टी", + "id": "Id", + "name": "नाम", + "type": "प्रकार", + "type-text": "टेक्स्ट", + "type-password": "पासवर्ड", + "type-textarea": "टेक्स्ट एरिया", + "type-number": "नंबर", + "type-switch": "स्विच", + "type-select": "सेलेक्ट", + "type-radios": "रेडियो बटन", + "type-datetime": "तारीख/समय", + "type-image": "इमेज", + "type-javascript": "JavaScript", + "type-json": "JSON", + "type-html": "HTML", + "type-css": "CSS", + "type-markdown": "Markdown", + "type-color": "रंग", + "type-color-settings": "रंग सेटिंग्स", + "type-font": "फ़ॉन्ट", + "type-units": "यूनिट्स", + "type-icon": "आइकन", + "type-fieldset": "फील्डसेट", + "type-array": "ऐरे", + "type-html-section": "HTML सेक्शन", + "group-title": "ग्रुप शीर्षक", + "no-properties": "कोई प्रॉपर्टीज़ कॉन्फ़िगर नहीं की गईं", + "add-property": "प्रॉपर्टी जोड़ें", + "property-settings": "प्रॉपर्टी सेटिंग्स", + "remove-property": "प्रॉपर्टी हटाएँ", + "default-value": "डिफ़ॉल्ट मान", + "value-required": "मान आवश्यक है।", + "number-settings": "नंबर सेटिंग्स", + "min": "न्यूनतम", + "max": "अधिकतम", + "step": "स्टेप", + "selected-options-limit": "चयनित विकल्पों की सीमा", + "advanced-ui-settings": "एडवांस्ड UI सेटिंग्स", + "disable-on-property": "प्रॉपर्टी के आधार पर डिसेबल करें", + "disable-on-property-none": "कोई नहीं (फ़ील्ड हमेशा सक्षम रहती है)", + "display-condition-function": "डिस्प्ले कंडीशन फ़ंक्शन", + "sub-label": "सब-लेबल", + "vertical-divider-after": "इसके बाद ऊर्ध्वाधर डिवाइडर", + "input-field-suffix": "इनपुट फ़ील्ड प्रत्यय", + "property-row-classes": "प्रॉपर्टी पंक्ति क्लासेज़", + "property-field-classes": "प्रॉपर्टी फ़ील्ड क्लासेज़", + "not-unique-property-ids-error": "प्रॉपर्टी Id यूनिक होने चाहिए!", + "enable-multiple-select": "मल्टीपल सेलेक्ट सक्षम करें", + "allow-empty-select-option": "खाली विकल्प की अनुमति दें", + "select-options": "सेलेक्ट विकल्प", + "not-unique-select-option-value-error": "सेलेक्ट विकल्प मान यूनिक होने चाहिए!", + "value": "मान", + "label": "लेबल", + "add-option": "विकल्प जोड़ें", + "no-options": "कोई विकल्प कॉन्फ़िगर नहीं किए गए हैं", + "remove-option": "विकल्प हटाएँ", + "textarea-rows": "टेक्स्टएरिया पंक्तियाँ", + "help-id": "हेल्प Id", + "buttons-direction": "बटन दिशा", + "direction-row": "पंक्ति", + "direction-column": "कॉलम", + "radio-button-options": "रेडियो बटन विकल्प", + "datetime-type": "तारीख/समय फ़ील्ड प्रकार", + "datetime-type-date": "तारीख", + "datetime-type-time": "समय", + "datetime-type-datetime": "तारीख/समय", + "enable-clear-button": "क्लियर बटन सक्षम करें", + "html-section-settings": "HTML सेक्शन सेटिंग्स", + "html-section-classes": "HTML सेक्शन क्लासेज़", + "html-section-content": "HTML सेक्शन सामग्री", + "array-item": "ऐरे आइटम", + "item-type": "आइटम प्रकार", + "item-name": "आइटम नाम", + "no-items": "कोई आइटम नहीं", + "support-unit-conversion": "यूनिट रूपांतरण का समर्थन करें" + }, + "clear-form": "फॉर्म साफ़ करें", + "clear-form-prompt": "क्या आप वाकई सभी फॉर्म प्रॉपर्टीज़ हटाना चाहते हैं?", + "import-form": "JSON से फॉर्म आयात करें", + "export-form": "फॉर्म को JSON में निर्यात करें", + "json-file": "JSON फ़ाइल", + "json-content": "JSON सामग्री", + "invalid-form-json-file-error": "JSON से फॉर्म आयात करने में असमर्थ: फॉर्म JSON डेटा संरचना अमान्य है।" + }, + "asset-profile": { + "asset-profile": "एसेट प्रोफ़ाइल", + "asset-profiles": "एसेट प्रोफ़ाइलें", + "all-asset-profiles": "सभी", + "add": "एसेट प्रोफ़ाइल जोड़ें", + "edit": "एसेट प्रोफ़ाइल संपादित करें", + "asset-profile-details": "एसेट प्रोफ़ाइल विवरण", + "no-asset-profiles-text": "कोई एसेट प्रोफ़ाइल नहीं मिली", + "search": "एसेट प्रोफ़ाइल खोजें", + "selected-asset-profiles": "{ count, plural, =1 {1 एसेट प्रोफ़ाइल} other {# एसेट प्रोफ़ाइलें} } चयनित", + "no-asset-profiles-matching": "कोई एसेट प्रोफ़ाइल '{{entity}}' से मेल नहीं खाती।", + "asset-profile-required": "एसेट प्रोफ़ाइल आवश्यक है", + "idCopiedMessage": "एसेट प्रोफ़ाइल Id क्लिपबोर्ड में कॉपी कर दी गई है", + "set-default": "एसेट प्रोफ़ाइल को डिफ़ॉल्ट बनाएं", + "delete": "एसेट प्रोफ़ाइल हटाएँ", + "copyId": "एसेट प्रोफ़ाइल Id कॉपी करें", + "name-max-length": "नाम 256 अक्षरों से कम होना चाहिए", + "new-device-profile-name": "एसेट प्रोफ़ाइल नाम", + "new-device-profile-name-required": "एसेट प्रोफ़ाइल नाम आवश्यक है।", + "name": "नाम", + "name-required": "नाम आवश्यक है।", + "image": "एसेट प्रोफ़ाइल इमेज", + "description": "विवरण", + "default": "डिफ़ॉल्ट", + "default-rule-chain": "डिफ़ॉल्ट नियम शृंखला", + "default-edge-rule-chain": "डिफ़ॉल्ट Edge नियम शृंखला", + "default-edge-rule-chain-hint": "Edge पर इस एसेट प्रोफ़ाइल के एसेट्स से आने वाले डेटा को प्रोसेस करने के लिए नियम शृंखला के रूप में उपयोग की जाती है", + "mobile-dashboard": "मोबाइल डैशबोर्ड", + "mobile-dashboard-hint": "मोबाइल एप्लिकेशन द्वारा एसेट विवरण डैशबोर्ड के रूप में उपयोग किया जाता है", + "select-queue-hint": "ड्रॉपडाउन सूची से चुनें।", + "delete-asset-profile-title": "क्या आप वाकई एसेट प्रोफ़ाइल '{{assetProfileName}}' को हटाना चाहते हैं?", + "delete-asset-profile-text": "सावधान रहें, पुष्टि के बाद एसेट प्रोफ़ाइल और इससे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "delete-asset-profiles-title": "क्या आप वाकई { count, plural, =1 {1 एसेट प्रोफ़ाइल} other {# एसेट प्रोफ़ाइलें} } हटाना चाहते हैं?", + "delete-asset-profiles-text": "सावधान रहें, पुष्टि के बाद सभी चयनित एसेट प्रोफ़ाइलें हटा दी जाएँगी और उनसे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "set-default-asset-profile-title": "क्या आप वाकई एसेट प्रोफ़ाइल '{{assetProfileName}}' को डिफ़ॉल्ट बनाना चाहते हैं?", + "set-default-asset-profile-text": "पुष्टि के बाद यह एसेट प्रोफ़ाइल डिफ़ॉल्ट के रूप में चिन्हित हो जाएगी और नई एसेट्स के लिए उपयोग होगी, जिनके लिए कोई प्रोफ़ाइल निर्दिष्ट नहीं है।", + "no-asset-profiles-found": "कोई एसेट प्रोफ़ाइल नहीं मिली।", + "create-new-asset-profile": "नया बनाएँ!", + "create-asset-profile": "नई एसेट प्रोफ़ाइल बनाएँ", + "import": "एसेट प्रोफ़ाइल इम्पोर्ट करें", + "export": "एसेट प्रोफ़ाइल एक्सपोर्ट करें", + "export-failed-error": "एसेट प्रोफ़ाइल एक्सपोर्ट करने में असमर्थ: {{error}}", + "asset-profile-file": "एसेट प्रोफ़ाइल फ़ाइल", + "invalid-asset-profile-file-error": "एसेट प्रोफ़ाइल इम्पोर्ट करने में असमर्थ: एसेट प्रोफ़ाइल डेटा संरचना अमान्य है।" + }, + "device-profile": { + "device-profile": "डिवाइस प्रोफ़ाइल", + "device-profiles": "डिवाइस प्रोफ़ाइलें", + "all-device-profiles": "सभी", + "add": "डिवाइस प्रोफ़ाइल जोड़ें", + "edit": "डिवाइस प्रोफ़ाइल संपादित करें", + "device-profile-details": "डिवाइस प्रोफ़ाइल विवरण", + "no-device-profiles-text": "कोई डिवाइस प्रोफ़ाइल नहीं मिली", + "search": "डिवाइस प्रोफ़ाइल खोजें", + "selected-device-profiles": "{ count, plural, =1 {1 डिवाइस प्रोफ़ाइल} other {# डिवाइस प्रोफ़ाइलें} } चयनित", + "no-device-profiles-matching": "कोई डिवाइस प्रोफ़ाइल '{{entity}}' से मेल नहीं खाती।", + "device-profile-required": "डिवाइस प्रोफ़ाइल आवश्यक है", + "idCopiedMessage": "डिवाइस प्रोफ़ाइल Id क्लिपबोर्ड में कॉपी कर दी गई है", + "set-default": "डिवाइस प्रोफ़ाइल को डिफ़ॉल्ट बनाएं", + "delete": "डिवाइस प्रोफ़ाइल हटाएँ", + "copyId": "डिवाइस प्रोफ़ाइल Id कॉपी करें", + "name-max-length": "नाम 256 अक्षरों से कम होना चाहिए", + "name": "नाम", + "name-required": "नाम आवश्यक है।", + "type": "प्रोफ़ाइल प्रकार", + "type-required": "प्रोफ़ाइल प्रकार आवश्यक है।", + "type-default": "डिफ़ॉल्ट", + "image": "डिवाइस प्रोफ़ाइल इमेज", + "transport-type": "ट्रांसपोर्ट प्रकार", + "transport-type-required": "ट्रांसपोर्ट प्रकार आवश्यक है।", + "transport-type-default": "डिफ़ॉल्ट", + "transport-type-default-hint": "बेसिक MQTT, HTTP और CoAP ट्रांसपोर्ट को सपोर्ट करता है", + "transport-type-mqtt": "MQTT", + "transport-type-mqtt-hint": "एडवांस्ड MQTT ट्रांसपोर्ट सेटिंग्स सक्षम करता है", + "transport-type-coap": "CoAP", + "transport-type-coap-hint": "एडवांस्ड CoAP ट्रांसपोर्ट सेटिंग्स सक्षम करता है", + "transport-type-lwm2m": "LWM2M", + "transport-type-lwm2m-hint": "LWM2M ट्रांसपोर्ट प्रकार", + "transport-type-snmp": "SNMP", + "transport-type-snmp-hint": "SNMP ट्रांसपोर्ट कॉन्फ़िगरेशन निर्दिष्ट करें", + "transport-type-http": "HTTP", + "description": "विवरण", + "default": "डिफ़ॉल्ट", + "profile-configuration": "प्रोफ़ाइल कॉन्फ़िगरेशन", + "transport-configuration": "ट्रांसपोर्ट कॉन्फ़िगरेशन", + "default-rule-chain": "डिफ़ॉल्ट रूल चेन", + "default-edge-rule-chain": "डिफ़ॉल्ट Edge रूल चेन", + "default-edge-rule-chain-hint": "Edge पर इस डिवाइस प्रोफ़ाइल के डिवाइसों से आने वाले डेटा को प्रोसेस करने के लिए रूल चेन के रूप में उपयोग की जाती है", + "mobile-dashboard": "मोबाइल डैशबोर्ड", + "mobile-dashboard-hint": "मोबाइल एप्लिकेशन द्वारा डिवाइस विवरण डैशबोर्ड के रूप में उपयोग किया जाता है", + "select-queue-hint": "ड्रॉपडाउन सूची से चुनें।", + "delete-device-profile-title": "क्या आप वाकई डिवाइस प्रोफ़ाइल '{{deviceProfileName}}' को हटाना चाहते हैं?", + "delete-device-profile-text": "सावधान रहें, पुष्टि के बाद डिवाइस प्रोफ़ाइल और इससे संबंधित सभी डेटा, जिनमें संबंधित OTA अपडेट भी शामिल हैं, पुनर्प्राप्त नहीं किए जा सकेंगे।", + "delete-device-profiles-title": "क्या आप वाकई { count, plural, =1 {1 डिवाइस प्रोफ़ाइल} other {# डिवाइस प्रोफ़ाइलें} } हटाना चाहते हैं?", + "delete-device-profiles-text": "सावधान रहें, पुष्टि के बाद सभी चयनित डिवाइस प्रोफ़ाइलें और उनसे संबंधित सभी डेटा, जिनमें संबंधित OTA अपडेट भी शामिल हैं, पुनर्प्राप्त नहीं किए जा सकेंगे।", + "set-default-device-profile-title": "क्या आप वाकई डिवाइस प्रोफ़ाइल '{{deviceProfileName}}' को डिफ़ॉल्ट बनाना चाहते हैं?", + "set-default-device-profile-text": "पुष्टि के बाद यह डिवाइस प्रोफ़ाइल डिफ़ॉल्ट के रूप में चिन्हित हो जाएगी और उन नए डिवाइसों के लिए उपयोग होगी जिनके लिए कोई प्रोफ़ाइल निर्दिष्ट नहीं है।", + "no-device-profiles-found": "कोई डिवाइस प्रोफ़ाइल नहीं मिली।", + "create-new-device-profile": "नया बनाएँ!", + "mqtt-device-topic-filters": "MQTT डिवाइस टॉपिक फ़िल्टर", + "mqtt-device-topic-filters-unique": "MQTT डिवाइस टॉपिक फ़िल्टर यूनिक होने चाहिए।", + "mqtt-device-topic-filters-spark-plug": "MQTT Sparkplug B Edge of Network (EoN) नोड।", + "mqtt-device-topic-filters-spark-plug-hint": "Sparkplug B पेलोड और टॉपिक फ़ॉर्मेट के साथ EoN नोड्स से कनेक्शन की अनुमति दें।", + "mqtt-device-topic-filters-spark-plug-attribute-metric-names": "SparkPlug मेट्रिक्स जिन्हें विशेषताओं के रूप में स्टोर करना है।", + "mqtt-device-topic-filters-spark-plug-attribute-metric-names-hint": "वे SparkPlug मेट्रिक नाम जो डिवाइस विशेषताओं के रूप में स्टोर किए जाएँगे। बाकी सभी मेट्रिक्स डिवाइस टेलीमेट्री के रूप में स्टोर होंगी।", + "mqtt-device-payload-type": "MQTT डिवाइस पेलोड", + "mqtt-device-payload-type-json": "JSON", + "mqtt-device-payload-type-proto": "Protobuf", + "mqtt-enable-compatibility-with-json-payload-format": "अन्य पेलोड फ़ॉर्मेट के साथ कम्पैटिबिलिटी सक्षम करें।", + "mqtt-enable-compatibility-with-json-payload-format-hint": "जब सक्षम होता है, प्लेटफ़ॉर्म डिफ़ॉल्ट रूप से Protobuf पेलोड फ़ॉर्मेट का उपयोग करेगा। यदि पार्सिंग विफल हो जाती है, तो प्लेटफ़ॉर्म JSON पेलोड फ़ॉर्मेट का उपयोग करने का प्रयास करेगा। यह फ़र्मवेयर अपडेट के दौरान बैकवर्ड कम्पैटिबिलिटी के लिए उपयोगी है। उदाहरण के लिए, फ़र्मवेयर का शुरुआती रिलीज Json का उपयोग करता है, जबकि नया रिलीज Protobuf का उपयोग करता है। डिवाइसों के पूरे बेड़े के लिए फ़र्मवेयर अपडेट की प्रक्रिया के दौरान Protobuf और JSON दोनों को एक साथ सपोर्ट करना आवश्यक होता है। कम्पैटिबिलिटी मोड थोड़ा प्रदर्शन कम कर देता है, इसलिए अनुशंसा की जाती है कि सभी डिवाइस अपडेट हो जाने के बाद इस मोड को निष्क्रिय कर दिया जाए।", + "mqtt-use-json-format-for-default-downlink-topics": "डिफ़ॉल्ट डाउनलिंक टॉपिक के लिए Json फ़ॉर्मेट उपयोग करें", + "mqtt-use-json-format-for-default-downlink-topics-hint": "जब सक्षम होता है, प्लेटफ़ॉर्म निम्न टॉपिक्स के माध्यम से विशेषताएँ और RPC पुश करने के लिए Json पेलोड फ़ॉर्मेट का उपयोग करेगा: v1/devices/me/attributes/response/$request_id, v1/devices/me/attributes, v1/devices/me/rpc/request/$request_id, v1/devices/me/rpc/response/$request_id। यह सेटिंग नई (v2) टॉपिक्स के माध्यम से भेजी गई विशेषता और RPC सदस्यताओं को प्रभावित नहीं करती: v2/a/res/$request_id, v2/a, v2/r/req/$request_id, v2/r/res/$request_id। जहाँ $request_id पूर्णांक रिक्वेस्ट पहचानकर्ता है।", + "mqtt-send-ack-on-validation-exception": "PUBLISH मैसेज वैलिडेशन विफल होने पर PUBACK भेजें", + "mqtt-send-ack-on-validation-exception-hint": "डिफ़ॉल्ट रूप से, मैसेज वैलिडेशन विफल होने पर प्लेटफ़ॉर्म MQTT सत्र को बंद कर देगा। जब सक्षम होता है, प्लेटफ़ॉर्म सत्र बंद करने के बजाय पब्लिश पुष्टिकरण भेजेगा।", + "mqtt-protocol-version": "प्रोटोकॉल संस्करण", + "snmp-add-mapping": "SNMP मैपिंग जोड़ें", + "snmp-mapping-not-configured": "OID से टाइम सीरीज़/टेलीमेट्री के लिए कोई मैपिंग कॉन्फ़िगर नहीं की गई", + "snmp-timseries-or-attribute-name": "मैपिंग के लिए टाइम सीरीज़/विशेषता नाम", + "snmp-timseries-or-attribute-type": "मैपिंग के लिए टाइम सीरीज़/विशेषता प्रकार", + "snmp-method-pdu-type-get-request": "GetRequest", + "snmp-method-pdu-type-get-next-request": "GetNextRequest", + "snmp-oid": "OID", + "transport-device-payload-type-json": "JSON", + "transport-device-payload-type-proto": "Protobuf", + "mqtt-payload-type-required": "पेलोड प्रकार आवश्यक है।", + "coap-device-type": "CoAP डिवाइस प्रकार", + "coap-device-payload-type": "CoAP डिवाइस पेलोड", + "coap-device-type-required": "CoAP डिवाइस प्रकार आवश्यक है।", + "coap-device-type-default": "डिफ़ॉल्ट", + "coap-device-type-efento": "Efento NB-IoT", + "support-level-wildcards": "सिंगल [+] और मल्टी-लेवल [#] वाइल्डकार्ड समर्थित हैं।", + "telemetry-topic-filter": "टेलीमेट्री टॉपिक फ़िल्टर", + "telemetry-topic-filter-required": "टेलीमेट्री टॉपिक फ़िल्टर आवश्यक है।", + "attributes-topic-filter": "विशेषताएँ पब्लिश टॉपिक फ़िल्टर", + "attributes-subscribe-topic-filter": "विशेषताएँ सब्सक्राइब टॉपिक फ़िल्टर", + "attributes-topic-filter-required": "विशेषताएँ पब्लिश टॉपिक फ़िल्टर आवश्यक है।", + "attributes-subscribe-topic-filter-required": "विशेषताएँ सब्सक्राइब टॉपिक फ़िल्टर आवश्यक है।", + "telemetry-proto-schema": "टेलीमेट्री प्रोटो स्कीमा", + "telemetry-proto-schema-required": "टेलीमेट्री प्रोटो स्कीमा आवश्यक है।", + "attributes-proto-schema": "विशेषताएँ प्रोटो स्कीमा", + "attributes-proto-schema-required": "विशेषताएँ प्रोटो स्कीमा आवश्यक है।", + "rpc-response-proto-schema": "RPC रिस्पॉन्स प्रोटो स्कीमा", + "rpc-response-proto-schema-required": "RPC रिस्पॉन्स प्रोटो स्कीमा आवश्यक है।", + "rpc-response-topic-filter": "RPC रिस्पॉन्स टॉपिक फ़िल्टर", + "rpc-response-topic-filter-required": "RPC रिस्पॉन्स टॉपिक फ़िल्टर आवश्यक है।", + "rpc-request-proto-schema": "RPC रिक्वेस्ट प्रोटो स्कीमा", + "rpc-request-proto-schema-required": "RPC रिक्वेस्ट प्रोटो स्कीमा आवश्यक है।", + "rpc-request-proto-schema-hint": "RPC रिक्वेस्ट मैसेज में हमेशा ये फ़ील्ड होने चाहिए: string method = 1; int32 requestId = 2; और params = 3 (किसी भी डेटा टाइप के)।", + "not-valid-pattern-topic-filter": "अमान्य पैटर्न टॉपिक फ़िल्टर", + "not-valid-single-character": "सिंगल-लेवल वाइल्डकार्ड कैरेक्टर का अमान्य उपयोग", + "not-valid-multi-character": "मल्टी-लेवल वाइल्डकार्ड कैरेक्टर का अमान्य उपयोग", + "single-level-wildcards-hint": "[+] किसी भी टॉपिक फ़िल्टर लेवल के लिए उपयुक्त है। उदाहरण: v1/devices/+/telemetry या +/devices/+/attributes।", + "multi-level-wildcards-hint": "[#] स्वयं टॉपिक फ़िल्टर को रिप्लेस कर सकता है और टॉपिक का अंतिम चिन्ह होना चाहिए। उदाहरण: # या v1/devices/me/#।", + "alarm-rules": "अलार्म नियम", + "alarm-rules-with-count": "अलार्म नियम ({{count}})", + "no-alarm-rules": "कोई अलार्म नियम कॉन्फ़िगर नहीं किए गए हैं", + "add-alarm-rule": "अलार्म नियम जोड़ें", + "edit-alarm-rule": "अलार्म नियम संपादित करें", + "alarm-type": "अलार्म प्रकार", + "alarm-type-required": "अलार्म प्रकार आवश्यक है।", + "alarm-type-unique": "अलार्म प्रकार डिवाइस प्रोफ़ाइल के अलार्म नियमों के भीतर यूनिक होना चाहिए।", + "alarm-type-max-length": "अलार्म प्रकार 256 अक्षरों से कम होना चाहिए।", + "create-alarm-pattern": "{{alarmType}} अलार्म बनाएँ", + "create-alarm-rules": "अलार्म नियम बनाएँ", + "no-create-alarm-rules": "कोई क्रिएशन कंडीशन कॉन्फ़िगर नहीं की गई है", + "add-create-alarm-rule-prompt": "कृपया क्रिएशन अलार्म नियम जोड़ें", + "clear-alarm-rule": "क्लियर अलार्म नियम", + "no-clear-alarm-rule": "कोई क्लियरिंग कंडीशन कॉन्फ़िगर नहीं की गई है", + "add-create-alarm-rule": "क्रिएशन कंडीशन जोड़ें", + "add-clear-alarm-rule": "क्लियरिंग कंडीशन जोड़ें", + "select-alarm-severity": "अलार्म गंभीरता चुनें", + "alarm-severity-required": "अलार्म गंभीरता आवश्यक है।", + "condition-duration": "कंडीशन अवधि", + "condition-duration-value": "अवधि मान", + "condition-duration-time-unit": "समय इकाई", + "condition-duration-value-range": "अवधि मान 1 से 2147483647 के बीच होना चाहिए।", + "condition-duration-value-pattern": "अवधि मान पूर्णांक होना चाहिए।", + "condition-duration-value-required": "अवधि मान आवश्यक है।", + "condition-duration-time-unit-required": "समय इकाई आवश्यक है।", + "advanced-settings": "उन्नत सेटिंग्स", + "alarm-rule-additional-info": "अतिरिक्त जानकारी", + "edit-alarm-rule-additional-info": "अतिरिक्त जानकारी संपादित करें", + "alarm-rule-additional-info-placeholder": "कृपया यहाँ अपनी टिप्पणियाँ और संशोधन लिखें, ताकि वे अलार्म विवरण में 'अतिरिक्त जानकारी' के अंतर्गत दिखाए जा सकें", + "alarm-rule-additional-info-hint": "संकेत: अलार्म नियम की कंडीशन में उपयोग की गई विशेषता या टेलीमेट्री कुंजियों के मानों को स्थानापन्न करने के लिए ${keyName} का उपयोग करें।", + "alarm-rule-mobile-dashboard": "मोबाइल डैशबोर्ड", + "alarm-rule-mobile-dashboard-hint": "मोबाइल एप्लिकेशन द्वारा अलार्म विवरण डैशबोर्ड के रूप में उपयोग किया जाता है", + "alarm-rule-no-mobile-dashboard": "कोई डैशबोर्ड चयनित नहीं है", + "propagate-alarm": "अलार्म को संबंधित एंटिटीज़ तक प्रोपेगेट करें", + "alarm-rule-relation-types-list": "रिलेशन प्रकार", + "alarm-rule-relation-types-list-hint": "संबंधित एंटिटीज़ को फ़िल्टर करने के लिए रिलेशन प्रकार को परिभाषित करता है। यदि सेट नहीं किया गया, तो अलार्म सभी संबंधित एंटिटीज़ तक प्रोपेगेट होगा।", + "propagate-alarm-to-owner": "अलार्म को एंटिटी ओनर (कस्टमर या टेनेंट) तक प्रोपेगेट करें", + "propagate-alarm-to-tenant": "अलार्म को टेनेंट तक प्रोपेगेट करें", + "alarm-rule-condition": "अलार्म नियम कंडीशन", + "enter-alarm-rule-condition-prompt": "कृपया अलार्म नियम कंडीशन जोड़ें", + "edit-alarm-rule-condition": "अलार्म नियम कंडीशन संपादित करें", + "device-provisioning": "डिवाइस प्रोविजनिंग", + "provision-strategy": "प्रोविजन रणनीति", + "provision-strategy-required": "प्रोविजन रणनीति आवश्यक है।", + "provision-strategy-disabled": "निष्क्रिय", + "provision-strategy-created-new": "नए डिवाइस बनाने की अनुमति दें", + "provision-strategy-check-pre-provisioned": "प्री-प्रोविज़न किए गए डिवाइसों की जाँच करें", + "provision-device-key": "डिवाइस प्रोविजन कुंजी", + "provision-device-key-required": "डिवाइस प्रोविजन कुंजी आवश्यक है।", + "copy-provision-key": "प्रोविजन कुंजी कॉपी करें", + "provision-key-copied-message": "प्रोविजन कुंजी क्लिपबोर्ड में कॉपी कर दी गई है", + "provision-device-secret": "डिवाइस प्रोविजन सीक्रेट", + "provision-device-secret-required": "डिवाइस प्रोविजन सीक्रेट आवश्यक है।", + "copy-provision-secret": "प्रोविजन सीक्रेट कॉपी करें", + "provision-secret-copied-message": "प्रोविजन सीक्रेट क्लिपबोर्ड में कॉपी कर दिया गया है", + "provision-strategy-x509": { + "certificate-chain": "X509 सर्टिफिकेट चेन", + "certificate-chain-hint": "X.509 सर्टिफिकेट स्ट्रेटेजी दो-तरफ़ा TLS कम्युनिकेशन में क्लाइंट सर्टिफिकेट्स द्वारा डिवाइसों को प्रोविज़न करने के लिए उपयोग की जाती है।", + "allow-create-new-devices": "नए डिवाइस बनाएँ", + "allow-create-new-devices-hint": "अगर चुना जाए तो नए डिवाइस बनाए जाएँगे और क्लाइंट सर्टिफिकेट को डिवाइस क्रेडेंशियल्स के रूप में उपयोग किया जाएगा।", + "certificate-value": "PEM फॉर्मेट में सर्टिफिकेट", + "certificate-value-required": "PEM फॉर्मेट में सर्टिफिकेट आवश्यक है।", + "cn-regex-variable": "CN रेगुलर एक्सप्रेशन वेरिएबल", + "cn-regex-variable-required": "CN रेगुलर एक्सप्रेशन वेरिएबल आवश्यक है।", + "cn-regex-variable-hint": "डिवाइस के X509 सर्टिफिकेट के कॉमन नेम से डिवाइस नाम निकालने के लिए आवश्यक।" + }, + "condition": "कंडीशन", + "condition-type": "कंडीशन प्रकार", + "condition-type-simple": "सिंपल", + "condition-type-duration": "अवधि", + "condition-during": "{{during}} के दौरान", + "condition-during-dynamic": "\"{{ attribute }}\" ({{during}}) के दौरान", + "condition-type-repeating": "दोहराव", + "condition-type-required": "कंडीशन प्रकार आवश्यक है।", + "condition-repeating-value": "इवेंट्स की संख्या", + "condition-repeating-value-range": "इवेंट्स की संख्या 1 से 2147483647 के बीच होनी चाहिए।", + "condition-repeating-value-pattern": "इवेंट्स की संख्या पूर्णांक होनी चाहिए।", + "condition-repeating-value-required": "इवेंट्स की संख्या आवश्यक है।", + "condition-repeat-times": "{ count, plural, =1 {1 बार} other {# बार} } दोहराता है", + "condition-repeat-times-dynamic": "\"{ attribute }\" ({ count, plural, =1 {1 बार} other {# बार} }) दोहराता है", + "schedule-type": "शेड्यूलर प्रकार", + "schedule-type-required": "शेड्यूलर प्रकार आवश्यक है।", + "schedule": "शेड्यूल", + "edit-schedule": "अलार्म शेड्यूल संपादित करें", + "schedule-any-time": "हर समय सक्रिय", + "schedule-specific-time": "किसी विशिष्ट समय पर सक्रिय", + "schedule-custom": "कस्टम", + "schedule-day": { + "monday": "सोमवार", + "tuesday": "मंगलवार", + "wednesday": "बुधवार", + "thursday": "गुरुवार", + "friday": "शुक्रवार", + "saturday": "शनिवार", + "sunday": "रविवार" + }, + "schedule-days": "दिन", + "schedule-time": "समय", + "schedule-time-from": "से", + "schedule-time-to": "तक", + "schedule-days-of-week-required": "सप्ताह के कम-से-कम एक दिन का चयन करना आवश्यक है।", + "create-device-profile": "नया डिवाइस प्रोफ़ाइल बनाएं", + "import": "डिवाइस प्रोफ़ाइल इम्पोर्ट करें", + "export": "डिवाइस प्रोफ़ाइल एक्सपोर्ट करें", + "export-failed-error": "डिवाइस प्रोफ़ाइल एक्सपोर्ट नहीं की जा सकी: {{error}}", + "device-profile-file": "डिवाइस प्रोफ़ाइल फ़ाइल", + "invalid-device-profile-file-error": "डिवाइस प्रोफ़ाइल इम्पोर्ट नहीं की जा सकी: डिवाइस प्रोफ़ाइल डेटा संरचना अमान्य है।", + "power-saving-mode": "पावर सेविंग मोड", + "power-saving-mode-type": { + "default": "डिवाइस प्रोफ़ाइल पावर सेविंग मोड का उपयोग करें", + "psm": "पावर सेविंग मोड (PSM)", + "drx": "डिसकंटीन्यूस रिसेप्शन (DRX)", + "edrx": "एक्सटेंडेड डिसकंटीन्यूस रिसेप्शन (eDRX)" + }, + "edrx-cycle": "eDRX साइकल", + "edrx-cycle-required": "eDRX साइकल आवश्यक है।", + "edrx-cycle-pattern": "eDRX साइकल एक धनात्मक पूर्णांक होना चाहिए।", + "edrx-cycle-min": "eDRX साइकल की न्यूनतम संख्या {{ min }} सेकंड है।", + "paging-transmission-window": "पेजिंग ट्रांसमिशन विंडो", + "paging-transmission-window-required": "पेजिंग ट्रांसमिशन विंडो आवश्यक है।", + "paging-transmission-window-pattern": "पेजिंग ट्रांसमिशन विंडो एक धनात्मक पूर्णांक होना चाहिए।", + "paging-transmission-window-min": "पेजिंग ट्रांसमिशन विंडो की न्यूनतम संख्या {{ min }} सेकंड है।", + "psm-activity-timer": "PSM एक्टिविटी टाइमर", + "psm-activity-timer-required": "PSM एक्टिविटी टाइमर आवश्यक है।", + "psm-activity-timer-pattern": "PSM एक्टिविटी टाइमर एक धनात्मक पूर्णांक होना चाहिए।", + "psm-activity-timer-min": "PSM एक्टिविटी टाइमर का न्यूनतम मान {{ min }} सेकंड है।", + "lwm2m": { + "object-list": "ऑब्जेक्ट सूची", + "object-list-empty": "कोई ऑब्जेक्ट चयनित नहीं है।", + "no-objects-found": "कोई ऑब्जेक्ट नहीं मिला।", + "no-objects-matching": "कोई ऑब्जेक्ट '{{object}}' से मेल नहीं खा रहा है।", + "model-tab": "LWM2M मॉडल", + "add-new-instances": "नए इंस्टेंस जोड़ें", + "instances-list": "इंस्टेंस सूची", + "instances-list-required": "इंस्टेंस सूची आवश्यक है।", + "instance-id-pattern": "इंस्टेंस ID एक धनात्मक पूर्णांक होना चाहिए।", + "instance-id-max": "इंस्टेंस ID का अधिकतम मान {{max}} है।", + "instance": "इंस्टेंस", + "resource-label": "#ID रिसोर्स नाम", + "observe-label": "निगरानी", + "attribute-label": "विशेषता", + "telemetry-label": "टेलीमेट्री", + "edit-observe-select": "Observe को संपादित करने के लिए टेलीमेट्री या विशेषता चुनें।", + "edit-attributes-select": "विशेषताएँ संपादित करने के लिए टेलीमेट्री या विशेषता चुनें।", + "no-attributes-set": "कोई विशेषताएँ सेट नहीं हैं।", + "key-name": "कुंजी नाम", + "key-name-required": "कुंजी नाम आवश्यक है।", + "attribute-name": "नाम विशेषता", + "attribute-name-required": "नाम विशेषता आवश्यक है।", + "attribute-value": "विशेषता मान", + "attribute-value-required": "विशेषता मान आवश्यक है।", + "attribute-value-pattern": "विशेषता मान एक धनात्मक पूर्णांक होना चाहिए।", + "edit-attributes": "विशेषताएँ संपादित करें: {{ name }}", + "view-attributes": "विशेषताएँ देखें: {{ name }}", + "add-attribute": "विशेषता जोड़ें", + "edit-attribute": "विशेषता संपादित करें", + "view-attribute": "विशेषता देखें", + "remove-attribute": "विशेषता हटाएँ", + "delete-server-text": "सावधान रहें, पुष्टि के बाद सर्वर कॉन्फ़िगरेशन को वापस नहीं लाया जा सकेगा।", + "delete-server-title": "क्या आप वाकई सर्वर को हटाना चाहते हैं?", + "mode": "सुरक्षा कॉन्फ़िग मोड", + "bootstrap-tab": "बूटस्ट्रैप", + "bootstrap-server-legend": "बूटस्ट्रैप सर्वर (ShortId...)", + "lwm2m-server-legend": "LwM2M सर्वर (ShortId...)", + "server": "सर्वर", + "short-id": "शॉर्ट सर्वर Id", + "short-id-tooltip": "सर्वर का शॉर्ट Id। सर्वर ऑब्जेक्ट इंस्टेंस को जोड़ने के लिए लिंक की तरह उपयोग किया जाता है।\nयह आइडेंटिफ़ायर LwM2M क्लाइंट के लिए कॉन्फ़िगर किए गए प्रत्येक LwM2M सर्वर को यूनिक रूप से पहचानता है।\nजब Bootstrap-Server रिसोर्स का मान 'false' हो, तब इस रिसोर्स को अवश्य सेट किया जाना चाहिए।\nLwM2M सर्वर की पहचान के लिए ID:0 और ID:65535 मानों का उपयोग नहीं किया जाना चाहिए।", + "short-id-tooltip-bootstrap": "सर्वर का शॉर्ट Id। सर्वर ऑब्जेक्ट इंस्टेंस को जोड़ने के लिए लिंक की तरह उपयोग किया जाता है।\nयह आइडेंटिफ़ायर LwM2M क्लाइंट के लिए कॉन्फ़िगर किए गए प्रत्येक LwM2M सर्वर को यूनिक रूप से पहचानता है।\nजब Bootstrap-Server रिसोर्स का मान 'false' हो, तब इस रिसोर्स को अवश्य सेट किया जाना चाहिए।", + "short-id-required": "शॉर्ट सर्वर Id आवश्यक है।", + "short-id-range": "शॉर्ट सर्वर Id {{ min }} से {{ max }} की रेंज में होना चाहिए।", + "short-id-pattern": "शॉर्ट सर्वर Id एक धनात्मक पूर्णांक होना चाहिए।", + "lifetime": "क्लाइंट रजिस्ट्रेशन लाइफ़टाइम", + "lifetime-required": "क्लाइंट रजिस्ट्रेशन लाइफ़टाइम आवश्यक है।", + "lifetime-pattern": "क्लाइंट रजिस्ट्रेशन लाइफ़टाइम एक धनात्मक पूर्णांक होना चाहिए।", + "default-min-period": "दो नोटिफ़िकेशन के बीच न्यूनतम अवधि (सेकंड)", + "default-min-period-tooltip": "जब ऑब्ज़र्वेशन में यह पैरामीटर शामिल नहीं होता, तो LwM2M क्लाइंट को ऑब्ज़र्वेशन की न्यूनतम अवधि के लिए जो डिफ़ॉल्ट मान उपयोग करना चाहिए।", + "default-min-period-required": "न्यूनतम अवधि आवश्यक है।", + "default-min-period-pattern": "न्यूनतम अवधि एक धनात्मक पूर्णांक होनी चाहिए।", + "notification-storing": "डिसेबल या ऑफ़लाइन होने पर नोटिफ़िकेशन स्टोर करना", + "binding": "बाइंडिंग", + "binding-type": { + "u": "U: क्लाइंट किसी भी समय UDP बाइंडिंग के माध्यम से पहुँचा जा सकता है।", + "m": "M: क्लाइंट किसी भी समय MQTT बाइंडिंग के माध्यम से पहुँचा जा सकता है।", + "h": "H: क्लाइंट किसी भी समय HTTP बाइंडिंग के माध्यम से पहुँचा जा सकता है।", + "t": "T: क्लाइंट किसी भी समय TCP बाइंडिंग के माध्यम से पहुँचा जा सकता है।", + "s": "S: क्लाइंट किसी भी समय SMS बाइंडिंग के माध्यम से पहुँचा जा सकता है।", + "n": "N: क्लाइंट को ऐसे अनुरोध के उत्तर Non-IP बाइंडिंग के माध्यम से भेजने होंगे (LWM2M 1.1 से समर्थित)।", + "uq": "UQ: UDP कनेक्शन क्यू मोड में (LWM2M 1.1 से समर्थित नहीं है)", + "uqs": "UQS: UDP और SMS दोनों कनेक्शन सक्रिय; UDP क्यू मोड में, SMS स्टैंडर्ड मोड में (LWM2M 1.1 से समर्थित नहीं है)", + "tq": "TQ: TCP कनेक्शन क्यू मोड में (LWM2M 1.1 से समर्थित नहीं है)", + "tqs": "TQS: TCP और SMS दोनों कनेक्शन सक्रिय; TCP क्यू मोड में, SMS स्टैंडर्ड मोड में (LWM2M 1.1 से समर्थित नहीं है)", + "sq": "SQ: SMS कनेक्शन क्यू मोड में (LWM2M 1.1 से समर्थित नहीं है)" + }, + "binding-tooltip": "यह LwM2M सर्वर ऑब्जेक्ट - /1/x/7 के \"बाइंडिंग\" रिसोर्स में मौजूद सूची है.\nयह LwM2M क्लाइंट में समर्थित बाइंडिंग मोड्स को दर्शाता है.\nयह मान डिवाइस ऑब्जेक्ट (/3/0/16) में “Supported Binding and Modes” रिसोर्स में दिए गए मान के समान होना चाहिए.\nहालाँकि कई ट्रांसपोर्ट समर्थित हैं, लेकिन पूरे ट्रांसपोर्ट सेशन के दौरान केवल एक ही ट्रांसपोर्ट बाइंडिंग का उपयोग किया जा सकता है.\nउदाहरण के लिए, जब UDP और SMS दोनों समर्थित हों, तो पूरे ट्रांसपोर्ट सेशन के दौरान LwM2M क्लाइंट और LwM2M सर्वर UDP या SMS में से किसी एक के माध्यम से संचार करने का चयन कर सकते हैं.", + "bootstrap-server": "बूटस्ट्रैप सर्वर", + "lwm2m-server": "LwM2M सर्वर", + "include-bootstrap-server": "बूटस्ट्रैप सर्वर अपडेट शामिल करें", + "bootstrap-update-title": "आपने पहले से ही बूटस्ट्रैप सर्वर कॉन्फ़िगर कर लिया है। क्या आप वाकई अपडेट को बाहर करना चाहते हैं?", + "bootstrap-update-text": "सावधान रहें, पुष्टि के बाद बूटस्ट्रैप सर्वर कॉन्फ़िगरेशन डेटा पुनर्प्राप्त नहीं किया जा सकेगा.", + "server-host": "होस्ट", + "server-host-required": "होस्ट आवश्यक है।", + "server-port": "पोर्ट", + "server-port-required": "पोर्ट आवश्यक है।", + "server-port-pattern": "पोर्ट एक धनात्मक पूर्णांक होना चाहिए।", + "server-port-range": "पोर्ट 1 से 65535 की सीमा में होना चाहिए।", + "server-public-key": "सर्वर सार्वजनिक कुंजी", + "server-public-key-required": "सर्वर सार्वजनिक कुंजी आवश्यक है।", + "client-hold-off-time": "होल्ड-ऑफ़ समय", + "client-hold-off-time-required": "होल्ड-ऑफ़ समय आवश्यक है।", + "client-hold-off-time-pattern": "होल्ड-ऑफ़ समय एक धनात्मक पूर्णांक होना चाहिए।", + "client-hold-off-time-tooltip": "केवल बूटस्ट्रैप सर्वर के साथ उपयोग के लिए क्लाइंट होल्ड-ऑफ़ समय।", + "account-after-timeout": "टाइमआउट के बाद खाता", + "account-after-timeout-required": "टाइमआउट के बाद खाता का मान आवश्यक है।", + "account-after-timeout-pattern": "टाइमआउट के बाद खाता का मान एक धनात्मक पूर्णांक होना चाहिए।", + "account-after-timeout-tooltip": "यह संसाधन बूटस्ट्रैप सर्वर के \"टाइमआउट के बाद खाता\" मान को निर्धारित करता है।", + "server-type": "सर्वर प्रकार", + "add-new-server-title": "नया सर्वर कॉन्फ़िग जोड़ें", + "add-server-config": "सर्वर कॉन्फ़िग जोड़ें", + "add-lwm2m-server-config": "LwM2M सर्वर जोड़ें", + "no-config-servers": "कोई सर्वर कॉन्फ़िगर नहीं है", + "others-tab": "अन्य सेटिंग्स", + "ota-update": "OTA अपडेट", + "use-object-19-for-ota-update": "OTA फ़ाइल मेटाडेटा (चेकसम, आकार, संस्करण, नाम) के लिए Object 19 का उपयोग करें", + "use-object-19-for-ota-update-hint": "OTA अपडेट के लिए Resource ObjectId = 19 का उपयोग करें: फ़र्मवेयर → InstanceId = 65534, सॉफ़्टवेयर → InstanceId = 65535। डेटा प्रारूप Base64 में लिपटा हुआ JSON है। यह JSON OTA फ़ाइल मेटाडेटा (फ़ाइल जानकारी) रखता है: \"Checksum\" (SHA256)। अतिरिक्त फ़ील्ड: \"Title\" (OTA नाम), \"Version\" (OTA संस्करण), \"File Name\" (क्लाइंट पर OTA संग्रहीत करने के लिए फ़ाइल नाम), \"File Size\" (बाइट्स में OTA आकार)।", + "client-strategy": "कनेक्शन के समय क्लाइंट की रणनीति", + "client-strategy-label": "रणनीति", + "client-strategy-only-observe": "प्रारंभिक कनेक्शन के बाद केवल Observe अनुरोध क्लाइंट को भेजें", + "client-strategy-read-all": "पंजीकरण के बाद सभी रिसोर्स पढ़ें और Observe अनुरोध क्लाइंट को भेजें", + "fw-update": "फ़र्मवेयर अपडेट", + "fw-update-strategy": "फ़र्मवेयर अपडेट रणनीति", + "fw-update-strategy-data": "Object 19 और Resource 0 (Data) का उपयोग करके फ़र्मवेयर अपडेट को बाइनरी फ़ाइल के रूप में पुश करें", + "fw-update-strategy-package": "Object 5 और Resource 0 (Package) का उपयोग करके फ़र्मवेयर अपडेट को बाइनरी फ़ाइल के रूप में पुश करें", + "fw-update-strategy-package-uri": "पैकेज डाउनलोड करने के लिए यूनिक CoAP URL स्वतः जेनरेट करें और फ़र्मवेयर अपडेट को Object 5 और Resource 1 (Package URI) के रूप में पुश करें", + "sw-update": "सॉफ़्टवेयर अपडेट", + "sw-update-strategy": "सॉफ़्टवेयर अपडेट रणनीति", + "sw-update-strategy-package": "Object 9 और Resource 2 (Package) का उपयोग करके बाइनरी फ़ाइल पुश करें", + "sw-update-strategy-package-uri": "पैकेज डाउनलोड करने के लिए यूनिक CoAP URL स्वतः जेनरेट करें और Object 9 और Resource 3 (Package URI) का उपयोग करके सॉफ़्टवेयर अपडेट पुश करें", + "fw-update-resource": "फ़र्मवेयर अपडेट CoAP रिसोर्स", + "fw-update-resource-required": "फ़र्मवेयर अपडेट CoAP रिसोर्स आवश्यक है।", + "sw-update-resource": "सॉफ़्टवेयर अपडेट CoAP रिसोर्स", + "sw-update-resource-required": "सॉफ़्टवेयर अपडेट CoAP रिसोर्स आवश्यक है।", + "config-json-tab": "डिवाइस प्रोफ़ाइल JSON कॉन्फ़िग", + "attributes-name": { + "min-period": "न्यूनतम अवधि", + "max-period": "अधिकतम अवधि", + "greater-than": "से बड़ा", + "less-than": "से छोटा", + "step": "स्टेप", + "min-evaluation-period": "न्यूनतम मूल्यांकन अवधि", + "max-evaluation-period": "अधिकतम मूल्यांकन अवधि" + }, + "default-object-id": "डिफ़ॉल्ट ऑब्जेक्ट वर्ज़न (विशेषता)", + "default-object-id-ver": { + "v1-0": "1.0", + "v1-1": "1.1", + "v1-2": "1.2" + }, + "observe-strategy": { + "observe-strategy": "Observe रणनीति", + "single": "सिंगल", + "single-description": "प्रत्येक रिसोर्स के लिए एक Observe अनुरोध (ज़्यादा सटीकता, अधिक नेटवर्क ट्रैफिक)", + "composite-all": "कंपोज़िट (सभी)", + "composite-all-description": "सभी रिसोर्स एक ही कंपोज़िट Observe अनुरोध से ऑब्ज़र्व किए जाते हैं (ज़्यादा प्रभावी, कम लचीलापन)", + "composite-by-object": "ऑब्जेक्ट के अनुसार कंपोज़िट", + "composite-by-object-description": "रिसोर्स को ऑब्जेक्ट प्रकार के अनुसार समूहित करके अलग-अलग कंपोज़िट Observe अनुरोधों से ऑब्ज़र्व किया जाता है (संतुलित तरीका)" + } + }, + "snmp": { + "add-communication-config": "कम्युनिकेशन कॉन्फ़िगरेशन जोड़ें", + "add-mapping": "मैपिंग जोड़ें", + "authentication-passphrase": "ऑथेंटिकेशन पासफ़्रेज़", + "authentication-passphrase-required": "ऑथेंटिकेशन पासफ़्रेज़ आवश्यक है।", + "authentication-protocol": "ऑथेंटिकेशन प्रोटोकॉल", + "authentication-protocol-required": "ऑथेंटिकेशन प्रोटोकॉल आवश्यक है।", + "communication-configs": "कम्युनिकेशन कॉन्फ़िगरेशन", + "community": "कम्युनिटी स्ट्रिंग", + "community-required": "कम्युनिटी स्ट्रिंग आवश्यक है।", + "context-name": "कॉन्टेक्स्ट नाम", + "data-key": "डेटा की", + "data-key-required": "डेटा की आवश्यक है।", + "data-type": "डेटा प्रकार", + "data-type-required": "डेटा प्रकार आवश्यक है।", + "engine-id": "इंजन ID", + "host": "होस्ट", + "host-required": "होस्ट आवश्यक है।", + "oid": "OID", + "oid-pattern": "अमान्य OID फ़ॉर्मेट।", + "oid-required": "OID आवश्यक है।", + "please-add-communication-config": "कृपया कम्युनिकेशन कॉन्फ़िगरेशन जोड़ें", + "please-add-mapping-config": "कृपया मैपिंग कॉन्फ़िगरेशन जोड़ें", + "port": "पोर्ट", + "port-format": "अमान्य पोर्ट फ़ॉर्मेट।", + "port-required": "पोर्ट आवश्यक है।", + "privacy-passphrase": "प्राइवेसी पासफ़्रेज़", + "privacy-passphrase-required": "प्राइवेसी पासफ़्रेज़ आवश्यक है।", + "privacy-protocol": "प्राइवेसी प्रोटोकॉल", + "privacy-protocol-required": "प्राइवेसी प्रोटोकॉल आवश्यक है।", + "protocol-version": "प्रोटोकॉल वर्ज़न", + "protocol-version-required": "प्रोटोकॉल वर्ज़न आवश्यक है।", + "querying-frequency": "क्वेरी फ़्रीक्वेंसी, ms", + "querying-frequency-invalid-format": "क्वेरी फ़्रीक्वेंसी एक धनात्मक पूर्णांक होना चाहिए।", + "querying-frequency-required": "क्वेरी फ़्रीक्वेंसी आवश्यक है।", + "retries": "रीट्राई", + "retries-invalid-format": "रीट्राई एक धनात्मक पूर्णांक होना चाहिए।", + "retries-required": "रीट्राई आवश्यक है।", + "scope": "स्कोप", + "scope-required": "स्कोप आवश्यक है।", + "security-name": "सिक्योरिटी नाम", + "security-name-required": "सिक्योरिटी नाम आवश्यक है।", + "timeout-ms": "टाइमआउट, ms", + "timeout-ms-invalid-format": "टाइमआउट एक धनात्मक पूर्णांक होना चाहिए।", + "timeout-ms-required": "टाइमआउट आवश्यक है।", + "user-name": "यूज़र नेम", + "user-name-required": "यूज़र नेम आवश्यक है।" + } + }, + "dialog": { + "close": "डायलॉग बंद करें", + "error-message-title": "त्रुटि संदेश:", + "error-details-title": "त्रुटि विवरण" + }, + "direction": { + "column": "स्तंभ", + "row": "पंक्ति" + }, + "edge": { + "edge": "Edge", + "edge-instances": "Edge इंस्टैंसेज़", + "instances": "इंस्टैंसेज़", + "edge-file": "Edge फ़ाइल", + "name-max-length": "नाम 256 से कम होना चाहिए", + "label-max-length": "लेबल 256 से कम होना चाहिए", + "type-max-length": "प्रकार 256 से कम होना चाहिए", + "management": "Edge प्रबंधन", + "no-edges-matching": "'{{entity}}' से मेल खाते कोई Edge नहीं मिले।", + "add": "Edge जोड़ें", + "no-edges-text": "कोई Edge नहीं मिले", + "edge-details": "Edge विवरण", + "add-edge-text": "नया Edge जोड़ें", + "delete": "Edge हटाएं", + "delete-edge-title": "क्या आप वाकई Edge '{{edgeName}}' हटाना चाहते हैं?", + "delete-edge-text": "सावधान, पुष्टि के बाद Edge और उससे संबंधित सभी डेटा पुनर्प्राप्त नहीं किए जा सकेंगे।", + "delete-edges-title": "क्या आप वाकई { count, plural, =1 {1 Edge} other {# Edge} } हटाना चाहते हैं?", + "delete-edges-text": "सावधान, पुष्टि के बाद सभी चयनित Edge हटा दिए जाएंगे और उनसे संबंधित सभी डेटा पुनर्प्राप्त नहीं किए जा सकेंगे।", + "name": "नाम", + "name-starts-with": "Edge नाम इससे शुरू होता है", + "name-required": "नाम आवश्यक है।", + "description": "विवरण", + "details": "विवरण", + "events": "इवेंट्स", + "copy-id": "Edge ID कॉपी करें", + "id-copied-message": "एज Id क्लिपबोर्ड में कॉपी कर दी गई है", + "sync": "Edge सिंक करें", + "edge-required": "Edge आवश्यक है", + "edge-type": "Edge प्रकार", + "edge-type-required": "Edge प्रकार आवश्यक है।", + "event-action": "इवेंट एक्शन", + "entity-id": "एंटिटी ID", + "select-edge-type": "Edge प्रकार चुनें", + "assign-to-customer": "कस्टमर को असाइन करें", + "assign-to-customer-text": "कृपया Edge असाइन करने के लिए कस्टमर चुनें", + "assign-edge-to-customer": "कस्टमर को Edge असाइन करें", + "assign-edge-to-customer-text": "कृपया कस्टमर को असाइन करने के लिए Edge चुनें", + "assignedToCustomer": "कस्टमर को असाइन किया गया", + "edge-public": "Edge सार्वजनिक है", + "assigned-to-customer": "असाइन किया गया: {{customerTitle}}", + "unassign-from-customer": "कस्टमर से अनअसाइन करें", + "unassign-edge-title": "क्या आप वाकई Edge '{{edgeName}}' को अनअसाइन करना चाहते हैं?", + "unassign-edge-text": "पुष्टि के बाद Edge अनअसाइन कर दिया जाएगा और कस्टमर के लिए उपलब्ध नहीं रहेगा।", + "unassign-edges-title": "क्या आप वाकई { count, plural, =1 {1 Edge} other {# Edge} } को अनअसाइन करना चाहते हैं?", + "unassign-edges-text": "पुष्टि के बाद सभी चयनित Edge अनअसाइन कर दिए जाएंगे और कस्टमर के लिए उपलब्ध नहीं रहेंगे।", + "make-public": "Edge को सार्वजनिक करें", + "make-public-edge-title": "क्या आप वाकई Edge '{{edgeName}}' को सार्वजनिक करना चाहते हैं?", + "make-public-edge-text": "पुष्टि के बाद Edge और उसका सारा डेटा सार्वजनिक कर दिया जाएगा और दूसरों के लिए उपलब्ध होगा।", + "make-private": "Edge को निजी करें", + "public": "सार्वजनिक", + "make-private-edge-title": "क्या आप वाकई Edge '{{edgeName}}' को निजी करना चाहते हैं?", + "make-private-edge-text": "पुष्टि के बाद Edge और उसका सारा डेटा निजी कर दिया जाएगा और दूसरों के लिए उपलब्ध नहीं होगा।", + "import": "Edge आयात करें", + "install-connect-instructions": "इंस्टॉल और कनेक्ट निर्देश", + "install-connect-instructions-edge-created": "Edge बनाया गया! इंस्टॉल और कनेक्ट निर्देश देखें", + "loading-edge-instructions": "Edge निर्देश लोड हो रहे हैं...", + "label": "लेबल", + "load-entity-error": "डेटा लोड नहीं हो सका। एंटिटी हटाई जा चुकी है।", + "assign-new-edge": "नया Edge असाइन करें", + "unassign-from-edge": "Edge से अनअसाइन करें", + "edge-key": "Edge कुंजी", + "copy-edge-key": "Edge कुंजी कॉपी करें", + "edge-key-copied-message": "Edge कुंजी क्लिपबोर्ड पर कॉपी कर दी गई है", + "edge-secret": "Edge सीक्रेट", + "copy-edge-secret": "Edge सीक्रेट कॉपी करें", + "edge-secret-copied-message": "Edge सीक्रेट क्लिपबोर्ड पर कॉपी कर दिया गया है", + "manage-assets": "एसेट प्रबंधित करें", + "manage-devices": "डिवाइस प्रबंधित करें", + "manage-entity-views": "एंटिटी व्यू प्रबंधित करें", + "manage-dashboards": "डैशबोर्ड प्रबंधित करें", + "manage-rulechains": "रूल चेन प्रबंधित करें", + "assets": "Edge एसेट", + "devices": "Edge डिवाइस", + "entity-views": "Edge एंटिटी व्यूज़", + "dashboard": "Edge डैशबोर्ड", + "dashboards": "Edge डैशबोर्ड्स", + "rulechain-templates": "रूल चेन टेम्पलेट्स", + "edge-rulechain-templates": "Edge रूल चेन टेम्पलेट्स", + "rulechains": "Edge रूल चेन्स", + "search": "Edge खोजें", + "selected-edges": "{ count, plural, =1 {1 edge} other {# edges} } चयनित", + "any-edge": "कोई भी Edge", + "no-edge-types-matching": "'{{entitySubtype}}' से मेल खाते कोई Edge प्रकार नहीं मिले।", + "edge-type-list-empty": "कोई Edge प्रकार चयनित नहीं है।", + "edge-types": "Edge प्रकार", + "enter-edge-type": "Edge प्रकार दर्ज करें", + "deployed": "डिप्लॉय्ड", + "pending": "लंबित", + "downlinks": "डाउनलिंक्स", + "no-downlinks-prompt": "कोई डाउनलिंक्स नहीं मिले", + "sync-process-started-successfully": "सिंक प्रक्रिया सफलतापूर्वक शुरू हो गई!", + "missing-related-rule-chains-title": "Edge में संबंधित रूल चेन(स) गायब हैं", + "missing-related-rule-chains-text": "Edge को असाइन की गई रूल चेन(स) ऐसे रूल नोड्स का उपयोग करती हैं जो संदेश(ओं) को उन रूल चेन(स) की ओर फ़ॉरवर्ड करती हैं जो इस Edge को असाइन नहीं हैं।

गायब रूल चेन(स) की सूची:
{{missingRuleChains}}", + "widget-datasource-error": "यह विजेट केवल EDGE एंटिटी डेटासोर्स को सपोर्ट करता है", + "upgrade-instructions": "अपग्रेड निर्देश", + "connected": "कनेक्टेड", + "disconnected": "डिस्कनेक्टेड" + }, + "edge-event": { + "type-dashboard": "डैशबोर्ड", + "type-asset": "एसेट", + "type-device": "डिवाइस", + "type-device-profile": "डिवाइस प्रोफ़ाइल", + "type-asset-profile": "एसेट प्रोफ़ाइल", + "type-entity-view": "एंटिटी व्यू", + "type-alarm": "अलार्म", + "type-rule-chain": "रूल चेन", + "type-rule-chain-metadata": "रूल चेन मेटाडेटा", + "type-edge": "Edge", + "type-user": "उपयोगकर्ता", + "type-tenant": "टेनेंट", + "type-tenant-profile": "टेनेंट प्रोफ़ाइल", + "type-customer": "कस्टमर", + "type-relation": "रिलेशन", + "type-widgets-bundle": "विजेट बंडल", + "type-widgets-type": "विजेट टाइप", + "type-admin-settings": "एडमिन सेटिंग्स", + "type-ota-package": "OTA पैकेज", + "type-queue": "क्यू", + "action-type-added": "जोड़ा गया", + "action-type-deleted": "हटाया गया", + "action-type-updated": "अपडेट किया गया", + "action-type-post-attributes": "विशेषताएँ पोस्ट की गईं", + "action-type-attributes-updated": "विशेषताएँ अपडेट की गईं", + "action-type-attributes-deleted": "विशेषताएँ हटाई गईं", + "action-type-timeseries-updated": "टाइम सीरीज़ अपडेट की गई", + "action-type-credentials-updated": "क्रेडेंशियल्स अपडेट किए गए", + "action-type-assigned-to-customer": "कस्टमर को असाइन किया गया", + "action-type-unassigned-from-customer": "कस्टमर से अनअसाइन किया गया", + "action-type-relation-add-or-update": "रिलेशन जोड़ा या अपडेट किया गया", + "action-type-relation-deleted": "रिलेशन हटाया गया", + "action-type-rpc-call": "RPC कॉल", + "action-type-alarm-ack": "अलार्म Ack", + "action-type-alarm-clear": "अलार्म क्लियर", + "action-type-alarm-assigned": "अलार्म असाइन किया गया", + "action-type-alarm-unassigned": "अलार्म अनअसाइन किया गया", + "action-type-assigned-to-edge": "Edge को असाइन किया गया", + "action-type-unassigned-from-edge": "Edge से अनअसाइन किया गया", + "action-type-credentials-request": "क्रेडेंशियल्स रिक्वेस्ट", + "action-type-entity-merge-request": "एंटिटी मर्ज रिक्वेस्ट" + }, + "error": { + "unable-to-connect": "सर्वर से कनेक्ट नहीं हो पा रहा है! कृपया अपना इंटरनेट कनेक्शन जाँचें.", + "unhandled-error-code": "अनहैंडल्ड एरर कोड: {{errorCode}}", + "unknown-error": "अज्ञात त्रुटि" + }, + "entity": { + "entity": "एंटिटी", + "entities": "एंटिटीज़", + "entities-count": "एंटिटीज़ की संख्या", + "alarms-count": "अलार्म की संख्या", + "aliases": "एंटिटी उपनाम", + "aliases-short": "उपनाम", + "entity-alias": "एंटिटी उपनाम", + "unable-delete-entity-alias-title": "एंटिटी उपनाम हटाने में असमर्थ", + "unable-delete-entity-alias-text": "एंटिटी उपनाम '{{entityAlias}}' को हटाया नहीं जा सकता क्योंकि यह निम्न विजेट(स) द्वारा उपयोग किया जा रहा है:
{{widgetsList}}", + "duplicate-alias-error": "डुप्लिकेट उपनाम '{{alias}}' मिला।
एंटिटी उपनाम डैशबोर्ड के भीतर अद्वितीय होने चाहिए.", + "missing-entity-filter-error": "'{{alias}}' उपनाम के लिए फ़िल्टर नहीं दिया गया है.", + "configure-alias": "'{{alias}}' उपनाम कॉन्फ़िगर करें", + "alias": "उपनाम", + "alias-required": "एंटिटी उपनाम आवश्यक है.", + "remove-alias": "एंटिटी उपनाम हटाएँ", + "add-alias": "एंटिटी उपनाम जोड़ें", + "edit-alias": "एंटिटी उपनाम संपादित करें", + "entity-list": "एंटिटी सूची", + "entity-type": "एंटिटी प्रकार", + "entity-types": "एंटिटी प्रकार", + "entity-type-list": "एंटिटी प्रकार सूची", + "any-entity": "कोई भी एंटिटी", + "add-entity-type": "एंटिटी प्रकार जोड़ें", + "enter-entity-type": "एंटिटी प्रकार दर्ज करें", + "no-entities-matching": "'{{entity}}' से मेल खाने वाली कोई एंटिटी नहीं मिली.", + "no-entities-text": "कोई एंटिटी नहीं मिली.", + "no-entity-types-matching": "'{{entityType}}' से मेल खाने वाले कोई एंटिटी प्रकार नहीं मिले.", + "name-starts-with": "नाम अभिव्यक्ति", + "help-text": "ज़रूरत के अनुसार '%' का उपयोग करें: '%entity_name_contains%', '%entity_name_ends', 'entity_starts_with'.", + "use-entity-name-filter": "फ़िल्टर उपयोग करें", + "entity-list-empty": "कोई एंटिटी चयनित नहीं है.", + "entity-type-list-required": "कम से कम एक एंटिटी प्रकार चुना जाना चाहिए.", + "entity-name-filter-required": "एंटिटी नाम फ़िल्टर आवश्यक है.", + "entity-name-filter-no-entity-matched": "'{{entity}}' से शुरू होने वाली कोई एंटिटी नहीं मिली.", + "all-subtypes": "सभी", + "select-entities": "एंटिटीज़ चुनें", + "no-aliases-found": "कोई उपनाम नहीं मिला.", + "no-alias-matching": "'{{alias}}' नहीं मिला.", + "create-new-alias": "नया बनाएँ!", + "create-new": "नया बनाएँ", + "key": "कुंजी", + "key-name": "कुंजी नाम", + "no-keys-found": "कोई कुंजी नहीं मिली.", + "no-key-matching": "'{{key}}' नहीं मिला.", + "create-new-key": "नया बनाएँ!", + "type": "प्रकार", + "type-required": "एंटिटी प्रकार आवश्यक है.", + "type-device": "डिवाइस", + "type-devices": "डिवाइस", + "list-of-devices": "{ count, plural, =1 {एक डिवाइस} other {# डिवाइस की सूची} }", + "device-name-starts-with": "वे डिवाइस जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-device-profile": "डिवाइस प्रोफ़ाइल", + "type-device-profiles": "डिवाइस प्रोफ़ाइल्स", + "clear-selected-profiles": "चयनित प्रोफ़ाइल्स साफ़ करें", + "list-of-device-profiles": "{ count, plural, =1 {एक डिवाइस प्रोफ़ाइल} other {# डिवाइस प्रोफ़ाइल की सूची} }", + "device-profile-name-starts-with": "वे डिवाइस प्रोफ़ाइल्स जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-asset-profile": "एसेट प्रोफ़ाइल", + "type-asset-profiles": "एसेट प्रोफ़ाइल्स", + "list-of-asset-profiles": "{ count, plural, =1 {एक एसेट प्रोफ़ाइल} other {# एसेट प्रोफ़ाइल की सूची} }", + "asset-profile-name-starts-with": "वे एसेट प्रोफ़ाइल्स जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-asset": "एसेट", + "type-assets": "एसेट", + "list-of-assets": "{ count, plural, =1 {एक एसेट} other {# एसेट की सूची} }", + "asset-name-starts-with": "वे एसेट जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-entity-view": "एंटिटी व्यू", + "type-entity-views": "एंटिटी व्यूज़", + "list-of-entity-views": "{ count, plural, =1 {एक एंटिटी व्यू} other {# एंटिटी व्यू की सूची} }", + "entity-view-name-starts-with": "वे एंटिटी व्यूज़ जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-rule": "नियम", + "type-rules": "नियम", + "list-of-rules": "{ count, plural, =1 {एक नियम} other {# नियम की सूची} }", + "rule-name-starts-with": "वे नियम जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-plugin": "प्लगइन", + "type-plugins": "प्लगइन्स", + "list-of-plugins": "{ count, plural, =1 {एक प्लगइन} other {# प्लगइन की सूची} }", + "plugin-name-starts-with": "वे प्लगइन्स जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-tenant": "टेनेंट", + "type-tenants": "टेनेंट्स", + "list-of-tenants": "{ count, plural, =1 {एक टेनेंट} other {# टेनेंट की सूची} }", + "tenant-name-starts-with": "वे टेनेंट्स जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-tenant-profile": "टेनेंट प्रोफ़ाइल", + "type-tenant-profiles": "टेनेंट प्रोफ़ाइल्स", + "list-of-tenant-profiles": "{ count, plural, =1 {एक टेनेंट प्रोफ़ाइल} other {# टेनेंट प्रोफ़ाइल की सूची} }", + "tenant-profile-name-starts-with": "वे टेनेंट प्रोफ़ाइल्स जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-customer": "कस्टमर", + "type-customers": "कस्टमर", + "list-of-customers": "{ count, plural, =1 {एक कस्टमर} other {# कस्टमर की सूची} }", + "customer-name-starts-with": "वे कस्टमर जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-user": "उपयोगकर्ता", + "type-users": "उपयोगकर्ता", + "list-of-users": "{ count, plural, =1 {एक उपयोगकर्ता} other {# उपयोगकर्ताओं की सूची} }", + "user-name-starts-with": "वे उपयोगकर्ता जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-dashboard": "डैशबोर्ड", + "type-dashboards": "डैशबोर्ड्स", + "list-of-dashboards": "{ count, plural, =1 {एक डैशबोर्ड} other {# डैशबोर्ड्स की सूची} }", + "dashboard-name-starts-with": "वे डैशबोर्ड्स जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-alarm": "अलार्म", + "type-alarms": "अलार्म", + "list-of-alarms": "{ count, plural, =1 {एक अलार्म} other {# अलार्म की सूची} }", + "alarm-name-starts-with": "वे अलार्म जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-rulechain": "रूल चेन", + "type-rulechains": "रूल चेन्स", + "list-of-rulechains": "{ count, plural, =1 {एक रूल चेन} other {# रूल चेन्स की सूची} }", + "rulechain-name-starts-with": "वे रूल चेन्स जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-rulenode": "रूल नोड", + "type-rulenodes": "रूल नोड्स", + "list-of-rulenodes": "{ count, plural, =1 {एक रूल नोड} other {# रूल नोड्स की सूची} }", + "rulenode-name-starts-with": "वे रूल नोड्स जिनके नाम '{{prefix}}' से शुरू होते हैं", + "type-current-customer": "वर्तमान कस्टमर", + "type-current-tenant": "वर्तमान टेनेंट", + "type-current-user": "वर्तमान उपयोगकर्ता", + "type-current-user-owner": "वर्तमान उपयोगकर्ता मालिक", + "type-calculated-field": "कैलक्युलेटेड फ़ील्ड", + "type-calculated-fields": "कैलक्युलेटेड फ़ील्ड्स", + "type-ai-model": "AI मॉडल", + "type-ai-models": "AI मॉडल्स", + "type-widgets-bundle": "विजेट बंडल", + "type-widgets-bundles": "विजेट बंडल्स", + "list-of-widgets-bundles": "{ count, plural, =1 {एक विजेट बंडल} other {# विजेट बंडल्स की सूची} }", + "type-widget": "विजेट", + "type-widgets": "विजेट", + "list-of-widgets": "{ count, plural, =1 {एक विजेट} other {# विजेट की सूची} }", + "search": "एंटिटीज़ खोजें", + "selected-entities": "{ count, plural, =1 {1 एंटिटी} other {# एंटिटीज़} } चयनित", + "entity-name": "एंटिटी नाम", + "entity-label": "एंटिटी लेबल", + "details": "एंटिटी विवरण", + "no-entities-prompt": "कोई एंटिटी नहीं मिली", + "no-data": "दिखाने के लिए कोई डेटा नहीं", + "columns-to-display": "दिखाने वाले कॉलम", + "type-api-usage-state": "API उपयोग स्थिति", + "type-edge": "Edge", + "type-edges": "Edge", + "list-of-edges": "{ count, plural, =1 {एक Edge} other {# Edge की सूची} }", + "edge-name-starts-with": "Edge जिनके नाम '{{prefix}}' से शुरू होते हैं", + "version-conflict": { + "message": "क्या आप मौजूदा संस्करण को ओवरराइट करना चाहते हैं या बदलावों को छोड़कर नवीनतम संस्करण लोड करना चाहते हैं?", + "link": "आप इसे उपयोग करके {{entityType}} का अपना संस्करण डाउनलोड कर सकते हैं", + "overwrite": "संस्करण ओवरराइट करें", + "discard": "बदलाव छोड़ें" + }, + "type-tb-resource": "रिसोर्स", + "type-tb-resources": "रिसोर्सेज़", + "list-of-tb-resources": "{ count, plural, =1 {एक रिसोर्स} other {# रिसोर्सेज़ की सूची} }", + "type-ota-package": "OTA पैकेज", + "type-ota-packages": "OTA पैकेजेज़", + "list-of-ota-packages": "{ count, plural, =1 {एक OTA पैकेज} other {# OTA पैकेजेज़ की सूची} }", + "type-rpc": "RPC", + "type-queue": "क्यू", + "type-queue-stats": "क्यू आँकड़े", + "type-queues-stats": "क्यूज़ आँकड़े", + "type-notification": "अधिसूचना", + "type-notification-rule": "अधिसूचना नियम", + "type-notification-rules": "अधिसूचना नियम", + "list-of-notification-rules": "{ count, plural, =1 {एक अधिसूचना नियम} other {# अधिसूचना नियमों की सूची} }", + "type-notification-target": "अधिसूचना प्राप्तकर्ता", + "type-notification-targets": "अधिसूचना प्राप्तकर्ता", + "list-of-notification-targets": "{ count, plural, =1 {एक अधिसूचना प्राप्तकर्ता} other {# अधिसूचना प्राप्तकर्ताओं की सूची} }", + "type-notification-request": "अधिसूचना अनुरोध", + "type-notification-template": "अधिसूचना टेम्पलेट", + "type-notification-templates": "अधिसूचना टेम्पलेट्स", + "list-of-notification-templates": "{ count, plural, =1 {एक अधिसूचना टेम्पलेट} other {# अधिसूचना टेम्पलेट्स की सूची} }", + "link": "लिंक", + "type-oauth2-client": "OAuth 2.0 क्लाइंट", + "type-oauth2-clients": "OAuth 2.0 क्लाइंट्स", + "list-of-oauth2-clients": "{ count, plural, =1 {एक OAuth 2.0 क्लाइंट} other {# OAuth 2.0 क्लाइंट्स की सूची} }", + "type-domain": "डोमेन", + "type-domains": "डोमेन्स", + "list-of-domains": "{ count, plural, =1 {एक डोमेन} other {# डोमेन्स की सूची} }", + "type-mobile-app": "मोबाइल एप्लिकेशन", + "type-mobile-apps": "मोबाइल एप्लिकेशन्स", + "list-of-mobile-apps": "{ count, plural, =1 {एक मोबाइल एप्लिकेशन} other {# मोबाइल एप्लिकेशन्स की सूची} }", + "type-mobile-app-bundle": "मोबाइल बंडल", + "type-mobile-app-bundles": "मोबाइल बंडल्स", + "list-of-mobile-app-bundles": "{ count, plural, =1 {एक मोबाइल बंडल} other {# मोबाइल बंडल्स की सूची} }" + }, + "entity-field": { + "created-time": "बनाने का समय", + "name": "नाम", + "type": "प्रकार", + "first-name": "पहला नाम", + "last-name": "अंतिम नाम", + "email": "ईमेल", + "title": "शीर्षक", + "country": "देश", + "state": "राज्य", + "city": "शहर", + "address": "पता", + "address2": "पता 2", + "zip": "ज़िप", + "phone": "फ़ोन", + "label": "लेबल", + "queue-name": "क्यू नाम", + "service-id": "सर्विस Id", + "owner-name": "ओनर नाम", + "owner-type": "ओनर प्रकार" + }, + "entity-view": { + "entity-view": "एंटिटी व्यू", + "entity-view-required": "एंटिटी व्यू आवश्यक है.", + "entity-views": "एंटिटी व्यूज़", + "management": "एंटिटी व्यू प्रबंधन", + "view-entity-views": "एंटिटी व्यूज़ देखें", + "entity-view-alias": "एंटिटी व्यू उपनाम", + "aliases": "एंटिटी व्यू उपनाम", + "no-alias-matching": "'{{alias}}' नहीं मिला.", + "no-aliases-found": "कोई उपनाम नहीं मिला.", + "no-key-matching": "'{{key}}' नहीं मिला.", + "no-keys-found": "कोई कुंजी नहीं मिली.", + "create-new-alias": "नया बनाएँ!", + "create-new-key": "नया बनाएँ!", + "duplicate-alias-error": "डुप्लिकेट उपनाम '{{alias}}' मिला।
एंटिटी व्यू उपनाम डैशबोर्ड के भीतर अद्वितीय होने चाहिए.", + "configure-alias": "'{{alias}}' उपनाम कॉन्फ़िगर करें", + "no-entity-views-matching": "'{{entity}}' से मेल खाने वाले कोई एंटिटी व्यूज़ नहीं मिले.", + "public": "पब्लिक", + "alias": "उपनाम", + "alias-required": "एंटिटी व्यू उपनाम आवश्यक है.", + "remove-alias": "एंटिटी व्यू उपनाम हटाएँ", + "add-alias": "एंटिटी व्यू उपनाम जोड़ें", + "name-starts-with": "एंटिटी व्यू नाम अभिव्यक्ति", + "help-text": "ज़रूरत के अनुसार '%' का उपयोग करें: '%entity-view_name_contains%', '%entity-view_name_ends', 'entity-view_starts_with'.", + "entity-view-list": "एंटिटी व्यू सूची", + "use-entity-view-name-filter": "फ़िल्टर उपयोग करें", + "entity-view-list-empty": "कोई एंटिटी व्यू चयनित नहीं है.", + "entity-view-name-filter-required": "एंटिटी व्यू नाम फ़िल्टर आवश्यक है.", + "entity-view-name-filter-no-entity-view-matched": "'{{entityView}}' से शुरू होने वाले कोई एंटिटी व्यू नहीं मिले.", + "add": "एंटिटी व्यू जोड़ें", + "entity-view-public": "एंटिटी व्यू पब्लिक है", + "assign-to-customer": "कस्टमर को असाइन करें", + "assign-entity-view-to-customer": "एंटिटी व्यू को कस्टमर को असाइन करें", + "assign-entity-view-to-customer-text": "कस्टमर को असाइन करने के लिए कृपया एंटिटी व्यूज़ चुनें", + "no-entity-views-text": "कोई एंटिटी व्यू नहीं मिला", + "assign-to-customer-text": "कृपया वह कस्टमर चुनें जिसे एंटिटी व्यू असाइन करना है", + "entity-view-details": "एंटिटी व्यू विवरण", + "add-entity-view-text": "नया एंटिटी व्यू जोड़ें", + "delete": "एंटिटी व्यू हटाएँ", + "assign-entity-views": "एंटिटी व्यूज़ असाइन करें", + "assign-entity-views-text": "कस्टमर को { count, plural, =1 {1 एंटिटी व्यू} other {# एंटिटी व्यूज़} } असाइन करें", + "delete-entity-views": "एंटिटी व्यूज़ हटाएँ", + "make-public": "एंटिटी व्यू को पब्लिक करें", + "make-private": "एंटिटी व्यू को प्राइवेट करें", + "unassign-from-customer": "कस्टमर से अनअसाइन करें", + "unassign-entity-views": "एंटिटी व्यूज़ अनअसाइन करें", + "unassign-entity-views-action-title": "कस्टमर से { count, plural, =1 {1 एंटिटी व्यू} other {# एंटिटी व्यूज़} } अनअसाइन करें", + "assign-new-entity-view": "नया एंटिटी व्यू असाइन करें", + "delete-entity-view-title": "क्या आप वाकई एंटिटी व्यू '{{entityViewName}}' को हटाना चाहते हैं?", + "delete-entity-view-text": "सावधान रहें, पुष्टि के बाद एंटिटी व्यू और उससे संबंधित सभी डेटा हमेशा के लिए खो जाएगा.", + "delete-entity-views-title": "क्या आप वाकई { count, plural, =1 {1 एंटिटी व्यू} other {# एंटिटी व्यूज़} } को हटाना चाहते हैं?", + "delete-entity-views-action-title": "हटाएँ { count, plural, =1 {1 एंटिटी व्यू} other {# एंटिटी व्यूज़} }", + "delete-entity-views-text": "सावधान रहें, पुष्टि के बाद सभी चयनित एंटिटी व्यूज़ हटा दिए जाएँगे और उनसे संबंधित सभी डेटा हमेशा के लिए खो जाएगा.", + "make-public-entity-view-title": "क्या आप वाकई एंटिटी व्यू '{{entityViewName}}' को पब्लिक बनाना चाहते हैं?", + "make-public-entity-view-text": "पुष्टि के बाद एंटिटी व्यू और उसका सारा डेटा पब्लिक हो जाएगा और दूसरों के लिए सुलभ होगा.", + "make-private-entity-view-title": "क्या आप वाकई एंटिटी व्यू '{{entityViewName}}' को प्राइवेट बनाना चाहते हैं?", + "make-private-entity-view-text": "पुष्टि के बाद एंटिटी व्यू और उसका सारा डेटा प्राइवेट हो जाएगा और दूसरों के लिए सुलभ नहीं होगा.", + "unassign-entity-view-title": "क्या आप वाकई एंटिटी व्यू '{{entityViewName}}' को अनअसाइन करना चाहते हैं?", + "unassign-entity-view-text": "पुष्टि के बाद एंटिटी व्यू अनअसाइन हो जाएगा और कस्टमर के लिए सुलभ नहीं रहेगा.", + "unassign-entity-view": "एंटिटी व्यू अनअसाइन करें", + "unassign-entity-views-title": "क्या आप वाकई { count, plural, =1 {1 एंटिटी व्यू} other {# एंटिटी व्यूज़} } को अनअसाइन करना चाहते हैं?", + "unassign-entity-views-text": "पुष्टि के बाद सभी चयनित एंटिटी व्यूज़ अनअसाइन हो जाएँगे और कस्टमर के लिए सुलभ नहीं रहेंगे.", + "entity-view-type": "एंटिटी व्यू प्रकार", + "entity-view-type-required": "एंटिटी व्यू प्रकार आवश्यक है.", + "select-entity-view-type": "एंटिटी व्यू प्रकार चुनें", + "enter-entity-view-type": "एंटिटी व्यू प्रकार दर्ज करें", + "any-entity-view": "कोई भी एंटिटी व्यू", + "no-entity-view-types-matching": "'{{entitySubtype}}' से मेल खाने वाले कोई एंटिटी व्यू प्रकार नहीं मिले.", + "entity-view-type-list-empty": "कोई एंटिटी व्यू प्रकार चयनित नहीं है.", + "entity-view-types": "एंटिटी व्यू प्रकार", + "created-time": "बनाने का समय", + "name": "नाम", + "name-required": "नाम आवश्यक है.", + "name-max-length": "नाम 256 वर्णों से कम होना चाहिए", + "type-max-length": "एंटिटी व्यू प्रकार 256 वर्णों से कम होना चाहिए", + "description": "वर्णन", + "events": "इवेंट्स", + "details": "विवरण", + "copyId": "एंटिटी व्यू Id कॉपी करें", + "idCopiedMessage": "एंटिटी व्यू Id क्लिपबोर्ड पर कॉपी कर दी गई है", + "assignedToCustomer": "कस्टमर को असाइन किया गया", + "unable-entity-view-device-alias-title": "एंटिटी व्यू उपनाम हटाने में असमर्थ", + "unable-entity-view-device-alias-text": "डिवाइस उपनाम '{{entityViewAlias}}' को हटाया नहीं जा सकता क्योंकि यह निम्न विजेट(स) द्वारा उपयोग किया जा रहा है:
{{widgetsList}}", + "select-entity-view": "एंटिटी व्यू चुनें", + "start-ts": "प्रारंभ समय", + "end-ts": "समापन समय", + "date-limits": "दिनांक सीमाएँ", + "client-attributes": "क्लाइंट विशेषताएँ", + "shared-attributes": "साझा विशेषताएँ", + "server-attributes": "सर्वर विशेषताएँ", + "timeseries": "टाइम सीरीज़", + "client-attributes-placeholder": "क्लाइंट विशेषताएँ", + "shared-attributes-placeholder": "साझा विशेषताएँ", + "server-attributes-placeholder": "सर्वर विशेषताएँ", + "timeseries-placeholder": "टाइम सीरीज़", + "target-entity": "टार्गेट एंटिटी", + "attributes-propagation": "विशेषताओं का प्रसार", + "attributes-propagation-hint": "एंटिटी व्यू हर बार जब आप इस एंटिटी व्यू को सेव या अपडेट करते हैं, तो टार्गेट एंटिटी से निर्दिष्ट विशेषताओं को अपने आप कॉपी कर लेगा। प्रदर्शन कारणों से टार्गेट एंटिटी की विशेषताएँ प्रत्येक विशेषता परिवर्तन पर एंटिटी व्यू में प्रोपीगेट नहीं की जाती हैं। आप अपनी रूल चेन में \"copy to view\" रूल नोड को कॉन्फ़िगर करके और \"Post attributes\" तथा \"Attributes Updated\" संदेशों को नए रूल नोड से लिंक करके स्वतः प्रसार सक्षम कर सकते हैं.", + "timeseries-data": "टाइम सीरीज़ डेटा", + "timeseries-data-hint": "टार्गेट एंटिटी के टाइम सीरीज़ डेटा की-ज़ कॉन्फ़िगर करें जो एंटिटी व्यू के लिए उपलब्ध होंगी। यह टाइम सीरीज़ डेटा केवल पढ़ने योग्य है.", + "search": "एंटिटी व्यूज़ खोजें", + "selected-entity-views": "{ count, plural, =1 {1 एंटिटी व्यू} other {# एंटिटी व्यूज़} } चयनित", + "assign-entity-view-to-edge": "एंटिटी व्यूज़ को Edge को असाइन करें", + "assign-entity-view-to-edge-text": "Edge को असाइन करने के लिए कृपया एंटिटी व्यूज़ चुनें", + "unassign-entity-view-from-edge-title": "क्या आप वाकई एंटिटी व्यू '{{entityViewName}}' को अनअसाइन करना चाहते हैं?", + "unassign-entity-view-from-edge-text": "पुष्टि के बाद एंटिटी व्यू अनअसाइन हो जाएगा और Edge के लिए सुलभ नहीं रहेगा.", + "unassign-entity-views-from-edge-action-title": "Edge से { count, plural, =1 {1 एंटिटी व्यू} other {# एंटिटी व्यूज़} } अनअसाइन करें", + "unassign-entity-view-from-edge": "एंटिटी व्यू अनअसाइन करें", + "unassign-entity-views-from-edge-title": "क्या आप वाकई { count, plural, =1 {1 एंटिटी व्यू} other {# एंटिटी व्यूज़} } को अनअसाइन करना चाहते हैं?", + "unassign-entity-views-from-edge-text": "पुष्टि के बाद सभी चयनित एंटिटी व्यूज़ अनअसाइन हो जाएँगे और Edge के लिए सुलभ नहीं रहेंगे." + }, + "event": { + "event-type": "इवेंट प्रकार", + "events-filter": "इवेंट्स फ़िल्टर", + "clean-events": "इवेंट्स साफ़ करें", + "type-error": "त्रुटि", + "type-lc-event": "लाइफसाइकल इवेंट", + "type-stats": "आँकड़े", + "type-debug-rule-node": "डिबग", + "type-debug-rule-chain": "डिबग", + "type-debug-calculated-field": "डिबग", + "arguments": "आर्गुमेंट्स", + "result": "परिणाम", + "no-events-prompt": "कोई इवेंट नहीं मिला", + "error": "त्रुटि", + "alarm": "अलार्म", + "event-time": "इवेंट समय", + "server": "सर्वर", + "body": "बॉडी", + "method": "मेथड", + "type": "प्रकार", + "metadata": "मेटाडेटा", + "message": "संदेश", + "message-id": "संदेश Id", + "copy-message-id": "संदेश Id कॉपी करें", + "message-type": "संदेश प्रकार", + "data-type": "डेटा प्रकार", + "relation-type": "रिलेशन प्रकार", + "data": "डेटा", + "event": "इवेंट", + "status": "स्थिति", + "success": "सफल", + "failed": "विफल", + "messages-processed": "प्रोसेस किए गए संदेश", + "max-messages-processed": "अधिकतम प्रोसेस किए गए संदेश", + "min-messages-processed": "न्यूनतम प्रोसेस किए गए संदेश", + "errors-occurred": "त्रुटियाँ हुईं", + "max-errors-occurred": "अधिकतम त्रुटियाँ हुईं", + "min-errors-occurred": "न्यूनतम त्रुटियाँ हुईं", + "min-value": "न्यूनतम मान 0 है.", + "all-events": "सभी", + "has-error": "त्रुटि है", + "entity-id": "एंटिटी Id", + "copy-entity-id": "एंटिटी Id कॉपी करें", + "entity-type": "एंटिटी प्रकार", + "clear-filter": "फ़िल्टर साफ़ करें", + "clear-request-title": "सभी इवेंट्स साफ़ करें", + "clear-request-text": "क्या आप वाकई सभी इवेंट्स साफ़ करना चाहते हैं?", + "started": "शुरू हुआ", + "updated": "अपडेट हुआ", + "stopped": "रुका हुआ" + }, + "extension": { + "extensions": "एक्सटेंशन्स", + "selected-extensions": "{ count, plural, =1 {1 एक्सटेंशन} other {# एक्सटेंशन्स} } चयनित", + "type": "प्रकार", + "key": "कुंजी", + "value": "मान", + "id": "Id", + "extension-id": "एक्सटेंशन Id", + "extension-type": "एक्सटेंशन प्रकार", + "transformer-json": "JSON *", + "unique-id-required": "वर्तमान एक्सटेंशन Id पहले से मौजूद है.", + "delete": "एक्सटेंशन हटाएँ", + "add": "एक्सटेंशन जोड़ें", + "edit": "एक्सटेंशन संपादित करें", + "delete-extension-title": "क्या आप वाकई एक्सटेंशन '{{extensionId}}' को हटाना चाहते हैं?", + "delete-extension-text": "सावधान रहें, पुष्टि के बाद एक्सटेंशन और उससे संबंधित सभी डेटा हमेशा के लिए खो जाएगा.", + "delete-extensions-title": "क्या आप वाकई { count, plural, =1 {1 एक्सटेंशन} other {# एक्सटेंशन्स} } को हटाना चाहते हैं?", + "delete-extensions-text": "सावधान रहें, पुष्टि के बाद सभी चयनित एक्सटेंशन्स हटा दिए जाएँगे.", + "converters": "कन्वर्टर्स", + "converter-id": "कन्वर्टर Id", + "configuration": "कॉन्फ़िगरेशन", + "converter-configurations": "कन्वर्टर कॉन्फ़िगरेशन", + "token": "सुरक्षा टोकन", + "add-converter": "कन्वर्टर जोड़ें", + "add-config": "कन्वर्टर कॉन्फ़िगरेशन जोड़ें", + "device-name-expression": "डिवाइस नाम अभिव्यक्ति", + "device-type-expression": "डिवाइस प्रकार अभिव्यक्ति", + "custom": "कस्टम", + "to-double": "डबल में बदलें", + "transformer": "ट्रांसफ़ॉर्मर", + "json-required": "ट्रांसफ़ॉर्मर JSON आवश्यक है.", + "json-parse": "ट्रांसफ़ॉर्मर JSON पार्स नहीं किया जा सका.", + "attributes": "विशेषताएँ", + "add-attribute": "विशेषता जोड़ें", + "add-map": "मैपिंग एलिमेंट जोड़ें", + "timeseries": "टाइम सीरीज़", + "add-timeseries": "टाइम सीरीज़ जोड़ें", + "field-required": "फ़ील्ड आवश्यक है", + "brokers": "ब्रोकर", + "add-broker": "ब्रोकर जोड़ें", + "host": "होस्ट", + "port": "पोर्ट", + "port-range": "पोर्ट 1 से 65535 की सीमा में होना चाहिए.", + "ssl": "SSL", + "credentials": "क्रेडेंशियल्स", + "username": "यूज़रनेम", + "password": "पासवर्ड", + "retry-interval": "रीट्राई अंतराल (मिलीसेकंड में)", + "anonymous": "अननोनिमस", + "basic": "बेसिक", + "pem": "PEM", + "ca-cert": "CA सर्टिफिकेट फ़ाइल *", + "private-key": "प्राइवेट की फ़ाइल *", + "cert": "सर्टिफिकेट फ़ाइल *", + "no-file": "कोई फ़ाइल चयनित नहीं है.", + "drop-file": "फ़ाइल छोड़ें या अपलोड करने के लिए फ़ाइल चुनने हेतु क्लिक करें.", + "mapping": "मैपिंग", + "topic-filter": "टॉपिक फ़िल्टर", + "converter-type": "कन्वर्टर प्रकार", + "converter-json": "Json", + "json-name-expression": "डिवाइस नाम JSON अभिव्यक्ति", + "topic-name-expression": "डिवाइस नाम टॉपिक अभिव्यक्ति", + "json-type-expression": "डिवाइस प्रकार JSON अभिव्यक्ति", + "topic-type-expression": "डिवाइस प्रकार टॉपिक अभिव्यक्ति", + "attribute-key-expression": "एट्रिब्यूट की अभिव्यक्ति", + "attr-json-key-expression": "एट्रिब्यूट की JSON अभिव्यक्ति", + "attr-topic-key-expression": "एट्रिब्यूट की टॉपिक अभिव्यक्ति", + "request-id-expression": "रिक्वेस्ट Id अभिव्यक्ति", + "request-id-json-expression": "रिक्वेस्ट Id JSON अभिव्यक्ति", + "request-id-topic-expression": "रिक्वेस्ट Id टॉपिक अभिव्यक्ति", + "response-topic-expression": "रिस्पॉन्स टॉपिक अभिव्यक्ति", + "value-expression": "मान अभिव्यक्ति", + "topic": "टॉपिक", + "timeout": "टाइमआउट (मिलीसेकंड में)", + "converter-json-required": "कन्वर्टर JSON आवश्यक है.", + "converter-json-parse": "कन्वर्टर JSON पार्स नहीं किया जा सका.", + "filter-expression": "फ़िल्टर अभिव्यक्ति", + "connect-requests": "कनेक्ट रिक्वेस्ट्स", + "add-connect-request": "कनेक्ट रिक्वेस्ट जोड़ें", + "disconnect-requests": "डिसकनेक्ट रिक्वेस्ट्स", + "add-disconnect-request": "डिसकनेक्ट रिक्वेस्ट जोड़ें", + "attribute-requests": "एट्रिब्यूट रिक्वेस्ट्स", + "add-attribute-request": "एट्रिब्यूट रिक्वेस्ट जोड़ें", + "attribute-updates": "एट्रिब्यूट अपडेट्स", + "add-attribute-update": "एट्रिब्यूट अपडेट जोड़ें", + "server-side-rpc": "सर्वर साइड RPC", + "add-server-side-rpc-request": "सर्वर साइड RPC रिक्वेस्ट जोड़ें", + "device-name-filter": "डिवाइस नाम फ़िल्टर", + "attribute-filter": "एट्रिब्यूट फ़िल्टर", + "method-filter": "मेथड फ़िल्टर", + "request-topic-expression": "रिक्वेस्ट टॉपिक अभिव्यक्ति", + "response-timeout": "रिस्पॉन्स टाइमआउट (मिलीसेकंड में)", + "topic-expression": "टॉपिक अभिव्यक्ति", + "client-scope": "क्लाइंट स्कोप", + "add-device": "डिवाइस जोड़ें", + "opc-server": "सर्वर", + "opc-add-server": "सर्वर जोड़ें", + "opc-add-server-prompt": "कृपया सर्वर जोड़ें", + "opc-application-name": "एप्लिकेशन नाम", + "opc-application-uri": "एप्लिकेशन URI", + "opc-scan-period-in-seconds": "स्कैन अवधि (सेकंड में)", + "opc-security": "सिक्योरिटी", + "opc-identity": "आइडेंटिटी", + "opc-keystore": "कीस्टोर", + "opc-type": "प्रकार", + "opc-keystore-type": "प्रकार", + "opc-keystore-location": "स्थान *", + "opc-keystore-password": "पासवर्ड", + "opc-keystore-alias": "उपनाम", + "opc-keystore-key-password": "की पासवर्ड", + "opc-device-node-pattern": "डिवाइस नोड पैटर्न", + "opc-device-name-pattern": "डिवाइस नाम पैटर्न", + "modbus-server": "सर्वर/स्लेव", + "modbus-add-server": "सर्वर/स्लेव जोड़ें", + "modbus-add-server-prompt": "कृपया सर्वर/स्लेव जोड़ें", + "modbus-transport": "ट्रांसपोर्ट", + "modbus-tcp-reconnect": "स्वतः पुनः कनेक्ट करें", + "modbus-rtu-over-tcp": "RTU over TCP", + "modbus-port-name": "सीरियल पोर्ट नाम", + "modbus-encoding": "एन्कोडिंग", + "modbus-parity": "पैरिटी", + "modbus-baudrate": "बॉड रेट", + "modbus-databits": "डेटा बिट्स", + "modbus-stopbits": "स्टॉप बिट्स", + "modbus-databits-range": "डेटा बिट्स 7 से 8 की सीमा में होने चाहिए.", + "modbus-stopbits-range": "स्टॉप बिट्स 1 से 2 की सीमा में होने चाहिए.", + "modbus-unit-id": "यूनिट Id", + "modbus-unit-id-range": "यूनिट Id 1 से 247 की सीमा में होना चाहिए.", + "modbus-device-name": "डिवाइस नाम", + "modbus-poll-period": "पोल अवधि (ms)", + "modbus-attributes-poll-period": "विशेषताएँ पोल अवधि (ms)", + "modbus-timeseries-poll-period": "टाइम सीरीज़ पोल अवधि (ms)", + "modbus-poll-period-range": "पोल अवधि धनात्मक मान होनी चाहिए.", + "modbus-tag": "टैग", + "modbus-function": "फ़ंक्शन", + "modbus-register-address": "रजिस्टर पता", + "modbus-register-address-range": "रजिस्टर पता 0 से 65535 की सीमा में होना चाहिए.", + "modbus-register-bit-index": "बिट इंडेक्स", + "modbus-register-bit-index-range": "बिट इंडेक्स 0 से 15 की सीमा में होना चाहिए.", + "modbus-register-count": "रजिस्टर संख्या", + "modbus-register-count-range": "रजिस्टर संख्या धनात्मक मान होनी चाहिए.", + "modbus-byte-order": "बाइट क्रम", + "sync": { + "status": "स्थिति", + "sync": "सिंक", + "not-sync": "सिंक नहीं", + "last-sync-time": "अंतिम सिंक समय", + "not-available": "उपलब्ध नहीं" + }, + "export-extensions-configuration": "एक्सटेंशन कॉन्फ़िगरेशन एक्सपोर्ट करें", + "import-extensions-configuration": "एक्सटेंशन कॉन्फ़िगरेशन इम्पोर्ट करें", + "import-extensions": "एक्सटेंशन्स इम्पोर्ट करें", + "import-extension": "एक्सटेंशन इम्पोर्ट करें", + "export-extension": "एक्सटेंशन एक्सपोर्ट करें", + "file": "एक्सटेंशन्स फ़ाइल", + "invalid-file-error": "अमान्य एक्सटेंशन फ़ाइल" + }, + "feature": { + "advanced-features": "एडवांस्ड फीचर्स" + }, + "filter": { + "add": "फ़िल्टर जोड़ें", + "edit": "फ़िल्टर संपादित करें", + "name": "फ़िल्टर नाम", + "name-required": "फ़िल्टर नाम आवश्यक है.", + "duplicate-filter": "इसी नाम वाला फ़िल्टर पहले से मौजूद है.", + "filters": "फ़िल्टर्स", + "unable-delete-filter-title": "फ़िल्टर हटाने में असमर्थ", + "unable-delete-filter-text": "फ़िल्टर '{{filter}}' को हटाया नहीं जा सकता क्योंकि यह निम्न विजेट(स) द्वारा उपयोग किया जा रहा है:
{{widgetsList}}", + "duplicate-filter-error": "डुप्लिकेट फ़िल्टर '{{filter}}' मिला।
डैशबोर्ड के भीतर फ़िल्टर्स अद्वितीय होने चाहिए.", + "missing-key-filters-error": "फ़िल्टर '{{filter}}' के लिए की फ़िल्टर्स नहीं दिए गए हैं.", + "filter": "फ़िल्टर", + "editable": "संपादन योग्य", + "editable-hint": "डैशबोर्ड्स में उपयोगकर्ता को फ़िल्टर मान बदलने की अनुमति दें.", + "no-filters-found": "कोई फ़िल्टर नहीं मिला.", + "no-filter-text": "कोई फ़िल्टर निर्दिष्ट नहीं है", + "add-filter-prompt": "कृपया फ़िल्टर जोड़ें", + "no-filter-matching": "'{{filter}}' नहीं मिला.", + "create-new-filter": "नया बनाएँ!", + "create-new": "नया बनाएँ", + "filter-required": "फ़िल्टर आवश्यक है.", + "operation": { + "operation": "ऑपरेशन", + "equal": "बराबर", + "not-equal": "बराबर नहीं", + "starts-with": "से शुरू होता है", + "ends-with": "पर समाप्त होता है", + "contains": "शामिल है", + "not-contains": "शामिल नहीं है", + "greater": "से बड़ा", + "less": "से छोटा", + "greater-or-equal": "बड़ा या बराबर", + "less-or-equal": "छोटा या बराबर", + "and": "और", + "or": "या", + "in": "में", + "not-in": "में नहीं" + }, + "ignore-case": "केस अनदेखा करें", + "value": "मान", + "remove-filter": "फ़िल्टर हटाएँ", + "duplicate-filter-action": "फ़िल्टर डुप्लिकेट करें", + "preview": "फ़िल्टर प्रीव्यू", + "no-filters": "कोई फ़िल्टर कॉन्फ़िगर नहीं है", + "add-filter": "फ़िल्टर जोड़ें", + "add-complex-filter": "कॉम्प्लेक्स फ़िल्टर जोड़ें", + "add-complex": "कॉम्प्लेक्स जोड़ें", + "complex-filter": "कॉम्प्लेक्स फ़िल्टर", + "edit-complex-filter": "कॉम्प्लेक्स फ़िल्टर संपादित करें", + "edit-filter-user-params": "फ़िल्टर प्रेडिकेट यूज़र पैरामीटर्स संपादित करें", + "filter-user-params": "फ़िल्टर प्रेडिकेट यूज़र पैरामीटर्स", + "user-parameters": "यूज़र पैरामीटर्स", + "display-label": "दिखाने के लिए लेबल", + "custom-label": "कस्टम लेबल", + "custom-label-hint": "फ़िल्टर के लिए अपना लेबल सेट करने हेतु सक्षम करें। अक्षम होने पर लेबल स्वतः जेनरेट हो जाएगा.", + "order-priority": "डिस्प्ले क्रम", + "key-filter": "की फ़िल्टर", + "key-filters": "की फ़िल्टर्स", + "key-name": "की नाम", + "key-name-required": "की नाम आवश्यक है.", + "key-type": { + "key-type": "की प्रकार", + "attribute": "विशेषता", + "timeseries": "टाइम सीरीज़", + "entity-field": "एंटिटी फ़ील्ड", + "constant": "कॉनस्टेंट", + "client-attribute": "क्लाइंट विशेषता", + "server-attribute": "सर्वर विशेषता", + "shared-attribute": "साझा विशेषता" + }, + "value-type": { + "value-type": "मान प्रकार", + "string": "स्ट्रिंग", + "numeric": "न्यूमेरिक", + "boolean": "बूलियन", + "date-time": "दिनांक-समय" + }, + "value-type-required": "की मान प्रकार आवश्यक है.", + "key-value-type-change-title": "क्या आप वाकई की मान प्रकार बदलना चाहते हैं?", + "key-value-type-change-message": "यदि आप नए मान प्रकार की पुष्टि करते हैं, तो दर्ज किए गए सभी की फ़िल्टर्स हटाए जाएँगे.", + "no-key-filters": "कोई की फ़िल्टर्स कॉन्फ़िगर नहीं हैं", + "add-key-filter": "की फ़िल्टर जोड़ें", + "remove-key-filter": "की फ़िल्टर हटाएँ", + "edit-key-filter": "की फ़िल्टर संपादित करें", + "date": "तारीख", + "time": "समय", + "current-tenant": "वर्तमान टेनेंट", + "current-customer": "वर्तमान कस्टमर", + "current-user": "वर्तमान उपयोगकर्ता", + "current-device": "वर्तमान डिवाइस", + "default-value": "डिफ़ॉल्ट मान", + "default-comma-separated-values": "डिफ़ॉल्ट कॉमा द्वारा अलग किए गए मान", + "dynamic-source-type": "डायनेमिक स्रोत प्रकार", + "dynamic-value": "डायनेमिक मान", + "no-dynamic-value": "कोई डायनेमिक मान नहीं", + "source-attribute": "स्रोत विशेषता", + "switch-to-dynamic-value": "डायनेमिक मान पर स्विच करें", + "switch-to-default-value": "डिफ़ॉल्ट मान पर स्विच करें", + "inherit-owner": "ओनर से विरासत में लें", + "source-attribute-not-set": "यदि स्रोत विशेषता सेट नहीं है", + "unit": "इकाई" + }, + "fullscreen": { + "expand": "फुलस्क्रीन पर फैलाएँ", + "exit": "फुलस्क्रीन से बाहर निकलें", + "toggle": "फुलस्क्रीन मोड टॉगल करें", + "fullscreen": "फुलस्क्रीन" + }, + "function": { + "function": "फ़ंक्शन" + }, + "gateway": { + "gateway-name": "Gateway नाम", + "gateway-name-required": "Gateway नाम आवश्यक है.", + "gateways": "Gateways", + "create-new-gateway": "नया Gateway बनाएँ", + "create-new-gateway-text": "क्या आप वाकई '{{gatewayName}}' नाम का नया Gateway बनाना चाहते हैं?", + "launch-command": "लॉन्च कमांड", + "no-gateway-found": "कोई Gateway नहीं मिला.", + "no-gateway-matching": " '{{item}}' नहीं मिला." + }, + "grid": { + "delete-item-title": "क्या आप वाकई इस आइटम को हटाना चाहते हैं?", + "delete-item-text": "सावधान रहें, पुष्टि के बाद यह आइटम और इससे संबंधित सभी डेटा हमेशा के लिए खो जाएगा.", + "delete-items-title": "क्या आप वाकई { count, plural, =1 {1 आइटम} other {# आइटम} } को हटाना चाहते हैं?", + "delete-items-action-title": "हटाएँ { count, plural, =1 {1 आइटम} other {# आइटम} }", + "delete-items-text": "सावधान रहें, पुष्टि के बाद सभी चयनित आइटम हटा दिए जाएँगे और उनसे संबंधित सभी डेटा हमेशा के लिए खो जाएगा.", + "add-item-text": "नया आइटम जोड़ें", + "no-items-text": "कोई आइटम नहीं मिला", + "item-details": "आइटम विवरण", + "delete-item": "आइटम हटाएँ", + "delete-items": "आइटम्स हटाएँ", + "scroll-to-top": "ऊपर स्क्रॉल करें" + }, + "help": { + "goto-help-page": "हेल्प पेज पर जाएँ", + "show-help": "हेल्प दिखाएँ" + }, + "home": { + "home": "होम", + "profile": "प्रोफ़ाइल", + "logout": "लॉगआउट", + "menu": "मेन्यू", + "avatar": "अवतार", + "open-user-menu": "उपयोगकर्ता मेन्यू खोलें" + }, + "file-input": { + "browse-file": "फ़ाइल ब्राउज़ करें", + "browse-files": "फ़ाइलें ब्राउज़ करें" + }, + "image": { + "gallery": "इमेज गैलरी", + "search": "इमेज खोजें", + "selected-images": "{ count, plural, =1 {1 इमेज} other {# इमेज} } चयनित", + "created-time": "बनाने का समय", + "name": "नाम", + "name-required": "नाम आवश्यक है.", + "resolution": "रेज़ोल्यूशन", + "size": "आकार", + "system": "सिस्टम", + "download-image": "इमेज डाउनलोड करें", + "export-image": "इमेज को JSON में एक्सपोर्ट करें", + "import-image": "JSON से इमेज इम्पोर्ट करें", + "upload-image": "इमेज अपलोड करें", + "edit-image": "इमेज संपादित करें", + "image-details": "इमेज विवरण", + "no-images": "कोई इमेज नहीं मिली", + "delete-image": "इमेज हटाएँ", + "delete-image-title": "क्या आप वाकई इमेज '{{imageTitle}}' को हटाना चाहते हैं?", + "delete-image-text": "सावधान रहें, पुष्टि के बाद इमेज हमेशा के लिए खो जाएगी.", + "delete-images-title": "क्या आप वाकई { count, plural, =1 {1 इमेज} other {# इमेज} } को हटाना चाहते हैं?", + "delete-images-text": "सावधान रहें, पुष्टि के बाद सभी चयनित इमेज हटा दी जाएँगी और उनसे संबंधित सभी डेटा हमेशा के लिए खो जाएगा.", + "list-mode": "सूची दृश्य", + "grid-mode": "ग्रिड दृश्य", + "image-preview": "इमेज प्रीव्यू", + "update-image": "इमेज अपडेट करें", + "export-failed-error": "इमेज एक्सपोर्ट नहीं की जा सकी: {{error}}", + "image-json-file": "इमेज JSON फ़ाइल", + "invalid-image-json-file-error": "JSON से इमेज इम्पोर्ट नहीं कर सके: इमेज JSON डेटा संरचना अमान्य है.", + "image-is-in-use": "इमेज अन्य एंटिटीज़ द्वारा उपयोग की जा रही है", + "images-are-in-use": "इमेजें अन्य एंटिटीज़ द्वारा उपयोग की जा रही हैं", + "image-is-in-use-text": "इमेज '{{title}}' को नहीं हटाया गया क्योंकि इसे निम्न एंटिटीज़ द्वारा उपयोग किया जा रहा है:", + "images-are-in-use-text": "सभी इमेजें नहीं हटाई गईं क्योंकि वे अन्य एंटिटीज़ द्वारा उपयोग की जा रही हैं.
आप संबंधित एंटिटीज़ को संबंधित इमेज की पंक्ति में संदर्भ बटन पर क्लिक करके देख सकते हैं.
यदि आप फिर भी इन इमेजों को हटाना चाहते हैं, तो उन्हें नीचे दी गई तालिका में चुनें और चयनित हटाएँ बटन पर क्लिक करें.", + "delete-image-in-use-text": "यदि आप फिर भी इमेज हटाना चाहते हैं, तो फिर भी हटाएँ बटन पर क्लिक करें.", + "system-entities": "सिस्टम एंटिटीज़:", + "entities": "एंटिटीज़:", + "references": "संदर्भ", + "include-system-images": "सिस्टम इमेजें शामिल करें", + "clear-image": "इमेज साफ़ करें", + "no-image": "कोई इमेज नहीं", + "no-image-selected": "कोई इमेज चयनित नहीं है", + "browse-from-gallery": "गैलरी से ब्राउज़ करें", + "set-link": "लिंक सेट करें", + "image-link": "इमेज लिंक", + "link": "लिंक", + "copy-image-link": "इमेज लिंक कॉपी करें", + "embed-image": "इमेज एम्बेड करें", + "embed-to-html": "HTML में एम्बेड करें", + "embed-to-html-hint": "यह फीचर लिंक को किसी भी अनधिकृत उपयोगकर्ता के लिए उपलब्ध कर देगा.", + "embed-to-html-text": "निम्न कोड स्निपेट का उपयोग करके आप केवल HTML पर आधारित कॉम्पोनेंट्स में इमेज एम्बेड कर सकते हैं.
ऐसे कॉम्पोनेंट्स में HTML कार्ड विजेट्स, सेल कंटेंट फ़ंक्शंस आदि शामिल हैं.", + "embed-to-angular-template": "Angular HTML टेम्पलेट में एम्बेड करें", + "embed-to-angular-template-text": "निम्न कोड स्निपेट का उपयोग करके आप इमेज को Angular HTML टेम्पलेट में एम्बेड कर सकते हैं जो कॉम्पोनेंट्स के लिए उपयोग किया जाएगा.
ऐसे कॉम्पोनेंट्स में Markdown विजेट, विजेट एडिटर में HTML सेक्शन, कस्टम एक्शन्स आदि शामिल हैं." + }, + "image-input": { + "drop-images-or": "इमेजेस को ड्रैग-एंड-ड्रॉप करें या", + "drag-and-drop": "ड्रैग और ड्रॉप", + "or": "या", + "browse": "ब्राउज़ करें", + "no-images": "कोई इमेज चयनित नहीं है", + "images": "इमेजें" + }, + "import": { + "no-file": "कोई फ़ाइल चयनित नहीं है", + "drop-file": "JSON फ़ाइल छोड़ें या अपलोड करने के लिए फ़ाइल चुनने हेतु क्लिक करें.", + "drop-json-file-or": "JSON फ़ाइल को ड्रैग-एंड-ड्रॉप करें या", + "drop-file-csv": "CSV फ़ाइल छोड़ें या अपलोड करने के लिए फ़ाइल चुनने हेतु क्लिक करें.", + "drop-file-csv-or": "CSV फ़ाइल को ड्रैग-एंड-ड्रॉप करें या", + "column-value": "मान", + "column-title": "शीर्षक", + "column-example": "उदाहरण मान डेटा", + "column-key": "विशेषता/टेलीमेट्री कुंजी", + "credentials": "क्रेडेंशियल्स", + "csv-delimiter": "CSV डिलिमिटर", + "csv-first-line-header": "पहली पंक्ति में कॉलम नाम होते हैं", + "csv-update-data": "विशेषताएँ/टेलीमेट्री अपडेट करें", + "details": "विवरण", + "import-csv-number-columns-error": "फ़ाइल में कम से कम दो कॉलम होने चाहिए", + "import-csv-invalid-format-error": "अमान्य फ़ाइल फ़ॉर्मेट. पंक्ति: '{{line}}'", + "column-type": { + "name": "नाम", + "type": "प्रकार", + "label": "लेबल", + "column-type": "कॉलम प्रकार", + "client-attribute": "क्लाइंट विशेषता", + "shared-attribute": "साझा विशेषता", + "server-attribute": "सर्वर विशेषता", + "timeseries": "टाइम सीरीज़", + "entity-field": "एंटिटी फ़ील्ड", + "access-token": "ऐक्सेस टोकन", + "x509": "X.509", + "mqtt": { + "client-id": "MQTT क्लाइंट ID", + "user-name": "MQTT यूज़र नेम", + "password": "MQTT पासवर्ड" + }, + "lwm2m": { + "client-endpoint": "LwM2M एंडपॉइंट क्लाइंट नाम", + "security-config-mode": "LwM2M सिक्योरिटी कॉन्फ़िग मोड", + "client-identity": "LwM2M क्लाइंट आइडेंटिटी", + "client-key": "LwM2M क्लाइंट कुंजी", + "client-cert": "LwM2M क्लाइंट पब्लिक की", + "bootstrap-server-security-mode": "LwM2M बूटस्ट्रैप सर्वर सिक्योरिटी मोड", + "bootstrap-server-secret-key": "LwM2M बूटस्ट्रैप सर्वर सीक्रेट की", + "bootstrap-server-public-key-id": "LwM2M बूटस्ट्रैप सर्वर पब्लिक की या Id", + "lwm2m-server-security-mode": "LwM2M सर्वर सिक्योरिटी मोड", + "lwm2m-server-secret-key": "LwM2M सर्वर सीक्रेट की", + "lwm2m-server-public-key-id": "LwM2M सर्वर पब्लिक की या Id" + }, + "snmp": { + "host": "SNMP होस्ट", + "port": "SNMP पोर्ट", + "version": "SNMP वर्ज़न (v1, v2c या v3)", + "community-string": "SNMP कम्युनिटी स्ट्रिंग" + }, + "isgateway": "Gateway है", + "activity-time-from-gateway-device": "Gateway डिवाइस से एक्टिविटी समय", + "description": "वर्णन", + "routing-key": "Edge की", + "secret": "Edge सीक्रेट" + }, + "stepper-text": { + "select-file": "फ़ाइल चुनें", + "configuration": "इम्पोर्ट कॉन्फ़िगरेशन", + "column-type": "कॉलम प्रकार चुनें", + "creat-entities": "नई एंटिटीज़ बनाई जा रही हैं" + }, + "message": { + "create-entities": "{{count}} नई एंटिटीज़ सफलतापूर्वक बनाई गईं.", + "update-entities": "{{count}} एंटिटीज़ सफलतापूर्वक अपडेट की गईं.", + "error-entities": "{{count}} एंटिटीज़ बनाते समय त्रुटि हुई." + } + }, + "scada": { + "symbols": "SCADA सिंबल्स", + "search": "सिंबल खोजें", + "selected-symbols": "{ count, plural, =1 {1 सिंबल} other {# सिंबल} } चयनित", + "download-symbol": "SCADA सिंबल डाउनलोड करें", + "export-symbol": "SCADA सिंबल को JSON में एक्सपोर्ट करें", + "import-symbol": "JSON से SCADA सिंबल इम्पोर्ट करें", + "upload-symbol": "SCADA सिंबल अपलोड करें", + "update-symbol": "SCADA सिंबल अपडेट करें", + "edit-symbol": "SCADA सिंबल संपादित करें", + "symbol-details": "SCADA सिंबल विवरण", + "mode-svg": "SVG", + "mode-xml": "XML", + "no-symbols": "कोई सिंबल नहीं मिला", + "show-hidden-elements": "छिपे हुए एलिमेंट्स दिखाएँ", + "hide-hidden-elements": "छिपे हुए एलिमेंट्स छिपाएँ", + "delete-symbol": "SCADA सिंबल हटाएँ", + "delete-symbol-title": "क्या आप वाकई SCADA सिंबल '{{imageTitle}}' को हटाना चाहते हैं?", + "delete-symbol-text": "सावधान रहें, पुष्टि के बाद SCADA सिंबल हमेशा के लिए खो जाएगा.", + "delete-symbols-title": "क्या आप वाकई { count, plural, =1 {1 SCADA सिंबल} other {# SCADA सिंबल्स} } को हटाना चाहते हैं?", + "delete-symbols-text": "सावधान रहें, पुष्टि के बाद सभी चयनित SCADA सिंबल्स हटा दिए जाएँगे और उनसे संबंधित सभी डेटा हमेशा के लिए खो जाएगा.", + "include-system-symbols": "सिस्टम सिंबल्स शामिल करें", + "symbol-preview": "सिंबल प्रीव्यू", + "general": "सामान्य", + "tags": "टैग्स", + "properties": "प्रॉपर्टीज़", + "title": "शीर्षक", + "description": "वर्णन", + "search-tags": "टैग्स खोजें", + "widget-size": "विजेट आकार", + "cols": "कॉलम", + "rows": "पंक्तियाँ", + "state-render-function": "स्टेट रेंडर फ़ंक्शन", + "preview": "प्रीव्यू", + "preview-widget-action-text": "विजेट क्रिया '{{type}}' सफलतापूर्वक कॉल की गई!", + "no-symbol": "कोई SCADA सिंबल नहीं", + "no-symbol-selected": "कोई SCADA सिंबल चयनित नहीं है", + "clear-symbol": "SCADA सिंबल साफ़ करें", + "browse-symbol-from-gallery": "गैलरी से SCADA सिंबल ब्राउज़ करें", + "zoom-in": "ज़ूम इन", + "zoom-out": "ज़ूम आउट", + "create-widget": "विजेट बनाएँ", + "create-widget-from-symbol": "SCADA सिंबल से विजेट बनाएँ", + "hidden": "छिपा हुआ", + "tag": { + "tag": "टैग", + "on-click-action": "क्लिक पर क्रिया", + "no-tags": "कोई टैग कॉन्फ़िगर नहीं है", + "delete-tag-text": "क्या आप वाकई {{elementType}} एलिमेंट से टैग
{{tag}} हटाना चाहते हैं?", + "update-tag": "टैग अपडेट करें", + "enter-tag": "टैग दर्ज करें", + "tag-settings": "टैग सेटिंग्स", + "remove-tag": "टैग हटाएँ", + "add-tag": "टैग जोड़ें" + }, + "behavior": { + "behavior": "व्यवहार", + "id": "Id", + "name": "नाम", + "type": "प्रकार", + "no-behaviors": "कोई व्यवहार कॉन्फ़िगर नहीं है", + "add-behavior": "व्यवहार जोड़ें", + "type-action": "क्रिया", + "type-value": "मान", + "type-widget-action": "विजेट क्रिया", + "behavior-settings": "व्यवहार सेटिंग्स", + "remove-behavior": "व्यवहार हटाएँ", + "hint": "संकेत", + "group-title": "समूह शीर्षक", + "value-type": "मान प्रकार", + "default-value": "डिफ़ॉल्ट मान", + "true-label": "सत्य लेबल", + "false-label": "असत्य लेबल", + "state-label": "स्थिति लेबल", + "default-payload": "डिफ़ॉल्ट पेलोड", + "not-unique-behavior-ids-error": "व्यवहार Ids अद्वितीय होने चाहिए!", + "default-settings": "डिफ़ॉल्ट सेटिंग्स" + }, + "symbol": { + "symbol": "SCADA सिंबल", + "fluid-presence": "द्रव की उपस्थिति", + "fluid-presence-hint": "संकेत करता है कि पाइप में द्रव मौजूद है या नहीं.", + "fluid-present": "द्रव मौजूद", + "present": "मौजूद", + "absent": "अनुपस्थित", + "flow-presence": "प्रवाह की उपस्थिति", + "flow-presence-hint": "संकेत करता है कि पाइप में द्रव प्रवाहित हो रहा है या नहीं.", + "flow-present": "प्रवाह मौजूद", + "flow-direction": "प्रवाह की दिशा", + "flow-direction-hint": "द्रव के प्रवाह की दिशा दर्शाता है.", + "forward": "आगे", + "reverse": "उल्टा", + "flow-animation-speed": "प्रवाह एनीमेशन गति", + "flow-animation-speed-hint": "डबल मान जो प्रवाह की एनीमेशन गति दर्शाता है. 1 - सामान्य गति, 0 - कोई एनीमेशन नहीं, < 1 - धीमी एनीमेशन, > 1 - तेज़ एनीमेशन.", + "leak": "रिसाव", + "leak-hint": "संकेत करता है कि पाइप में रिसाव मौजूद है या नहीं.", + "leak-present": "रिसाव मौजूद", + "fluid-color": "द्रव का रंग", + "pipe-color": "पाइप का रंग", + "horizontal-pipe": "क्षैतिज पाइप", + "vertical-pipe": "ऊर्ध्वाधर पाइप", + "horizontal-fluid-color": "क्षैतिज द्रव का रंग", + "vertical-fluid-color": "ऊर्ध्वाधर द्रव का रंग", + "left-pipe": "बायाँ पाइप", + "right-pipe": "दायाँ पाइप", + "top-pipe": "ऊपरी पाइप", + "bottom-pipe": "निचला पाइप", + "left-fluid-color": "बाएँ द्रव का रंग", + "right-fluid-color": "दाएँ द्रव का रंग", + "top-fluid-color": "ऊपरी द्रव का रंग", + "bottom-fluid-color": "निचले द्रव का रंग", + "display": "डिस्प्ले", + "display-format": "डिस्प्ले फ़ॉर्मेट", + "value": "मान", + "decimals": "दशमलव", + "units": "इकाइयाँ", + "flow-meter-value-hint": "फ़्लो मीटर डिस्प्ले पर दिखाया जाने वाला डबल मान", + "value-hint": "वर्तमान मान दर्शाने वाला डबल मान", + "running": "रनिंग", + "running-hint": "दर्शाता है कि कंपोनेंट रनिंग स्थिति में है या नहीं.", + "warning-state": "चेतावनी स्थिति", + "warning": "चेतावनी", + "warning-click": "चेतावनी क्लिक", + "warning-state-hint": "दर्शाता है कि कंपोनेंट चेतावनी स्थिति में है या नहीं.", + "critical-state": "क्रिटिकल स्थिति", + "critical": "क्रिटिकल", + "critical-click": "क्रिटिकल क्लिक", + "critical-state-hint": "दर्शाता है कि कंपोनेंट क्रिटिकल स्थिति में है या नहीं.", + "critical-state-animation": "क्रिटिकल स्थिति एनीमेशन", + "critical-state-animation-hint": "जब कंपोनेंट क्रिटिकल स्थिति में हो, तो क्या ब्लिंकिंग एनीमेशन सक्षम हो.", + "warning-critical-state-animation": "चेतावनी/क्रिटिकल स्थिति एनीमेशन", + "warning-critical-state-animation-hint": "जब कंपोनेंट चेतावनी या क्रिटिकल स्थिति में हो, तो क्या ब्लिंकिंग एनीमेशन सक्षम हो.", + "animation": "एनीमेशन", + "broken": "टूटा हुआ", + "broken-hint": "दर्शाता है कि कंपोनेंट टूटा हुआ है या नहीं.", + "on-display-click": "डिस्प्ले पर क्लिक पर", + "on-display-click-hint": "जब उपयोगकर्ता डिस्प्ले पर क्लिक करता है तब कॉल की जाने वाली क्रिया.", + "pipe": "पाइप", + "default-border-color": "डिफ़ॉल्ट बॉर्डर रंग", + "active-border-color": "एक्टिव बॉर्डर रंग", + "warning-border-color": "चेतावनी बॉर्डर रंग", + "critical-border-color": "क्रिटिकल बॉर्डर रंग", + "background-color": "पृष्ठभूमि रंग", + "rotation-animation-speed": "रोटेशन एनीमेशन गति", + "rotation-animation-speed-hint": "डबल मान जो रोटेशन एनीमेशन की गति दर्शाता है. 1 - सामान्य गति, 0 - कोई एनीमेशन नहीं, < 1 - धीमी एनीमेशन, > 1 - तेज़ एनीमेशन.", + "on-click": "क्लिक पर", + "on-click-hint": "जब उपयोगकर्ता कंपोनेंट पर क्लिक करता है तब कॉल की जाने वाली क्रिया.", + "connectors-positions": "कनेक्टर्स की पोज़िशन", + "right-connector": "दायाँ कनेक्टर", + "right-top-connector": "दायाँ ऊपर कनेक्टर", + "right-bottom-connector": "दायाँ नीचे कनेक्टर", + "left-connector": "बायाँ कनेक्टर", + "left-top-connector": "बायाँ ऊपर कनेक्टर", + "left-bottom-connector": "बायाँ नीचे कनेक्टर", + "top-left-connector": "ऊपरी बायाँ कनेक्टर", + "top-right-connector": "ऊपरी दायाँ कनेक्टर", + "top-connector": "ऊपरी कनेक्टर", + "bottom-connector": "निचला कनेक्टर", + "running-color": "रनिंग रंग", + "stopped-color": "रुका हुआ रंग", + "stopped": "रुका हुआ", + "warning-color": "चेतावनी रंग", + "critical-color": "क्रिटिकल रंग", + "opened": "खुला हुआ", + "opened-hint": "दर्शाता है कि कंपोनेंट ओपन स्थिति में है या नहीं.", + "open": "ओपन करें", + "open-hint": "जब उपयोगकर्ता कंपोनेंट को ओपन करने के लिए क्लिक करता है तब कॉल की जाने वाली क्रिया.", + "close": "क्लोज़", + "close-hint": "जब उपयोगकर्ता कंपोनेंट को क्लोज़ करने के लिए क्लिक करता है तब कॉल की जाने वाली क्रिया.", + "close-state-animation": "क्लोज़ स्थिति एनीमेशन", + "close-state-animation-hint": "जब कंपोनेंट क्लोज़ स्थिति में हो, तो क्या ब्लिंकिंग एनीमेशन सक्षम हो.", + "opened-color": "ओपन स्थिति रंग", + "closed-color": "क्लोज़ स्थिति रंग", + "opened-rotation-angle": "ओपन स्थिति रोटेशन एंगल", + "closed-rotation-angle": "क्लोज़ स्थिति रोटेशन एंगल", + "tank-capacity": "टैंक क्षमता", + "tank-capacity-hint": "टैंक की कुल क्षमता दर्शाने वाला डबल मान.", + "current-volume": "वर्तमान वॉल्यूम", + "current-volume-hint": "वर्तमान भरे हुए वॉल्यूम को दर्शाने वाला डबल मान.", + "tank-color": "टैंक रंग", + "value-box": "वैल्यू बॉक्स", + "value-text": "वैल्यू टेक्स्ट", + "scale": "स्केल", + "transparent-mode": "ट्रांसपेरेंट मोड", + "major-ticks": "मेजर टिक्स", + "intervals": "इंटरवल्स", + "major-ticks-color": "मेजर टिक्स रंग", + "normal": "नॉर्मल", + "minor-ticks": "माइनर टिक्स", + "minor-ticks-color": "माइनर टिक्स रंग", + "temperature": "तापमान", + "temperature-hint": "वर्तमान तापमान दर्शाने वाला डबल मान.", + "update-temperature": "तापमान अपडेट करें", + "update-temperature-hint": "जब उपयोगकर्ता वर्तमान तापमान बदलने के लिए क्लिक करता है तब कॉल की जाने वाली क्रिया.", + "run": "रन", + "run-hint": "जब उपयोगकर्ता कंपोनेंट को रन करने के लिए क्लिक करता है तब कॉल की जाने वाली क्रिया.", + "stop": "रोकें", + "stop-hint": "जब उपयोगकर्ता कंपोनेंट को रोकने के लिए क्लिक करता है तब कॉल की जाने वाली क्रिया.", + "temperature-step": "तापमान स्टेप इंक्रीमेंट", + "heat-pump-color": "हीट पंप रंग", + "power-button-background": "पावर बटन बैकग्राउंड", + "value-box-background": "वैल्यू बॉक्स बैकग्राउंड", + "value-units": "वैल्यू यूनिट्स", + "enable-units-scale": "स्केल पर यूनिट्स सक्षम करें", + "filtration-mode": "फ़िल्ट्रेशन मोड", + "filtration-mode-hint": "वर्तमान फ़िल्ट्रेशन मोड दर्शाने वाला इंटीजर मान.", + "filtration-mode-update": "फ़िल्ट्रेशन मोड अपडेट स्थिति", + "filtration-mode-update-hint": "जब उपयोगकर्ता वर्तमान फ़िल्ट्रेशन मोड बदलने के लिए क्लिक करता है तब कॉल की जाने वाली क्रिया.", + "filter-mode": "फ़िल्टर", + "waste-mode": "वेस्ट", + "backwash-mode": "बैकवॉश", + "recirculate-mode": "रीसर्क्युलेट", + "rinse-mode": "रिन्स", + "closed-mode": "क्लोज़्ड", + "sand-filter-color": "सैंड फ़िल्टर रंग", + "mode-box-background": "मोड बॉक्स बैकग्राउंड", + "border-color": "बॉर्डर रंग", + "label-color": "लेबल रंग", + "water-leak-hint": "संकेत करता है कि रिसाव है या नहीं.", + "default-color": "डिफ़ॉल्ट रंग", + "leak-color": "रिसाव रंग", + "full-value": "फुल वैल्यू", + "full-value-hint": "फुल वैल्यू दर्शाने वाला डबल मान.", + "label": "लेबल", + "icon": "आइकन", + "button-color": "बटन रंग", + "on-label": "'On' लेबल टेक्स्ट", + "off-label": "'Off' लेबल टेक्स्ट", + "arrow-presence": "ऐरो की उपस्थिति", + "arrow-presence-hint": "संकेत करता है कि कनेक्टर में ऐरो मौजूद है या नहीं.", + "arrow-present": "ऐरो मौजूद", + "arrow-direction": "प्रवाह की दिशा", + "arrow-direction-hint": "प्रवाह की दिशा दर्शाता है.", + "flow-animation": "प्रवाह की उपस्थिति", + "flow-animation-hint": "संकेत करता है कि कनेक्टर में द्रव प्रवाहित हो रहा है या नहीं.", + "flow": "प्रवाह", + "flow-line": "लाइन", + "flow-line-style": "लाइन शैली", + "flow-style-hint": "डैश और गैप मान इस तरह सेट करें कि उनका योग 100 से पूरी तरह विभाज्य हो ताकि एनीमेशन सिंक्रोनाइज़ेशन परफेक्ट हो.", + "flow-dash-cap": "डैश कैप", + "dash-cap-butt": "सीधा", + "dash-cap-round": "गोल", + "dash-cap-square": "चौकोर", + "dash": "डैश", + "gap": "गैप", + "main-line": "मुख्य लाइन", + "line": "लाइन", + "line-color": "लाइन रंग", + "arrow-color": "ऐरो रंग", + "target-value": "टार्गेट वैल्यू", + "target-value-hint": "स्केल पर टार्गेट बिंदु दर्शाता है.", + "min-max-value": "न्यूनतम और अधिकतम मान", + "min-value": "न्यूनतम", + "max-value": "अधिकतम", + "progress-bar": "प्रोग्रेस बार", + "progress-arrow": "प्रोग्रेस ऐरो", + "warning-scale-color": "चेतावनी स्केल रंग", + "critical-scale-color": "क्रिटिकल स्केल रंग", + "scale-color": "स्केल रंग", + "target": "टार्गेट", + "high-warning-state": "हाई चेतावनी स्थिति", + "show-high-warning-scale": "हाई चेतावनी स्केल दिखाएँ", + "high-warning-scale": "हाई चेतावनी स्केल", + "high-warning-state-hint": "डबल मान जो अधिकतम क्रिटिकल या अधिकतम मान तक हाई चेतावनी रेंज को दर्शाता है.", + "low-warning-state": "लो चेतावनी स्थिति", + "show-low-warning-scale": "लो चेतावनी स्केल दिखाएँ", + "low-warning-scale": "लो चेतावनी स्केल", + "low-warning-state-hint": "डबल मान जो न्यूनतम क्रिटिकल या न्यूनतम मान तक लो चेतावनी रेंज को दर्शाता है.", + "high-critical-state": "हाई क्रिटिकल स्थिति", + "show-high-critical-scale": "हाई क्रिटिकल स्केल दिखाएँ", + "high-critical-scale": "हाई क्रिटिकल स्केल", + "high-critical-state-hint": "डबल मान जो अधिकतम मान स्केल तक हाई क्रिटिकल रेंज को दर्शाता है.", + "low-critical-state": "लो क्रिटिकल स्थिति", + "show-low-critical-scale": "लो क्रिटिकल स्थिति दिखाएँ", + "low-critical-scale": "लो क्रिटिकल स्थिति", + "low-critical-state-hint": "डबल मान जो न्यूनतम मान स्केल तक लो क्रिटिकल रेंज को दर्शाता है.", + "filter-color": "फ़िल्टर रंग", + "colors": "रंग", + "indicator-colors": "इंडिकेटर रंग", + "enabled": "सक्षम", + "disabled": "अक्षम", + "on": "चालू", + "off": "बंद", + "on-off-state": "चालू/बंद स्थिति", + "on-off-state-hint": "दर्शाता है कि कंपोनेंट चालू या बंद स्थिति में है.", + "on-update-state": "चालू स्थिति अपडेट", + "on-update-state-hint": "जब उपयोगकर्ता स्थिति को चालू करने के लिए क्लिक करता है तब कॉल की जाने वाली क्रिया.", + "off-update-state": "बंद स्थिति अपडेट", + "off-update-state-hint": "जब उपयोगकर्ता स्थिति को बंद करने के लिए क्लिक करता है तब कॉल की जाने वाली क्रिया.", + "voltage": "वोल्टेज", + "input-voltage": "इनपुट वोल्टेज", + "input-voltage-hint": "डबल मान जो इनपुट वोल्टेज मान दर्शाता है.", + "output-voltage": "आउटपुट वोल्टेज", + "output-voltage-hint": "डबल मान जो आउटपुट वोल्टेज मान दर्शाता है.", + "first-phase-voltage": "पहले फेज का वोल्टेज", + "second-phase-voltage": "दूसरे फेज का वोल्टेज", + "third-phase-voltage": "तीसरे फेज का वोल्टेज", + "phase-voltage-hint": "डबल मान जो वर्तमान फेज के वोल्टेज मान को दर्शाता है.", + "voltage-hint": "डबल मान जो वर्तमान वोल्टेज दर्शाता है.", + "current-voltage-color": "वर्तमान वोल्टेज रंग", + "phase-indicator-color": "फेज इंडिकेटर रंग", + "measured": "मापा गया", + "measured-hint": "डबल मान किलोवाट-घंटों में ऊर्जा खपत दर्शाता है.", + "day-rate": "दैनिक दर", + "night-rate": "रात्रि दर", + "off-peak-rate": "ऑफ़-पीक दर", + "peak-rate": "पीक दर", + "export-rate": "निर्यात दर", + "operating-mode": "ऑपरेटिंग मोड", + "bypass-mode": "बायपास", + "operating-mode-hint": "इंटीजर मान वर्तमान ऑपरेटिंग मोड दर्शाता है (0 - बंद, 1 - चालू, 2 - बायपास).", + "connected": "कनेक्टेड", + "connected-hint": "संकेत करता है कि कंपोनेंट कनेक्टेड स्थिति में है या नहीं.", + "disconnected": "डिसकनेक्टेड", + "indicator": "इंडिकेटर", + "operation-mode": "ऑपरेशन मोड", + "operation-mode-hint": "संकेत करता है कि इन्वर्टर मेन्स या इन्वर्टर मोड में है.", + "operation-mode-indicators-color": "ऑपरेशन मोड इंडिकेटर्स रंग", + "mains-on-mode": "मेन्स चालू", + "inverter-on-mode": "इन्वर्टर चालू", + "charging-mode": "चार्जिंग मोड", + "charging-mode-hint": "इंटीजर मान वर्तमान चार्जिंग मोड दर्शाता है (1 - बल्क, 2 - ऐब्सॉर्प्शन, 3 - फ़्लोट).", + "charging-mode-indicators-color": "चार्जिंग मोड इंडिकेटर्स रंग", + "inverter-faults": "फॉल्ट्स", + "inverter-fault-indicators-color": "फॉल्ट इंडिकेटर्स रंग", + "overload-fault": "ओवरलोड", + "overload-fault-hint": "संकेत करता है कि इन्वर्टर ओवरलोड स्थिति में है या नहीं.", + "low-battery-fault": "लो बैटरी", + "low-battery-fault-hint": "संकेत करता है कि बैटरी अत्यधिक डिस्चार्ज हो चुकी है या नहीं.", + "temperature-fault": "तापमान", + "temperature-fault-hint": "संकेत करता है कि इन्वर्टर के भीतर उच्च तापमान है या नहीं.", + "triangle": "त्रिभुज", + "socket": "सॉकेट", + "left-button": "बायाँ बटन", + "right-button": "दायाँ बटन", + "alarm-colors": "अलार्म रंग", + "hook-color": "हुक रंग" + } + }, + "item": { + "selected": "चयनित" + }, + "js-func": { + "no-return-error": "फ़ंक्शन को मान लौटाना चाहिए!", + "return-type-mismatch": "फ़ंक्शन को '{{type}}' प्रकार का मान लौटाना चाहिए!", + "tidy": "फॉर्मैट करें", + "mini": "मिनी", + "modules": "मॉड्यूल्स", + "remove-module": "मॉड्यूल हटाएँ", + "no-modules": "कोई मॉड्यूल कॉन्फ़िगर नहीं है", + "add-module": "मॉड्यूल जोड़ें", + "module-alias": "उपनाम", + "invalid-module-alias-name": "अमान्य उपनाम नाम", + "module-resource": "JS मॉड्यूल संसाधन", + "not-unique-module-aliases-error": "मॉड्यूल उपनाम अद्वितीय होने चाहिए!", + "show-module-info": "मॉड्यूल जानकारी दिखाएँ", + "show-module-source-code": "मॉड्यूल सोर्स कोड दिखाएँ", + "module-members": "मॉड्यूल सदस्य", + "module-no-members": "मॉड्यूल के कोई निर्यातित सदस्य नहीं हैं", + "module-load-error": "मॉड्यूल लोड त्रुटि", + "source-code": "सोर्स कोड", + "source-code-load-error": "सोर्स कोड लोड त्रुटि", + "no-js-module-text": "कोई JS मॉड्यूल नहीं मिला", + "no-js-module-matching": "'{{module}}' से मेल खाते कोई JS मॉड्यूल नहीं मिले." + }, + "key-val": { + "key": "कुंजी", + "value": "मान", + "remove-entry": "प्रविष्टि हटाएँ", + "add-entry": "प्रविष्टि जोड़ें", + "no-data": "कोई प्रविष्टि नहीं" + }, + "layout": { + "layout": "लेआउट", + "layouts": "लेआउट्स", + "manage": "लेआउट्स प्रबंधित करें", + "settings": "लेआउट सेटिंग्स", + "color": "रंग", + "main": "मुख्य", + "right": "दायाँ", + "left": "बायाँ", + "select": "लक्ष्य लेआउट चुनें", + "percentage-width": "प्रतिशत चौड़ाई (%)", + "fixed-width": "निश्चित चौड़ाई (px)", + "left-width": "बाएँ कॉलम (%)", + "right-width": "दाएँ कॉलम (%)", + "pick-fixed-side": "निश्चित साइड चुनें: ", + "layout-fixed-width": "निश्चित चौड़ाई (px)", + "value-min-error": "मान {{min}}{{unit}} से अधिक होना चाहिए", + "value-max-error": "मान {{max}}{{unit}} से कम होना चाहिए", + "layout-fixed-width-required": "निश्चित चौड़ाई आवश्यक है", + "right-width-percentage-required": "दाएँ प्रतिशत आवश्यक है", + "left-width-percentage-required": "बाएँ प्रतिशत आवश्यक है", + "divider": "डिवाइडर", + "right-side": "दाएँ साइड लेआउट", + "left-side": "बाएँ साइड लेआउट", + "add-new-breakpoint": "नया ब्रेकपॉइंट जोड़ें", + "breakpoint": "ब्रेकपॉइंट", + "breakpoints": "ब्रेकपॉइंट्स", + "copy-from": "से कॉपी करें", + "size": "आकार", + "delete-breakpoint-title": "क्या आप वाकई ब्रेकपॉइंट '{{name}}' को हटाना चाहते हैं?", + "delete-breakpoint-text": "कृपया ध्यान दें, पुष्टि के बाद यह ब्रेकपॉइंट हमेशा के लिए खो जाएगा और सेटिंग्स डिफ़ॉल्ट ब्रेकपॉइंट पर वापस चली जाएँगी." + }, + "legend": { + "direction": "दिशा", + "position": "स्थिति", + "show-values": "मान दिखाएँ", + "min-option": "न्यूनतम", + "max-option": "अधिकतम", + "average-option": "औसत", + "total-option": "कुल", + "latest-option": "नवीनतम", + "sort-legend": "लीजेंड में डेटा कीज़ को सॉर्ट करें", + "show-max": "अधिकतम मान दिखाएँ", + "show-min": "न्यूनतम मान दिखाएँ", + "show-avg": "औसत मान दिखाएँ", + "show-total": "कुल मान दिखाएँ", + "show-latest": "नवीनतम मान दिखाएँ", + "settings": "लीजेंड सेटिंग्स", + "min": "न्यूनतम", + "max": "अधिकतम", + "avg": "औसत", + "total": "कुल", + "latest": "नवीनतम", + "Min": "न्यूनतम", + "Max": "अधिकतम", + "Avg": "औसत", + "Total": "कुल", + "Latest": "नवीनतम", + "comparison-time-ago": { + "previousInterval": "(पिछला अंतराल)", + "customInterval": "(कस्टम अंतराल)", + "days": "(दिन पहले)", + "weeks": "(सप्ताह पहले)", + "months": "(महीना पहले)", + "years": "(साल पहले)" + }, + "column-title": "कॉलम शीर्षक", + "label": "लेबल", + "value": "मान" + }, + "login": { + "login": "लॉगिन", + "request-password-reset": "पासवर्ड रीसेट का अनुरोध करें", + "reset-password": "पासवर्ड रीसेट करें", + "create-password": "पासवर्ड बनाएँ", + "two-factor-authentication": "दो-कारक प्रमाणीकरण", + "passwords-mismatch-error": "दर्ज किए गए पासवर्ड समान होने चाहिए!", + "password-again": "पासवर्ड दोबारा", + "sign-in": "कृपया साइन इन करें", + "username": "यूज़रनेम (ईमेल)", + "remember-me": "मुझे याद रखें", + "forgot-password": "पासवर्ड भूल गए?", + "password-reset": "पासवर्ड रीसेट", + "expired-password-reset-message": "आपके क्रेडेंशियल्स की अवधि समाप्त हो गई है! कृपया नया पासवर्ड बनाएँ.", + "new-password": "नया पासवर्ड", + "new-password-again": "नया पासवर्ड पुष्टि करें", + "password-link-sent-message": "रीसेट लिंक भेज दिया गया है", + "email": "ईमेल", + "invalid-email-format": "अमान्य ईमेल फ़ॉर्मेट.", + "or": "या", + "error": "लॉगिन त्रुटि", + "verify-your-identity": "अपनी पहचान सत्यापित करें", + "select-way-to-verify": "सत्यापित करने का तरीका चुनें", + "resend-code": "कोड फिर से भेजें", + "resend-code-wait": "{ time, plural, =1 {1 सेकंड} other {# सेकंड} } में कोड फिर से भेजें", + "try-another-way": "कोई अन्य तरीका आज़माएँ", + "totp-auth-description": "कृपया अपने ऑथेंटिकेटर ऐप से सिक्योरिटी कोड दर्ज करें.", + "totp-auth-placeholder": "कोड", + "sms-auth-description": "आपके फ़ोन {{contact}} पर सिक्योरिटी कोड भेजा गया है.", + "sms-auth-placeholder": "SMS कोड", + "email-auth-description": "आपके ईमेल पते {{contact}} पर सिक्योरिटी कोड भेजा गया है.", + "email-auth-placeholder": "ईमेल कोड", + "backup-code-auth-description": "कृपया अपने बैकअप कोड्स में से एक दर्ज करें.", + "backup-code-auth-placeholder": "बैकअप कोड", + "activation-link-expired": "सक्रियन लिंक की अवधि समाप्त हो गई है", + "activation-link-expired-message": "आपके प्रोफ़ाइल को सक्रिय करने वाला लिंक समाप्त हो गया है। आप नया ईमेल प्राप्त करने के लिए लॉगिन पेज पर वापस जा सकते हैं.", + "reset-password-link-expired": "पासवर्ड रीसेट लिंक की अवधि समाप्त हो गई है", + "reset-password-link-expired-message": "आपके पासवर्ड को रीसेट करने वाला लिंक समाप्त हो गया है। आप नया ईमेल प्राप्त करने के लिए लॉगिन पेज पर वापस जा सकते हैं." + }, + "mobile": { + "add-application": "एप्लिकेशन जोड़ें", + "app-id": "ऐप साइट एसोसिएशन ID", + "app-id-required": "ऐप साइट एसोसिएशन ID आवश्यक है", + "app-id-pattern": "अमान्य App Site Association ID फ़ॉर्मेट", + "app-store-link": "App Store लिंक", + "app-store-link-required": "App Store लिंक आवश्यक है", + "application-details": "एप्लिकेशन विवरण", + "application-package": "एप्लिकेशन पैकेज", + "application-secret": "एप्लिकेशन सीक्रेट", + "application-secret-required": "एप्लिकेशन सीक्रेट आवश्यक है", + "application": "एप्लिकेशन", + "applications": "एप्लिकेशन्स", + "copy-app-id": "App ID कॉपी करें", + "copy-app-store-link": "App Store लिंक कॉपी करें", + "copy-application-package": "एप्लिकेशन पैकेज कॉपी करें", + "copy-application-secret": "एप्लिकेशन सीक्रेट कॉपी करें", + "copy-google-play-link": "Google Play लिंक कॉपी करें", + "copy-sha256-certificate-fingerprints": "SHA256 सर्टिफिकेट फिंगरप्रिंट्स कॉपी करें", + "delete-application": "एप्लिकेशन हटाएँ", + "delete-application-button-text": "मैं परिणामों को समझता हूँ, एप्लिकेशन हटाएँ", + "delete-application-text": "यह क्रिया वापस नहीं ली जा सकती. यह आपकी एप्लिकेशन को स्थायी रूप से हटा देगी.
यदि आप इसे स्थायी रूप से हटाना नहीं चाहते हैं तो आप एप्लिकेशन को अस्थायी रूप से निलंबित कर सकते हैं.
एप्लिकेशन हटाने के लिए कृपया पुष्टि करने हेतु \"{{phrase}}\" टाइप करें.", + "delete-application-title-short": "क्या आप वाकई एप्लिकेशन '{{name}}' को हटाना चाहते हैं?", + "delete-application-text-short": "सावधान रहें, पुष्टि के बाद एप्लिकेशन्स और उनसे संबंधित सभी डेटा हमेशा के लिए खो जाएँगे.", + "delete-application-phrase": "delete application", + "delete-applications-bundle-text": "सावधान रहें, पुष्टि के बाद मोबाइल बंडल और उससे संबंधित सभी डेटा हमेशा के लिए खो जाएगा.", + "delete-applications-bundle-title": "क्या आप वाकई मोबाइल बंडल '{{bundleName}}' को हटाना चाहते हैं?", + "generate-application-secret": "एप्लिकेशन सीक्रेट जनरेट करें", + "google-play-link": "Google Play लिंक", + "google-play-link-required": "Google Play लिंक आवश्यक है", + "latest-version": "नवीनतम संस्करण", + "min-version": "न्यूनतम संस्करण", + "invalid-version-pattern": "अमान्य संस्करण फ़ॉर्मेट. कृपया यह फ़ॉर्मेट उपयोग करें: major.minor.patch (उदा., 1.0.0).", + "mobile-center": "मोबाइल केंद्र", + "mobile-package": "एप्लिकेशन पैकेज", + "mobile-package-max-length": "एप्लिकेशन पैकेज 256 वर्णों से कम होना चाहिए", + "mobile-package-required": "एप्लिकेशन पैकेज आवश्यक है.", + "mobile-package-pattern": "एप्लिकेशन पैकेज का फ़ॉर्मेट अमान्य है", + "mobile-package-title": "एप्लिकेशन शीर्षक", + "mobile-package-title-max-length": "एप्लिकेशन शीर्षक 256 वर्णों से कम होना चाहिए", + "no-application": "कोई एप्लिकेशन नहीं मिला", + "no-bundles": "कोई बंडल नहीं मिला", + "platform-type": "प्लेटफ़ॉर्म प्रकार", + "search-application": "एप्लिकेशन्स खोजें", + "search-bundles": "बंडल खोजें", + "set": "सेट करें", + "sha256-certificate-fingerprints": "SHA256 सर्टिफिकेट फिंगरप्रिंट्स", + "sha256-certificate-fingerprints-required": "SHA256 सर्टिफिकेट फิงरप्रिंट्स आवश्यक हैं", + "sha256-certificate-fingerprints-pattern": "अमान्य SHA256 सर्टिफिकेट फिंगरप्रिंट फ़ॉर्मेट", + "show-hidden-pages": "छिपे हुए पेज दिखाएँ", + "status": "स्थिति", + "status-type": { + "deprecated": "अप्रचलित", + "draft": "ड्राफ्ट", + "published": "प्रकाशित", + "suspended": "निलंबित" + }, + "store-information": "स्टोर जानकारी", + "version-information": "संस्करण जानकारी", + "min-version-release-notes": "न्यूनतम संस्करण रिलीज़ नोट्स", + "latest-version-release-notes": "नवीनतम संस्करण रिलीज़ नोट्स", + "bundle": "बंडल", + "bundles": "बंडल्स", + "add-bundle": "बंडल जोड़ें", + "title": "शीर्षक", + "title-required": "शीर्षक आवश्यक है", + "title-cannot-contain-only-spaces": "शीर्षक में केवल स्पेस नहीं हो सकते", + "title-max-length": "शीर्षक 256 वर्णों से कम होना चाहिए", + "oauth-clients": "OAuth 2.0 क्लाइंट्स", + "android-app": "Android ऐप", + "android-application": "Android एप्लिकेशन", + "ios-app": "iOS ऐप", + "ios-application": "iOS एप्लिकेशन", + "invalid-store-link": "अमान्य स्टोर लिंक", + "enable-oauth": "OAuth 2.0 सक्षम करें", + "enable-self-registration": "स्व-पंजीकरण सक्षम करें", + "edit-bundle": "बंडल संपादित करें", + "description": "वर्णन", + "basic-settings": "मूल सेटिंग्स", + "no-application-matching": "'{{entity}}' से मेल खाता कोई एप्लिकेशन नहीं मिला.", + "no-bundle-matching": "'{{entity}}' से मेल खाता कोई बंडल नहीं मिला.", + "application-required": "एप्लिकेशन आवश्यक है.", + "bundle-required": "बंडल आवश्यक है.", + "no-application-text": "कोई एप्लिकेशन नहीं मिला", + "no-bundle-text": "कोई बंडल नहीं मिला", + "layout": "लेआउट", + "pages": "पेज", + "hide-all-pages": "सभी पेज छिपाएँ", + "reset-to-default-pages": "पेज को डिफ़ॉल्ट पर रीसेट करें", + "add-specific-page": "विशिष्ट पेज जोड़ें", + "visible": "दृश्यमान", + "hidden": "छिपा हुआ", + "reset-to-page-default": "पेज को वापस डिफ़ॉल्ट पर रीसेट करें", + "mobile-599": "मोबाइल (अधिकतम 599px)", + "tablet-959": "टैबलेट (अधिकतम 959px)", + "max-element-number": "एलिमेंट्स की अधिकतम संख्या", + "page-name": "पेज नाम", + "page-name-required": "पेज नाम आवश्यक है.", + "page-name-cannot-contain-only-spaces": "पेज नाम में केवल स्पेस नहीं हो सकते.", + "page-name-max-length": "पेज नाम 256 वर्णों से कम होना चाहिए", + "page-type": "पेज प्रकार", + "pages-types": { + "dashboard": "डैशबोर्ड", + "web-view": "वेब व्यू", + "custom": "कस्टम" + }, + "url": "URL", + "invalid-url-format": "अमान्य URL फ़ॉर्मेट", + "path": "पाथ", + "invalid-path-format": "अमान्य पाथ फ़ॉर्मेट", + "custom-page": "कस्टम पेज", + "edit-page": "पेज संपादित करें", + "edit-custom-page": "कस्टम पेज संपादित करें", + "delete-page": "पेज हटाएँ", + "qr-code-widget": "QR कोड विजेट", + "type-here": "यहाँ लिखें", + "configuration-dialog": "कॉन्फ़िगरेशन डायलॉग", + "configuration-app": "कॉन्फ़िगरेशन ऐप", + "configuration-step": { + "prepare-environment-title": "डेवलपमेंट एनवायरनमेंट तैयार करें", + "prepare-environment-text": "Flutter ThingsBoard Mobile Application के लिए Flutter SDK आवश्यक है. Flutter SDK सेटअप करने के लिए निर्देशों का पालन करें.", + "get-source-code-title": "ऐप सोर्स कोड प्राप्त करें", + "get-source-code-text": "आप GitHub रिपॉज़िटरी से क्लोन करके Flutter ThingsBoard Mobile Application का सोर्स कोड प्राप्त कर सकते हैं:", + "configure-app-settings-title": "ऐप सेटिंग्स कॉन्फ़िगर करें", + "configure-app-settings-text": "कॉन्फ़िगरेशन फ़ाइल डाउनलोड करें और उसे उस प्रोजेक्ट की रूट डायरेक्टरी में रखें जिसे आपने पिछले चरण में क्लोन किया था.", + "download-file": "फ़ाइल डाउनलोड करें", + "run-app-title": "ऐप चलाएँ", + "run-app-text": "अपने IDE में दिए गए निर्देशों के अनुसार ऐप चलाएँ.\nयदि आप टर्मिनल का उपयोग कर रहे हैं, तो ऐप को निम्न कमांड से चलाएँ:", + "more-information": "विस्तृत जानकारी हमारे Getting Started डॉक्यूमेंटेशन में मिल सकती है.", + "getting-started": "शुरुआत की गाइड" + } + }, + "notification": { + "action-button": "एक्शन बटन", + "action-type": "क्रिया प्रकार", + "active": "सक्रिय", + "add-notification-recipients-group": "नोटिफिकेशन प्राप्तकर्ता समूह जोड़ें", + "add-notification-template": "नोटिफिकेशन टेम्पलेट जोड़ें", + "add-recipient": "प्राप्तकर्ता जोड़ें", + "add-recipients": "प्राप्तकर्ताओं को जोड़ें", + "add-rule": "नियम जोड़ें", + "add-stage": "चरण जोड़ें", + "add-template": "टेम्पलेट जोड़ें", + "after": "के बाद", + "alarm-assignment-trigger-settings": "अलार्म असाइनमेंट ट्रिगर सेटिंग्स", + "alarm-comment-trigger-settings": "अलार्म टिप्पणी ट्रिगर सेटिंग्स", + "alarm-trigger-settings": "अलार्म ट्रिगर सेटिंग्स", + "all": "सभी", + "api-feature-hint": "यदि फ़ील्ड खाली है, तो ट्रिगर सभी API फीचर्स पर लागू होगा", + "api-usage-trigger-settings": "API उपयोग ट्रिगर सेटिंग्स", + "new-platform-version-trigger-settings": "नई प्लेटफ़ॉर्म वर्ज़न ट्रिगर सेटिंग्स", + "rate-limits-trigger-settings": "रेट लिमिट पार होने पर ट्रिगर सेटिंग्स", + "task-processing-failure-trigger-settings": "टास्क प्रोसेसिंग असफलता ट्रिगर सेटिंग्स", + "resources-shortage-trigger-settings": "रिसोर्स कमी ट्रिगर सेटिंग्स", + "at-least-one-should-be-selected": "कम से कम एक को चुना जाना चाहिए", + "basic-settings": "मूल सेटिंग्स", + "button-text": "बटन टेक्स्ट", + "button-text-required": "बटन टेक्स्ट आवश्यक है", + "button-text-max-length": "बटन टेक्स्ट {{ length }} वर्णों से कम या बराबर होना चाहिए", + "compose": "संदेश तैयार करें", + "conversation": "वार्तालाप", + "conversation-required": "वार्तालाप आवश्यक है", + "copy-notification-template": "नोटिफिकेशन टेम्पलेट कॉपी करें", + "copy-rule": "नियम कॉपी करें", + "copy-template": "टेम्पलेट कॉपी करें", + "create-new": "नया बनाएँ", + "created": "बनाया गया", + "customize-messages": "संदेशों को अनुकूलित करें", + "cpu-threshold": "CPU थ्रेशहोल्ड", + "delete-notification-text": "सावधान रहें, पुष्टि के बाद नोटिफिकेशन हमेशा के लिए खो जाएगा.", + "delete-notification-title": "क्या आप वाकई नोटिफिकेशन हटाना चाहते हैं?", + "delete-notifications-text": "सावधान रहें, पुष्टि के बाद नोटिफिकेशन्स हमेशा के लिए खो जाएँगे.", + "delete-notifications-title": "क्या आप वाकई { count, plural, =1 {1 नोटिफिकेशन} other {# नोटिफिकेशन्स} } को हटाना चाहते हैं?", + "delete-recipient-text": "सावधान रहें, पुष्टि के बाद प्राप्तकर्ता हमेशा के लिए खो जाएगा.", + "delete-recipient-title": "क्या आप वाकई प्राप्तकर्ता '{{recipientName}}' को हटाना चाहते हैं?", + "delete-recipients-text": "सावधान रहें, पुष्टि के बाद प्राप्तकर्ता हमेशा के लिए खो जाएँगे.", + "delete-recipients-title": "क्या आप वाकई { count, plural, =1 {1 प्राप्तकर्ता} other {# प्राप्तकर्ता} } को हटाना चाहते हैं?", + "delete-request-text": "सावधान रहें, पुष्टि के बाद रिक्वेस्ट हमेशा के लिए खो जाएगी.", + "delete-request-title": "क्या आप वाकई रिक्वेस्ट हटाना चाहते हैं?", + "delete-requests-text": "सावधान रहें, पुष्टि के बाद रिक्वेस्ट्स हमेशा के लिए खो जाएँगी.", + "delete-requests-title": "क्या आप वाकई { count, plural, =1 {1 रिक्वेस्ट} other {# रिक्वेस्ट्स} } को हटाना चाहते हैं?", + "delete-rule-text": "सावधान रहें, पुष्टि के बाद नियम हमेशा के लिए खो जाएगा.", + "delete-rule-title": "क्या आप वाकई नियम '{{ruleName}}' को हटाना चाहते हैं?", + "delete-rules-text": "सावधान रहें, पुष्टि के बाद नियम हमेशा के लिए खो जाएँगे.", + "delete-rules-title": "क्या आप वाकई { count, plural, =1 {1 नियम} other {# नियम} } को हटाना चाहते हैं?", + "delete-template-text": "सावधान रहें, पुष्टि के बाद टेम्पलेट हमेशा के लिए खो जाएगा.", + "delete-template-title": "क्या आप वाकई टेम्पलेट '{{templateName}}' को हटाना चाहते हैं?", + "delete-templates-text": "सावधान रहें, पुष्टि के बाद टेम्पलेट्स हमेशा के लिए खो जाएँगे.", + "delete-templates-title": "क्या आप वाकई { count, plural, =1 {1 टेम्पलेट} other {# टेम्पलेट्स} } को हटाना चाहते हैं?", + "deleted": "हटाया गया", + "delivery-method": { + "delivery-method": "डिलीवरी मेथड", + "email": "ईमेल", + "email-preview": "ईमेल नोटिफिकेशन प्रीव्यू", + "slack": "स्लैक", + "slack-preview": "स्लैक नोटिफिकेशन प्रीव्यू", + "microsoft-teams": "Microsoft Teams", + "microsoft-teams-preview": "Microsoft Teams नोटिफिकेशन प्रीव्यू", + "sms": "SMS", + "sms-preview": "SMS नोटिफिकेशन प्रीव्यू", + "web": "वेब", + "web-preview": "वेब नोटिफिकेशन प्रीव्यू", + "mobile-app": "मोबाइल ऐप", + "mobile-app-preview": "मोबाइल ऐप नोटिफिकेशन प्रीव्यू" + }, + "delivery-method-not-configure-click": "डिलीवरी मेथड कॉन्फ़िगर नहीं है. सेटअप करने के लिए क्लिक करें.", + "delivery-method-not-configure-contact": "डिलीवरी मेथड कॉन्फ़िगर नहीं है. कृपया अपने सिस्टम एडमिनिस्ट्रेटर से संपर्क करें.", + "delivery-methods": "डिलीवरी मेथड्स", + "description": "वर्णन", + "device-activity-trigger-settings": "डिवाइस एक्टिव ट्रिगर सेटिंग्स", + "device-list-rule-hint": "यदि फ़ील्ड खाली है, तो ट्रिगर सभी डिवाइस पर लागू होगा", + "device-profiles-list-rule-hint": "यदि फ़ील्ड खाली है, तो ट्रिगर सभी डिवाइस प्रोफ़ाइल्स पर लागू होगा", + "disabled": "अक्षम", + "edge-trigger-settings": "Edge ट्रिगर सेटिंग्स", + "edge-list-rule-hint": "यदि फ़ील्ड खाली है, तो ट्रिगर सभी Edge इंस्टेंसेज़ पर लागू होगा", + "edit-notification-recipients-group": "नोटिफिकेशन प्राप्तकर्ता समूह संपादित करें", + "edit-notification-template": "नोटिफिकेशन टेम्पलेट संपादित करें", + "edit-rule": "नियम संपादित करें", + "edit-template": "टेम्पलेट संपादित करें", + "enabled": "सक्रिय", + "entities-limit-trigger-settings": "एंटिटीज़ लिमिट ट्रिगर सेटिंग्स", + "entity-action-trigger-settings": "एंटिटी एक्शन ट्रिगर सेटिंग्स", + "entity-type": "एंटिटी प्रकार", + "escalation-chain": "एस्केलेशन चेन", + "failed-send": "भेजने में असफलताएँ", + "fails": "{ count, plural, =1 {1 असफलता} other {# असफलताएँ} }", + "filter": "फ़िल्टर", + "first-recipient": "पहला प्राप्तकर्ता", + "inactive": "निष्क्रिय", + "inbox": "इनबॉक्स", + "notification-inbox": "नोटिफिकेशन्स / इनबॉक्स", + "input-field-support-templatization": "इनपुट फ़ील्ड टेम्पलेटाइज़ेशन सपोर्ट करता है.", + "input-fields-support-templatization": "इनपुट फ़ील्ड्स टेम्पलेटाइज़ेशन सपोर्ट करते हैं.", + "link": "लिंक", + "link-required": "लिंक आवश्यक है", + "link-max-length": "लिंक {{ length }} वर्णों से कम या बराबर होना चाहिए", + "link-type": { + "dashboard": "डैशबोर्ड खोलें", + "link": "URL लिंक खोलें" + }, + "loading-notifications": "नोटिफिकेशन्स लोड हो रहे हैं...", + "management": "नोटिफिकेशन प्रबंधन", + "mark-all-as-read": "सभी को पढ़ा हुआ चिह्नित करें", + "mark-as-read": "पढ़ा हुआ चिह्नित करें", + "message": "संदेश", + "message-required": "संदेश आवश्यक है", + "message-max-length": "संदेश {{ length }} वर्णों से कम या बराबर होना चाहिए", + "name": "नाम", + "name-required": "नाम आवश्यक है", + "new-notification": "नया नोटिफिकेशन", + "no-inbox-notification": "कोई नोटिफिकेशन नहीं मिला", + "no-notification-request": "कोई नोटिफिकेशन रिक्वेस्ट नहीं", + "no-notification-templates": "कोई नोटिफिकेशन टेम्पलेट नहीं मिला", + "no-notifications-yet": "अभी तक कोई नोटिफिकेशन नहीं", + "no-recipients-notification": "कोई प्राप्तकर्ता नोटिफिकेशन नहीं", + "no-recipients-matching": "'{{entity}}' से मेल खाता कोई प्राप्तकर्ता नहीं मिला.", + "no-recipients-text": "कोई प्राप्तकर्ता नहीं मिला", + "no-rule": "कोई नियम कॉन्फ़िगर नहीं है", + "no-rules-notification": "कोई नियम नोटिफिकेशन नहीं", + "no-severity-found": "कोई severity नहीं मिली", + "no-severity-matching": "'{{severity}}' नहीं मिला.", + "no-template-matching": "'{{template}}' से मेल खाता कोई संसाधन नहीं मिला.", + "create-new-template": "एक नया बनाएँ!", + "not-found-slack-recipient": "Slack प्राप्तकर्ता नहीं मिला", + "notification": "नोटिफिकेशन", + "notification-center": "अधिसूचना केंद्र", + "notification-tap-action": "नोटिफिकेशन टैप कार्रवाई", + "notification-tap-action-hint": "यदि सक्षम नहीं किया गया, तो डिफ़ॉल्ट अलार्म डैशबोर्ड का उपयोग किया जाएगा", + "notify": "सूचित करें", + "notify-again": "फिर से सूचित करें", + "notify-alarm-action": { + "acknowledged": "अलार्म स्वीकार किया गया", + "assigned": "अलार्म असाइन किया गया", + "cleared": "अलार्म क्लियर किया गया", + "created": "अलार्म बनाया गया", + "severity-changed": "अलार्म severity बदली गई", + "unassigned": "अलार्म अनअसाइन किया गया" + }, + "notify-on": "पर सूचित करें", + "notify-on-comment-update": "कमेंट अपडेट पर सूचित करें", + "notify-on-required": "'Notify on' आवश्यक है", + "notify-on-unassign": "अनअसाइन पर सूचित करें", + "notify-only-user-comments": "केवल उपयोगकर्ता कमेंट्स पर सूचित करें", + "only-rule-chain-lifecycle-failures": "केवल रूल चेन लाइफ़साइकल विफलताएँ", + "only-rule-node-lifecycle-failures": "केवल रूल नोड लाइफ़साइकल विफलताएँ", + "platform-users": "प्लेटफ़ॉर्म उपयोगकर्ता", + "ram-threshold": "RAM थ्रेशहोल्ड", + "rate-limits": "रेट लिमिट्स", + "rate-limits-hint": "यदि फ़ील्ड खाली है, तो ट्रिगर सभी रेट लिमिट्स पर लागू होगा", + "recipient": "प्राप्तकर्ता", + "recipient-group": "प्राप्तकर्ता समूह", + "recipient-type": { + "affected-tenant-administrators": "प्रभावित Tenant administrators", + "affected-user": "प्रभावित उपयोगकर्ता", + "all-users": "सभी उपयोगकर्ता", + "customer-users": "कस्टमर उपयोगकर्ता", + "system-administrators": "System administrators", + "tenant-administrators": "Tenant administrators", + "user-filters": "यूज़र फ़िल्टर", + "user-list": "यूज़र सूची", + "users-entity-owner": "एंटिटी मालिक के उपयोगकर्ता" + }, + "recipients": "प्राप्तकर्ता", + "notification-recipient": "नोटिफिकेशन प्राप्तकर्ता", + "notification-recipient-required": "नोटिफिकेशन प्राप्तकर्ता आवश्यक है.", + "notification-recipients": "नोटिफिकेशन्स / प्राप्तकर्ता", + "recipients-count": "{ count, plural, =1 {1 प्राप्तकर्ता} other {# प्राप्तकर्ता} }", + "recipients-required": "प्राप्तकर्ता आवश्यक हैं", + "refresh-allow-delivery-method": "अनुमत डिलीवरी मेथड रीफ़्रेश करें", + "request-search": "रिक्वेस्ट खोजें", + "request-status": { + "processing": "प्रोसेसिंग", + "scheduled": "शेड्यूल किया गया", + "sent": "भेजा गया" + }, + "review": "रिव्यू", + "rule": "नियम", + "rule-chain-list-rule-hint": "यदि फ़ील्ड खाली है, तो ट्रिगर सभी रूल चेन्स पर लागू होगा", + "rule-engine-events-trigger-settings": "रूल इंजन इवेंट्स ट्रिगर सेटिंग्स", + "rule-engine-filter": "रूल इंजन फ़िल्टर", + "rule-name": "नियम का नाम", + "rule-name-required": "नाम आवश्यक है", + "rule-disable": "नोटिफिकेशन नियम को अक्षम करें", + "rule-enable": "नोटिफिकेशन नियम सक्षम करें", + "rule-node-filter": "रूल नोड फ़िल्टर", + "rules": "नियम", + "notification-rules": "नोटिफिकेशन्स / नियम", + "scheduler-later": "बाद के लिए शेड्यूल करें", + "search-notification": "नोटिफिकेशन्स खोजें", + "search-recipients": "प्राप्तकर्ता खोजें", + "search-rules": "नियम खोजें", + "search-templates": "टेम्पलेट्स खोजें", + "see-documentation": "डॉक्यूमेंटेशन देखें", + "selected-notifications": "{ count, plural, =1 {1 नोटिफिकेशन} other {# नोटिफिकेशन्स} } चयनित", + "selected-recipients": "{ count, plural, =1 {1 प्राप्तकर्ता} other {# प्राप्तकर्ता} } चयनित", + "selected-requests": "{ count, plural, =1 {1 रिक्वेस्ट} other {# रिक्वेस्ट्स} } चयनित", + "selected-rules": "{ count, plural, =1 {1 नियम} other {# नियम} } चयनित", + "selected-template": "{ count, plural, =1 {1 टेम्पलेट} other {# टेम्पलेट्स} } चयनित", + "send-notification": "नोटिफिकेशन भेजें", + "sent": "भेजा गया", + "setup": "सेटअप करें", + "notification-sent": "नोटिफिकेशन्स / भेजे गए", + "set-entity-from-notification": "डैशबोर्ड स्टेट के लिए एंटिटी को नोटिफिकेशन से सेट करें", + "slack-chanel-type": "Slack चैनल प्रकार", + "slack-chanel-types": { + "direct": "डायरेक्ट संदेश", + "private-channel": "प्राइवेट चैनल", + "public-channel": "पब्लिक चैनल" + }, + "start-from-scratch": "शुरू से शुरू करें", + "status": "स्थिति", + "stop-escalation-alarm-status-become": "एस्केलेशन रोकें जब अलार्म स्टेटस यह हो जाए:", + "storage-threshold": "स्टोरेज थ्रेशहोल्ड", + "subject": "विषय", + "subject-required": "विषय आवश्यक है", + "subject-max-length": "विषय {{ length }} वर्णों से कम या बराबर होना चाहिए", + "template": "टेम्पलेट", + "template-name": "टेम्पलेट नाम", + "template-required": "टेम्पलेट आवश्यक है", + "template-type": { + "alarm": "अलार्म", + "alarm-assignment": "अलार्म असाइनमेंट", + "alarm-comment": "अलार्म टिप्पणी", + "api-usage-limit": "API उपयोग सीमा", + "device-activity": "डिवाइस एक्टिविटी", + "entities-limit": "एंटिटीज़ सीमा", + "entity-action": "एंटिटी एक्शन", + "general": "जनरल", + "rule-engine-lifecycle-event": "रूल इंजन लाइफ़साइकल इवेंट", + "rule-node": "रूल नोड", + "new-platform-version": "नया प्लेटफ़ॉर्म वर्ज़न", + "rate-limits": "रेट लिमिट पार", + "edge-communication-failure": "Edge कम्युनिकेशन फेल्यर", + "edge-connection": "Edge कनेक्शन", + "task-processing-failure": "टास्क प्रोसेसिंग फेल्यर", + "resources-shortage": "रिसोर्सेज़ की कमी" + }, + "templates": "टेम्पलेट्स", + "notification-templates": "नोटिफिकेशन्स / टेम्पलेट्स", + "tenant-profiles-list-rule-hint": "यदि फ़ील्ड खाली है, तो ट्रिगर सभी टेनेंट प्रोफ़ाइल्स पर लागू होगा", + "tenants-list-rule-hint": "यदि फ़ील्ड खाली है, तो ट्रिगर सभी टेनेंट्स पर लागू होगा", + "threshold": "थ्रेशहोल्ड", + "theme-color": "थीम रंग", + "time": "समय", + "track-rule-node-events": "रूल नोड इवेंट्स को ट्रैक करें", + "trigger": { + "alarm": "अलार्म", + "alarm-assignment": "अलार्म असाइनमेंट", + "alarm-comment": "अलार्म टिप्पणी", + "api-usage-limit": "API उपयोग सीमा", + "device-activity": "डिवाइस एक्टिविटी", + "entities-limit": "एंटिटीज़ सीमा", + "entity-action": "एंटिटी एक्शन", + "rule-engine-lifecycle-event": "रूल इंजन लाइफ़साइकल इवेंट", + "new-platform-version": "नया प्लेटफ़ॉर्म वर्ज़न", + "rate-limits": "रेट लिमिट पार", + "edge-connection": "Edge कनेक्शन", + "edge-communication-failure": "Edge कम्युनिकेशन फेल्यर", + "task-processing-failure": "टास्क प्रोसेसिंग फेल्यर", + "resources-shortage": "रिसोर्सेज़ की कमी", + "trigger": "ट्रिगर", + "trigger-required": "ट्रिगर आवश्यक है" + }, + "type": "प्रकार", + "unread": "अपठित", + "updated": "अपडेट किया गया", + "use-deprecated-webhook-connectors": "अप्रचलित Webhook कनेक्टर्स का उपयोग करें", + "use-old-api": "पुराने API का उपयोग करें", + "use-template": "टेम्पलेट का उपयोग करें", + "view-all": "सभी देखें", + "warning": "चेतावनी", + "webhook-url": "Webhook URL", + "webhook-url-required": "Webhook URL आवश्यक है", + "workflow-url": "वर्कफ़्लो URL", + "workflow-url-required": "वर्कफ़्लो URL आवश्यक है", + "channel-name": "चैनल नाम", + "channel-name-required": "चैनल नाम आवश्यक है", + "settings": { + "notification-settings": "नोटिफिकेशन सेटिंग्स", + "reset-all": "सभी सेटिंग्स रीसेट करें", + "reset-all-title": "क्या आप वाकई फ़ॉर्म रीसेट करना चाहते हैं?", + "reset-all-text": "पुष्टि के बाद, सेटिंग्स फ़ॉर्म डिफ़ॉल्ट मानों पर रीसेट हो जाएगा और सेव हो जाएगा.", + "type": "प्रकार", + "enable-all": "सभी सक्षम करें", + "disable-all": "सभी अक्षम करें", + "delivery-not-configured": "डिलीवरी मेथड कॉन्फ़िगर नहीं है" + } + }, + "ota-update": { + "add": "पैकेज जोड़ें", + "assign-firmware": "असाइन किया गया फ़र्मवेयर", + "assign-firmware-required": "असाइन किया गया फ़र्मवेयर आवश्यक है", + "assign-software": "असाइन किया गया सॉफ़्टवेयर", + "assign-software-required": "असाइन किया गया सॉफ़्टवेयर आवश्यक है", + "auto-generate-checksum": "चेकसम स्वतः जनरेट करें", + "checksum": "चेकसम", + "checksum-hint": "यदि चेकसम खाली है, तो इसे स्वतः जनरेट किया जाएगा", + "checksum-algorithm": "चेकसम एल्गोरिदम", + "checksum-copied-message": "पैकेज चेकसम क्लिपबोर्ड पर कॉपी कर दिया गया है", + "change-firmware": "फ़र्मवेयर में बदलाव से { count, plural, =1 {1 डिवाइस} other {# डिवाइस} } अपडेट हो सकता है.", + "change-software": "सॉफ़्टवेयर में बदलाव से { count, plural, =1 {1 डिवाइस} other {# डिवाइस} } अपडेट हो सकता है.", + "change-ota-setting-title": "क्या आप वाकई OTA सेटिंग्स बदलना चाहते हैं?", + "chose-compatible-device-profile": "अपलोड किया गया पैकेज केवल चुने हुए डिवाइस प्रोफ़ाइल वाले डिवाइसेज़ के लिए उपलब्ध होगा.", + "chose-firmware-distributed-device": "वह फ़र्मवेयर चुनें जो डिवाइस पर वितरित किया जाएगा", + "chose-software-distributed-device": "वह सॉफ़्टवेयर चुनें जो डिवाइस पर वितरित किया जाएगा", + "content-type": "कंटेंट प्रकार", + "copy-checksum": "चेकसम कॉपी करें", + "copy-direct-url": "डायरेक्ट URL कॉपी करें", + "copyId": "पैकेज Id कॉपी करें", + "copied": "कॉपी हो गया!", + "delete": "पैकेज हटाएँ", + "delete-ota-update-text": "सावधान रहें, पुष्टि के बाद OTA अपडेट हमेशा के लिए खो जाएगा.", + "delete-ota-update-title": "क्या आप वाकई OTA अपडेट '{{title}}' को हटाना चाहते हैं?", + "delete-ota-updates-text": "सावधान रहें, पुष्टि के बाद सभी चयनित OTA अपडेट्स हटा दिए जाएँगे.", + "delete-ota-updates-title": "क्या आप वाकई { count, plural, =1 {1 OTA अपडेट} other {# OTA अपडेट्स} } को हटाना चाहते हैं?", + "description": "वर्णन", + "direct-url": "डायरेक्ट URL", + "direct-url-copied-message": "पैकेज डायरेक्ट URL क्लिपबोर्ड पर कॉपी कर दिया गया है", + "direct-url-required": "डायरेक्ट URL आवश्यक है", + "download": "पैकेज डाउनलोड करें", + "drop-file": "पैकेज फ़ाइल ड्रॉप करें या अपलोड करने के लिए क्लिक करके फ़ाइल चुनें.", + "drop-package-file-or": "पैकेज फ़ाइल को ड्रैग और ड्रॉप करें या", + "file-name": "फ़ाइल नाम", + "file-size": "फ़ाइल आकार", + "file-size-bytes": "फ़ाइल आकार (बाइट्स में)", + "idCopiedMessage": "पैकेज Id क्लिपबोर्ड पर कॉपी कर दिया गया है", + "no-firmware-matching": "कोई संगत Firmware OTA अपडेट पैकेज '{{entity}}' से मेल खाते नहीं मिले.", + "no-firmware-text": "कोई संगत Firmware OTA अपडेट पैकेज प्रोविज़न नहीं किए गए.", + "no-packages-text": "कोई पैकेज नहीं मिला", + "no-software-matching": "कोई संगत Software OTA अपडेट पैकेज '{{entity}}' से मेल खाते नहीं मिले.", + "no-software-text": "कोई संगत Software OTA अपडेट पैकेज प्रोविज़न नहीं किए गए.", + "ota-update": "OTA अपडेट", + "ota-update-details": "OTA अपडेट विवरण", + "ota-updates": "OTA अपडेट्स", + "package-file": "पैकेज फ़ाइल", + "package-type": "पैकेज प्रकार", + "packages-repository": "पैकेज रिपॉज़िटरी", + "search": "पैकेज खोजें", + "selected-package": "{ count, plural, =1 {1 पैकेज} other {# पैकेज} } चयनित", + "title": "शीर्षक", + "title-required": "शीर्षक आवश्यक है.", + "title-max-length": "शीर्षक 256 वर्णों से कम होना चाहिए", + "types": { + "firmware": "फ़र्मवेयर", + "software": "सॉफ़्टवेयर" + }, + "upload-binary-file": "बाइनरी फ़ाइल अपलोड करें", + "use-external-url": "एक्सटर्नल URL का उपयोग करें", + "version": "वर्ज़न", + "version-required": "वर्ज़न आवश्यक है.", + "version-tag": "वर्ज़न टैग", + "version-tag-hint": "कस्टम टैग आपके डिवाइस द्वारा रिपोर्ट किए गए पैकेज वर्ज़न से मेल खाना चाहिए.", + "version-max-length": "वर्ज़न 256 वर्णों से कम होना चाहिए", + "warning-after-save-no-edit": "एक बार पैकेज अपलोड हो जाने के बाद, आप शीर्षक, वर्ज़न, डिवाइस प्रोफ़ाइल और पैकेज प्रकार को संशोधित नहीं कर पाएँगे." + }, + "position": { + "top": "ऊपर", + "bottom": "नीचे", + "left": "बायाँ", + "right": "दायाँ" + }, + "profile": { + "profile": "प्रोफ़ाइल", + "last-login-time": "अंतिम लॉगिन", + "change-password": "पासवर्ड बदलें", + "current-password": "वर्तमान पासवर्ड", + "copy-jwt-token": "JWT टोकन कॉपी करें", + "jwt-token": "JWT टोकन", + "token-valid-till": "टोकन इस समय तक वैध है", + "tokenCopiedSuccessMessage": "JWT टोकन क्लिपबोर्ड पर कॉपी कर दिया गया है", + "tokenCopiedWarnMessage": "JWT टोकन की अवधि समाप्त हो गई है! कृपया पेज रीफ़्रेश करें." + }, + "profiles": { + "profiles": "प्रोफ़ाइल्स" + }, + "security": { + "security": "सुरक्षा", + "general-settings": "सामान्य सुरक्षा सेटिंग्स", + "access-token": "एक्सेस टोकन", + "access-token-required": "एक्सेस टोकन आवश्यक है", + "clientId": "Client ID", + "clientId-required": "Client ID आवश्यक है", + "username": "यूज़रनेम", + "username-required": "यूज़रनेम आवश्यक है", + "ca-cert": "CA प्रमाणपत्र", + "2fa": { + "2fa": "दो-कारक प्रमाणीकरण", + "2fa-description": "दो-कारक प्रमाणीकरण आपके अकाउंट को अनधिकृत पहुँच से बचाता है. आपको बस लॉगिन करते समय एक सिक्योरिटी कोड दर्ज करना होता है.", + "authenticate-with": "आप इनसे ऑथेंटिकेट कर सकते हैं:", + "disable-2fa-provider-text": "{{name}} को निष्क्रिय करने से आपका अकाउंट कम सुरक्षित हो जाएगा", + "disable-2fa-provider-title": "क्या आप वाकई {{name}} को निष्क्रिय करना चाहते हैं?", + "get-new-code": "नया कोड प्राप्त करें", + "main-2fa-method": "मुख्य दो-कारक प्रमाणीकरण विधि के रूप में उपयोग करें", + "dialog": { + "activation-step-description-email": "अगली बार जब आप लॉगिन करेंगे, तो आपसे वह सुरक्षा कोड दर्ज करने के लिए कहा जाएगा जो आपके ईमेल पते पर भेजा जाएगा.", + "activation-step-description-sms": "अगली बार जब आप लॉगिन करेंगे, तो आपसे वह सुरक्षा कोड दर्ज करने के लिए कहा जाएगा जो आपके फ़ोन नंबर पर भेजा जाएगा.", + "activation-step-description-totp": "अगली बार जब आप लॉगिन करेंगे, तो आपको दो-कारक प्रमाणीकरण कोड प्रदान करना होगा.", + "activation-step-label": "सक्रियकरण", + "backup-code-description": "इन कोड्स को प्रिंट कर लें ताकि जब आपको अपने अकाउंट में लॉगिन करने के लिए उनकी ज़रूरत पड़े, तो वे आपके पास हों. आप प्रत्येक बैकअप कोड का केवल एक बार उपयोग कर सकते हैं.", + "backup-code-warn": "एक बार जब आप इस पेज से बाहर निकल जाते हैं, तो ये कोड दोबारा नहीं दिखाए जा सकते. नीचे दिए गए विकल्पों का उपयोग करके इन्हें सुरक्षित रूप से स्टोर करें.", + "download-txt": "डाउनलोड (txt)", + "email-step-description": "अपने ऑथेंटिकेटर के रूप में उपयोग करने के लिए एक ईमेल दर्ज करें.", + "email-step-label": "ईमेल", + "enable-email-title": "ईमेल ऑथेंटिकेटर सक्षम करें", + "enable-sms-title": "SMS ऑथेंटिकेटर सक्षम करें", + "enable-totp-title": "ऑथेंटिकेटर ऐप सक्षम करें", + "enter-verification-code": "यहाँ 6-अंकों का कोड दर्ज करें", + "get-backup-code-title": "बैकअप कोड प्राप्त करें", + "next": "आगे", + "scan-qr-code": "अपने वेरिफिकेशन ऐप से इस QR कोड को स्कैन करें", + "send-code": "कोड भेजें", + "sms-step-description": "अपने ऑथेंटिकेटर के रूप में उपयोग करने के लिए एक फ़ोन नंबर दर्ज करें.", + "sms-step-label": "फ़ोन नंबर", + "success": "सफलता!", + "totp-step-description-install": "आप Google Authenticator, Authy या Duo जैसी ऐप्स इंस्टॉल कर सकते हैं.", + "totp-step-description-open": "अपने मोबाइल फ़ोन पर ऑथेंटिकेटर ऐप खोलें.", + "totp-step-label": "ऐप प्राप्त करें", + "verification-code": "6-अंकों का कोड", + "verification-code-invalid": "अमान्य वेरिफिकेशन कोड फ़ॉर्मेट", + "verification-code-incorrect": "वेरिफिकेशन कोड गलत है", + "verification-code-many-request": "बहुत अधिक अनुरोध, कृपया वेरिफिकेशन कोड की जाँच करें", + "verification-step-description": "वह 6-अंकों का कोड दर्ज करें जो हमने अभी {{address}} पर भेजा है", + "verification-step-label": "वेरिफिकेशन" + }, + "provider": { + "email": "ईमेल", + "email-description": "ऑथेंटिकेट करने के लिए अपने ईमेल पते पर भेजे गए सिक्योरिटी कोड का उपयोग करें.", + "email-hint": "ऑथेंटिकेशन कोड्स ईमेल के माध्यम से {{ info }} पर भेजे जाते हैं", + "sms": "SMS", + "sms-description": "ऑथेंटिकेट करने के लिए अपने फ़ोन का उपयोग करें. जब आप लॉगिन करेंगे तो हम आपको SMS संदेश के माध्यम से सिक्योरिटी कोड भेजेंगे.", + "sms-hint": "ऑथेंटिकेशन कोड्स टेक्स्ट संदेश द्वारा {{ info }} पर भेजे जाते हैं", + "totp": "ऑथेंटिकेटर ऐप", + "totp-description": "अपने फ़ोन पर Google Authenticator, Authy या Duo जैसी ऐप्स का उपयोग करके ऑथेंटिकेट करें. यह लॉगिन के लिए सिक्योरिटी कोड जनरेट करेगी.", + "totp-hint": "आपके अकाउंट के लिए ऑथेंटिकेटर ऐप सेटअप किया गया है", + "backup_code": "बैकअप कोड", + "backup-code-description": "ये प्रिंट करने योग्य एक-बार उपयोग होने वाले पासकोड्स आपको तब साइन-इन करने देते हैं जब आप अपने फ़ोन से दूर हों, जैसे यात्रा करते समय.", + "backup-code-hint": "{{ info }} सिंगल-यूज़ कोड इस समय सक्रिय हैं" + } + }, + "password-requirement": { + "at-least": "कम से कम:", + "character": "{ count, plural, =1 {1 अक्षर} other {# अक्षर} }", + "digit": "{ count, plural, =1 {1 अंक} other {# अंक} }", + "incorrect-password-try-again": "गलत पासवर्ड. दोबारा कोशिश करें", + "lowercase-letter": "{ count, plural, =1 {1 छोटे अक्षर} other {# छोटे अक्षर} }", + "new-passwords-not-match": "नए पासवर्ड आपस में मेल नहीं खाते", + "password-should-not-contain-spaces": "आपके पासवर्ड में स्पेस नहीं होना चाहिए", + "password-not-meet-requirements": "पासवर्ड आवश्यकताओं को पूरा नहीं करता", + "password-requirements": "पासवर्ड आवश्यकताएँ", + "password-should-difference": "नया पासवर्ड वर्तमान पासवर्ड से अलग होना चाहिए", + "special-character": "{ count, plural, =1 {1 विशेष वर्ण} other {# विशेष वर्ण} }", + "uppercase-letter": "{ count, plural, =1 {1 बड़े अक्षर} other {# बड़े अक्षर} }", + "at-most": "अधिकतम:" + } + }, + "relation": { + "relations": "रिलेशन", + "direction": "दिशा", + "clear-relation-type": "रिलेशन प्रकार साफ़ करें", + "search-direction": { + "FROM": "से", + "TO": "तक" + }, + "direction-type": { + "FROM": "से", + "TO": "तक" + }, + "from-relations": "आउटबाउंड रिलेशन", + "to-relations": "इनबाउंड रिलेशन", + "selected-relations": "{ count, plural, =1 {1 रिलेशन} other {# रिलेशन} } चयनित", + "type": "प्रकार", + "to-entity-type": "लक्ष्य एंटिटी प्रकार", + "to-entity-name": "लक्ष्य एंटिटी नाम", + "from-entity-type": "स्रोत एंटिटी प्रकार", + "from-entity-name": "स्रोत एंटिटी नाम", + "to-entity": "लक्ष्य एंटिटी", + "from-entity": "स्रोत एंटिटी", + "delete": "रिलेशन हटाएँ", + "relation-type": "रिलेशन प्रकार", + "relation-type-required": "रिलेशन प्रकार आवश्यक है.", + "relation-type-max-length": "रिलेशन प्रकार 256 वर्णों से कम होना चाहिए", + "any-relation-type": "कोई भी प्रकार", + "add": "रिलेशन जोड़ें", + "edit": "रिलेशन संपादित करें", + "delete-to-relation-title": "क्या आप वाकई एंटिटी '{{entityName}}' के साथ रिलेशन हटाना चाहते हैं?", + "delete-to-relation-text": "सावधान रहें, पुष्टि के बाद एंटिटी '{{entityName}}' वर्तमान एंटिटी से असंबंधित हो जाएगी.", + "delete-to-relations-title": "क्या आप वाकई { count, plural, =1 {1 रिलेशन} other {# रिलेशन} } हटाना चाहते हैं?", + "delete-to-relations-text": "सावधान रहें, पुष्टि के बाद सभी चुने हुए रिलेशन हटा दिए जाएँगे और संबंधित एंटिटीज़ वर्तमान एंटिटी से असंबंधित हो जाएँगी.", + "delete-from-relation-title": "क्या आप वाकई एंटिटी '{{entityName}}' से रिलेशन हटाना चाहते हैं?", + "delete-from-relation-text": "सावधान रहें, पुष्टि के बाद वर्तमान एंटिटी एंटिटी '{{entityName}}' से असंबंधित हो जाएगी.", + "delete-from-relations-title": "क्या आप वाकई { count, plural, =1 {1 रिलेशन} other {# रिलेशन} } हटाना चाहते हैं?", + "delete-from-relations-text": "सावधान रहें, पुष्टि के बाद सभी चुने हुए रिलेशन हटा दिए जाएँगे और वर्तमान एंटिटी संबंधित एंटिटीज़ से असंबंधित हो जाएगी.", + "remove-relation-filter": "रिलेशन फ़िल्टर हटाएँ", + "remove-filter": "फ़िल्टर हटाएँ", + "add-relation-filter": "रिलेशन फ़िल्टर जोड़ें", + "any-relation": "कोई भी रिलेशन", + "relation-filters": "रिलेशन फ़िल्टर्स", + "relation-filter": "रिलेशन फ़िल्टर", + "additional-info": "अतिरिक्त जानकारी (JSON)", + "invalid-additional-info": "अतिरिक्त जानकारी JSON को पार्स करने में असमर्थ.", + "no-relations-text": "कोई रिलेशन नहीं मिला", + "not": "नहीं" + }, + "resource": { + "add": "संसाधन जोड़ें", + "all-types": "सभी", + "copyId": "संसाधन Id कॉपी करें", + "delete": "संसाधन हटाएँ", + "delete-resource-text": "सावधान रहें, पुष्टि के बाद संसाधन हमेशा के लिए खो जाएगा.", + "delete-resource-title": "क्या आप वाकई संसाधन '{{resourceTitle}}' को हटाना चाहते हैं?", + "delete-resources-action-title": "हटाएँ { count, plural, =1 {1 संसाधन} other {# संसाधन} }", + "delete-resources-text": "कृपया ध्यान दें कि चयनित संसाधन, भले ही उनका उपयोग डिवाइस प्रोफ़ाइल्स में हो, हटा दिए जाएँगे.", + "delete-resources-title": "क्या आप वाकई { count, plural, =1 {1 संसाधन} other {# संसाधन} } को हटाना चाहते हैं?", + "download": "संसाधन डाउनलोड करें", + "drop-file": "संसाधन फ़ाइल ड्रॉप करें या अपलोड करने के लिए क्लिक करके फ़ाइल चुनें.", + "drop-resource-file-or": "संसाधन फ़ाइल को ड्रैग और ड्रॉप करें या", + "empty": "संसाधन खाली है", + "file-name": "फ़ाइल नाम", + "idCopiedMessage": "संसाधन Id क्लिपबोर्ड पर कॉपी कर दिया गया है", + "no-resource-matching": "'{{widgetsBundle}}' से मेल खाता कोई संसाधन नहीं मिला.", + "no-resource-text": "कोई संसाधन नहीं मिला", + "open-widgets-bundle": "विजेट बंडल खोलें", + "resource": "संसाधन", + "resource-file": "संसाधन फ़ाइल", + "resource-files": "संसाधन फ़ाइलें", + "resource-library-details": "संसाधन विवरण", + "resource-type": "संसाधन प्रकार", + "resources-library": "संसाधन लाइब्रेरी", + "search": "संसाधन खोजें", + "selected-resources": "{ count, plural, =1 {1 संसाधन} other {# संसाधन} } चयनित", + "system": "सिस्टम", + "title": "शीर्षक", + "title-required": "शीर्षक आवश्यक है.", + "title-max-length": "शीर्षक 256 वर्णों से कम होना चाहिए", + "type": { + "jks": "JKS", + "js-module": "JS मॉड्यूल", + "lwm2m-model": "LWM2M मॉडल", + "pkcs-12": "PKCS #12", + "general": "सामान्य" + }, + "resource-sub-type": "सब-टाइप", + "sub-type": { + "image": "इमेज", + "scada-symbol": "SCADA सिंबल", + "extension": "एक्सटेंशन", + "module": "मॉड्यूल" + }, + "resource-is-in-use": "संसाधन अन्य एंटिटीज़ द्वारा उपयोग में है", + "resources-are-in-use": "संसाधन अन्य एंटिटीज़ द्वारा उपयोग में हैं", + "resource-is-in-use-text": "संसाधन '{{title}}' को नहीं हटाया गया क्योंकि इसका उपयोग निम्नलिखित एंटिटीज़ द्वारा किया जा रहा है:", + "resources-are-in-use-text": "सभी संसाधनों को नहीं हटाया गया क्योंकि उनका उपयोग अन्य एंटिटीज़ द्वारा किया जा रहा है.
आप संदर्भित एंटिटीज़ को संबंधित संसाधन पंक्ति में References बटन पर क्लिक करके देख सकते हैं.
यदि आप फिर भी इन संसाधनों को हटाना चाहते हैं, तो उन्हें नीचे दी गई तालिका में चुनें और चयनित हटाएँ बटन पर क्लिक करें.", + "delete-resource-in-use-text": "यदि आप फिर भी संसाधन को हटाना चाहते हैं, तो फिर भी हटाएँ बटन पर क्लिक करें." + }, + "javascript": { + "add": "JavaScript संसाधन जोड़ें", + "delete": "JavaScript संसाधन हटाएँ", + "delete-javascript-resource-text": "सावधान रहें, पुष्टि के बाद JavaScript संसाधन हमेशा के लिए खो जाएगा.", + "delete-javascript-resource-title": "क्या आप वाकई JavaScript संसाधन '{{resourceTitle}}' को हटाना चाहते हैं?", + "delete-javascript-resources-action-title": "JavaScript { count, plural, =1 {1 संसाधन} other {# संसाधन} } हटाएँ", + "delete-javascript-resources-text": "कृपया ध्यान दें कि चयनित JavaScript संसाधन, भले ही उनका उपयोग JavaScript फ़ंक्शन्स में हो, हटा दिए जाएँगे.", + "delete-javascript-resources-title": "क्या आप वाकई JavaScript { count, plural, =1 {1 संसाधन} other {# संसाधन} } हटाना चाहते हैं?", + "delete-javascript-resource-in-use-text": "यदि आप फिर भी JavaScript संसाधन को हटाना चाहते हैं, तो फिर भी हटाएँ बटन पर क्लिक करें.", + "download": "JavaScript संसाधन डाउनलोड करें", + "upload-from-file": "फ़ाइल से JavaScript अपलोड करें", + "resource-file": "JavaScript संसाधन फ़ाइल", + "drop-file": "JavaScript फ़ाइल ड्रॉप करें या अपलोड करने के लिए क्लिक करके फ़ाइल चुनें.", + "drop-resource-file-or": "JavaScript फ़ाइल को ड्रैग और ड्रॉप करें या", + "javascript-library": "JavaScript लाइब्रेरी", + "javascript-type": "JavaScript प्रकार", + "javascript-resource-details": "JavaScript संसाधन विवरण", + "javascript-resource-is-in-use": "JavaScript संसाधन अन्य एंटिटीज़ द्वारा उपयोग में है", + "javascript-resources-are-in-use": "JavaScript संसाधन अन्य एंटिटीज़ द्वारा उपयोग में हैं", + "javascript-resource-is-in-use-text": "JavaScript संसाधन '{{title}}' को नहीं हटाया गया क्योंकि इसका उपयोग निम्नलिखित एंटिटीज़ द्वारा किया जा रहा है:", + "javascript-resources-are-in-use-text": "सभी JavaScript संसाधनों को नहीं हटाया गया क्योंकि उनका उपयोग अन्य एंटिटीज़ द्वारा किया जा रहा है.
आप संदर्भित एंटिटीज़ को संबंधित संसाधन पंक्ति में References बटन पर क्लिक करके देख सकते हैं.
यदि आप फिर भी इन JavaScript संसाधनों को हटाना चाहते हैं, तो उन्हें नीचे दी गई तालिका में चुनें और चयनित हटाएँ बटन पर क्लिक करें.", + "search": "JavaScript संसाधन खोजें", + "selected-javascript-resources": "{ count, plural, =1 {1 JavaScript संसाधन} other {# JavaScript संसाधन} } चयनित", + "no-javascript-resource-text": "कोई JavaScript संसाधन नहीं मिला", + "all-types": "सभी", + "module-script": "मॉड्यूल स्क्रिप्ट" + }, + "rpc": { + "error": { + "target-device-is-not-set": "टार्गेट डिवाइस सेट नहीं है!", + "invalid-target-entity": "RPC कमांड्स {{entityType}} एंटिटी द्वारा समर्थित नहीं हैं.", + "failed-to-resolve-target-device": "टार्गेट डिवाइस रिसॉल्व करने में विफल!", + "request-timeout": "रिक्वेस्ट टाइमआउट", + "rpc-http-error": "त्रुटि: {{status}} - {{statusText}}" + } + }, + "rulechain": { + "rulechain": "रूल चेन", + "rulechain-events": "रूल चेन इवेंट्स", + "rulechains": "रूल चेन्स", + "root": "रूट", + "delete": "रूल चेन हटाएँ", + "name": "नाम", + "name-required": "नाम आवश्यक है.", + "name-max-length": "नाम 256 वर्णों से कम होना चाहिए", + "description": "वर्णन", + "add": "रूल चेन जोड़ें", + "set-root": "रूल चेन को रूट बनाएं", + "set-root-rulechain-title": "क्या आप वाकई रूल चेन '{{ruleChainName}}' को रूट बनाना चाहते हैं?", + "set-root-rulechain-text": "पुष्टि के बाद रूल चेन रूट बन जाएगी और सभी इनकमिंग ट्रांसपोर्ट मैसेजेस को हैंडल करेगी.", + "delete-rulechain-title": "क्या आप वाकई रूल चेन '{{ruleChainName}}' को हटाना चाहते हैं?", + "delete-rulechain-text": "सावधान रहें, पुष्टि के बाद रूल चेन और उससे संबंधित सभी डेटा हमेशा के लिए खो जाएगा.", + "delete-rulechains-title": "क्या आप वाकई { count, plural, =1 {1 रूल चेन} other {# रूल चेन्स} } को हटाना चाहते हैं?", + "delete-rulechains-action-title": "हटाएँ { count, plural, =1 {1 रूल चेन} other {# रूल चेन्स} }", + "delete-rulechains-text": "सावधान रहें, पुष्टि के बाद सभी चयनित रूल चेन्स हटा दी जाएँगी और उनसे संबंधित सभी डेटा हमेशा के लिए खो जाएगा.", + "add-rulechain-text": "नई रूल चेन जोड़ें", + "no-rulechains-text": "कोई रूल चेन नहीं मिली", + "rulechain-details": "रूल चेन विवरण", + "details": "विवरण", + "events": "इवेंट्स", + "system": "सिस्टम", + "import": "रूल चेन इम्पोर्ट करें", + "export": "रूल चेन एक्सपोर्ट करें", + "export-failed-error": "रूल चेन एक्सपोर्ट करने में असमर्थ: {{error}}", + "create-new-rulechain": "नई रूल चेन बनाएँ", + "rulechain-file": "रूल चेन फ़ाइल", + "invalid-rulechain-file-error": "रूल चेन इम्पोर्ट करने में असमर्थ: रूल चेन डेटा स्ट्रक्चर अमान्य है.", + "copyId": "रूल चेन Id कॉपी करें", + "idCopiedMessage": "रूल चेन Id क्लिपबोर्ड पर कॉपी कर दिया गया है", + "select-rulechain": "रूल चेन चुनें", + "no-rulechains-matching": "'{{entity}}' से मेल खाती कोई रूल चेन नहीं मिली.", + "rulechain-required": "रूल चेन आवश्यक है", + "management": "रूल्स मैनेजमेंट", + "debug-mode": "डिबग मोड", + "search": "रूल चेन्स खोजें", + "selected-rulechains": "{ count, plural, =1 {1 रूल चेन} other {# रूल चेन्स} } चयनित", + "open-rulechain": "रूल चेन खोलें", + "edge-template-root": "टेम्पलेट रूट", + "assign-to-edge": "Edge को असाइन करें", + "edge-rulechain": "Edge रूल चेन", + "unassign-rulechain-from-edge-text": "पुष्टि के बाद रूल चेन अनअसाइन हो जाएगी और Edge द्वारा एक्सेस नहीं की जा सकेगी।", + "unassign-rulechains-from-edge-title": "क्या आप वाकई { count, plural, =1 {1 रूल चेन} other {# रूल चेन्स} } को अनअसाइन करना चाहते हैं?", + "unassign-rulechains-from-edge-text": "पुष्टि के बाद सभी चयनित रूल चेन्स अनअसाइन हो जाएँगी और Edge द्वारा एक्सेस नहीं की जा सकेंगी।", + "assign-rulechain-to-edge-title": "Edge को रूल चेन(्स) असाइन करें", + "assign-rulechain-to-edge-text": "कृपया Edge को असाइन करने के लिए रूल चेन्स चुनें", + "set-edge-template-root-rulechain": "रूल चेन को Edge टेम्पलेट रूट बनाएं", + "set-edge-template-root-rulechain-title": "क्या आप वाकई रूल चेन '{{ruleChainName}}' को Edge टेम्पलेट रूट बनाना चाहते हैं?", + "set-edge-template-root-rulechain-text": "पुष्टि के बाद रूल चेन Edge टेम्पलेट रूट बन जाएगी और नए बनाए गए Edge के लिए रूट रूल चेन होगी।", + "invalid-rulechain-type-error": "रूल चेन इम्पोर्ट नहीं की जा सकी: अमान्य रूल चेन प्रकार। अपेक्षित प्रकार {{expectedRuleChainType}} है।", + "set-auto-assign-to-edge": "बनाते समय रूल चेन को Edge(s) पर असाइन करें", + "set-auto-assign-to-edge-title": "क्या आप वाकई बनाते समय Edge रूल चेन '{{ruleChainName}}' को Edge(s) पर असाइन करना चाहते हैं?", + "set-auto-assign-to-edge-text": "पुष्टि के बाद Edge रूल चेन बनाते समय Edge(s) पर अपने-आप असाइन हो जाएगी।", + "unset-auto-assign-to-edge": "बनाते समय रूल चेन को Edge(s) पर असाइन न करें", + "unset-auto-assign-to-edge-title": "क्या आप वाकई बनाते समय Edge रूल चेन '{{ruleChainName}}' को Edge(s) पर असाइन नहीं करना चाहते हैं?", + "unset-auto-assign-to-edge-text": "पुष्टि के बाद Edge रूल चेन बनाते समय Edge(s) पर अपने-आप असाइन नहीं होगी।", + "unassign-rulechain-title": "क्या आप वाकई रूल चेन '{{ruleChainName}}' को अनअसाइन करना चाहते हैं?", + "unassign-rulechains": "रूल चेन्स अनअसाइन करें" + }, + "rulenode": { + "rule-node-events": "रूल नोड इवेंट्स", + "details": "विवरण", + "events": "इवेंट्स", + "search": "नोड्स खोजें", + "open-node-library": "नोड लाइब्रेरी खोलें", + "close-node-library": "नोड लाइब्रेरी बंद करें", + "add": "रूल नोड जोड़ें", + "name": "नाम", + "name-required": "नाम आवश्यक है.", + "name-max-length": "नाम 256 वर्णों से कम होना चाहिए", + "type": "प्रकार", + "rule-node-description": "रूल नोड विवरण", + "delete": "रूल नोड हटाएँ", + "select-all-objects": "सभी नोड्स और कनेक्शन्स चुनें", + "deselect-all-objects": "सभी नोड्स और कनेक्शन्स को अनचेक करें", + "delete-selected-objects": "चयनित नोड्स और कनेक्शन्स हटाएँ", + "delete-selected": "चयनित हटाएँ", + "create-nested-rulechain": "नेस्टेड रूल चेन बनाएँ", + "select-all": "सभी चुनें", + "copy-selected": "चयनित कॉपी करें", + "deselect-all": "सभी को अनचेक करें", + "rulenode-details": "रूल नोड विवरण", + "debug-mode": "डिबग मोड", + "singleton": "सिंगलटन", + "configuration": "कॉन्फ़िगरेशन", + "link": "लिंक", + "link-details": "रूल नोड लिंक विवरण", + "add-link": "लिंक जोड़ें", + "link-label": "लिंक लेबल", + "link-label-required": "लिंक लेबल आवश्यक है.", + "custom-link-label": "कस्टम लिंक लेबल", + "custom-link-label-required": "कस्टम लिंक लेबल आवश्यक है.", + "link-labels": "लिंक लेबल्स", + "link-labels-required": "लिंक लेबल्स आवश्यक हैं.", + "no-link-labels-found": "कोई लिंक लेबल नहीं मिला", + "no-link-label-matching": "'{{label}}' नहीं मिला.", + "create-new-link-label": "नया बनाएँ!", + "type-filter": "फ़िल्टर", + "type-filter-details": "कंफ़िगर की गई कंडीशन्स के साथ इनकमिंग मैसेजेस को फ़िल्टर करें", + "type-enrichment": "एनरिचमेंट", + "type-enrichment-details": "मैसेज मेटाडेटा में अतिरिक्त जानकारी जोड़ें", + "type-transformation": "ट्रांसफ़ॉर्मेशन", + "type-transformation-details": "मैसेज पेलोड और मेटाडेटा बदलें", + "type-action": "एक्शन", + "type-action-details": "विशेष कार्रवाई करें", + "type-external": "एक्सटर्नल", + "type-external-details": "बाहरी सिस्टम के साथ इंटरैक्ट करता है", + "type-rule-chain": "रूल चेन", + "type-rule-chain-details": "इनकमिंग मैसेजेस को निर्दिष्ट रूल चेन पर फॉरवर्ड करता है", + "type-flow": "फ़्लो", + "type-flow-details": "मैसेज फ़्लो को संगठित करता है", + "type-input": "इनपुट", + "type-input-details": "रूल चेन का लॉजिकल इनपुट, इनकमिंग मैसेजेस को अगले संबंधित रूल नोड पर फॉरवर्ड करता है", + "type-unknown": "अज्ञात", + "type-unknown-details": "अनरिज़ॉल्व्ड रूल नोड", + "directive-is-not-loaded": "परिभाषित कॉन्फ़िगरेशन डायरेक्टिव '{{directiveName}}' उपलब्ध नहीं है.", + "ui-resources-load-error": "कॉन्फ़िगरेशन UI संसाधन लोड करने में विफल.", + "invalid-target-rulechain": "टार्गेट रूल चेन को रेज़ॉल्व करने में असमर्थ!", + "test-script-function": "स्क्रिप्ट फ़ंक्शन टेस्ट करें", + "script-lang-java-script": "JavaScript", + "script-lang-tbel": "TBEL", + "message": "मैसेज", + "message-type": "मैसेज प्रकार", + "select-message-type": "मैसेज प्रकार चुनें", + "message-type-required": "मैसेज प्रकार आवश्यक है", + "metadata": "मेटाडेटा", + "metadata-required": "मेटाडेटा एंट्रीज़ खाली नहीं हो सकतीं.", + "output": "आउटपुट", + "test": "टेस्ट", + "help": "सहायता", + "reset-debug-settings": "सभी नोड्स में डिबग सेटिंग्स रीसेट करें", + "test-with-this-message": "{{test}} इस मैसेज के साथ", + "queue-hint": "मैसेज को दूसरी क्व्यू पर फॉरवर्ड करने के लिए क्व्यू चुनें. 'Main' क्व्यू डिफ़ॉल्ट रूप से उपयोग की जाती है.", + "queue-singleton-hint": "मल्टी-इंस्टेंस एनवायरनमेंट्स में मैसेज फॉरवर्डिंग के लिए क्व्यू चुनें. 'Main' क्व्यू डिफ़ॉल्ट रूप से उपयोग की जाती है." + }, + "rule-node-config": { + "id": "Id", + "additional-info": "अतिरिक्त जानकारी", + "advanced-settings": "एडवांस्ड सेटिंग्स", + "create-entity-if-not-exists": "यदि एंटिटी मौजूद नहीं है तो नई एंटिटी बनाएँ", + "create-entity-if-not-exists-hint": "यदि सक्षम है, तो दिए गए पैरामीटर्स के साथ नई एंटिटी बनाई जाएगी, यदि वह पहले से मौजूद नहीं है। मौजूद एंटिटीज़ को रिलेशन के लिए जैसे हैं वैसा ही उपयोग किया जाएगा.", + "select-device-connectivity-event": "डिवाइस कनेक्टिविटी इवेंट चुनें", + "entity-name-pattern": "नाम पैटर्न", + "device-name-pattern": "डिवाइस नाम", + "asset-name-pattern": "एसेट नाम", + "entity-view-name-pattern": "एंटिटी व्यू नाम", + "customer-title-pattern": "कस्टमर शीर्षक", + "dashboard-name-pattern": "डैशबोर्ड शीर्षक", + "user-name-pattern": "उपयोगकर्ता ईमेल", + "edge-name-pattern": "Edge नाम", + "entity-name-pattern-required": "नाम पैटर्न आवश्यक है", + "entity-name-pattern-hint": "नाम पैटर्न फ़ील्ड टेम्पलेटाइजेशन सपोर्ट करता है। वैल्यू को मैसेज से निकालने के लिए $[messageKey] और मेटाडेटा से निकालने के लिए ${metadataKey} का उपयोग करें.", + "copy-message-type": "मैसेज प्रकार कॉपी करें", + "entity-type-pattern": "टाइप पैटर्न", + "entity-type-pattern-required": "टाइप पैटर्न आवश्यक है", + "message-type-value": "मैसेज टाइप वैल्यू", + "message-type-value-required": "मैसेज टाइप वैल्यू आवश्यक है", + "message-type-value-max-length": "मैसेज टाइप वैल्यू 256 वर्णों से कम होनी चाहिए", + "output-message-type": "आउटपुट मैसेज प्रकार", + "entity-cache-expiration": "एंटिटीज़ कैश एक्सपिरेशन समय (sec)", + "entity-cache-expiration-hint": "पाई गई एंटिटी रिकॉर्ड्स को स्टोर करने के लिए अधिकतम समय अंतराल निर्दिष्ट करता है। 0 का मतलब है कि रिकॉर्ड्स कभी एक्सपायर नहीं होंगे.", + "entity-cache-expiration-required": "एंटिटीज़ कैश एक्सपिरेशन समय आवश्यक है.", + "entity-cache-expiration-range": "एंटिटीज़ कैश एक्सपिरेशन समय 0 से अधिक या बराबर होना चाहिए.", + "customer-name-pattern": "कस्टमर शीर्षक", + "customer-name-pattern-required": "कस्टमर शीर्षक आवश्यक है", + "customer-name-pattern-hint": "मैसेज से वैल्यू निकालने के लिए $[messageKey] और मेटाडेटा से वैल्यू निकालने के लिए ${metadataKey} का उपयोग करें.", + "create-customer-if-not-exists": "यदि कस्टमर मौजूद नहीं है तो नया कस्टमर बनाएँ", + "unassign-from-customer": "यदि ओरिजिनेटर डैशबोर्ड है तो विशेष कस्टमर से अनअसाइन करें", + "unassign-from-customer-tooltip": "एक समय में कई कस्टमर्स को असाइन किए जाने वाले केवल डैशबोर्ड्स ही होते हैं। \nयदि मैसेज ओरिजिनेटर डैशबोर्ड है, तो आपको जिस कस्टमर से अनअसाइन करना है, उसका शीर्षक स्पष्ट रूप से बताना होगा.", + "customer-cache-expiration": "कस्टमर्स कैश एक्सपिरेशन समय (sec)", + "customer-cache-expiration-hint": "पाए गए कस्टमर रिकॉर्ड्स को स्टोर करने के लिए अधिकतम समय अंतराल निर्दिष्ट करता है। 0 का मतलब है कि रिकॉर्ड्स कभी एक्सपायर नहीं होंगे.", + "customer-cache-expiration-required": "कस्टमर्स कैश एक्सपिरेशन समय आवश्यक है.", + "customer-cache-expiration-range": "कस्टमर्स कैश एक्सपिरेशन समय 0 से अधिक या बराबर होना चाहिए.", + "interval-start": "इंटरवल शुरू", + "interval-end": "इंटरवल समाप्त", + "time-unit": "समय इकाई", + "fetch-mode": "फेच मोड", + "order-by-timestamp": "टाइमस्टैम्प के अनुसार क्रमबद्ध करें", + "limit": "सीमा", + "limit-hint": "न्यूनतम सीमा 2 और अधिकतम 1000 है। यदि आप केवल एक एंट्री फेच करना चाहते हैं, तो फेच मोड में 'First' या 'Last' चुनें.", + "limit-required": "सीमा आवश्यक है.", + "limit-range": "सीमा 2 से 1000 के बीच होनी चाहिए.", + "time-unit-milliseconds": "मिलीसेकंड", + "time-unit-seconds": "सेकंड", + "time-unit-minutes": "मिनट", + "time-unit-hours": "घंटे", + "time-unit-days": "दिन", + "time-value-range": "अनुमत सीमा 1 से 2147483647 तक है.", + "start-interval-value-required": "इंटरवल शुरू आवश्यक है.", + "end-interval-value-required": "इंटरवल समाप्त आवश्यक है.", + "filter": "फ़िल्टर", + "switch": "स्विच", + "math-templatization-tooltip": "यह फ़ील्ड टेम्पलेटाइजेशन सपोर्ट करता है. मैसेज से वैल्यू निकालने के लिए $[messageKey] और मेटाडेटा से वैल्यू निकालने के लिए ${metadataKey} का उपयोग करें.", + "add-message-type": "मैसेज प्रकार जोड़ें", + "select-message-types-required": "कम से कम एक मैसेज प्रकार चयनित होना चाहिए.", + "select-message-types": "मैसेज प्रकार चुनें", + "no-message-types-found": "कोई मैसेज प्रकार नहीं मिला", + "no-message-type-matching": "'{{messageType}}' नहीं मिला.", + "create-new-message-type": "नया बनाएँ.", + "message-types-required": "मैसेज प्रकार आवश्यक हैं.", + "client-attributes": "क्लाइंट विशेषताएँ", + "shared-attributes": "शेयर्ड विशेषताएँ", + "server-attributes": "सर्वर विशेषताएँ", + "attributes-keys": "विशेषताओं की कुंजियाँ", + "attributes-keys-required": "विशेषताओं की कुंजियाँ आवश्यक हैं", + "attributes-scope": "विशेषताओं का स्कोप", + "attributes-scope-value": "विशेषताओं के स्कोप की वैल्यू", + "attributes-scope-value-copy": "विशेषताओं के स्कोप की वैल्यू कॉपी करें", + "attributes-scope-hint": "प्रति मैसेज विशेषता स्कोप को डायनामिक रूप से सेट करने के लिए 'scope' मेटाडेटा कुंजी का उपयोग करें. यदि दिया गया है, तो यह कॉन्फ़िगरेशन में सेट स्कोप को ओवरराइड करेगा.", + "notify-device": "डिवाइस को ज़बरदस्ती नोटिफिकेशन भेजें", + "send-attributes-updated-notification": "अपडेटेड विशेषताओं की अधिसूचना भेजें", + "send-attributes-updated-notification-hint": "अपडेटेड विशेषताओं के बारे में नोटिफिकेशन को अलग मैसेज के रूप में रूल इंजन क्व्यू में भेजें.", + "send-attributes-deleted-notification": "डिलीट की गई विशेषताओं की अधिसूचना भेजें", + "send-attributes-deleted-notification-hint": "डिलीट की गई विशेषताओं के बारे में नोटिफिकेशन को अलग मैसेज के रूप में रूल इंजन क्व्यू में भेजें.", + "update-attributes-only-on-value-change": "केवल तब विशेषताएँ सेव करें जब वैल्यू बदलती है", + "update-attributes-only-on-value-change-hint": "हर इनकमिंग मैसेज पर विशेषताओं को अपडेट करता है, चाहे उनकी वैल्यू बदली हो या नहीं. इससे API उपयोग बढ़ता है और प्रदर्शन कम होता है.", + "update-attributes-only-on-value-change-hint-enabled": "केवल तब विशेषताओं को अपडेट करता है जब उनकी वैल्यू बदलती है. यदि वैल्यू नहीं बदली है, तो न तो विशेषता टाइमस्टैम्प अपडेट होगा और न ही विशेषता परिवर्तन नोटिफिकेशन भेजा जाएगा.", + "fetch-credentials-to-metadata": "क्रेडेंशियल्स को मेटाडेटा में फेच करें", + "notify-device-on-update-hint": "यदि सक्षम है, तो शेयर्ड विशेषताओं के अपडेट के बारे में डिवाइस को ज़बरदस्ती नोटिफिकेशन भेजें. यदि अक्षम है, तो नोटिफिकेशन व्यवहार इनकमिंग मैसेज मेटाडेटा के 'notifyDevice' पैरामीटर से नियंत्रित होगा. नोटिफिकेशन बंद करने के लिए मैसेज मेटाडेटा में 'notifyDevice' पैरामीटर 'false' पर सेट होना चाहिए. किसी भी अन्य स्थिति में डिवाइस को नोटिफिकेशन भेजा जाएगा.", + "notify-device-on-delete-hint": "यदि सक्षम है, तो शेयर्ड विशेषताओं के हटाए जाने के बारे में डिवाइस को ज़बरदस्ती नोटिफिकेशन भेजें. यदि अक्षम है, तो नोटिफिकेशन व्यवहार इनकमिंग मैसेज मेटाडेटा के 'notifyDevice' पैरामीटर से नियंत्रित होगा. नोटिफिकेशन चालू करने के लिए मैसेज मेटाडेटा में 'notifyDevice' पैरामीटर 'true' पर सेट होना चाहिए. किसी भी अन्य स्थिति में डिवाइस को नोटिफिकेशन नहीं भेजा जाएगा.", + "latest-timeseries": "नवीनतम टाइम सीरीज़ डेटा कीज़", + "timeseries-keys": "टाइम सीरीज़ कीज़", + "timeseries-keys-required": "कम से कम एक टाइम सीरीज़ की चयनित होनी चाहिए.", + "add-timeseries-key": "टाइम सीरीज़ की जोड़ें", + "add-message-field": "मैसेज फ़ील्ड जोड़ें", + "relation-search-parameters": "रिलेशन सर्च पैरामीटर्स", + "relation-parameters": "रिलेशन पैरामीटर्स", + "add-metadata-field": "मेटाडेटा फ़ील्ड जोड़ें", + "data-keys": "मैसेज फ़ील्ड नाम", + "copy-from": "से कॉपी करें", + "data-to-metadata": "डेटा से मेटाडेटा", + "metadata-to-data": "मेटाडेटा से डेटा", + "use-regular-expression-hint": "कीज़ को पैटर्न के अनुसार कॉपी करने के लिए रेगुलर एक्सप्रेशन का उपयोग करें.\n\nटिप्स और ट्रिक्स:\nफ़ील्ड नाम इनपुट पूरा करने के लिए 'Enter' दबाएँ.\nफ़ील्ड नाम हटाने के लिए 'Backspace' दबाएँ. कई फ़ील्ड नाम सपोर्टेड हैं.", + "interval": "इंटरवल", + "interval-required": "इंटरवल आवश्यक है", + "interval-hint": "डीडुप्लिकेशन इंटरवल (सेकंड में).", + "interval-min-error": "न्यूनतम अनुमत वैल्यू 1 है", + "max-pending-msgs": "अधिकतम पेंडिंग मैसेजेस", + "max-pending-msgs-hint": "प्रत्येक यूनिक डीडुप्लिकेशन Id के लिए मेमोरी में स्टोर किए जाने वाले मैसेजेस की अधिकतम संख्या.", + "max-pending-msgs-required": "अधिकतम पेंडिंग मैसेजेस आवश्यक हैं", + "max-pending-msgs-max-error": "अधिकतम अनुमत वैल्यू 1000 है", + "max-pending-msgs-min-error": "न्यूनतम अनुमत वैल्यू 1 है", + "max-retries": "अधिकतम रीट्राइज़", + "max-retries-required": "अधिकतम रीट्राइज़ आवश्यक हैं", + "max-retries-hint": "डीडुप्लिकेट किए गए मैसेजेस को क्व्यू में पुश करने के लिए अधिकतम रीट्राइज़ की संख्या. रीट्राइज़ के बीच 10 सेकंड की देरी उपयोग की जाती है", + "max-retries-max-error": "अधिकतम अनुमत वैल्यू 100 है", + "max-retries-min-error": "न्यूनतम अनुमत वैल्यू 0 है", + "strategy": "रणनीति", + "strategy-required": "रणनीति आवश्यक है", + "strategy-all-hint": "डीडुप्लिकेशन अवधि के दौरान आए सभी मैसेजेस को एक सिंगल JSON ऐरे मैसेज के रूप में रिटर्न करें. जहाँ प्रत्येक एलिमेंट msg और metadata इनर प्रॉपर्टीज़ वाला ऑब्जेक्ट होता है.", + "strategy-first-hint": "डीडुप्लिकेशन अवधि के दौरान आया पहला मैसेज रिटर्न करें.", + "strategy-last-hint": "डीडुप्लिकेशन अवधि के दौरान आया आखिरी मैसेज रिटर्न करें.", + "first": "पहला", + "last": "आखिरी", + "all": "सभी", + "output-msg-type-hint": "डीडुप्लिकेशन परिणाम का मैसेज प्रकार.", + "queue-name-hint": "वह क्व्यू नाम जहाँ डीडुप्लिकेशन परिणाम पब्लिश किया जाएगा.", + "keys": "कुंजियाँ", + "keys-required": "कुंजियाँ आवश्यक हैं", + "rename-keys-in": "इन में कुंजियों का नाम बदलें", + "data": "डेटा", + "message": "मैसेज", + "metadata": "मेटाडेटा", + "current-key-name": "मौजूदा कुंजी नाम", + "key-name-required": "कुंजी नाम आवश्यक है", + "new-key-name": "नई कुंजी का नाम", + "new-key-name-required": "नई कुंजी का नाम आवश्यक है", + "metadata-keys": "मेटाडेटा फ़ील्ड नाम", + "json-path-expression": "JSON पाथ एक्सप्रेशन", + "json-path-expression-required": "JSON पाथ एक्सप्रेशन आवश्यक है", + "json-path-expression-hint": "JSONPath, JSON स्ट्रक्चर में किसी एलिमेंट या एलिमेंट्स के सेट तक पाथ को स्पेसिफाई करता है. '$' रूट ऑब्जेक्ट या ऐरे को दर्शाता है.", + "relations-query": "रिलेशन्स क्वेरी", + "device-relations-query": "डिवाइस रिलेशन्स क्वेरी", + "max-relation-level": "अधिकतम रिलेशन लेवल", + "max-relation-level-error": "वैल्यू 0 से अधिक या अनिर्दिष्ट होनी चाहिए.", + "max-relation-level-invalid": "वैल्यू पूर्णांक होनी चाहिए.", + "relation-type": "रिलेशन टाइप", + "relation-type-pattern": "रिलेशन टाइप पैटर्न", + "relation-type-pattern-required": "रिलेशन टाइप पैटर्न आवश्यक है", + "relation-types-list": "प्रोपेगेट करने के लिए रिलेशन टाइप्स", + "relation-types-list-hint": "यदि 'रिलेशन टाइप्स प्रोपेगेट करें' चयनित नहीं हैं, तो अलार्म्स को रिलेशन टाइप द्वारा फ़िल्टर किए बिना प्रोपेगेट किया जाएगा.", + "unlimited-level": "अनलिमिटेड लेवल", + "latest-telemetry": "नवीनतम टेलीमेट्री", + "add-telemetry-key": "टेलीमेट्री की जोड़ें", + "delete-from": "से डिलीट करें", + "use-regular-expression-delete-hint": "कीज़ को पैटर्न के अनुसार डिलीट करने के लिए रेगुलर एक्सप्रेशन का उपयोग करें.\n\nटिप्स और ट्रिक्स:\nफ़ील्ड नाम इनपुट पूरा करने के लिए 'Enter' दबाएँ.\nफ़ील्ड नाम डिलीट करने के लिए 'Backspace' दबाएँ.\nएक से अधिक फ़ील्ड नाम सपोर्टेड हैं.", + "fetch-into": "में फेच करें", + "attr-mapping": "विशेषताओं की मैपिंग:", + "source-attribute": "सोर्स एट्रिब्यूट की", + "source-attribute-required": "सोर्स एट्रिब्यूट की आवश्यक है.", + "source-telemetry": "सोर्स टेलीमेट्री की", + "source-telemetry-required": "सोर्स टेलीमेट्री की आवश्यक है.", + "target-key": "टारगेट की", + "target-key-required": "टारगेट की आवश्यक है.", + "attr-mapping-required": "कम से कम एक मैपिंग एंट्री निर्धारित होनी चाहिए.", + "fields-mapping": "फ़ील्ड्स मैपिंग", + "fields-mapping-hint": "यदि मैसेज फ़ील्ड को $entityId पर सेट किया जाता है, तो मैसेज ओरिजिनेटर की Id निर्दिष्ट टेबल कॉलम में सेव की जाएगी.", + "relations-query-config-direction-suffix": "ओरिजिनेटर", + "profile-name": "प्रोफ़ाइल नाम", + "fetch-circle-parameter-info-from-metadata-hint": "मेटाडेटा फ़ील्ड '{{perimeterKeyName}}' को निम्न फ़ॉर्मेट में परिभाषित किया जाना चाहिए: {\"latitude\":48.196, \"longitude\":24.6532, \"radius\":100.0, \"radiusUnit\":\"METER\"}", + "fetch-poligon-parameter-info-from-metadata-hint": "मेटाडेटा फ़ील्ड '{{perimeterKeyName}}' को निम्न फ़ॉर्मेट में परिभाषित किया जाना चाहिए: [[48.19736,24.65235],[48.19800,24.65060],...,[48.19849,24.65420]]", + "short-templatization-tooltip": "मैसेज से वैल्यू निकालने के लिए $[messageKey] और मेटाडेटा से वैल्यू निकालने के लिए ${metadataKey} का उपयोग करें.", + "fields-mapping-required": "कम से कम एक फ़ील्ड मैपिंग निर्धारित होनी चाहिए.", + "at-least-one-field-required": "कम से कम एक इनपुट फ़ील्ड के लिए वैल्यू प्रदान की जानी चाहिए.", + "originator-fields-sv-map-hint": "टारगेट की फ़ील्ड्स टेम्पलेटाइजेशन सपोर्ट करती हैं. मैसेज से वैल्यू निकालने के लिए $[messageKey] और मेटाडेटा से वैल्यू निकालने के लिए ${metadataKey} का उपयोग करें.", + "sv-map-hint": "केवल टारगेट की फ़ील्ड्स टेम्पलेटाइजेशन सपोर्ट करती हैं. मैसेज से वैल्यू निकालने के लिए $[messageKey] और मेटाडेटा से वैल्यू निकालने के लिए ${metadataKey} का उपयोग करें.", + "source-field": "सोर्स फ़ील्ड", + "source-field-required": "सोर्स फ़ील्ड आवश्यक है.", + "originator-source": "ओरिजिनेटर सोर्स", + "new-originator": "नया ओरिजिनेटर", + "originator-customer": "कस्टमर", + "originator-tenant": "टेनेंट", + "originator-related": "संबंधित एंटिटी", + "originator-alarm-originator": "अलार्म ओरिजिनेटर", + "originator-entity": "नाम पैटर्न द्वारा एंटिटी", + "clone-message": "मैसेज क्लोन करें", + "transform": "ट्रांसफ़ॉर्म", + "default-ttl": "डिफ़ॉल्ट TTL", + "default-ttl-required": "डिफ़ॉल्ट TTL आवश्यक है.", + "default-ttl-hint": "रूल नोड टाइम-टू-लाइव (TTL) वैल्यू मैसेज मेटाडेटा से फ़ेच करेगा. यदि कोई वैल्यू मौजूद नहीं है, तो यह कॉन्फ़िगरेशन में निर्दिष्ट TTL को उपयोग करेगा. यदि वैल्यू 0 सेट है, तो टेनेंट प्रोफ़ाइल कॉन्फ़िगरेशन से TTL लागू होगी.", + "default-ttl-zero-hint": "यदि वैल्यू 0 सेट है तो TTL लागू नहीं होगी.", + "min-default-ttl-message": "केवल 0 न्यूनतम TTL की अनुमति है.", + "generation-parameters": "जेनेरेशन पैरामीटर्स", + "message-count": "जनरेटेड मैसेजेस लिमिट (0 - अनलिमिटेड)", + "message-count-required": "जनरेटेड मैसेजेस लिमिट आवश्यक है.", + "min-message-count-message": "केवल 0 न्यूनतम मैसेज काउंट की अनुमति है.", + "period-seconds": "पीरियड (सेकंड में)", + "period-seconds-required": "पीरियड आवश्यक है.", + "generation-frequency-seconds": "जेनेरेशन फ़्रीक्वेंसी (सेकंड में)", + "generation-frequency-required": "जेनेरेशन फ़्रीक्वेंसी आवश्यक है.", + "min-generation-frequency-message": "कम-से-कम 60 सेकंड का न्यूनतम मान अनुमत है.", + "script-lang-tbel": "TBEL", + "script-lang-js": "JS", + "use-metadata-period-in-seconds-patterns": "सेकंड में अवधि के पैटर्न का उपयोग करें", + "use-metadata-period-in-seconds-patterns-hint": "यदि चुना गया, तो रूल नोड मैसेज मेटाडेटा या डेटा से सेकंड में इंटरवल पैटर्न का उपयोग करेगा, यह मानते हुए कि इंटरवल सेकंड में हैं.", + "period-in-seconds-pattern": "सेकंड में अवधि का पैटर्न", + "period-in-seconds-pattern-required": "सेकंड में अवधि का पैटर्न आवश्यक है", + "min-period-seconds-message": "केवल 60 सेकंड की न्यूनतम अवधि की अनुमति है.", + "originator": "ओरिजिनेटर", + "message-body": "मैसेज बॉडी", + "message-metadata": "मैसेज मेटाडेटा", + "generate": "जनरेट करें", + "current-rule-node": "वर्तमान रूल नोड", + "current-tenant": "वर्तमान टेनेंट", + "generator-function": "जेनेरेटर फ़ंक्शन", + "test-generator-function": "जेनेरेटर फ़ंक्शन टेस्ट करें", + "generator": "जेनेरेटर", + "test-filter-function": "फ़िल्टर फ़ंक्शन टेस्ट करें", + "test-switch-function": "स्विच फ़ंक्शन टेस्ट करें", + "test-transformer-function": "ट्रांसफ़ॉर्मर फ़ंक्शन टेस्ट करें", + "transformer": "ट्रांसफ़ॉर्मर", + "alarm-create-condition": "अलार्म क्रिएट कंडीशन", + "test-condition-function": "कंडीशन फ़ंक्शन टेस्ट करें", + "alarm-clear-condition": "अलार्म क्लियर कंडीशन", + "alarm-details-builder": "अलार्म डीटेल्स बिल्डर", + "test-details-function": "डीटेल्स फ़ंक्शन टेस्ट करें", + "alarm-type": "अलार्म टाइप", + "select-entity-types": "एंटिटी टाइप्स चुनें", + "alarm-type-required": "अलार्म टाइप आवश्यक है.", + "alarm-severity": "अलार्म की गंभीरता", + "alarm-severity-required": "अलार्म की गंभीरता आवश्यक है", + "alarm-severity-pattern": "अलार्म गंभीरता पैटर्न", + "alarm-status-filter": "अलार्म स्टेटस फ़िल्टर", + "alarm-status-list-empty": "अलार्म स्टेटस सूची खाली है", + "no-alarm-status-matching": "कोई उपयुक्त अलार्म स्टेटस नहीं मिला.", + "propagate": "अलार्म को संबंधित एंटिटीज़ तक प्रोपेगेट करें", + "propagate-to-owner": "अलार्म को एंटिटी ओनर (कस्टमर या टेनेंट) तक प्रोपेगेट करें", + "propagate-to-tenant": "अलार्म को टेनेंट तक प्रोपेगेट करें", + "condition": "शर्त", + "details": "विवरण", + "to-string": "स्ट्रिंग में बदलें", + "test-to-string-function": "To string फ़ंक्शन टेस्ट करें", + "from-template": "प्रेषक", + "from-template-required": "प्रेषक आवश्यक है", + "message-to-metadata": "मैसेज से मेटाडेटा", + "metadata-to-message": "मेटाडेटा से मैसेज", + "from-message": "मैसेज से", + "from-metadata": "मेटाडेटा से", + "to-template": "प्राप्तकर्ता", + "to-template-required": "To टेम्पलेट आवश्यक है", + "mail-address-list-template-hint": "कॉमा सेपरेटेड एड्रेस सूची, मेटाडेटा से वैल्यू के लिए ${metadataKey} और मैसेज बॉडी से वैल्यू के लिए $[messageKey] का उपयोग करें", + "cc-template": "Cc", + "bcc-template": "Bcc", + "subject-template": "सब्जेक्ट", + "subject-template-required": "सब्जेक्ट टेम्पलेट आवश्यक है", + "body-template": "बॉडी", + "body-template-required": "बॉडी टेम्पलेट आवश्यक है", + "dynamic-mail-body-type": "डायनामिक मेल बॉडी टाइप", + "mail-body-type": "मेल बॉडी टाइप", + "body-type-template": "बॉडी टाइप टेम्पलेट", + "reply-routing-configuration": "रिप्लाई रूटिंग कॉन्फ़िगरेशन", + "rpc-reply-routing-configuration-hint": "ये कॉन्फ़िगरेशन पैरामीटर्स सर्विस, सेशन और रिक्वेस्ट की पहचान करने के लिए मेटाडेटा की के नाम निर्दिष्ट करते हैं, ताकि रिप्लाई वापस भेजी जा सके.", + "reply-routing-configuration-hint": "ये कॉन्फ़िगरेशन पैरामीटर्स सर्विस और रिक्वेस्ट की पहचान करने के लिए मेटाडेटा की के नाम निर्दिष्ट करते हैं, ताकि रिप्लाई वापस भेजी जा सके.", + "request-id-metadata-attribute": "रिक्वेस्ट Id", + "service-id-metadata-attribute": "सर्विस Id", + "session-id-metadata-attribute": "सेशन Id", + "timeout-sec": "टाइमआउट (सेकंड में)", + "timeout-required": "टाइमआउट आवश्यक है", + "min-timeout-message": "केवल 0 न्यूनतम टाइमआउट मान अनुमत है.", + "endpoint-url-pattern": "एंडपॉइंट URL पैटर्न", + "endpoint-url-pattern-required": "एंडपॉइंट URL पैटर्न आवश्यक है", + "request-method": "रिक्वेस्ट मेथड", + "use-simple-client-http-factory": "सिंपल क्लाइंट HTTP फ़ैक्टरी का उपयोग करें", + "ignore-request-body": "रिक्वेस्ट बॉडी के बिना", + "parse-to-plain-text": "प्लेन टेक्स्ट में पार्स करें", + "parse-to-plain-text-hint": "यदि चुना गया, तो रिक्वेस्ट बॉडी मैसेज पेलोड JSON स्ट्रिंग से प्लेन टेक्स्ट में बदल दिया जाएगा, उदाहरण: msg = \"नमस्ते,\\t\"दुनिया\"\" को पार्स करके नमस्ते, \"दुनिया\" बनाया जाएगा", + "read-timeout": "रीड टाइमआउट (मिलीसेकंड में)", + "read-timeout-hint": "मान 0 का अर्थ है अनलिमिटेड टाइमआउट", + "max-parallel-requests-count": "पैरलल रिक्वेस्ट्स की अधिकतम संख्या", + "max-parallel-requests-count-hint": "मान 0 का अर्थ है पैरलल प्रोसेसिंग पर कोई सीमा नहीं", + "max-response-size": "मैक्स रिस्पॉन्स साइज (KB में)", + "max-response-size-hint": "HTTP मैसेजेस (जैसे JSON या XML पेलोड्स) को डिकोड या एनकोड करते समय डेटा बफ़र करने के लिए आवंटित मेमोरी की अधिकतम मात्रा", + "headers": "हेडर्स", + "headers-hint": "मेटाडेटा से वैल्यू के लिए ${metadataKey} और मैसेज बॉडी से वैल्यू के लिए $[messageKey] का उपयोग हेडर/वैल्यू फ़ील्ड्स में करें", + "header": "हेडर", + "header-required": "हेडर आवश्यक है", + "value": "वैल्यू", + "value-required": "वैल्यू आवश्यक है", + "topic-pattern": "टॉपिक पैटर्न", + "key-pattern": "की पैटर्न", + "key-pattern-hint": "वैकल्पिक. यदि एक वैध पार्टिशन नंबर दिया गया है, तो रिकॉर्ड भेजते समय वही उपयोग होगा. यदि कोई पार्टिशन निर्दिष्ट नहीं है, तो की का उपयोग किया जाएगा. यदि दोनों में से कोई भी निर्दिष्ट नहीं है, तो पार्टिशन राउंड-रॉबिन तरीके से असाइन किया जाएगा.", + "topic-pattern-required": "टॉपिक पैटर्न आवश्यक है", + "topic": "टॉपिक", + "topic-required": "टॉपिक आवश्यक है", + "bootstrap-servers": "बूटस्ट्रैप सर्वर्स", + "bootstrap-servers-required": "बूटस्ट्रैप सर्वर्स का मान आवश्यक है", + "other-properties": "अन्य प्रॉपर्टीज़", + "key": "की", + "key-required": "की आवश्यक है", + "retries": "फेल होने पर ऑटोमैटिक रीट्राई की संख्या", + "min-retries-message": "केवल 0 न्यूनतम रीट्राई की अनुमति है.", + "batch-size-bytes": "प्रोड्यूस बैच साइज (बाइट्स में)", + "min-batch-size-bytes-message": "केवल 0 न्यूनतम बैच साइज की अनुमति है.", + "linger-ms": "लोकल बफ़र करने का समय (ms)", + "min-linger-ms-message": "केवल 0 ms न्यूनतम मान की अनुमति है.", + "buffer-memory-bytes": "क्लाइंट बफ़र का अधिकतम आकार (बाइट्स में)", + "min-buffer-memory-message": "केवल 0 न्यूनतम बफ़र आकार की अनुमति है.", + "memory-buffer-size-range": "मेमोरी बफ़र आकार 0 और {{max}} KB के बीच होना चाहिए", + "acks": "पुष्टिकरणों की संख्या", + "topic-arn-pattern": "टॉपिक ARN पैटर्न", + "topic-arn-pattern-required": "टॉपिक ARN पैटर्न आवश्यक है", + "aws-access-key-id": "AWS Access Key ID", + "aws-access-key-id-required": "AWS Access Key ID आवश्यक है", + "aws-secret-access-key": "AWS Secret Access Key", + "aws-secret-access-key-required": "AWS Secret Access Key आवश्यक है", + "aws-region": "AWS Region", + "aws-region-required": "AWS Region आवश्यक है", + "exchange-name-pattern": "एक्सचेंज नाम पैटर्न", + "routing-key-pattern": "रूटिंग की पैटर्न", + "message-properties": "संदेश प्रॉपर्टीज़", + "host": "होस्ट", + "host-required": "होस्ट आवश्यक है", + "port": "पोर्ट", + "port-required": "पोर्ट आवश्यक है", + "port-range": "पोर्ट 1 से 65535 की रेंज में होना चाहिए.", + "virtual-host": "वर्चुअल होस्ट", + "username": "यूज़रनेम", + "password": "पासवर्ड", + "automatic-recovery": "ऑटोमैटिक रिकवरी", + "connection-timeout-ms": "कनेक्शन टाइमआउट (ms)", + "min-connection-timeout-ms-message": "केवल 0 ms न्यूनतम मान की अनुमति है.", + "handshake-timeout-ms": "हैंडशेक टाइमआउट (ms)", + "min-handshake-timeout-ms-message": "केवल 0 ms न्यूनतम मान की अनुमति है.", + "client-properties": "क्लाइंट प्रॉपर्टीज़", + "queue-url-pattern": "क्यू URL पैटर्न", + "queue-url-pattern-required": "क्यू URL पैटर्न आवश्यक है", + "delay-seconds": "डिले (सेकंड)", + "min-delay-seconds-message": "केवल 0 सेकंड न्यूनतम मान की अनुमति है.", + "max-delay-seconds-message": "केवल 900 सेकंड अधिकतम मान की अनुमति है.", + "name": "नाम", + "name-required": "नाम आवश्यक है", + "queue-type": "क्यू टाइप", + "sqs-queue-standard": "स्टैंडर्ड", + "sqs-queue-fifo": "FIFO", + "gcp-project-id": "GCP प्रोजेक्ट ID", + "gcp-project-id-required": "GCP प्रोजेक्ट ID आवश्यक है", + "gcp-service-account-key": "GCP सर्विस अकाउंट की फ़ाइल", + "gcp-service-account-key-required": "GCP सर्विस अकाउंट की फ़ाइल आवश्यक है", + "pubsub-topic-name": "टॉपिक नाम", + "pubsub-topic-name-required": "टॉपिक नाम आवश्यक है", + "message-attributes": "संदेश विशेषताएँ", + "message-attributes-hint": "मेटाडेटा से मान के लिए ${metadataKey} का उपयोग करें, name/value फ़ील्ड्स में मैसेज बॉडी से मान के लिए $[messageKey] का उपयोग करें", + "connect-timeout": "कनेक्शन टाइमआउट (सेकंड)", + "connect-timeout-required": "कनेक्शन टाइमआउट आवश्यक है.", + "connect-timeout-range": "कनेक्शन टाइमआउट 1 से 200 की रेंज में होना चाहिए.", + "client-id": "क्लाइंट ID", + "client-id-hint": "वैकल्पिक. ऑटो-जनरेटेड क्लाइंट ID के लिए इसे खाली छोड़ें. क्लाइंट ID निर्दिष्ट करते समय सावधान रहें. अधिकांश MQTT ब्रोकर्स समान क्लाइंट ID के साथ कई कनेक्शनों की अनुमति नहीं देंगे. ऐसे ब्रोकर्स से कनेक्ट होने के लिए आपका MQTT क्लाइंट ID यूनिक होना चाहिए. जब प्लेटफ़ॉर्म माइक्रो-सर्विस मोड में चल रहा होता है, तो प्रत्येक माइक्रो-सर्विस में रूल नोड की कॉपी लॉन्च होती है. यह अपने-आप ही समान ID वाले कई MQTT क्लाइंट्स की ओर ले जाता है और रूल नोड की विफलता का कारण बन सकता है. ऐसी विफलताओं से बचने के लिए नीचे दिए गए \"क्लाइंट ID के साथ सर्विस ID को उपसर्ग के रूप में जोड़ें\" विकल्प को सक्षम करें.", + "append-client-id-suffix": "क्लाइंट ID के साथ सर्विस ID को उपसर्ग के रूप में जोड़ें", + "client-id-suffix-hint": "वैकल्पिक. तब लागू होता है जब \"Client ID\" स्पष्ट रूप से निर्दिष्ट हो. अगर चुना गया, तो Service ID को क्लाइंट ID के साथ उपसर्ग के रूप में जोड़ा जाएगा. यह तब विफलताओं से बचने में मदद करता है जब प्लेटफ़ॉर्म माइक्रो-सर्विस मोड में चल रहा हो.", + "device-id": "डिवाइस ID", + "device-id-required": "डिवाइस ID आवश्यक है.", + "clean-session": "क्लीन सेशन", + "enable-ssl": "SSL सक्षम करें", + "credentials": "क्रेडेंशियल्स", + "credentials-type": "क्रेडेंशियल्स प्रकार", + "credentials-type-required": "क्रेडेंशियल्स प्रकार आवश्यक है.", + "credentials-anonymous": "Anonymous", + "credentials-basic": "Basic", + "credentials-pem": "PEM", + "credentials-pem-hint": "कम-से-कम सर्वर CA सर्टिफ़िकेट फ़ाइल या क्लाइंट सर्टिफ़िकेट और क्लाइंट प्राइवेट की फ़ाइलों की जोड़ी आवश्यक है", + "credentials-sas": "Shared Access Signature", + "sas-key": "SAS Key", + "sas-key-required": "SAS Key आवश्यक है.", + "hostname": "होस्टनेम", + "hostname-required": "होस्टनेम आवश्यक है.", + "azure-ca-cert": "CA सर्टिफ़िकेट फ़ाइल", + "username-required": "यूज़रनेम आवश्यक है.", + "password-required": "पासवर्ड आवश्यक है.", + "ca-cert": "सर्वर CA सर्टिफ़िकेट फ़ाइल", + "private-key": "क्लाइंट प्राइवेट की फ़ाइल", + "cert": "क्लाइंट सर्टिफ़िकेट फ़ाइल", + "no-file": "कोई फ़ाइल चयनित नहीं.", + "drop-file": "फ़ाइल को ड्रॉप करें या अपलोड करने के लिए फ़ाइल चुनने हेतु क्लिक करें.", + "private-key-password": "प्राइवेट की पासवर्ड", + "use-system-smtp-settings": "सिस्टम SMTP सेटिंग्स का उपयोग करें", + "use-metadata-dynamic-interval": "डायनेमिक इंटरवल का उपयोग करें", + "metadata-dynamic-interval-hint": "इंटरवल प्रारंभ और समाप्ति इनपुट फ़ील्ड्स टेम्पलेटाइज़ेशन को सपोर्ट करते हैं. ध्यान दें कि सब्स्टिट्यूट किया गया टेम्पलेट मान मिलीसेकंड्स में सेट होना चाहिए. मैसेज से मान निकालने के लिए $[messageKey] और मेटाडेटा से मान निकालने के लिए ${metadataKey} का उपयोग करें.", + "use-metadata-interval-patterns-hint": "अगर चुना गया, तो रूल नोड मैसेज मेटाडेटा या डेटा से प्रारंभ और समाप्ति इंटरवल पैटर्न का उपयोग करेगा, यह मानते हुए कि इंटरवल्स मिलीसेकंड्स में हैं.", + "use-message-alarm-data": "मैसेज अलार्म डेटा का उपयोग करें", + "overwrite-alarm-details": "अलार्म विवरण को ओवरराइट करें", + "use-alarm-severity-pattern": "अलार्म सीवियरिटी /पैटर्न का उपयोग करें", + "check-all-keys": "जाँचें कि सभी निर्दिष्ट फ़ील्ड मौजूद हैं", + "check-all-keys-hint": "यदि चुना गया, तो यह जाँचता है कि संदेश डेटा और मेटाडेटा में सभी निर्दिष्ट कुंजियाँ मौजूद हैं।", + "check-relation-to-specific-entity": "विशिष्ट एंटिटी के साथ संबंध की जाँच करें", + "check-relation-to-specific-entity-tooltip": "यदि सक्षम किया गया, तो यह किसी विशिष्ट एंटिटी के साथ संबंध की उपस्थिति की जाँच करता है, अन्यथा किसी भी एंटिटी के साथ संबंध की उपस्थिति की जाँच करता है। दोनों ही मामलों में, संबंध खोज कॉन्फ़िगर की गई दिशा और प्रकार पर आधारित होती है।", + "check-relation-hint": "दिशा और संबंध प्रकार के आधार पर, किसी विशिष्ट एंटिटी या किसी भी एंटिटी के साथ संबंध के अस्तित्व की जाँच करता है।", + "delete-relation-with-specific-entity": "विशिष्ट एंटिटी के साथ संबंध हटाएँ", + "delete-relation-with-specific-entity-hint": "यदि सक्षम किया गया, तो केवल एक विशिष्ट एंटिटी के साथ संबंध हटाया जाएगा। अन्यथा, संबंध सभी मिलती-जुलती एंटिटीज़ के साथ हटाया जाएगा।", + "delete-relation-hint": "निर्धारित दिशा और प्रकार के आधार पर, आने वाले संदेश के ओरिजिनेटर से निर्दिष्ट एंटिटी या एंटिटीज़ की सूची तक संबंध हटाता है।", + "remove-current-relations": "वर्तमान संबंध हटाएँ", + "remove-current-relations-hint": "दिशा और प्रकार के आधार पर, आने वाले संदेश के ओरिजिनेटर से वर्तमान संबंध हटाता है।", + "change-originator-to-related-entity": "ओरिजिनेटर को संबंधित एंटिटी में बदलें", + "change-originator-to-related-entity-hint": "सबमिट किए गए संदेश को किसी दूसरी एंटिटी से आए संदेश के रूप में प्रोसेस करने के लिए उपयोग किया जाता है।", + "start-interval": "इंटरवल प्रारंभ", + "end-interval": "इंटरवल समाप्ति", + "start-interval-required": "इंटरवल प्रारंभ आवश्यक है।", + "end-interval-required": "इंटरवल समाप्ति आवश्यक है।", + "smtp-protocol": "प्रोटोकॉल", + "smtp-host": "SMTP होस्ट", + "smtp-host-required": "SMTP होस्ट आवश्यक है।", + "smtp-port": "SMTP पोर्ट", + "smtp-port-required": "आपको SMTP पोर्ट प्रदान करना होगा।", + "smtp-port-range": "SMTP पोर्ट 1 से 65535 की रेंज में होना चाहिए।", + "timeout-msec": "टाइमआउट (ms)", + "min-timeout-msec-message": "केवल 0 ms न्यूनतम मान की अनुमति है।", + "enter-username": "यूज़रनेम दर्ज करें", + "enter-password": "पासवर्ड दर्ज करें", + "enable-tls": "TLS सक्षम करें", + "tls-version": "TLS संस्करण", + "enable-proxy": "प्रॉक्सी सक्षम करें", + "use-system-proxy-properties": "सिस्टम प्रॉक्सी गुणों का उपयोग करें", + "proxy-host": "प्रॉक्सी होस्ट", + "proxy-host-required": "प्रॉक्सी होस्ट आवश्यक है।", + "proxy-port": "प्रॉक्सी पोर्ट", + "proxy-port-required": "प्रॉक्सी पोर्ट आवश्यक है।", + "proxy-port-range": "प्रॉक्सी पोर्ट 1 से 65535 की रेंज में होना चाहिए।", + "proxy-user": "प्रॉक्सी उपयोगकर्ता", + "proxy-password": "प्रॉक्सी पासवर्ड", + "proxy-scheme": "प्रॉक्सी स्कीम", + "numbers-to-template": "फ़ोन नंबर 'To' टेम्पलेट", + "numbers-to-template-required": "फ़ोन नंबर 'To' टेम्पलेट आवश्यक है।", + "numbers-to-template-hint": "कॉमा से अलग किए गए फ़ोन नंबर, मेटाडेटा से मान लेने के लिए ${metadataKey} का उपयोग करें, और मैसेज बॉडी से मान लेने के लिए $[messageKey] का उपयोग करें", + "sms-message-template": "SMS मैसेज टेम्पलेट", + "sms-message-template-required": "SMS मैसेज टेम्पलेट आवश्यक है।", + "use-system-sms-settings": "सिस्टम SMS प्रोवाइडर सेटिंग्स का उपयोग करें", + "min-period-0-seconds-message": "केवल 0 सेकंड का न्यूनतम पीरियड अनुमत है।", + "max-pending-messages": "अधिकतम पेंडिंग मैसेज", + "max-pending-messages-required": "अधिकतम पेंडिंग मैसेज आवश्यक है।", + "max-pending-messages-range": "अधिकतम पेंडिंग मैसेज 1 से 100000 के बीच होना चाहिए।", + "originator-types-filter": "ओरिजिनेटर टाइप फ़िल्टर", + "interval-seconds": "इंटरवल (सेकंड में)", + "interval-seconds-required": "इंटरवल आवश्यक है।", + "int-range": "मान अधिकतम पूर्णांक सीमा (2147483648) से अधिक नहीं होना चाहिए।", + "min-interval-seconds-message": "केवल 1 सेकंड का न्यूनतम इंटरवल अनुमत है।", + "output-timeseries-key-prefix": "आउटपुट टाइम सीरीज़ की प्रीफ़िक्स", + "output-timeseries-key-prefix-required": "आउटपुट टाइम सीरीज़ की प्रीफ़िक्स आवश्यक है।", + "separator-hint": "फ़ील्ड इनपुट पूरा करने के लिए आपको \"एंटर\" दबाना होगा।", + "select-details": "विवरण चुनें", + "entity-details-id": "आईडी", + "entity-details-title": "टाइटल", + "entity-details-country": "देश", + "entity-details-state": "राज्य", + "entity-details-city": "शहर", + "entity-details-zip": "ज़िप", + "entity-details-address": "पता", + "entity-details-address2": "पता 2", + "entity-details-additional_info": "अतिरिक्त जानकारी", + "entity-details-phone": "फ़ोन", + "entity-details-email": "ईमेल", + "email-sender": "ईमेल प्रेषक", + "fields-to-check": "जाँचने वाले फ़ील्ड्स", + "add-detail": "डिटेल जोड़ें", + "check-all-keys-tooltip": "यदि सक्षम है, तो इनकमिंग संदेश और उसकी मेटाडाटा में दिए गए संदेश और मेटाडाटा फ़ील्ड-नामों की सूची में शामिल सभी फ़ील्ड्स की मौजूदगी की जाँच करता है।", + "fields-to-check-hint": "फ़ील्ड नाम इनपुट पूरा करने के लिए \"एंटर\" दबाएँ। एक से अधिक फ़ील्ड नाम समर्थित हैं।", + "entity-details-list-empty": "कम से कम एक डिटेल चुनी जानी चाहिए।", + "alarm-status": "अलार्म स्टेटस", + "alarm-required": "कम से कम एक अलार्म स्टेटस चुना जाना चाहिए।", + "no-entity-details-matching": "कोई मिलते-जुलते एंटिटी विवरण नहीं मिले।", + "custom-table-name": "कस्टम टेबल नाम", + "custom-table-name-required": "टेबल नाम आवश्यक है।", + "custom-table-hint": "टेबल आपके Cassandra क्लस्टर में बनाई जानी चाहिए और उसका नाम 'cs_tb_' प्रीफ़िक्स से शुरू होना चाहिए ताकि डेटा कॉमन TB टेबल्स में न जाए। यहाँ टेबल नाम 'cs_tb_' प्रीफ़िक्स के बिना दर्ज करें।", + "message-field": "मैसेज फ़ील्ड", + "message-field-required": "मैसेज फ़ील्ड आवश्यक है।", + "table-col": "टेबल कॉलम", + "table-col-required": "टेबल कॉलम आवश्यक है।", + "latitude-field-name": "लैटिट्यूड फ़ील्ड नाम", + "longitude-field-name": "लॉन्गिट्यूड फ़ील्ड नाम", + "latitude-field-name-required": "लैटिट्यूड फ़ील्ड नाम आवश्यक है।", + "longitude-field-name-required": "लॉन्गिट्यूड फ़ील्ड नाम आवश्यक है।", + "fetch-perimeter-info-from-metadata": "मेटाडेटा से परिमीटर की जानकारी प्राप्त करें", + "fetch-perimeter-info-from-metadata-tooltip": "यदि परिमीटर प्रकार 'पॉलीगॉन' पर सेट है, तो मेटाडेटा फ़ील्ड '{{perimeterKeyName}}' का मान बिना अतिरिक्त पार्सिंग के परिमीटर डेफ़िनिशन के रूप में उपयोग किया जाएगा। अन्यथा, यदि परिमीटर प्रकार 'सर्कल' पर सेट है, तो मेटाडेटा फ़ील्ड '{{perimeterKeyName}}' के मान को पार्स करके 'latitude', 'longitude', 'radius', 'radiusUnit' फ़ील्ड निकाले जाएँगे, जो सर्कल परिमीटर डेफ़िनिशन के लिए उपयोग होते हैं।", + "perimeter-key-name": "परिमीटर की कुंजी का नाम", + "perimeter-key-name-hint": "मेटाडेटा फ़ील्ड नाम जिसमें परिमीटर की जानकारी होती है।", + "perimeter-key-name-required": "परिमीटर की कुंजी का नाम आवश्यक है।", + "perimeter-circle": "सर्कल", + "perimeter-polygon": "पॉलीगॉन", + "perimeter-type": "परिमीटर प्रकार", + "circle-center-latitude": "केंद्र का लैटिट्यूड", + "circle-center-latitude-required": "केंद्र का लैटिट्यूड आवश्यक है।", + "circle-center-longitude": "केंद्र का लॉन्गिट्यूड", + "circle-center-longitude-required": "केंद्र का लॉन्गिट्यूड आवश्यक है।", + "range-unit-meter": "मीटर", + "range-unit-kilometer": "किलोमीटर", + "range-unit-foot": "फ़ुट", + "range-unit-mile": "माइल", + "range-unit-nautical-mile": "समुद्री माइल", + "range-units": "रेंज इकाइयाँ", + "range-units-required": "रेंज इकाइयाँ आवश्यक हैं।", + "range": "रेंज", + "range-required": "रेंज आवश्यक है।", + "polygon-definition": "पॉलीगॉन डेफ़िनिशन", + "polygon-definition-required": "पॉलीगॉन डेफ़िनिशन आवश्यक है।", + "polygon-definition-hint": "पॉलीगॉन को मैन्युअली परिभाषित करने के लिए निम्न फ़ॉर्मेट का उपयोग करें: [[lat1,lon1],[lat2,lon2], ... ,[latN,lonN]].", + "min-inside-duration": "न्यूनतम भीतर रहने की अवधि", + "min-inside-duration-value-required": "न्यूनतम भीतर रहने की अवधि आवश्यक है।", + "min-inside-duration-time-unit": "न्यूनतम भीतर रहने की अवधि की समय इकाई", + "min-outside-duration": "न्यूनतम बाहर रहने की अवधि", + "min-outside-duration-value-required": "न्यूनतम बाहर रहने की अवधि आवश्यक है।", + "min-outside-duration-time-unit": "न्यूनतम बाहर रहने की अवधि की समय इकाई", + "tell-failure-if-absent": "असफलता बताएँ", + "tell-failure-if-absent-hint": "यदि चुनी गई कुंजियों में से कम से कम एक भी मौजूद नहीं है, तो आउटबाउंड संदेश \"असफलता\" रिपोर्ट करेगा।", + "get-latest-value-with-ts": "लेटेस्ट टेलीमेट्री वैल्यूज़ के लिए टाइमस्टैम्प प्राप्त करें", + "get-latest-value-with-ts-hint": "यदि चयनित है, तो लेटेस्ट टेलीमेट्री वैल्यूज़ में टाइमस्टैम्प भी शामिल होगा, उदाहरण के लिए: \"temp\": \"{\"ts\":1574329385897, \"value\":42}\"", + "ignore-null-strings": "नल (null) स्ट्रिंग्स को नज़रअंदाज़ करें", + "ignore-null-strings-hint": "यदि चयनित है, तो रूल नोड खाली मान वाले एंटिटी फ़ील्ड्स को नज़रअंदाज़ करेगा।", + "add-metadata-key-values-as-kafka-headers": "मैसेज मेटाडेटा की की-वैल्यू पेयर्स को Kafka रिकॉर्ड हेडर्स में जोड़ें", + "add-metadata-key-values-as-kafka-headers-hint": "यदि चयनित है, तो मैसेज मेटाडेटा से की-वैल्यू पेयर्स को आउटगोइंग रिकॉर्ड्स के हेडर्स में प्री-डिफ़ाइंड कैरेक्टर सेट एनकोडिंग के साथ बाइट ऐरेज़ के रूप में जोड़ा जाएगा।", + "charset-encoding": "कैरेक्टर सेट एनकोडिंग", + "charset-encoding-required": "कैरेक्टर सेट एनकोडिंग आवश्यक है।", + "charset-us-ascii": "US-ASCII", + "charset-iso-8859-1": "ISO-8859-1", + "charset-utf-8": "UTF-8", + "charset-utf-16be": "UTF-16BE", + "charset-utf-16le": "UTF-16LE", + "charset-utf-16": "UTF-16", + "select-queue-hint": "क्यू का नाम ड्रॉप-डाउन सूची से चुना जा सकता है या आप कस्टम नाम जोड़ सकते हैं।", + "device-profile-node-hint": "यदि आपके पास अवधि या दोहराई जाने वाली कंडीशन हैं, तो अलार्म स्टेट के मूल्यांकन की निरंतरता सुनिश्चित करने के लिए यह उपयोगी है।", + "persist-alarm-rules": "अलार्म रूल्स की स्थिति को सुरक्षित रखें", + "persist-alarm-rules-hint": "यदि सक्षम है, तो रूल नोड प्रोसेसिंग की स्थिति को डेटाबेस में सहेजेगा।", + "fetch-alarm-rules": "अलार्म रूल्स की स्थिति प्राप्त करें", + "fetch-alarm-rules-hint": "यदि सक्षम है, तो रूल नोड इनिशियलाइज़ेशन पर प्रोसेसिंग की स्थिति को पुनर्स्थापित करेगा और यह सुनिश्चित करेगा कि सर्वर रीस्टार्ट के बाद भी अलार्म उठें। अन्यथा, स्थिति पहली बार डिवाइस से मैसेज आने पर पुनर्स्थापित होगी।", + "input-value-key": "इनपुट वैल्यू की", + "input-value-key-required": "इनपुट वैल्यू की आवश्यक है।", + "output-value-key": "आउटपुट वैल्यू की", + "output-value-key-required": "आउटपुट वैल्यू की आवश्यक है।", + "number-of-digits-after-floating-point": "दशमलव बिंदु के बाद अंकों की संख्या", + "number-of-digits-after-floating-point-range": "दशमलव बिंदु के बाद अंकों की संख्या 0 से 15 के बीच होनी चाहिए।", + "failure-if-delta-negative": "यदि डेल्टा निगेटिव हो तो असफलता बताएँ", + "failure-if-delta-negative-tooltip": "यदि डेल्टा मान निगेटिव है, तो रूल नोड मैसेज प्रोसेसिंग को असफल कर देगा।", + "use-caching": "कैशिंग का उपयोग करें", + "use-caching-tooltip": "परफॉर्मेंस सुधारने के लिए रूल नोड इनकमिंग मैसेज से आने वाली \"{{inputValueKey}}\" वैल्यू को कैश करेगा। ध्यान दें, यदि आप कहीं और \"{{inputValueKey}}\" वैल्यू बदलते हैं तो कैश अपडेट नहीं होगा।", + "add-time-difference-between-readings": "\"{{inputValueKey}}\" रीडिंग्स के बीच समयांतर जोड़ें", + "add-time-difference-between-readings-tooltip": "यदि सक्षम है, तो रूल नोड आउटबाउंड मैसेज में \"{{periodValueKey}}\" जोड़ देगा।", + "period-value-key": "पीरियड वैल्यू की", + "period-value-key-required": "पीरियड वैल्यू की आवश्यक है।", + "general-pattern-hint": "मेटाडेटा से मान के लिए ${metadataKey} और मैसेज बॉडी से मान के लिए $[messageKey] का उपयोग करें।", + "alarm-severity-pattern-hint": "मेटाडेटा से मान लेने के लिए ${metadataKey} और मैसेज बॉडी से मान लेने के लिए $[messageKey] का उपयोग करें। अलार्म की गंभीरता सिस्टम वैल्यू होनी चाहिए (CRITICAL, MAJOR आदि)।", + "output-node-name-hint": "रूल नोड नाम आउटपुट मैसेज के रिलेशन प्रकार के अनुरूप होता है और कॉलर रूल चेन में मैसेज को अन्य रूल नोड्स तक फॉरवर्ड करने के लिए उपयोग किया जाता है।", + "use-server-ts": "सर्वर टाइमस्टैम्प का उपयोग करें", + "use-server-ts-hint": "ऐसे टाइम-सीरीज़ डेटा के लिए जो स्पष्ट टाइमस्टैम्प नहीं भेजते, सर्वर का वर्तमान टाइमस्टैम्प उपयोग करें। यह कई स्रोतों से आने वाले या आउट-ऑफ-ऑर्डर मैसेजेस प्रोसेस करते समय सही क्रम बनाए रखने में मदद करता है।", + "kv-map-pattern-hint": "सभी इनपुट फ़ील्ड्स टेम्पलेटाइज़ेशन सपोर्ट करते हैं। मैसेज से मान निकालने के लिए $[messageKey] और मेटाडेटा से मान निकालने के लिए ${metadataKey} का उपयोग करें।", + "kv-map-single-pattern-hint": "इनपुट फ़ील्ड टेम्पलेटाइज़ेशन सपोर्ट करता है। मैसेज से मान निकालने के लिए $[messageKey] और मेटाडेटा से मान निकालने के लिए ${metadataKey} का उपयोग करें।", + "shared-scope": "शेयर्ड स्कोप", + "server-scope": "सर्वर स्कोप", + "client-scope": "क्लाइंट स्कोप", + "attribute-type": "विशेषता", + "attribute-type-description": "डेटाबेस से विशेषता मान प्राप्त करें", + "attribute-type-result-description": "परिणाम को डेटाबेस में एंटिटी विशेषता के रूप में सहेजें", + "constant-type": "कॉनस्टैंट", + "constant-type-description": "कॉनस्टैंट मान परिभाषित करें", + "time-series-type": "टाइम सीरीज़", + "time-series-type-description": "डाटाबेस से नवीनतम टाइम सीरीज़ मान प्राप्त करें", + "time-series-type-result-description": "परिणाम को डाटाबेस में एंटिटी टाइम सीरीज़ के रूप में सहेजें", + "message-body-type": "मैसेज", + "message-body-type-description": "इनकमिंग मैसेज से आर्ग्युमेंट मान प्राप्त करें", + "message-body-type-result-description": "परिणाम को आउटगोइंग मैसेज में जोड़ें", + "message-metadata-type": "मेटाडेटा", + "message-metadata-type-description": "इनकमिंग मैसेज मेटाडेटा से आर्ग्युमेंट मान प्राप्त करें", + "message-metadata-result-description": "परिणाम को आउटगोइंग मैसेज मेटाडेटा में जोड़ें", + "argument-tile": "आर्ग्युमेंट्स", + "no-arguments-prompt": "कोई आर्ग्युमेंट कॉन्फ़िगर नहीं किया गया है", + "result-title": "परिणाम", + "functions-field-input": "फ़ंक्शन्स", + "no-option-found": "कोई विकल्प नहीं मिला", + "argument-source-field-input": "स्रोत", + "argument-source-field-input-required": "आर्ग्युमेंट का स्रोत आवश्यक है.", + "argument-key-field-input": "की", + "argument-key-field-input-required": "आर्ग्युमेंट की आवश्यक है.", + "constant-value-field-input": "कॉनस्टैंट मान", + "constant-value-field-input-required": "कॉनस्टैंट मान आवश्यक है.", + "attribute-scope-field-input": "विशेषता स्कोप", + "attribute-scope-field-input-required": "विशेषता स्कोप आवश्यक है.", + "default-value-field-input": "डिफ़ॉल्ट मान", + "type-field-input": "टाइप", + "type-field-input-required": "टाइप आवश्यक है.", + "key-field-input": "की", + "add-entity-type": "एंटिटी टाइप जोड़ें", + "add-device-profile": "डिवाइस प्रोफ़ाइल जोड़ें", + "key-field-input-required": "की आवश्यक है.", + "number-floating-point-field-input": "दशमलव के बाद अंकों की संख्या", + "number-floating-point-field-input-hint": "परिणाम को पूर्णांक में बदलने के लिए 0 का उपयोग करें", + "add-to-message-field-input": "मैसेज में जोड़ें", + "add-to-metadata-field-input": "मेटाडेटा में जोड़ें", + "custom-expression-field-input": "गणितीय अभिव्यक्ति", + "custom-expression-field-input-required": "गणितीय अभिव्यक्ति आवश्यक है", + "custom-expression-field-input-hint": "जिसका मूल्यांकन करना है, वह गणितीय अभिव्यक्ति निर्दिष्ट करें। डिफ़ॉल्ट अभिव्यक्ति दिखाती है कि फ़ारेनहाइट को सेल्सियस में कैसे बदला जाए।", + "retained-message": "रिटेन्ड", + "attributes-mapping": "विशेषताओं की मैपिंग", + "latest-telemetry-mapping": "नवीनतम टेलीमेट्री मैपिंग", + "add-mapped-attribute-to": "मैप की गई विशेषताओं को इसमें जोड़ें", + "add-mapped-latest-telemetry-to": "मैप की गई नवीनतम टेलीमेट्री को इसमें जोड़ें", + "add-mapped-fields-to": "मैप किए गए फ़ील्ड्स को इसमें जोड़ें", + "add-selected-details-to": "चुने गए विवरण इसमें जोड़ें", + "clear-selected-types": "चुने गए टाइप्स साफ़ करें", + "clear-selected-details": "चुने गए विवरण साफ़ करें", + "clear-selected-fields": "चुने गए फ़ील्ड्स साफ़ करें", + "clear-selected-keys": "चुनी गई कीज़ साफ़ करें", + "geofence-configuration": "जियोफेंस कॉन्फ़िगरेशन", + "coordinate-field-names": "कोऑर्डिनेट फ़ील्ड नाम", + "coordinate-field-hint": "रूल नोड मैसेज से दिए गए फ़ील्ड प्राप्त करने की कोशिश करेगा। यदि वे वहाँ मौजूद नहीं हैं, तो उन्हें मेटाडेटा में खोजेगा।", + "presence-monitoring-strategy": "उपस्थिति मॉनिटरिंग स्ट्रैटेजी", + "presence-monitoring-strategy-on-first-message": "पहले मैसेज पर", + "presence-monitoring-strategy-on-each-message": "हर मैसेज पर", + "presence-monitoring-strategy-on-first-message-hint": "कॉन्फ़िगर की गई न्यूनतम अवधि, पिछली उपस्थिति स्थिति 'प्रवेश किया' या 'बाहर निकला' के अपडेट के बाद बीत जाने पर, पहले मैसेज पर उपस्थिति स्टेटस 'अंदर' या 'बाहर' की रिपोर्ट करता है।", + "presence-monitoring-strategy-on-each-message-hint": "उपस्थिति स्टेटस 'प्रवेश किया' या 'बाहर निकला' के अपडेट के बाद, हर मैसेज पर उपस्थिति स्टेटस 'अंदर' या 'बाहर' की रिपोर्ट करता है।", + "fetch-credentials-to": "क्रेडेंशियल्स यहाँ फ़ेच करें", + "add-originator-attributes-to": "ओरिजिनेटर विशेषताएँ इसमें जोड़ें", + "originator-attributes": "ओरिजिनेटर विशेषताएँ", + "fetch-latest-telemetry-with-timestamp": "नवीनतम टेलीमेट्री टाइमस्टैम्प सहित फ़ेच करें", + "fetch-latest-telemetry-with-timestamp-tooltip": "यदि चुना गया, तो नवीनतम टेलीमेट्री मान टाइमस्टैम्प सहित आउटबाउंड मेटाडेटा में जोड़ दिए जाएँगे, जैसे: \"{{latestTsKeyName}}\": \"{\"ts\":1574329385897, \"value\":42}\"", + "tell-failure": "यदि कोई भी विशेषता गायब हो तो विफलता बताएँ", + "tell-failure-tooltip": "यदि चुनी हुई कीज़ में से कम से कम एक भी मौजूद नहीं है, तो आउटबाउंड मैसेज \"विफलता\" रिपोर्ट करेगा।", + "created-time": "बनाए जाने का समय", + "chip-help": "फील्ड {{inputName}} का इनपुट पूरा करने के लिए 'Enter' दबाएँ।\n{{inputName}} को हटाने के लिए 'Backspace' दबाएँ।\nएक से अधिक मान समर्थित हैं।", + "detail": "विवरण", + "field-name": "फ़ील्ड नाम", + "device-profile": "डिवाइस प्रोफ़ाइल", + "entity-type": "एंटिटी टाइप", + "message-type": "मैसेज टाइप", + "timeseries-key": "टाइम सीरीज़ की", + "type": "टाइप", + "first-name": "पहला नाम", + "last-name": "अंतिम नाम", + "label": "लेबल", + "originator-fields-mapping": "ओरिजिनेटर फ़ील्ड मैपिंग", + "add-mapped-originator-fields-to": "मैप किए गए ओरिजिनेटर फ़ील्ड्स इसमें जोड़ें", + "fields": "फ़ील्ड्स", + "skip-empty-fields": "खाली फ़ील्ड्स को छोड़ें", + "skip-empty-fields-tooltip": "जिन फ़ील्ड्स के मान खाली होंगे, उन्हें आउटपुट मैसेज/आउटपुट मेटाडेटा में नहीं जोड़ा जाएगा।", + "fetch-interval": "फ़ेच इंटरवल", + "fetch-strategy": "फ़ेच स्ट्रैटेजी", + "fetch-timeseries-from-to": "टाइम सीरीज़ {{startInterval}} {{startIntervalTimeUnit}} पहले से {{endInterval}} {{endIntervalTimeUnit}} पहले तक फ़ेच करें।", + "fetch-timeseries-from-to-invalid": "टाइम सीरीज़ फ़ेच अमान्य है (\"इंटरवल स्टार्ट\" \"इंटरवल एंड\" से कम होना चाहिए)।", + "use-metadata-dynamic-interval-tooltip": "यदि चुना गया, तो रूल नोड मैसेज और मेटाडेटा पैटर्न के आधार पर डायनेमिक इंटरवल स्टार्ट और एंड का उपयोग करेगा।", + "all-mode-hint": "यदि फ़ेच मोड \"सभी\" चुना गया है, तो रूल नोड कॉन्फ़िगर किए गए क्वेरी पैरामीटर्स के साथ फ़ेच इंटरवल से टेलीमेट्री प्राप्त करेगा।", + "first-mode-hint": "यदि फ़ेच मोड \"पहला\" चुना गया है, तो रूल नोड फ़ेच इंटरवल की शुरुआत के सबसे नज़दीक की टेलीमेट्री प्राप्त करेगा।", + "last-mode-hint": "यदि फ़ेच मोड \"आख़िरी\" चुना गया है, तो रूल नोड फ़ेच इंटरवल के अंत के सबसे नज़दीक की टेलीमेट्री प्राप्त करेगा।", + "ascending": "आरोही", + "descending": "अवरोही", + "min": "न्यूनतम", + "max": "अधिकतम", + "average": "औसत", + "sum": "योग", + "count": "गिनती", + "none": "कोई नहीं", + "last-level-relation-tooltip": "यदि चुना गया, तो रूल नोड केवल अधिकतम रिलेशन लेवल में सेट किए गए लेवल पर ही संबंधित एंटिटीज़ को खोजेगा।", + "last-level-device-relation-tooltip": "यदि चुना गया, तो रूल नोड केवल अधिकतम रिलेशन लेवल में सेट किए गए लेवल पर ही संबंधित डिवाइस को खोजेगा।", + "data-to-fetch": "फ़ेच करने वाला डेटा", + "mapping-of-customers": "कस्टमर की मैपिंग", + "map-fields-required": "सभी मैपिंग फ़ील्ड ज़रूरी हैं।", + "attributes": "विशेषताएँ", + "related-device-attributes": "संबंधित डिवाइस की विशेषताएँ", + "add-selected-attributes-to": "चुनी हुई विशेषताएँ इसमें जोड़ें", + "device-profiles": "डिवाइस प्रोफ़ाइल्स", + "mapping-of-tenant": "टेनेंट की मैपिंग", + "add-attribute-key": "एट्रिब्यूट की जोड़ें", + "message-template": "संदेश टेम्पलेट", + "message-template-required": "संदेश टेम्पलेट ज़रूरी है", + "use-system-slack-settings": "सिस्टम Slack प्रदाता सेटिंग्स का उपयोग करें", + "slack-api-token": "Slack API टोकन", + "slack-api-token-required": "Slack API टोकन ज़रूरी है", + "keys-mapping": "कुंजियों की मैपिंग", + "add-key": "कुंजी जोड़ें", + "recipients": "प्राप्तकर्ता", + "message-subject-and-content": "संदेश का विषय और सामग्री", + "template-rules-hint": "दोनों इनपुट फ़ील्ड्स टेम्पलेटाइज़ेशन को सपोर्ट करते हैं। मैसेज से मान निकालने के लिए $[messageKey] और मैसेज मेटाडेटा से मान निकालने के लिए ${metadataKey} का उपयोग करें।", + "originator-customer-desc": "इनकमिंग मैसेज के ओरिजिनेटर के कस्टमर को नए ओरिजिनेटर के रूप में उपयोग करें।", + "originator-tenant-desc": "वर्तमान टेनेंट को नए ओरिजिनेटर के रूप में उपयोग करें।", + "originator-related-entity-desc": "संबंधित एंटिटी को नए ओरिजिनेटर के रूप में उपयोग करें। लुकअप कॉन्फ़िगर किए गए रिलेशन टाइप और डायरेक्शन के आधार पर होगा।", + "originator-alarm-originator-desc": "अलार्म ओरिजिनेटर को नए ओरिजिनेटर के रूप में उपयोग करें। केवल तब जब इनकमिंग मैसेज ओरिजिनेटर अलार्म एंटिटी हो।", + "originator-entity-by-name-pattern-desc": "डेटाबेस से प्राप्त एंटिटी को नए ओरिजिनेटर के रूप में उपयोग करें। लुकअप एंटिटी टाइप और दिए गए नाम पैटर्न के आधार पर होगा।", + "email-from-template-hint": "मैसेज से मान निकालने के लिए $[messageKey] और मेटाडेटा से मान निकालने के लिए ${metadataKey} का उपयोग करें।", + "recipients-block-main-hint": "कॉमा से अलग की गई एड्रेस सूची। सभी इनपुट फ़ील्ड्स टेम्पलेटाइज़ेशन को सपोर्ट करते हैं। मैसेज से मान निकालने के लिए $[messageKey] और मेटाडेटा से मान निकालने के लिए ${metadataKey} का उपयोग करें।", + "forward-msg-default-rule-chain": "मैसेज को ओरिजिनेटर की डिफ़ॉल्ट रूल चेन पर फ़ॉरवर्ड करें", + "forward-msg-default-rule-chain-tooltip": "यदि सक्षम किया गया है, तो मैसेज को ओरिजिनेटर की डिफ़ॉल्ट रूल चेन पर फ़ॉरवर्ड किया जाएगा, या कॉन्फ़िगरेशन में दी गई रूल चेन पर, यदि एंटिटी प्रोफ़ाइल में ओरिजिनेटर के लिए कोई डिफ़ॉल्ट रूल चेन परिभाषित नहीं है।", + "exclude-zero-deltas": "आउटबाउंड मैसेज से शून्य डेल्टा को निकालें", + "exclude-zero-deltas-hint": "यदि सक्षम किया गया है, तो आउटबाउंड मैसेज में \"{{outputValueKey}}\" आउटपुट कुंजी केवल तभी जोड़ी जाएगी जब इसका मान शून्य न हो।", + "exclude-zero-deltas-time-difference-hint": "यदि सक्षम किया गया है, तो आउटबाउंड मैसेज में \"{{outputValueKey}}\" और \"{{periodValueKey}}\" आउटपुट कुंजियाँ केवल तभी जोड़ी जाएँगी जब \"{{outputValueKey}}\" का मान शून्य न हो।", + "search-direction-from": "ओरिजिनेटर से टारगेट एंटिटी तक", + "search-direction-to": "टारगेट एंटिटी से ओरिजिनेटर तक", + "del-relation-direction-from": "ओरिजिनेटर से", + "del-relation-direction-to": "ओरिजिनेटर तक", + "target-entity": "टारगेट एंटिटी", + "function-configuration": "फ़ंक्शन कॉन्फ़िगरेशन", + "function-name": "फ़ंक्शन नाम", + "function-name-required": "फ़ंक्शन नाम आवश्यक है।", + "qualifier": "क्वालिफ़ायर", + "qualifier-hint": "अगर क्वालिफ़ायर निर्दिष्ट नहीं है, तो डिफ़ॉल्ट क्वालिफ़ायर \"$LATEST\" उपयोग किया जाएगा।", + "aws-credentials": "AWS क्रेडेंशियल्स", + "connection-timeout": "कनेक्शन टाइमआउट", + "connection-timeout-required": "कनेक्शन टाइमआउट आवश्यक है।", + "connection-timeout-min": "न्यूनतम कनेक्शन टाइमआउट 0 है।", + "connection-timeout-hint": "कनेक्शन स्थापित करते समय छोड़ने और टाइमआउट देने से पहले प्रतीक्षा करने का समय (सेकंड में)। 0 मान का अर्थ अनंत है, और अनुशंसित नहीं है।", + "request-timeout": "रिक्वेस्ट टाइमआउट", + "request-timeout-required": "रिक्वेस्ट टाइमआउट आवश्यक है।", + "request-timeout-min": "न्यूनतम रिक्वेस्ट टाइमआउट 0 है।", + "request-timeout-hint": "रिक्वेस्ट पूरा होने के लिए छोड़ने और टाइमआउट देने से पहले प्रतीक्षा करने का समय (सेकंड में)। 0 मान का अर्थ अनंत है, और अनुशंसित नहीं है।", + "units": "इकाइयाँ", + "tell-failure-aws-lambda": "यदि AWS Lambda फ़ंक्शन के निष्पादन में कोई अपवाद उत्पन्न हो तो Failure बताएं", + "tell-failure-aws-lambda-hint": "यदि AWS Lambda फ़ंक्शन के निष्पादन के दौरान कोई अपवाद (exception) उत्पन्न होता है, तो रूल नोड मैसेज प्रोसेसिंग की Failure को मजबूर करेगा।", + "basic-mode": "बेसिक", + "advanced-mode": "एडवांस्ड", + "save-time-series": { + "processing-settings": "प्रोसेसिंग सेटिंग्स", + "processing-settings-hint": "इनकमिंग मैसेज कैसे प्रोसेस किए जाएँगे, यह परिभाषित करें। बेसिक प्रोसेसिंग सेटिंग्स आपको पहले से कॉन्फ़िगर की गई स्ट्रैटेजीज़ चुनने देती हैं, जबकि एडवांस्ड सेटिंग्स में आप हर एक एक्शन के लिए अलग-अलग प्रोसेसिंग स्ट्रैटेजी चुन सकते हैं।", + "advanced-settings-hint": "प्रोसेसिंग स्ट्रैटेजीज़ कॉन्फ़िगर करते समय सावधान रहें। कुछ संयोजन अप्रत्याशित व्यवहार का कारण बन सकते हैं।", + "strategy": "स्ट्रैटेजी", + "deduplication-interval": "डेडुप्लीकेशन इंटरवल", + "deduplication-interval-required": "डेडुप्लीकेशन इंटरवल आवश्यक है।", + "deduplication-interval-min-max-range": "डेडुप्लीकेशन इंटरवल कम से कम 1 सेकंड और अधिकतम 1 दिन होना चाहिए।", + "strategy-type": { + "every-message": "हर मैसेज पर", + "skip": "स्किप करें", + "deduplicate": "डेडुप्लीकेट", + "web-sockets-only": "केवल WebSockets" + }, + "time-series": "टाइम सीरीज़", + "latest": "नवीनतम मान", + "web-sockets": "WebSockets" + }, + "save-attribute": { + "processing-settings": "प्रोसेसिंग सेटिंग्स", + "processing-settings-hint": "इनकमिंग मैसेज कैसे प्रोसेस किए जाएँगे, यह परिभाषित करें। बेसिक प्रोसेसिंग सेटिंग्स आपको पहले से कॉन्फ़िगर की गई स्ट्रैटेजीज़ चुनने देती हैं, जबकि एडवांस्ड सेटिंग्स में आप हर एक एक्शन के लिए अलग-अलग प्रोसेसिंग स्ट्रैटेजी चुन सकते हैं।", + "advanced-settings-hint": "प्रोसेसिंग स्ट्रैटेजीज़ कॉन्फ़िगर करते समय सावधान रहें। कुछ संयोजन अप्रत्याशित व्यवहार का कारण बन सकते हैं।", + "strategy": "स्ट्रैटेजी", + "deduplication-interval": "डेडुप्लीकेशन इंटरवल", + "deduplication-interval-required": "डेडुप्लीकेशन इंटरवल आवश्यक है।", + "deduplication-interval-min-max-range": "डेडुप्लीकेशन इंटरवल कम से कम 1 सेकंड और अधिकतम 1 दिन होना चाहिए।", + "scope": "स्कोप", + "strategy-type": { + "every-message": "हर मैसेज पर", + "skip": "स्किप करें", + "deduplicate": "डेडुप्लीकेट", + "web-sockets-only": "केवल WebSockets" + }, + "attributes": "विशेषताएँ" + }, + "key-val": { + "key": "कुंजी", + "value": "मान", + "see-examples": "उदाहरण देखें।", + "remove-entry": "एंट्री हटाएँ", + "remove-mapping-entry": "मैपिंग हटाएँ", + "add-mapping-entry": "मैपिंग जोड़ें", + "add-entry": "एंट्री जोड़ें", + "copy-key-values-from": "की-वैल्यूज़ यहाँ से कॉपी करें", + "delete-key-values": "की-वैल्यूज़ हटाएँ", + "delete-key-values-from": "यहाँ से की-वैल्यूज़ हटाएँ", + "at-least-one-key-error": "कम से कम एक कुंजी चुनी जानी चाहिए।", + "unique-key-value-pair-error": "'{{keyText}}' को '{{valText}}' से अलग होना चाहिए!" + }, + "mail-body-types": { + "plain-text": "सादा टेक्स्ट", + "html": "HTML", + "dynamic": "डायनेमिक", + "use-body-type-template": "बॉडी टाइप टेम्पलेट का उपयोग करें", + "plain-text-description": "सरल, बिना फ़ॉर्मैटिंग वाला टेक्स्ट, जिसमें कोई विशेष स्टाइलिंग या फ़ॉर्मैटिंग नहीं होती।", + "html-text-description": "आपको अपने मेल बॉडी में फ़ॉर्मैटिंग, लिंक और इमेज के लिए HTML टैग उपयोग करने की अनुमति देता है।", + "dynamic-text-description": "टेम्पलेटाइज़ेशन फ़ीचर के आधार पर Plain Text या HTML बॉडी टाइप को डायनेमिक रूप से उपयोग करने की अनुमति देता है।", + "after-template-evaluation-hint": "टेम्पलेट के मूल्यांकन के बाद मान HTML के लिए true और Plain text के लिए false होना चाहिए।" + }, + "ai": { + "ai-model": "एआई मॉडल", + "model": "मॉडल", + "ai-model-hint": "इस रूल नोड द्वारा भेजे गए रिक्वेस्ट प्रोसेस करने के लिए प्री-कॉन्फ़िगर एआई मॉडल चुनें, या नया मॉडल कॉन्फ़िगर करने के लिए \"Create new\" का उपयोग करें।", + "prompt-settings": "प्रॉम्प्ट सेटिंग्स", + "prompt-settings-hint": "वैकल्पिक सिस्टम प्रॉम्प्ट एआई की सामान्य भूमिका और सीमाएँ सेट करता है, जबकि यूज़र प्रॉम्प्ट करने वाला विशिष्ट कार्य परिभाषित करता है। दोनों फ़ील्ड टेम्पलेटाइज़ेशन को सपोर्ट करते हैं।", + "system-prompt": "सिस्टम प्रॉम्प्ट", + "system-prompt-max-length": "सिस्टम प्रॉम्प्ट 500000 अक्षरों से अधिक नहीं होना चाहिए।", + "system-prompt-blank": "सिस्टम प्रॉम्प्ट खाली नहीं होना चाहिए।", + "user-prompt": "यूज़र प्रॉम्प्ट", + "user-prompt-required": "यूज़र प्रॉम्प्ट आवश्यक है।", + "user-prompt-max-length": "यूज़र प्रॉम्प्ट 500000 अक्षरों से अधिक नहीं होना चाहिए।", + "user-prompt-blank": "यूज़र प्रॉम्प्ट खाली नहीं होना चाहिए।", + "response-format": "उत्तर फ़ॉर्मैट", + "response-text": "टेक्स्ट", + "response-json": "JSON", + "response-json-schema": "JSON Schema", + "response-format-hint-TEXT": "मॉडल को मनचाहा टेक्स्ट जनरेट करने की अनुमति देता है, जो वैध JSON ऑब्जेक्ट हो भी सकता है और नहीं भी। अगर आउटपुट वैध JSON ऑब्जेक्ट नहीं है, तो इसे अपने-आप \"response\" कुंजी के अंदर एक JSON ऑब्जेक्ट में लपेट दिया जाएगा।", + "response-format-hint-JSON": "मॉडल से आवश्यक है कि वह वैध JSON के रूप में उत्तर जनरेट करे। अगर आउटपुट वैध JSON ऑब्जेक्ट नहीं है, तो इसे अपने-आप \"response\" कुंजी के अंदर एक JSON ऑब्जेक्ट में लपेट दिया जाएगा।", + "response-format-hint-JSON_SCHEMA": "मॉडल से आवश्यक है कि वह दिए गए स्कीमा में परिभाषित स्ट्रक्चर और डेटा टाइप से मेल खाता JSON जनरेट करे। अगर आउटपुट वैध JSON ऑब्जेक्ट नहीं है, तो इसे अपने-आप \"response\" कुंजी के अंदर एक JSON ऑब्जेक्ट में लपेट दिया जाएगा।", + "response-json-schema-hint": "आप कोई भी वैध JSON Schema दर्ज कर सकते हैं, लेकिन यह रूल नोड उसके केवल सीमित फ़ीचर्स को सपोर्ट करता है। विवरण के लिए नोड डॉक्यूमेंटेशन देखें।", + "response-json-schema-required": "JSON Schema आवश्यक है।", + "advanced-settings": "एडवांस्ड सेटिंग्स", + "timeout": "टाइमआउट", + "timeout-hint": "रिक्वेस्ट समाप्त होने से पहले एआई मॉडल से उत्तर की प्रतीक्षा करने का अधिकतम समय।", + "timeout-required": "टाइमआउट आवश्यक है।", + "timeout-validation": "1 सेकंड से 10 मिनट के बीच होना चाहिए।", + "force-acknowledgement": "फ़ोर्स ऐक्नॉलेजमेंट", + "force-acknowledgement-hint": "अगर सक्षम है, तो इनकमिंग मैसेज को तुरंत ऐक्नॉलेज कर दिया जाएगा। इसके बाद मॉडल का उत्तर एक अलग, नए मैसेज के रूप में क्यू में डाला जाएगा।", + "ai-resources": "एआई रिसोर्सेज़" + } + }, + "timezone": { + "timezone": "समय ज़ोन", + "select-timezone": "समय ज़ोन चुनें", + "no-timezones-matching": "'{{timezone}}' से मेल खाते कोई समय ज़ोन नहीं मिले।", + "timezone-required": "समय ज़ोन आवश्यक है।", + "browser-time": "ब्राउज़र समय" + }, + "queue": { + "queue-name": "क्यू", + "no-queues-found": "कोई क्यू नहीं मिली।", + "no-queues-matching": "'{{queue}}' से मेल खाती कोई क्यू नहीं मिली।", + "select-name": "क्यू नाम चुनें", + "name": "नाम", + "name-required": "क्यू नाम आवश्यक है!", + "name-unique": "क्यू नाम अद्वितीय नहीं है!", + "name-pattern": "क्यू नाम में ASCII अल्फ़ान्यूमेरिक, '.', '_' और '-' के अलावा अन्य कैरेक्टर नहीं होना चाहिए!", + "queue-required": "क्यू आवश्यक है!", + "topic-required": "क्यू टॉपिक आवश्यक है!", + "poll-interval-required": "पोल इंटरवल आवश्यक है!", + "poll-interval-min-value": "पोल इंटरवल का मान 1 से कम नहीं हो सकता।", + "partitions-required": "पार्टिशन आवश्यक हैं!", + "partitions-min-value": "पार्टिशन का मान 1 से कम नहीं हो सकता।", + "pack-processing-timeout-required": "प्रोसेसिंग टाइमआउट आवश्यक है।", + "pack-processing-timeout-min-value": "प्रोसेसिंग टाइमआउट का मान 1 से कम नहीं हो सकता।", + "batch-size-required": "बैच साइज आवश्यक है!", + "batch-size-min-value": "बैच साइज का मान 1 से कम नहीं हो सकता।", + "retries-required": "रीट्राइज़ आवश्यक हैं!", + "retries-min-value": "रीट्राइज़ का मान ऋणात्मक नहीं हो सकता।", + "failure-percentage-required": "फेल्योर प्रतिशत आवश्यक है!", + "failure-percentage-min-value": "फेल्योर प्रतिशत का मान 0 से कम नहीं हो सकता।", + "failure-percentage-max-value": "फेल्योर प्रतिशत का मान 100 से ज़्यादा नहीं हो सकता।", + "pause-between-retries-required": "रीट्राइज़ के बीच का पॉज़ आवश्यक है!", + "pause-between-retries-min-value": "रीट्राइज़ के बीच पॉज़ का मान 1 से कम नहीं हो सकता।", + "max-pause-between-retries-required": "रीट्राइज़ के बीच अधिकतम पॉज़ आवश्यक है!", + "max-pause-between-retries-min-value": "रीट्राइज़ के बीच अधिकतम पॉज़ का मान 1 से कम नहीं हो सकता।", + "submit-strategy-type-required": "सबमिट स्ट्रैटजी टाइप आवश्यक है!", + "processing-strategy-type-required": "प्रोसेसिंग स्ट्रैटजी टाइप आवश्यक है!", + "queues": "क्यूज़", + "selected-queues": "{ count, plural, =1 {1 क्यू} other {# क्यूज़} } चयनित", + "delete-queue-title": "क्या आप वाकई क्यू '{{queueName}}' को हटाना चाहते हैं?", + "delete-queues-title": "क्या आप वाकई { count, plural, =1 {1 क्यू} other {# क्यूज़} } हटाना चाहते हैं?", + "delete-queue-text": "सावधान रहें, पुष्टि के बाद यह क्यू और इससे जुड़ा सारा डेटा हमेशा के लिए हट जाएगा।", + "delete-queues-text": "पुष्टि के बाद चुनी गई सभी क्यूज़ हटा दी जाएँगी और उपलब्ध नहीं रहेंगी।", + "search": "क्यू खोजें", + "add": "क्यू जोड़ें", + "details": "क्यू विवरण", + "topic": "टॉपिक", + "submit-settings": "सबमिट सेटिंग्स", + "submit-strategy": "स्ट्रैटजी टाइप *", + "grouping-parameter": "ग्रूपिंग पैरामीटर", + "processing-settings": "रीट्राइज़ प्रोसेसिंग सेटिंग्स", + "processing-strategy": "प्रोसेसिंग टाइप *", + "retries-settings": "रीट्राइज़ सेटिंग्स", + "polling-settings": "पोलिंग सेटिंग्स", + "batch-processing": "बैच प्रोसेसिंग", + "poll-interval": "पोल इंटरवल", + "partitions": "पार्टिशन", + "immediate-processing": "तुरंत प्रोसेसिंग", + "consumer-per-partition": "प्रत्येक कंज़्यूमर के लिए मैसेज पोल भेजें", + "consumer-per-partition-hint": "प्रत्येक पार्टिशन के लिए अलग-अलग कंज़्यूमर सक्षम करें", + "duplicate-msg-to-all-partitions": "संदेश को सभी पार्टिशन में डुप्लिकेट करें", + "processing-timeout": "प्रोसेसिंग समय, ms", + "batch-size": "बैच साइज", + "retries": "रीट्राइज़ की संख्या (0 – अनलिमिटेड)", + "failure-percentage": "रीट्राइज़ छोड़ने के लिए फेल्योर संदेश, %", + "pause-between-retries": "रीट्राइज़ अंतराल, सेकंड", + "max-pause-between-retries": "अतिरिक्त रीट्राइज़ अंतराल, सेकंड", + "delete": "क्यू हटाएँ", + "copyId": "क्यू Id कॉपी करें", + "idCopiedMessage": "क्यू Id क्लिपबोर्ड पर कॉपी कर दी गई है", + "description": "विवरण", + "description-hint": "यह टेक्स्ट चुनी गई स्ट्रैटजी की जगह क्यू विवरण में दिखाया जाएगा", + "alt-description": "सबमिट स्ट्रैटजी: {{submitStrategy}}, प्रोसेसिंग स्ट्रैटजी: {{processingStrategy}}", + "custom-properties": "कस्टम प्रॉपर्टीज़", + "custom-properties-hint": "कस्टम क्यू (टॉपिक) क्रिएशन प्रॉपर्टीज़, उदाहरण: 'retention.ms:604800000;retention.bytes:1048576000'", + "strategies": { + "sequential-by-originator-label": "ओरिजिनेटर के अनुसार सीक्वेंशियल", + "sequential-by-originator-hint": "उदाहरण के लिए डिवाइस A के लिए नया संदेश तब तक सबमिट नहीं होगा जब तक डिवाइस A के लिए पिछला संदेश अकनॉलेज न हो जाए", + "sequential-by-tenant-label": "टेनेंट के अनुसार सीक्वेंशियल", + "sequential-by-tenant-hint": "उदाहरण के लिए टेनेंट A के लिए नया संदेश तब तक सबमिट नहीं होगा जब तक टेनेंट A के लिए पिछला संदेश अकनॉलेज न हो जाए", + "sequential-label": "सीक्वेंशियल", + "sequential-hint": "नया संदेश तब तक सबमिट नहीं होगा जब तक पिछला संदेश अकनॉलेज न हो जाए", + "burst-label": "बर्स्ट", + "burst-hint": "सभी संदेश उनके आने के क्रम में रूल चेन्स को सबमिट किए जाते हैं", + "batch-label": "बैच", + "batch-hint": "नया बैच तब तक सबमिट नहीं होगा जब तक पिछला बैच अकनॉलेज न हो जाए", + "skip-all-failures-label": "सभी फेल्योर को स्किप करें", + "skip-all-failures-hint": "सभी फेल्योर को इग्नोर करें", + "skip-all-failures-and-timeouts-label": "सभी फेल्योर और टाइमआउट्स को स्किप करें", + "skip-all-failures-and-timeouts-hint": "सभी फेल्योर और टाइमआउट्स को इग्नोर करें", + "retry-all-label": "सब पर रीट्राइज़ करें", + "retry-all-hint": "प्रोसेसिंग पैक के सभी संदेशों पर रीट्राइज़ करें", + "retry-failed-label": "फेल्ड पर रीट्राइज़ करें", + "retry-failed-hint": "प्रोसेसिंग पैक के सभी फेल्ड संदेशों पर रीट्राइज़ करें", + "retry-timeout-label": "टाइमआउट पर रीट्राइज़ करें", + "retry-timeout-hint": "प्रोसेसिंग पैक के सभी टाइमआउट हुए संदेशों पर रीट्राइज़ करें", + "retry-failed-and-timeout-label": "फेल्ड और टाइमआउट पर रीट्राइज़ करें", + "retry-failed-and-timeout-hint": "प्रोसेसिंग पैक के सभी फेल्ड और टाइमआउट हुए संदेशों पर रीट्राइज़ करें" + } + }, + "queue-statistics": { + "queue-statistics": "क्यू सांख्यिकी", + "no-queue-statistics-matching": "कोई क्यू सांख्यिकी '{{entity}}' से मिलती नहीं मिली।", + "queue-statistics-required": "क्यू सांख्यिकी आवश्यक है।", + "list-of-queue-statistics": "{ count, plural, =1 {एक क्यू सांख्यिकी} other {# क्यू सांख्यिकी की सूची} }", + "selected-queue-statistics": "{ count, plural, =1 {1 क्यू सांख्यिकी} other {# क्यू सांख्यिकी} } चयनित", + "no-queue-statistics-text": "कोई क्यू सांख्यिकी नहीं मिली", + "queue-statistics-starts-with": "वे क्यू सांख्यिकी जिनके नाम '{{prefix}}' से शुरू होते हैं" + }, + "server-error": { + "general": "सामान्य सर्वर त्रुटि", + "authentication": "प्रमाणीकरण त्रुटि", + "jwt-token-expired": "JWT टोकन की समय-सीमा समाप्त हो गई", + "tenant-trial-expired": "टेनेंट ट्रायल की समय-सीमा समाप्त हो गई", + "credentials-expired": "क्रेडेंशियल्स की समय-सीमा समाप्त हो गई", + "permission-denied": "अनुमति अस्वीकृत", + "invalid-arguments": "अमान्य आर्ग्यूमेंट्स", + "bad-request-params": "खराब रिक्वेस्ट पैरामीटर्स", + "item-not-found": "आइटम नहीं मिला", + "too-many-requests": "बहुत अधिक रिक्वेस्ट", + "too-many-updates": "बहुत अधिक अपडेट्स" + }, + "tenant": { + "tenant": "टेनेंट", + "tenants": "टेनेंट्स", + "management": "टेनेंट प्रबंधन", + "add": "टेनेंट जोड़ें", + "admins": "प्रশासक", + "manage-tenant-admins": "टेनेंट प्रशासकों को प्रबंधित करें", + "delete": "टेनेंट हटाएँ", + "add-tenant-text": "नया टेनेंट जोड़ें", + "no-tenants-text": "कोई टेनेंट नहीं मिला", + "tenant-details": "टेनेंट विवरण", + "title-max-length": "शीर्षक 256 अक्षरों से कम होना चाहिए", + "delete-tenant-title": "क्या आप वाकई टेनेंट '{{tenantTitle}}' को हटाना चाहते हैं?", + "delete-tenant-text": "सावधान रहें, पुष्टि के बाद टेनेंट और उससे जुड़ा सारा डेटा स्थायी रूप से मिट जाएगा।", + "delete-tenants-title": "क्या आप वाकई { count, plural, =1 {1 टेनेंट} other {# टेनेंट्स} } को हटाना चाहते हैं?", + "delete-tenants-action-title": "हटाएँ { count, plural, =1 {1 टेनेंट} other {# टेनेंट्स} }", + "delete-tenants-text": "सावधान रहें, पुष्टि के बाद सभी चयनित टेनेंट्स हटा दिए जाएँगे और इनसे जुड़ा सारा डेटा स्थायी रूप से मिट जाएगा।", + "title": "शीर्षक", + "title-required": "शीर्षक आवश्यक है।", + "description": "विवरण", + "details": "विवरण", + "events": "इवेंट्स", + "copyId": "टेनेंट Id कॉपी करें", + "idCopiedMessage": "टेनेंट Id क्लिपबोर्ड पर कॉपी कर दिया गया है", + "select-tenant": "टेनेंट चुनें", + "no-tenants-matching": "कोई टेनेंट '{{entity}}' से मेल नहीं खाता मिला।", + "tenant-required": "टेनेंट आवश्यक है", + "search": "टेनेंट खोजें", + "selected-tenants": "{ count, plural, =1 {1 टेनेंट} other {# टेनेंट्स} } चयनित", + "isolated-tb-rule-engine": "आइसोलेटेड थिंग्सबोर्ड रूल इंजन क्यूज़ का उपयोग करें", + "isolated-tb-rule-engine-details": "हर टेनेंट के पास समर्पित रूल इंजन क्यूज़ होंगी।" + }, + "tenant-profile": { + "tenant-profile": "टेनेंट प्रोफ़ाइल", + "tenant-profiles": "टेनेंट प्रोफ़ाइल्स", + "add": "टेनेंट प्रोफ़ाइल जोड़ें", + "add-profile": "प्रोफ़ाइल जोड़ें", + "debug": "डीबग", + "edit": "टेनेंट प्रोफ़ाइल संपादित करें", + "tenant-profile-details": "टेनेंट प्रोफ़ाइल विवरण", + "no-tenant-profiles-text": "कोई टेनेंट प्रोफ़ाइल नहीं मिली", + "name-max-length": "नाम 256 अक्षरों से कम होना चाहिए", + "search": "टेनेंट प्रोफ़ाइल खोजें", + "selected-tenant-profiles": "{ count, plural, =1 {1 टेनेंट प्रोफ़ाइल} other {# टेनेंट प्रोफ़ाइल्स} } चयनित", + "no-tenant-profiles-matching": "कोई टेनेंट प्रोफ़ाइल '{{entity}}' से मेल नहीं खाती मिली।", + "tenant-profile-required": "टेनेंट प्रोफ़ाइल आवश्यक है", + "idCopiedMessage": "टेनेंट प्रोफ़ाइल Id क्लिपबोर्ड पर कॉपी कर दी गई है", + "set-default": "टेनेंट प्रोफ़ाइल को डिफ़ॉल्ट बनाएं", + "delete": "टेनेंट प्रोफ़ाइल हटाएँ", + "copyId": "टेनेंट प्रोफ़ाइल Id कॉपी करें", + "name": "नाम", + "name-required": "नाम आवश्यक है।", + "data": "प्रोफ़ाइल डेटा", + "profile-configuration": "प्रोफ़ाइल कॉन्फ़िगरेशन", + "description": "विवरण", + "default": "डिफ़ॉल्ट", + "delete-tenant-profile-title": "क्या आप वाकई टेनेंट प्रोफ़ाइल '{{tenantProfileName}}' को हटाना चाहते हैं?", + "delete-tenant-profile-text": "सावधान रहें, पुष्टि के बाद टेनेंट प्रोफ़ाइल और उससे जुड़ा सारा डेटा स्थायी रूप से मिट जाएगा।", + "delete-tenant-profiles-title": "क्या आप वाकई { count, plural, =1 {1 टेनेंट प्रोफ़ाइल} other {# टेनेंट प्रोफ़ाइल्स} } को हटाना चाहते हैं?", + "delete-tenant-profiles-text": "सावधान रहें, पुष्टि के बाद सभी चयनित टेनेंट प्रोफ़ाइल्स हटा दी जाएँगी और उनसे जुड़ा सारा डेटा स्थायी रूप से मिट जाएगा।", + "set-default-tenant-profile-title": "क्या आप वाकई टेनेंट प्रोफ़ाइल '{{tenantProfileName}}' को डिफ़ॉल्ट बनाना चाहते हैं?", + "set-default-tenant-profile-text": "पुष्टि के बाद यह टेनेंट प्रोफ़ाइल डिफ़ॉल्ट के रूप में चिह्नित हो जाएगी और ऐसे नए टेनेंट्स के लिए उपयोग होगी जिनके लिए कोई प्रोफ़ाइल निर्दिष्ट नहीं है।", + "no-tenant-profiles-found": "कोई टेनेंट प्रोफ़ाइल नहीं मिली।", + "create-new-tenant-profile": "नई बनाएँ!", + "create-tenant-profile": "नई टेनेंट प्रोफ़ाइल बनाएँ", + "import": "टेनेंट प्रोफ़ाइल आयात करें", + "export": "टेनेंट प्रोफ़ाइल निर्यात करें", + "export-failed-error": "टेनेंट प्रोफ़ाइल निर्यात करने में असमर्थ: {{error}}", + "tenant-profile-file": "टेनेंट प्रोफ़ाइल फ़ाइल", + "invalid-tenant-profile-file-error": "टेनेंट प्रोफ़ाइल आयात करने में असमर्थ: अमान्य टेनेंट प्रोफ़ाइल डेटा संरचना।", + "advanced-settings": "उन्नत सेटिंग्स", + "entities": "एंटिटीज़", + "rule-engine": "रूल इंजन", + "time-to-live": "टाइम-टू-लाइव", + "calculated-fields": "कैल्क्युलेटेड फ़ील्ड्स", + "alarms-and-notifications": "अलार्म और अधिसूचनाएँ", + "ota-files-in-bytes": "फ़ाइलें", + "ws-title": "WS", + "unlimited": "(0 - अनलिमिटेड)", + "maximum-devices": "डिवाइस की अधिकतम संख्या", + "maximum-devices-required": "डिवाइस की अधिकतम संख्या आवश्यक है।", + "maximum-devices-range": "डिवाइस की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "maximum-assets": "एसेट की अधिकतम संख्या", + "maximum-assets-required": "एसेट की अधिकतम संख्या आवश्यक है।", + "maximum-assets-range": "एसेट की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "maximum-customers": "कस्टमर की अधिकतम संख्या", + "maximum-customers-required": "कस्टमर की अधिकतम संख्या आवश्यक है।", + "maximum-customers-range": "कस्टमर की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "maximum-users": "उपयोगकर्ताओं की अधिकतम संख्या", + "maximum-users-required": "उपयोगकर्ताओं की अधिकतम संख्या आवश्यक है।", + "maximum-users-range": "उपयोगकर्ताओं की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "maximum-dashboards": "डैशबोर्ड्स की अधिकतम संख्या", + "maximum-dashboards-required": "डैशबोर्ड्स की अधिकतम संख्या आवश्यक है।", + "maximum-dashboards-range": "डैशबोर्ड्स की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "maximum-edges": "एज की अधिकतम संख्या", + "maximum-edges-required": "एज की अधिकतम संख्या आवश्यक है।", + "maximum-edges-range": "एज की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "maximum-rule-chains": "रूल चेन्स की अधिकतम संख्या", + "maximum-rule-chains-required": "रूल चेन्स की अधिकतम संख्या आवश्यक है।", + "maximum-rule-chains-range": "रूल चेन्स की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "maximum-resources-sum-data-size": "रिसोर्स फ़ाइलों के कुल अधिकतम आकार (बाइट्स)", + "maximum-resources-sum-data-size-required": "रिसोर्स फ़ाइलों के कुल अधिकतम आकार की मान आवश्यक है।", + "maximum-resources-sum-data-size-range": "रिसोर्स फ़ाइलों के कुल अधिकतम आकार का मान नकारात्मक नहीं हो सकता", + "maximum-resource-size": "अधिकतम रिसोर्स फ़ाइल आकार (बाइट्स)", + "maximum-resource-size-required": "अधिकतम रिसोर्स फ़ाइल आकार आवश्यक है", + "maximum-resource-size-range": "अधिकतम रिसोर्स फ़ाइल आकार नकारात्मक नहीं हो सकता", + "maximum-ota-packages-sum-data-size": "OTA पैकेज फ़ाइलों के कुल अधिकतम आकार (बाइट्स)", + "maximum-ota-package-sum-data-size-required": "OTA पैकेज फ़ाइलों के कुल अधिकतम आकार की मान आवश्यक है।", + "maximum-ota-package-sum-data-size-range": "OTA पैकेज फ़ाइलों के कुल अधिकतम आकार का मान नकारात्मक नहीं हो सकता", + "maximum-debug-duration-min": "अधिकतम डीबग अवधि (मिनट)", + "maximum-debug-duration-min-range": "अधिकतम डीबग अवधि नकारात्मक नहीं हो सकती", + "rest-requests-for-tenant": "टेनेंट के लिए REST रिक्वेस्ट्स", + "transport-tenant-telemetry-msg-rate-limit": "ट्रांसपोर्ट टेनेंट टेलीमेट्री मैसेजेस", + "transport-tenant-telemetry-data-points-rate-limit": "ट्रांसपोर्ट टेनेंट टेलीमेट्री डेटा पॉइंट्स", + "transport-device-msg-rate-limit": "ट्रांसपोर्ट डिवाइस मैसेजेस", + "transport-device-telemetry-msg-rate-limit": "ट्रांसपोर्ट डिवाइस टेलीमेट्री मैसेजेस", + "transport-device-telemetry-data-points-rate-limit": "ट्रांसपोर्ट डिवाइस टेलीमेट्री डेटा पॉइंट्स", + "transport-gateway-msg-rate-limit": "ट्रांसपोर्ट Gateway संदेश", + "transport-gateway-telemetry-msg-rate-limit": "ट्रांसपोर्ट Gateway टेलीमेट्री संदेश", + "transport-gateway-telemetry-data-points-rate-limit": "ट्रांसपोर्ट Gateway टेलीमेट्री डेटा पॉइंट्स", + "transport-gateway-device-msg-rate-limit": "ट्रांसपोर्ट Gateway डिवाइस संदेश", + "transport-gateway-device-telemetry-msg-rate-limit": "ट्रांसपोर्ट Gateway डिवाइस टेलीमेट्री संदेश", + "transport-gateway-device-telemetry-data-points-rate-limit": "ट्रांसपोर्ट Gateway डिवाइस टेलीमेट्री डेटा पॉइंट्स", + "tenant-entity-export-rate-limit": "एंटिटी वर्ज़न क्रिएशन", + "tenant-entity-import-rate-limit": "एंटिटी वर्ज़न लोड", + "tenant-notification-request-rate-limit": "अधिसूचना रिक्वेस्ट्स", + "tenant-notification-requests-per-rule-rate-limit": "प्रति नोटिफिकेशन रूल अधिसूचना रिक्वेस्ट्स", + "max-calculated-fields": "प्रति एंटिटी कैलक्युलेटेड फ़ील्ड्स की अधिकतम संख्या", + "max-calculated-fields-range": "प्रति एंटिटी कैलक्युलेटेड फ़ील्ड्स की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "max-calculated-fields-required": "प्रति एंटिटी कैलक्युलेटेड फ़ील्ड्स की अधिकतम संख्या आवश्यक है", + "max-data-points-per-rolling-arg": "रोलिंग आर्ग्युमेंट्स में डेटा पॉइंट्स की अधिकतम संख्या", + "max-data-points-per-rolling-arg-range": "रोलिंग आर्ग्युमेंट्स में डेटा पॉइंट्स की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "max-data-points-per-rolling-arg-required": "रोलिंग आर्ग्युमेंट्स में डेटा पॉइंट्स की अधिकतम संख्या आवश्यक है", + "max-arguments-per-cf": "प्रति कैलक्युलेटेड फ़ील्ड आर्ग्युमेंट्स की अधिकतम संख्या", + "max-arguments-per-cf-range": "प्रति कैलक्युलेटेड फ़ील्ड आर्ग्युमेंट्स की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "max-arguments-per-cf-required": "प्रति कैलक्युलेटेड फ़ील्ड आर्ग्युमेंट्स की अधिकतम संख्या आवश्यक है", + "max-state-size": "स्टेट का अधिकतम आकार (KB में)", + "max-state-size-range": "स्टेट का अधिकतम आकार (KB में) नकारात्मक नहीं हो सकता", + "max-state-size-required": "स्टेट का अधिकतम आकार (KB में) आवश्यक है", + "max-value-argument-size": "सिंगल वैल्यू आर्ग्युमेंट का अधिकतम आकार (KB में)", + "max-value-argument-size-range": "सिंगल वैल्यू आर्ग्युमेंट का अधिकतम आकार (KB में) नकारात्मक नहीं हो सकता", + "max-value-argument-size-required": "सिंगल वैल्यू आर्ग्युमेंट का अधिकतम आकार (KB में) आवश्यक है", + "max-transport-messages": "ट्रांसपोर्ट मैसेजेस की अधिकतम संख्या", + "max-transport-messages-required": "ट्रांसपोर्ट मैसेजेस की अधिकतम संख्या आवश्यक है।", + "max-transport-messages-range": "ट्रांसपोर्ट मैसेजेस की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "max-transport-data-points": "ट्रांसपोर्ट डेटा पॉइंट्स की अधिकतम संख्या", + "max-transport-data-points-required": "ट्रांसपोर्ट डेटा पॉइंट्स की अधिकतम संख्या आवश्यक है।", + "max-transport-data-points-range": "ट्रांसपोर्ट डेटा पॉइंट्स की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "max-r-e-executions": "रूल इंजन निष्पादनों की अधिकतम संख्या", + "max-r-e-executions-required": "रूल इंजन निष्पादनों की अधिकतम संख्या आवश्यक है.", + "max-r-e-executions-range": "रूल इंजन निष्पादनों की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "max-j-s-executions": "जावास्क्रिप्ट निष्पादनों की अधिकतम संख्या", + "max-j-s-executions-required": "जावास्क्रिप्ट निष्पादनों की अधिकतम संख्या आवश्यक है.", + "max-j-s-executions-range": "जावास्क्रिप्ट निष्पादनों की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "max-tbel-executions": "TBEL निष्पादनों की अधिकतम संख्या", + "max-tbel-executions-required": "TBEL निष्पादनों की अधिकतम संख्या आवश्यक है.", + "max-tbel-executions-range": "TBEL निष्पादनों की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "max-d-p-storage-days": "डेटा पॉइंट्स स्टोरेज दिनों की अधिकतम संख्या", + "max-d-p-storage-days-required": "डेटा पॉइंट्स स्टोरेज दिनों की अधिकतम संख्या आवश्यक है.", + "max-d-p-storage-days-range": "डेटा पॉइंट्स स्टोरेज दिनों की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "default-storage-ttl-days": "डिफॉल्ट स्टोरेज TTL (दिनों में)", + "default-storage-ttl-days-required": "डिफॉल्ट स्टोरेज TTL (दिनों में) आवश्यक है.", + "default-storage-ttl-days-range": "डिफॉल्ट स्टोरेज TTL (दिनों में) नकारात्मक नहीं हो सकता", + "alarms-ttl-days": "अलार्म्स TTL (दिनों में)", + "alarms-ttl-days-required": "अलार्म्स TTL (दिनों में) आवश्यक है", + "alarms-ttl-days-days-range": "अलार्म्स TTL (दिनों में) नकारात्मक नहीं हो सकता", + "rpc-ttl-days": "RPC TTL (दिनों में)", + "rpc-ttl-days-required": "RPC TTL (दिनों में) आवश्यक है", + "rpc-ttl-days-days-range": "RPC TTL (दिनों में) नकारात्मक नहीं हो सकता", + "queue-stats-ttl-days": "क्यू स्टैट्स TTL (दिनों में)", + "queue-stats-ttl-days-required": "क्यू स्टैट्स TTL (दिनों में) आवश्यक है", + "queue-stats-ttl-days-range": "क्यू स्टैट्स TTL (दिनों में) नकारात्मक नहीं हो सकता", + "rule-engine-exceptions-ttl-days": "रूल इंजन एक्सेप्शन्स TTL (दिनों में)", + "rule-engine-exceptions-ttl-days-required": "रूल इंजन एक्सेप्शन्स TTL (दिनों में) आवश्यक है", + "rule-engine-exceptions-ttl-days-range": "रूल इंजन एक्सेप्शन्स TTL (दिनों में) नकारात्मक नहीं हो सकता", + "max-rule-node-executions-per-message": "प्रति संदेश रूल नोड निष्पादनों की अधिकतम संख्या", + "max-rule-node-executions-per-message-required": "प्रति संदेश रूल नोड निष्पादनों की अधिकतम संख्या आवश्यक है.", + "max-rule-node-executions-per-message-range": "प्रति संदेश रूल नोड निष्पादनों की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "max-emails": "भेजे गए ईमेल की अधिकतम संख्या", + "max-emails-required": "भेजे गए ईमेल की अधिकतम संख्या आवश्यक है.", + "max-emails-range": "भेजे गए ईमेल की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "sms-enabled": "एसएमएस सक्षम", + "max-sms": "भेजे गए SMS की अधिकतम संख्या", + "max-sms-required": "भेजे गए SMS की अधिकतम संख्या आवश्यक है.", + "max-sms-range": "भेजे गए SMS की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "max-created-alarms": "बनाए गए अलार्म्स की अधिकतम संख्या", + "max-created-alarms-required": "बनाए गए अलार्म्स की अधिकतम संख्या आवश्यक है.", + "max-created-alarms-range": "बनाए गए अलार्म्स की अधिकतम संख्या नकारात्मक नहीं हो सकती", + "no-queue": "कोई कतार कॉन्फ़िगर नहीं है", + "add-queue": "कतार जोड़ें", + "queues-with-count": "कतारें ({{count}})", + "tenant-rest-limits": "टेनेंट के लिए REST अनुरोध", + "customer-rest-limits": "कस्टमर के लिए REST अनुरोध", + "incorrect-pattern-for-rate-limits": "फ़ॉर्मेट क्षमता और अवधि (सेकंड में) की कॉमा से अलग की गई जोड़ियों का होता है, जिनके बीच कॉलन होता है, जैसे 100:1,2000:60", + "too-small-value-zero": "मान 0 से बड़ा होना चाहिए", + "too-small-value-one": "मान 1 से बड़ा होना चाहिए", + "queue-size-is-limited-by-system-configuration": "कतार का आकार सिस्टम कॉन्फ़िगरेशन द्वारा भी सीमित होता है.", + "cassandra-write-tenant-core-limits-configuration": "REST API Cassandra लेखन क्वेरीज़", + "cassandra-read-tenant-core-limits-configuration": "REST API और WS टेलीमेट्री Cassandra पठन क्वेरीज़", + "cassandra-write-tenant-rule-engine-limits-configuration": "रूल इंजन टेलीमेट्री Cassandra लेखन क्वेरीज़", + "cassandra-read-tenant-rule-engine-limits-configuration": "रूल इंजन टेलीमेट्री Cassandra पठन क्वेरीज़", + "ws-limit-max-sessions-per-tenant": "प्रति टेनेंट सत्रों की अधिकतम संख्या", + "ws-limit-max-sessions-per-customer": "प्रति कस्टमर सत्रों की अधिकतम संख्या", + "ws-limit-max-sessions-per-regular-user": "प्रति सामान्य उपयोगकर्ता सत्रों की अधिकतम संख्या", + "ws-limit-max-sessions-per-public-user": "प्रति सार्वजनिक उपयोगकर्ता सत्रों की अधिकतम संख्या", + "ws-limit-queue-per-session": "प्रति सत्र संदेश कतार का अधिकतम आकार", + "ws-limit-max-subscriptions-per-tenant": "प्रति टेनेंट सब्स्क्रिप्शन्स की अधिकतम संख्या", + "ws-limit-max-subscriptions-per-customer": "प्रति कस्टमर सब्स्क्रिप्शन्स की अधिकतम संख्या", + "ws-limit-max-subscriptions-per-regular-user": "प्रति सामान्य उपयोगकर्ता सब्स्क्रिप्शन्स की अधिकतम संख्या", + "ws-limit-max-subscriptions-per-public-user": "प्रति सार्वजनिक उपयोगकर्ता सब्स्क्रिप्शन्स की अधिकतम संख्या", + "ws-limit-updates-per-session": "प्रति सत्र WS अपडेट्स", + "rate-limits": { + "add-limit": "लिमिट जोड़ें", + "and-also-less-than": "और साथ ही इससे कम", + "advanced-settings": "एडवांस्ड सेटिंग्स", + "edit-limit": "लिमिट एडिट करें", + "calculated-field-debug-event-rate-limit": "कैलक्युलेटेड फ़ील्ड डिबग इवेंट्स", + "edit-calculated-field-debug-event-rate-limit": "कैलक्युलेटेड फ़ील्ड डिबग इवेंट्स के रेट लिमिट्स एडिट करें", + "edit-transport-tenant-msg-title": "ट्रांसपोर्ट टेनेंट संदेशों के रेट लिमिट्स एडिट करें", + "edit-transport-tenant-telemetry-msg-title": "ट्रांसपोर्ट टेनेंट टेलीमेट्री संदेशों के रेट लिमिट्स एडिट करें", + "edit-transport-tenant-telemetry-data-points-title": "ट्रांसपोर्ट टेनेंट टेलीमेट्री डेटा पॉइंट्स के रेट लिमिट्स एडिट करें", + "edit-transport-device-msg-title": "ट्रांसपोर्ट डिवाइस संदेशों के रेट लिमिट्स एडिट करें", + "edit-transport-device-telemetry-msg-title": "ट्रांसपोर्ट डिवाइस टेलीमेट्री संदेशों के रेट लिमिट्स एडिट करें", + "edit-transport-device-telemetry-data-points-title": "ट्रांसपोर्ट डिवाइस टेलीमेट्री डेटा पॉइंट्स के रेट लिमिट्स एडिट करें", + "edit-transport-gateway-msg-title": "ट्रांसपोर्ट Gateway संदेशों की रेट लिमिट्स संपादित करें", + "edit-transport-gateway-telemetry-msg-title": "ट्रांसपोर्ट Gateway टेलीमेट्री संदेशों की रेट लिमिट्स संपादित करें", + "edit-transport-gateway-telemetry-data-points-title": "ट्रांसपोर्ट Gateway टेलीमेट्री डेटा पॉइंट्स की रेट लिमिट्स संपादित करें", + "edit-transport-gateway-device-msg-title": "ट्रांसपोर्ट Gateway डिवाइस संदेशों की रेट लिमिट्स संपादित करें", + "edit-transport-gateway-device-telemetry-msg-title": "ट्रांसपोर्ट Gateway डिवाइस टेलीमेट्री संदेशों की रेट लिमिट्स संपादित करें", + "edit-transport-gateway-device-telemetry-data-points-title": "ट्रांसपोर्ट Gateway डिवाइस टेलीमेट्री डेटा पॉइंट्स की रेट लिमिट्स संपादित करें", + "edit-tenant-rest-limits-title": "टेनेंट के REST अनुरोधों के रेट लिमिट्स एडिट करें", + "edit-customer-rest-limits-title": "कस्टमर के REST अनुरोधों के रेट लिमिट्स एडिट करें", + "edit-ws-limit-updates-per-session-title": "प्रति सत्र WS अपडेट्स के रेट लिमिट्स एडिट करें", + "edit-cassandra-write-tenant-core-limits-configuration": "REST API Cassandra लेखन क्वेरीज़ के रेट लिमिट्स एडिट करें", + "edit-cassandra-read-tenant-core-limits-configuration": "REST API और WS टेलीमेट्री Cassandra पठन क्वेरीज़ के रेट लिमिट्स एडिट करें", + "edit-cassandra-write-tenant-rule-engine-limits-configuration": "रूल इंजन टेलीमेट्री Cassandra लेखन क्वेरीज़ के रेट लिमिट्स एडिट करें", + "edit-cassandra-read-tenant-rule-engine-limits-configuration": "रूल इंजन टेलीमेट्री Cassandra पठन क्वेरीज़ के रेट लिमिट्स एडिट करें", + "edit-tenant-entity-export-rate-limit-title": "एंटिटी वर्ज़न क्रिएशन के रेट लिमिट्स एडिट करें", + "edit-tenant-entity-import-rate-limit-title": "एंटिटी वर्ज़न लोड के रेट लिमिट्स एडिट करें", + "edit-tenant-notification-request-rate-limit-title": "अधिसूचना रिक्वेस्ट्स के रेट लिमिट्स एडिट करें", + "edit-tenant-notification-requests-per-rule-rate-limit-title": "प्रति नोटिफिकेशन रूल अधिसूचना रिक्वेस्ट्स के रेट लिमिट्स एडिट करें", + "edit-edge-events-rate-limit": "एज इवेंट्स के रेट लिमिट्स एडिट करें", + "edit-edge-events-per-edge-rate-limit": "प्रति एज एज इवेंट्स के रेट लिमिट्स एडिट करें", + "edge-events-rate-limit": "एज इवेंट्स", + "edge-events-per-edge-rate-limit": "प्रति एज एज इवेंट्स", + "edit-edge-uplink-messages-rate-limit": "एज अपलिंक संदेशों के रेट लिमिट्स एडिट करें", + "edit-edge-uplink-messages-per-edge-rate-limit": "प्रति एज एज अपलिंक संदेशों के रेट लिमिट्स एडिट करें", + "edge-uplink-messages-rate-limit": "एज अपलिंक संदेश", + "edge-uplink-messages-per-edge-rate-limit": "प्रति एज एज अपलिंक संदेश", + "messages-per": "संदेश प्रति", + "not-set": "सेट नहीं है", + "number-of-messages": "संदेशों की संख्या", + "number-of-messages-required": "संदेशों की संख्या आवश्यक है.", + "number-of-messages-min": "न्यूनतम मान 1 है.", + "preview": "प्रीव्यू", + "per-seconds": "प्रति सेकंड", + "per-seconds-required": "टाइम रेट आवश्यक है।", + "per-seconds-min": "न्यूनतम मान 1 है।", + "per-seconds-duplicate": "डुप्लिकेट टाइम रेट। हर टाइम इंटरवल यूनिक होना चाहिए।", + "rate-limits": "रेट लिमिट्स", + "remove-limit": "लिमिट हटाएँ", + "transport-tenant-msg": "ट्रांसपोर्ट टेनेंट संदेश", + "transport-tenant-telemetry-msg": "ट्रांसपोर्ट टेनेंट टेलीमेट्री संदेश", + "transport-tenant-telemetry-data-points": "ट्रांसपोर्ट टेनेंट टेलीमेट्री डेटा पॉइंट्स", + "transport-device-msg": "ट्रांसपोर्ट डिवाइस संदेश", + "transport-device-telemetry-msg": "ट्रांसपोर्ट डिवाइस टेलीमेट्री संदेश", + "transport-device-telemetry-data-points": "ट्रांसपोर्ट डिवाइस टेलीमेट्री डेटा पॉइंट्स", + "transport-gateway-msg": "ट्रांसपोर्ट Gateway संदेश", + "transport-gateway-telemetry-msg": "ट्रांसपोर्ट Gateway टेलीमेट्री संदेश", + "transport-gateway-telemetry-data-points": "ट्रांसपोर्ट Gateway टेलीमेट्री डेटा पॉइंट्स", + "transport-gateway-device-msg": "ट्रांसपोर्ट Gateway डिवाइस संदेश", + "transport-gateway-device-telemetry-msg": "ट्रांसपोर्ट Gateway डिवाइस टेलीमेट्री संदेश", + "transport-gateway-device-telemetry-data-points": "ट्रांसपोर्ट Gateway डिवाइस टेलीमेट्री डेटा पॉइंट्स", + "sec": "सेकंड" + } + }, + "timeinterval": { + "seconds-interval": "{ seconds, plural, =1 {1 सेकंड} other {# सेकंड} }", + "minutes-interval": "{ minutes, plural, =1 {1 मिनट} other {# मिनट} }", + "hours-interval": "{ hours, plural, =1 {1 घंटा} other {# घंटे} }", + "days-interval": "{ days, plural, =1 {1 दिन} other {# दिन} }", + "days": "दिन", + "hours": "घंटे", + "minutes": "मिनट", + "seconds": "सेकंड", + "advanced": "एडवांस्ड", + "custom": "कस्टम", + "predefined": { + "yesterday": "कल", + "day-before-yesterday": "परसों", + "this-day-last-week": "पिछले सप्ताह का यही दिन", + "previous-week": "पिछला सप्ताह (रवि - शनि)", + "previous-week-iso": "पिछला सप्ताह (सोम - रवि)", + "previous-month": "पिछला महीना", + "previous-quarter": "पिछली तिमाही", + "previous-half-year": "पिछला आधा वर्ष", + "previous-year": "पिछला वर्ष", + "current-hour": "वर्तमान घंटा", + "current-day": "आज", + "current-day-so-far": "आज तक", + "current-week": "वर्तमान सप्ताह (रवि - शनि)", + "current-week-iso": "वर्तमान सप्ताह (सोम - रवि)", + "current-week-so-far": "वर्तमान सप्ताह अब तक (रवि - शनि)", + "current-week-iso-so-far": "वर्तमान सप्ताह अब तक (सोम - रवि)", + "current-month": "वर्तमान महीना", + "current-month-so-far": "वर्तमान महीना अब तक", + "current-quarter": "वर्तमान तिमाही", + "current-quarter-so-far": "वर्तमान तिमाही अब तक", + "current-half-year": "वर्तमान आधा वर्ष", + "current-half-year-so-far": "वर्तमान आधा वर्ष अब तक", + "current-year": "वर्तमान वर्ष", + "current-year-so-far": "वर्तमान वर्ष अब तक" + }, + "type": { + "week": "सप्ताह (रवि - शनि)", + "week-iso": "सप्ताह (सोम - रवि)", + "month": "महीना", + "quarter": "तिमाही" + } + }, + "timeunit": { + "milliseconds": "मिलीसेकंड", + "seconds": "सेकंड", + "minutes": "मिनट", + "hours": "घंटे", + "days": "दिन" + }, + "timewindow": { + "timewindow": "टाइम विंडो", + "timewindow-settings": "टाइम विंडो सेटिंग्स", + "years": "{ years, plural, =1 {1 वर्ष } other {# वर्ष } }", + "years-short": "{{ years }}y", + "months": "{ months, plural, =1 {1 महीना } other {# महीने } }", + "months-short": "{{ months }}M", + "weeks": "{ weeks, plural, =1 {1 सप्ताह } other {# सप्ताह } }", + "weeks-short": "{{ weeks }}w", + "days": "{ days, plural, =1 {1 दिन } other {# दिन } }", + "days-short": "{{ days }}d", + "hours": "{ hours, plural, =0 { घंटा } =1 {1 घंटा } other {# घंटे } }", + "hr": "{{ hr }} घंटा", + "hr-short": "{{ hr }}h", + "minutes": "{ minutes, plural, =0 { मिनट } =1 {1 मिनट } other {# मिनट } }", + "min": "{{ min }} मिनट", + "min-short": "{{ min }}m", + "seconds": "{ seconds, plural, =0 { सेकंड } =1 {1 सेकंड } other {# सेकंड } }", + "sec": "{{ sec }} सेकंड", + "sec-short": "{{ sec }}s", + "short": { + "years": "{ years, plural, =1 {1 वर्ष } other {# वर्ष } }", + "days": "{ days, plural, =1 {1 दिन } other {# दिन } }", + "hours": "{ hours, plural, =1 {1 घंटा } other {# घंटे } }", + "minutes": "{{minutes}} मिनट ", + "seconds": "{{seconds}} सेकंड " + }, + "realtime": "रीयलटाइम", + "history": "हिस्ट्री", + "last-prefix": "पिछले", + "period": "{{ startTime }} से {{ endTime }} तक", + "edit": "टाइम विंडो संपादित करें", + "date-range": "तिथि सीमा", + "for-all-time": "सभी समय के लिए", + "last": "पिछले", + "time-period": "समय अवधि", + "hide": "छिपाएँ", + "interval": "अंतराल", + "just-now": "अभी-अभी", + "just-now-lower": "अभी-अभी", + "ago": "पहले", + "style": "टाइम विंडो शैली", + "icon": "आइकन", + "icon-position": "आइकन स्थिति", + "icon-position-left": "बाएँ", + "icon-position-right": "दाएँ", + "font": "फ़ॉन्ट", + "color": "रंग", + "displayTypePrefix": "रीयलटाइम/हिस्ट्री प्रीफ़िक्स दिखाएँ", + "preview": "पूर्वावलोकन", + "relative": "सापेक्ष", + "range": "रेंज", + "hide-timewindow-section": "अंतिम उपयोगकर्ताओं से टाइम विंडो सेक्शन छिपाएँ", + "hide-last-interval": "अंतिम उपयोगकर्ताओं से \"पिछले\" अंतराल छिपाएँ", + "hide-relative-interval": "अंतिम उपयोगकर्ताओं से सापेक्ष अंतराल छिपाएँ", + "hide-fixed-interval": "अंतिम उपयोगकर्ताओं से स्थिर अंतराल छिपाएँ", + "hide-aggregation": "अंतिम उपयोगकर्ताओं से एग्रीगेशन छिपाएँ", + "hide-group-interval": "अंतिम उपयोगकर्ताओं से ग्रुपिंग अंतराल छिपाएँ", + "hide-max-values": "अंतिम उपयोगकर्ताओं से अधिकतम मान छिपाएँ", + "hide-timezone": "अंतिम उपयोगकर्ताओं से टाइम ज़ोन छिपाएँ", + "disable-custom-interval": "कस्टम अंतराल चयन निष्क्रिय करें", + "edit-aggregation-functions-list": "एग्रीगेशन फ़ंक्शन्स की सूची संपादित करें", + "edit-aggregation-functions-list-hint": "उपलब्ध विकल्पों की सूची निर्दिष्ट की जा सकती है।", + "allowed-aggregation-functions": "अनुमत एग्रीगेशन फ़ंक्शन्स", + "edit-intervals-list": "अंतराल सूची संपादित करें", + "allowed-agg-intervals": "ग्रुपिंग अंतराल", + "default-agg-interval": "डिफ़ॉल्ट ग्रुपिंग अंतराल", + "edit-intervals-list-hint": "उपलब्ध अंतराल विकल्पों की सूची निर्दिष्ट की जा सकती है।", + "edit-grouping-intervals-list-hint": "ग्रुपिंग अंतरालों की सूची और डिफ़ॉल्ट ग्रुपिंग अंतराल को कॉन्फ़िगर करना संभव है।", + "all": "सभी" + }, + "tooltip": { + "trigger": "ट्रिगर", + "trigger-point": "बिंदु", + "trigger-axis": "अक्ष", + "label": "लेबल", + "value": "मान", + "date": "तिथि", + "show-date-time-interval": "तिथि-समय अंतराल दिखाएँ", + "show-date-time-interval-hint": "डेटा एग्रीगेशन के अनुसार तिथि-समय अंतराल दिखाएँ।", + "hide-zero-tooltip-values": "शून्य मान छिपाएँ", + "show-stack-total": "स्टैक मोड में कुल मान दिखाएँ", + "background-color": "पृष्ठभूमि रंग", + "background-blur": "पृष्ठभूमि ब्लर" + }, + "unit": { + "set-unit-conversion": "इकाई रूपांतरण सेट करें", + "unit-settings": { + "unit-settings": "इकाई सेटिंग्स", + "source-unit": "स्रोत इकाई", + "source-unit-hint": "यह संग्रहित मान की इकाई है, यानी वह इकाई जिससे आप रूपांतरण कर रहे हैं। वह प्रतीक दर्ज करें जो आपका स्रोत डेटा उपयोग करता है (जैसे m, km, ft, in)।", + "target-metric-unit": "टारगेट मेट्रिक इकाई", + "target-metric-unit-hint": "वह मेट्रिक (SI) इकाई चुनें जिसमें आप अपने स्रोत मान को बदलना चाहते हैं (जैसे cm, mm, km)।", + "target-imperial-unit": "टारगेट इम्पीरियल इकाई", + "target-imperial-unit-hint": "वह इम्पीरियल इकाई चुनें जिसमें आप अपने स्रोत मान को बदलना चाहते हैं (जैसे in, ft, yd)।", + "target-hybrid-unit": "टारगेट हाइब्रिड इकाई", + "target-hybrid-unit-hint": "वह हाइब्रिड इकाई चुनें जिसमें आप अपने स्रोत मान को बदलना चाहते हैं (जैसे cm, in, km)। हाइब्रिड इकाइयाँ मेट्रिक या इम्पीरियल इकाइयों को मिलाती हैं।", + "enable-unit-conversion": "इकाई रूपांतरण सक्षम करें", + "enable-unit-conversion-hint": "रूपांतरण सक्रिय करने के लिए ऑन करें। ऑफ होने पर आपका स्रोत मान बिना बदले चला जाएगा। यदि संबंधित माप समूह (जैसे Luminous flux, AQI) में केवल एक ही इकाई हो, तो यह निष्क्रिय रहता है।" + }, + "unit-system": "इकाई सिस्टम", + "unit-system-type": { + "AUTO": "ऑटो", + "METRIC": "मेट्रिक", + "IMPERIAL": "इम्पीरियल", + "HYBRID": "हाइब्रिड" + }, + "measures": { + "absorbed-dose-rate": "अवशोषित डोज दर", + "acceleration": "त्वरण", + "acidity": "अम्लता", + "air-quality-index": "वायु गुणवत्ता सूचकांक", + "amount-of-substance": "पदार्थ की मात्रा", + "angle": "कोण", + "angular-acceleration": "कोणीय त्वरण", + "area": "क्षेत्रफल", + "area-density": "क्षेत्रीय घनत्व", + "capacitance": "धारिता", + "catalytic-activity": "उत्प्रेरक सक्रियता", + "catalytic-concentration": "उत्प्रेरक सान्द्रता", + "charge": "आवेश", + "current-density": "धारा घनत्व", + "data-transfer-rate": "डेटा ट्रांसफ़र दर", + "density": "घनत्व", + "digital": "डिजिटल", + "dimension-ratio": "आयाम अनुपात", + "dynamic-viscosity": "गतिशील श्यानता", + "earthquake-magnitude": "भूकंप परिमाण", + "electric-charge-density": "विद्युत आवेश घनत्व", + "electric-current": "विद्युत धारा", + "electric-dipole-moment": "विद्युत द्विध्रुव आघूर्ण", + "electric-field-strength": "विद्युत क्षेत्र की तीव्रता", + "electric-flux": "विद्युत फ्लक्स", + "electric-permittivity": "विद्युत पारगम्यता", + "electric-polarizability": "विद्युत ध्रुवणक्षमता", + "electrical-conductance": "विद्युत चालकता", + "electrical-conductivity": "विद्युत चालकता गुणांक", + "energy": "ऊर्जा", + "energy-density": "ऊर्जा घनत्व", + "force": "बल", + "frequency": "आवृत्ति", + "fuel-efficiency": "ईंधन दक्षता", + "heat-capacity": "ऊष्मा धारिता", + "illuminance": "प्रकाशितता", + "inductance": "प्रेरकत्व", + "kinematic-viscosity": "गतिज श्यानता", + "length": "लंबाई", + "light-exposure": "प्रकाश एक्सपोज़र", + "linear-charge-density": "रेखीय आवेश घनत्व", + "logarithmic-ratio": "लघुगणकीय अनुपात", + "luminous-efficacy": "आलोक दक्षता", + "luminous-flux": "आलोक फ्लक्स", + "luminous-intensity": "आलोक तीव्रता", + "magnetic-field-gradient": "चुंबकीय क्षेत्र ग्रेडिएंट", + "magnetic-flux": "चुंबकीय फ्लक्स", + "magnetic-flux-density": "चुंबकीय फ्लक्स घनत्व", + "magnetic-moment": "चुंबकीय आघूर्ण", + "magnetic-permeability": "चुंबकीय पारगम्यता", + "mass": "द्रव्यमान", + "mass-fraction": "द्रव्यमान अंश", + "molar-concentration": "मोलर सांद्रता", + "molar-energy": "मोलर ऊर्जा", + "molar-heat-capacity": "मोलर ऊष्मा धारिता", + "molar-mass": "मोलर द्रव्यमान", + "number-concentration": "संख्या सांद्रता", + "parts-per-million": "पार्ट्स पर मिलियन", + "power": "शक्ति", + "power-density": "शक्ति घनत्व", + "pressure": "दाब", + "radiance": "दीप्ति", + "radiant-intensity": "दीप्त तीव्रता", + "radiation-dose": "विकिरण मात्रा", + "radioactive-decay": "रेडियोधर्मी अपक्षय", + "radioactivity": "रेडियोधर्मिता", + "radioactivity-concentration": "रेडियोधर्मिता सांद्रता", + "reciprocal-length": "प्रतिलोम लंबाई", + "resistance": "प्रतिरोध", + "reynolds-number": "रेनॉल्ड्स संख्या", + "signal-level": "सिग्नल स्तर", + "solid-angle": "घन कोण", + "specific-energy": "विशिष्ट ऊर्जा", + "specific-heat-capacity": "विशिष्ट ऊष्मा धारिता", + "specific-humidity": "विशिष्ट आर्द्रता", + "specific-volume": "विशिष्ट आयतन", + "speed": "वेग", + "surface-charge-density": "सतही आवेश घनत्व", + "surface-tension": "पृष्ठ तनाव", + "temperature": "तापमान", + "thermal-conductivity": "ऊष्मीय चालकता", + "time": "समय", + "torque": "टॉर्क", + "turbidity": "मलिनता", + "voltage": "वोल्टेज", + "volume": "आयतन", + "volume-flow": "आयतनिक प्रवाह" + }, + "millimeter": "मिलीमीटर", + "centimeter": "सेंटीमीटर", + "decimeter": "डेसीमीटर", + "angstrom": "आंग्स्ट्रॉम", + "nanometer": "नैनोमीटर", + "micrometer": "माइक्रोमीटर", + "meter": "मीटर", + "kilometer": "किलोमीटर", + "inch": "इंच", + "foot": "फुट", + "foot-us": "फुट (US सर्वे)", + "yard": "यार्ड", + "mile": "मील", + "nautical-mile": "समुद्री मील", + "astronomical-unit": "खगोलीय इकाई", + "reciprocal-metre": "प्रति मीटर", + "meter-per-meter": "मीटर प्रति मीटर", + "steradian": "स्टेरैडियन", + "thou": "थाउ", + "barleycorn": "बार्लीकॉर्न", + "hand": "हैंड", + "chain": "चेन", + "furlong": "फर्लांग", + "league": "लीग", + "fathom": "फैथम", + "cable": "केबल", + "link": "लिंक", + "rod": "रॉড", + "nanogram": "नैनोग्राम", + "microgram": "माइक्रोग्राम", + "milligram": "मिलिग्राम", + "gram": "ग्राम", + "kilogram": "किलोग्राम", + "tonne": "टन", + "ounce": "औंस", + "pound": "पाउंड", + "stone": "स्टोन", + "hundredweight-count": "हंड्रेडवेट काउंट", + "short-tons": "शॉर्ट टन", + "dalton": "डाल्टन", + "grain": "ग्रेन", + "drachm": "ड्राम", + "quarter": "क्वार्टर", + "slug": "स्लग", + "carat": "कैरेट", + "cubic-millimeter": "घन मिलीमीटर", + "cubic-centimeter": "घन सेंटीमीटर", + "cubic-meter": "घन मीटर", + "cubic-kilometer": "घन किलोमीटर", + "microliter": "माइक्रोलीटर", + "milliliter": "मिलीलीटर", + "liter": "लीटर", + "hectoliter": "हेक्टोलीटर", + "cubic-inch": "घन इंच", + "cubic-foot": "घन फुट", + "cubic-yard": "घन यार्ड", + "fluid-ounce": "फ्लूइड औंस", + "fluid-ounce-per-second": "फ्लूइड औंस प्रति सेकंड", + "pint": "पिंट", + "quart": "क्वार्ट", + "gallon": "गैलन", + "oil-barrels": "ऑयल बैरल", + "cubic-meter-per-kilogram": "किलोग्राम प्रति घन मीटर", + "gill": "गिल", + "hogshead": "हॉग्सहेड", + "teaspoon": "टीस्पून", + "tablespoon": "टेबलस्पून", + "cup": "कप", + "celsius": "सेल्सियस", + "kelvin": "केल्विन", + "rankine": "रैंकिन", + "fahrenheit": "फारेनहाइट", + "percent": "प्रतिशत", + "meter-per-second": "मीटर प्रति सेकंड", + "kilometer-per-hour": "किलोमीटर प्रति घंटा", + "foot-per-second": "फुट प्रति सेकंड", + "foot-per-minute": "फुट प्रति मिनट", + "mile-per-hour": "मील प्रति घंटा", + "knot": "नॉट", + "inch-per-second": "इंच प्रति सेकंड", + "inch-per-hour": "इंच प्रति घंटा", + "millimeters-per-minute": "मिलीमीटर प्रति मिनट", + "meter-per-minute": "मीटर प्रति मिनट", + "kilometer-per-hour-squared": "किलोमीटर प्रति घंटा वर्ग", + "foot-per-second-squared": "फुट प्रति सेकंड वर्ग", + "pascal": "पास्कल", + "kilopascal": "किलोपास्कल", + "megapascal": "मेगापास्कल", + "gigapascal": "गिगापास्कल", + "millibar": "मिलीबार", + "bar": "बार", + "kilobar": "किलोबार", + "newton": "न्यूटन", + "newton-meter": "न्यूटन मीटर", + "foot-pounds": "फुट-पाउंड", + "inch-pounds": "इंच-पाउंड", + "newton-per-meter": "न्यूटन प्रति मीटर", + "atmospheres": "एटमॉस्फियर", + "pounds-per-square-inch": "पाउंड प्रति वर्ग इंच", + "kilopound-per-square-inch": "किलोपाउंड प्रति वर्ग इंच", + "torr": "टॉर", + "inches-of-mercury": "इंच ऑफ मर्करी", + "pascal-per-square-meter": "पास्कल प्रति वर्ग मीटर", + "pound-per-square-inch": "पाउंड प्रति वर्ग इंच", + "newton-per-square-meter": "न्यूटन प्रति वर्ग मीटर", + "kilogram-force-per-square-meter": "किलोग्राम-फोर्स प्रति वर्ग मीटर", + "pascal-per-square-centimeter": "पास्कल प्रति वर्ग सेंटीमीटर", + "ton-force-per-square-inch": "टन-फोर्स प्रति वर्ग इंच", + "kilonewton-per-square-meter": "किलोन्यूटन प्रति वर्ग मीटर", + "newton-per-square-millimeter": "न्यूटन प्रति वर्ग मिलीमीटर", + "microjoule": "माइक्रोजूल", + "millijoule": "मिलीजूल", + "joule": "जूल", + "kilojoule": "किलोजूल", + "megajoule": "मेगाजूल", + "gigajoule": "गिगाजूल", + "watt-hour": "वॉट-घंटा", + "watt-minute": "वॉट-मिनट", + "kilowatt-hour": "किलोवॉट-घंटा", + "milliwatt-hour": "मिलीवॉट-घंटा", + "megawatt-hour": "मेगावॉट-घंटा", + "gigawatt-hour": "गिगावॉट-घंटा", + "electron-volts": "इलेक्ट्रॉन वोल्ट", + "joules-per-coulomb": "जूल प्रति कूलॉम", + "british-thermal-unit": "ब्रिटिश थर्मल यूनिट", + "thousand-british-thermal-unit": "हज़ार ब्रिटिश थर्मल यूनिट", + "million-british-thermal-unit": "मिलियन ब्रिटिश थर्मल यूनिट", + "foot-pound": "फुट-पाउंड", + "calorie": "कैलोरी", + "small-calorie": "छोटी कैलोरी", + "kilocalorie": "किलोकैलोरी", + "joule-per-kelvin": "जूल प्रति केल्विन", + "joule-per-kilogram-kelvin": "जूल प्रति किलोग्राम-केल्विन", + "joule-per-kilogram": "जूल प्रति किलोग्राम", + "watt-per-meter-kelvin": "वॉट प्रति मीटर-केल्विन", + "joule-per-cubic-meter": "जूल प्रति घन मीटर", + "therm": "थर्म", + "electric-dipole-moment": "विद्युत द्विध्रुव आघूर्ण", + "magnetic-dipole-moment": "चुंबकीय द्विध्रुव आघूर्ण", + "debye": "डेबाई", + "coulomb-per-square-meter-per-volt": "कूलॉम प्रति वर्ग मीटर प्रति वोल्ट", + "milliwatt": "मिलिवॉट", + "microwatt": "माइक्रोवॉट", + "watt": "वॉट", + "kilowatt": "किलोवॉट", + "megawatt": "मेगावॉट", + "gigawatt": "गिगावॉट", + "metric-horsepower": "मेट्रिक हॉर्सपावर", + "milliwatt-per-square-centimeter": "मिलिवॉट प्रति वर्ग सेंटीमीटर", + "watt-per-square-centimeter": "वॉट प्रति वर्ग सेंटीमीटर", + "kilowatt-per-square-centimeter": "किलोवॉट प्रति वर्ग सेंटीमीटर", + "milliwatt-per-square-meter": "मिलिवॉट प्रति वर्ग मीटर", + "watt-per-square-meter": "वॉट प्रति वर्ग मीटर", + "kilowatt-per-square-meter": "किलोवॉट प्रति वर्ग मीटर", + "watt-per-square-inch": "वॉट प्रति वर्ग इंच", + "kilowatt-per-square-inch": "किलोवॉट प्रति वर्ग इंच", + "horsepower": "हॉर्सपावर", + "btu-per-hour": "ब्रिटिश थर्मल यूनिट प्रति घंटा", + "btu-per-second": "ब्रिटिश थर्मल यूनिट प्रति सेकंड", + "btu-per-day": "ब्रिटिश थर्मल यूनिट प्रति दिन", + "mbtu-per-hour": "हज़ार ब्रिटिश थर्मल यूनिट प्रति घंटा", + "mbtu-per-second": "हज़ार ब्रिटिश थर्मल यूनिट प्रति सेकंड", + "mbtu-per-day": "हज़ार ब्रिटिश थर्मल यूनिट प्रति दिन", + "mmbtu-per-hour": "मिलियन ब्रिटिश थर्मल यूनिट प्रति घंटा", + "mmbtu-per-second": "मिलियन ब्रिटिश थर्मल यूनिट प्रति सेकंड", + "mmbtu-per-day": "मिलियन ब्रिटिश थर्मल यूनिट प्रति दिन", + "foot-pound-per-second": "फुट-पाउंड प्रति सेकंड", + "coulomb": "कूलॉम", + "millicoulomb": "मिलीकूलॉम", + "microcoulomb": "माइक्रोकूलॉम", + "nanocoulomb": "नैनोकूलॉम", + "picocoulomb": "पिको कूलॉम", + "coulomb-per-meter": "कूलॉम प्रति मीटर", + "coulomb-per-cubic-meter": "कूलॉम प्रति घन मीटर", + "coulomb-per-square-meter": "कूलॉम प्रति वर्ग मीटर", + "square-millimeter": "वर्ग मिलीमीटर", + "square-centimeter": "वर्ग सेंटीमीटर", + "square-meter": "वर्ग मीटर", + "hectare": "हेक्टेयर", + "square-kilometer": "वर्ग किलोमीटर", + "square-inch": "वर्ग इंच", + "square-foot": "वर्ग फुट", + "square-yard": "वर्ग गज", + "acre": "एकड़", + "square-mile": "वर्ग मील", + "are": "आर", + "barn": "बार्न", + "circular-inch": "परिपत्र इंच", + "milliampere-hour": "मिलिअंपियर-घंटा", + "ampere-hours": "अंपियर-घंटे", + "kiloampere-hours": "किलोअंपियर-घंटे", + "nanoampere": "नैनोअंपियर", + "picoampere": "पिकोअंपियर", + "microampere": "माइक्रोअंपियर", + "milliampere": "मिलिअंपियर", + "ampere": "अंपियर", + "kiloampere": "किलोअंपियर", + "megaampere": "मेगा-अंपियर", + "gigaampere": "गिगा-अंपियर", + "microampere-per-square-centimeter": "माइक्रोअंपियर प्रति वर्ग सेंटीमीटर", + "ampere-per-square-meter": "अंपियर प्रति वर्ग मीटर", + "ampere-per-meter": "अंपियर प्रति मीटर", + "oersted": "ओएरस्टेड", + "bohr-magneton": "बोर मैग्नेटॉन", + "ampere-meter-squared": "अंपियर-मीटर स्क्वेर्ड", + "nanovolt": "नैनोवोल्ट", + "picovolt": "पिकोवोल्ट", + "millivolt": "मिलिवोल्ट", + "microvolt": "माइक्रोवोल्ट", + "volt": "वोल्ट", + "kilovolt": "किलोवोल्ट", + "megavolt": "मेगावोल्ट", + "dbmV": "डेसीबेल वोल्ट", + "dbm": "डेसीबेल-मिलिवॉट्स", + "volt-meter": "वोल्ट-मीटर", + "kilovolt-meter": "किलोवोल्ट-मीटर", + "megavolt-meter": "मेगावोल्ट-मीटर", + "microvolt-meter": "माइक्रोवोल्ट-मीटर", + "millivolt-meter": "मिलिवोल्ट-मीटर", + "nanovolt-meter": "नैनोवोल्ट-मीटर", + "ohm": "ओम", + "microohm": "माइक्रोओम", + "milliohm": "मिलिओम", + "kilohm": "किलोओम", + "megohm": "मेगाओम", + "gigohm": "गिगाओम", + "millihertz": "मिलिहर्ट्ज़", + "hertz": "हर्ट्ज़", + "kilohertz": "किलोहर्ट्ज़", + "megahertz": "मेगाहर्ट्ज़", + "gigahertz": "गिगाहर्ट्ज़", + "terahertz": "टेराहर्ट्ज़", + "rpm": "प्रति मिनट घूर्णन", + "candela-per-square-meter": "कैंडेला प्रति वर्ग मीटर", + "candela": "कैंडेला", + "lumen": "लुमेन", + "lux": "लक्स", + "foot-candle": "फ़ुट-कैंडल", + "lumen-per-square-meter": "लुमेन प्रति वर्ग मीटर", + "lux-second": "लक्स सेकंड", + "lumen-second": "लुमेन सेकंड", + "lumens-per-watt": "लुमेन प्रति वॉट", + "mole": "मोल", + "nanomole": "नैनोमोल", + "micromole": "माइक्रोमोल", + "millimole": "मिलिमोल", + "kilomole": "किलोमोल", + "mole-per-cubic-meter": "मोल प्रति घन मीटर", + "rssi": "प्राप्त सिग्नल शक्ति सूचक", + "ppm": "पार्ट्स पर मिलियन", + "ppb": "पार्ट्स पर बिलियन", + "micrograms-per-cubic-meter": "माइक्रोग्राम प्रति घन मीटर", + "aqi": "AQI", + "gram-per-cubic-meter": "ग्राम प्रति घन मीटर", + "gram-per-kilogram": "विशिष्ट आर्द्रता", + "millimeters-per-second": "मिलीमीटर प्रति सेकंड", + "neper": "नेपर", + "bel": "बेल", + "decibel": "डेसीबेल", + "meters-per-second-squared": "मीटर प्रति सेकंड वर्ग", + "becquerel": "बेकरेल", + "curie": "क्यूरी", + "gray": "ग्रे", + "sievert": "सीवर्ट", + "roentgen": "रोएंटजन", + "cps": "प्रति सेकंड काउंट", + "rad": "रैड", + "rem": "रेम", + "dps": "प्रति सेकंड विघटन", + "rutherford": "रदरफोर्ड", + "coulombs-per-kilogram": "कूलॉम्ब प्रति किलोग्राम", + "becquerels-per-cubic-meter": "बेकरेल प्रति घन मीटर", + "curies-per-liter": "क्यूरी प्रति लीटर", + "becquerels-per-second": "बेकरेल प्रति सेकंड", + "curies-per-second": "क्यूरी प्रति सेकंड", + "gy-per-second": "ग्रे प्रति सेकंड", + "watt-per-steradian": "वॉट प्रति स्टीरेडियन", + "watt-per-square-metre-steradian": "वॉट प्रति वर्ग मीटर-स्टीरेडियन", + "ph-level": "pH स्तर", + "turbidity": "टर्बिडिटी", + "mg-per-liter": "मिलिग्राम प्रति लीटर", + "microsiemens-per-centimeter": "माइक्रोसीमेन्स प्रति सेंटीमीटर", + "millisiemens-per-meter": "मिलिसीमेन्स प्रति मीटर", + "siemens-per-meter": "सीमेन्स प्रति मीटर", + "kilogram-per-cubic-meter": "किलोग्राम प्रति घन मीटर", + "gram-per-cubic-centimeter": "ग्राम प्रति घन सेंटीमीटर", + "kilogram-per-square-meter": "किलोग्राम प्रति वर्ग मीटर", + "milligram-per-milliliter": "मिलिग्राम प्रति मिलीलीटर", + "milligram-per-cubic-meter": "मिलिग्राम प्रति घन मीटर", + "pound-per-cubic-foot": "पाउंड प्रति घन फ़ुट", + "ounces-per-cubic-inch": "औंस प्रति घन इंच", + "tons-per-cubic-yard": "टन प्रति घन यार्ड", + "particle-density": "कण घनत्व", + "kilometers-per-liter": "किलोमीटर प्रति लीटर", + "miles-per-gallon": "मील प्रति गैलन", + "liters-per-100-km": "100 किलोमीटर पर लीटर", + "gallons-per-mile": "गैलन प्रति मील", + "liters-per-hour": "लीटर प्रति घंटा", + "gallons-per-hour": "गैलन प्रति घंटा", + "beats-per-minute": "बीट्स प्रति मिनट", + "millimeters-of-mercury": "पारे के मिलीमीटर", + "milligrams-per-deciliter": "मिलिग्राम प्रति डेसीलीटर", + "g-force": "जी-फ़ोर्स", + "kilonewton": "किलो न्यूटन", + "kilogram-force": "किलोग्राम-फ़ोर्स", + "pound-force": "पाउंड-फ़ोर्स", + "kilopound-force": "किलोपाउंड-फ़ोर्स", + "dyne": "डाइन", + "poundal": "पाउंडल", + "kip": "किप", + "gal": "गैल", + "gravity": "गुरुत्वाकर्षण", + "hectopascal": "हेक्टोपास्कल", + "atmosphere": "एटमॉस्फ़ियर", + "millibars": "मिलिबार", + "inch-of-mercury": "पारे का इंच", + "richter-scale": "रिक्टर स्केल", + "nanosecond": "नैनोसेकंड", + "microsecond": "माइक्रोसेकंड", + "millisecond": "मिलीसेकंड", + "second": "सेकंड", + "minute": "मिनट", + "hour": "घंटा", + "day": "दिन", + "week": "सप्ताह", + "month": "महीना", + "year": "साल", + "cubic-foot-per-minute": "घन फ़ुट प्रति मिनट", + "cubic-meters-per-hour": "घन मीटर प्रति घंटा", + "cubic-meters-per-second": "घन मीटर प्रति सेकंड", + "liter-per-second": "लीटर प्रति सेकंड", + "liter-per-minute": "लीटर प्रति मिनट", + "gallons-per-minute": "गैलन प्रति मिनट", + "cubic-foot-per-second": "घन फ़ुट प्रति सेकंड", + "milliliters-per-minute": "मिलीलीटर प्रति मिनट", + "cubic-decimeter-per-second": "घन डेसीमीटर प्रति सेकंड", + "bit": "बिट", + "byte": "बाइट", + "kilobyte": "किलोबाइट", + "megabyte": "मेगाबाइट", + "gigabyte": "गीगाबाइट", + "terabyte": "टेराबाइट", + "petabyte": "पेटाबाइट", + "exabyte": "एग्ज़ाबाइट", + "zettabyte": "ज़ेटाबाइट", + "yottabyte": "योटाबाइट", + "bit-per-second": "बिट प्रति सेकंड", + "kilobit-per-second": "किलोबिट प्रति सेकंड", + "megabit-per-second": "मेगाबिट प्रति सेकंड", + "gigabit-per-second": "गीगाबिट प्रति सेकंड", + "terabit-per-second": "टेराबिट प्रति सेकंड", + "byte-per-second": "बाइट प्रति सेकंड", + "kilobyte-per-second": "किलोबाइट प्रति सेकंड", + "megabyte-per-second": "मेगाबाइट प्रति सेकंड", + "gigabyte-per-second": "गीगाबाइट प्रति सेकंड", + "degree": "डिग्री", + "radian": "रेडियन", + "gradian": "ग्रेडियन", + "arcminute": "आर्कमिनट", + "arcsecond": "आर्कसेकंड", + "milliradian": "मिलीरैडियन", + "revolution": "रेवोल्यूशन", + "siemens": "सीमेन्स", + "millisiemens": "मिलीसीमेन्स", + "microsiemens": "माइक्रोसीमेन्स", + "kilosiemens": "किलोसीमेन्स", + "megasiemens": "मेगासीमेन्स", + "gigasiemens": "गीगासीमेन्स", + "farad": "फैराड", + "millifarad": "मिलिफैराड", + "microfarad": "माइक्रोफैराड", + "nanofarad": "नैनोफैराड", + "picofarad": "पिकोफैराड", + "kilofarad": "किलोफैराड", + "megafarad": "मेगाफैराड", + "gigafarad": "गीगाफैराड", + "terfarad": "टेराफैराड", + "farad-per-meter": "फैराड प्रति मीटर", + "tesla": "टेस्ला", + "gauss": "गॉस", + "kilogauss": "किलोगॉस", + "millitesla": "मिलिटेस्ला", + "microtesla": "माइक्रोटेस्ला", + "nanotesla": "नैनोटेस्ला", + "kilotesla": "किलोटेस्ला", + "megatesla": "मेगाटेस्ला", + "millitesla-square-meters": "मिलिटेस्ला वर्ग मीटर", + "gamma": "गामा", + "lambda": "लैम्ब्डा", + "square-meter-per-second": "वर्ग मीटर प्रति सेकंड", + "square-centimeter-per-second": "वर्ग सेंटीमीटर प्रति सेकंड", + "stoke": "स्टोक", + "centistokes": "सेंटीस्टोक्स", + "square-foot-per-second": "वर्ग फ़ुट प्रति सेकंड", + "square-inch-per-second": "वर्ग इंच प्रति सेकंड", + "pascal-second": "पास्कल-सेकंड", + "centipoise": "सेंटिपॉइज़", + "poise": "पॉइज़", + "reynolds": "रेनॉल्ड्स", + "pound-per-foot-hour": "पाउंड प्रति फ़ुट-घंटा", + "newton-second-per-square-meter": "न्यूटन सेकंड प्रति वर्ग मीटर", + "dyne-second-per-square-centimeter": "डाइन सेकंड प्रति वर्ग सेंटीमीटर", + "kilogram-per-meter-second": "किलोग्राम प्रति मीटर-सेकंड", + "tesla-square-meters": "टेस्ला वर्ग मीटर", + "maxwell": "मैक्सवेल", + "tesla-per-meter": "टेस्ला प्रति मीटर", + "gauss-per-centimeter": "गॉस प्रति सेंटीमीटर", + "weber": "वेबर", + "microweber": "माइक्रोवेबर", + "milliweber": "मिलिवेबर", + "gauss-square-centimeter": "गॉस वर्ग सेंटीमीटर", + "kilogauss-square-centimeter": "किलोगॉस वर्ग सेंटीमीटर", + "henry": "हेनरी", + "millihenry": "मिलिहेनरी", + "microhenry": "माइक्रोहेनरी", + "nanohenry": "नैनोहेनरी", + "henry-per-meter": "हेनरी प्रति मीटर", + "tesla-meter-per-ampere": "टेस्ला मीटर प्रति एंपियर", + "gauss-per-oersted": "गॉस प्रति ओएर्स्टेड", + "kilogram-per-mole": "किलोग्राम प्रति मोल", + "gram-per-mole": "ग्राम प्रति मोल", + "milligram-per-mole": "मिलिग्राम प्रति मोल", + "joule-per-mole": "जूल प्रति मोल", + "joule-per-mole-kelvin": "जूल प्रति मोल-केल्विन", + "millivolts-per-meter": "मिलिवोल्ट प्रति मीटर", + "volts-per-meter": "वोल्ट प्रति मीटर", + "kilovolts-per-meter": "किलोवोल्ट प्रति मीटर", + "radian-per-second": "रेडियन प्रति सेकंड", + "radian-per-second-squared": "रेडियन प्रति सेकंड स्क्वेयर", + "revolutions-per-minute-per-second": "कोणीय त्वरण", + "deg-per-second": "डिग्री प्रति सेकंड", + "rotation-per-minute": "रोटेशन प्रति मिनट", + "degrees-brix": "डिग्री ब्रिक्स", + "katal": "कैटल", + "katal-per-cubic-metre": "कैटल प्रति क्यूबिक मीटर", + "paris-inch": "पेरिस इंच" + }, + "user": { + "user": "उपयोगकर्ता", + "users": "उपयोगकर्ता", + "customer-users": "कस्टमर उपयोगकर्ता", + "tenant-admins": "टेनेंट एडमिन", + "sys-admin": "सिस्टम एडमिनिस्ट्रेटर", + "tenant-admin": "टेनेंट एडमिनिस्ट्रेटर", + "customer": "कस्टमर", + "anonymous": "अनाम", + "add": "उपयोगकर्ता जोड़ें", + "delete": "उपयोगकर्ता हटाएँ", + "add-user-text": "नया उपयोगकर्ता जोड़ें", + "no-users-text": "कोई उपयोगकर्ता नहीं मिला", + "user-details": "उपयोगकर्ता विवरण", + "delete-user-title": "क्या आप वाकई उपयोगकर्ता '{{userEmail}}' को हटाना चाहते हैं?", + "delete-user-text": "सावधान रहें, पुष्टि के बाद उपयोगकर्ता और उससे संबंधित सभी डेटा स्थायी रूप से हटा दिए जाएँगे।", + "delete-users-title": "क्या आप वाकई { count, plural, =1 {1 उपयोगकर्ता} other {# उपयोगकर्ताओं} } को हटाना चाहते हैं?", + "delete-users-action-title": "हटाएँ { count, plural, =1 {1 उपयोगकर्ता} other {# उपयोगकर्ताओं} }", + "delete-users-text": "सावधान रहें, पुष्टि के बाद चुने गए सभी उपयोगकर्ता और उनसे संबंधित सभी डेटा स्थायी रूप से हटा दिए जाएँगे।", + "activation-email-sent-message": "सक्रियण ईमेल सफलतापूर्वक भेज दिया गया!", + "resend-activation": "सक्रियण फिर से भेजें", + "email": "ईमेल", + "email-required": "ईमेल आवश्यक है।", + "invalid-email-format": "ईमेल प्रारूप मान्य नहीं है।", + "first-name": "पहला नाम", + "last-name": "अंतिम नाम", + "description": "विवरण", + "default-dashboard": "डिफ़ॉल्ट डैशबोर्ड", + "always-fullscreen": "हमेशा फ़ुलस्क्रीन", + "select-user": "उपयोगकर्ता चुनें", + "no-users-matching": "कोई उपयोगकर्ता '{{entity}}' से मेल नहीं खा रहा।", + "user-required": "उपयोगकर्ता आवश्यक है", + "activation-method": "सक्रियण विधि", + "display-activation-link": "सक्रियण लिंक दिखाएँ", + "send-activation-mail": "सक्रियण मेल भेजें", + "activation-link": "उपयोगकर्ता सक्रियण लिंक", + "activation-link-text": "उपयोगकर्ता को सक्रिय करने के लिए निम्न सक्रियण लिंक का उपयोग करें ({{activationLinkTtl}} में समाप्त होगा) :", + "copy-activation-link": "सक्रियण लिंक कॉपी करें", + "activation-link-copied-message": "उपयोगकर्ता सक्रियण लिंक क्लिपबोर्ड पर कॉपी कर दिया गया है", + "details": "विवरण", + "login-as-tenant-admin": "टेनेंट एडमिन के रूप में लॉगिन करें", + "login-as-customer-user": "कस्टमर उपयोगकर्ता के रूप में लॉगिन करें", + "search": "उपयोगकर्ताओं को खोजें", + "selected-users": "{ count, plural, =1 {1 उपयोगकर्ता} other {# उपयोगकर्ताओं} } चुने गए", + "disable-account": "उपयोगकर्ता खाता निष्क्रिय करें", + "enable-account": "उपयोगकर्ता खाता सक्रिय करें", + "enable-account-message": "उपयोगकर्ता खाता सफलतापूर्वक सक्रिय कर दिया गया!", + "disable-account-message": "उपयोगकर्ता खाता सफलतापूर्वक निष्क्रिय कर दिया गया!", + "copyId": "उपयोगकर्ता Id कॉपी करें", + "idCopiedMessage": "उपयोगकर्ता Id क्लिपबोर्ड पर कॉपी कर दी गई है", + "user-list": "उपयोगकर्ताओं की सूची", + "user-list-required": "उपयोगकर्ताओं की सूची आवश्यक है" + }, + "value": { + "type": "मान का प्रकार", + "string": "स्ट्रिंग", + "string-value": "स्ट्रिंग मान", + "string-value-required": "स्ट्रिंग मान आवश्यक है", + "integer": "इंटीजर", + "integer-value": "इंटीजर मान", + "integer-value-required": "इंटीजर मान आवश्यक है", + "invalid-integer-value": "अमान्य इंटीजर मान", + "double": "डबल", + "double-value": "डबल मान", + "double-value-required": "डबल मान आवश्यक है", + "boolean": "बूलियन", + "boolean-value": "बूलियन मान", + "false": "फॉल्स", + "true": "ट्रू", + "long": "लॉन्ग", + "json": "JSON", + "json-value": "JSON मान", + "json-value-invalid": "JSON मान का फ़ॉर्मेट अमान्य है", + "json-value-required": "JSON मान आवश्यक है।" + }, + "version-control": { + "version-control": "वर्ज़न कंट्रोल", + "management": "वर्ज़न कंट्रोल प्रबंधन", + "search": "वर्ज़न खोजें", + "branch": "ब्रांच", + "default": "डिफ़ॉल्ट", + "select-branch": "ब्रांच चुनें", + "branch-required": "ब्रांच आवश्यक है", + "create-entity-version": "एंटिटी वर्ज़न बनाएँ", + "version-name": "वर्ज़न नाम", + "version-name-required": "वर्ज़न नाम आवश्यक है", + "author": "लेखक", + "export-relations": "रिलेशन एक्सपोर्ट करें", + "export-attributes": "विशेषताएँ एक्सपोर्ट करें", + "export-credentials": "क्रेडेंशियल्स एक्सपोर्ट करें", + "export-calculated-fields": "कैलक्युलेटेड फ़ील्ड्स एक्सपोर्ट करें", + "entity-versions": "एंटिटी वर्ज़न", + "versions": "वर्ज़न", + "created-time": "बनाने का समय", + "version-id": "वर्ज़न ID", + "no-entity-versions-text": "कोई एंटिटी वर्ज़न नहीं मिला", + "no-versions-text": "कोई वर्ज़न नहीं मिला", + "copy-full-version-id": "पूरा वर्ज़न ID कॉपी करें", + "create-version": "वर्ज़न बनाएँ", + "creating-version": "वर्ज़न बनाया जा रहा है... कृपया प्रतीक्षा करें", + "nothing-to-commit": "कमीट करने के लिए कोई बदलाव नहीं", + "restore-version": "वर्ज़न पुनर्स्थापित करें", + "restore-entity-from-version": "वर्ज़न '{{versionName}}' से एंटिटी पुनर्स्थापित करें", + "restoring-entity-version": "एंटिटी वर्ज़न पुनर्स्थापित किया जा रहा है... कृपया प्रतीक्षा करें", + "load-relations": "रिलेशन लोड करें", + "load-attributes": "विशेषताएँ लोड करें", + "load-credentials": "क्रेडेंशियल्स लोड करें", + "load-calculated-fields": "कैलक्युलेटेड फ़ील्ड्स लोड करें", + "compare-with-current": "वर्तमान से तुलना करें", + "diff-entity-with-version": "एंटिटी वर्ज़न '{{versionName}}' से तुलना", + "previous-difference": "पिछला अंतर", + "next-difference": "अगला अंतर", + "current": "वर्तमान", + "differences": "{ count, plural, =1 {1 अंतर} other {# अंतर} }", + "create-entities-version": "एंटिटीज़ वर्ज़न बनाएँ", + "default-sync-strategy": "डिफ़ॉल्ट सिंक स्ट्रैटेजी", + "sync-strategy-merge": "मर्ज", + "sync-strategy-overwrite": "ओवरराइट", + "entities-to-export": "एक्सपोर्ट करने के लिए एंटिटीज़", + "entities-to-restore": "रिस्टोर करने के लिए एंटिटीज़", + "sync-strategy": "सिंक स्ट्रैटेजी", + "all-entities": "सभी एंटिटीज़", + "no-entities-to-export-prompt": "कृपया एक्सपोर्ट करने के लिए एंटिटीज़ निर्दिष्ट करें", + "no-entities-to-restore-prompt": "कृपया रिस्टोर करने के लिए एंटिटीज़ निर्दिष्ट करें", + "add-entity-type": "एंटिटी टाइप जोड़ें", + "remove-all": "सभी हटाएँ", + "version-create-result": "{ added, plural, =0 {कोई एंटिटी नहीं} =1 {1 एंटिटी} other {# एंटिटीज़} } जोड़ी गईं.
{ modified, plural, =0 {कोई एंटिटी नहीं} =1 {1 एंटिटी} other {# एंटिटीज़} } बदली गईं.
{ removed, plural, =0 {कोई एंटिटी नहीं} =1 {1 एंटिटी} other {# एंटिटीज़} } हटाई गईं.", + "remove-other-entities": "अन्य एंटिटीज़ हटाएँ", + "find-existing-entity-by-name": "नाम से मौजूदा एंटिटी खोजें", + "restore-entities-from-version": "वर्ज़न '{{versionName}}' से एंटिटीज़ रिस्टोर करें", + "restoring-entities-from-version": "एंटिटीज़ रिस्टोर की जा रही हैं... कृपया प्रतीक्षा करें", + "no-entities-restored": "कोई एंटिटी रिस्टोर नहीं की गई", + "created": "{{created}} बनाए गए", + "updated": "{{updated}} अपडेट किए गए", + "deleted": "{{deleted}} डिलीट किए गए", + "remove-other-entities-confirm-text": "सावधान रहें! इससे उन सभी वर्तमान एंटिटीज़ को स्थायी रूप से डिलीट कर दिया जाएगा
जो उस वर्ज़न में मौजूद नहीं हैं जिसे आप रिस्टोर करना चाहते हैं।

कन्फ़र्म करने के लिए कृपया \"अन्य एंटिटीज़ हटाएँ\" टाइप करें।", + "auto-commit-to-branch": "ऑटो-कमिट {{ branch }} ब्रांच पर", + "default-create-entity-version-name": "{{entityName}} अपडेट", + "sync-strategy-merge-hint": "रिपॉज़िटरी में चुनी गई एंटिटीज़ को बनाता या अपडेट करता है। अन्य सभी रिपॉज़िटरी एंटिटीज़ परिवर्तित नहीं की जातीं।", + "sync-strategy-overwrite-hint": "रिपॉज़िटरी में चुनी गई एंटिटीज़ को बनाता या अपडेट करता है। अन्य सभी रिपॉज़िटरी एंटिटीज़ डिलीट कर दी जाती हैं।", + "device-credentials-conflict": "एक्सटर्नल ID {{entityId}} वाले डिवाइस को लोड करने में विफल
क्योंकि वही क्रेडेंशियल्स पहले से किसी दूसरे डिवाइस के लिए डेटाबेस में मौजूद हैं।
कृपया रिस्टोर फॉर्म में लोड क्रेडेंशियल्स सेटिंग को डिसेबल करने पर विचार करें।", + "missing-referenced-entity": "एक्सटर्नल ID {{sourceEntityId}} वाली {{sourceEntityTypeName}} को लोड करने में विफल
क्योंकि यह ID {{targetEntityId}} वाली गुम {{targetEntityTypeName}} को रेफ़र करती है।", + "runtime-failed": "विफल: {{message}}", + "auto-commit-settings-read-only-hint": "रिपॉज़िटरी सेटिंग्स में रीड-ओनली विकल्प सक्षम होने पर ऑटो-कमिट फ़ीचर काम नहीं करता।", + "rollback-on-error": "एरर होने पर रोलबैक", + "rollback-on-error-hint": "यदि आपके पास रिस्टोर करने के लिए एंटिटीज़ की संख्या बहुत अधिक है, तो प्रदर्शन बढ़ाने के लिए इस विकल्प को डिसेबल करने पर विचार करें।\n ध्यान दें, वर्ज़न लोड करते समय यदि कोई एरर हो जाता है, तो पहले से सेव की गई एंटिटीज़ (रिलेशन, विशेषताओं आदि के साथ) जैसी हैं वैसी ही बनी रहेंगी" + }, + "widget": { + "widget-library": "विजेट लाइब्रेरी", + "widget-bundle": "विजेट बंडल", + "all-bundles": "सभी बंडल्स", + "select-widgets-bundle": "विजेट बंडल चुनें", + "widgets": "विजेट", + "all-widgets": "सभी विजेट", + "widget": "विजेट", + "select-widget": "विजेट चुनें", + "no-widgets-matching": " '{{entity}}' से मेल खाते कोई विजेट नहीं मिले।", + "no-widgets": "अभी तक कोई विजेट नहीं", + "no-widgets-text": "कोई विजेट नहीं मिला", + "management": "विजेट प्रबंधन", + "editor": "विजेट एडिटर", + "confirm-to-exit-editor-html": "आपके पास असहेजे हुए विजेट सेटिंग्स हैं।
क्या आप वाकई इस पेज से बाहर जाना चाहते हैं?", + "widget-type-not-found": "विजेट कॉन्फ़िगरेशन लोड करते समय समस्या हुई।
संभवतः संबंधित\n विजेट प्रकार हटा दिया गया है।", + "widget-type-load-error": "निम्नलिखित त्रुटियों के कारण विजेट लोड नहीं किया जा सका:", + "remove": "विजेट हटाएँ", + "delete": "विजेट डिलीट करें", + "edit": "विजेट संपादित करें", + "remove-widget-title": "क्या आप वाकई विजेट '{{widgetTitle}}' हटाना चाहते हैं?", + "remove-widget-text": "पुष्टि के बाद यह विजेट और इससे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "replace-reference-with-widget-copy": "रेफ़्रेन्स को विजेट कॉपी से बदलें", + "timeseries": "टाइम सीरीज़", + "search-data": "डेटा खोजें", + "no-data-found": "कोई डेटा नहीं मिला", + "latest": "नवीनतम मान", + "rpc": "कंट्रोल विजेट", + "alarm": "अलार्म विजेट", + "static": "स्टैटिक विजेट", + "timeseries-short": "सीरीज़", + "latest-short": "नवीनतम", + "rpc-short": "कंट्रोल", + "alarm-short": "अलार्म", + "static-short": "स्टैटिक", + "select-widget-type": "विजेट प्रकार चुनें", + "missing-widget-title-error": "विजेट शीर्षक अवश्य निर्दिष्ट होना चाहिए!", + "widget-saved": "विजेट सहेजा गया", + "unable-to-save-widget-error": "विजेट को सहेजा नहीं जा सका! विजेट में त्रुटियाँ हैं!", + "save": "विजेट सहेजें", + "saveAs": "विजेट को इस रूप में सहेजें", + "move": "विजेट स्थानांतरित करें", + "save-widget-as": "विजेट को इस रूप में सहेजें", + "save-widget-as-text": "कृपया नया विजेट शीर्षक दर्ज करें", + "toggle-fullscreen": "फुलस्क्रीन टॉगल करें", + "run": "विजेट चलाएँ", + "widget-title": "विजेट शीर्षक", + "title": "शीर्षक", + "title-required": "विजेट शीर्षक आवश्यक है।", + "title-max-length": "शीर्षक 256 अक्षरों से कम होना चाहिए", + "system": "सिस्टम", + "type": "विजेट प्रकार", + "resources": "संसाधन", + "resource-url": "JavaScript/CSS URL", + "resource-is-extension": "एक्सटेंशन है", + "remove-resource": "संसाधन हटाएँ", + "add-resource": "संसाधन जोड़ें", + "html": "HTML", + "tidy": "साफ़ करें", + "css": "CSS", + "settings-form": "सेटिंग्स फ़ॉर्म", + "data-key-settings-form": "डेटा कुंजी सेटिंग्स फ़ॉर्म", + "latest-data-key-settings-form": "नवीनतम डेटा कुंजी सेटिंग्स फ़ॉर्म", + "widget-settings": "विजेट सेटिंग्स", + "description": "विवरण", + "tags": "टैग", + "image-preview": "छवि पूर्वावलोकन", + "settings-form-selector": "सेटिंग्स फ़ॉर्म चयनकर्ता", + "data-key-settings-form-selector": "डेटा कुंजी सेटिंग्स फ़ॉर्म चयनकर्ता", + "latest-data-key-settings-form-selector": "नवीनतम डेटा कुंजी सेटिंग्स फ़ॉर्म चयनकर्ता", + "all": "सभी", + "actual": "वास्तविक", + "scada": "SCADA प्रतीक", + "deprecated": "अप्रचलित", + "has-basic-mode": "बेसिक मोड उपलब्ध", + "basic-mode-form-selector": "बेसिक मोड फ़ॉर्म चयनकर्ता", + "basic-mode": "बेसिक", + "advanced-mode": "उन्नत", + "javascript": "JavaScript", + "js": "JS", + "delete-widget-title": "क्या आप वाकई विजेट '{{widgetName}}' हटाना चाहते हैं?", + "delete-widget-text": "पुष्टि के बाद यह विजेट और इससे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "delete-widgets-title": "क्या आप वाकई { count, plural, =1 {1 विजेट} other {# विजेट} } हटाना चाहते हैं?", + "delete-widgets-text": "सावधान रहें, पुष्टि के बाद सभी चयनित विजेट हटाए जाएँगे और उनसे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "delete-widget": "विजेट हटाएँ", + "widget-template-load-failed-error": "विजेट टेम्पलेट लोड करने में विफल!", + "details": "विवरण", + "widget-details": "विजेट विवरण", + "add": "विजेट जोड़ें", + "add-existing-widget": "मौजूदा विजेट जोड़ें", + "add-new-widget": "नया विजेट जोड़ें", + "search-widgets": "विजेट खोजें", + "selected-widgets": "{ count, plural, =1 {1 विजेट} other {# विजेट} } चयनित", + "undo": "विजेट परिवर्तनों को पूर्ववत करें", + "export": "विजेट निर्यात करें", + "export-prompt": "विजेट छवियों और संसाधनों को एम्बेड करें", + "export-widgets": "विजेट निर्यात करें", + "export-widgets-prompt": "विजेट की छवियाँ और संसाधन एम्बेड करें", + "import": "विजेट आयात करें", + "no-data": "विजेट पर दिखाने के लिए कोई डेटा नहीं", + "data-overflow": "विजेट {{total}} में से {{count}} एंटिटीज़ प्रदर्शित कर रहा है", + "alarm-data-overflow": "विजेट {{totalEntities}} एंटिटीज़ में से {{allowedEntities}} (अधिकतम अनुमत) एंटिटीज़ के लिए अलार्म प्रदर्शित कर रहा है", + "search": "विजेट खोजें", + "filter": "विजेट फ़िल्टर प्रकार", + "loading-widgets": "विजेट लोड किए जा रहे हैं...", + "widget-template-error": "अमान्य विजेट HTML टेम्पलेट।", + "reference": "संदर्भ" + }, + "widget-action": { + "header-button": "विजेट हेडर बटन", + "do-nothing": "कुछ न करें", + "open-dashboard-state": "नए डैशबोर्ड स्टेट पर जाएँ", + "update-dashboard-state": "वर्तमान डैशबोर्ड स्टेट अपडेट करें", + "open-dashboard": "अन्य डैशबोर्ड पर जाएँ", + "custom": "कस्टम एक्शन", + "custom-pretty": "कस्टम एक्शन (HTML टेम्पलेट सहित)", + "custom-pretty-error-title": "कस्टम डायलॉग त्रुटि", + "custom-pretty-template-error": "अमान्य कस्टम डायलॉग टेम्पलेट।", + "custom-pretty-controller-error": "कस्टम डायलॉग फ़ंक्शन का मूल्यांकन करते समय त्रुटि हुई।", + "mobile-action": "मोबाइल एक्शन", + "target-dashboard-state": "टार्गेट डैशबोर्ड स्टेट", + "target-dashboard-state-required": "टार्गेट डैशबोर्ड स्टेट आवश्यक है", + "set-entity-from-widget": "विजेट से एंटिटी सेट करें", + "target-dashboard": "टार्गेट डैशबोर्ड", + "select-target-dashboard": "टार्गेट डैशबोर्ड चुनें", + "target-dashboard-required": "टार्गेट डैशबोर्ड आवश्यक है।", + "open-right-layout": "दाएँ डैशबोर्ड लेआउट खोलें (मोबाइल व्यू)", + "state-display-type": "डैशबोर्ड स्टेट डिस्प्ले विकल्प", + "open-normal": "सामान्य", + "open-in-separate-dialog": "अलग डायलॉग में खोलें", + "open-in-popover": "पॉपओवर में खोलें", + "dialog-title": "डायलॉग शीर्षक", + "dialog-hide-dashboard-toolbar": "डायलॉग में डैशबोर्ड टूलबार छुपाएँ", + "dialog-width": "डायलॉग की चौड़ाई (व्यू-पोर्ट चौड़ाई का प्रतिशत)", + "dialog-height": "डायलॉग की ऊँचाई (व्यू-पोर्ट ऊँचाई का प्रतिशत)", + "dialog-size-range-error": "डायलॉग आकार प्रतिशत मान 1 से 100 के बीच होना चाहिए।", + "popover-preferred-placement": "पसंदीदा पॉपओवर प्लेसमेंट", + "popover-placement-top": "ऊपर", + "popover-placement-topLeft": "ऊपर-बाएँ", + "popover-placement-topRight": "ऊपर-दाएँ", + "popover-placement-right": "दाएँ", + "popover-placement-rightTop": "दाएँ-ऊपर", + "popover-placement-rightBottom": "दाएँ-नीचे", + "popover-placement-bottom": "नीचे", + "popover-placement-bottomLeft": "नीचे-बाएँ", + "popover-placement-bottomRight": "नीचे-दाएँ", + "popover-placement-left": "बाएँ", + "popover-placement-leftTop": "बाएँ-ऊपर", + "popover-placement-leftBottom": "बाएँ-नीचे", + "popover-hide-on-click-outside": "बाहर क्लिक करने पर पॉपओवर छुपाएँ", + "popover-hide-dashboard-toolbar": "पॉपओवर में डैशबोर्ड टूलबार छुपाएँ", + "popover-width": "पॉपओवर चौड़ाई", + "popover-height": "पॉपओवर ऊँचाई", + "popover-style": "पॉपओवर शैली", + "open-new-browser-tab": "नए ब्राउज़र टैब में खोलें", + "open-URL": "URL खोलें", + "URL": "URL", + "url-required": "URL आवश्यक है।", + "mobile": { + "device-provision": "डिवाइस प्रोविज़न", + "action-type": "मोबाइल एक्शन प्रकार", + "select-action-type": "मोबाइल एक्शन प्रकार चुनें", + "action-type-required": "मोबाइल एक्शन प्रकार आवश्यक है", + "take-picture-from-gallery": "गैलरी से चित्र लें", + "take-photo": "फ़ोटो लें", + "map-direction": "मैप दिशानिर्देश खोलें", + "map-location": "मैप स्थान खोलें", + "scan-qr-code": "QR कोड स्कैन करें", + "make-phone-call": "फ़ोन कॉल करें", + "get-location": "फ़ोन लोकेशन प्राप्त करें", + "take-screenshot": "स्क्रीनशॉट लें" + }, + "custom-action-function": "कस्टम एक्शन फ़ंक्शन", + "custom-pretty-function": "कस्टम एक्शन (HTML टेम्पलेट सहित) फ़ंक्शन", + "map-item-type": "मैप आइटम प्रकार", + "map-item": { + "marker": "मार्कर", + "polygon": "बहुभुज", + "rectangle": "आयत", + "circle": "वृत्त" + }, + "place-map-item": "मैप आइटम रखें", + "map-item-tooltip": { + "customize-map-item-tooltips": "मैप आइटम टूलटिप्स अनुकूलित करें", + "place-marker": "मार्कर रखें", + "start-draw-rectangle": "आयत बनाना शुरू करें", + "finish-draw-rectangle": "आयत बनाना समाप्त करें", + "start-draw-polygon": "बहुभुज बनाना शुरू करें", + "continue-draw-polygon": "बहुभुज बनाना जारी रखें", + "finish-draw-polygon": "बहुभुज बनाना समाप्त करें", + "start-draw-circle": "वृत्त बनाना शुरू करें", + "finish-draw-circle": "वृत्त बनाना समाप्त करें" + } + }, + "widgets-bundle": { + "current": "वर्तमान बंडल", + "widgets-bundles": "विजेट बंडल्स", + "widgets-bundle-widgets": "विजेट बंडल के विजेट", + "add": "विजेट बंडल जोड़ें", + "delete": "विजेट बंडल हटाएँ", + "title": "शीर्षक", + "title-required": "शीर्षक आवश्यक है।", + "title-max-length": "शीर्षक 256 अक्षरों से कम होना चाहिए", + "description": "विवरण", + "image-preview": "छवि पूर्वावलोकन", + "scada": "SCADA विजेट बंडल", + "order": "क्रम", + "add-widgets-bundle-text": "नया विजेट बंडल जोड़ें", + "no-widgets-bundles-text": "कोई विजेट बंडल नहीं मिला", + "empty": "विजेट बंडल खाली है", + "details": "विवरण", + "widgets-bundle-details": "विजेट बंडल विवरण", + "delete-widgets-bundle-title": "क्या आप वाकई विजेट बंडल '{{widgetsBundleTitle}}' हटाना चाहते हैं?", + "delete-widgets-bundle-text": "सावधान रहें, पुष्टि के बाद यह विजेट बंडल और उससे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "delete-widgets-bundles-title": "क्या आप वाकई { count, plural, =1 {1 विजेट बंडल} other {# विजेट बंडल्स} } हटाना चाहते हैं?", + "delete-widgets-bundles-action-title": "हटाएँ { count, plural, =1 {1 विजेट बंडल} other {# विजेट बंडल्स} }", + "delete-widgets-bundles-text": "सावधान रहें, पुष्टि के बाद सभी चयनित विजेट बंडल्स हटाए जाएँगे और उनसे संबंधित सभी डेटा पुनर्प्राप्त नहीं किया जा सकेगा।", + "no-widgets-bundles-matching": " '{{widgetsBundle}}' से मेल खाते कोई विजेट बंडल नहीं मिले।", + "widgets-bundle-required": "विजेट बंडल आवश्यक है।", + "system": "सिस्टम", + "import": "विजेट बंडल आयात करें", + "export": "विजेट बंडल निर्यात करें", + "export-widgets-bundle-widgets-prompt": "निर्यात किए गए डेटा में बंडल के विजेट शामिल करें (अन्यथा केवल संदर्भित विजेट FQNs निर्यात किए जाएँगे)", + "export-failed-error": "विजेट बंडल निर्यात नहीं किया जा सका: {{error}}", + "create-new-widgets-bundle": "नया विजेट बंडल बनाएँ", + "widgets-bundle-file": "विजेट बंडल फ़ाइल", + "invalid-widgets-bundle-file-error": "विजेट बंडल आयात नहीं किया जा सका: अमान्य विजेट बंडल डेटा संरचना।", + "search": "विजेट बंडल खोजें", + "selected-widgets-bundles": "{ count, plural, =1 {1 विजेट बंडल} other {# विजेट बंडल्स} } चयनित", + "open-widgets-bundle": "विजेट बंडल खोलें", + "loading-widgets-bundles": "विजेट बंडल्स लोड किए जा रहे हैं...", + "create-new": "नया विजेट बंडल बनाएँ" + }, + "widget-config": { + "data": "डेटा", + "settings": "सेटिंग्स", + "advanced": "उन्नत", + "appearance": "दिखावट", + "widget-card": "विजेट कार्ड", + "mobile": "मोबाइल", + "title": "शीर्षक", + "title-tooltip": "शीर्षक टूलटिप", + "general-settings": "सामान्य सेटिंग्स", + "display-title": "विजेट शीर्षक प्रदर्शित करें", + "card-title": "कार्ड शीर्षक", + "drop-shadow": "ड्रॉप शैडो", + "enable-fullscreen": "फुलस्क्रीन सक्षम करें", + "background-color": "पृष्ठभूमि रंग", + "text-color": "पाठ रंग", + "border-radius": "बॉर्डर रेडियस", + "padding": "पैडिंग", + "margin": "मार्जिन", + "widget-style": "विजेट स्टाइल", + "widget-css": "विजेट CSS", + "title-style": "शीर्षक स्टाइल", + "mobile-mode-settings": "मोबाइल मोड", + "order": "क्रम", + "height": "ऊँचाई", + "mobile-hide": "मोबाइल मोड में विजेट छुपाएँ", + "desktop-hide": "डेस्कटॉप मोड में विजेट छुपाएँ", + "units": "मान के पास दिखाने हेतु विशेष प्रतीक", + "units-by-default": "डिफ़ॉल्ट इकाइयाँ", + "decimals": "दशमलव के बाद अंकों की संख्या", + "decimals-by-default": "डिफ़ॉल्ट दशमलव", + "default-data-key-parameter-hint": "यह पैरामीटर सभी विजेट मानों पर लागू होता है, जब तक कि डेटा कुंजी कॉन्फ़िगरेशन द्वारा अधिलेखित न किया जाए", + "units-short": "इकाइयाँ", + "decimals-short": "दशमलव", + "decimals-suffix": "दशमलव", + "digits-suffix": "अंक", + "timewindow": "टाइम विंडो", + "use-dashboard-timewindow": "डैशबोर्ड टाइम विंडो का उपयोग करें", + "use-widget-timewindow": "विजेट टाइम विंडो का उपयोग करें", + "display-timewindow": "टाइम विंडो प्रदर्शित करें", + "legend": "लीजेंड", + "display-legend": "लीजेंड प्रदर्शित करें", + "datasources": "डेटासोर्स", + "datasource": "डेटासोर्स", + "maximum-datasources": "अधिकतम { count, plural, =1 {1 डेटासोर्स की अनुमति है।} other {# डेटासोर्स की अनुमति है} }", + "timeseries-key-error": "कम से कम एक टाइम सीरीज़ डेटा कुंजी निर्दिष्ट होनी चाहिए", + "datasource-type": "प्रकार", + "datasource-parameters": "पैरामीटर्स", + "remove-datasource": "डेटासोर्स हटाएँ", + "add-datasource": "डेटासोर्स जोड़ें", + "target-device": "लक्षित डिवाइस", + "alarm-source": "अलार्म स्रोत", + "actions": "एक्शन्स", + "action": "एक्शन", + "add-action": "एक्शन जोड़ें", + "search-actions": "एक्शन खोजें", + "no-actions-text": "कोई एक्शन नहीं मिला", + "action-source": "एक्शन स्रोत", + "select-action-source": "एक्शन स्रोत चुनें", + "action-source-required": "एक्शन स्रोत आवश्यक है।", + "column-index": "कॉलम इंडेक्स", + "select-column-index": "कॉलम इंडेक्स चुनें", + "column-index-required": "कॉलम इंडेक्स आवश्यक है।", + "not-set": "सेट नहीं", + "action-name": "नाम", + "action-name-required": "एक्शन नाम आवश्यक है।", + "action-name-not-unique": "इस नाम वाला अन्य एक्शन पहले से मौजूद है।\nएक्शन नाम समान एक्शन स्रोत के भीतर अद्वितीय होना चाहिए।", + "action-icon": "आइकन", + "header-button": { + "button-settings": "बटन सेटिंग्स", + "button-type": "बटन प्रकार", + "button-type-basic": "बेसिक", + "button-type-raised": "रेज़्ड", + "button-type-stroked": "स्ट्रोक्ड", + "button-type-flat": "फ्लैट", + "button-type-icon": "आइकन", + "button-type-mini-fab": "FAB", + "colors": "रंग", + "color": "रंग", + "background": "पृष्ठभूमि", + "border": "बॉर्डर", + "advanced-button-style": "उन्नत बटन स्टाइल", + "button-style": "बटन स्टाइल" + }, + "show-hide-action-using-function": "फ़ंक्शन के माध्यम से एक्शन दिखाएँ/छुपाएँ", + "show-action-function": "एक्शन दिखाने का फ़ंक्शन", + "action-type": "प्रकार", + "action-type-required": "एक्शन प्रकार आवश्यक है।", + "edit-action": "एक्शन संपादित करें", + "delete-action": "एक्शन हटाएँ", + "delete-action-title": "विजेट एक्शन हटाएँ", + "delete-action-text": "क्या आप वाकई '{{actionName}}' नाम वाले विजेट एक्शन को हटाना चाहते हैं?", + "title-icon": "शीर्षक आइकन", + "display-icon": "शीर्षक आइकन प्रदर्शित करें", + "card-icon": "कार्ड आइकन", + "icon": "आइकन", + "icon-color": "आइकन रंग", + "icon-size": "आइकन आकार", + "advanced-settings": "उन्नत सेटिंग्स", + "data-settings": "डेटा सेटिंग्स", + "limits": "सीमाएँ", + "no-data-display-message": "\"दिखाने के लिए कोई डेटा नहीं\" का वैकल्पिक संदेश", + "data-page-size": "प्रति डेटासोर्स अधिकतम एंटिटीज़", + "settings-component-not-found": "सेलेक्टर '{{selector}}' के लिए सेटिंग्स फ़ॉर्म कंपोनेंट नहीं मिला", + "preview": "पूर्वावलोकन", + "set": "सेट करें", + "set-message": "संदेश सेट करें", + "advanced-title-style": "उन्नत शीर्षक शैली", + "card-style": "कार्ड शैली", + "text": "पाठ", + "background": "पृष्ठभूमि", + "advanced-widget-style": "उन्नत विजेट शैली", + "card-buttons": "कार्ड बटन", + "show-card-buttons": "कार्ड बटन दिखाएँ", + "card-border-radius": "कार्ड बॉर्डर रेडियस", + "card-padding": "कार्ड पैडिंग", + "card-appearance": "कार्ड दिखावट", + "color": "रंग", + "tooltip": "टूलटिप", + "units-required": "इकाई आवश्यक है।", + "list-layout": "सूची लेआउट", + "layout": "लेआउट", + "resize-options": "रीसाइज़ विकल्प", + "resizable": "रीसाइज़ योग्य", + "preserve-aspect-ratio": "आस्पेक्ट अनुपात बनाए रखें" + }, + "widget-type": { + "import": "विजेट प्रकार आयात करें", + "export": "विजेट प्रकार निर्यात करें", + "export-failed-error": "विजेट निर्यात नहीं किया जा सका: {{error}}", + "widget-file": "विजेट फ़ाइल", + "invalid-widget-file-error": "विजेट आयात नहीं किया जा सका: अमान्य विजेट डेटा संरचना।" + }, + "markdown": { + "edit": "संपादित करें", + "preview": "पूर्वावलोकन", + "copy-code": "कॉपी करने के लिए क्लिक करें", + "copied": "कॉपी किया गया!" + }, + "widgets": { + "mobile-app-qr-code": { + "configuration-hint": "कॉन्फ़िगरेशन प्लेटफ़ॉर्म की मुख्य सेटिंग्स में मोबाइल ऐप QR कोड विजेट पर निर्भर करता है", + "get-it-on-google-play": "Google Play पर प्राप्त करें", + "download-on-the-app-store": "App Store से डाउनलोड करें" + }, + "action-button": { + "behavior": "व्यवहार", + "on-click": "क्लिक पर", + "on-click-hint": "बटन क्लिक होने पर ट्रिगर होने वाली कार्रवाई", + "first-button-click": "पहले बटन का क्लिक", + "first-button-click-hint": "पहले बटन को दबाने पर कार्रवाई।", + "second-button-click": "दूसरे बटन का क्लिक", + "second-button-click-hint": "दूसरे बटन को दबाने पर कार्रवाई।", + "button-click-hint": "विजेट को दबाने पर कार्रवाई।" + }, + "command-button": { + "behavior": "व्यवहार", + "on-click": "क्लिक पर", + "on-click-hint": "बटन क्लिक होने पर की जाने वाली कार्रवाई।" + }, + "power-button": { + "behavior": "व्यवहार", + "power-on": "Power 'On'", + "power-on-hint": "कंपोनेंट को ON करने के लिए की जाने वाली कार्रवाई।", + "power-off": "Power 'Off'", + "power-off-hint": "कंपोनेंट को OFF करने के लिए की जाने वाली कार्रवाई।", + "on-label": "On", + "off-label": "Off", + "layout": "लेआउट", + "layout-default": "डिफ़ॉल्ट", + "layout-simplified": "सरलीकृत", + "layout-outlined": "आउटलाइन", + "layout-default-volume": "Default.Volume", + "layout-simplified-volume": "Simplified.Volume", + "layout-outlined-volume": "Outlined.Volume", + "layout-default-icon": "Default.Icon", + "layout-simplified-icon": "Simplified.Icon", + "layout-outlined-icon": "Outlined.Icon", + "main": "मुख्य", + "background": "पृष्ठभूमि", + "button-icon-on": "बटन आइकन 'On'", + "button-icon-off": "बटन आइकन 'Off'", + "power-on-colors": "Power 'On' रंग", + "power-off-colors": "Power 'Off' रंग", + "disabled-colors": "अक्षम रंग", + "button": "बटन" + }, + "toggle-button": { + "behavior": "व्यवहार", + "checked": "चेक किया हुआ", + "unchecked": "अनचेक", + "check": "चेक", + "check-hint": "कंपोनेंट को चेक करने के लिए की जाने वाली कार्रवाई।", + "uncheck": "अनचेक", + "uncheck-hint": "कंपोनेंट को अनचेक करने के लिए की जाने वाली कार्रवाई।", + "auto-scale": "ऑटो स्केल", + "horizontal-fill": "क्षैतिज भराव", + "vertical-fill": "ऊर्ध्वाधर भराव", + "button-appearance": "बटन दिखावट" + }, + "segmented-button": { + "layout": "लेआउट", + "layout-squared": "स्क्वायर्ड", + "layout-rounded": "राउंडेड", + "card-border": "कार्ड बॉर्डर", + "button-appearance": "बटन दिखावट", + "first": "पहला", + "second": "दूसरा", + "color-styles": "रंग शैलियाँ", + "selected": "चयनित", + "unselected": "अचयनित" + }, + "button": { + "layout": "लेआउट", + "outlined": "आउटलाइन", + "filled": "भरा हुआ", + "underlined": "अंडरलाइन", + "basic": "बेसिक", + "auto-scale": "ऑटो स्केल", + "label": "लेबल", + "icon": "आइकन", + "border-radius": "बॉर्डर रेडियस", + "color-palette": "रंग पैलेट", + "main": "मुख्य", + "background": "पृष्ठभूमि", + "border": "बॉर्डर", + "custom-styles": "कस्टम शैलियाँ", + "clear-style": "स्टाइल साफ़ करें", + "shadow": "छाया", + "enabled": "सक्रिय", + "disabled": "निष्क्रिय", + "preview": "पूर्वावलोकन", + "copy-style-from": "यहाँ से स्टाइल कॉपी करें" + }, + "value-stepper": { + "behavior": "व्यवहार", + "simplified": "सरलीकृत", + "filled": "भरा हुआ", + "outlined": "आउटलाइन", + "volume": "वॉल्यूम", + "initial-state": "प्रारंभिक स्थिति", + "initial-state-hint": "प्रारंभिक मान प्राप्त करने हेतु कार्रवाई।", + "disabled-state": "अक्षम स्थिति", + "disabled-state-hint": "वह स्थिति कॉन्फ़िगर करें जिसमें कंपोनेंट अक्षम हो जाए।", + "right-button-click": "दाएँ बटन का क्लिक", + "right-button-click-hint": "दाएँ बटन दबाने पर कार्रवाई।", + "left-button-click": "बाएँ बटन का क्लिक", + "left-button-click-hint": "बाएँ बटन दबाने पर कार्रवाई।", + "auto-scale": "ऑटो स्केल", + "value-range": "सीमा", + "min-range": "न्यूनतम", + "max-range": "अधिकतम", + "value-increment-decrement-step": "मान बढ़ाने/घटाने का चरण", + "value": "मान", + "value-box-background": "मान बॉक्स पृष्ठभूमि", + "border": "बॉर्डर", + "button-appearance": "बटन दिखावट", + "left": "बाएँ", + "right": "दाएँ", + "left-button": "बाएँ बटन", + "right-button": "दाएँ बटन", + "icon": "आइकन", + "color-palette": "रंग पैलेट", + "main": "मुख्य", + "background": "पृष्ठभूमि", + "button-icon-on": "बटन आइकन 'On'", + "button-on-colors": "Power 'On' रंग", + "disabled-colors": "अक्षम रंग" + }, + "button-state": { + "activated-state": "सक्रिय स्थिति", + "activated-state-hint": "वह स्थिति कॉन्फ़िगर करें जिसमें बटन सक्रिय हो।", + "disabled-state": "अक्षम स्थिति", + "disabled-state-hint": "वह स्थिति कॉन्फ़िगर करें जिसमें बटन अक्षम हो।", + "selected-state": "बटन चयन", + "selected-state-hint": "वह स्थिति कॉन्फ़िगर करें जिसमें बटन चयनित हो।", + "enabled": "सक्रिय", + "hovered": "होवर किया हुआ", + "pressed": "दबाया हुआ", + "activated": "सक्रिय", + "disabled": "निष्क्रिय", + "initial": "पहला बटन", + "first": "पहला", + "second": "दूसरा" + }, + "background": { + "background": "पृष्ठभूमि", + "background-settings": "पृष्ठभूमि सेटिंग्स", + "background-type-image": "छवि", + "background-type-color": "रंग", + "image-url": "छवि URL", + "overlay": "ओवरले", + "enable-overlay": "ओवरले सक्षम करें", + "blur": "ब्लर", + "preview": "पूर्वावलोकन" + }, + "bar-chart": { + "bar-appearance": "बार दिखावट", + "label-on-bar": "बार पर लेबल", + "value-on-bar": "बार पर मान", + "bar-chart-style": "बार चार्ट शैली", + "bar-axis": "बार अक्ष" + }, + "polar-area-chart": { + "polar-axis": "पोलर अक्ष", + "start-angle": "प्रारंभ कोण", + "polar-area-chart-style": "पोलर एरिया चार्ट शैली" + }, + "battery-level": { + "layout": "लेआउट", + "layout-vertical-solid": "वर्टिकल. ठोस", + "layout-horizontal-solid": "हॉरिज़ॉन्टल. ठोस", + "layout-vertical-divided": "वर्टिकल. विभाजित", + "layout-horizontal-divided": "हॉरिज़ॉन्टल. विभाजित", + "icon": "आइकन", + "value": "मान", + "auto-scale": "ऑटो स्केल", + "battery-level-color": "बैटरी स्तर रंग", + "battery-shape-color": "बैटरी आकृति रंग", + "battery-level-card-style": "बैटरी स्तर कार्ड शैली", + "sections-count": "सेक्शनों की संख्या" + }, + "signal-strength": { + "value": "मान", + "last-update": "अंतिम अपडेट", + "no-signal": "कोई सिग्नल नहीं", + "layout": "लेआउट", + "layout-wifi": "वाई-फाई", + "layout-cellular-bar": "सेलुलर बार", + "icon": "आइकन", + "date": "तारीख", + "active-bars-color": "सक्रिय सिग्नल बार्स का रंग", + "inactive-bars-color": "निष्क्रिय सिग्नल बार्स का रंग", + "signal-strength-card-style": "सिग्नल शक्ति कार्ड शैली", + "no-signal-rssi-value": "\"कोई सिग्नल नहीं\" rssi मान" + }, + "status-widget": { + "behavior": "व्यवहार", + "layout": "लेआउट", + "layout-default": "डिफ़ॉल्ट", + "layout-center": "केंद्र", + "layout-icon": "आइकन", + "on": "On", + "off": "Off", + "label": "लेबल", + "status": "स्थिति", + "icon": "आइकन", + "color-palette": "रंग पैलेट", + "disabled-color-palette": "अक्षम रंग पैलेट", + "primary": "प्राथमिक", + "primary-color-hint": "आइकन और लेबल का रंग", + "secondary": "द्वितीयक", + "secondary-color-hint": "स्थिति का रंग", + "background": "पृष्ठभूमि" + }, + "chart": { + "common-settings": "सामान्य सेटिंग्स", + "enable-stacking-mode": "स्टैकिंग मोड सक्षम करें", + "selection": "समय सीमा चयन", + "enable-selection-mode": "चयन मोड सक्षम करें", + "line-shadow-size": "लाइन छाया आकार", + "display-smooth-lines": "स्मूथ (घुमावदार) लाइनों को प्रदर्शित करें", + "default-bar-width": "गैर-संकलित डेटा के लिए डिफ़ॉल्ट बार चौड़ाई (मिलीसेकंड)", + "bar-alignment": "बार संरेखण", + "bar-alignment-left": "बाएँ", + "bar-alignment-right": "दाएँ", + "bar-alignment-center": "केंद्र", + "default-font": "डिफ़ॉल्ट फ़ॉन्ट", + "default-font-size": "डिफ़ॉल्ट फ़ॉन्ट आकार", + "default-font-color": "डिफ़ॉल्ट फ़ॉन्ट रंग", + "thresholds-line-width": "सभी थ्रेशहोल्ड्स के लिए डिफ़ॉल्ट लाइन चौड़ाई", + "tooltip-settings": "टूलटिप सेटिंग्स", + "tooltip": "टूलटिप", + "show-tooltip": "टूलटिप दिखाएँ", + "hover-individual-points": "व्यक्तिगत बिंदुओं पर होवर करें", + "show-cumulative-values": "स्टैकिंग मोड में संचयी मान दिखाएँ", + "hide-zero-false-values": "टूलटिप से शून्य/गलत मान छुपाएँ", + "tooltip-value-format-function": "टूलटिप मान फ़ॉर्मेट फ़ंक्शन", + "grid-settings": "ग्रिड सेटिंग्स", + "show-vertical-lines": "वर्टिकल लाइनें दिखाएँ", + "show-horizontal-lines": "हॉरिज़ॉन्टल लाइनें दिखाएँ", + "grid-outline-border-width": "ग्रिड आउटलाइन/बॉर्डर चौड़ाई (px)", + "primary-color": "प्राथमिक रंग", + "background-color": "पृष्ठभूमि रंग", + "ticks-color": "टिक्स रंग", + "xaxis-settings": "X अक्ष सेटिंग्स", + "axis-title": "अक्ष शीर्षक", + "xaxis-tick-labels-settings": "X अक्ष टिक लेबल सेटिंग्स", + "show-tick-labels": "अक्ष टिक लेबल दिखाएँ", + "yaxis-settings": "Y अक्ष सेटिंग्स", + "min-scale-value": "स्केल पर न्यूनतम मान", + "max-scale-value": "स्केल पर अधिकतम मान", + "yaxis-tick-labels-settings": "Y अक्ष टिक लेबल सेटिंग्स", + "tick-step-size": "टिक्स के बीच चरण आकार", + "number-of-decimals": "दिखाने के लिए दशमलवों की संख्या", + "ticks-formatter-function": "टिक्स फ़ॉर्मेटर फ़ंक्शन", + "comparison-settings": "तुलना सेटिंग्स", + "enable-comparison": "तुलना सक्षम करें", + "time-for-comparison": "तुलना अवधि", + "time-for-comparison-previous-interval": "पिछला अंतराल (डिफ़ॉल्ट)", + "time-for-comparison-days": "एक दिन पहले", + "time-for-comparison-weeks": "एक सप्ताह पहले", + "time-for-comparison-months": "एक महीने पहले", + "time-for-comparison-years": "एक वर्ष पहले", + "time-for-comparison-custom-interval": "कस्टम अंतराल", + "custom-interval-value": "कस्टम अंतराल मान (ms)", + "comparison-x-axis-settings": "तुलना X अक्ष सेटिंग्स", + "axis-position": "अक्ष स्थिति", + "axis-position-top": "ऊपर (डिफ़ॉल्ट)", + "axis-position-bottom": "नीचे", + "custom-legend-settings": "कस्टम लेजेंड सेटिंग्स", + "enable-custom-legend": "कस्टम लेजेंड सक्षम करें (यह आपको की लेबल्स में attribute/टाइम सीरीज़ मानों का उपयोग करने की अनुमति देता है)", + "key-name": "कुंजी नाम", + "key-name-required": "कुंजी नाम आवश्यक है", + "key-type": "कुंजी प्रकार", + "key-type-attribute": "विशेषता", + "key-type-timeseries": "टाइम सीरीज़", + "label-keys-list": "लेबल्स में उपयोग की जाने वाली कुंजियों की सूची", + "no-label-keys": "कोई कुंजियाँ कॉन्फ़िगर नहीं की गईं", + "add-label-key": "नई कुंजी जोड़ें", + "line-width": "लाइन चौड़ाई", + "color": "रंग", + "data-is-hidden-by-default": "डेटा डिफ़ॉल्ट रूप से छिपा हुआ है", + "disable-data-hiding": "डेटा छिपाना अक्षम करें", + "remove-from-legend": "लेजेंड से डेटा कुंजी हटाएँ", + "exclude-from-stacking": "स्टैकिंग से बाहर रखें (\"स्टैकिंग मोड\" मोड में उपलब्ध)", + "line-settings": "लाइन सेटिंग्स", + "show-line": "लाइन दिखाएँ", + "fill-line": "लाइन भरें", + "fill-line-opacity": "भराव की अपारदर्शिता", + "points-settings": "बिंदु सेटिंग्स", + "show-points": "बिंदु दिखाएँ", + "points-line-width": "बिंदुओं की लाइन चौड़ाई", + "points-radius": "बिंदुओं का त्रिज्या", + "point-shape": "बिंदु आकृति", + "point-shape-circle": "वृत्त", + "point-shape-cross": "क्रॉस", + "point-shape-diamond": "डायमंड", + "point-shape-square": "वर्ग", + "point-shape-triangle": "त्रिभुज", + "point-shape-custom": "कस्टम फ़ंक्शन", + "point-shape-draw-function": "बिंदु आकृति ड्रा फ़ंक्शन", + "show-separate-axis": "अलग अक्ष दिखाएँ", + "axis-position-left": "बाएँ", + "axis-position-right": "दाएँ", + "thresholds": "थ्रेशहोल्ड्स", + "no-thresholds": "कोई थ्रेशहोल्ड कॉन्फ़िगर नहीं किया गया", + "add-threshold": "थ्रेशहोल्ड जोड़ें", + "show-values-for-comparison": "तुलना के लिए ऐतिहासिक मान दिखाएँ", + "comparison-values-label": "ऐतिहासिक मान लेबल", + "comparison-line-color": "तुलना लाइन रंग", + "threshold-settings": "थ्रेशहोल्ड सेटिंग्स", + "use-as-threshold": "कुंजी मान को थ्रेशहोल्ड के रूप में उपयोग करें", + "threshold-line-width": "थ्रेशहोल्ड लाइन चौड़ाई", + "threshold-color": "थ्रेशहोल्ड रंग", + "common-pie-settings": "सामान्य पाई सेटिंग्स", + "radius": "त्रिज्या", + "inner-radius": "आंतरिक त्रिज्या", + "tilt": "झुकाव", + "common-pie-settings-range-error": "मान 0 से 1 की सीमा में होना चाहिए", + "stroke-settings": "स्ट्रोक सेटिंग्स", + "width-pixels": "चौड़ाई (पिक्सेल)", + "show-labels": "लेबल दिखाएँ", + "animation-settings": "एनिमेशन सेटिंग्स", + "animated-pie": "पाई एनिमेशन सक्षम करें (प्रायोगिक)", + "border-settings": "बॉर्डर सेटिंग्स", + "border-width": "बॉर्डर चौड़ाई", + "border-color": "बॉर्डर रंग", + "legend-settings": "लेजेंड सेटिंग्स", + "display-legend": "लेजेंड प्रदर्शित करें", + "labels-font-color": "लेबल फ़ॉन्ट रंग", + "series": "सीरीज़", + "add-series": "सीरीज़ जोड़ें", + "series-settings": "सीरीज़ सेटिंग्स", + "remove-series": "सीरीज़ हटाएँ", + "no-series": "कोई सीरीज़ कॉन्फ़िगर नहीं की गई", + "no-series-error": "कम से कम एक सीरीज़ निर्दिष्ट होनी चाहिए", + "chart-appearance": "चार्ट दिखावट", + "vertical-grid-lines": "वर्टिकल ग्रिड लाइनें", + "horizontal-grid-lines": "हॉरिज़ॉन्टल ग्रिड लाइनें", + "chart-background": "चार्ट पृष्ठभूमि", + "grid-lines-color": "ग्रिड लाइनों का रंग", + "border": "बॉर्डर", + "axis": "अक्ष", + "vertical-axis": "वर्टिकल अक्ष", + "ticks": "टिक्स", + "horizontal-axis": "हॉरिज़ॉन्टल अक्ष", + "shape-empty-circle": "खाली वृत्त", + "shape-circle": "वृत्त", + "shape-rect": "आयत", + "shape-round-rect": "गोल किनारों वाला आयत", + "shape-triangle": "त्रिभुज", + "shape-diamond": "डायमंड", + "shape-pin": "पिन", + "shape-arrow": "तीर", + "shape-none": "कोई नहीं", + "line-type-solid": "ठोस", + "line-type-dashed": "डैश्ड", + "line-type-dotted": "डॉटेड", + "label-position-top": "ऊपर", + "label-position-bottom": "नीचे", + "label-position-outside": "बाहर", + "label-position-inside": "अंदर", + "fill": "भराव", + "fill-type-none": "कोई नहीं", + "fill-type-solid": "ठोस", + "fill-type-opacity": "अपारदर्शिता", + "fill-type-gradient": "ग्रेडिएंट", + "background": "पृष्ठभूमि", + "opacity": "अपारदर्शिता", + "gradient-stops": "ग्रेडिएंट स्टॉप्स", + "gradient-start": "प्रारंभ", + "gradient-end": "अंत", + "animation": { + "animation": "एनीमेशन", + "animation-threshold": "एनीमेशन थ्रेशहोल्ड", + "animation-duration": "एनीमेशन अवधि", + "animation-easing": "एनीमेशन ईज़िंग", + "animation-delay": "एनीमेशन विलंब", + "update-animation-duration": "अपडेट एनीमेशन अवधि", + "update-animation-easing": "अपडेट एनीमेशन ईज़िंग", + "update-animation-delay": "अपडेट एनीमेशन विलंब" + }, + "chart-axis": { + "scale": "स्केल", + "scale-min": "न्यूनतम", + "scale-max": "अधिकतम", + "scale-auto": "स्वतः" + }, + "bar": { + "show-border": "बॉर्डर दिखाएँ", + "border-width": "बॉर्डर चौड़ाई", + "border-radius": "बॉर्डर रेडियस", + "bar-width": "बार चौड़ाई", + "label": "लेबल", + "label-hint": "बार के ऊपर लेबल प्रदर्शित करें।", + "series-label-hint": "बार के ऊपर मान सहित लेबल प्रदर्शित करें।", + "label-background": "लेबल पृष्ठभूमि" + } + }, + "color": { + "color-settings": "रंग सेटिंग्स", + "color-type-constant": "स्थायी", + "color-type-gradient": "ग्रेडिएंट", + "color-type-range": "सीमा", + "color-type-function": "फ़ंक्शन", + "color": "रंग", + "value-range": "मान सीमा", + "from": "से", + "to": "तक", + "color-function": "रंग फ़ंक्शन", + "copy-color-settings-from": "यहाँ से रंग सेटिंग्स कॉपी करें", + "copy-from": "यहाँ से कॉपी करें", + "settings-type": "सेटिंग्स प्रकार", + "basic-mode": "बेसिक", + "advanced-mode": "उन्नत", + "entity-alias": "एंटिटी उर्फ़", + "entity-attribute": "एंटिटी विशेषता", + "gradient-color": "ग्रेडिएंट रंग", + "gradient-color-min": "रंग", + "gradient-start": "ग्रेडिएंट प्रारंभ रंग", + "gradient-start-min": "प्रारंभ", + "gradient-end": "ग्रेडिएंट अंतिम रंग", + "gradient-end-min": "अंत", + "start-value": "प्रारंभ मान", + "end-value": "अंत मान", + "gradient-type": "ग्रेडिएंट प्रकार" + }, + "dashboard-state": { + "dashboard-state-settings": "डैशबोर्ड स्टेट सेटिंग्स", + "dashboard-state": "डैशबोर्ड स्टेट ID", + "autofill-state-layout": "डिफ़ॉल्ट रूप से स्टेट लेआउट ऊँचाई स्वतः भरें", + "default-margin": "डिफ़ॉल्ट विजेट मार्जिन", + "default-background-color": "डिफ़ॉल्ट पृष्ठभूमि रंग", + "sync-parent-state-params": "पैरेंट डैशबोर्ड के साथ स्टेट पैरामीटर्स सिंक करें" + }, + "date-range-navigator": { + "date-range-picker-settings": "डेट रेंज पिकर सेटिंग्स", + "hide-date-range-picker": "डेट रेंज पिकर छुपाएँ", + "picker-one-panel": "डेट रेंज पिकर एक पैनल", + "picker-auto-confirm": "डेट रेंज पिकर ऑटो पुष्टि", + "picker-show-template": "डेट रेंज पिकर टेम्पलेट दिखाएँ", + "first-day-of-week": "सप्ताह का पहला दिन", + "interval-settings": "अवधि सेटिंग्स", + "hide-interval": "अवधि छुपाएँ", + "initial-interval": "प्रारंभिक अवधि", + "interval-hour": "घंटा", + "interval-day": "दिन", + "interval-week": "सप्ताह", + "interval-two-weeks": "2 सप्ताह", + "interval-month": "महीना", + "interval-three-months": "3 महीने", + "interval-six-months": "6 महीने", + "step-settings": "चरण सेटिंग्स", + "hide-step-size": "चरण आकार छुपाएँ", + "initial-step-size": "प्रारंभिक चरण आकार", + "hide-labels": "लेबल छुपाएँ", + "use-session-storage": "सेशन स्टोरेज उपयोग करें", + "localizationMap": { + "Sun": "रवि", + "Mon": "सोम", + "Tue": "मंगल", + "Wed": "बुध", + "Thu": "गुरु", + "Fri": "शुक्र", + "Sat": "शनि", + "Jan": "जन", + "Feb": "फ़र", + "Mar": "मार्च", + "Apr": "अप्रै", + "May": "मई", + "Jun": "जून", + "Jul": "जुलाई", + "Aug": "अग", + "Sep": "सित", + "Oct": "अक्ट", + "Nov": "नव", + "Dec": "दिस", + "January": "जनवरी", + "February": "फ़रवरी", + "March": "मार्च", + "April": "अप्रैल", + "June": "जून", + "July": "जुलाई", + "August": "अगस्त", + "September": "सितंबर", + "October": "अक्टूबर", + "November": "नवंबर", + "December": "दिसंबर", + "Custom Date Range": "कस्टम डेट रेंज", + "Date Range Template": "डेट रेंज टेम्पलेट", + "Today": "आज", + "Yesterday": "कल", + "This Week": "इस सप्ताह", + "Last Week": "पिछला सप्ताह", + "This Month": "इस महीने", + "Last Month": "पिछला महीना", + "Year": "वर्ष", + "This Year": "इस वर्ष", + "Last Year": "पिछला वर्ष", + "Date picker": "डेट पिकर", + "Hour": "घंटा", + "Day": "दिन", + "Week": "सप्ताह", + "2 weeks": "2 सप्ताह", + "Month": "महीना", + "3 months": "3 महीने", + "6 months": "6 महीने", + "Custom interval": "कस्टम अवधि", + "Interval": "अवधि", + "Step size": "चरण आकार", + "Ok": "ओके" + } + }, + "doughnut": { + "doughnut-appearance": "डोनट दिखावट", + "layout": "लेआउट", + "layout-default": "डिफ़ॉल्ट", + "layout-with-total": "कुल सहित", + "central-total-value": "केंद्रीय कुल मान", + "doughnut-card-style": "डोनट कार्ड शैली" + }, + "entities-hierarchy": { + "hierarchy-data-settings": "हाइरार्की डेटा सेटिंग्स", + "relations-query-function": "नोड संबंध क्वेरी फ़ंक्शन", + "has-children-function": "नोड में बच्चे हैं या नहीं फ़ंक्शन", + "node-state-settings": "नोड स्थिति सेटिंग्स", + "node-opened-function": "डिफ़ॉल्ट नोड खुला है फ़ंक्शन", + "node-disabled-function": "नोड अक्षम फ़ंक्शन", + "display-settings": "प्रदर्शन सेटिंग्स", + "node-icon-function": "नोड आइकन फ़ंक्शन", + "node-text-function": "नोड टेक्स्ट फ़ंक्शन", + "sort-settings": "सॉर्ट सेटिंग्स", + "nodes-sort-function": "नोड्स सॉर्ट फ़ंक्शन" + }, + "edge": { + "display-default-title": "डिफ़ॉल्ट शीर्षक प्रदर्शित करें" + }, + "gateway": { + "general-settings": "सामान्य सेटिंग्स", + "widget-title": "विजेट शीर्षक", + "default-archive-file-name": "डिफ़ॉल्ट आर्काइव फ़ाइल नाम", + "device-type-for-new-gateway": "नए Gateway के लिए डिवाइस प्रकार", + "messages-settings": "संदेश सेटिंग्स", + "save-config-success-message": "Gateway कॉन्फ़िगरेशन सफलतापूर्वक सहेजे जाने के बारे में टेक्स्ट संदेश", + "device-name-exists-message": "जब दर्ज किए गए नाम वाला डिवाइस पहले से मौजूद हो, तब का टेक्स्ट संदेश", + "gateway-title": "Gateway फ़ॉर्म", + "read-only": "केवल पढ़ने के लिए", + "events-title": "Gateway इवेंट्स फ़ॉर्म शीर्षक", + "events-filter": "इवेंट्स फ़िल्टर", + "event-key-contains": "इवेंट कुंजी में शामिल है...", + "show-connector": "कनेक्टर के लिए दिखाएँ", + "connector-state-param-key": "कनेक्टर स्टेट पैरामीटर कुंजी", + "message": "संदेश", + "level": "स्तर", + "created-time": "निर्मित समय" + }, + "gauge": { + "default-color": "डिफ़ॉल्ट रंग", + "radial-gauge-settings": "रेडियल गेज सेटिंग्स", + "ticks-settings": "टिक्स सेटिंग्स", + "min-value": "न्यूनतम मान", + "max-value": "अधिकतम मान", + "min-value-short": "न्यूनतम", + "max-value-short": "अधिकतम", + "start-ticks-angle": "टिक्स प्रारंभ कोण", + "ticks-angle": "टिक्स कोण", + "major-ticks": "मुख्य टिक्स", + "major-ticks-count": "मुख्य टिक्स की संख्या", + "major-ticks-color": "मुख्य टिक्स का रंग", + "minor-ticks": "मामूली टिक्स", + "minor-ticks-count": "मामूली टिक्स की संख्या", + "minor-ticks-color": "मामूली टिक्स का रंग", + "tick-numbers-font": "टिक नंबर फ़ॉन्ट", + "unit-title-settings": "यूनिट शीर्षक सेटिंग्स", + "show-unit-title": "यूनिट शीर्षक दिखाएँ", + "unit-title": "यूनिट शीर्षक", + "title-font": "शीर्षक टेक्स्ट फ़ॉन्ट", + "units-settings": "यूनिट सेटिंग्स", + "units-font": "यूनिट टेक्स्ट फ़ॉन्ट", + "value-box-settings": "मान बॉक्स सेटिंग्स", + "show-value-box": "मान बॉक्स दिखाएँ", + "value-box": "मान बॉक्स", + "value-int": "मान के पूर्णांक भाग के अंकों की संख्या", + "value-text": "मान टेक्स्ट", + "value-text-shadow": "मान टेक्स्ट छाया", + "value-font": "मान टेक्स्ट फ़ॉन्ट", + "rect-stroke-color-start": "आयत स्ट्रोक रंग - प्रारंभ ग्रेडिएंट", + "rect-stroke-color-end": "आयत स्ट्रोक रंग - अंत ग्रेडिएंट", + "background-color": "पृष्ठभूमि रंग", + "shadow-color": "छाया रंग", + "value-box-rect-stroke-color": "मान बॉक्स आयत स्ट्रोक रंग", + "value-box-rect-stroke-color-end": "मान बॉक्स आयत स्ट्रोक रंग - अंत ग्रेडिएंट", + "value-box-background-color": "मान बॉक्स पृष्ठभूमि रंग", + "value-box-shadow-color": "मान बॉक्स छाया रंग", + "plate-settings": "प्लेट सेटिंग्स", + "show-plate-border": "प्लेट बॉर्डर", + "plate-color": "प्लेट रंग", + "needle-settings": "सुई सेटिंग्स", + "needle-circle-size": "सुई सर्कल आकार", + "needle-color": "सुई रंग", + "needle-color-start": "सुई रंग - प्रारंभ ग्रेडिएंट", + "needle-color-end": "सुई रंग - अंत ग्रेडिएंट", + "needle-color-shadow-up": "सुई की ऊपरी आधी छाया का रंग", + "needle-color-shadow-down": "ड्रॉप शैडो", + "highlights-settings": "हाइलाइट सेटिंग्स", + "highlights-width": "हाइलाइट चौड़ाई", + "highlights": "हाइलाइट्स", + "highlight-from": "से", + "highlight-to": "तक", + "highlight-color": "रंग", + "no-highlights": "कोई हाइलाइट कॉन्फ़िगर नहीं की गई", + "add-highlight": "हाइलाइट जोड़ें", + "animation-settings": "एनिमेशन सेटिंग्स", + "enable-animation": "एनिमेशन", + "animation-duration-rule": "एनिमेशन अवधि और नियम", + "animation-duration": "एनिमेशन अवधि", + "animation-rule": "एनिमेशन नियम", + "animation-linear": "लीनियर", + "animation-quad": "क्वाड", + "animation-quint": "क्विंट", + "animation-cycle": "सायकल", + "animation-bounce": "बाउंस", + "animation-elastic": "इलास्टिक", + "animation-dequad": "डीक्वाड", + "animation-dequint": "डीक्विंट", + "animation-decycle": "डीसायकल", + "animation-debounce": "डीबाउंस", + "animation-delastic": "डीइलास्टिक", + "linear-gauge-settings": "लीनियर गेज सेटिंग्स", + "bar-stroke": "बार स्ट्रोक", + "bar-stroke-width": "बार स्ट्रोक चौड़ाई", + "bar-stroke-color": "बार स्ट्रोक रंग", + "bar-background-color": "बार पृष्ठभूमि रंग - प्रारंभ ग्रेडिएंट", + "bar-background-color-end": "बार पृष्ठभूमि रंग - अंत ग्रेडिएंट", + "progress-bar-color": "प्रोग्रेस बार रंग", + "progress-bar": "प्रोग्रेस बार", + "progress-bar-color-start": "प्रोग्रेस बार रंग - प्रारंभ ग्रेडिएंट", + "progress-bar-color-end": "प्रोग्रेस बार रंग - अंत ग्रेडिएंट", + "major-ticks-names": "मुख्य टिक्स नाम", + "show-stroke-ticks": "टिक्स स्ट्रोक दिखाएँ", + "major-ticks-font": "मुख्य टिक्स फ़ॉन्ट", + "border-color": "बॉर्डर रंग", + "border-width": "बॉर्डर चौड़ाई", + "needle-circle": "सुई सर्कल", + "needle-circle-color": "सुई सर्कल रंग", + "animation-target": "एनिमेशन लक्ष्य", + "animation-target-needle": "सुई", + "animation-target-plate": "प्लेट", + "common-settings": "सामान्य गेज सेटिंग्स", + "gauge-type": "गेज प्रकार", + "gauge-type-arc": "आर्क", + "gauge-type-donut": "डोनट", + "gauge-type-horizontal-bar": "क्षैतिज बार", + "gauge-type-vertical-bar": "ऊर्ध्वाधर बार", + "donut-start-angle": "आरंभ करने का कोण (डिग्री में)", + "bar-settings": "गेज बार सेटिंग्स", + "relative-bar-width": "सापेक्ष बार चौड़ाई", + "neon-glow-brightness": "नियॉन ग्लो प्रभाव की चमक (0-100)", + "neon-glow-brightness-hint": "0 - प्रभाव अक्षम", + "stripes-thickness": "पट्टियों की मोटाई", + "stripes-thickness-hint": "0 - कोई पट्टियाँ नहीं", + "rounded-line-cap": "गोल लाइन कैप", + "bar-color-settings": "बार रंग सेटिंग्स", + "use-precise-level-color-values": "सटीक रंग स्तरों का उपयोग करें", + "bar-colors": "बार रंग (निम्न से उच्च क्रम में)", + "color": "रंग", + "no-bar-colors": "कोई बार रंग कॉन्फ़िगर नहीं किया गया", + "add-bar-color": "बार रंग जोड़ें", + "from": "से", + "to": "तक", + "fixed-level-colors": "सीमाई मानों का उपयोग करके बार रंग", + "gauge-title-settings": "गेज शीर्षक सेटिंग्स", + "show-gauge-title": "गेज शीर्षक दिखाएँ", + "gauge-title": "गेज शीर्षक", + "gauge-title-font": "गेज शीर्षक फ़ॉन्ट", + "unit-title-and-timestamp-settings": "यूनिट शीर्षक और टाइमस्टैंप सेटिंग्स", + "show-timestamp": "टाइमस्टैंप दिखाएँ", + "timestamp-format": "टाइमस्टैंप फ़ॉर्मेट", + "label-font": "मान के नीचे दिखने वाले लेबल का फ़ॉन्ट", + "value-settings": "मान सेटिंग्स", + "show-value": "मान टेक्स्ट दिखाएँ", + "min-max-settings": "न्यूनतम/अधिकतम लेबल सेटिंग्स", + "show-min-max": "न्यूनतम और अधिकतम मान दिखाएँ", + "min-max-font": "न्यूनतम और अधिकतम लेबल का फ़ॉन्ट", + "show-ticks": "टिक्स दिखाएँ", + "tick-width": "टिक चौड़ाई", + "tick-color": "टिक रंग", + "tick-values": "टिक मान", + "no-tick-values": "कोई टिक मान कॉन्फ़िगर नहीं किया गया", + "add-tick-value": "टिक मान जोड़ें", + "gauge-appearance": "गेज दिखावट", + "units-title": "यूनिट शीर्षक", + "value": "मान", + "ticks": "टिक्स", + "arrow-and-scale-color": "तीर और स्केल का डिफ़ॉल्ट रंग", + "scale-settings": "स्केल सेटिंग्स", + "scale": "स्केल", + "scale-color": "स्केल रंग", + "compass-appearance": "कम्पास दिखावट", + "label": "लेबल", + "labels": "लेबल्स", + "label-style": "लेबल शैली", + "simple-gauge-type": "प्रकार", + "gauge-bar-background": "गेज बार पृष्ठभूमि", + "bar-color": "बार रंग", + "min-and-max-value": "न्यूनतम और अधिकतम मान", + "min-and-max-label": "न्यूनतम और अधिकतम लेबल", + "font": "फ़ॉन्ट", + "tick-width-and-color": "टिक चौड़ाई और रंग", + "min-max-validation-text": "अधिकतम मान न्यूनतम मान से बड़ा होना चाहिए" + }, + "gpio": { + "pin": "पिन", + "label": "लेबल", + "row": "पंक्ति", + "column": "स्तंभ", + "color": "रंग", + "panel-settings": "पैनल सेटिंग्स", + "background-color": "पृष्ठभूमि रंग", + "gpio-switches": "GPIO स्विचेज़", + "no-gpio-switches": "कोई GPIO स्विच कॉन्फ़िगर नहीं किया गया", + "add-gpio-switch": "GPIO स्विच जोड़ें", + "gpio-status-request": "GPIO स्थिति अनुरोध", + "method-name": "मेथड नाम", + "method-body": "मेथड बॉडी", + "gpio-status-change-request": "GPIO स्थिति परिवर्तन अनुरोध", + "parse-gpio-status-function": "GPIO स्थिति पार्स करने का फ़ंक्शन", + "gpio-leds": "GPIO LEDs", + "no-gpio-leds": "कोई GPIO LED कॉन्फ़िगर नहीं की गई", + "add-gpio-led": "GPIO LED जोड़ें" + }, + "html-card": { + "html": "HTML", + "css": "CSS" + }, + "input-widgets": { + "attribute-not-allowed": "यह विजेट Attribute पैरामीटर का उपयोग नहीं कर सकता", + "blocked-location": "आपके ब्राउज़र में जियोलोकेशन अवरुद्ध है", + "claim-device": "डिवाइस क्लेम करें", + "claim-failed": "डिवाइस को क्लेम करने में विफल!", + "claim-not-found": "डिवाइस नहीं मिला!", + "claim-successful": "डिवाइस सफलतापूर्वक क्लेम किया गया!", + "date": "तारीख", + "device-name": "डिवाइस नाम", + "device-name-required": "डिवाइस नाम आवश्यक है", + "discard-changes": "परिवर्तन रद्द करें", + "entity-attribute-required": "एंटिटी विशेषता आवश्यक है", + "entity-coordinate-required": "दोनों फ़ील्ड — अक्षांश और देशांतर — आवश्यक हैं", + "entity-timeseries-required": "एंटिटी टाइम सीरीज़ आवश्यक है", + "get-location": "वर्तमान स्थान प्राप्त करें", + "invalid-date": "अमान्य तारीख", + "latitude": "अक्षांश", + "longitude": "देशांतर", + "min-value-error": "न्यूनतम मान {{value}} है", + "max-value-error": "अधिकतम मान {{value}} है", + "not-allowed-entity": "चयनित एंटिटी में शेयर की गई विशेषताएँ नहीं हो सकतीं", + "no-attribute-selected": "कोई विशेषता चयनित नहीं है", + "no-datakey-selected": "कोई डेटा-कुंजी चयनित नहीं है", + "no-coordinate-specified": "अक्षांश/देशांतर के लिए डेटाकुंजी निर्दिष्ट नहीं है", + "no-entity-selected": "कोई एंटिटी चयनित नहीं है", + "no-image": "कोई छवि नहीं", + "no-support-geolocation": "आपका ब्राउज़र जियोलोकेशन का समर्थन नहीं करता", + "no-support-web-camera": "आपका ब्राउज़र कैमरा का समर्थन नहीं करता", + "enable-https-use-widget": "कृपया इस विजेट का उपयोग करने के लिए HTTPS सक्षम करें", + "no-found-your-camera": "आपका कैमरा नहीं मिल सका", + "no-permission-camera": "उपयोगकर्ता द्वारा अनुमति अस्वीकार की गई / इस साइट को कैमरा उपयोग करने की अनुमति नहीं है", + "no-timeseries-selected": "कोई टाइम सीरीज़ चयनित नहीं है", + "secret-key": "सीक्रेट कुंजी", + "secret-key-required": "सीक्रेट कुंजी आवश्यक है", + "switch-attribute-value": "एंटिटी विशेषता मान स्विच करें", + "switch-camera": "कैमरा बदलें", + "switch-timeseries-value": "एंटिटी टाइम सीरीज़ मान स्विच करें", + "take-photo": "फ़ोटो लें", + "time": "समय", + "timeseries-not-allowed": "यह विजेट टाइम सीरीज़ पैरामीटर का उपयोग नहीं कर सकता", + "update-failed": "अपडेट विफल", + "update-successful": "अपडेट सफल", + "update-attribute": "विशेषता अपडेट करें", + "update-timeseries": "टाइम सीरीज़ अपडेट करें", + "value": "मान", + "general-settings": "सामान्य सेटिंग्स", + "widget-title": "विजेट शीर्षक", + "claim-button-label": "क्लेमिंग बटन लेबल", + "show-secret-key-field": "'सीक्रेट कुंजी' इनपुट फ़ील्ड दिखाएँ", + "labels-settings": "लेबल सेटिंग्स", + "show-labels": "लेबल दिखाएँ", + "device-name-label": "डिवाइस नाम इनपुट फ़ील्ड के लिए लेबल", + "secret-key-label": "सीक्रेट कुंजी इनपुट फ़ील्ड के लिए लेबल", + "messages-settings": "संदेश सेटिंग्स", + "claim-device-success-message": "डिवाइस सफलतापूर्वक क्लेम होने का संदेश", + "claim-device-not-found-message": "डिवाइस न मिलने पर संदेश", + "claim-device-failed-message": "डिवाइस क्लेम विफल होने का संदेश", + "claim-device-name-required-message": "'डिवाइस नाम आवश्यक है' त्रुटि संदेश", + "claim-device-secret-key-required-message": "'सीक्रेट कुंजी आवश्यक है' त्रुटि संदेश", + "show-label": "लेबल दिखाएँ", + "label": "लेबल", + "required": "आवश्यक", + "required-error-message": "'आवश्यक' त्रुटि संदेश", + "show-result-message": "परिणाम संदेश दिखाएँ", + "integer-field-settings": "इंटीजर फ़ील्ड सेटिंग्स", + "min-value": "न्यूनतम मान", + "max-value": "अधिकतम मान", + "double-field-settings": "डबल फ़ील्ड सेटिंग्स", + "text-field-settings": "टेक्स्ट फ़ील्ड सेटिंग्स", + "min-length": "न्यूनतम लंबाई", + "max-length": "अधिकतम लंबाई", + "checkbox-settings": "चेकबॉक्स सेटिंग्स", + "true-label": "चेक्ड लेबल", + "false-label": "अनचेक्ड लेबल", + "image-input-settings": "छवि इनपुट सेटिंग्स", + "display-preview": "पूर्वावलोकन दिखाएँ", + "display-clear-button": "क्लियर बटन दिखाएँ", + "display-apply-button": "अप्लाई बटन दिखाएँ", + "display-discard-button": "डिस्कार्ड बटन दिखाएँ", + "datetime-field-settings": "तारीख/समय फ़ील्ड सेटिंग्स", + "display-time-input": "समय इनपुट दिखाएँ", + "latitude-key-name": "अक्षांश कुंजी नाम", + "longitude-key-name": "देशांतर कुंजी नाम", + "show-get-location-button": "'वर्तमान स्थान प्राप्त करें' बटन दिखाएँ", + "use-high-accuracy": "उच्च सटीकता उपयोग करें", + "location-fields-settings": "स्थान फ़ील्ड सेटिंग्स", + "latitude-label": "अक्षांश के लिए लेबल", + "longitude-label": "देशांतर के लिए लेबल", + "input-fields-alignment": "इनपुट फ़ील्ड्स संरेखण", + "input-fields-alignment-column": "स्तंभ (डिफ़ॉल्ट)", + "input-fields-alignment-row": "पंक्ति", + "layout": "लेआउट", + "row-gap": "पंक्तियों के बीच का अंतर (पिक्सेल में)", + "column-gap": "स्तंभों के बीच का अंतर (पिक्सेल में)", + "latitude-field-required": "अक्षांश फ़ील्ड आवश्यक है", + "longitude-field-required": "देशांतर फ़ील्ड आवश्यक है", + "attribute-settings": "विशेषता सेटिंग्स", + "widget-mode": "विजेट मोड", + "widget-mode-update-attribute": "विशेषता अपडेट करें", + "widget-mode-update-timeseries": "टाइम सीरीज़ अपडेट करें", + "attribute-scope": "विशेषता स्कोप", + "attribute-scope-server": "सर्वर विशेषता", + "attribute-scope-shared": "शेयर की गई विशेषता", + "value-required": "मान आवश्यक है", + "image-settings": "छवि सेटिंग्स", + "image-format": "छवि फ़ॉर्मेट", + "image-format-jpeg": "JPEG", + "image-format-png": "PNG", + "image-format-webp": "WEBP", + "image-quality": "छवि गुणवत्ता (हानिपूर्ण संपीड़न वाले फ़ॉर्मेट जैसे JPEG और WEBP के लिए)", + "max-image-width": "अधिकतम छवि चौड़ाई", + "max-image-height": "अधिकतम छवि ऊँचाई", + "action-buttons": "एक्शन बटन", + "show-action-buttons": "एक्शन बटन दिखाएँ", + "update-all-values": "सिर्फ़ बदलाव नहीं, सभी मान अपडेट करें", + "save-button-label": "'SAVE' बटन लेबल", + "reset-button-label": "'UNDO' बटन लेबल", + "group-settings": "समूह सेटिंग्स", + "show-group-title": "विभिन्न एंटिटीज़ से संबंधित फ़ील्ड्स के समूह का शीर्षक दिखाएँ", + "group-title": "समूह शीर्षक", + "fields-alignment": "फ़ील्ड्स संरेखण", + "fields-alignment-row": "पंक्ति (डिफ़ॉल्ट)", + "fields-alignment-column": "स्तंभ", + "fields-in-row": "पंक्ति में फ़ील्ड्स की संख्या", + "option-value": "मान (खाली विकल्प बनाने के लिए 'null' लिखें)", + "option-label": "लेबल", + "hide-input-field": "इनपुट फ़ील्ड छुपाएँ", + "datakey-type": "डेटाकुंजी प्रकार", + "datakey-type-server": "सर्वर विशेषता (डिफ़ॉल्ट)", + "datakey-type-shared": "शेयर की गई विशेषता", + "datakey-type-timeseries": "टाइम सीरीज़", + "datakey-value-type": "डेटाकुंजी मान प्रकार", + "datakey-value-type-string": "स्ट्रिंग", + "datakey-value-type-double": "डबल", + "datakey-value-type-integer": "इंटीजर", + "datakey-value-type-json": "JSON", + "datakey-value-type-boolean-checkbox": "बूलियन (चेकबॉक्स)", + "datakey-value-type-boolean-switch": "बूलियन (स्विच)", + "datakey-value-type-date-time": "तारीख और समय", + "datakey-value-type-date": "तारीख", + "datakey-value-type-time": "समय", + "datakey-value-type-select": "सेलेक्ट", + "datakey-value-type-radio": "रेडियो", + "datakey-value-type-color": "रंग", + "value-is-required": "मान आवश्यक है", + "ability-to-edit-attribute": "विशेषता संपादित करने की अनुमति", + "ability-to-edit-attribute-editable": "संपादन योग्य (डिफ़ॉल्ट)", + "ability-to-edit-attribute-disabled": "अक्षम", + "ability-to-edit-attribute-readonly": "केवल पढ़ने योग्य", + "disable-on-datakey-name": "अन्य डेटाकुंजी के false मान पर अक्षम करें (डेटाकुंजी नाम निर्दिष्ट करें)", + "field-appearance": "फ़ील्ड दिखावट", + "appearance-fill": "भराव", + "appearance-outline": "आउटलाइन", + "subscript-sizing": "सबस्क्रिप्ट आकार निर्धारण", + "subscript-sizing-fixed": "स्थिर", + "subscript-sizing-dynamic": "डायनैमिक", + "slide-toggle-settings": "स्लाइड टॉगल सेटिंग्स", + "slide-toggle-label-position": "स्लाइड टॉगल लेबल स्थिति", + "slide-toggle-label-position-after": "बाद में", + "slide-toggle-label-position-before": "पहले", + "select-options": "सेलेक्ट विकल्प", + "no-select-options": "कोई सेलेक्ट विकल्प कॉन्फ़िगर नहीं किया गया", + "add-select-option": "सेलेक्ट विकल्प जोड़ें", + "numeric-field-settings": "न्यूमेरिक फ़ील्ड सेटिंग्स", + "step-interval": "मानों के बीच चरण अंतराल", + "error-messages": "त्रुटि संदेश", + "min-value-error-message": "'न्यूनतम मान' त्रुटि संदेश", + "max-value-error-message": "'अधिकतम मान' त्रुटि संदेश", + "invalid-date-error-message": "'अमान्य तारीख' त्रुटि संदेश", + "invalid-JSON-error-message": "'अमान्य JSON' त्रुटि संदेश", + "icon-settings": "आइकन सेटिंग्स", + "dialog-editor-settings": "डायलॉग संपादक सेटिंग्स", + "use-custom-icon": "कस्टम आइकन उपयोग करें", + "input-cell-icon": "इनपुट सेल से पहले दिखाने वाला आइकन", + "value-conversion-settings": "मान परिवर्तन सेटिंग्स", + "get-value-settings": "मान प्राप्त करने की सेटिंग्स", + "use-get-value-function": "getValue फ़ंक्शन उपयोग करें", + "get-value-function": "getValue फ़ंक्शन", + "set-value-settings": "मान सेट करने की सेटिंग्स", + "use-set-value-function": "setValue फ़ंक्शन उपयोग करें", + "set-value-function": "setValue फ़ंक्शन", + "json-invalid": "JSON मान का फ़ॉर्मेट अमान्य है", + "title": "शीर्षक", + "cancel-button-label": "'Cancel' बटन लेबल", + "radio-button-settings": "रेडियो बटन सेटिंग्स", + "color": "रंग", + "columns": "स्तंभ", + "radio-options": "रेडियो विकल्प", + "no-radio-options": "कोई रेडियो विकल्प कॉन्फ़िगर नहीं किए गए", + "add-radio-option": "रेडियो विकल्प जोड़ें", + "radio-label-position": "लेबल स्थिति", + "radio-label-position-before": "पहले", + "radio-label-position-after": "बाद में" + }, + "invalid-qr-code-text": "QR कोड के लिए इनपुट टेक्स्ट अमान्य है। इनपुट का प्रकार स्ट्रिंग होना चाहिए", + "qr-code": { + "use-qr-code-text-function": "QR कोड टेक्स्ट फ़ंक्शन उपयोग करें", + "qr-code-text-pattern": "QR कोड टेक्स्ट पैटर्न (उदाहरण: '${entityName} | ${keyName} - कुछ टेक्स्ट.')", + "qr-code-text-pattern-hint": "QR कोड टेक्स्ट पैटर्न एंटिटी उपनाम में एंटिटीज़ के भीतर पहली मिली कुंजी के मान का उपयोग करता है।", + "qr-code-text-pattern-required": "QR कोड टेक्स्ट पैटर्न आवश्यक है।", + "qr-code-text-function": "QR कोड टेक्स्ट फ़ंक्शन" + }, + "label-widget": { + "label-pattern": "पैटर्न", + "label-pattern-hint": "संकेत: उदाहरण: 'टेक्स्ट ${keyName} यूनिट्स.' या ${#<key index>} units'", + "label-pattern-required": "पैटर्न आवश्यक है", + "label-position": "स्थिति (पृष्ठभूमि के सापेक्ष प्रतिशत)", + "x-pos": "X", + "y-pos": "Y", + "background-color": "पृष्ठभूमि रंग", + "font-settings": "फ़ॉन्ट सेटिंग्स", + "background-image": "पृष्ठभूमि छवि", + "labels": "लेबल्स", + "no-labels": "कोई लेबल कॉन्फ़िगर नहीं किए गए", + "add-label": "लेबल जोड़ें" + }, + "navigation": { + "title": "शीर्षक", + "navigation-path": "नेविगेशन पथ", + "filter-type": "फ़िल्टर प्रकार", + "filter-type-all": "सभी आइटम", + "filter-type-include": "आइटम शामिल करें", + "filter-type-exclude": "आइटम बाहर रखें", + "items": "आइटम", + "enter-urls-to-filter": "फ़िल्टर करने के लिए URLs दर्ज करें..." + }, + "persistent-table": { + "rpc-id": "RPC ID", + "message-type": "संदेश प्रकार", + "method": "मेथड", + "params": "पैरामीटर्स", + "created-time": "निर्माण समय", + "expiration-time": "समाप्ति समय", + "retries": "पुनः प्रयास", + "status": "स्थिति", + "filter": "फ़िल्टर", + "refresh": "रिफ्रेश", + "add": "Persistent RPC अनुरोध जोड़ें", + "details": "विवरण", + "delete": "हटाएँ", + "delete-request-title": "Persistent RPC अनुरोध हटाएँ", + "delete-request-text": "क्या आप वाकई इस अनुरोध को हटाना चाहते हैं?", + "details-title": "विवरण RPC ID: ", + "additional-info": "अतिरिक्त जानकारी", + "response": "प्रतिक्रिया", + "any-status": "कोई भी स्थिति", + "rpc-status-list": "RPC स्थिति सूची", + "no-request-prompt": "प्रदर्शित करने के लिए कोई अनुरोध नहीं", + "send-request": "अनुरोध भेजें", + "add-title": "Persistent RPC अनुरोध बनाएँ", + "method-error": "मेथड आवश्यक है।", + "timeout-error": "न्यूनतम टाइमआउट मान 5000 (5 सेकंड) है।", + "white-space-error": "Whitespace की अनुमति नहीं है.", + "rpc-status": { + "QUEUED": "कतारबद्ध", + "SENT": "भेजा गया", + "DELIVERED": "डिलीवर किया गया", + "SUCCESSFUL": "सफल", + "TIMEOUT": "टाइमआउट", + "EXPIRED": "समाप्त", + "FAILED": "विफल" + }, + "rpc-search-status-all": "सभी", + "message-types": { + "false": "टू-वे", + "true": "वन-वे" + }, + "general-settings": "सामान्य सेटिंग्स", + "enable-filter": "फ़िल्टर सक्षम करें", + "enable-sticky-header": "स्क्रॉल करते समय हेडर दिखाएँ", + "enable-sticky-action": "स्क्रॉल करते समय एक्शन कॉलम दिखाएँ", + "display-request-details": "अनुरोध विवरण दिखाएँ", + "allow-send-request": "RPC अनुरोध भेजने की अनुमति दें", + "allow-delete-request": "अनुरोध हटाने की अनुमति दें", + "columns-settings": "कॉलम सेटिंग्स", + "display-columns": "दिखाने के लिए कॉलम", + "column": "कॉलम", + "no-columns-found": "कोई कॉलम नहीं मिला", + "no-columns-matching": "'{{column}}' नहीं मिला." + }, + "range-chart": { + "chart": "चार्ट", + "data-zoom": "डेटा ज़ूम", + "range-chart-appearance": "रेंज चार्ट दिखावट", + "range-colors": "रेंज रंग", + "out-of-range-color": "रेंज से बाहर का रंग", + "show-range-thresholds": "रेंज थ्रेशहोल्ड्स दिखाएँ", + "range-thresholds-settings": "रेंज थ्रेशहोल्ड्स सेटिंग्स", + "fill-area": "क्षेत्र भरें", + "fill-area-opacity": "क्षेत्र की अपारदर्शिता", + "range-chart-style": "रेंज चार्ट शैली" + }, + "knob": { + "behavior": "व्यवहार", + "initial-value": "प्रारंभिक मान", + "initial-value-hint": "नॉब के प्रारंभिक मान को प्राप्त करने के लिए क्रिया।", + "on-value-change": "मान बदलने पर", + "on-value-change-hint": "जब नॉब का मान बदलता है तब क्रिया ट्रिगर होती है।", + "range": "सीमा", + "min": "न्यूनतम", + "max": "अधिकतम", + "value": "मान", + "fallback-initial-value": "फॉलबैक प्रारंभिक मान" + }, + "rpc": { + "value-settings": "मान सेटिंग्स", + "initial-value": "प्रारंभिक मान", + "retrieve-value-settings": "On/Off मान प्राप्त करने की सेटिंग्स", + "retrieve-value-method": "मान प्राप्त करने की विधि", + "retrieve-value-method-none": "प्राप्त न करें", + "retrieve-value-method-rpc": "RPC get value मेथड कॉल करें", + "retrieve-value-method-attribute": "एट्रिब्यूट को सब्सक्राइब करें", + "retrieve-value-method-timeseries": "टाइम सीरीज़ को सब्सक्राइब करें", + "attribute-value-key": "एट्रिब्यूट कुंजी", + "timeseries-value-key": "टाइम सीरीज़ कुंजी", + "get-value-method": "RPC get value मेथड", + "parse-value-function": "मान पार्स करने का फ़ंक्शन", + "update-value-settings": "मान अपडेट करने की सेटिंग्स", + "set-value-method": "RPC set value मेथड", + "convert-value-function": "मान रूपांतरण फ़ंक्शन", + "rpc-settings": "RPC सेटिंग्स", + "request-timeout": "RPC अनुरोध टाइमआउट (ms)", + "persistent-rpc-settings": "Persistent RPC सेटिंग्स", + "request-persistent": "Persistent RPC अनुरोध", + "persistent-polling-interval": "Persistent RPC प्रतिक्रिया प्राप्त करने के लिए पोलिंग अंतराल (ms)", + "common-settings": "सामान्य सेटिंग्स", + "switch-title": "स्विच शीर्षक", + "show-on-off-labels": "On/Off लेबल दिखाएँ", + "slide-toggle-label": "स्लाइड टॉगल लेबल", + "label-position": "लेबल स्थिति", + "label-position-before": "पहले", + "label-position-after": "बाद में", + "slider-color": "स्लाइडर रंग", + "slider-color-primary": "प्राथमिक", + "slider-color-accent": "एक्सेंट", + "slider-color-warn": "चेतावनी", + "button-style": "बटन शैली", + "button-raised": "रेज़्ड बटन", + "button-primary": "प्राथमिक रंग", + "button-background-color": "बटन पृष्ठभूमि रंग", + "button-text-color": "बटन टेक्स्ट रंग", + "widget-title": "विजेट शीर्षक", + "button-label": "बटन लेबल", + "device-attribute-scope": "डिवाइस एट्रिब्यूट स्कोप", + "server-attribute": "सर्वर एट्रिब्यूट", + "shared-attribute": "शेयर की गई एट्रिब्यूट", + "device-attribute-parameters": "डिवाइस एट्रिब्यूट पैरामीटर्स", + "is-one-way-command": "वन-वे कमांड है", + "rpc-method": "RPC मेथड", + "rpc-method-params": "RPC मेथड पैरामीटर्स", + "show-rpc-error": "RPC कमांड निष्पादन त्रुटि दिखाएँ", + "led-title": "LED शीर्षक", + "led-color": "LED रंग", + "check-status-settings": "स्टेटस जाँच सेटिंग्स", + "perform-rpc-status-check": "RPC डिवाइस स्टेटस जाँच करें", + "retrieve-led-status-value-method": "LED स्टेटस मान को प्राप्त करने की विधि", + "led-status-value-attribute": "डिवाइस एट्रिब्यूट जिसमें LED स्टेटस मान है", + "led-status-value-timeseries": "डिवाइस टाइम सीरीज़ जिसमें LED स्टेटस मान है", + "check-status-method": "RPC डिवाइस स्टेटस जाँच मेथड", + "parse-led-status-value-function": "LED स्टेटस मान पार्स करने का फ़ंक्शन", + "knob-title": "नॉब शीर्षक" + }, + "maps": { + "map-type": { + "type": "मैप प्रकार", + "map": "मैप", + "image": "छवि" + }, + "image": { + "image-source": "छवि स्रोत", + "image-source-image": "छवि", + "image-source-entity-key": "एंटिटी कुंजी", + "source-entity-alias": "सोर्स एंटिटी उपनाम", + "image-url-key": "छवि URL कुंजी", + "image-url-key-required": "छवि URL कुंजी आवश्यक है" + }, + "control": { + "map-controls": "मैप नियंत्रण", + "position": "स्थिति", + "position-topleft": "ऊपर-बाएँ", + "position-topright": "ऊपर-दाएँ", + "position-bottomleft": "नीचे-बाएँ", + "position-bottomright": "नीचे-दाएँ", + "zoom-actions": "ज़ूम क्रियाएँ", + "zoom-scroll": "स्क्रॉल", + "zoom-double-click": "डबल-क्लिक", + "zoom-control-buttons": "कंट्रोल बटन", + "scale": "स्केल", + "scale-metric": "मेट्रिक", + "scale-imperial": "इम्पीरियल", + "switch-to-drag-mode-using-button": "बटन का उपयोग करके ड्रैग मोड पर स्विच करें" + }, + "timeline": { + "control-panel": "टाइमलाइन नियंत्रण पैनल", + "time-step": "समय चरण", + "speed-options": "गति विकल्प", + "timestamp": "टाइमस्टैम्प", + "snap-to-real-location": "वास्तविक स्थान पर स्नैप करें", + "location-snap-filter-function": "लोकेशन स्नैप फ़िल्टर फ़ंक्शन", + "no-trips-data-available": "कोई ट्रिप डेटा उपलब्ध नहीं" + }, + "map-action": { + "map-action-buttons": "मैप एक्शन बटन", + "label": "लेबल", + "icon": "आइकन", + "color": "रंग", + "action": "एक्शन", + "add-button": "बटन जोड़ें", + "no-action-buttons-configured": "कोई एक्शन बटन कॉन्फ़िगर नहीं किया गया", + "remove-action-button": "एक्शन बटन हटाएँ", + "map-action-button": "मैप एक्शन बटन", + "button-requires": "बटन के लिए लेबल या आइकन आवश्यक है" + }, + "common": { + "common-map-settings": "सामान्य मैप सेटिंग्स", + "fit-map-bounds": "सभी मार्कर्स को कवर करने के लिए मैप सीमा फिट करें", + "default-map-center-position": "डिफ़ॉल्ट मैप केंद्र स्थिति", + "default-map-zoom-level": "डिफ़ॉल्ट मैप ज़ूम स्तर", + "entities-limit": "लोड करने के लिए एंटिटीज़ की सीमा" + }, + "layer": { + "label": "लेबल", + "layer": "लेयर", + "layers": "लेयर्स", + "map-layers": "मैप लेयर्स", + "add-layer": "लेयर जोड़ें", + "layer-settings": "लेयर सेटिंग्स", + "remove-layer": "लेयर हटाएँ", + "no-layers": "कोई लेयर्स कॉन्फ़िगर नहीं की गईं", + "roadmap": "रोडमैप", + "satellite": "सैटेलाइट", + "hybrid": "हाइब्रिड", + "reference": { + "reference-layer": "रेफरेंस लेयर", + "no-layer": "कोई लेयर नहीं", + "openstreetmap-hybrid": "OpenStreetMap हाइब्रिड", + "world-edition-hybrid": "वर्ल्ड एडिशन हाइब्रिड", + "enhanced-contrast-hybrid": "एन्हांस्ड कॉन्ट्रास्ट हाइब्रिड" + }, + "provider": { + "provider": "प्रोवाइडर", + "openstreet": { + "title": "OpenStreet", + "mapnik": "Mapnik", + "hot": "HOT", + "esri-street": "WorldStreetMap", + "esri-topo": "WorldTopoMap", + "esri-imagery": "WorldImagery", + "cartodb-positron": "Positron", + "cartodb-dark-matter": "DarkMatter" + }, + "google": { + "title": "Google", + "roadmap": "Roadmap", + "satellite": "Satellite", + "hybrid": "Hybrid", + "terrain": "Terrain" + }, + "here": { + "title": "HERE", + "normal-day": "Normal day", + "normal-night": "Normal night", + "hybrid-day": "Hybrid day", + "terrain-day": "Terrain day" + }, + "tencent": { + "title": "Tencent", + "normal": "Normal", + "satellite": "Satellite", + "terrain": "Terrain" + }, + "custom": { + "title": "Custom", + "tile-url": "Tile URL" + } + }, + "credentials": { + "credentials": "Credentials", + "api-key": "API Key" + } + }, + "overlays": { + "overlays": "ओवरलेज़", + "overlays-hint": "मैप एंटिटीज़ के लिए डेटा स्रोत, दिखावट, व्यवहार, संपादन विकल्प और ग्रुपिंग कॉन्फ़िगर करें", + "trips": "ट्रिप्स", + "markers": "मार्कर्स", + "polygons": "पॉलीगॉन्स", + "circles": "सर्कल्स" + }, + "data-layer": { + "source": "सोर्स", + "filter": "फ़िल्टर", + "additional-data-keys": "अतिरिक्त डेटा कीज़", + "additional-datasources": "अतिरिक्त डेटा सोर्सेज़", + "additional-datasources-hint": "उन एंटिटीज़ के एट्रिब्यूट्स या टेलीमेट्री तक पहुँचने के लिए डेटा सोर्स जिन्हें मैप पर प्रदर्शित नहीं किया जाता; इन्हें मैप ओवरले फ़ंक्शंस में उपयोग किया जा सकता है।", + "more-datasources": "अधिक डेटा सोर्सेज़", + "data-keys": "डेटा कीज़", + "add-datasource": "डेटा सोर्स जोड़ें", + "no-datasources": "कोई डेटा सोर्स कॉन्फ़िगर नहीं किया गया", + "remove-datasource": "डेटा सोर्स हटाएँ", + "behavior": "व्यवहार", + "on-click": "क्लिक पर", + "on-click-hint": "जब उपयोगकर्ता मैप आइटम पर क्लिक करता है तब क्रिया प्रारंभ होती है।", + "groups": "ग्रुप्स", + "groups-hint": "ओवरले को सौंपे गए ग्रुप नामों की सूची, जिनसे मैप पर उसकी दृश्यता को टॉगल किया जाता है।", + "color": "रंग", + "color-settings": "रंग सेटिंग्स", + "color-type-constant": "स्थिर", + "color-type-range": "रेंज", + "color-type-function": "फ़ंक्शन", + "color-range-source-key": "रंग रेंज सोर्स की", + "color-range-source-key-required": "रंग रेंज सोर्स की आवश्यक है", + "color-range": "रंग रेंज", + "color-function": "रंग फ़ंक्शन", + "label": "लेबल", + "tooltip": "टूलटिप", + "pattern-type-pattern": "पैटर्न", + "pattern-type-function": "फ़ंक्शन", + "label-pattern": "लेबल (पैटर्न उदाहरण: '${entityName}', '${entityName}: (टेक्स्ट ${keyName} यूनिट्स.)')", + "label-function": "लेबल फ़ंक्शन", + "tooltip-pattern": "टूलटिप (उदाहरण: 'टेक्स्ट ${keyName} यूनिट्स.' या लिंक टेक्स्ट)", + "tooltip-function": "टूलटिप फ़ंक्शन", + "tooltip-trigger": "टूलटिप ट्रिगर", + "tooltip-trigger-click": "क्लिक पर टूलटिप दिखाएँ", + "tooltip-trigger-hover": "होवर पर टूलटिप दिखाएँ", + "auto-close-tooltips": "टूलटिप्स स्वतः बंद करें", + "tooltip-offset": "टूलटिप ऑफ़सेट", + "tooltip-offset-horizontal": "क्षैतिज", + "tooltip-offset-vertical": "ऊर्ध्वाधर", + "tooltip-tag-actions": "टैग क्रियाएँ", + "add-tooltip-tag-action": "टैग क्रिया जोड़ें", + "edit-tooltip-tag-action": "टैग क्रिया संपादित करें", + "remove-tooltip-tag-action": "टैग क्रिया हटाएँ", + "action-add": "जोड़ें", + "action-edit": "संपादित करें", + "action-move": "स्थानांतरित करें", + "action-remove": "हटाएँ", + "edit-instruments": "उपकरण", + "persist-location-attribute-scope": "लोकेशन को संरक्षित करने के लिए एट्रिब्यूट का स्कोप", + "enable-snapping": "सटीक ड्रॉइंग के लिए अन्य वर्टिसेस के साथ स्नैपिंग सक्षम करें", + "enable-snapping-hint": "नई पॉइंट्स को मौजूदा आकृतियों के साथ स्वचालित रूप से संरेखित करता है जिससे ड्रॉइंग अधिक आसान और सटीक हो जाती है।", + "drag-drop-mode": "ड्रैग-ड्रॉप मोड", + "trip": { + "no-trips": "कोई ट्रिप कॉन्फ़िगर नहीं की गई", + "add-trip": "ट्रिप जोड़ें", + "trip-configuration": "ट्रिप कॉन्फ़िगरेशन", + "remove-trip": "ट्रिप हटाएँ" + }, + "marker": { + "marker": "मार्कर", + "latitude-key": "Latitude कुंजी", + "longitude-key": "Longitude कुंजी", + "x-pos-key": "X स्थिति कुंजी", + "y-pos-key": "Y स्थिति कुंजी", + "latitude-key-required": "Latitude कुंजी आवश्यक है", + "longitude-key-required": "Longitude कुंजी आवश्यक है", + "x-pos-key-required": "X स्थिति कुंजी आवश्यक है", + "y-pos-key-required": "Y स्थिति कुंजी आवश्यक है", + "no-markers": "कोई मार्कर्स कॉन्फ़िगर नहीं किए गए", + "add-marker": "मार्कर जोड़ें", + "marker-configuration": "मार्कर कॉन्फ़िगरेशन", + "remove-marker": "मार्कर हटाएँ", + "marker-type": "मार्कर प्रकार", + "marker-type-shape": "आकृति", + "marker-type-icon": "आइकन", + "marker-type-image": "छवि", + "shape": "आकृति", + "icon": "आइकन", + "image": "छवि", + "marker-shapes": "मार्कर आकृतियाँ", + "marker-icon": "मार्कर आइकन", + "marker-appearance": "मार्कर दिखावट", + "marker-image": "मार्कर छवि", + "marker-image-type-image": "छवि", + "marker-image-type-function": "फ़ंक्शन", + "custom-marker-image-size": "कस्टम मार्कर इमेज आकार", + "marker-image-function": "मार्कर इमेज फ़ंक्शन", + "marker-images": "मार्कर छवियाँ", + "marker-offset": "मार्कर ऑफ़सेट", + "offset-horizontal": "क्षैतिज", + "offset-vertical": "ऊर्ध्वाधर", + "rotate-marker": "मार्कर घुमाएँ", + "offset-angle": "ऑफ़सेट कोण", + "position-conversion": "स्थिति रूपांतरण", + "position-conversion-function": "स्थिति रूपांतरण फ़ंक्शन, जो 0 से 1 तक प्रत्येक के लिए double के रूप में x,y निर्देशांक वापस करता है", + "clustering": { + "use-map-markers-clustering": "मैप मार्कर्स क्लस्टरिंग का उपयोग करें", + "zoom-on-cluster-click": "क्लस्टर पर क्लिक करने पर ज़ूम करें", + "max-zoom": "अधिकतम ज़ूम स्तर जिस पर एक मार्कर क्लस्टर का हिस्सा हो सकता है (0 - 18)", + "max-radius": "अधिकतम त्रिज्या जो एक क्लस्टर कवर करेगा", + "zoom-animation": "ज़ूम करते समय मार्कर्स पर एनीमेशन", + "bounds-on-cluster-mouse-over": "क्लस्टर पर माउस ओवर होने पर मार्कर्स की सीमाएँ", + "spiderfy-max-zoom-level": "मैक्स ज़ूम स्तर पर स्पाइडरफाई (सभी क्लस्टर मार्कर्स देखने के लिए)", + "load-optimization": "लोड ऑप्टिमाइज़ेशन", + "chunked-load": "मार्कर्स जोड़ने के लिए चंक्स का उपयोग करें ताकि पेज फ्रीज़ न हो", + "lazy-load": "मार्कर्स जोड़ने के लिए लेज़ी लोड का उपयोग करें", + "use-cluster-marker-color-function": "क्लस्टर मार्कर्स का रंग फ़ंक्शन उपयोग करें", + "marker-color-function": "मार्कर रंग फ़ंक्शन" + }, + "edit": "मार्कर संपादित करें", + "remove-marker-for": "'{{entityName}}' के लिए मार्कर हटाएँ", + "place-marker": "मार्कर रखें", + "place-marker-hint": "मार्कर रखने के लिए क्लिक करें", + "place-marker-hint-with-entity": "'{{entityName}}' एंटिटी को रखने के लिए क्लिक करें" + }, + "path": { + "path": "पाथ", + "path-decorator": "पाथ डेकोरेटर", + "decorator-symbol": "डेकोरेटर प्रतीक", + "decorator-symbol-arrow-head": "तीर", + "decorator-symbol-dash": "डैश", + "decorator-arrangement": "डेकोरेटर व्यवस्था", + "decorator-offset": "आरंभ", + "decorator-end-offset": "समाप्ति", + "decorator-repeat": "दोहराएँ" + }, + "points": { + "points": "प्वाइंट्स", + "point-tooltip": "प्वाइंट टूलटिप" + }, + "shape": { + "fill": "भराव", + "fill-type-color": "रंग", + "fill-type-stripe": "स्ट्राइप", + "fill-type-image": "छवि", + "color": "रंग", + "stripe": "स्ट्राइप", + "image": "छवि", + "stroke": "स्ट्रोक", + "fill-image": "भराव छवि", + "fill-image-type-image": "छवि", + "fill-image-type-function": "फ़ंक्शन", + "preserve-aspect-ratio": "आस्पेक्ट अनुपात बनाए रखें", + "opacity": "अपारदर्शिता", + "angle": "रोटेशन कोण", + "scale": "स्केल", + "fill-image-function": "आकार भरने की छवि फ़ंक्शन", + "fill-images": "आकार भरने की छवियाँ", + "stripe-pattern": "स्ट्राइप पैटर्न", + "first-stripe": "पहला स्ट्राइप", + "second-stripe": "दूसरा स्ट्राइप" + }, + "polygon": { + "polygon-key": "पॉलीगॉन कुंजी", + "polygon-key-required": "पॉलीगॉन कुंजी आवश्यक है", + "no-polygons": "कोई पॉलीगॉन्स कॉन्फ़िगर नहीं किए गए", + "add-polygon": "पॉलीगॉन जोड़ें", + "polygon-configuration": "पॉलीगॉन कॉन्फ़िगरेशन", + "remove-polygon": "पॉलीगॉन हटाएँ", + "edit": "पॉलीगॉन संपादित करें", + "remove-polygon-for": "'{{entityName}}' के लिए पॉलीगॉन हटाएँ", + "cut": "पॉलीगॉन क्षेत्र काटें", + "rotate": "पॉलीगॉन घुमाएँ", + "draw-rectangle": "रेक्टैंगल बनाएं", + "draw-polygon": "पॉलीगॉन बनाएं", + "polygon-place-first-point-cut-hint": "पहला बिंदु रखने के लिए क्लिक करें", + "continue-polygon-cut-hint": "ड्रॉइंग जारी रखने के लिए क्लिक करें", + "finish-polygon-cut-hint": "समाप्त करने और सहेजने के लिए पहले मार्कर पर क्लिक करें", + "polygon-place-first-point-hint": "पॉलीगॉन: पहला बिंदु रखने के लिए क्लिक करें", + "polygon-place-first-point-hint-with-entity": "'{{entityName}}' के लिए पॉलीगॉन: पहला बिंदु रखने के लिए क्लिक करें", + "continue-polygon-hint": "पॉलीगॉन: ड्रॉइंग जारी रखने के लिए क्लिक करें", + "continue-polygon-hint-with-entity": "'{{entityName}}' के लिए पॉलीगॉन: ड्रॉइंग जारी रखने के लिए क्लिक करें", + "finish-polygon-hint": "पॉलीगॉन: ड्रॉइंग समाप्त करने के लिए पहले मार्कर पर क्लिक करें", + "finish-polygon-hint-with-entity": "'{{entityName}}' के लिए पॉलीगॉन: समाप्त करने और सहेजने के लिए पहले मार्कर पर क्लिक करें", + "rectangle-place-first-point-hint": "रेक्टैंगल: पहला बिंदु रखने के लिए क्लिक करें", + "rectangle-place-first-point-hint-with-entity": "'{{entityName}}' के लिए रेक्टैंगल: पहला बिंदु रखने के लिए क्लिक करें", + "finish-rectangle-hint": "रेक्टैंगल: ड्रॉइंग समाप्त करने के लिए क्लिक करें", + "finish-rectangle-hint-with-entity": "'{{entityName}}' के लिए रेक्टैंगल: समाप्त करने और सहेजने के लिए क्लिक करें" + }, + "circle": { + "circle-key": "सर्कल कुंजी", + "circle-key-required": "सर्कल कुंजी आवश्यक है", + "no-circles": "कोई सर्कल कॉन्फ़िगर नहीं किए गए", + "add-circle": "सर्कल जोड़ें", + "circle-configuration": "सर्कल कॉन्फ़िगरेशन", + "remove-circle": "सर्कल हटाएँ", + "edit": "सर्कल संपादित करें", + "remove-circle-for": "'{{entityName}}' के लिए सर्कल हटाएँ", + "draw-circle": "सर्कल बनाएं", + "place-circle-center-hint-with-entity": "'{{entityName}}' के लिए सर्कल: केंद्र रखने के लिए क्लिक करें", + "place-circle-center-hint": "सर्कल: केंद्र रखने के लिए क्लिक करें", + "finish-circle-hint-with-entity": "'{{entityName}}' के लिए सर्कल: समाप्त करने और सहेजने के लिए क्लिक करें", + "finish-circle-hint": "सर्कल: ड्रॉइंग समाप्त करने के लिए क्लिक करें" + }, + "select-entity": "एंटिटी चुनें", + "select-entity-hint": "संकेत: चयन के बाद स्थिति सेट करने के लिए मैप पर क्लिक करें" + }, + "select-entity": "एंटिटी चुनें", + "select-entity-hint": "संकेत: चयन के बाद स्थिति सेट करने के लिए मैप पर क्लिक करें", + "tooltips": { + "placeMarker": "'{{entityName}}' एंटिटी को रखने के लिए क्लिक करें", + "firstVertex": "'{{entityName}}' के लिए पॉलीगॉन: पहला बिंदु रखने के लिए क्लिक करें", + "firstVertex-cut": "पहला बिंदु रखने के लिए क्लिक करें", + "continueLine": "'{{entityName}}' के लिए पॉलीगॉन: ड्रॉइंग जारी रखने के लिए क्लिक करें", + "continueLine-cut": "ड्रॉइंग जारी रखने के लिए क्लिक करें", + "finishLine": "समाप्त करने के लिए किसी भी मौजूदा मार्कर पर क्लिक करें", + "finishPoly": "'{{entityName}}' के लिए पॉलीगॉन: समाप्त करने और सहेजने के लिए पहले मार्कर पर क्लिक करें", + "finishPoly-cut": "समाप्त करने और सहेजने के लिए पहले मार्कर पर क्लिक करें", + "finishRect": "'{{entityName}}' के लिए पॉलीगॉन: समाप्त करने और सहेजने के लिए क्लिक करें", + "startCircle": "'{{entityName}}' के लिए सर्कल: सर्कल का केंद्र रखने के लिए क्लिक करें", + "finishCircle": "'{{entityName}}' के लिए सर्कल: सर्कल पूरा करने के लिए क्लिक करें", + "placeCircleMarker": "सर्कल मार्कर रखने के लिए क्लिक करें" + }, + "actions": { + "finish": "समाप्त करें", + "cancel": "रद्द करें", + "removeLastVertex": "अंतिम बिंदु हटाएँ" + }, + "buttonTitles": { + "drawMarkerButton": "एंटिटी रखें", + "drawPolyButton": "पॉलीगॉन बनाएँ", + "drawLineButton": "पॉलीलाइन बनाएँ", + "drawCircleButton": "सर्कल बनाएँ", + "drawRectButton": "रेक्टैंगल बनाएँ", + "editButton": "संपादन मोड", + "dragButton": "ड्रैग-ड्रॉप मोड", + "cutButton": "पॉलीगॉन क्षेत्र काटें", + "deleteButton": "हटाएँ", + "drawCircleMarkerButton": "सर्कल मार्कर बनाएँ", + "rotateButton": "पॉलीगॉन घुमाएँ" + }, + "map-provider-settings": "मैप प्रोवाइडर सेटिंग्स", + "map-provider": "मैप प्रोवाइडर", + "map-provider-google": "Google maps", + "map-provider-openstreet": "OpenStreet maps", + "map-provider-here": "HERE maps", + "map-provider-image": "Image map", + "map-provider-tencent": "Tencent maps", + "openstreet-provider": "OpenStreet map provider", + "openstreet-provider-mapnik": "OpenStreetMap.Mapnik (Default)", + "openstreet-provider-hot": "OpenStreetMap.HOT", + "openstreet-provider-esri-street": "Esri.WorldStreetMap", + "openstreet-provider-esri-topo": "Esri.WorldTopoMap", + "openstreet-provider-esri-imagery": "Esri.WorldImagery", + "openstreet-provider-cartodb-positron": "CartoDB.Positron", + "openstreet-provider-cartodb-dark-matter": "CartoDB.DarkMatter", + "use-custom-provider": "कस्टम प्रोवाइडर उपयोग करें", + "custom-provider-tile-url": "कस्टम प्रोवाइडर टाइल URL", + "google-maps-api-key": "Google Maps API Key", + "default-map-type": "डिफ़ॉल्ट मैप प्रकार", + "google-map-type-roadmap": "Roadmap", + "google-map-type-satelite": "Satellite", + "google-map-type-hybrid": "Hybrid", + "google-map-type-terrain": "Terrain", + "map-layer": "मैप लेयर", + "here-map-normal-day": "HERE.normalDay (Default)", + "here-map-normal-night": "HERE.normalNight", + "here-map-hybrid-day": "HERE.hybridDay", + "here-map-terrain-day": "HERE.terrainDay", + "credentials": "क्रेडेंशियल्स", + "here-app-id": "HERE app id", + "here-app-code": "HERE app code", + "here-api-key": "HERE API key", + "here-use-new-version-api-3": "API version 3 उपयोग करें", + "tencent-maps-api-key": "Tencent Maps API Key", + "tencent-map-type-roadmap": "रोडमैप", + "tencent-map-type-satelite": "सैटेलाइट", + "tencent-map-type-hybrid": "हाइब्रिड", + "image-map-background": "इमेज मैप पृष्ठभूमि", + "image-map-background-from-entity-attribute": "एंटिटी एट्रिब्यूट से इमेज मैप पृष्ठभूमि प्राप्त करें", + "image-url-source-entity-alias": "इमेज URL सोर्स एंटिटी उपनाम", + "image-url-source-entity-attribute": "इमेज URL सोर्स एंटिटी एट्रिब्यूट", + "common-map-settings": "सामान्य मैप सेटिंग्स", + "x-pos-key-name": "X पोज़िशन कुंजी नाम", + "y-pos-key-name": "Y पोज़िशन कुंजी नाम", + "latitude-key-name": "Latitude कुंजी नाम", + "longitude-key-name": "Longitude कुंजी नाम", + "default-map-zoom-level": "डिफ़ॉल्ट मैप ज़ूम लेवल (0 - 20)", + "default-map-center-position": "डिफ़ॉल्ट मैप केंद्र स्थिति (0,0)", + "disable-scroll-zooming": "स्क्रॉल ज़ूमिंग अक्षम करें", + "disable-double-click-zooming": "डबल क्लिक ज़ूमिंग अक्षम करें", + "disable-zoom-control-buttons": "ज़ूम कंट्रोल बटन अक्षम करें", + "fit-map-bounds": "सभी मार्कर्स को कवर करने के लिए मैप सीमा फिट करें", + "use-default-map-center-position": "डिफ़ॉल्ट मैप केंद्र स्थिति का उपयोग करें", + "entities-limit": "लोड करने के लिए एंटिटीज़ की सीमा", + "markers-settings": "मार्कर सेटिंग्स", + "marker-offset-x": "मार्कर X ऑफ़सेट (स्थिति × मार्कर चौड़ाई)", + "marker-offset-y": "मार्कर Y ऑफ़सेट (स्थिति × मार्कर ऊँचाई)", + "position-function": "स्थिति रूपांतरण फ़ंक्शन, जो x,y को 0 से 1 की सीमा में double के रूप में लौटाए", + "draggable-marker": "ड्रैग करने योग्य मार्कर", + "label": "लेबल", + "show-label": "लेबल दिखाएँ", + "use-label-function": "लेबल फ़ंक्शन उपयोग करें", + "label-pattern": "लेबल (पैटर्न उदाहरण: '${entityName}', '${entityName}: (टेक्स्ट ${keyName} यूनिट्स.)' )", + "label-function": "लेबल फ़ंक्शन", + "tooltip": "टूलटिप", + "show-tooltip": "टूलटिप दिखाएँ", + "show-tooltip-action": "टूलटिप प्रदर्शित करने की कार्रवाई", + "show-tooltip-action-click": "क्लिक पर टूलटिप दिखाएँ (डिफ़ॉल्ट)", + "show-tooltip-action-hover": "होवर पर टूलटिप दिखाएँ", + "auto-close-tooltips": "टूलटिप्स को स्वतः बंद करें", + "use-tooltip-function": "टूलटिप फ़ंक्शन उपयोग करें", + "tooltip-pattern": "टूलटिप (उदाहरण: 'टेक्स्ट ${keyName} यूनिट्स.' या लिंक टेक्स्ट)", + "tooltip-function": "टूलटिप फ़ंक्शन", + "tooltip-offset-x": "टूलटिप X ऑफ़सेट (एंकर × मार्कर चौड़ाई)", + "tooltip-offset-y": "टूलटिप Y ऑफ़सेट (एंकर × मार्कर ऊँचाई)", + "color": "रंग", + "use-color-function": "रंग फ़ंक्शन उपयोग करें", + "color-function": "रंग फ़ंक्शन", + "marker-image": "मार्कर इमेज", + "use-marker-image-function": "मार्कर इमेज फ़ंक्शन उपयोग करें", + "custom-marker-image": "कस्टम मार्कर इमेज", + "custom-marker-image-size": "कस्टम मार्कर इमेज आकार (px)", + "marker-image-function": "मार्कर इमेज फ़ंक्शन", + "marker-images": "मार्कर इमेजेज़", + "polygon-settings": "पॉलीगॉन सेटिंग्स", + "show-polygon": "पॉलीगॉन दिखाएँ", + "polygon-key-name": "पॉलीगॉन की key", + "enable-polygon-edit": "पॉलीगॉन एडिट सक्षम करें", + "polygon-label": "पॉलीगॉन लेबल", + "show-polygon-label": "पॉलीगॉन लेबल दिखाएँ", + "use-polygon-label-function": "पॉलीगॉन लेबल फ़ंक्शन उपयोग करें", + "polygon-label-pattern": "पॉलीगॉन लेबल (पैटर्न उदाहरण: '${entityName}', '${entityName}: (टेक्स्ट ${keyName} यूनिट्स.)' )", + "polygon-label-function": "पॉलीगॉन लेबल फ़ंक्शन", + "polygon-tooltip": "पॉलीगॉन टूलटिप", + "show-polygon-tooltip": "पॉलीगॉन टूलटिप दिखाएँ", + "auto-close-polygon-tooltips": "पॉलीगॉन टूलटिप्स स्वतः बंद करें", + "use-polygon-tooltip-function": "पॉलीगॉन टूलटिप फ़ंक्शन उपयोग करें", + "polygon-tooltip-pattern": "टूलटिप (उदाहरण: 'टेक्स्ट ${keyName} यूनिट्स.' या लिंक टेक्स्ट)", + "polygon-tooltip-function": "पॉलीगॉन टूलटिप फ़ंक्शन", + "polygon-color": "पॉलीगॉन रंग", + "polygon-opacity": "पॉलीगॉन अपारदर्शिता", + "use-polygon-color-function": "पॉलीगॉन रंग फ़ंक्शन उपयोग करें", + "polygon-color-function": "पॉलीगॉन रंग फ़ंक्शन", + "polygon-stroke": "पॉलीगॉन स्ट्रोक", + "stroke-color": "स्ट्रोक रंग", + "stroke-opacity": "स्ट्रोक अपारदर्शिता", + "stroke-weight": "स्ट्रोक मोटाई", + "use-polygon-stroke-color-function": "पॉलीगॉन स्ट्रोक रंग फ़ंक्शन उपयोग करें", + "polygon-stroke-color-function": "पॉलीगॉन स्ट्रोक रंग फ़ंक्शन", + "circle-settings": "सर्कल सेटिंग्स", + "show-circle": "सर्कल दिखाएँ", + "circle-key-name": "सर्कल key नाम", + "enable-circle-edit": "सर्कल एडिट सक्षम करें", + "circle-label": "सर्कल लेबल", + "show-circle-label": "सर्कल लेबल दिखाएँ", + "use-circle-label-function": "सर्कल लेबल फ़ंक्शन उपयोग करें", + "circle-label-pattern": "सर्कल लेबल (पैटर्न उदाहरण: '${entityName}', '${entityName}: (टेक्स्ट ${keyName} यूनिट्स.)' )", + "circle-label-function": "सर्कल लेबल फ़ंक्शन", + "circle-tooltip": "सर्कल टूलटिप", + "show-circle-tooltip": "सर्कल टूलटिप दिखाएँ", + "auto-close-circle-tooltips": "सर्कल टूलटिप्स स्वतः बंद करें", + "use-circle-tooltip-function": "सर्कल टूलटिप फ़ंक्शन उपयोग करें", + "circle-tooltip-pattern": "टूलटिप (उदाहरण: 'टेक्स्ट ${keyName} यूनिट्स.' या लिंक टेक्स्ट)", + "circle-tooltip-function": "सर्कल टूलटिप फ़ंक्शन", + "circle-fill-color": "सर्कल फ़िल रंग", + "circle-fill-color-opacity": "सर्कल फ़िल रंग अपारदर्शिता", + "use-circle-fill-color-function": "सर्कल फ़िल रंग फ़ंक्शन उपयोग करें", + "circle-fill-color-function": "सर्कल फ़िल रंग फ़ंक्शन", + "circle-stroke": "सर्कल स्ट्रोक", + "use-circle-stroke-color-function": "सर्कल स्ट्रोक रंग फ़ंक्शन उपयोग करें", + "circle-stroke-color-function": "सर्कल स्ट्रोक रंग फ़ंक्शन", + "markers-clustering-settings": "मार्कर्स क्लस्टरिंग सेटिंग्स", + "use-map-markers-clustering": "मैप मार्कर्स क्लस्टरिंग उपयोग करें", + "zoom-on-cluster-click": "क्लस्टर पर क्लिक करने पर ज़ूम करें", + "max-cluster-zoom": "अधिकतम ज़ूम लेवल, जिस पर मार्कर क्लस्टर का हिस्सा हो सकता है (0 - 18)", + "max-cluster-radius-pixels": "क्लस्टर द्वारा कवर किए जाने वाला अधिकतम रेडियस (पिक्सल में)", + "cluster-zoom-animation": "ज़ूम करते समय मार्कर्स पर ऐनिमेशन दिखाएँ", + "show-markers-bounds-on-cluster-mouse-over": "क्लस्टर पर माउस ले जाने पर मार्कर्स की सीमा दिखाएँ", + "spiderfy-max-zoom-level": "अधिकतम ज़ूम लेवल पर स्पाइडरफ़ाई करें (सभी क्लस्टर मार्कर्स देखने हेतु)", + "load-optimization": "लोड ऑप्टिमाइज़ेशन", + "cluster-chunked-loading": "मार्कर्स जोड़ने के लिए चंक्स का उपयोग करें ताकि पेज फ्रीज़ न हो", + "cluster-markers-lazy-load": "मार्कर्स जोड़ने के लिए लेज़ी लोड का उपयोग करें", + "editor-settings": "एडिटर सेटिंग्स", + "enable-snapping": "सटीक ड्राइंग के लिए दूसरी वर्टिसेस पर स्नैपिंग सक्षम करें", + "init-draggable-mode": "मैप को ड्रैगेबल मोड में प्रारंभ करें", + "hide-all-edit-buttons": "सभी एडिट कंट्रोल बटन छिपाएँ", + "hide-draw-buttons": "ड्रॉ बटन छिपाएँ", + "hide-edit-buttons": "एडिट बटन छिपाएँ", + "hide-remove-button": "रिमूव बटन छिपाएँ", + "route-map-settings": "रूट मैप सेटिंग्स", + "trip-animation-settings": "ट्रिप ऐनिमेशन सेटिंग्स", + "normalization-step": "नॉर्मलाइज़ेशन डेटा स्टेप (ms)", + "tooltip-background-color": "टूलटिप बैकग्राउंड रंग", + "tooltip-font-color": "टूलटिप फ़ॉन्ट रंग", + "tooltip-opacity": "टूलटिप अपारदर्शिता (0-1)", + "auto-close-tooltip": "टूलटिप स्वतः बंद करें", + "rotation-angle": "मार्कर के लिए अतिरिक्त रोटेशन ऐंगल सेट करें (deg)", + "path-settings": "पाथ सेटिंग्स", + "path-color": "पाथ रंग", + "use-path-color-function": "पाथ रंग फ़ंक्शन उपयोग करें", + "path-color-function": "पाथ रंग फ़ंक्शन", + "path-decorator": "पाथ डेकोरेटर", + "use-path-decorator": "पाथ डेकोरेटर उपयोग करें", + "decorator-symbol": "डेकोरेटर प्रतीक", + "decorator-symbol-arrow-head": "तीर", + "decorator-symbol-dash": "डैश", + "decorator-symbol-size": "डेकोरेटर प्रतीक आकार (px)", + "use-path-decorator-custom-color": "पाथ डेकोरेटर कस्टम रंग उपयोग करें", + "decorator-custom-color": "डेकोरेटर कस्टम रंग", + "decorator-offset": "डेकोरेटर ऑफ़सेट", + "end-decorator-offset": "अंतिम डेकोरेटर ऑफ़सेट", + "decorator-repeat": "डेकोरेटर दोहराव", + "points-settings": "पॉइंट सेटिंग्स", + "show-points": "पॉइंट्स दिखाएँ", + "point-color": "पॉइंट रंग", + "point-size": "पॉइंट आकार (px)", + "use-point-color-function": "पॉइंट रंग फ़ंक्शन उपयोग करें", + "point-color-function": "पॉइंट रंग फ़ंक्शन", + "use-point-as-anchor": "पॉइंट को एंकर की तरह उपयोग करें", + "point-as-anchor-function": "पॉइंट एंकर फ़ंक्शन", + "independent-point-tooltip": "स्वतंत्र पॉइंट टूलटिप", + "clustering-markers": "क्लस्टरिंग मार्कर्स", + "use-icon-create-function": "मार्कर्स रंग फ़ंक्शन उपयोग करें", + "marker-color-function": "मार्कर रंग फ़ंक्शन" + }, + "markdown": { + "use-markdown-text-function": "मार्कडाउन/HTML वैल्यू फ़ंक्शन उपयोग करें", + "markdown-text-function": "मार्कडाउन/HTML वैल्यू फ़ंक्शन", + "markdown-text-pattern": "मार्कडाउन/HTML पैटर्न (मार्कडाउन या HTML वेरिएबल्स के साथ, उदाहरण: '${entityName} या ${keyName} - कुछ टेक्स्ट.')", + "apply-default-markdown-style": "डिफ़ॉल्ट मार्कडाउन स्टाइल लागू करें", + "markdown-css": "मार्कडाउन/HTML CSS" + }, + "simple-card": { + "label": "लेबल", + "label-position": "लेबल स्थिति", + "label-position-left": "बाएँ", + "label-position-top": "ऊपर" + }, + "single-switch": { + "behavior": "व्यवहार", + "layout": "लेआउट", + "layout-right": "दाएँ", + "layout-left": "बाएँ", + "layout-centered": "सेंटर", + "auto-scale": "ऑटो स्केल", + "label": "लेबल", + "icon": "आइकन", + "switch-color": "स्विच रंग", + "on": "ऑन", + "off": "ऑफ़", + "disabled": "अक्षम", + "tumbler-color": "टंबलर रंग", + "on-label": "ऑन लेबल", + "off-label": "ऑफ़ लेबल", + "switch": "स्विच" + }, + "slider": { + "behavior": "व्यवहार", + "initial-value": "प्रारंभिक मान", + "initial-value-hint": "स्लाइडर का प्रारंभिक मान प्राप्त करने की कार्रवाई।", + "on-value-change": "मान बदलने पर", + "on-value-change-hint": "जब स्लाइडर का मान बदला जाता है तो ट्रिगर होने वाली कार्रवाई।", + "layout": "लेआउट", + "layout-default": "डिफ़ॉल्ट", + "layout-extended": "विस्तारित", + "layout-simplified": "सरलीकृत", + "auto-scale": "ऑटो स्केल", + "icon": "आइकन", + "value": "मान", + "range": "सीमा", + "min": "न्यूनतम", + "max": "अधिकतम", + "range-ticks": "सीमा टिक", + "tick-marks": "टिक मार्क्स", + "colors": "रंग", + "main": "मुख्य", + "background": "पृष्ठभूमि", + "left-icon": "बाएँ आइकन", + "right-icon": "दाएँ आइकन", + "slider": "स्लाइडर" + }, + "value-card": { + "layout": "लेआउट", + "layout-square": "वर्गाकार", + "layout-vertical": "वर्टिकल", + "layout-centered": "केंद्रित", + "layout-simplified": "सरलीकृत", + "layout-horizontal": "हॉरिज़ॉन्टल", + "layout-horizontal-reversed": "हॉरिज़ॉन्टल (उल्टा)", + "label": "लेबल", + "icon": "आइकन", + "value": "मान", + "date": "तारीख़", + "value-card-style": "वैल्यू कार्ड स्टाइल", + "auto-scale": "ऑटो स्केल" + }, + "label-card": { + "auto-scale": "ऑटो स्केल", + "label": "लेबल", + "icon": "आइकन", + "label-card-style": "लेबल कार्ड स्टाइल" + }, + "label-value-card": { + "value": "मान", + "label-value-card-style": "लेबल और मान कार्ड शैली" + }, + "liquid-level-card": { + "layout-simple": "सरल", + "layout-percentage": "प्रतिशत", + "layout-absolute": "निरपेक्ष", + "layout": "लेआउट", + "background-overlay": "मान बैकग्राउंड ओवरले", + "total-volume": "कुल मात्रा", + "total-volume-units": "कुल मात्रा की इकाइयाँ", + "tank": "टैंक", + "shape": "आकार", + "datasource-units": "स्रोत इकाइयाँ", + "widget-units": "विजेट इकाइयाँ", + "decimals": "दशमलव", + "liquid": "तरल", + "liquid-color": "तरल का रंग", + "value": "मान", + "value-font": "मान का फ़ॉन्ट", + "level": "स्तर", + "last-update": "अंतिम अपडेट", + "shape-by-attribute": "एट्रिब्यूट नाम द्वारा टैंक का आकार सेट करें", + "tooltip-background": "बैकग्राउंड रंग", + "background-blur": "बैकग्राउंड ब्लर", + "tank-color": "टैंक का रंग", + "static": "स्थिर", + "see-examples": "उदाहरण देखें", + "attribute": "विशेषता", + "shape-type": "प्रकार", + "v-oval": "वर्टिकल ओवल", + "v-cylinder": "वर्टिकल सिलेंडर", + "v-capsule": "वर्टिकल कैप्सूल", + "rectangle": "रेक्टैंगल", + "h-oval": "हॉरिज़ॉन्टल ओवल", + "h-ellipse": "हॉरिज़ॉन्टल एलिप्स", + "h-dish-ends": "हॉरिज़ॉन्टल डिश एंड्स", + "h-cylinder": "हॉरिज़ॉन्टल सिलेंडर", + "h-capsule": "हॉरिज़ॉन्टल कैप्सूल", + "h-elliptical_2_1": "हॉरिज़ॉन्टल 2:1 एलिप्टिकल", + "icon": "कार्ड आइकन", + "title": "कार्ड शीर्षक", + "units": "इकाइयाँ", + "color-and-font": "रंग और फ़ॉन्ट", + "shape-attribute-name": "एट्रिब्यूट नाम", + "total-volume-required": "कुल मात्रा आवश्यक है।", + "attribute-name-required": "एट्रिब्यूट नाम आवश्यक है।", + "attribute-key-not-set": "एट्रिब्यूट '{{attributeName}}' की कुंजी सेट नहीं है", + "attribute-key-invalid": "एट्रिब्यूट '{{attributeName}}' की कुंजी अमान्य है" + }, + "aggregated-value-card": { + "subtitle": "उपशीर्षक", + "chart": "चार्ट", + "values": "मान", + "value-appearance": "मान की उपस्थिति", + "position": "स्थान", + "position-center": "केंद्र", + "position-right-top": "दाईं ओर ऊपर", + "position-right-bottom": "दाईं ओर नीचे", + "position-left-top": "बाईं ओर ऊपर", + "position-left-bottom": "बाईं ओर नीचे", + "font": "फ़ॉन्ट", + "color": "रंग", + "arrow": "तीर", + "display-up-down-arrow": "ऊपर/नीचे तीर दिखाएँ", + "add-value": "मान जोड़ें", + "remove-value": "मान हटाएँ", + "no-values": "कोई मान कॉन्फ़िगर नहीं किया गया", + "aggregation": "एग्रीगेशन", + "aggregated-value-card-style": "एग्रीगेटेड वैल्यू कार्ड शैली", + "auto-scale": "ऑटो स्केल" + }, + "value-chart-card": { + "layout": "लेआउट", + "layout-left": "बाएँ", + "layout-right": "दाएँ", + "auto-scale": "ऑटो स्केल", + "icon": "आइकन", + "value": "मान", + "chart": "चार्ट", + "value-chart-card-style": "वैल्यू चार्ट कार्ड शैली" + }, + "progress-bar": { + "layout": "लेआउट", + "layout-default": "डिफ़ॉल्ट", + "layout-simplified": "सरलीकृत", + "auto-scale": "ऑटो स्केल", + "icon": "आइकन", + "value": "मान", + "range": "सीमा", + "min": "न्यूनतम", + "max": "अधिकतम", + "range-ticks": "सीमा टिक", + "bar": "बार", + "bar-color": "बार रंग", + "bar-background": "बार बैकग्राउंड", + "progress-bar-card-style": "प्रोग्रेस बार कार्ड शैली" + }, + "notification": { + "max-notification-display": "दिखाने के लिए अधिकतम नोटिफ़िकेशन", + "counter": "काउंटर", + "counter-hint": "यदि \"विजेट शीर्षक\" सक्षम है तो काउंटर प्रदर्शित होगा", + "icon": "आइकन", + "counter-value": "मान", + "counter-color": "रंग", + "notification-button": "नोटिफ़िकेशन बटन", + "button-view-all": "सभी देखें", + "button-filter": "फ़िल्टर", + "type-filter": "प्रकार फ़िल्टर", + "button-mark-read": "सभी को पढ़ा हुआ चिह्नित करें", + "notification-types": "नोटिफ़िकेशन प्रकार", + "notification-type": "नोटिफ़िकेशन प्रकार", + "search-type": "खोज प्रकार", + "any-type": "कोई भी प्रकार" + }, + "alarm-count": { + "alarm-count-card-style": "अलार्म काउंट कार्ड शैली" + }, + "entity-count": { + "entity-count-card-style": "एंटिटी काउंट कार्ड शैली" + }, + "count": { + "layout": "लेआउट", + "layout-column": "कॉलम", + "layout-row": "पंक्ति", + "label": "लेबल", + "icon": "आइकन", + "icon-background": "आइकन पृष्ठभूमि", + "value": "मान", + "chevron": "चेवरॉन", + "auto-scale": "ऑटो स्केल" + }, + "table": { + "common-table-settings": "सामान्य टेबल सेटिंग्स", + "enable-search": "खोज सक्षम करें", + "enable-sticky-header": "हेडर हमेशा दिखाएँ", + "enable-sticky-action": "क्रियाओं वाला कॉलम हमेशा दिखाएँ", + "hidden-cell-button-display-mode": "छिपे हुए सेल बटन क्रियाओं का प्रदर्शन मोड", + "show-empty-space-hidden-action": "छिपे हुए सेल बटन क्रिया की जगह खाली स्थान दिखाएँ", + "dont-reserve-space-hidden-action": "छिपे हुए एक्शन बटनों के लिए स्थान आरक्षित न करें", + "display-timestamp": "टाइमस्टैम्प", + "display-pagination": "पेजिनेशन दिखाएँ", + "default-page-size": "डिफ़ॉल्ट पृष्ठ आकार", + "page-step-settings": "पृष्ठ स्टेप सेटिंग्स", + "page-step-count": "स्टेप की संख्या", + "page-step-increment": "स्टेप वृद्धि", + "page-step-count-format-message": "मान 1 से 100 की सीमा में पूर्णांक होना चाहिए।", + "page-step-increment-format-message": "1 या उससे अधिक का पूर्णांक मान होना चाहिए।", + "use-entity-label-tab-name": "टैब नाम में एंटिटी लेबल का उपयोग करें", + "hide-empty-lines": "खाली पंक्तियाँ छिपाएँ", + "row-style": "पंक्ति शैली", + "use-row-style-function": "पंक्ति शैली फ़ंक्शन का उपयोग करें", + "row-style-function": "पंक्ति शैली फ़ंक्शन", + "cell-style": "सेल शैली", + "use-cell-style-function": "सेल शैली फ़ंक्शन का उपयोग करें", + "cell-style-function": "सेल शैली फ़ंक्शन", + "cell-content": "सेल सामग्री", + "use-cell-content-function": "सेल सामग्री फ़ंक्शन का उपयोग करें", + "cell-content-function": "सेल सामग्री फ़ंक्शन", + "show-latest-data-column": "नवीनतम डेटा कॉलम दिखाएँ", + "latest-data-column-order": "नवीनतम डेटा कॉलम क्रम", + "entities-table-title": "एंटिटी टेबल शीर्षक", + "enable-select-column-display": "दिखाने के लिए कॉलम चुनना सक्षम करें", + "display-entity-name": "एंटिटी नाम कॉलम दिखाएँ", + "entity-name-column-title": "एंटिटी नाम कॉलम शीर्षक", + "display-entity-label": "एंटिटी लेबल कॉलम दिखाएँ", + "entity-label-column-title": "एंटिटी लेबल कॉलम शीर्षक", + "display-entity-type": "एंटिटी प्रकार कॉलम दिखाएँ", + "default-sort-order": "डिफ़ॉल्ट क्रमबद्धता क्रम", + "custom-title": "कस्टम हेडर शीर्षक", + "column-width": "कॉलम चौड़ाई (px या %)", + "default-column-visibility": "डिफ़ॉल्ट कॉलम दृश्यता", + "column-visibility-visible": "दृश्यमान", + "column-visibility-hidden": "छिपा हुआ", + "column-visibility-hidden-mobile": "मोबाइल मोड में छिपा हुआ", + "column-selection-to-display": "'प्रदर्शित करने के लिए कॉलम' में कॉलम चयन", + "column-selection-to-display-enabled": "सक्षम", + "column-selection-to-display-disabled": "अक्षम", + "alarms-table-title": "अलार्म टेबल शीर्षक", + "enable-alarms-selection": "अलार्म चयन सक्षम करें", + "enable-alarms-search": "अलार्म खोज सक्षम करें", + "enable-alarm-filter": "अलार्म फ़िल्टर सक्षम करें", + "display-alarm-details": "अलार्म विवरण दिखाएँ", + "allow-alarms-ack": "अलार्म की पुष्टि की अनुमति दें", + "allow-alarms-clear": "अलार्म साफ़ करने की अनुमति दें", + "display-alarm-activity": "अलार्म गतिविधि दिखाएँ", + "allow-alarms-assign": "अलार्म असाइन करने की अनुमति दें", + "columns": "कॉलम", + "column-settings": "कॉलम सेटिंग्स", + "remove-column": "कॉलम हटाएँ", + "add-column": "कॉलम जोड़ें", + "no-columns": "कोई कॉलम कॉन्फ़िगर नहीं", + "columns-to-display": "दिखाने के लिए कॉलम", + "table-header": "टेबल हेडर", + "header-buttons": "हेडर बटन", + "table-buttons": "टेबल बटन", + "pagination": "पृष्ठांकन", + "rows": "पंक्तियाँ", + "timeseries-column-error": "कम से कम एक टाइम सीरीज़ कॉलम निर्दिष्ट होना चाहिए", + "alarm-column-error": "कम से कम एक अलार्म कॉलम निर्दिष्ट होना चाहिए", + "table-tabs": "टेबल टैब्स", + "show-cell-actions-menu-mobile": "मोबाइल मोड में सेल एक्शन ड्रॉपडाउन मेनू दिखाएँ", + "disable-sorting": "सॉर्टिंग अक्षम करें" + }, + "latest-chart": { + "total": "कुल", + "auto-scale": "ऑटो स्केल", + "clockwise-layout": "क्लॉकवाइज़ लेआउट", + "sort-series": "लेबल के अनुसार सीरीज़ को सॉर्ट करें", + "tooltip-value-type-absolute": "एब्सोल्यूट", + "tooltip-value-type-percentage": "प्रतिशत" + }, + "pie-chart": { + "pie-chart-appearance": "पाई चार्ट उपस्थिति", + "label": "लेबल", + "border": "बॉर्डर", + "radius": "रेडियस", + "pie-chart-card-style": "पाई चार्ट कार्ड स्टाइल" + }, + "radar-chart": { + "radar-appearance": "रडार उपस्थिति", + "shape": "आकार", + "shape-polygon": "बहुभुज", + "shape-circle": "वृत्त", + "color": "रंग", + "line": "लाइन", + "points": "पॉइंट्स", + "points-label": "पॉइंट्स लेबल", + "radar-axis": "रडार अक्ष", + "axis-label": "अक्ष लेबल", + "ticks-label": "टिक लेबल", + "radar-chart-style": "रडार चार्ट स्टाइल", + "max-axes-scaling": "अधिकतम अक्ष स्केलिंग", + "max-axes-scaling-hint": "चुनें कि प्रत्येक रडार अक्ष का अपना अधिकतम मान हो (Separate) या विजेट डेटासेट के आधार पर सभी अक्ष सबसे बड़े मान को साझा करें (Common)।", + "separate": "अलग-अलग", + "common": "सामान्य" + }, + "time-series-chart": { + "chart": "चार्ट", + "chart-style": "चार्ट स्टाइल", + "data-zoom": "डेटा ज़ूम", + "stack-mode": "स्टैक मोड", + "stack-mode-hint": "चार्ट पर सीरीज़ को स्टैक करता है। समान यूनिट वाली सीरीज़ एक-दूसरे के ऊपर रखी जाएँगी।", + "axes": "अक्ष", + "y-axes": "Y अक्ष", + "line-type": "लाइन प्रकार", + "line-width": "लाइन चौड़ाई", + "type-line": "लाइन", + "type-bar": "बार", + "type-point": "प्वाइंट", + "no-aggregation-bar-width-strategy": "ग़ैर-एग्रीगेटेड डेटा के लिए बार चौड़ाई रणनीति", + "no-aggregation-bar-width-strategy-group": "ग्रुप", + "no-aggregation-bar-width-strategy-separate": "अलग-अलग", + "bar-group-width": "बार ग्रुप चौड़ाई", + "bar-width": "बार चौड़ाई", + "bar-width-relative": "टाइम विंडो का प्रतिशत", + "bar-width-absolute": "एब्सोल्यूट (ms)", + "comparison": { + "comparison": "तुलना", + "comparison-hint": "तुलना केवल ऐतिहासिक डेटा के साथ काम करती है!", + "show": "दिखाएँ", + "settings": "तुलना सेटिंग्स", + "show-values-for-comparison": "तुलना के लिए ऐतिहासिक डेटा दिखाएँ", + "comparison-values-label": "तुलना की कुंजी लेबल", + "comparison-values-label-auto": "ऑटो", + "comparison-data-color": "तुलना डेटा रंग" + }, + "threshold": { + "thresholds": "थ्रेशहोल्ड्स", + "source": "स्रोत", + "key-value": "कुंजी / मान", + "no-thresholds": "कोई थ्रेशहोल्ड कॉन्फ़िगर नहीं है", + "add-threshold": "थ्रेशहोल्ड जोड़ें", + "type-constant": "कॉनस्टेंट", + "type-latest-key": "कुंजी", + "type-entity": "एंटिटी", + "threshold-settings": "थ्रेशहोल्ड सेटिंग्स", + "remove-threshold": "थ्रेशहोल्ड हटाएँ", + "threshold-value-required": "थ्रेशहोल्ड मान आवश्यक है।", + "key-required": "कुंजी आवश्यक है।", + "entity-key-required": "एंटिटी कुंजी आवश्यक है।", + "line-appearance": "लाइन स्वरूप", + "line-color": "लाइन रंग", + "start-symbol": "स्टार्ट प्रतीक", + "end-symbol": "एंड प्रतीक", + "symbol-size": "आकार", + "label": "लेबल", + "label-position-start": "आरंभ", + "label-position-middle": "मध्य", + "label-position-end": "अंत", + "label-position-inside-start": "अंदर आरंभ", + "label-position-inside-start-top": "अंदर आरंभ शीर्ष", + "label-position-inside-start-bottom": "अंदर आरंभ नीचे", + "label-position-inside-middle": "अंदर मध्य", + "label-position-inside-middle-top": "अंदर मध्य शीर्ष", + "label-position-inside-middle-bottom": "अंदर मध्य नीचे", + "label-position-inside-end": "अंदर अंत", + "label-position-inside-end-top": "अंदर अंत शीर्ष", + "label-position-inside-end-bottom": "अंदर अंत नीचे", + "label-background": "लेबल बैकग्राउंड" + }, + "state": { + "states": "स्टेट्स", + "label": "लेबल", + "ticks-value": "टिक्स मान", + "source": "स्रोत", + "value-range": "मान / रेंज", + "no-states": "कोई स्टेट कॉन्फ़िगर नहीं है", + "add-state": "स्टेट जोड़ें", + "type-constant": "कॉनस्टेंट", + "type-range": "रेंज", + "from": "से", + "to": "तक", + "remove-state": "स्टेट हटाएँ" + }, + "grid": { + "grid": "ग्रिड", + "background-color": "बैकग्राउंड रंग", + "border": "बॉर्डर" + }, + "axis": { + "axes": "धुरियाँ", + "x-axis": "X धुरी", + "y-axis": "Y धुरी", + "y-axis-settings": "Y धुरी सेटिंग्स", + "comparison-x-axis-settings": "तुलना X धुरी सेटिंग्स", + "remove-y-axis": "Y धुरी हटाएँ", + "id": "आईडी", + "label": "लेबल", + "position": "स्थिति", + "position-left": "बाएँ", + "position-right": "दाएँ", + "position-top": "ऊपर", + "position-bottom": "नीचे", + "tick-labels": "टिक लेबल", + "ticks-formatter-function": "टिक्स फ़ॉर्मेटर फ़ंक्शन", + "ticks-generator-function": "टिक्स जनरेटर फ़ंक्शन", + "show-ticks": "टिक्स दिखाएँ", + "show-line": "लाइन दिखाएँ", + "show-split-lines": "स्प्लिट लाइन्स दिखाएँ", + "show-split-lines-x-axis-hint": "यदि सक्षम किया गया, तो चार्ट पर वर्टिकल लाइन्स दिखेंगी।", + "show-split-lines-y-axis-hint": "यदि सक्षम किया गया, तो चार्ट पर हॉरिज़ॉन्टल लाइन्स दिखेंगी।", + "ticks-interval": "टिक्स अंतराल", + "ticks-interval-hint": "धुरी के लिए विभाजन अंतराल को बाध्यतापूर्वक सेट करें।", + "split-number": "विभाजन संख्या", + "split-number-hint": "धुरी को जितने खंडों में विभाजित किया जाएगा उनकी संख्या।", + "min": "न्यूनतम", + "max": "अधिकतम", + "show": "दिखाएँ", + "add-y-axis": "Y धुरी जोड़ें" + }, + "series": { + "legend-settings": "लीजेंड सेटिंग्स", + "show-in-legend": "लीजेंड में दिखाएँ", + "show-in-legend-hint": "लीजेंड में सीरीज़ नाम और डेटा दिखाएँ।", + "hidden-by-default": "डिफ़ॉल्ट रूप से छिपा हुआ", + "hidden-by-default-hint": "सीरीज़ को डिफ़ॉल्ट रूप से लीजेंड में छिपाएँ।", + "series-type": "सीरीज़ प्रकार", + "type": "प्रकार", + "type-line": "लाइन", + "type-bar": "बार", + "line": { + "line": "लाइन", + "show-line": "लाइन दिखाएँ", + "step-line": "स्टेप लाइन", + "step-type-start": "शुरुआत", + "step-type-middle": "मध्य", + "step-type-end": "अंत", + "smooth-line": "स्मूथ लाइन" + }, + "point": { + "points": "पॉइंट्स", + "show-points": "पॉइंट्स दिखाएँ", + "point-label": "पॉइंट लेबल", + "point-label-hint": "सीरीज़ पॉइंट के ऊपर मान वाला लेबल दिखाएँ।", + "point-label-background": "पॉइंट लेबल बैकग्राउंड", + "point-shape": "पॉइंट आकार", + "point-size": "पॉइंट आकार" + } + } + }, + "wind-speed-direction": { + "layout": "लेआउट", + "layout-default": "डिफ़ॉल्ट", + "layout-advanced": "एडवांस्ड", + "layout-simplified": "सरल", + "values": "मान", + "wind-direction": "वायु दिशा", + "center-value": "केंद्रीय मान", + "icon": "आइकन", + "arrow": "तीर", + "ticks": "टिक", + "labels-type": "लेबल प्रकार", + "directional-names": "दिशात्मक नाम", + "degrees": "डिग्री", + "major-ticks": "मुख्य टिक", + "minor-ticks": "माइनर टिक", + "wind-speed-direction-card-style": "वायु गति और दिशा कार्ड शैली", + "ticks-color": "टिक का रंग", + "ticks-labels-type": "टिक लेबल प्रकार", + "arrow-color": "तीर का रंग" + }, + "value-source": { + "value-source": "मान स्रोत", + "predefined-value": "स्थिर", + "entity-attribute": "एंटिटी विशेषता", + "value": "मान", + "value-required": "मान आवश्यक है।", + "key-required": "की आवश्यक है।", + "entity-key-required": "एंटिटी की आवश्यक है।", + "source-entity-alias": "स्रोत एंटिटी उपनाम", + "source-entity-attribute": "स्रोत एंटिटी विशेषता", + "type-constant": "स्थिर", + "type-latest-key": "की", + "type-entity": "एंटिटी" + }, + "rpc-state": { + "initial-state": "प्रारंभिक स्थिति", + "initial-state-hint": "कम्पोनेंट की प्रारंभिक स्थिति (On/Off) प्राप्त करने की क्रिया।", + "disabled-state": "अक्षम स्थिति", + "disabled-state-hint": "वह शर्त कॉन्फ़िगर करें जिसके तहत कम्पोनेंट अक्षम होगा।", + "turn-on": "'On' करें", + "turn-on-hint": "जब स्लाइडर 'On' पर स्विच किया जाता है तब ट्रिगर होने वाली क्रिया।", + "turn-off": "'Off' करें", + "turn-off-hint": "जब स्लाइडर 'Off' पर स्विच किया जाता है तब ट्रिगर होने वाली क्रिया।", + "on": "On", + "off": "Off", + "disabled": "Disabled" + }, + "value-action": { + "do-nothing": "कुछ न करें", + "execute-rpc": "RPC निष्पादित करें", + "get-attribute": "विशेषता प्राप्त करें", + "set-attribute": "विशेषता सेट करें", + "get-time-series": "टाइम सीरीज़ प्राप्त करें", + "get-alarm-status": "अलार्म स्थिति प्राप्त करें", + "get-dashboard-state": "डैशबोर्ड स्टेट ID प्राप्त करें", + "get-dashboard-state-object": "डैशबोर्ड स्टेट ऑब्जेक्ट प्राप्त करें", + "add-time-series": "टाइम सीरीज़ जोड़ें", + "execute-rpc-text": "RPC मेथड '{{methodName}}' निष्पादित करें", + "get-time-series-text": "टाइम सीरीज़ '{{key}}' का उपयोग करें", + "get-attribute-text": "विशेषता '{{key}}' का उपयोग करें", + "get-alarm-status-text": "अलार्म स्थिति का उपयोग करें", + "get-dashboard-state-text": "डैशबोर्ड स्टेट का उपयोग करें", + "get-dashboard-state-object-text": "डैशबोर्ड स्टेट ऑब्जेक्ट का उपयोग करें", + "when-dashboard-state-is-text": "जब डैशबोर्ड स्टेट ID '{{state}}' हो", + "when-dashboard-state-function-is-text": "जब f(डैशबोर्ड स्टेट ID) '{{state}}' हो", + "when-dashboard-state-object-function-is-text": "जब f(डैशबोर्ड स्टेट ऑब्जेक्ट) '{{state}}' हो", + "set-attribute-to-value-text": "'{{key}}' विशेषता को सेट करें: {{value}}", + "add-time-series-value-text": "'{{key}}' टाइम सीरीज़ मान जोड़ें: {{value}}", + "set-attribute-text": "'{{key}}' विशेषता सेट करें", + "add-time-series-text": "'{{key}}' टाइम सीरीज़ जोड़ें", + "action": "क्रिया", + "value": "मान", + "init-value-hint": "वह मान जो तब तक सेट रहेगा जब तक डिवाइस डेटा नहीं भेजता।", + "method": "मेथड", + "method-name-required": "मेथड नाम आवश्यक है।", + "request-timeout-ms": "RPC अनुरोध टाइमआउट (ms)", + "request-timeout-required": "अनुरोध टाइमआउट आवश्यक है।", + "min-request-timeout-error": "अनुरोध टाइमआउट मान 5000 ms (5 सेकंड) या उससे अधिक होना चाहिए।", + "request-persistent": "स्थायी RPC अनुरोध", + "persistent-polling-interval": "स्थायी पोलिंग अंतराल (ms)", + "persistent-polling-interval-hint": "स्थायी RPC प्रतिक्रिया प्राप्त करने के लिए पोलिंग अंतराल (ms)", + "persistent-polling-interval-required": "स्थायी पोलिंग अंतराल आवश्यक है।", + "min-persistent-polling-interval-error": "स्थायी पोलिंग अंतराल मान 1000 ms (1 सेकंड) या उससे अधिक होना चाहिए।", + "attribute-scope": "विशेषता स्कोप", + "attribute-key": "विशेषता की", + "attribute-key-required": "विशेषता की आवश्यक है।", + "time-series-key": "टाइम सीरीज़ की", + "time-series-key-required": "टाइम सीरीज़ की आवश्यक है।", + "action-result-converter": "क्रिया परिणाम कन्वर्टर", + "converter-none": "कोई नहीं", + "converter-function": "फ़ंक्शन", + "converter-constant": "स्थिर", + "converter-value": "मान", + "parse-value-function": "मान पार्स करने का फ़ंक्शन", + "state-when-result-is": "'{{state}}' जब परिणाम हो", + "parameters": "पैरामीटर्स", + "convert-value-function": "मान कन्वर्ट करने का फ़ंक्शन", + "error": { + "target-entity-is-not-set": "लक्ष्य एंटिटी सेट नहीं है!", + "failed-to-perform-action": "{{ actionLabel }} क्रिया निष्पादित करने में विफल।", + "invalid-attribute-scope": "{{scope}} विशेषता स्कोप {{entityType}} एंटिटी द्वारा समर्थित नहीं है।" + } + }, + "widget-font": { + "font-settings": "फ़ॉन्ट सेटिंग्स", + "font-family": "फ़ॉन्ट परिवार", + "size": "आकार", + "relative-font-size": "सापेक्ष फ़ॉन्ट आकार (प्रतिशत)", + "font-style": "शैली", + "font-style-normal": "सामान्य", + "font-style-italic": "इटैलिक", + "font-style-oblique": "ओब्लिक", + "font-weight": "वज़न", + "font-weight-normal": "सामान्य", + "font-weight-bold": "बोल्ड", + "font-weight-bolder": "अधिक बोल्ड", + "font-weight-lighter": "हल्का", + "color": "रंग", + "shadow-color": "छाया रंग", + "preview": "पूर्वावलोकन", + "line-height": "लाइन ऊँचाई", + "auto": "ऑटो" + }, + "home": { + "no-data-available": "कोई डेटा उपलब्ध नहीं है" + }, + "system-info": { + "cpu": "CPU", + "ram": "RAM", + "disk": "डिस्क", + "cpu-warning-text": "CPU उपयोग बहुत अधिक है। सिस्टम विफलता से बचने के लिए सिस्टम प्रदर्शन को ऑप्टिमाइज़ करें।", + "cpu-critical-text": "CPU उपयोग अत्यधिक उच्च है। सिस्टम विफलता से बचने के लिए सिस्टम प्रदर्शन को ऑप्टिमाइज़ करें।", + "ram-warning-text": "RAM का रिज़र्व कम हो रहा है। सिस्टम विफलता से बचने के लिए प्रदर्शन को ऑप्टिमाइज़ करें या RAM बढ़ाएँ।", + "ram-critical-text": "RAM का रिज़र्व बेहद कम है। सिस्टम विफलता से बचने के लिए प्रदर्शन को ऑप्टिमाइज़ करें या RAM बढ़ाएँ।", + "disk-warning-text": "डिस्क स्पेस कम हो रहा है। डेटा हानि से बचने के लिए डिस्क स्पेस खाली करें या बढ़ाएँ।", + "disk-critical-text": "डिस्क स्पेस अत्यधिक कम है। डेटा हानि से बचने के लिए डिस्क स्पेस खाली करें या बढ़ाएँ।" + }, + "cluster-info": { + "service-id": "सर्विस ID", + "service-type": "सर्विस प्रकार", + "no-data": "कोई डेटा नहीं" + }, + "transport-messages": { + "title": "ट्रांसपोर्ट संदेश", + "info": "सभी संदेश जो डिवाइस से आए हैं" + }, + "activity": { + "title": "गतिविधि" + }, + "documentation": { + "title": "प्रलेखन", + "add-link": "लिंक जोड़ें", + "add-link-title": "प्रलेखन लिंक जोड़ें", + "name": "नाम", + "name-required": "नाम आवश्यक है।", + "link": "लिंक", + "link-required": "लिंक आवश्यक है।", + "columns": "कॉलम" + }, + "quick-links": { + "title": "त्वरित लिंक", + "add-link": "लिंक जोड़ें", + "add-link-title": "त्वरित लिंक जोड़ें", + "quick-link": "त्वरित लिंक", + "quick-link-required": "त्वरित लिंक आवश्यक है।", + "no-links-matching": "'{{name}}' से मिलते लिंक नहीं मिले।", + "columns": "कॉलम" + }, + "recent-dashboards": { + "title": "डैशबोर्ड्स", + "last": "अंतिम बार देखा गया", + "starred": "स्टार्ड", + "name": "नाम", + "last-viewed": "अंतिम बार देखा गया", + "no-last-viewed-dashboards": "अभी तक कोई डैशबोर्ड अंतिम बार देखा नहीं गया" + }, + "configured-features": { + "title": "कन्फ़िगर की गई फ़ीचर्स", + "info": "ऐसी फ़ीचर्स की स्थिति जिन्हें कॉन्फ़िगरेशन की आवश्यकता है", + "email-feature": "ईमेल", + "sms-feature": "SMS", + "slack-feature": "Slack", + "oauth2-feature": "OAuth 2", + "2fa-feature": "2FA", + "feature-configured": "फ़ीचर कन्फ़िगर है।\nसेटअप करने के लिए क्लिक करें", + "feature-not-configured": "फ़ीचर कन्फ़िगर नहीं है।\nसेटअप करने के लिए क्लिक करें" + }, + "version-info": { + "title": "संस्करण", + "contact-us": "हमसे संपर्क करें", + "current-version": "वर्तमान संस्करण", + "current": "वर्तमान", + "available-version": "उपलब्ध संस्करण", + "available": "उपलब्ध", + "upgrade": "अपग्रेड", + "version-is-up-to-date": "संस्करण नवीनतम है" + }, + "usage-info": { + "title": "उपयोग", + "entities": "एंटिटीज़", + "api-calls": "API कॉल्स" + }, + "functions": { + "title": "फ़ंक्शंस", + "pe-feature-tooltip": "केवल ThingsBoard\nProfessional Edition में", + "switch-to-pe": "PE पर स्विच करें", + "alarms": "अलार्म", + "dashboards": "डैशबोर्ड्स", + "entities-and-relations": "एंटिटीज़ और रिलेशन्स", + "profiles": "प्रोफ़ाइल्स", + "advanced-features": "एडवांस्ड फ़ीचर्स", + "notification-center": "अधिसूचना केंद्र", + "api-usage": "API उपयोग", + "customers": "कस्टमर", + "customers-hierarchy": "कस्टमर पदानुक्रम", + "roles-and-permissions": "रोल्स और परमिशन्स", + "groups": "ग्रुप्स", + "integrations": "इंटीग्रेशन्स", + "solution-templates": "सॉल्यूशन टेम्पलेट्स", + "scheduler": "शेड्यूलर", + "white-labeling": "व्हाइट लेबलिंग" + }, + "devices": { + "view-docs": "डॉक्स देखें", + "inactive": "निष्क्रिय", + "active": "सक्रिय", + "total": "कुल" + }, + "alarms": { + "critical": "क्रिटिकल", + "assigned-to-me": "मुझे असाइन किए गए", + "total": "कुल" + }, + "getting-started": { + "get-started": "शुरू करें", + "finish": "समाप्त", + "done-welcome-title": "आपका स्वागत है", + "done-welcome-text": "आपने यह बहुत अच्छी तरह किया!", + "sys-admin": { + "step1": { + "title": "टेनेंट और टेनेंट एडमिनिस्ट्रेटर बनाएँ", + "content": "

टेनेंट वह व्यक्ति या संगठन होता है जो डिवाइस और एसेट का मालिक होता है या उनका उत्पादन करता है। टेनेंट के पास कई टेनेंट एडमिनिस्ट्रेटर उपयोगकर्ता, कस्टमर, डिवाइस और एसेट हो सकते हैं।

टेनेंट एडमिनिस्ट्रेटर टेनेंट अकाउंट के भीतर डिवाइस, एसेट, कस्टमर और डैशबोर्ड बना और प्रबंधित कर सकता है।

इसे कैसे करना है, इसकी डॉक्यूमेंटेशन देखें:

", + "how-to-create-tenant": "टेनेंट और टेनेंट एडमिनिस्ट्रेटर कैसे बनाएँ" + }, + "step2": { + "title": "फ़ीचर कॉन्फ़िगर करें: मेल सर्वर", + "content": "

उपयोगकर्ता सक्रियण, पासवर्ड रिकवरी और अलार्म नोटिफिकेशन डिलीवरी के लिए मेल सर्वर कॉन्फ़िगरेशन आवश्यक है।

इसे कैसे करना है, इसकी डॉक्यूमेंटेशन देखें:

", + "how-to-configure-mail-server": "मेल सर्वर कैसे कॉन्फ़िगर करें" + }, + "step3": { + "title": "फ़ीचर कॉन्फ़िगर करें: SMS प्रदाता", + "content": "

SMS प्रदाताओं को कॉन्फ़िगर करें ताकि कस्टमर को अलार्म SMS द्वारा सूचित किया जा सके।

इसे कैसे करना है, इसकी डॉक्यूमेंटेशन देखें:

", + "how-to-configure-sms-provider": "SMS प्रदाता कैसे कॉन्फ़िगर करें" + }, + "step4": { + "title": "फ़ीचर कॉन्फ़िगर करें: व्हाइट लेबलिंग", + "content": "

बिना कोडिंग और बिना सेवा को रीस्टार्ट किए, अपनी कंपनी या प्रोडक्ट का लोगो और रंग योजना आसानी से अनुकूलित करें।

इसे कैसे करना है, इसकी डॉक्यूमेंटेशन देखें:

" + }, + "step5": { + "title": "फ़ीचर कॉन्फ़िगर करें: 2FA", + "content": "

दो-स्तरीय प्रमाणीकरण का उपयोग करके प्लेटफ़ॉर्म अकाउंट्स की सुरक्षा बढ़ाएँ।

इसे कैसे करना है, इसकी डॉक्यूमेंटेशन देखें:

" + }, + "step6": { + "title": "फ़ीचर कॉन्फ़िगर करें: OAuth 2", + "content": "

OAuth 2.0 के माध्यम से सिंगल साइन-ऑन फ़ंक्शन का उपयोग करके टेनेंट और कस्टमर उपयोगकर्ताओं के लिए लॉगिन प्रक्रिया सरल करें।

इसे कैसे करना है, इसकी डॉक्यूमेंटेशन देखें:

" + } + }, + "tenant-admin": { + "step1": { + "title": "डिवाइस बनाएँ", + "content": "

चलिए UI के माध्यम से आपका पहला डिवाइस प्लेटफ़ॉर्म पर प्रोविजन करते हैं। इसे कैसे करना है, इसके लिए डॉक्यूमेंटेशन देखें:

", + "how-to-create-device": "डिवाइस कैसे बनाएँ" + }, + "step2": { + "title": "डिवाइस कनेक्ट करें", + "content-before": "

डिवाइस को कनेक्ट करने के लिए आपको डिवाइस के क्रेडेंशियल्स प्राप्त करने होंगे। इस गाइड के लिए हम डिफ़ॉल्ट ऑटो-जनरेटेड क्रेडेंशियल्स (एक्सेस टोकन) का उपयोग करने की सलाह देते हैं।

  • डिवाइस टेबल पर जाएँ
  • डिवाइस की पंक्ति पर क्लिक करें ताकि डिवाइस विवरण खुल जाए
  • \"एक्सेस टोकन कॉपी करें\" बटन दबाएँ

HTTP के माध्यम से डेटा प्रकाशित करने के लिए इन सरल commands का उपयोग करें। ध्यान रखें कि $ACCESS_TOKEN को अपने डिवाइस के एक्सेस टोकन से बदलें:

", + "ubuntu": { + "install-curl": "Ubuntu के लिए cURL इंस्टॉल करें:" + }, + "macos": { + "install-curl": "MacOS के लिए cURL इंस्टॉल करें:" + }, + "windows": { + "install-curl": "Windows 10 b17063 से शुरू होकर, cURL डिफ़ॉल्ट रूप से उपलब्ध है।" + }, + "replace-access-token": "$ACCESS_TOKEN को अपने डिवाइस के टोकन से बदलें:", + "content-after": "

आप MQTT, CoAP आदि जैसे अन्य प्रोटोकॉल भी उपयोग कर सकते हैं।

इसे कैसे करना है, इसके लिए डॉक्यूमेंटेशन देखें:

", + "how-to-connect-device": "डिवाइस कैसे कनेक्ट करें" + }, + "step3": { + "title": "डैशबोर्ड बनाएँ", + "content": "

एंटिटीज़ जैसे एसेट, डिवाइस आदि से आने वाले डेटा को विज़ुअलाइज़ करने के लिए एक डैशबोर्ड बनाएँ।

इसे कैसे करना है, इसके लिए डॉक्यूमेंटेशन देखें:

", + "how-to-create-dashboard": "डैशबोर्ड कैसे बनाएँ" + }, + "step4": { + "title": "अलार्म नियम कॉन्फ़िगर करें", + "alarm-rules": "अलार्म नियम", + "content": "

चलिए तब एक अलार्म ट्रिगर करते हैं जब तापमान 25°C तक पहुँच जाए। इसे कैसे करना है, इसके लिए डॉक्यूमेंटेशन देखें:

", + "how-to-configure-alarm-rules": "अलार्म नियम कैसे कॉन्फ़िगर करें" + }, + "step5": { + "title": "अलार्म बनाएँ", + "content-before": "

अलार्म ट्रिगर करने के लिए 26°C या इससे अधिक का नया टेलीमेट्री मान भेजें।

", + "replace-access-token": "$ACCESS_TOKEN को अपने डिवाइस के टोकन से बदलें:", + "content-after": "

इसे कैसे करना है, इसके लिए डॉक्यूमेंटेशन देखें:

", + "how-to-create-alarm": "अलार्म कैसे बनाएँ" + }, + "step6": { + "title": "कस्टमर बनाएँ और डैशबोर्ड साझा करें", + "content": "

एंड-यूज़र डैशबोर्ड बनाए जाने पर, कस्टमर उपयोगकर्ता केवल अपने डिवाइस देख सकेगा, और अन्य कस्टमर का डेटा छुपा रहेगा।

इसे कैसे करना है, इसके लिए डॉक्यूमेंटेशन देखें:

" + } + } + } + }, + "icon": { + "icon": "आइकन", + "icons": "आइकन्स", + "select-icon": "आइकन चुनें", + "material-icons": "मटेरियल आइकन्स", + "show-all": "सभी आइकन्स दिखाएँ", + "search-icon": "आइकन खोजें", + "no-icons-found": "'{{iconSearch}}' के लिए कोई आइकन नहीं मिला" + }, + "phone-input": { + "phone-input-label": "फ़ोन नंबर", + "phone-input-required": "फ़ोन नंबर आवश्यक है", + "phone-input-validation": "फ़ोन नंबर अमान्य है या संभव नहीं है", + "phone-input-pattern": "अमान्य फ़ोन नंबर। यह E.164 फ़ॉर्मेट में होना चाहिए, उदाहरण: {{phoneNumber}}", + "phone-input-hint": "E.164 फ़ॉर्मेट में फ़ोन नंबर, उदाहरण: {{phoneNumber}}" + }, + "custom": { + "widget-action": { + "action-cell-button": "एक्शन सेल बटन", + "row-click": "पंक्ति पर क्लिक", + "cell-click": "सेल पर क्लिक", + "polygon-click": "पॉलीगॉन पर क्लिक", + "marker-click": "मार्कर पर क्लिक", + "circle-click": "सर्कल पर क्लिक", + "tooltip-tag-action": "टूलटिप टैग एक्शन", + "node-selected": "नोड चयनित होने पर", + "element-click": "HTML एलिमेंट पर क्लिक", + "pie-slice-click": "स्लाइस पर क्लिक", + "row-double-click": "पंक्ति पर डबल क्लिक", + "cell-double-click": "सेल पर डबल क्लिक", + "card-click": "कार्ड पर क्लिक", + "click": "क्लिक पर" + } + }, + "paginator": { + "items-per-page": "प्रति पृष्ठ आइटम:", + "first-page-label": "पहला पृष्ठ", + "last-page-label": "अंतिम पृष्ठ", + "next-page-label": "अगला पृष्ठ", + "previous-page-label": "पिछला पृष्ठ", + "items-per-page-separator": "में से" + }, + "language": { + "language": "भाषा" + } +} \ No newline at end of file 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 538f8b8c74..ab07b5ec48 100644 --- a/ui-ngx/src/assets/locale/locale.constant-it_IT.json +++ b/ui-ngx/src/assets/locale/locale.constant-it_IT.json @@ -78,6 +78,7 @@ "show-more": "Mostra di più", "dont-show-again": "Non mostrare più", "see-documentation": "Vedi documentazione", + "see-debug-events": "Vedi eventi di debug", "clear": "Pulisci", "upload": "Carica", "delete-anyway": "Elimina comunque", @@ -485,6 +486,7 @@ "2fa": { "2fa": "Autenticazione a due fattori", "available-providers": "Provider disponibili", + "available-providers-required": "Deve essere configurato almeno un provider 2FA.", "issuer-name": "Nome dell'emittente", "issuer-name-required": "Il nome dell'emittente è obbligatorio.", "max-verification-failures-before-user-lockout": "Numero massimo di verifiche fallite prima del blocco dell'utente", @@ -513,7 +515,9 @@ "verification-message-template-required": "Il template del messaggio di verifica è obbligatorio.", "within-time": "Entro il tempo (sec)", "within-time-pattern": "Il tempo deve essere un numero intero positivo.", - "within-time-required": "Il tempo è obbligatorio." + "within-time-required": "Il tempo è obbligatorio.", + "force-2fa": "Forza l'autenticazione a due fattori", + "enforce-for": "Forza per" }, "jwt": { "security-settings": "Impostazioni di sicurezza JWT", @@ -545,16 +549,11 @@ "slack-settings": "Impostazioni di Slack", "mobile-settings": "Impostazioni mobile", "firebase-service-account-file": "File JSON delle credenziali dell'account di servizio Firebase", - "select-firebase-service-account-file": "Trascina e rilascia il file delle credenziali dell'account di servizio Firebase oppure", - "trendz": "Trendz", - "trendz-settings": "Impostazioni di Trendz", - "trendz-url": "URL di Trendz", - "trendz-url-required": "L'URL di Trendz è obbligatorio", - "trendz-api-key": "Chiave API di Trendz", - "trendz-enable": "Abilita Trendz" + "select-firebase-service-account-file": "Trascina e rilascia il file delle credenziali dell'account di servizio Firebase oppure" }, "alarm": { "alarm": "Allarme", + "alarm-list": "Elenco allarmi", "alarms": "Allarmi", "all-alarms": "Tutti gli allarmi", "select-alarm": "Seleziona allarme", @@ -655,7 +654,16 @@ "alarm-type": "Tipo di allarme", "enter-alarm-type": "Inserisci tipo di allarme", "no-alarm-types-matching": "Nessun tipo di allarme corrispondente a '{{entitySubtype}}' trovato.", - "alarm-type-list-empty": "Nessun tipo di allarme selezionato." + "alarm-type-list-empty": "Nessun tipo di allarme selezionato.", + "system-comments": { + "acked-by-user": "L'allarme è stato confermato dall'utente {{userName}}", + "cleared-by-user": "L'allarme è stato ripristinato dall'utente {{userName}}", + "assigned-to-user": "L'allarme è stato assegnato dall'utente {{userName}} all'utente {{assigneeName}}", + "unassigned-to-user": "L'allarme è stato rimosso dall'utente {{userName}}", + "unassigned-from-deleted-user": "L'allarme è stato rimosso perché l'utente {{userName}} è stato eliminato", + "comment-deleted": "L'utente {{userName}} ha eliminato il suo commento", + "severity-changed": "La gravità dell'allarme è stata aggiornata da {{oldSeverity}} a {{newSeverity}}" + } }, "alarm-activity": { "add": "Aggiungi un commento...", @@ -760,6 +768,7 @@ "name-max-length": "Il nome deve essere inferiore a 256 caratteri", "label-max-length": "L'etichetta deve essere inferiore a 256 caratteri", "description": "Descrizione", + "description-required": "La descrizione è obbligatoria.", "type": "Tipo", "type-required": "Il tipo è obbligatorio.", "details": "Dettagli", @@ -873,6 +882,9 @@ "alarms-created-monthly-activity": "Attività mensile di allarmi creati", "data-points": "Punti dati", "data-points-storage-days": "Giorni di conservazione dei punti dati", + "data-points-storage-days-hourly-activity": "Attività oraria dei giorni di conservazione dei punti dati", + "data-points-storage-days-daily-activity": "Attività giornaliera dei giorni di conservazione dei punti dati", + "data-points-storage-days-monthly-activity": "Attività mensile dei giorni di conservazione dei punti dati", "device-api": "API dispositivo", "email": "Email", "email-messages": "Messaggi email", @@ -906,6 +918,7 @@ "rule-node": "Nodo regola", "sms": "SMS", "sms-messages": "Messaggi SMS", + "sms-messages-hourly-activity": "Attività oraria dei messaggi SMS", "sms-messages-daily-activity": "Attività giornaliera messaggi SMS", "sms-messages-monthly-activity": "Attività mensile messaggi SMS", "successful": "${entityName} riusciti", @@ -915,13 +928,40 @@ "telemetry-persistence-hourly-activity": "Attività oraria persistenza telemetria", "telemetry-persistence-monthly-activity": "Attività mensile persistenza telemetria", "transport": "Trasporto", + "transport-msg-hourly-activity": "Transportberichten: uurlijkse activiteit", + "transport-msg-daily-activity": "Transportberichten: dagelijkse activiteit", + "transport-msg-monthly-activity": "Transportberichten: maandelijkse activiteit", "transport-daily-activity": "Attività giornaliera del trasporto", "transport-data-points": "Punti dati del trasporto", - "transport-hourly-activity": "Attività oraria del trasporto", - "transport-messages": "Messaggi del trasporto", - "transport-monthly-activity": "Attività mensile del trasporto", + "transport-data-points-hourly-activity": "Attività oraria dei punti dati di trasporto", + "transport-data-points-daily-activity": "Attività giornaliera dei punti dati di trasporto", + "transport-data-points-monthly-activity": "Attività mensile dei punti dati di trasporto", "view-details": "Visualizza dettagli", - "view-statistics": "Visualizza statistiche" + "view-statistics": "Visualizza statistiche", + "transport-messages": "Messaggi di trasporto", + "transport-messages-hourly-activity": "Attività oraria dei messaggi di trasporto", + "transport-data-point-hourly-activity": "Attività oraria del punto dati di trasporto", + "javascript-function-executions": "Esecuzioni delle funzioni JavaScript", + "javascript-function-executions-hourly-activity": "Attività oraria delle esecuzioni delle funzioni JavaScript", + "javascript-function-executions-daily-activity": "Attività giornaliera delle esecuzioni delle funzioni JavaScript", + "javascript-function-executions-monthly-activity": "Attività mensile delle esecuzioni delle funzioni JavaScript", + "tbel-function-executions": "Esecuzioni delle funzioni TBEL", + "tbel-function-executions-hourly-activity": "Attività oraria delle esecuzioni delle funzioni TBEL", + "tbel-function-executions-daily-activity": "Attività giornaliera delle esecuzioni delle funzioni TBEL", + "tbel-function-executions-monthly-activity": "Attività mensile delle esecuzioni delle funzioni TBEL", + "created-reports": "Report creati", + "created-reports-hourly-activity": "Attività oraria dei report creati", + "created-reports-daily-activity": "Attività giornaliera dei report creati", + "created-reports-monthly-activity": "Attività mensile dei report creati", + "emails": "Email", + "emails-hourly-activity": "Attività oraria delle email", + "emails-daily-activity": "Attività giornaliera delle email", + "emails-monthly-activity": "Attività mensile delle email", + "status": { + "enabled": "Abilitato", + "disabled": "Disabilitato", + "warning": "Avviso" + } }, "api-limit": { "cassandra-write-queries-core": "Query di scrittura Cassandra tramite Rest API", @@ -946,6 +986,40 @@ "edge-uplink-messages": "Messaggi uplink Edge", "edge-uplink-messages-per-edge": "Messaggi uplink Edge per nodo Edge" }, + "api-key": { + "api-key": "Chiave API", + "api-keys": "Chiavi API", + "delete-api-key-title": "Sei sicuro di voler eliminare la chiave API '{{name}}'?", + "delete-api-key-text": "Attenzione, dopo la conferma la chiave sarà irrecuperabile.", + "delete-api-keys-title": "Sei sicuro di voler eliminare { count, plural, =1 {1 chiave API} other {# chiavi API} }?", + "delete-api-keys-text": "Attenzione, dopo la conferma tutte le chiavi selezionate saranno irrecuperabili.", + "expiration-date": "Data di scadenza", + "date": "Data", + "description": "Descrizione", + "disable": "Disabilita", + "edit-description": "Modifica descrizione", + "enable": "Abilita chiave API", + "expiration-time": "Tempo di scadenza", + "expiration-time-never": "Mai", + "expiration-time-custom": "Personalizzato", + "generate": "Genera", + "generate-title": "Genera chiave API", + "generate-text": "Nota: La chiave API eredita i permessi dell'utente per cui è stata creata.", + "generated-api-key-title": "Chiave API generata. Controlliamo la connettività!", + "generated-api-key-copy": "Assicurati di copiare e salvare la tua chiave API ora, poiché non potrai vederla di nuovo.", + "generated-api-key-command": "Usa le seguenti istruzioni per verificare la connettività. Come risultato, dovresti ricevere le informazioni dell'utente corrente:", + "generated-api-key-insecure-url": "Eseguire comandi tramite una connessione HTTP non sicura invierà la tua chiave API non criptata, rendendola vulnerabile all'intercettazione.", + "list": "{ count, plural, =1 {Una chiave API} other {Elenco di # chiavi API} }", + "manage": "Gestisci", + "manage-api-keys": "Gestisci chiavi API", + "no-found": "Nessuna chiave API trovata", + "selected-api-keys": "{ count, plural, =1 {1 chiave API} other {# chiavi API} } selezionata/e", + "search": "Cerca chiavi API", + "status": "Stato", + "status-active": "Attivo", + "status-inactive": "Inattivo", + "status-expired": "Scaduto" + }, "audit-log": { "audit": "Audit", "audit-logs": "Log di audit", @@ -999,7 +1073,11 @@ "type-provision-failure": "Provisioning dispositivo fallito", "type-timeseries-updated": "Telemetria aggiornata", "type-timeseries-deleted": "Telemetria eliminata", - "type-sms-sent": "SMS inviato" + "type-sms-sent": "SMS inviato", + "any-type": "Qualsiasi tipo", + "audit-log-filter-title": "Filtro log di audit", + "filter-title": "Filtro", + "filter-types": "Tipi di log di audit" }, "debug-settings": { "label": "Configurazione debug", @@ -1020,12 +1098,25 @@ "selected-fields": "{ count, plural, =1 {1 campo calcolato} other {# campi calcolati} } selezionato/i", "type": { "simple": "Semplice", - "script": "Script" + "simple-hint": "Calcolo aritmetico semplice basato sugli argomenti di input.", + "script": "Script", + "script-hint": "Calcolo sugli argomenti definiti utilizzando uno script TBEL.", + "geofencing": "Geofencing", + "geofencing-hint": "Valutazione della posizione GPS dell'entità e delle transizioni contro i gruppi di zone di geofencing configurati.", + "propagation": "Propagazione", + "propagation-hint": "Propagazione dei dati a entità superiori o inferiori in base alla direzione e al tipo di relazione.", + "related-entities-aggregation": "Aggregazione entità correlate", + "related-entities-aggregation-hint": "Aggregazione dei dati più recenti dalle entità correlate.", + "time-series-data-aggregation": "Aggregazione dei dati delle serie temporali", + "time-series-data-aggregation-hint": "Aggregazione dei dati storici da un'entità corrente." }, + "preview": "Anteprima", "arguments": "Argomenti", "decimals-by-default": "Decimali di default", "debugging": "Debug del campo calcolato", + "calculated-field-details": "Dettagli campo calcolato", "argument-name": "Nome argomento", + "name": "Nome", "datasource": "Fonte dati", "add-argument": "Aggiungi argomento", "test-script-function": "Testa funzione script", @@ -1037,8 +1128,9 @@ "argument-asset": "Asset", "argument-customer": "Cliente", "argument-tenant": "Tenant corrente", + "argument-owner": "Proprietario corrente", + "argument-relation-query": "Entità correlate", "argument-type": "Tipo di argomento", - "see-debug-events": "Vedi eventi di debug", "attribute": "Attributo", "copy-argument-name": "Copia nome argomento", "timeseries-key": "Chiave serie temporale", @@ -1051,12 +1143,14 @@ "shared-attributes": "Attributi condivisi", "attribute-key": "Chiave attributo", "default-value": "Valore di default", + "default-value-required": "Il valore predefinito è obbligatorio.", "limit": "Valori massimi", "time-window": "Finestra temporale", "customer-name": "Nome cliente", "asset-name": "Nome asset", "timeseries": "Serie temporale", "output": "Output", + "output-hint": "Definisce come viene elaborato l'output.", "create": "Crea nuovo campo calcolato", "file": "File campo calcolato", "invalid-file-error": "Formato file non valido. Assicurati che il file sia un file JSON valido.", @@ -1070,23 +1164,395 @@ "delete-multiple-text": "Attenzione, dopo la conferma tutti i campi calcolati selezionati saranno eliminati e tutti i dati correlati saranno irrimediabilmente persi.", "test-with-this-message": "Testa con questo messaggio", "use-latest-timestamp": "Usa il timestamp più recente", + "entity-coordinates": "Coordinate entità", + "latitude-time-series-key": "Chiave serie temporale latitudine", + "latitude-time-series-key-required": "La chiave serie temporale latitudine è obbligatoria.", + "longitude-time-series-key": "Chiave serie temporale longitudine", + "longitude-time-series-key-required": "La chiave serie temporale longitudine è obbligatoria.", + "geofencing-zone-groups": "Gruppi di zone geofencing", + "geofencing-zone-groups-settings": "Impostazioni gruppi di zone geofencing", + "target-zone": "Zona target", + "perimeter-key": "Chiave perimetro", + "report-strategy": "Strategia di report", + "no-zone-configured": "È richiesta almeno una zona.", + "no-zone-configured-required": "Deve essere configurato almeno un gruppo di zone.", + "add-zone-group": "Aggiungi gruppo di zone", + "report-transition-event-only": "Solo eventi di transizione", + "report-presence-status-only": "Solo stato di presenza", + "report-transition-event-and-presence": "Stato di presenza e eventi di transizione", + "perimeter-attribute-key": "Chiave attributo perimetro", + "perimeter-attribute-key-required": "La chiave attributo perimetro è obbligatoria.", + "perimeter-attribute-key-pattern": "La chiave attributo perimetro non è valida.", + "entity-zone-relationship": "Percorso dall'entità alle zone", + "direction": "Direzione relazione", + "direction-from": "Dall'entità alla zona", + "direction-to": "Dalla zona all'entità", + "relation-type": "Tipo di relazione", + "create-relation-with-matched-zones": "Crea relazioni per l'entità sorgente con le zone corrispondenti", + "relation-level": "Livello di relazione", + "fetch-last-available-level": "Recupera solo l'ultimo livello disponibile", + "zone-group-refresh-interval": "Intervallo di aggiornamento gruppi di zone", + "copy-zone-group-name": "Copia nome gruppo di zone", + "open-details-page": "Apri la pagina dei dettagli dell'entità", + "level": "Livello", + "direction-level": "Direzione", + "direction-up": "Su", + "direction-up-parent": "Su verso il genitore", + "direction-down": "Giù", + "direction-down-child": "Giù verso il figlio", + "add-level": "Aggiungi livello", + "delete-level": "Elimina livello", + "no-level": "Nessun livello configurato", + "levels-required": "Deve essere configurato almeno un livello.", + "max-allowed-levels-error": "Il livello di relazione supera il massimo consentito.", + "propagation-path-related-entities": "Percorso di propagazione verso le entità correlate", + "propagate-type": { + "arguments-only": "Solo argomenti", + "expression-result": "Risultato del calcolo" + }, + "script": "Script", + "data-propagate": "Dati da propagare", + "output-key": "Chiave di output", + "copy-output-key": "Copia chiave di output", + "aggregation-path-related-entities": "Percorso di aggregazione verso le entità correlate", + "deduplication-interval": "Intervallo di deduplicazione", + "deduplication-interval-min": "L'intervallo di deduplicazione deve essere almeno di {{ sec }} secondi.", + "deduplication-interval-hint": "Tempo minimo tra le aggregazioni di telemetria.", + "deduplication-interval-required": "L'intervallo di deduplicazione è obbligatorio.", + "calculated-field-filter-title": "Filtro campo calcolato", + "filter-title": "Filtro", + "calculated-field-types": "Tipi di campo calcolato", + "events": "Eventi", + "any-type": "Qualsiasi tipo", + "metrics": { + "metrics": "Metriche", + "metrics-empty": "È richiesta almeno una metrica.", + "metric-name": "Nome metrica", + "metric-name-required": "Il nome della metrica è obbligatorio.", + "metric-name-pattern": "Il nome della metrica non è valido.", + "metric-name-duplicate": "Una metrica con questo nome esiste già.", + "metric-name-max-length": "Il nome della metrica deve essere inferiore a 256 caratteri.", + "metric-name-forbidden": "Il nome della metrica è riservato e non può essere utilizzato.", + "copy-metric-name": "Copia nome metrica", + "argument-name": "Nome argomento", + "aggregation": "Aggregazione", + "aggregation-type": { + "avg": "Media", + "min": "Minimo", + "max": "Massimo", + "sum": "Somma", + "count": "Conteggio", + "count-unique": "Conteggio univoco" + }, + "filtered": "Filtrato", + "value-source": "Fonte del valore", + "value-source-hint": "Definisce come viene ottenuto il valore per l'aggregazione.", + "value-source-type": { + "key": "Chiave", + "function": "Funzione" + }, + "no-metrics-configured": "È richiesta almeno una metrica.", + "add-metric": "Aggiungi metrica", + "max-metrics": "Numero massimo di metriche raggiunto.", + "metric-settings": "Impostazioni metrica", + "filter": "Filtro", + "filter-hint": "Abilita il filtro delle entità durante l'aggregazione. La funzione del filtro deve restituire un valore booleano e può utilizzare tutti gli argomenti configurati." + }, + "output-strategy": { + "strategy": "Strategia", + "process-right-away": "Elabora immediatamente", + "process-rule-chains": "Elabora tramite Rule Chains", + "save-time-series": "Salva nella serie temporale", + "save-database": "Salva nel database", + "save-latest-values": "Salva nei valori più recenti", + "send-web-sockets": "Invia a WebSockets", + "save-calculated-fields": "Invia a Campi calcolati", + "update-attribute-only-on-value-change": "Aggiorna l'attributo solo se il valore cambia", + "send-attributes-updated-notification": "Invia notifica di aggiornamento degli attributi", + "ttl": "TTL personalizzato", + "ttl-required": "TTL è obbligatorio", + "ttl-min": "È consentito solo un TTL minimo di 0", + "processing-parameters": "Parametri di elaborazione", + "hint": { + "strategy": "Controlla se il risultato viene elaborato immediatamente o inviato a una catena di regole per ulteriori elaborazioni.", + "processing-options": "Opzioni di elaborazione", + "update-attribute-only-on-value-change": "Aggiorna l'attributo per ogni messaggio in ingresso, indipendentemente dal fatto che il valore sia cambiato. Ciò aumenta l'uso delle API e riduce le prestazioni.", + "update-attribute-only-on-value-change-enabled": "Aggiorna l'attributo solo quando il valore cambia. Se il valore non cambia, i timestamp non vengono aggiornati e non vengono inviate notifiche.", + "send-attributes-updated-notification": "Invia un evento di aggiornamento attributi alla catena di regole predefinita.", + "save-time-series": "Salva i dati della serie temporale nella tabella ts_kv del database.", + "save-database": "Salva i dati degli attributi nel database.", + "save-latest-values": "Aggiorna i dati della serie temporale nella tabella ts_kv_latest del database se il nuovo valore è più recente.", + "send-web-sockets-attribute": "Notifica le sottoscrizioni WebSocket sugli aggiornamenti dei dati dell'attributo.", + "send-web-sockets-time-series": "Notifica le sottoscrizioni WebSocket sugli aggiornamenti dei dati della serie temporale.", + "save-calculated-fields-attribute": "Notifica i campi calcolati sugli aggiornamenti dei dati dell'attributo.", + "save-calculated-fields-time-series": "Notifica i campi calcolati sugli aggiornamenti dei dati della serie temporale.", + "ttl": "Definisce il periodo di conservazione dei dati della serie temporale. Se disabilitato, viene utilizzato il TTL del Profilo tenant." + } + }, + "aggregate-interval-type": "Tipo intervallo di aggregazione", + "aggregate-interval-value": "Valore intervallo di aggregazione", + "aggregate-interval-value-required": "Il valore dell'intervallo di aggregazione è obbligatorio.", + "aggregate-interval-value-min": "Il valore dell'intervallo di aggregazione deve essere almeno { sec, plural, =0 {0 secondo} =1 {1 secondo} other {# secondi} }.", + "aggregate-interval-value-step-multiple-of": "Il valore dell'intervallo di aggregazione deve essere un divisore o un multiplo di 1 giorno.", + "aggregate-period": { + "hour": "Ora", + "day": "Giorno", + "week": "Settimana (Lun - Dom)", + "week-sun-sat": "Settimana (Dom - Sab)", + "month": "Mese", + "quarter": "Trimestre", + "year": "Anno", + "custom": "Personalizzato" + }, + "aggregate-period-hint-offset": "Il tuo intervallo di aggregazione sarà: {{ interval }}", + "aggregate-period-hint-offset-and-so-on": "Il tuo intervallo di aggregazione sarà: {{ interval }} e così via.", + "entity-aggregation": { + "argument-hint": "I dati saranno recuperati dall'entità corrente.", + "argument-title-hint": "Definisce gli argomenti di input utilizzati per l'aggregazione.", + "argument-setting-hint": "L'ultima telemetria è l'unico tipo di argomento disponibile per questo campo calcolato.", + "aggregation-interval": "Intervallo di aggregazione", + "aggregation-interval-hint": "Definisce la frequenza con cui viene eseguita l'aggregazione. Esempio: ogni 1 ora, aggrega i dati alle 00:00, 01:00, 02:00, ecc. I risultati dell'aggregazione sono memorizzati con il timestamp corrispondente all'inizio dell'intervallo di aggregazione.", + "apply-offset": "Applica offset all'intervallo di aggregazione", + "apply-offset-hint": "Definisce di quanto spostare l'inizio di ogni periodo di aggregazione (ad esempio, +10 minuti - 00:10, 01:10).", + "offset-value": "Valore offset", + "offset-value-required": "Il valore offset è obbligatorio.", + "offset-value-min": "Il valore offset deve essere un numero intero positivo.", + "offset-value-max": "Il valore offset deve essere inferiore al valore dell'intervallo di aggregazione.", + "wait-delay": "Applica timeout di attesa per telemetria ritardata", + "wait-delay-hint": "Definisce quanto tempo attendere per la telemetria ritardata dopo che l'intervallo è terminato. Se tale telemetria arriva, il risultato per quell'intervallo verrà ricalcolato.", + "duration": "Durata", + "duration-required": "La durata è obbligatoria.", + "duration-min": "La durata deve essere almeno di 1 minuto.", + "duration-hint": "Quanto tempo attendere per i dati ritardati dopo che l'intervallo è terminato.", + "produce-intermediate-result": "Produci risultato intermedio", + "produce-intermediate-result-hint": "Calcola le metriche durante l'intervallo corrente per produrre un risultato intermedio. Gli aggiornamenti avvengono non più frequentemente di una volta ogni {{ time }}." + }, "hint": { - "arguments-simple-with-rolling": "Il campo calcolato di tipo semplice non deve contenere chiavi con tipo rolling delle serie temporali.", - "arguments-empty": "Gli argomenti non devono essere vuoti.", - "expression-required": "Espressione obbligatoria.", - "expression-invalid": "Espressione non valida", + "arguments-simple-with-rolling": "Un campo calcolato di tipo semplice non dovrebbe contenere chiavi con tipo di serie temporale rolling.", + "arguments-propagate-arguments-with-rolling": "Il tipo 'Serie temporale rolling' è incompatibile con la propagazione 'Solo argomenti'.", + "arguments-propagate-argument-entity-type": "Il tipo entità è incompatibile con la propagazione 'Solo argomenti'.", + "arguments-propagate-argument-must-current-entity": "Almeno un argomento deve essere configurato con il tipo entità sorgente 'Entità corrente'.", + "arguments-empty": "Almeno un argomento deve essere specificato.", + "expression-required": "L'espressione è obbligatoria.", + "expression-invalid": "L'espressione non è valida.", "expression-max-length": "La lunghezza dell'espressione deve essere inferiore a 255 caratteri.", "argument-name-required": "Il nome dell'argomento è obbligatorio.", "argument-name-pattern": "Il nome dell'argomento non è valido.", "argument-name-duplicate": "Esiste già un argomento con questo nome.", "argument-name-max-length": "Il nome dell'argomento deve essere inferiore a 256 caratteri.", "argument-name-forbidden": "Il nome dell'argomento è riservato e non può essere utilizzato.", + "output-key-required": "La chiave di output è obbligatoria.", + "output-key-pattern": "La chiave di output non è valida.", + "output-key-duplicate": "Esiste già una chiave con questo nome.", + "output-key-max-length": "La chiave di output deve essere inferiore a 256 caratteri.", + "output-key-forbidden": "La chiave di output è riservata e non può essere utilizzata.", + "entity-type-required": "Il tipo entità è obbligatorio.", + "name-required": "Il nome è obbligatorio.", + "name-pattern": "Il nome non è valido.", + "name-duplicate": "Esiste già un nome con questo nome.", + "name-max-length": "Il nome deve essere inferiore a 256 caratteri.", + "name-forbidden": "Il nome è riservato e non può essere utilizzato.", "argument-type-required": "Il tipo di argomento è obbligatorio.", "max-args": "Numero massimo di argomenti raggiunto.", - "decimals-range": "Per impostazione predefinita, i decimali devono essere un numero compreso tra 0 e 15.", + "decimals-range": "I decimali di default devono essere un numero compreso tra 0 e 15.", "expression": "L'espressione predefinita dimostra come trasformare una temperatura da Fahrenheit a Celsius.", "arguments-entity-not-found": "Entità di destinazione dell'argomento non trovata.", - "use-latest-timestamp": "Se abilitato, il valore calcolato verrà salvato utilizzando il timestamp più recente dalla telemetria degli argomenti, invece dell'orario del server." + "use-latest-timestamp": "Se abilitato, il valore calcolato verrà memorizzato utilizzando il timestamp più recente dalla telemetria degli argomenti, invece del tempo del server.", + "entity-coordinates": "Specifica le chiavi della serie temporale che forniscono le coordinate GPS dell'entità (latitudine e longitudine).", + "geofencing-zone-groups": "Definisci uno o più gruppi di zone di geofencing da verificare (ad esempio, 'allowedZones', 'restrictedZones'). Ogni gruppo deve avere un nome univoco, che viene utilizzato come prefisso per le chiavi di telemetria di output del campo calcolato.", + "perimeter-attribute-key": "Imposta la chiave attributo che contiene la definizione del perimetro della zona di geofencing. Il perimetro viene sempre preso dagli attributi lato server dell'entità zona.", + "report-strategy": "Lo stato di presenza segnala se l'entità è attualmente DENTRO o FUORI dal gruppo di zone. Gli eventi di transizione segnalano quando l'entità È ENTRATA o È USCITA dal gruppo di zone.", + "create-relation-with-matched-zones": "Crea automaticamente e mantieni le relazioni tra l'entità e le zone in cui si trova attualmente. Le relazioni vengono rimosse quando l'entità lascia una zona e create quando entra in una nuova.", + "relation-type-required": "Il tipo di relazione è obbligatorio.", + "relation-level-required": "Il livello della relazione è obbligatorio.", + "relation-level-min": "Il valore minimo del livello di relazione è 1.", + "relation-level-max": "Il valore massimo del livello di relazione è {{max}}.", + "geofencing-empty": "È richiesto configurare almeno un gruppo di zone.", + "geofencing-entity-not-found": "Entità target di geofencing non trovata.", + "max-geofencing-zone": "Numero massimo di zone di geofencing raggiunto.", + "zone-group-refresh-interval": "Definisce con quale frequenza vengono aggiornati i gruppi di zone configurati tramite entità correlate.", + "zone-group-refresh-interval-required": "L'intervallo di aggiornamento dei gruppi di zone è obbligatorio.", + "zone-group-refresh-interval-min": "L'intervallo di aggiornamento del gruppo di zone deve essere almeno di {{ min }} secondi.", + "propagation-path-related-entities": "Definisce un percorso diretto a un'entità correlata basato sulla direzione e sul tipo di relazione selezionati. Sono supportate solo le relazioni tra entità dispositivo, asset, cliente e tenant. Il numero massimo di entità risolte tramite il percorso di relazione è {{ max }}.", + "data-propagate": "Definisce i dati da propagare dagli argomenti configurati di seguito. 'Solo argomenti' utilizza direttamente i dati recuperati, mentre 'Risultato espressione' calcola un nuovo valore da quei dati.", + "aggregation-path-related-entities": "Definisce un percorso di aggregazione a livello singolo tramite relazioni dirette con entità genitore o figlio, basato sulla direzione e sul tipo di relazione. Sono supportate solo le relazioni tra entità dispositivo, asset, cliente e tenant. Il numero massimo di entità risolte tramite il percorso di relazione è {{ max }}.", + "arguments-aggregation": "Definisce gli argomenti di input utilizzati per il filtraggio e l'aggregazione.", + "setting-arguments-aggregation": "I dati saranno recuperati dalle entità correlate configurate nel percorso di aggregazione.", + "metrics": "Definisce le metriche aggregate in base agli argomenti configurati.", + "entity-aggregation-metrics": "Definisce le metriche aggregate in base agli argomenti configurati sugli intervalli di tempo specificati.", + "import-invalid-calculated-field-type": "Impossibile importare il campo calcolato: struttura del campo calcolato non valida.", + "simple-expression-title": "Espressione aritmetica che definisce come viene calcolato il valore.", + "script-title": "Script TBEL che definisce la logica di calcolo e i valori di output.", + "simple-arguments": "Espressione aritmetica che definisce come viene calcolato il valore.", + "script-arguments": "Definisce gli argomenti di input disponibili per lo script." + } + }, + "alarm-rule": { + "alarm-rules-tab": "Regole allarme", + "alarm-rule": "Regola allarme", + "alarm-rules": "Regole allarme", + "alarm-rules-old": "Vecchie", + "alarm-rules-actual": "Attuali", + "severities": "Gravità", + "cleared": "Condizione di cancellazione", + "delete-title": "Sei sicuro di voler eliminare la regola allarme '{{title}}'?", + "delete-text": "Attenzione, dopo la conferma la regola allarme e tutti i dati correlati diventeranno irrecuperabili.", + "delete-multiple-title": "Sei sicuro di voler eliminare { count, plural, =1 {1 regola allarme} other {# regole allarme} }?", + "delete-multiple-text": "Attenzione, dopo la conferma tutte le regole allarme selezionate verranno rimosse e tutti i dati correlati diventeranno irrecuperabili.", + "create": "Crea nuova regola allarme", + "add": "Aggiungi regola allarme", + "copy": "Copia configurazione regola allarme", + "details": "Dettagli regola allarme", + "no-found": "Nessuna regola allarme trovata", + "list": "{ count, plural, =1 {Una regola allarme} other {Elenco di # regole allarme} }", + "selected-fields": "{ count, plural, =1 {1 regola allarme} other {# regole allarme} } selezionata/e", + "import": "Importa regola allarme", + "file": "File regola allarme", + "export": "Esporta regola allarme", + "export-failed-error": "Impossibile esportare la regola allarme: {{error}}", + "entity-type": "Tipo entità", + "entity-type-required": "Il tipo entità è obbligatorio.", + "alarm-type": "Tipo di allarme", + "alarm-type-hint": "Identificatore unico (ad esempio, HighTempAlarm) nell'ambito dell'origine dell'allarme (Dispositivo, Asset, ecc.) per evitare conflitti.", + "alarm-type-required": "Il tipo di allarme è obbligatorio.", + "alarm-type-pattern": "Il tipo di allarme non è valido.", + "alarm-type-max-length": "Il tipo di allarme deve essere inferiore a 256 caratteri.", + "clear-alarm": "Cancella allarme", + "value-argument": "Argomento", + "value-argument-required": "L'argomento è obbligatorio.", + "static-settings": "Impostazioni statiche", + "configuration": "Configurazione", + "static-schedule": "Statico", + "dynamic-schedule": "Dinamico", + "operation-and": "E", + "operation-or": "O", + "condition-during": "Durante {{during}}", + "condition-during-dynamic": "Durante \"{{ attribute }}\"", + "condition-repeat-times": "Si ripete { count, plural, =1 {1 volta} other {# volte} }", + "condition-repeat-times-dynamic": "Si ripete \"{{ attribute }}\" volte", + "filter-preview": "Anteprima filtro", + "condition-settings": "Impostazioni condizione", + "static": "Statico", + "dynamic": "Dinamico", + "argument-filters": "Filtri argomento", + "argument-name": "Nome argomento", + "value-type": "Tipo di valore", + "general": "Generale", + "filters": "Filtri", + "date-time-hint": "L'argomento deve essere in millisecondi epoch. Esempio: 1698839340000 corrisponde a 2023-11-01 12:49:00 UTC.", + "operation": "Operazione", + "value-source": "Fonte del valore", + "value": "Valore", + "ignore-case": "Ignora maiuscole/minuscole", + "condition": "Condizione", + "script": "Script", + "add-filter": "Aggiungi filtro argomento", + "edit-filter": "Filtro argomento", + "remove-filter": "Rimuovi filtro argomento", + "no-filter": "È richiesto almeno un filtro.", + "conditions": { + "simple": "Semplice", + "duration": "Durata", + "repeating": "Ripetizione" + }, + "schedule-title": "Pianificazione", + "edit-schedule": "Modifica pianificazione allarme", + "schedule-type": "Tipo di pianificatore", + "schedule-type-required": "Il tipo di pianificatore è obbligatorio.", + "schedule": { + "any-time": "Attivo tutto il tempo", + "specific-time": "Attivo a un orario specifico", + "custom": "Personalizzato" + }, + "schedule-day": { + "monday": "Lunedì", + "tuesday": "Martedì", + "wednesday": "Mercoledì", + "thursday": "Giovedì", + "friday": "Venerdì", + "saturday": "Sabato", + "sunday": "Domenica" + }, + "schedule-days": "Giorni", + "schedule-time": "Orario", + "schedule-time-from": "Da", + "schedule-time-to": "A", + "schedule-days-of-week-required": "È necessario selezionare almeno un giorno della settimana.", + "tbel": "TBEL", + "expression-type": { + "simple": "Semplice", + "script": "Script" + }, + "operation-type": { + "and": "E", + "or": "O" + }, + "filter-predicate-type": { + "string": "Stringa", + "numeric": "Numerico", + "boolean": "Booleano", + "complex": "Complesso" + }, + "alarm-rule-additional-info": "Informazioni aggiuntive", + "edit-alarm-rule-additional-info": "Modifica informazioni aggiuntive", + "alarm-rule-additional-info-placeholder": "Fornisci i tuoi commenti e aggiustamenti qui per mostrarli nei dettagli dell'allarme sotto Informazioni aggiuntive", + "alarm-rule-additional-info-hint": "Suggerimento: usa ${Nome argomento} per sostituire i valori degli argomenti usati nella condizione della regola allarme.", + "alarm-rule-additional-info-icon-hint": "Usa Nome argomento per sostituire i valori degli argomenti usati nella condizione della regola allarme.", + "alarm-rule-mobile-dashboard": "Dashboard mobile", + "alarm-rule-mobile-dashboard-hint": "Utilizzato dall'app mobile come dashboard dei dettagli dell'allarme.", + "alarm-rule-no-mobile-dashboard": "Nessuna dashboard selezionata", + "alarm-rule-condition": "Condizione della regola allarme", + "enter-alarm-rule-condition-prompt": "Aggiungi condizione", + "enter-alarm-rule-clear-condition-prompt": "Aggiungi condizione di cancellazione", + "edit-alarm-rule-condition": "Condizione allarme", + "condition-type": "Tipo di condizione", + "condition-type-hint": "Le opzioni \"Durata\" e \"Ripetizione\" non sono disponibili quando l'operazione \"Missing for\" è utilizzata nel filtro.", + "select-alarm-severity": "Seleziona gravità allarme", + "add-create-alarm-rule-prompt": "È richiesta almeno una condizione di attivazione.", + "add-create-alarm-rule": "Aggiungi condizione di attivazione", + "add-clear-alarm-rule": "Aggiungi condizione di cancellazione", + "condition-duration": "Durata condizione", + "condition-duration-value": "Valore durata", + "condition-duration-time-unit": "Unità di tempo", + "condition-duration-value-range": "Il valore della durata deve essere compreso tra 1 e 2147483647.", + "condition-duration-value-pattern": "Il valore della durata deve essere un numero intero.", + "condition-duration-value-required": "Il valore della durata è obbligatorio.", + "condition-duration-time-unit-required": "L'unità di tempo è obbligatoria.", + "condition-repeating-value": "Conteggio eventi", + "condition-repeating-value-hint": "L'aggiornamento di qualsiasi argomento della regola allarme sarà conteggiato come evento", + "condition-repeating-value-range": "Il conteggio degli eventi deve essere compreso tra 1 e 2147483647.", + "condition-repeating-value-pattern": "Il conteggio degli eventi deve essere un numero intero.", + "condition-repeating-value-required": "Il conteggio degli eventi è obbligatorio.", + "create-conditions": "Condizioni di attivazione", + "clear-condition": "Condizione di cancellazione", + "no-clear-alarm-rule": "Nessuna condizione di cancellazione configurata.", + "advanced-settings": "Impostazioni avanzate", + "propagate-alarm": "Propaga allarme alle entità correlate", + "alarm-rule-relation-types-list": "Tipi di relazione", + "alarm-rule-relation-types-list-hint": "Definisce i tipi di relazione per filtrare le entità correlate. Se non impostato, l'allarme verrà propagato a tutte le entità correlate.", + "propagate-alarm-to-owner": "Propaga allarme al proprietario dell'entità (Cliente o Tenant)", + "propagate-alarm-to-tenant": "Propaga allarme al Tenant", + "alarm-rule-filter-title": "Filtro regola allarme", + "filter-title": "Filtro", + "debugging": "Debugging regola allarme", + "any-type": "Qualsiasi tipo", + "enter-alarm-rule-type": "Inserisci tipo di allarme", + "no-alarm-rule-types-matching": "Nessun tipo di allarme corrispondente a '{{entitySubtype}}' trovato.", + "alarm-rule-type-list-empty": "Nessun tipo di allarme selezionato.", + "alarm-rule-type-list": "Elenco tipi di allarme", + "alarm-rule-entity-list": "Elenco entità", + "missing-for": "mancante per", + "time-unit": "Unità di tempo", + "mode": "Modalità", + "type": "Tipo", + "value-required": "Il valore è obbligatorio.", + "min-value": "Il valore deve essere 1 o maggiore.", + "argument-in-use": "L'argomento è utilizzato come argomento generale.", + "import-invalid-alarm-rule-type": "Impossibile importare la regola allarme: struttura della regola allarme non valida.", + "no-filter-preview": "Nessun filtro specificato", + "filter-operation": { + "and": "E", + "or": "O" } }, "ai-models": { @@ -1193,6 +1659,7 @@ "contact": { "country": "Paese", "country-required": "Il paese è obbligatorio.", + "country-object-required": "Seleziona un paese valido dalla lista.", "city": "Città", "state": "Stato / Provincia", "postal-code": "CAP / Codice postale", @@ -1229,6 +1696,8 @@ "documentation": "Documentazione", "time-left": "{{time}} rimanenti", "output": "Output", + "sort-asc": "Ascendente", + "sort-desc": "Discendente", "suffix": { "s": "s", "ms": "ms" @@ -1365,6 +1834,8 @@ "mobile-order": "Ordine della dashboard nell'app mobile", "mobile-hide": "Nascondi dashboard nell'app mobile", "update-image": "Aggiorna immagine dashboard", + "update-new-version": "Carica nuova versione", + "upload-file-to-update": "Carica file per aggiornamento", "take-screenshot": "Cattura screenshot", "select-widget-title": "Seleziona widget", "select-widget-value": "{{title}}: seleziona widget", @@ -1733,6 +2204,8 @@ "bootstrap-tab": "Client bootstrap", "bootstrap-server": "Server Bootstrap", "lwm2m-server": "Server LwM2M", + "client-reboot": "Attivazione aggiornamento registrazione", + "bootstrap-reboot": "Attivazione richiesta bootstrap", "client-publicKey-or-id": "Chiave pubblica o ID del client", "client-publicKey-or-id-required": "Chiave pubblica o ID del client è obbligatoria.", "client-publicKey-or-id-tooltip-psk": "L'identificatore PSK è un identificatore arbitrario fino a 128 byte, come descritto nello standard [RFC7925].\nL'identificatore PSK DEVE essere prima convertito in una stringa e poi codificato in UTF-8.", @@ -1780,7 +2253,6 @@ "unable-delete-device-alias-text": "L'alias del dispositivo '{{deviceAlias}}' non può essere eliminato poiché è utilizzato dai seguenti widget:
{{widgetsList}}", "is-gateway": "È un gateway", "overwrite-activity-time": "Sovrascrivi tempo di attività per il dispositivo connesso", - "device-filter": "Filtro dispositivo", "device-filter-title": "Filtro dispositivo", "filter-title": "Filtro", "device-state": "Stato dispositivo", @@ -2234,7 +2706,8 @@ "short-id-required": "ID server breve obbligatorio.", "short-id-range": "L'ID server breve deve essere compreso tra {{ min }} e {{ max }}.", "short-id-pattern": "L'ID server breve deve essere un numero intero positivo.", - "lifetime": "Durata registrazione client", + "short-id-pattern-bs": "Il breve ID del server deve essere solo nullo", + "lifetime": "Durata della registrazione del client", "lifetime-required": "Durata registrazione client obbligatoria.", "lifetime-pattern": "La durata della registrazione deve essere un numero intero positivo.", "default-min-period": "Periodo minimo tra due notifiche (s)", @@ -2328,7 +2801,9 @@ "composite-all-description": "Tutte le risorse sono osservate con un’unica richiesta Composite Observe (più efficiente, meno flessibile)", "composite-by-object": "Composita per oggetti", "composite-by-object-description": "Le risorse sono raggruppate per tipo di oggetto e osservate tramite richieste Composite Observe separate (approccio bilanciato)" - } + }, + "init-attr-tel-as-obs-strategy": "Inizializza attributi e telemetria utilizzando la strategia Observe", + "init-attr-tel-as-obs-strategy-hint": "Se falso - gli attributi e la telemetria vengono inizializzati leggendo i loro valori uno per uno.\\nSe vero - gli attributi e la telemetria vengono inizializzati sottoscrivendo i loro valori utilizzando la strategia Observe." }, "snmp": { "add-communication-config": "Aggiungi configurazione di comunicazione", @@ -2644,6 +3119,8 @@ "type-rulenodes": "Nodi rule", "list-of-rulenodes": "{ count, plural, =1 {Un nodo rule} other {Elenco di # nodi rule} }", "rulenode-name-starts-with": "Nodi rule i cui nomi iniziano con '{{prefix}}'", + "type-api-key": "Chiave API", + "type-api-keys": "Chiavi API", "type-current-customer": "Cliente corrente", "type-current-tenant": "Tenant corrente", "type-current-user": "Utente corrente", @@ -2665,6 +3142,7 @@ "details": "Dettagli entità", "no-entities-prompt": "Nessuna entità trovata", "no-data": "Nessun dato da visualizzare", + "show-all-columns": "Mostra tutto", "columns-to-display": "Colonne da visualizzare", "type-api-usage-state": "Stato utilizzo API", "type-edge": "Edge", @@ -2710,7 +3188,15 @@ "list-of-mobile-apps": "{ count, plural, =1 {Un'applicazione mobile} other {Elenco di # applicazioni mobili} }", "type-mobile-app-bundle": "Pacchetto mobile", "type-mobile-app-bundles": "Pacchetti mobili", - "list-of-mobile-app-bundles": "{ count, plural, =1 {Un pacchetto mobile} other {Elenco di # pacchetti mobili} }" + "list-of-mobile-app-bundles": "{ count, plural, =1 {Un pacchetto mobile} other {Elenco di # pacchetti mobili} }", + "limit-reached": "Limite raggiunto", + "limit-reached-text": "Hai raggiunto il limite di {{ entities }}. Per aggiungere altri, chiedi al tuo Amministratore di Sistema di aumentare il limite di {{ entity }}.", + "request-limit-increase": "Richiedi aumento del limite", + "request-sysadmin-text": "Sei l'Amministratore di Sistema?", + "login-here": "Accedi qui", + "to-increase-limit": "per aumentare il limite.", + "increase-limit-request-sent-title": "Abbiamo inviato una richiesta automatica al tuo Amministratore di Sistema per aumentare il limite", + "increase-limit-request-sent-text": "Consenti del tempo per la revisione della richiesta e l'aggiornamento delle impostazioni. Potrebbe essere necessario aggiornare questa pagina per vedere le modifiche." }, "entity-field": { "created-time": "Data di creazione", @@ -3787,6 +4273,7 @@ "two-factor-authentication": "Autenticazione a due fattori", "passwords-mismatch-error": "Le password inserite devono coincidere!", "password-again": "Ripeti password", + "sign-in": "Accedi", "username": "Nome utente (email)", "remember-me": "Ricordami", "forgot-password": "Password dimenticata?", @@ -3797,7 +4284,8 @@ "password-link-sent-message": "Link di reimpostazione inviato", "email": "Email", "invalid-email-format": "Formato email non valido.", - "login-with": "Accedi con {{name}}", + "sign-in-with": "Accedi con {{name}}", + "sign-in-to-your-account": "Accedi al tuo account", "or": "oppure", "error": "Errore di accesso", "verify-your-identity": "Verifica la tua identità", @@ -3816,7 +4304,51 @@ "activation-link-expired": "Il link di attivazione è scaduto", "activation-link-expired-message": "Il link per attivare il tuo profilo è scaduto. Puoi tornare alla pagina di accesso per ricevere una nuova email.", "reset-password-link-expired": "Il link per reimpostare la password è scaduto", - "reset-password-link-expired-message": "Il link per reimpostare la password è scaduto. Puoi tornare alla pagina di accesso per ricevere una nuova email." + "reset-password-link-expired-message": "Il link per reimpostare la password è scaduto. Puoi tornare alla pagina di accesso per ricevere una nuova email.", + "two-fa": "Autenticazione a due fattori", + "two-fa-required": "L'autenticazione a due fattori è obbligatoria", + "set-up-verification-method": "Configura un metodo di verifica per continuare", + "set-up-verification-method-login": "Configura un metodo di verifica o accedi", + "enable-authenticator-app": "Abilita l'app di autenticazione", + "enable-authenticator-app-description": "Inserisci il codice di sicurezza dalla tua app di autenticazione", + "enable-authenticator-sms": "Abilita l'autenticatore SMS", + "enable-authenticator-sms-description": "Inserisci un codice a 6 cifre che ti abbiamo appena inviato a ", + "enable-authenticator-email": "Abilita l'autenticatore email", + "enable-authenticator-email-description": "Un codice di sicurezza è stato inviato al tuo indirizzo email a ", + "enter-key-manually": "oppure inserisci manualmente questa chiave a 32 cifre:", + "continue": "Continua", + "confirm": "Conferma", + "authenticator-app-success": "App di autenticazione abilitata con successo", + "authenticator-app-success-description": "La prossima volta che effettuerai l'accesso, dovrai fornire un codice di autenticazione a due fattori", + "authenticator-sms-success": "Autenticatore SMS abilitato con successo", + "authenticator-sms-success-description": "La prossima volta che effettuerai l'accesso, ti verrà richiesto di inserire il codice di sicurezza che verrà inviato al numero di telefono", + "authenticator-email-success": "Autenticatore email abilitato con successo", + "authenticator-email-success-description": "La prossima volta che effettuerai l'accesso, ti verrà richiesto di inserire il codice di sicurezza che verrà inviato al tuo indirizzo email", + "authenticator-backup-code-success": "Codice di backup abilitato con successo", + "authenticator-backup-code-success-description": "La prossima volta che effettuerai l'accesso, ti verrà richiesto di inserire il codice di sicurezza o utilizzare uno dei codici di backup.", + "add-verification-method": "Aggiungi metodo di verifica", + "get-backup-code": "Ottieni codice di backup", + "copy-key": "Copia chiave", + "send-code": "Invia codice", + "email-label": "Email", + "email-description": "Inserisci un'email da utilizzare come tuo autenticatore.", + "sms-description": "Inserisci un numero di telefono da utilizzare come tuo autenticatore.", + "backup-code-description": "Stampa i codici in modo da averli a portata di mano quando ne avrai bisogno per accedere al tuo account. Puoi utilizzare ogni codice di backup una sola volta.", + "backup-code-warn": "Una volta che lasci questa pagina, questi codici non potranno essere mostrati di nuovo. Conservali in modo sicuro utilizzando le opzioni sottostanti.", + "download-txt": "Scarica (txt)", + "print": "Stampa", + "verification-code": "Codice a 6 cifre", + "verification-code-invalid": "Formato del codice di verifica non valido", + "verification-code-incorrect": "Codice di verifica errato", + "verification-code-many-request": "Troppe richieste per verificare il codice", + "scan-qr-code": "Scansiona questo codice QR con la tua app di verifica", + "phone-input": { + "phone-input-label": "Numero di telefono", + "phone-input-required": "Il numero di telefono è obbligatorio", + "phone-input-validation": "Il numero di telefono non è valido o non possibile", + "phone-input-pattern": "Numero di telefono non valido. Deve essere nel formato E.164, es. {{phoneNumber}}", + "phone-input-hint": "Numero di telefono nel formato E.164, es. {{phoneNumber}}" + } }, "mobile": { "add-application": "Aggiungi applicazione", @@ -4184,6 +4716,7 @@ "api-usage-limit": "Limite utilizzo API", "device-activity": "Attività dispositivo", "entities-limit": "Limite entità", + "entities-limit-increase-request": "Richiesta aumento limite entità", "entity-action": "Azione entità", "general": "Generale", "rule-engine-lifecycle-event": "Evento ciclo di vita Rule Engine", @@ -4401,6 +4934,12 @@ "at-least": "Almeno:", "character": "{ count, plural, =1 {1 carattere} other {# caratteri} }", "digit": "{ count, plural, =1 {1 cifra} other {# cifre} }", + "password-tooltip-min-length": "Almeno {{minimumLength}} caratteri", + "password-tooltip-max-length": "Al massimo {{maximumLength}} caratteri", + "password-tooltip-uppercase": "{{minimumUppercaseLetters}} carattere maiuscolo", + "password-tooltip-lowercase": "{{minimumLowercaseLetters}} carattere minuscolo", + "password-tooltip-digit": "{{minimumDigits}} numero", + "password-tooltip-special-characters": "{{minimumSpecialCharacters}} carattere speciale", "incorrect-password-try-again": "Password errata. Riprova", "lowercase-letter": "{ count, plural, =1 {1 lettera minuscola} other {# lettere minuscole} }", "new-passwords-not-match": "La nuova password non corrisponde", @@ -4459,7 +4998,8 @@ "additional-info": "Informazioni aggiuntive (JSON)", "invalid-additional-info": "Impossibile analizzare il JSON delle informazioni aggiuntive.", "no-relations-text": "Nessuna relazione trovata", - "not": "Non" + "not": "Non", + "copy-type": "Tipo di copia" }, "resource": { "add": "Aggiungi risorsa", @@ -5410,7 +5950,7 @@ "time-series": "Serie temporale", "latest": "Ultimi valori", "web-sockets": "WebSockets", - "calculated-fields": "Campi calcolati" + "calculated-fields-and-alarm-rules": "Campi calcolati e regole allarme" }, "save-attribute": { "processing-settings": "Impostazioni di elaborazione", @@ -5605,7 +6145,8 @@ "bad-request-params": "Parametri di richiesta errati", "item-not-found": "Elemento non trovato", "too-many-requests": "Troppe richieste", - "too-many-updates": "Troppe modifiche" + "too-many-updates": "Troppe modifiche", + "entities-limit-exceeded": "Limite entità superato" }, "tenant": { "tenant": "Tenant", @@ -5743,6 +6284,27 @@ "max-arguments-per-cf": "Numero massimo di argomenti per campo calcolato", "max-arguments-per-cf-range": "Il numero massimo di argomenti per campo calcolato non può essere negativo", "max-arguments-per-cf-required": "Il numero massimo di argomenti per campo calcolato è richiesto", + "max-related-level-per-argument": "Numero massimo di livello di relazione per l'argomento 'Entità correlate'", + "max-related-level-per-argument-range": "Il numero massimo di livello di relazione per l'argomento 'Entità correlate' non può essere inferiore a '1'", + "max-related-level-per-argument-required": "Il numero massimo di livello di relazione per l'argomento 'Entità correlate' è obbligatorio", + "min-allowed-scheduled-update-interval": "Intervallo minimo consentito per l'aggiornamento dell'argomento 'Entità correlate' (secondi)", + "min-allowed-scheduled-update-interval-range": "Il numero minimo dell'intervallo di aggiornamento consentito non può essere negativo", + "min-allowed-deduplication-interval": "Intervallo minimo consentito di deduplicazione (secondi)", + "min-allowed-deduplication-interval-range": "Il valore dell'intervallo minimo consentito di deduplicazione non può essere negativo", + "min-allowed-deduplication-interval-required": "L'intervallo minimo consentito di deduplicazione è obbligatorio", + "intermediate-aggregation-interval": "Intervallo di aggregazione intermedio (secondi)", + "intermediate-aggregation-interval-range": "Il valore dell'intervallo di aggregazione intermedio non può essere inferiore a '1'", + "intermediate-aggregation-interval-required": "L'intervallo di aggregazione intermedio è obbligatorio", + "reevaluation-check-interval": "Intervallo di controllo della rivalutazione (secondi)", + "reevaluation-check-interval-range": "Il valore dell'intervallo di controllo della rivalutazione non può essere inferiore a '1'", + "reevaluation-check-interval-required": "L'intervallo di controllo della rivalutazione è obbligatorio", + "alarms-reevaluation-interval": "Intervallo di rivalutazione degli allarmi (secondi)", + "alarms-reevaluation-interval-range": "Il valore dell'intervallo di rivalutazione degli allarmi non può essere inferiore a '1'", + "alarms-reevaluation-interval-required": "L'intervallo di rivalutazione degli allarmi è obbligatorio", + "min-allowed-aggregation-interval": "Intervallo minimo consentito di aggregazione (secondi)", + "min-allowed-aggregation-interval-range": "Il valore dell'intervallo minimo consentito di aggregazione non può essere negativo", + "min-allowed-aggregation-interval-required": "L'intervallo minimo consentito di aggregazione è obbligatorio", + "min-allowed-scheduled-update-interval-required": "Il numero minimo dell'intervallo di aggiornamento consentito è obbligatorio", "max-state-size": "Dimensione massima dello stato in KB", "max-state-size-range": "La dimensione massima dello stato in KB non può essere negativa", "max-state-size-required": "La dimensione massima dello stato in KB è richiesta", @@ -5818,6 +6380,10 @@ "ws-limit-max-subscriptions-per-regular-user": "Numero massimo di sottoscrizioni per utente regolare", "ws-limit-max-subscriptions-per-public-user": "Numero massimo di sottoscrizioni per utente pubblico", "ws-limit-updates-per-session": "Aggiornamenti WS per sessione", + "relation-search-entity-limit": "Limite entità ricerca relazione", + "relation-search-entity-limit-hint": "Limita il numero di entità risolte all'ultimo livello del percorso di relazione. Si applica agli argomenti 'Entità correlate' e ai campi di propagazione.", + "relation-search-entity-limit-required": "Il limite delle entità nella ricerca di relazione è obbligatorio", + "relation-search-entity-limit-range": "Il limite delle entità nella ricerca di relazione non può essere inferiore a '1'", "rate-limits": { "add-limit": "Aggiungi limite", "and-also-less-than": "e anche inferiore a", @@ -6003,7 +6569,9 @@ "default-agg-interval": "Intervallo di raggruppamento predefinito", "edit-intervals-list-hint": "È possibile specificare un elenco di opzioni di intervallo disponibili.", "edit-grouping-intervals-list-hint": "È possibile configurare l'elenco degli intervalli di raggruppamento e l'intervallo di raggruppamento predefinito.", - "all": "Tutti" + "all": "Tutti", + "save-current-settings-as-default": "Salva le impostazioni correnti come finestra temporale predefinita", + "hide-option-from-end-users": "Nascondi l'opzione dagli utenti finali" }, "tooltip": { "trigger": "Trigger", @@ -6657,7 +7225,8 @@ "export-relations": "Esporta relazioni", "export-attributes": "Esporta attributi", "export-credentials": "Esporta credenziali", - "export-calculated-fields": "Esporta campi calcolati", + "export-calculated-fields": "Esporta campi calcolati \ne regole allarme", + "export-alarm-rules": "Esporta regole allarme", "entity-versions": "Versioni entità", "versions": "Versioni", "created-time": "Ora di creazione", @@ -6675,6 +7244,7 @@ "load-attributes": "Carica attributi", "load-credentials": "Carica credenziali", "load-calculated-fields": "Carica campi calcolati", + "load-alarm-rules": "Carica regole allarme", "compare-with-current": "Confronta con l'attuale", "diff-entity-with-version": "Differenze con la versione '{{versionName}}'", "previous-difference": "Differenza precedente", @@ -6884,7 +7454,23 @@ "scan-qr-code": "Scansiona codice QR", "make-phone-call": "Effettua una chiamata", "get-location": "Ottieni la posizione del telefono", - "take-screenshot": "Cattura schermata" + "take-screenshot": "Cattura schermata", + "handle-provision-success-function": "Gestisci la funzione di successo della provision", + "get-location-function": "Funzione per ottenere la posizione", + "process-launch-result-function": "Funzione per elaborare il risultato del lancio", + "get-phone-number-function": "Funzione per ottenere il numero di telefono", + "process-image-function": "Funzione per elaborare l'immagine", + "process-qr-code-function": "Funzione per elaborare il codice QR", + "process-location-function": "Funzione per elaborare la posizione", + "handle-empty-result-function": "Funzione per gestire il risultato vuoto", + "handle-error-function": "Funzione per gestire l'errore", + "handle-non-mobile-fallback-function": "Funzione per gestire il fallback Non-Mobile", + "save-to-gallery": "Salva nella galleria", + "provision-type": "Tipo di provision", + "auto": "Auto", + "wi-fi": "Wi-Fi", + "ble": "BLE", + "soft-ap": "Soft AP" }, "custom-action-function": "Funzione azione personalizzata", "custom-pretty-function": "Funzione azione personalizzata (con template HTML)", @@ -6893,7 +7479,8 @@ "marker": "Indicatore", "polygon": "Poligono", "rectangle": "Rettangolo", - "circle": "Cerchio" + "circle": "Cerchio", + "polyline": "Polilinea" }, "place-map-item": "Posiziona elemento sulla mappa", "map-item-tooltip": { @@ -6905,7 +7492,9 @@ "continue-draw-polygon": "Continua disegno poligono", "finish-draw-polygon": "Termina disegno poligono", "start-draw-circle": "Inizia a disegnare cerchio", - "finish-draw-circle": "Termina disegno cerchio" + "finish-draw-circle": "Termina disegno cerchio", + "start-draw-polyline": "Inizia a disegnare la polilinea", + "finish-draw-polyline": "Termina il disegno della polilinea" } }, "widgets-bundle": { @@ -7471,6 +8060,14 @@ "update-animation-delay": "Ritardo aggiornamento animazione" }, "chart-axis": { + "limit": "Limite", + "source": "Fonte", + "key-value": "Chiave / Valore", + "value-required": "Il valore è obbligatorio.", + "entity-key-required": "La chiave dell'entità è obbligatoria.", + "key-required": "La chiave è obbligatoria.", + "scale-limits": "Limiti scala", + "scale-appearance": "Aspetto scala", "scale": "Scala", "scale-min": "min", "scale-max": "max", @@ -8015,7 +8612,10 @@ "add-radio-option": "Aggiungi opzione radio", "radio-label-position": "Posizione dell'etichetta", "radio-label-position-before": "Prima", - "radio-label-position-after": "Dopo" + "radio-label-position-after": "Dopo", + "save-image": "Salva immagine", + "save-to-gallery": "Archivia automaticamente le immagini catturate nella Galleria Immagini", + "public-image": "Rende l'immagine disponibile per qualsiasi utente non autorizzato" }, "invalid-qr-code-text": "Testo non valido per codice QR. L'input deve essere di tipo stringa", "qr-code": { @@ -8310,7 +8910,8 @@ "trips": "Percorsi", "markers": "Marker", "polygons": "Poligoni", - "circles": "Cerchi" + "circles": "Cerchi", + "polylines": "Polilinee" }, "data-layer": { "source": "Sorgente", @@ -8507,8 +9108,27 @@ "finish-circle-hint-with-entity": "Cerchio per '{{entityName}}': clicca per terminare e salvare", "finish-circle-hint": "Cerchio: clicca per terminare il disegno" }, + "polyline": { + "polyline-key": "Chiave polilinea", + "polyline-key-required": "Chiave polilinea obbligatoria", + "no-polylines": "Nessuna polilinea configurata", + "add-polylines": "Aggiungi polilinea", + "polyline-configuration": "Configurazione polilinea", + "remove-polyline": "Rimuovi polilinea", + "edit": "Modifica polilinea", + "cut": "Taglia area polilinea", + "rotate": "Ruota polilinea", + "remove-polyline-for": "Rimuovi polilinea per '{{entityName}}'", + "draw-polyline": "Disegna polilinea", + "polyline-place-first-point-hint-with-entity": "Polilinea per '{{entityName}}': clicca per posizionare il primo punto", + "polyline-place-first-point-hint": "Polilinea: clicca per posizionare il primo punto", + "finish-polyline-hint-with-entity": "Polilinea per '{{entityName}}': clicca per terminare il disegno", + "finish-polyline-hint": "Polilinea: clicca per terminare il disegno", + "polyline-place-first-point-cut-hint": "Clicca per posizionare il primo punto", + "finish-polyline-cut-hint": "Clicca sul primo marcatore per terminare e salvare" + }, "select-entity": "Seleziona entità", - "select-entity-hint": "Suggerimento: dopo la selezione, clicca sulla mappa per impostare la posizione" + "select-entity-hint": "Suggerimento: dopo la selezione clicca sulla mappa per impostare la posizione" }, "select-entity": "Seleziona entità", "select-entity-hint": "Suggerimento: dopo la selezione clicca sulla mappa per impostare la posizione", @@ -8948,6 +9568,7 @@ "show-empty-space-hidden-action": "Mostra spazio vuoto al posto del pulsante di azione nascosto", "dont-reserve-space-hidden-action": "Non riservare spazio per i pulsanti di azione nascosti", "display-timestamp": "Timestamp", + "timestamp-column-name": "Timestamp", "display-pagination": "Mostra paginazione", "default-page-size": "Dimensione pagina predefinita", "page-step-settings": "Impostazioni passo di pagina", @@ -9009,7 +9630,9 @@ "alarm-column-error": "Deve essere specificata almeno una colonna allarmi", "table-tabs": "Schede della tabella", "show-cell-actions-menu-mobile": "Mostra menu azioni cella in modalità mobile", - "disable-sorting": "Disabilita ordinamento" + "disable-sorting": "Disabilita ordinamento", + "sort-by": "Ordina schede per", + "sort-timestamp-option": "Orario di creazione" }, "latest-chart": { "total": "Totale", @@ -9501,11 +10124,28 @@ "content": "

Creando dashboard per gli utenti finali, ogni cliente può vedere solo i propri dispositivi; i dati degli altri clienti saranno nascosti.

Segui la documentazione per sapere come fare:

" } } + }, + "api-usage": { + "api-usage": "Uso API", + "label": "Etichetta", + "state-name": "Nome stato", + "status": "Stato", + "status-required": "Lo stato è obbligatorio.", + "limit": "Limite massimo", + "limit-required": "Il limite massimo è obbligatorio.", + "current-number": "Numero attuale", + "current-number-required": "Il numero attuale è obbligatorio.", + "add-key": "Aggiungi chiave", + "no-key": "Nessuna chiave", + "delete-key": "Elimina chiave", + "target-dashboard-state": "Stato della dashboard di destinazione", + "go-to-main-state": "Vai alla vista predefinita" } }, "icon": { "icon": "Icona", "icons": "Icone", + "custom": "Personalizzato", "select-icon": "Seleziona icona", "material-icons": "Icone Material", "show-all": "Mostra tutte le icone", @@ -9546,6 +10186,7 @@ "items-per-page-separator": "di" }, "language": { + "auto": "Auto", "language": "Lingua" } } \ No newline at end of file diff --git a/ui-ngx/src/assets/locale/locale.constant-ja_JP.json b/ui-ngx/src/assets/locale/locale.constant-ja_JP.json index eb0eacaed1..1a67637a44 100644 --- a/ui-ngx/src/assets/locale/locale.constant-ja_JP.json +++ b/ui-ngx/src/assets/locale/locale.constant-ja_JP.json @@ -1,1511 +1,10192 @@ { - "access": { - "unauthorized": "無許可", - "unauthorized-access": "不正アクセス", - "unauthorized-access-text": "このリソースにアクセスするにはサインインする必要があります。", - "access-forbidden": "アクセス禁止", - "access-forbidden-text": "あなたはこの場所へのアクセス権を持っていません!この場所にアクセスしたい場合は、別のユーザーとサインインしてみてください。", - "refresh-token-expired": "セッションが終了しました", - "refresh-token-failed": "セッションをリフレッシュできません" - }, - "action": { - "activate": "アクティブ化する", - "suspend": "サスペンド", - "save": "セーブ", - "saveAs": "名前を付けて保存", - "cancel": "キャンセル", - "ok": "[OK]", - "delete": "削除", - "add": "追加", - "yes": "はい", - "no": "いいえ", - "update": "更新", - "remove": "削除", - "search": " 検索", - "clear-search": "検索をクリア", - "assign": "割り当て", - "unassign": "割り当て解除", - "share": "シェア", - "make-private": "プライベートにする", - "apply": "適用", - "apply-changes": "変更を適用", - "edit-mode": "編集モード", - "enter-edit-mode": "編集モードに入る", - "decline-changes": "変更を拒否", - "close": "閉じる", - "back": "戻る", - "run": "実行", - "sign-in": "サインイン!", - "edit": "編集", - "view": "ビュー", - "create": "作成", - "drag": "ドラッグ", - "refresh": "リフレッシュ", - "undo": "元に戻す", - "copy": "コピー", - "paste": "ペースト", - "copy-reference": "参照コピー", - "paste-reference": "参照貼り付け", - "import": "インポート", - "export": "エクスポート", - "share-via": "{{provider}}" - }, - "aggregation": { - "aggregation": "集約", - "function": "データ集約機能", - "limit": "上限", - "group-interval": "グループ化の間隔", - "min": "最小", - "max": "最大", - "avg": "平均", - "sum": "総和", - "count": "カウント", - "none": "なし" - }, - "admin": { - "general": "一般", - "general-settings": "一般設定", - "outgoing-mail": "送信メール", - "outgoing-mail-settings": "送信メールの設定", - "system-settings": "システム設定", - "test-mail-sent": "テストメールが正常に送信されました!", - "base-url": "ベースURL", - "base-url-required": "ベースURLは必須です。", - "mail-from": "メール", - "mail-from-required": "メールの送信元が必要です。", - "smtp-protocol": "SMTPプロトコル", - "smtp-host": "SMTPホスト", - "smtp-host-required": "SMTPホストが必要です。", - "smtp-port": "SMTPポート", - "smtp-port-required": "SMTPポートを指定してください。", - "smtp-port-invalid": "有効なSMTPポートではありません。", - "timeout-msec": "タイムアウト(ミリ秒)", - "timeout-required": "タイムアウト設定が必要です。", - "timeout-invalid": "有効なタイムアウト設定ではありません。", - "enable-tls": "TLSを有効にする", - "tls-version": "TLSバージョン", - "send-test-mail": "テストメールを送信する" - }, - "alarm": { - "alarm": "アラーム", - "alarms": "アラーム", - "select-alarm": "アラームを選択", - "no-alarms-matching": "'{{entity}}'発見されました。", - "alarm-required": "アラームが必要です", - "alarm-status": "アラーム状態", - "search-status": { - "ANY": "どれか", - "ACTIVE": "アクティブ", - "CLEARED": "クリアされた", - "ACK": "承認された", - "UNACK": "未確認の" - }, - "display-status": { - "ACTIVE_UNACK": "アクティブ未確認", - "ACTIVE_ACK": "Active Acknowledged", - "CLEARED_UNACK": "クリアされた未確認のメッセージ", - "CLEARED_ACK": "承認された承認済み" - }, - "no-alarms-prompt": "アラームが見つかりません", - "created-time": "作成時刻", - "type": "タイプ", - "severity": "重大度", - "originator": "発信元", - "originator-type": "発信元タイプ", - "details": "詳細", - "status": "状態", - "alarm-details": "アラームの詳細", - "start-time": "開始時間", - "end-time": "終了時間", - "ack-time": "確認された時間", - "clear-time": "クリアされた時間", - "severity-critical": "クリティカル", - "severity-major": "メジャー", - "severity-minor": "マイナー", - "severity-warning": "警告", - "severity-indeterminate": "不確定", - "acknowledge": "承認", - "clear": "クリア", - "search": "アラームの検索", - "selected-alarms": "{ count, plural, =1 {1 alarm} other {# alarms} }選択された", - "no-data": "表示するデータがありません", - "polling-interval": "アラームポーリング間隔(秒)", - "polling-interval-required": "アラームのポーリング間隔が必要です。", - "min-polling-interval-message": "少なくとも1秒間のポーリング間隔が許可されます。", - "aknowledge-alarms-title": "{ count, plural, =1 {1 alarm} other {# alarms} }", - "aknowledge-alarms-text": "{ count, plural, =1 {1 alarm} other {# alarms} }?", - "clear-alarms-title": "{ count, plural, =1 {1 alarm} other {# alarms} }", - "clear-alarms-text": "{ count, plural, =1 {1 alarm} other {# alarms} }?" - }, - "alias": { - "add": "エイリアスを追加する", - "edit": "エイリアスを編集する", - "name": "エイリアス名", - "name-required": "エイリアス名は必須です", - "duplicate-alias": "同じ名前のエイリアスは既に存在します。", - "filter-type-single-entity": "単一のエンティティ", - "filter-type-entity-list": "エンティティリスト", - "filter-type-entity-name": "エンティティ名", - "filter-type-state-entity": "ダッシュボード状態からのエンティティ", - "filter-type-state-entity-description": "ダッシュボードの状態パラメータから取得されたエンティティ", - "filter-type-asset-type": "アセットの種類", - "filter-type-asset-type-description": "'{{assetTypes}}'", - "filter-type-asset-type-and-name-description": "'{{assetTypes}}''{{prefix}}'", - "filter-type-device-type": "デバイスタイプ", - "filter-type-device-type-description": "'{{deviceTypes}}'", - "filter-type-device-type-and-name-description": "'{{deviceTypes}}''{{prefix}}'", - "filter-type-relations-query": "関係クエリ", - "filter-type-relations-query-description": "{{entities}}{{relationType}}{{direction}}{{rootEntity}}", - "filter-type-asset-search-query": "アセット検索クエリ", - "filter-type-asset-search-query-description": "{{assetTypes}}{{relationType}}{{direction}}{{rootEntity}}", - "filter-type-device-search-query": "デバイス検索クエリ", - "filter-type-device-search-query-description": "{{deviceTypes}}{{relationType}}{{direction}}{{rootEntity}}", - "entity-filter": "エンティティフィルタ", - "resolve-multiple": "複数のエンティティとして解決する", - "filter-type": "フィルタタイプ", - "filter-type-required": "フィルタタイプが必要です。", - "entity-filter-no-entity-matched": "指定されたフィルタに一致するエンティティは見つかりませんでした。", - "no-entity-filter-specified": "エンティティフィルタが指定されていない", - "root-state-entity": "ルートとしてダッシュボードの状態エンティティを使用する", - "root-entity": "ルートエンティティ", - "state-entity-parameter-name": "状態エンティティのパラメータ名", - "default-state-entity": "デフォルト状態エンティティ", - "default-entity-parameter-name": "デフォルトでは", - "max-relation-level": "最大関連レベル", - "unlimited-level": "無制限レベル", - "state-entity": "ダッシュボードの状態エンティティ", - "all-entities": "すべてのエンティティ", - "any-relation": "どれか" - }, - "asset": { - "asset": "アセット", - "assets": "アセット", - "management": "アセット管理", - "view-assets": "アセットの表示", - "add": "アセットを追加", - "assign-to-customer": "顧客に割り当てる", - "assign-asset-to-customer": "顧客にアセットを割り当てる", - "assign-asset-to-customer-text": "顧客に割り当てるアセットを選択してください", - "no-assets-text": "アセットが見つかりません", - "assign-to-customer-text": "アセットを割り当てる顧客を選択してください", - "public": "公開", - "assignedToCustomer": "顧客に割り当てられた", - "make-public": "アセットを公開する", - "make-private": "アセットをプライベートにする", - "unassign-from-customer": "顧客からの割り当て解除", - "delete": "アセットを削除", - "asset-public": "アセットは公開されています", - "asset-type": "アセットの種類", - "asset-type-required": "アセットの種類が必要です。", - "select-asset-type": "アセットタイプを選択", - "enter-asset-type": "アセットタイプを入力", - "any-asset": "すべてのアセット", - "no-asset-types-matching": "'{{entitySubtype}}'発見されました。", - "asset-type-list-empty": "選択されたアセットタイプはありません。", - "asset-types": "アセットタイプ", - "name": "名", - "name-required": "名前は必須です。", - "description": "説明", - "type": "タイプ", - "type-required": "タイプが必要です。", - "details": "詳細", - "events": "イベント", - "add-asset-text": "新しいアセットを追加する", - "asset-details": "アセットの詳細", - "assign-assets": "アセットの割り当て", - "assign-assets-text": "{ count, plural, =1 {1 asset} other {# assets} }顧客に", - "delete-assets": "アセットを削除する", - "unassign-assets": "アセットの割り当てを解除する", - "unassign-assets-action-title": "{ count, plural, =1 {1 asset} other {# assets} }顧客から", - "assign-new-asset": "新しいアセットを割り当てる", - "delete-asset-title": "'{{assetName}}'?", - "delete-asset-text": "確認後、アセットと関連するすべてのデータが回復不能になることに注意してください。", - "delete-assets-title": "{ count, plural, =1 {1 asset} other {# assets} }?", - "delete-assets-action-title": "{ count, plural, =1 {1 asset} other {# assets} }", - "delete-assets-text": "確認後、選択したすべてのアセットが削除され、関連するすべてのデータは回復不能になりますので注意してください。", - "make-public-asset-title": "'{{assetName}}'パブリック?", - "make-public-asset-text": "確認後、アセットとそのすべてのデータは公開され、他の人がアクセスできるようになります。", - "make-private-asset-title": "'{{assetName}}'プライベート?", - "make-private-asset-text": "確認後、アセットとそのすべてのデータは非公開にされ、他の人がアクセスすることはできません。", - "unassign-asset-title": "'{{assetName}}'?", - "unassign-asset-text": "確認後、アセットは割り当て解除され、顧客はアクセスできなくなります。", - "unassign-asset": "アセットの割り当てを解除する", - "unassign-assets-title": "{ count, plural, =1 {1 asset} other {# assets} }?", - "unassign-assets-text": "確認後、選択されたすべてのアセットが割り当て解除され、顧客がアクセスできなくなります。", - "copyId": "アセットIDをコピーする", - "idCopiedMessage": "アセットIDがクリップボードにコピーされました", - "select-asset": "アセットを選択", - "no-assets-matching": "'{{entity}}'発見されました。", - "asset-required": "アセットが必要です", - "name-starts-with": "次で始まるアセット名", - "label": "ラベル" - }, - "attribute": { - "attributes": "属性", - "latest-telemetry": "最新テレメトリ", - "attributes-scope": "エンティティ属性のスコープ", - "scope-telemetry": "テレメトリー", - "scope-latest-telemetry": "最新テレメトリ", - "scope-client": "クライアントの属性", - "scope-server": "サーバーの属性", - "scope-shared": "共有属性", - "add": "属性を追加する", - "key": "キー", - "last-update-time": "最終更新時間", - "key-required": "属性キーは必須です。", - "value": "値", - "value-required": "属性値は必須です。", - "delete-attributes-title": "{ count, plural, =1 {1 attribute} other {# attributes} }?", - "delete-attributes-text": "注意してください。確認後、選択したすべての属性が削除されます。", - "delete-attributes": "属性を削除する", - "enter-attribute-value": "属性値を入力", - "show-on-widget": "ウィジェットで表示", - "widget-mode": "ウィジェットモード", - "next-widget": "次のウィジェット", - "prev-widget": "前のウィジェット", - "add-to-dashboard": "ダッシュボードに追加", - "add-widget-to-dashboard": "ウィジェットをダッシュ​​ボードに追加する", - "selected-attributes": "{ count, plural, =1 {1 attribute} other {# attributes} }選択された", - "selected-telemetry": "{ count, plural, =1 {1 telemetry unit} other {# telemetry units} }選択された" - }, - "audit-log": { - "audit": "監査", - "audit-logs": "監査ログ", - "timestamp": "タイムスタンプ", - "entity-type": "エンティティタイプ", - "entity-name": "エンティティ名", - "user": "ユーザー", - "type": "タイプ", - "status": "状態", - "details": "詳細", - "type-added": "追加された", - "type-deleted": "削除済み", - "type-updated": "更新しました", - "type-attributes-updated": "属性が更新されました", - "type-attributes-deleted": "属性が削除されました", - "type-rpc-call": "RPC呼び出し", - "type-credentials-updated": "資格が更新されました", - "type-assigned-to-customer": "顧客に割り当てられた", - "type-unassigned-from-customer": "顧客から割り当てられていない", - "type-activated": "活性化", - "type-suspended": "一時停止中", - "type-credentials-read": "信用証明書を読む", - "type-attributes-read": "読み取られた属性", - "type-relation-add-or-update": "関係が更新されました", - "type-relation-delete": "関係が削除されました", - "type-relations-delete": "すべてのリレーションを削除", - "type-alarm-ack": "承認された", - "type-alarm-clear": "クリアされた", - "status-success": "成功", - "status-failure": "失敗", - "audit-log-details": "監査ログの詳細", - "no-audit-logs-prompt": "ログが見つかりません", - "action-data": "行動データ", - "failure-details": "失敗の詳細", - "search": "監査ログの検索", - "clear-search": "検索をクリアする" - }, - "confirm-on-exit": { - "message": "保存されていない変更があります。あなたは本当にこのページを出るのですか?", - "html-message": "保存していない変更があります。
このページを終了してもよろしいですか?", - "title": "保存されていない変更" - }, - "contact": { - "country": "国", - "city": "市区町村", - "state": "都道府県", - "postal-code": "郵便番号", - "postal-code-invalid": "無効な郵便番号形式です。", - "address": "住所", - "address2": "住所2", - "phone": "電話", - "email": "Eメール", - "no-address": "住所がありません" - }, - "common": { - "username": "ユーザー名", - "password": "パスワード", - "enter-username": "ユーザー名を入力してください", - "enter-password": "パスワードを入力してください", - "enter-search": "検索を入力", - "created-time": "作成時刻" - }, - "content-type": { - "json": "Json", - "text": "テキスト", - "binary": "バイナリ(Base64)" - }, - "customer": { - "customer": "顧客", - "customers": "顧客", - "management": "顧客管理", - "dashboard": "顧客ダッシュボード", - "dashboards": "顧客ダッシュボード", - "devices": "顧客デバイス", - "assets": "顧客アセット", - "public-dashboards": "パブリックダッシュボード", - "public-devices": "パブリックデバイス", - "public-assets": "パブリックアセット", - "add": "顧客を追加", - "delete": "顧客を削除", - "manage-customer-users": "顧客を管理する", - "manage-customer-devices": "顧客のデバイスを管理する", - "manage-customer-dashboards": "顧客ダッシュボードの管理", - "manage-public-devices": "パブリックデバイスを管理する", - "manage-public-dashboards": "パブリックダッシュボードの管理", - "manage-customer-assets": "顧客アセットの管理", - "manage-public-assets": "パブリックアセットを管理する", - "add-customer-text": "新規顧客を追加", - "no-customers-text": "顧客が見つかりません", - "customer-details": "顧客情報", - "delete-customer-title": "'{{customerTitle}}'?", - "delete-customer-text": "確認後、顧客および関連するすべてのデータが回復不能になるので注意してください。", - "delete-customers-title": "{ count, plural, =1 {1 customer} other {# customers} }?", - "delete-customers-action-title": "{ count, plural, =1 {1 customer} other {# customers} }", - "delete-customers-text": "確認後、選択したすべての顧客は削除され、関連するすべてのデータは回復不能になります。", - "manage-users": "ユーザーを管理する", - "manage-assets": "アセットを管理する", - "manage-devices": "デバイスを管理する", - "manage-dashboards": "ダッシュボードの管理", - "title": "タイトル", - "title-required": "タイトルは必須です。", - "description": "説明", - "details": "詳細", - "events": "イベント", - "copyId": "顧客IDをコピー", - "idCopiedMessage": "顧客IDがクリップボードにコピーされました", - "select-customer": "顧客を選択", - "no-customers-matching": "'{{entity}}'発見されました。", - "customer-required": "顧客は必須です", - "select-default-customer": "デフォルトの顧客を選択", - "default-customer": "デフォルトの顧客", - "default-customer-required": "テナントレベルのダッシュボードをデバッグするには、デフォルトの顧客が必要です" - }, - "datetime": { - "date-from": "開始日", - "time-from": "開始時刻", - "date-to": "終了日", - "time-to": "終了時刻" - }, - "dashboard": { - "dashboard": "ダッシュボード", - "dashboards": "ダッシュボード", - "management": "ダッシュボード管理", - "view-dashboards": "ダッシュボードを表示する", - "add": "ダッシュボードを追加", - "assign-dashboard-to-customer": "顧客にダッシュボードを割り当てる", - "assign-dashboard-to-customer-text": "顧客に割り当てるダッシュボードを選択してください", - "assign-to-customer-text": "ダッシュボードを割り当てる顧客を選択してください", - "assign-to-customer": "顧客に割り当てる", - "unassign-from-customer": "顧客からの割り当て解除", - "make-public": "ダッシュボードを公開する", - "make-private": "ダッシュボードを非公開にする", - "manage-assigned-customers": "割り当てられた顧客を管理する", - "assigned-customers": "割り当てられた顧客", - "assign-to-customers": "顧客にダッシュボードを割り当てる", - "assign-to-customers-text": "ダッシュボードを割り当てる顧客を選択してください", - "unassign-from-customers": "顧客からのダッシュボードの割り当て解除", - "unassign-from-customers-text": "ダッシュボードから割り当て解除する顧客を選択してください", - "no-dashboards-text": "ダッシュボードが見つかりません", - "no-widgets": "ウィジェットは設定されていません", - "add-widget": "新しいウィジェットを追加", - "title": "タイトル", - "select-widget-title": "ウィジェットを選択", - "select-widget-subtitle": "利用可能なウィジェットタイプのリスト", - "delete": "ダッシュボードの削除", - "title-required": "タイトルは必須です。", - "description": "説明", - "details": "詳細", - "dashboard-details": "ダッシュボードの詳細", - "add-dashboard-text": "新しいダッシュボードを追加する", - "assign-dashboards": "ダッシュボードの割り当て", - "assign-new-dashboard": "新しいダッシュボードを割り当てる", - "assign-dashboards-text": "{ count, plural, =1 {1 dashboard} other {# dashboards} }顧客に", - "unassign-dashboards-action-text": "{ count, plural, =1 {1 dashboard} other {# dashboards} }顧客から", - "delete-dashboards": "ダッシュボードの削除", - "unassign-dashboards": "ダッシュボードの割り当てを解除する", - "unassign-dashboards-action-title": "{ count, plural, =1 {1 dashboard} other {# dashboards} }顧客から", - "delete-dashboard-title": "'{{dashboardTitle}}'?", - "delete-dashboard-text": "確認後、ダッシュボードとすべての関連データが回復不能になるので注意してください。", - "delete-dashboards-title": "{ count, plural, =1 {1 dashboard} other {# dashboards} }?", - "delete-dashboards-action-title": "{ count, plural, =1 {1 dashboard} other {# dashboards} }", - "delete-dashboards-text": "注意してください。確認後、選択したダッシュボードはすべて削除され、関連するすべてのデータは回復不能になります。", - "unassign-dashboard-title": "'{{dashboardTitle}}'?", - "unassign-dashboard-text": "確認後、ダッシュボードは割り当てられなくなり、顧客はアクセスできなくなります。", - "unassign-dashboard": "ダッシュボードの割り当てを解除する", - "unassign-dashboards-title": "{ count, plural, =1 {1 dashboard} other {# dashboards} }?", - "unassign-dashboards-text": "確認の後、選択したすべてのダッシュボードは割り当てられなくなり、顧客はアクセスできなくなります。", - "public-dashboard-title": "ダッシュボードは公開されました", - "public-dashboard-text": "{{dashboardTitle}} is now public and accessible via next public link:", - "public-dashboard-notice": "注:データにアクセスするために、関連するデバイスを公開することを忘れないでください。", - "make-private-dashboard-title": "'{{dashboardTitle}}'プライベート?", - "make-private-dashboard-text": "確認の後、ダッシュボードはプライベートにされ、他の人がアクセスすることはできません。", - "make-private-dashboard": "ダッシュボードを非公開にする", - "socialshare-text": "'{{dashboardTitle}}'ThingsBoardを搭載", - "socialshare-title": "'{{dashboardTitle}}'ThingsBoardを搭載", - "select-dashboard": "ダッシュボードを選択", - "no-dashboards-matching": "'{{entity}}'発見されました。", - "dashboard-required": "ダッシュボードが必要です。", - "select-existing": "既存のダッシュボードを選択", - "create-new": "新しいダッシュボードを作成する", - "new-dashboard-title": "新しいダッシュボードのタイトル", - "open-dashboard": "ダッシュボードを開く", - "set-background": "背景を設定する", - "background-color": "背景色", - "background-image": "背景画像", - "background-size-mode": "背景サイズモード", - "no-image": "選択した画像がありません", - "drop-image": "画像をドロップするか、クリックしてアップロードするファイルを選択します。", - "settings": "設定", - "columns-count": "列数", - "columns-count-required": "列数が必要です。", - "min-columns-count-message": "わずか10の最小列数が許可されます。", - "max-columns-count-message": "最大1000の列カウントのみが許可されます。", - "widgets-margins": "ウィジェット間のマージン", - "horizontal-margin": "水平マージン", - "horizontal-margin-required": "水平マージン設定が必要です。", - "min-horizontal-margin-message": "最小水平マージン値としては0だけが許容されます。", - "max-horizontal-margin-message": "最大水平マージン値は50だけです。", - "vertical-margin": "垂直マージン", - "vertical-margin-required": "垂直マージン設定が必要です。", - "min-vertical-margin-message": "最小の垂直マージン値として0のみが許可されます。", - "max-vertical-margin-message": "最大垂直マージン値は50のみです。", - "autofill-height": "自動レイアウトの高さ", - "mobile-layout": "モバイルレイアウトの設定", - "mobile-row-height": "モバイル行の高さ、px", - "mobile-row-height-required": "モバイル行の高さ値が必要です。", - "min-mobile-row-height-message": "最小の行の高さの値として、5ピクセルしか許可されません。", - "max-mobile-row-height-message": "移動可能な行の高さの最大値として許可されるのは200ピクセルだけです。", - "display-title": "ダッシュボードのタイトルを表示する", - "toolbar-always-open": "ツールバーを開いたままにする", - "title-color": "タイトルカラー", - "display-dashboards-selection": "ダッシュボードの選択を表示する", - "display-entities-selection": "エンティティの選択を表示する", - "display-dashboard-timewindow": "タイムウィンドウを表示する", - "display-dashboard-export": "エクスポートの表示", - "import": "ダッシュボードをインポート", - "export": "ダッシュボードをエクスポート", - "export-failed-error": "{{error}}", - "create-new-dashboard": "新しいダッシュボードを作成する", - "dashboard-file": "ダッシュボードファイル", - "invalid-dashboard-file-error": "ダッシュボードをインポートできません:ダッシュボードのデータ構造が無効です。", - "dashboard-import-missing-aliases-title": "インポートされたダッシュボードで使用されるエイリアスを設定する", - "create-new-widget": "新しいウィジェットを作成する", - "import-widget": "インポートウィジェット", - "widget-file": "ウィジェットファイル", - "invalid-widget-file-error": "ウィジェットをインポートできません:ウィジェットのデータ構造が無効です。", - "widget-import-missing-aliases-title": "インポートされたウィジェットで使用されるエイリアスを設定する", - "open-toolbar": "ダッシュボードツールバーを開く", - "close-toolbar": "ツールバーを閉じる", - "configuration-error": "設定エラー", - "alias-resolution-error-title": "ダッシュボードエイリアス設定エラー", - "invalid-aliases-config": "エイリアスフィルタの一部に一致するデバイスを見つけることができません。
この問題を解決するには、管理者に連絡してください。", - "select-devices": "デバイスの選択", - "assignedToCustomer": "顧客に割り当てられた", - "assignedToCustomers": "顧客に割り当てられた", - "public": "パブリック", - "public-link": "パブリックリンク", - "copy-public-link": "パブリックリンクをコピーする", - "public-link-copied-message": "ダッシュボードのパブリックリンクがクリップボードにコピーされました", - "manage-states": "ダッシュボードの状態を管理する", - "states": "ダッシュボードの状態", - "search-states": "検索ダッシュボードの状態", - "selected-states": "{ count, plural, =1 {1 dashboard state} other {# dashboard states} }選択された", - "edit-state": "ダッシュボードの状態を編集する", - "delete-state": "ダッシュボードの状態を削除する", - "add-state": "ダッシュボードの状態を追加する", - "state": "ダッシュボードの状態", - "state-name": "名", - "state-name-required": "ダッシュボードの状態名は必須です。", - "state-id": "状態ID", - "state-id-required": "ダッシュボードの状態IDは必須です。", - "state-id-exists": "同じIDを持つダッシュボードの状態は既に存在します。", - "is-root-state": "ルート状態", - "delete-state-title": "ダッシュボードの状態を削除する", - "delete-state-text": "'{{stateName}}'?", - "show-details": "詳細を表示", - "hide-details": "詳細を隠す", - "select-state": "ターゲット状態を選択する", - "state-controller": "状態コントローラ" - }, - "datakey": { - "settings": "設定", - "advanced": "カスタム", - "label": "ラベル", - "color": "色", - "units": "単位", - "decimals": "小数点以下の桁数", - "data-generation-func": "データ生成関数", - "use-data-post-processing-func": "データ後処理機能を使用する", - "configuration": "データキー設定", - "timeseries": "時系列", - "attributes": "属性", - "alarm": "アラームフィールド", - "timeseries-required": "エンティティの時系列データが必要です。", - "timeseries-or-attributes-required": "エンティティのtimeseries /属性は必須です。", - "maximum-timeseries-or-attributes": "{ count, plural, =1 {1 timeseries/attribute is allowed.} other {# timeseries/attributes are allowed} }", - "alarm-fields-required": "アラームフィールドが必要です。", - "function-types": "関数型", - "function-types-required": "関数型が必要です。", - "maximum-function-types": "{ count, plural, =1 {1 function type is allowed.} other {# function types are allowed} }" - }, - "datasource": { - "type": "データソースタイプ", - "name": "名", - "add-datasource-prompt": "データソースを追加してください" - }, - "details": { - "edit-mode": "編集モード", - "toggle-edit-mode": "編集モードを切り替える" - }, - "device": { - "device": "デバイス", - "device-required": "デバイスが必要です。", - "devices": "デバイス", - "management": "端末管理", - "view-devices": "デバイスの表示", - "device-alias": "デバイスエイリアス", - "aliases": "デバイスエイリアス", - "no-alias-matching": "'{{alias}}'見つかりません。", - "no-aliases-found": "別名は見つかりませんでした。", - "no-key-matching": "'{{key}}'見つかりません。", - "no-keys-found": "キーが見つかりません。", - "create-new-alias": "新しいものを作成してください!", - "create-new-key": "新しいものを作成してください!", - "duplicate-alias-error": "'{{alias}}'
デバイスエイリアスは、ダッシュボード内で一意である必要があります。", - "configure-alias": "'{{alias}}'エイリアス", - "no-devices-matching": "'{{entity}}'発見されました。", - "alias": "エイリアス", - "alias-required": "デバイスエイリアスが必要です。", - "remove-alias": "デバイスエイリアスを削除する", - "add-alias": "デバイスエイリアスを追加する", - "name-starts-with": "デバイス名はで始まります", - "device-list": "デバイスリスト", - "use-device-name-filter": "フィルタを使用する", - "device-list-empty": "デバイスが選択されていません。", - "device-name-filter-required": "デバイス名フィルタが必要です。", - "device-name-filter-no-device-matched": "'{{device}}'発見されました。", - "add": "デバイスを追加", - "assign-to-customer": "顧客に割り当てる", - "assign-device-to-customer": "顧客にデバイスを割り当てる", - "assign-device-to-customer-text": "顧客に割り当てるデバイスを選択してください", - "make-public": "端末を公開する", - "make-private": "デバイスを非公開にする", - "no-devices-text": "デバイスが見つかりません", - "assign-to-customer-text": "デバイスを割り当てる顧客を選択してください", - "device-details": "デバイスの詳細", - "add-device-text": "新しいデバイスを追加する", - "credentials": "資格情報", - "manage-credentials": "資格情報を管理する", - "delete": "デバイスを削除する", - "assign-devices": "デバイスを割り当てる", - "assign-devices-text": "{ count, plural, =1 {1 device} other {# devices} }顧客に", - "delete-devices": "デバイスを削除する", - "unassign-from-customer": "顧客からの割り当て解除", - "unassign-devices": "デバイスの割り当てを解除する", - "unassign-devices-action-title": "{ count, plural, =1 {1 device} other {# devices} }顧客から", - "assign-new-device": "新しいデバイスを割り当てる", - "make-public-device-title": "'{{deviceName}}'パブリック?", - "make-public-device-text": "確認後、デバイスとそのすべてのデータは公開され、他のユーザーがアクセスできるようになります。", - "make-private-device-title": "'{{deviceName}}'プライベート?", - "make-private-device-text": "確認後、デバイスとそのすべてのデータは非公開になり、他人がアクセスできなくなります。", - "view-credentials": "資格情報を表示する", - "delete-device-title": "'{{deviceName}}'?", - "delete-device-text": "確認後、デバイスと関連するすべてのデータが回復不能になるので注意してください。", - "delete-devices-title": "{ count, plural, =1 {1 device} other {# devices} }?", - "delete-devices-action-title": "{ count, plural, =1 {1 device} other {# devices} }", - "delete-devices-text": "注意してください。確認後、選択したすべてのデバイスが削除され、関連するすべてのデータは回復不能になります。", - "unassign-device-title": "'{{deviceName}}'?", - "unassign-device-text": "確認の後、デバイスは割り当てが解除され、顧客がアクセスできなくなります。", - "unassign-device": "デバイスの割り当てを解除する", - "unassign-devices-title": "{ count, plural, =1 {1 device} other {# devices} }?", - "unassign-devices-text": "確認の後、選択されたすべてのデバイスが割り当て解除され、顧客がアクセスできなくなります。", - "device-credentials": "デバイス資格情報", - "credentials-type": "資格情報タイプ", - "access-token": "アクセストークン", - "access-token-required": "アクセストークンが必要です。", - "access-token-invalid": "アクセストークンの長さは、1〜32文字でなければなりません。", - "secret": "秘密", - "secret-required": "秘密が必要です。", - "device-type": "デバイスタイプ", - "device-type-required": "デバイスタイプが必要です。", - "select-device-type": "デバイスタイプを選択", - "enter-device-type": "デバイスタイプを入力", - "any-device": "すべてのデバイス", - "no-device-types-matching": "'{{entitySubtype}}'発見されました。", - "device-type-list-empty": "選択されたデバイスタイプはありません。", - "device-types": "デバイスの種類", - "name": "名", - "name-required": "名前は必須です。", - "description": "説明", - "events": "イベント", - "details": "詳細", - "copyId": "デバイスIDをコピーする", - "copyAccessToken": "コピーアクセストークン", - "idCopiedMessage": "デバイスIDがクリップボードにコピーされました", - "accessTokenCopiedMessage": "デバイスアクセストークンがクリップボードにコピーされました", - "assignedToCustomer": "顧客に割り当てられた", - "unable-delete-device-alias-title": "デバイスエイリアスを削除できません", - "unable-delete-device-alias-text": "'{{deviceAlias}}'{{widgetsList}}", - "is-gateway": "ゲートウェイです", - "public": "パブリック", - "device-public": "デバイスは公開されています", - "select-device": "デバイスの選択" - }, - "dialog": { - "close": "ダイアログを閉じる" - }, - "error": { - "unable-to-connect": "サーバーに接続できません!インターネット接続を確認してください。", - "unhandled-error-code": "{{errorCode}}", - "unknown-error": "不明なエラー" - }, - "entity": { - "entity": "エンティティ", - "entities": "エンティティ", - "aliases": "エンティティエイリアス", - "entity-alias": "エンティティエイリアス", - "unable-delete-entity-alias-title": "エンティティエイリアスを削除できません", - "unable-delete-entity-alias-text": "'{{entityAlias}}'{{widgetsList}}", - "duplicate-alias-error": "'{{alias}}'
エンティティのエイリアスは、ダッシュボード内で一意である必要があります。", - "missing-entity-filter-error": "'{{alias}}'.", - "configure-alias": "'{{alias}}'エイリアス", - "alias": "エイリアス", - "alias-required": "エンティティエイリアスが必要です。", - "remove-alias": "エンティティエイリアスを削除する", - "add-alias": "エンティティエイリアスを追加する", - "entity-list": "エンティティリスト", - "entity-type": "エンティティタイプ", - "entity-types": "エンティティタイプ", - "entity-type-list": "エンティティタイプリスト", - "any-entity": "任意のエンティティ", - "enter-entity-type": "エンティティタイプを入力", - "no-entities-matching": "'{{entity}}'発見されました。", - "no-entity-types-matching": "'{{entityType}}'発見されました。", - "name-starts-with": "名前はで始まる", - "use-entity-name-filter": "フィルタを使用する", - "entity-list-empty": "選択されたエンティティはありません", - "entity-name-filter-required": "エンティティ名フィルタが必要です。", - "entity-name-filter-no-entity-matched": "'{{entity}}'発見されました。", - "all-subtypes": "すべて", - "select-entities": "エンティティの選択", - "no-aliases-found": "別名は見つかりませんでした。", - "no-alias-matching": "'{{alias}}'見つかりません。", - "create-new-alias": "新しいものを作成してください!", - "key": "キー", - "key-name": "キー名", - "no-keys-found": "キーが見つかりません。", - "no-key-matching": "'{{key}}'見つかりません。", - "create-new-key": "新しいものを作成してください!", - "type": "タイプ", - "type-required": "エンティティタイプが必要です。", - "type-device": "デバイス", - "type-devices": "デバイス", - "list-of-devices": "{ count, plural, =1 {One device} other {List of # devices} }", - "device-name-starts-with": "'{{prefix}}'", - "type-asset": "アセット", - "type-assets": "アセット", - "list-of-assets": "{ count, plural, =1 {One asset} other {List of # assets} }", - "asset-name-starts-with": "'{{prefix}}'", - "type-rule": "ルール", - "type-rules": "ルール", - "list-of-rules": "{ count, plural, =1 {One rule} other {List of # rules} }", - "rule-name-starts-with": "'{{prefix}}'", - "type-plugin": "プラグイン", - "type-plugins": "プラグイン", - "list-of-plugins": "{ count, plural, =1 {One plugin} other {List of # plugins} }", - "plugin-name-starts-with": "'{{prefix}}'", - "type-tenant": "テナント", - "type-tenants": "テナント", - "list-of-tenants": "{ count, plural, =1 {One tenant} other {List of # tenants} }", - "tenant-name-starts-with": "'{{prefix}}'", - "type-customer": "顧客", - "type-customers": "顧客", - "list-of-customers": "{ count, plural, =1 {One customer} other {List of # customers} }", - "customer-name-starts-with": "'{{prefix}}'", - "type-user": "ユーザー", - "type-users": "ユーザー", - "list-of-users": "{ count, plural, =1 {One user} other {List of # users} }", - "user-name-starts-with": "'{{prefix}}'", - "type-dashboard": "ダッシュボード", - "type-dashboards": "ダッシュボード", - "list-of-dashboards": "{ count, plural, =1 {One dashboard} other {List of # dashboards} }", - "dashboard-name-starts-with": "'{{prefix}}'", - "type-alarm": "アラーム", - "type-alarms": "アラーム", - "list-of-alarms": "{ count, plural, =1 {One alarms} other {List of # alarms} }", - "alarm-name-starts-with": "'{{prefix}}'", - "type-rulechain": "ルールチェーン", - "type-rulechains": "ルールチェーン", - "list-of-rulechains": "{ count, plural, =1 {One rule chain} other {List of # rule chains} }", - "rulechain-name-starts-with": "'{{prefix}}'", - "type-rulenode": "ルールノード", - "type-rulenodes": "ルールノード", - "list-of-rulenodes": "{ count, plural, =1 {One rule node} other {List of # rule nodes} }", - "rulenode-name-starts-with": "'{{prefix}}'", - "type-current-customer": "現在の顧客", - "search": "検索エンティティ", - "selected-entities": "{ count, plural, =1 {1 entity} other {# entities} }選択された", - "entity-name": "エンティティ名", - "details": "エンティティの詳細", - "no-entities-prompt": "エンティティが見つかりません", - "no-data": "表示するデータがありません" - }, - "event": { - "event-type": "イベントタイプ", - "type-error": "エラー", - "type-lc-event": "ライフサイクルイベント", - "type-stats": "統計", - "type-debug-rule-node": "デバッグ", - "type-debug-rule-chain": "デバッグ", - "no-events-prompt": "イベントは見つかりませんでした", - "error": "エラー", - "alarm": "警報", - "event-time": "イベント時間", - "server": "サーバ", - "body": "体", - "method": "方法", - "type": "タイプ", - "message-id": "メッセージID", - "message-type": "メッセージタイプ", - "data-type": "データ・タイプ", - "relation-type": "関係タイプ", - "metadata": "メタデータ", - "data": "データ", - "event": "イベント", - "status": "状態", - "success": "成功", - "failed": "失敗", - "messages-processed": "処理されたメッセージ", - "errors-occurred": "エラーが発生しました", + "access": { + "unauthorized": "未認証", + "unauthorized-access": "未認証アクセス", + "unauthorized-access-text": "このリソースにアクセスするにはサインインする必要があります!", + "access-forbidden": "アクセス禁止", + "access-forbidden-text": "この場所へのアクセス権がありません!
この場所にアクセスしたい場合は、別のユーザーでサインインしてみてください。", + "refresh-token-expired": "セッションの有効期限が切れました", + "refresh-token-failed": "セッションを更新できません", + "permission-denied": "権限がありません", + "permission-denied-text": "この操作を実行する権限がありません!" + }, + "account": { + "account": "アカウント", + "notification-settings": "通知設定" + }, + "action": { + "activate": "有効化", + "suspend": "一時停止", + "save": "保存", + "saveAs": "名前を付けて保存", + "move": "移動", + "cancel": "キャンセル", + "ok": "OK", + "delete": "削除", + "add": "追加", + "yes": "はい", + "no": "いいえ", + "update": "更新", + "remove": "除去", + "search": "検索", + "clear-search": "検索をクリア", + "assign": "割り当て", + "unassign": "割り当て解除", + "share": "共有", + "make-private": "非公開にする", + "apply": "適用", + "apply-changes": "変更を適用", + "edit-mode": "編集モード", + "enter-edit-mode": "編集モードに入る", + "decline-changes": "変更を破棄", + "decline": "拒否", + "close": "閉じる", + "back": "戻る", + "run": "実行", + "sign-in": "サインイン!", + "edit": "編集", + "view": "表示", + "create": "作成", + "drag": "ドラッグ", + "refresh": "更新", + "undo": "元に戻す", + "copy": "コピー", + "paste": "貼り付け", + "copy-reference": "参照をコピー", + "paste-reference": "参照を貼り付け", + "import": "インポート", + "export": "エクスポート", + "share-via": "{{provider}}で共有", + "select": "選択", + "continue": "続行", + "discard-changes": "変更を破棄", + "download": "ダウンロード", + "next": "次へ", + "next-with-label": "次へ: {{label}}", + "read-more": "詳細を見る", + "hide": "非表示", + "test": "テスト", + "done": "完了", + "print": "印刷", + "restore": "復元", + "confirm": "確認", + "more": "もっと見る", + "less": "折りたたむ", + "skip": "スキップ", + "send": "送信", + "reset": "リセット", + "show-more": "もっと表示", + "dont-show-again": "今後表示しない", + "see-documentation": "ドキュメントを見る", + "see-debug-events": "デバッグイベントを表示", + "clear": "クリア", + "upload": "アップロード", + "delete-anyway": "それでも削除", + "delete-selected": "選択したものを削除", + "set": "設定" + }, + "aggregation": { + "aggregation": "集計", + "function": "データ集計関数", + "limit": "最大値数", + "group-interval": "グループ化間隔", + "min": "最小", + "max": "最大", + "avg": "平均", + "sum": "合計", + "count": "件数", + "none": "なし" + }, + "admin": { + "settings": "設定", + "general": "一般", + "general-settings": "一般設定", + "home-settings": "ホーム設定", + "home": "ホーム", + "outgoing-mail": "メールサーバー", + "outgoing-mail-settings": "送信メールサーバー設定", + "system-settings": "システム設定", + "test-mail-sent": "テストメールが正常に送信されました!", + "base-url": "ベースURL", + "base-url-required": "ベースURLは必須です。", + "prohibit-different-url": "クライアントのリクエストヘッダーのホスト名の使用を禁止", + "prohibit-different-url-hint": "この設定は本番環境では有効にする必要があります。無効にするとセキュリティ上の問題が発生する可能性があります", + "device-connectivity": { + "device-connectivity": "デバイス接続", + "http-s": "HTTP(s)", + "mqtt-s": "MQTT(s)", + "coap-s": "COAP(s)", + "http": "HTTP", + "https": "HTTPs", + "mqtt": "MQTT", + "mqtts": "MQTTs", + "coap": "COAP", + "coaps": "COAPs", + "hint": "ホストまたはポートのフィールドが空の場合、デフォルトのプロトコル値が使用されます。", + "host": "ホスト", + "port": "ポート", + "port-pattern": "ポートは正の整数である必要があります。", + "port-range": "ポートは1〜65535の範囲である必要があります。" + }, + "mail-from": "送信元メール", + "mail-from-required": "送信元メールは必須です。", + "smtp-protocol": "SMTPプロトコル", + "smtp-host": "SMTPホスト", + "smtp-host-required": "SMTPホストは必須です。", + "smtp-port": "SMTPポート", + "smtp-port-required": "SMTPポートを指定する必要があります。", + "smtp-port-invalid": "有効なSMTPポートではないようです。", + "timeout-msec": "タイムアウト (msec)", + "timeout-required": "タイムアウトは必須です。", + "timeout-invalid": "有効なタイムアウトではないようです。", + "enable-tls": "TLSを有効化", + "tls-version": "TLSバージョン", + "enable-proxy": "プロキシを有効化", + "proxy-host": "プロキシホスト", + "proxy-host-required": "プロキシホストは必須です。", + "proxy-port": "プロキシポート", + "proxy-port-required": "プロキシポートは必須です。", + "proxy-port-range": "プロキシポートは1〜65535の範囲である必要があります。", + "proxy-user": "プロキシユーザー", + "proxy-password": "プロキシパスワード", + "change-password": "パスワードを変更", + "send-test-mail": "テストメールを送信", + "sms-provider": "SMSプロバイダー", + "sms-provider-settings": "SMSプロバイダー設定", + "sms-provider-type": "SMSプロバイダータイプ", + "sms-provider-type-required": "SMSプロバイダータイプは必須です。", + "sms-provider-type-aws-sns": "Amazon SNS", + "sms-provider-type-twilio": "Twilio", + "sms-provider-type-smpp": "SMPP", + "aws-access-key-id": "AWSアクセスキーID", + "aws-access-key-id-required": "AWSアクセスキーIDは必須です", + "aws-secret-access-key": "AWSシークレットアクセスキー", + "aws-secret-access-key-required": "AWSシークレットアクセスキーは必須です", + "aws-region": "AWSリージョン", + "aws-region-required": "AWSリージョンは必須です", + "number-from": "送信元電話番号", + "number-from-required": "送信元電話番号は必須です。", + "number-to": "送信先電話番号", + "number-to-required": "送信先電話番号は必須です。", + "phone-number-hint": "E.164形式の電話番号(例: +19995550123)", + "phone-number-hint-twilio": "E.164形式の電話番号/電話番号のSID/メッセージングサービスSID(例: +19995550123/PNXXX/MGXXX)", + "phone-number-pattern": "無効な電話番号です。E.164形式である必要があります(例: +19995550123)。", + "phone-number-pattern-twilio": "無効な電話番号です。E.164形式の電話番号/電話番号のSID/メッセージングサービスSIDである必要があります(例: +19995550123/PNXXX/MGXXX)。", + "sms-message": "SMSメッセージ", + "sms-message-required": "SMSメッセージは必須です。", + "sms-message-max-length": "SMSメッセージは1600文字を超えることはできません", + "twilio-account-sid": "TwilioアカウントSID", + "twilio-account-sid-required": "TwilioアカウントSIDは必須です", + "twilio-account-token": "Twilioアカウントトークン", + "twilio-account-token-required": "Twilioアカウントトークンは必須です", + "send-test-sms": "テストSMSを送信", + "test-sms-sent": "テストSMSが正常に送信されました!", + "security-settings": "セキュリティ設定", + "password-policy": "パスワードポリシー", + "minimum-password-length": "最小パスワード長", + "minimum-password-length-required": "最小パスワード長は必須です", + "minimum-password-length-range": "最小パスワード長は6〜50の範囲である必要があります", + "maximum-password-length": "最大パスワード長", + "maximum-password-length-min": "最大パスワード長は少なくとも6である必要があります", + "maximum-password-length-less-min": "最大パスワード長は最小長より大きい必要があります", + "minimum-uppercase-letters": "大文字の最小数", + "minimum-uppercase-letters-range": "大文字の最小数は負の値にはできません", + "minimum-lowercase-letters": "小文字の最小数", + "minimum-lowercase-letters-range": "小文字の最小数は負の値にはできません", + "minimum-digits": "数字の最小数", + "minimum-digits-range": "数字の最小数は負の値にはできません", + "minimum-special-characters": "特殊文字の最小数", + "minimum-special-characters-range": "特殊文字の最小数は負の値にはできません", + "password-expiration-period-days": "パスワード有効期限日数", + "password-expiration-period-days-range": "パスワード有効期限日数は負の値にはできません", + "password-reuse-frequency-days": "パスワード再利用間隔日数", + "password-reuse-frequency-days-range": "パスワード再利用間隔日数は負の値にはできません", + "allow-whitespace": "空白を許可", + "force-reset-password-if-no-valid": "無効な場合はパスワードのリセットを強制", + "force-reset-password-if-no-valid-hint": "この機能を有効にする場合は注意してください。有効にすると、無効なパスワードのユーザーはemailでパスワードをリセットする必要があります。", + "general-policy": "一般ポリシー", + "max-failed-login-attempts": "アカウントがロックされるまでのログイン失敗回数の上限", + "minimum-max-failed-login-attempts-range": "ログイン失敗回数の上限は負の値にはできません", + "user-lockout-notification-email": "ユーザーアカウントがロックアウトされた場合、emailに通知を送信", + "user-activation-token-ttl": "ユーザー有効化リンクのTTL(時間)", + "user-activation-token-ttl-range": "ユーザー有効化リンクのTTLは1〜24時間の範囲である必要があります", + "password-reset-token-ttl": "パスワードリセットリンクのTTL(時間)", + "password-reset-token-ttl-range": "パスワードリセットリンクのTTLは1〜24時間の範囲である必要があります", + "mobile-secret-key-length": "モバイルシークレットキー長", + "mobile-secret-key-length-range": "モバイルシークレットキー長は正の値である必要があります", + "domain-name": "ドメイン名", + "domain-name-unique": "ドメイン名とプロトコルは一意である必要があります。", + "domain-name-max-length": "ドメイン名は256未満である必要があります", + "error-verification-url": "ドメイン名に記号'/'および':'を含めることはできません。例: thingsboard.io", + "connection-settings": "接続設定", + "oauth2": { + "access-token-uri": "アクセストークンURI", + "access-token-uri-required": "アクセストークンURIは必須です。", + "activate-user": "ユーザーを有効化", + "add-domain": "ドメインを追加", + "delete-domain": "ドメインを削除", + "add-provider": "プロバイダーを追加", + "delete-provider": "プロバイダーを削除", + "allow-user-creation": "ユーザー作成を許可", + "always-fullscreen": "常に全画面表示", + "authorization-uri": "認可URI", + "authorization-uri-required": "認可URIは必須です。", + "add-client": "OAuth 2.0クライアントを追加", + "client-details": "OAuth 2.0クライアント詳細", + "client": "OAuth 2.0クライアント", + "clients": "OAuth 2.0クライアント", + "no-oauth2-clients": "OAuth 2.0クライアントが見つかりません", + "search-oauth2-clients": "OAuth 2.0クライアントを検索", + "delete-client-title": "OAuth 2.0クライアント'{{clientName}}'を削除してもよろしいですか?", + "delete-client-text": "注意: 確認後、クライアントと関連データはすべて復元できなくなります。", + "delete-mobile-app-title": "モバイルアプリケーション'{{applicationName}}'を削除してもよろしいですか?", + "delete-mobile-app-text": "注意: 確認後、モバイルアプリケーションと関連データはすべて復元できなくなります。", + "title": "タイトル", + "client-title-required": "タイトルは必須です", + "client-title-max-length": "タイトルは100未満である必要があります", + "advanced-settings": "詳細設定", + "domain-details": "ドメイン詳細", + "no-domains": "ドメインが見つかりません", + "search-domains": "ドメインを検索", + "mobile-app-details": "モバイルアプリケーション詳細", + "add-mobile-app": "モバイルアプリケーションを追加", + "no-mobile-apps": "モバイルアプリケーションが見つかりません", + "search-mobile-apps": "モバイルアプリケーションを検索", + "send-token": "トークンを送信", + "create-new": "新規作成", + "client-authentication-method": "クライアント認証方式", + "client-id": "クライアントID", + "client-id-required": "クライアントIDは必須です。", + "client-id-max-length": "クライアントIDは256未満である必要があります", + "client-secret": "クライアントシークレット", + "client-secret-required": "クライアントシークレットは必須です。", + "client-secret-max-length": "クライアントシークレットは2049未満である必要があります", + "custom-setting": "カスタム設定", + "customer-name-pattern": "顧客名パターン", + "customer-name-pattern-max-length": "顧客名パターンは256未満である必要があります", + "default-dashboard-name": "デフォルトダッシュボード名", + "default-dashboard-name-max-length": "デフォルトダッシュボード名は256未満である必要があります", + "delete-domain-text": "注意: 確認後、ドメインおよびすべてのプロバイダーデータは利用できなくなります。", + "delete-domain-title": "ドメイン'{{domainName}}'を削除してもよろしいですか?", + "delete-registration-text": "注意: 確認後、プロバイダーデータは利用できなくなります。", + "delete-registration-title": "プロバイダー'{{name}}'を削除してもよろしいですか?", + "email-attribute-key": "Email属性キー", + "email-attribute-key-required": "Email属性キーは必須です。", + "email-attribute-key-max-length": "Email属性キーは32未満である必要があります", + "first-name-attribute-key": "名属性キー", + "first-name-attribute-key-max-length": "名属性キーは32未満である必要があります", + "general": "一般", + "jwk-set-uri": "JSON Web Key URI", + "last-name-attribute-key": "姓属性キー", + "last-name-attribute-key-max-length": "姓属性キーは32未満である必要があります", + "login-button-icon": "ログインボタンアイコン", + "login-button-label": "プロバイダーラベル", + "login-button-label-placeholder": "$(Provider label)でログイン", + "login-button-label-required": "ラベルは必須です。", + "login-provider": "ログインプロバイダー", + "mapper": "マッパー", + "new-domain": "新しいドメイン", + "oauth2": "OAuth 2.0", + "password-max-length": "パスワードは256未満である必要があります", + "redirect-uri-template": "リダイレクトURIテンプレート", + "copy-redirect-uri": "リダイレクトURIをコピー", + "registration-id": "登録ID", + "registration-id-required": "登録IDは必須です。", + "registration-id-unique": "登録IDはシステム内で一意である必要があります。", + "scope": "スコープ", + "scope-required": "スコープは必須です。", + "tenant-name-pattern": "テナント名パターン", + "tenant-name-pattern-required": "テナント名パターンは必須です。", + "tenant-name-pattern-max-length": "テナント名パターンは256未満である必要があります", + "tenant-name-strategy": "テナント名戦略", + "type": "マッパータイプ", + "uri-pattern-error": "無効なURI形式です。", + "url": "URL", + "url-pattern": "無効なURL形式です。", + "url-required": "URLは必須です。", + "url-max-length": "URLは256未満である必要があります", + "user-info-uri": "ユーザー情報URI", + "user-info-uri-required": "ユーザー情報URIは必須です。", + "username-max-length": "ユーザー名は256未満である必要があります", + "user-name-attribute-name": "ユーザー名属性キー", + "user-name-attribute-name-required": "ユーザー名属性キーは必須です", + "protocol": "プロトコル", + "domain-schema-http": "HTTP", + "domain-schema-https": "HTTPS", + "domain-schema-mixed": "HTTP+HTTPS", + "enable": "OAuth 2.0設定を有効化", + "disable": "OAuth 2.0設定を無効化", + "edge": "Edgeへ伝播", + "edge-enable": "Edgeへの伝播を有効化", + "edge-disable": "Edgeへの伝播を無効化", + "domains": "ドメイン", + "mobile-apps": "モバイルアプリケーション", + "mobile-package": "アプリケーションパッケージ", + "mobile-package-placeholder": "例: my.example.app", + "mobile-package-hint": "Androidの場合: 独自の一意なApplication ID。iOSの場合: Product bundle identifier。", + "mobile-package-unique": "アプリケーションパッケージは一意である必要があります。", + "mobile-package-required": "アプリケーションパッケージは必須です。", + "mobile-package-max-length": "アプリケーションパッケージは256未満である必要があります", + "mobile-package-spaces": "アプリケーションパッケージに空白を含めることはできません", + "mobile-app-secret": "アプリケーションシークレット", + "mobile-app-secret-hint": "少なくとも512ビットのデータを表すBase64エンコード文字列。", + "mobile-app-secret-required": "アプリケーションシークレットは必須です。", + "mobile-app-secret-min-length": "アプリケーションシークレットは少なくとも512ビットのデータである必要があります。", + "mobile-app-secret-base64": "アプリケーションシークレットはBase64形式である必要があります。", + "invalid-mobile-app-secret": "アプリケーションシークレットは英数字のみを含み、16〜2048文字の長さである必要があります。", + "copy-mobile-app-secret": "アプリケーションシークレットをコピー", + "delete-mobile-app": "アプリケーション情報を削除", + "providers": "プロバイダー", + "platform-web": "Web", + "platform-android": "Android", + "platform-ios": "iOS", + "all-platforms": "すべてのプラットフォーム", + "smtp-provider": "SMTPプロバイダー", + "allowed-platforms": "許可されたプラットフォーム", + "authentication": "認証", + "basic": "基本", + "provider": "プロバイダー", + "redirect-url": "リダイレクトURI", + "domain-name": "ドメイン名", + "domain-name-required": "ドメイン名は必須です", + "redirect-url-template": "リダイレクトURIテンプレート", + "microsoft-tenant-id": "ディレクトリ(テナント)ID", + "microsoft-tenant-id-required": "ディレクトリ(テナント)IDは必須です", + "token-uri": "トークンURI", + "token-uri-required": "トークンURIは必須です", + "redirect-uri": "リダイレクトURI", + "google-provider": "Google", + "microsoft-provider": "Office 365", + "sendgrid-provider": "Sendgrid", + "custom-provider": "カスタム", + "generate-access-token": "アクセストークンを生成", + "update-access-token": "アクセストークンを更新", + "access-token-status": "アクセストークンのステータス:", + "token-status-generated": "生成済み", + "token-status-not-generated": "未生成" + }, + "smpp-provider": { + "smpp-version": "SMPPバージョン", + "smpp-host": "SMPPホスト", + "smpp-host-required": "SMPPホストは必須です", + "smpp-port": "SMPPポート", + "smpp-port-required": "SMPPポートは必須です", + "system-id": "システムID", + "system-id-required": "システムIDは必須です", + "password": "パスワード", + "password-required": "パスワードは必須です", + "type-settings": "タイプ設定", + "source-settings": "送信元設定", + "destination-settings": "宛先設定", + "additional-settings": "追加設定", + "system-type": "システムタイプ", + "bind-type": "バインドタイプ", + "service-type": "サービス種別", + "source-address": "送信元アドレス", + "source-ton": "送信元TON", + "source-npi": "送信元NPI", + "destination-ton": "宛先TON (番号種別)", + "destination-npi": "宛先NPI (番号計画識別)", + "address-range": "アドレス範囲", + "coding-scheme": "符号化方式", + "bind-type-tx": "送信", + "bind-type-rx": "受信", + "bind-type-trx": "送受信", + "ton-unknown": "不明", + "ton-international": "国際", + "ton-national": "国内", + "ton-network-specific": "ネットワーク固有", + "ton-subscriber-number": "加入者番号", + "ton-alphanumeric": "英数字", + "ton-abbreviated": "短縮", + "npi-unknown": "0 - 不明", + "npi-isdn": "1 - ISDN/電話番号計画 (E163/E164)", + "npi-data-numbering-plan": "3 - データ番号計画 (X.121)", + "npi-telex-numbering-plan": "4 - テレックス番号計画 (F.69)", + "npi-land-mobile": "6 - 陸上移動 (E.212)", + "npi-national-numbering-plan": "8 - 国内番号計画", + "npi-private-numbering-plan": "9 - 私設番号計画", + "npi-ermes-numbering-plan": "10 - ERMES番号計画 (ETSI DE/PS 3 01-3)", + "npi-internet": "13 - インターネット (IP)", + "npi-wap-client-id": "18 - WAPクライアントID (WAP Forumにより定義予定)", + "scheme-smsc": "0 - SMSC デフォルトアルファベット (短番号/長番号はASCII、フリーダイヤルはGSM)", + "scheme-ia5": "1 - IA5 (短番号/長番号はASCII、フリーダイヤルはLatin 9 (ISO-8859-9))", + "scheme-octet-unspecified-2": "2 - オクテット未指定 (8ビットバイナリ)", + "scheme-latin-1": "3 - Latin 1 (ISO-8859-1)", + "scheme-octet-unspecified-4": "4 - オクテット未指定 (8ビットバイナリ)", + "scheme-jis": "5 - JIS (X 0208-1990)", + "scheme-cyrillic": "6 - Cyrillic (ISO-8859-5)", + "scheme-latin-hebrew": "7 - Latin/Hebrew (ISO-8859-8)", + "scheme-ucs-utf": "8 - UCS2/UTF-16 (ISO/IEC-10646)", + "scheme-pictogram-encoding": "9 - ピクトグラムエンコーディング", + "scheme-music-codes": "10 - 音楽コード (ISO-2022-JP)", + "scheme-extended-kanji-jis": "13 - 拡張漢字JIS (X 0212-1990)", + "scheme-korean-graphic-character-set": "14 - 韓国語グラフィック文字セット (KS C 5601/KS X 1001)" + }, + "queue-select-name": "キュー名を選択", + "queue-name": "名前", + "queue-name-required": "キュー名は必須です!", + "queues": "キュー", + "queue-partitions": "パーティション", + "queue-submit-strategy": "投入戦略", + "queue-processing-strategy": "処理戦略", + "queue-configuration": "キュー設定", + "repository-settings": "リポジトリ設定", + "repository": "リポジトリ", + "repository-url": "リポジトリURL", + "repository-url-required": "リポジトリURLは必須です。", + "default-branch": "デフォルトブランチ名", + "repository-read-only": "読み取り専用", + "show-merge-commits": "マージコミットを表示", + "authentication-settings": "認証設定", + "auth-method": "認証方式", + "auth-method-username-password": "パスワード / アクセストークン", + "auth-method-username-password-hint": "GitHubユーザーは、リポジトリへの書き込み権限を持つアクセストークンを必ず使用する必要があります。", + "auth-method-private-key": "秘密鍵", + "password-access-token": "パスワード / アクセストークン", + "change-password-access-token": "パスワード / アクセストークンを変更", + "private-key": "秘密鍵", + "drop-private-key-file-or": "秘密鍵ファイルをドラッグ&ドロップするか、または", + "passphrase": "パスフレーズ", + "enter-passphrase": "パスフレーズを入力", + "change-passphrase": "パスフレーズを変更", + "check-access": "アクセスを確認", + "check-repository-access-success": "リポジトリへのアクセスが正常に検証されました!", + "delete-repository-settings-title": "リポジトリ設定を削除してもよろしいですか?", + "delete-repository-settings-text": "注意: 確認後、リポジトリ設定は削除され、バージョン管理機能は利用できなくなります。", + "auto-commit-settings": "自動コミット設定", + "auto-commit": "自動コミット", + "auto-commit-entities": "自動コミット対象エンティティ", + "no-auto-commit-entities-prompt": "自動コミット用に設定されたエンティティがありません", + "delete-auto-commit-settings-title": "自動コミット設定を削除してもよろしいですか?", + "delete-auto-commit-settings-text": "注意: 確認後、自動コミット設定は削除され、すべてのエンティティで自動コミットが無効になります。", + "mobile-app": { + "mobile-app": "モバイルアプリ", + "mobile-app-qr-code-widget-settings": "モバイルアプリQRコードウィジェット設定", + "applications": "アプリケーション", + "default": "デフォルト", + "custom": "カスタム", + "android": "Android", + "ios": "iOS", + "appearance": "外観", + "appearance-on-home-page": "ホームページでの表示", + "enabled": "有効", + "disabled": "無効", + "badges": "バッジ", + "label": "ラベル", + "label-required": "ラベルは必須です", + "label-max-length": "ラベルは50文字以下である必要があります", + "right": "右", + "left": "左", + "set": "設定", + "preview": "プレビュー", + "connect-mobile-app": "モバイルアプリを接続", + "use-system-settings": "システム設定を使用" + }, + "2fa": { + "2fa": "二要素認証", + "available-providers": "利用可能なプロバイダー", + "available-providers-required": "少なくとも 1 つの 2FA プロバイダーを設定してください。", + "issuer-name": "発行者名", + "issuer-name-required": "発行者名は必須です。", + "max-verification-failures-before-user-lockout": "ユーザーがロックアウトされるまでの検証失敗回数の上限", + "max-verification-failures-before-user-lockout-pattern": "検証失敗回数の上限は正の整数である必要があります。", + "number-of-checking-attempts": "チェック試行回数", + "number-of-checking-attempts-pattern": "チェック試行回数は正の整数である必要があります。", + "number-of-checking-attempts-required": "チェック試行回数は必須です。", + "number-of-codes": "コード数", + "number-of-codes-pattern": "コード数は正の整数である必要があります。", + "number-of-codes-required": "コード数は必須です。", + "provider": "プロバイダー", + "retry-verification-code-period": "検証コード再試行間隔(秒)", + "retry-verification-code-period-pattern": "最小間隔は5秒です", + "retry-verification-code-period-required": "検証コード再試行間隔は必須です。", + "total-allowed-time-for-verification": "検証の許容合計時間(秒)", + "total-allowed-time-for-verification-pattern": "許容合計時間の最小値は60秒です", + "total-allowed-time-for-verification-required": "許容合計時間は必須です。", + "use-system-two-factor-auth-settings": "システムの二要素認証設定を使用", + "verification-code-check-rate-limit": "検証コードチェックのレート制限", + "verification-code-lifetime": "検証コード有効期限(秒)", + "verification-code-lifetime-pattern": "検証コード有効期限は正の整数である必要があります。", + "verification-code-lifetime-required": "検証コード有効期限は必須です。", + "verification-message-template": "検証メッセージテンプレート", + "verification-limitations": "検証の制限", + "verification-message-template-pattern": "検証メッセージには次のパターンを含める必要があります: ${code}", + "verification-message-template-required": "検証メッセージテンプレートは必須です。", + "within-time": "時間内(秒)", + "within-time-pattern": "時間は正の整数である必要があります。", + "within-time-required": "時間は必須です。", + "force-2fa": "二要素認証を強制", + "enforce-for": "適用対象" + }, + "jwt": { + "security-settings": "JWTセキュリティ設定", + "issuer-name": "発行者名", + "issuer-name-required": "発行者名は必須です。", + "signings-key": "署名キー", + "signings-key-hint": "少なくとも512ビットのデータを表すBase64エンコード文字列。", + "signings-key-required": "署名キーは必須です。", + "signings-key-min-length": "署名キーは少なくとも512ビットのデータである必要があります。", + "signings-key-base64": "署名キーはbase64形式である必要があります。", + "expiration-time": "トークン有効期限 (秒)", + "expiration-time-required": "トークン有効期限は必須です。", + "expiration-time-max": "最大許容時間は2147483647秒(68年)です。", + "expiration-time-min": "最小時間は60秒 (1分)です。", + "refresh-expiration-time": "リフレッシュトークン有効期限 (秒)", + "refresh-expiration-time-required": "リフレッシュトークン有効期限は必須です。", + "refresh-expiration-time-max": "最大許容時間は2147483647秒 (68年)です。", + "refresh-expiration-time-min": "最小時間は900秒 (15分)です。", + "refresh-expiration-time-less-token": "リフレッシュトークンの時間はトークンの時間より大きい必要があります。", + "generate-key": "キーを生成", + "info-header": "すべてのユーザーは再ログインが必要になります", + "info-message": "JWT署名キーを変更すると、発行済みのすべてのトークンが無効になります。すべてのユーザーは再ログインが必要になります。これはRest API/Websocketsを使用するスクリプトにも影響します。" + }, + "resources": "リソース", + "notifications": "通知", + "notifications-settings": "通知設定", + "slack-api-token": "Slack APIトークン", + "slack": "Slack", + "slack-settings": "Slack設定", + "mobile-settings": "モバイル設定", + "firebase-service-account-file": "Firebaseサービスアカウント認証情報JSONファイル", + "select-firebase-service-account-file": "Firebaseサービスアカウント認証情報ファイルをドラッグ&ドロップするか、または " + }, + "alarm": { + "alarm": "アラーム", + "alarm-list": "アラーム一覧", + "alarms": "アラーム", + "all-alarms": "すべてのアラーム", + "select-alarm": "アラームを選択", + "no-alarms-matching": "'{{entity}}'に一致するアラームが見つかりません。", + "alarm-required": "アラームは必須です", + "alarm-filter": "アラームフィルター", + "filter": "フィルター", + "alarm-status": "アラームステータス", + "alarm-status-list": "アラームステータス一覧", + "any-status": "すべてのステータス", + "search-status": { + "ANY": "すべて", + "ACTIVE": "アクティブ", + "CLEARED": "クリア済み", + "ACK": "確認済み", + "UNACK": "未確認" + }, + "display-status": { + "ACTIVE_UNACK": "アクティブ 未確認", + "ACTIVE_ACK": "アクティブ 確認済み", + "CLEARED_UNACK": "クリア済み 未確認", + "CLEARED_ACK": "クリア済み 確認済み" + }, + "no-alarms-prompt": "アラームが見つかりません", + "created-time": "作成日時", + "type": "タイプ", + "severity": "重要度", + "originator": "発生元", + "originator-type": "発生元タイプ", + "details": "詳細", + "originator-label": "発生元ラベル", + "assign": "割り当て", + "assignments": "割り当て", + "assignee": "担当者", + "assignee-id": "担当者ID", + "assignee-first-name": "担当者名", + "assignee-last-name": "担当者姓", + "assignee-email": "担当者Email", + "unassigned": "未割り当て", + "user-deleted": "ユーザーが削除されました", + "assignee-not-set": "すべて", + "status": "ステータス", + "alarm-details": "アラーム詳細", + "start-time": "開始日時", + "assign-time": "割り当て日時", + "end-time": "終了日時", + "ack-time": "確認日時", + "clear-time": "クリア日時", + "duration": "継続時間", + "alarm-severity": "アラーム重要度", + "alarm-severity-list": "アラーム重要度一覧", + "any-severity": "すべての重要度", + "severity-critical": "致命的", + "severity-major": "重大", + "severity-minor": "軽微", + "severity-warning": "警告", + "severity-indeterminate": "未確定", + "acknowledge": "確認", + "clear": "クリア", + "delete": "削除", + "search": "アラームを検索", + "selected-alarms": "{ count, plural, =1 {1 件のアラーム} other {# 件のアラーム} } を選択", + "no-data": "表示するデータがありません", + "polling-interval": "アラームポーリング間隔 (秒)", + "polling-interval-required": "アラームポーリング間隔は必須です。", + "min-polling-interval-message": "ポーリング間隔の最小値は1秒です。", + "aknowledge-alarms-title": "{ count, plural, =1 {1 件のアラーム} other {# 件のアラーム} } を確認", + "aknowledge-alarms-text": "{ count, plural, =1 {1 件のアラーム} other {# 件のアラーム} } を確認してもよろしいですか?", + "aknowledge-alarm-title": "アラームを確認", + "aknowledge-alarm-text": "アラームを確認してもよろしいですか?", + "selected-alarms-are-acknowledged": "選択したアラームはすでに確認済みです", + "clear-alarms-title": "{ count, plural, =1 {1 件のアラーム} other {# 件のアラーム} } をクリア", + "clear-alarms-text": "{ count, plural, =1 {1 件のアラーム} other {# 件のアラーム} } をクリアしてもよろしいですか?", + "clear-alarm-title": "アラームをクリア", + "clear-alarm-text": "アラームをクリアしてもよろしいですか?", + "delete-alarms-title": "{ count, plural, =1 {1 件のアラーム} other {# 件のアラーム} } を削除", + "delete-alarms-text": "{ count, plural, =1 {1 件のアラーム} other {# 件のアラーム} } を削除してもよろしいですか?", + "selected-alarms-are-cleared": "選択したアラームはすでにクリア済みです", + "alarm-status-filter": "アラームステータスフィルター", + "alarm-filter-title": "アラームフィルター", + "assigned": "割り当て済み", + "filter-title": "フィルター", + "max-count-load": "読み込むアラーム数の上限 (0 - 無制限)", + "max-count-load-required": "読み込むアラーム数の上限は必須です。", + "max-count-load-error-min": "最小値は0です。", + "fetch-size": "フェッチサイズ", + "fetch-size-required": "フェッチサイズは必須です。", + "fetch-size-error-min": "最小値は10です。", + "alarm-types": "アラームタイプ", + "alarm-type-list": "アラームタイプ一覧", + "any-type": "すべてのタイプ", + "assigned-to-current-user": "現在のユーザーに割り当て済み", + "assigned-to-me": "自分に割り当て済み", + "search-propagated-alarms": "伝播したアラームを検索", + "comments": "アラームコメント", + "show-more": "もっと表示", + "additional-info": "追加情報", + "alarm-type": "アラームタイプ", + "enter-alarm-type": "アラームタイプを入力", + "no-alarm-types-matching": "'{{entitySubtype}}'に一致するアラームタイプが見つかりません。", + "alarm-type-list-empty": "選択されたアラームタイプがありません。", + "system-comments": { + "acked-by-user": "アラームはユーザー {{userName}} により確認されました", + "cleared-by-user": "アラームはユーザー {{userName}} によりクリアされました", + "assigned-to-user": "アラームはユーザー {{userName}} によりユーザー {{assigneeName}} に割り当てられました", + "unassigned-to-user": "アラームの割り当てはユーザー {{userName}} により解除されました", + "unassigned-from-deleted-user": "ユーザー {{userName}} - が削除されたため、アラームの割り当てが解除されました", + "comment-deleted": "ユーザー {{userName}} が自分のコメントを削除しました", + "severity-changed": "アラームの重大度が {{oldSeverity}} から {{newSeverity}} に更新されました" + } + }, + "alarm-activity": { + "add": "コメントを追加...", + "alarm-comment": "アラームコメント", + "comments": "コメント", + "delete-alarm-comment": "このコメントを削除しますか?", + "refresh": "更新", + "oldest-first": "古い順", + "newest-first": "新しい順", + "activity": "アクティビティ", + "export": "CSVにエクスポート", + "author": "作成者", + "created-date": "作成日時", + "edited-date": "編集日時", + "text": "テキスト", + "system": "システム" + }, + "alias": { + "add": "エイリアスを追加", + "edit": "エイリアスを編集", + "name": "エイリアス名", + "name-required": "エイリアス名は必須です", + "duplicate-alias": "同じ名前のエイリアスはすでに存在します。", + "filter-type-single-entity": "単一エンティティ", + "filter-type-entity-list": "エンティティ一覧", + "filter-type-entity-name": "エンティティ名", + "filter-type-entity-type": "エンティティタイプ", + "filter-type-state-entity": "ダッシュボード状態のエンティティ", + "filter-type-state-entity-description": "ダッシュボード状態パラメータから取得したエンティティ", + "filter-type-asset-type": "アセットタイプ", + "filter-type-asset-type-description": "タイプ '{{assetTypes}}' のアセット", + "filter-type-asset-type-and-name-description": "タイプ '{{assetTypes}}' で、名前が'{{prefix}}'で始まるアセット", + "filter-type-device-type": "デバイスタイプ", + "filter-type-device-type-description": "タイプ '{{deviceTypes}}' のデバイス", + "filter-type-device-type-and-name-description": "タイプ '{{deviceTypes}}' で、名前が'{{prefix}}'で始まるデバイス", + "filter-type-entity-view-type": "エンティティビュータイプ", + "filter-type-entity-view-type-description": "タイプ '{{entityViewTypes}}' のエンティティビュー", + "filter-type-entity-view-type-and-name-description": "タイプ '{{entityViewTypes}}' で、名前が'{{prefix}}'で始まるエンティティビュー", + "filter-type-edge-type": "Edgeタイプ", + "filter-type-edge-type-description": "タイプ '{{edgeTypes}}' のEdges", + "filter-type-edge-type-and-name-description": "タイプ '{{edgeTypes}}' で、名前が'{{prefix}}'で始まるEdges", + "filter-type-relations-query": "関係クエリ", + "filter-type-relations-query-description": "{{rootEntity}} {{direction}} の {{relationType}} 関係を持つ {{entities}}", + "filter-type-edge-search-query": "Edge検索クエリ", + "filter-type-edge-search-query-description": "{{rootEntity}} {{direction}} の {{relationType}} 関係を持つタイプ {{edgeTypes}} のEdges", + "filter-type-asset-search-query": "アセット検索クエリ", + "filter-type-asset-search-query-description": "{{rootEntity}} {{direction}} の {{relationType}} 関係を持つタイプ {{assetTypes}} のアセット", + "filter-type-device-search-query": "デバイス検索クエリ", + "filter-type-device-search-query-description": "{{rootEntity}} {{direction}} の {{relationType}} 関係を持つタイプ {{deviceTypes}} のデバイス", + "filter-type-entity-view-search-query": "エンティティビュー検索クエリ", + "filter-type-entity-view-search-query-description": "{{rootEntity}} {{direction}} の {{relationType}} 関係を持つタイプ {{entityViewTypes}} のエンティティビュー", + "filter-type-apiUsageState": "API使用状況", + "entity-filter": "エンティティフィルター", + "resolve-multiple": "複数エンティティとして解決", + "resolve-multiple-hint": "有効にすると、フィルターされたすべてのエンティティのデータを同時に描画します。\n無効の場合、ウィジェットは選択されたエンティティのデータのみを表示します。", + "filter-type": "フィルタータイプ", + "filter-type-required": "フィルタータイプは必須です。", + "entity-filter-no-entity-matched": "指定されたフィルターに一致するエンティティが見つかりません。", + "no-entity-filter-specified": "エンティティフィルターが指定されていません", + "root-state-entity": "ダッシュボード状態のエンティティをルートとして使用", + "last-level-relation": "最終レベルの関係のみ取得", + "root-entity": "ルートエンティティ", + "state-entity-parameter-name": "状態エンティティパラメータ名", + "default-state-entity": "デフォルト状態エンティティ", + "default-entity-parameter-name": "デフォルト", + "query-options": "クエリオプション", + "max-relation-level": "最大関係レベル", + "unlimited-level": "無制限レベル", + "state-entity": "ダッシュボード状態エンティティ", + "all-entities": "すべてのエンティティ", + "any-relation": "任意" + }, + "asset": { + "asset": "アセット", + "assets": "アセット", + "management": "アセット管理", + "view-assets": "アセットを表示", + "add": "アセットを追加", + "asset-type-max-length": "アセットタイプは256未満である必要があります", + "assign-to-customer": "顧客に割り当て", + "assign-asset-to-customer": "顧客にアセットを割り当て", + "assign-asset-to-customer-text": "顧客に割り当てるアセットを選択してください", + "no-assets-text": "アセットが見つかりません", + "assign-to-customer-text": "アセットを割り当てる顧客を選択してください", + "public": "公開", + "assignedToCustomer": "顧客に割り当て済み", + "make-public": "アセットを公開にする", + "make-private": "アセットを非公開にする", + "unassign-from-customer": "顧客から割り当て解除", + "delete": "アセットを削除", + "asset-public": "アセットは公開されています", + "asset-type": "アセットタイプ", + "asset-type-required": "アセットタイプは必須です。", + "select-asset-type": "アセットタイプを選択", + "enter-asset-type": "アセットプロファイルを入力", + "any-asset": "任意のアセット", + "no-asset-types-matching": "'{{entitySubtype}}'に一致するアセットタイプが見つかりません。", + "asset-type-list-empty": "選択されたアセットタイプがありません。", + "asset-types": "アセットタイプ", + "name": "名前", + "name-required": "名前は必須です。", + "name-max-length": "名前は256未満である必要があります", + "label-max-length": "ラベルは256未満である必要があります", + "description": "説明", + "description-required": "説明は必須です。", + "type": "タイプ", + "type-required": "タイプは必須です。", + "details": "詳細", + "events": "イベント", + "add-asset-text": "新しいアセットを追加", + "asset-details": "アセット詳細", + "assign-assets": "アセットを割り当て", + "assign-assets-text": "顧客に { count, plural, =1 {1 件のアセット} other {# 件のアセット} } を割り当て", + "assign-asset-to-edge-title": "Edgeにアセットを割り当て", + "assign-asset-to-edge-text": "Edgeに割り当てるアセットを選択してください", + "delete-assets": "アセットを削除", + "unassign-assets": "アセットの割り当てを解除", + "unassign-assets-action-title": "顧客から { count, plural, =1 {1 件のアセット} other {# 件のアセット} } の割り当てを解除", + "assign-new-asset": "新しいアセットを割り当て", + "delete-asset-title": "アセット '{{assetName}}' を削除してもよろしいですか?", + "delete-asset-text": "注意: 確認後、アセットと関連データはすべて復元できなくなります。", + "delete-assets-title": "{ count, plural, =1 {1 件のアセット} other {# 件のアセット} } を削除してもよろしいですか?", + "delete-assets-action-title": "{ count, plural, =1 {1 件のアセット} other {# 件のアセット} } を削除", + "delete-assets-text": "注意: 確認後、選択したすべてのアセットが削除され、関連データはすべて復元できなくなります。", + "make-public-asset-title": "アセット '{{assetName}}' を公開にしてもよろしいですか?", + "make-public-asset-text": "確認後、アセットとそのすべてのデータは公開され、他のユーザーがアクセスできるようになります。", + "make-private-asset-title": "アセット '{{assetName}}' を非公開にしてもよろしいですか?", + "make-private-asset-text": "確認後、アセットとそのすべてのデータは非公開になり、他のユーザーはアクセスできなくなります。", + "unassign-asset-title": "アセット '{{assetName}}' の割り当てを解除してもよろしいですか?", + "unassign-asset-text": "確認後、アセットの割り当ては解除され、顧客はアクセスできなくなります。", + "unassign-asset": "アセットの割り当てを解除", + "unassign-assets-title": "{ count, plural, =1 {1 件のアセット} other {# 件のアセット} } の割り当てを解除してもよろしいですか?", + "unassign-assets-text": "確認後、選択したすべてのアセットの割り当てが解除され、顧客はアクセスできなくなります。", + "copyId": "アセットIDをコピー", + "idCopiedMessage": "アセットIDがクリップボードにコピーされました", + "select-asset": "アセットを選択", + "no-assets-matching": "'{{entity}}'に一致するアセットが見つかりません。", + "asset-required": "アセットは必須です", + "name-starts-with": "アセット名の式", + "help-text": "必要に応じて'%'を使用してください: '%asset_name_contains%', '%asset_name_ends', 'asset_starts_with'。", + "search": "アセットを検索", + "import": "アセットをインポート", + "asset-file": "アセットファイル", + "label": "ラベル", + "assign-asset-to-edge": "Edgeにアセットを割り当て", + "unassign-asset-from-edge": "アセットの割り当てを解除", + "unassign-asset-from-edge-title": "アセット '{{assetName}}' の割り当てを解除してもよろしいですか?", + "unassign-asset-from-edge-text": "確認後、アセットの割り当ては解除され、Edgeはアクセスできなくなります。", + "unassign-assets-from-edge-title": "{ count, plural, =1 {1 件のアセット} other {# 件のアセット} } の割り当てを解除してもよろしいですか?", + "unassign-assets-from-edge-text": "確認後、選択したすべてのアセットの割り当てが解除され、Edgeはアクセスできなくなります。", + "selected-assets": "{ count, plural, =1 {1 件のアセット} other {# 件のアセット} } を選択" + }, + "attribute": { + "attributes": "属性", + "latest-telemetry": "最新テレメトリ", + "no-latest-telemetry": "最新テレメトリがありません", + "attributes-scope": "エンティティ属性スコープ", + "scope-telemetry": "テレメトリ", + "scope-latest-telemetry": "最新テレメトリ", + "scope-client": "クライアント属性", + "scope-server": "サーバー属性", + "scope-shared": "共有属性", + "scope-client-short": "クライアント", + "scope-server-short": "サーバー", + "scope-shared-short": "共有", + "scope-latest-short": "最新", + "scope-any": "任意", + "add": "属性を追加", + "key": "キー", + "key-max-length": "キーは256未満である必要があります", + "last-update-time": "最終更新日時", + "key-required": "属性キーは必須です。", + "value": "値", + "value-required": "属性値は必須です。", + "telemetry-key-required": "テレメトリキーは必須です", + "telemetry-value-required": "テレメトリ値は必須です", + "delete-attributes-title": "{ count, plural, =1 {1 件の属性} other {# 件の属性} } を削除してもよろしいですか?", + "delete-attributes-text": "注意: 確認後、選択したすべての属性が削除されます。", + "delete-attributes": "属性を削除", + "enter-attribute-value": "属性値を入力", + "show-on-widget": "ウィジェットに表示", + "widget-mode": "ウィジェットモード", + "next-widget": "次のウィジェット", + "prev-widget": "前のウィジェット", + "add-to-dashboard": "ダッシュボードに追加", + "add-widget-to-dashboard": "ダッシュボードにウィジェットを追加", + "selected-attributes": "{ count, plural, =1 {1 件の属性} other {# 件の属性} } を選択", + "selected-telemetry": "{ count, plural, =1 {1 件のテレメトリユニット} other {# 件のテレメトリユニット} } を選択", + "no-attributes-text": "属性が見つかりません", + "no-telemetry-text": "テレメトリが見つかりません", + "copy-key": "キーをコピー", + "add-telemetry": "テレメトリを追加", + "copy-value": "値をコピー", + "delete-timeseries": { + "start-time": "開始日時", + "ends-on": "終了日時", + "strategy": "戦略", + "delete-strategy": "削除戦略", + "all-data": "すべてのデータを削除", + "all-data-except-latest-value": "最新値を除くすべてのデータを削除", + "latest-value": "最新値を削除", + "all-data-for-time-period": "期間内のすべてのデータを削除", + "rewrite-latest-value": "最新値を書き換え" + } + }, + "api-usage": { + "api-features": "API機能", + "api-usage": "API使用状況", + "alarm": "アラーム", + "alarms-created": "作成されたアラーム", + "queue-stats": "キュー統計", + "processing-failures-and-timeouts": "処理失敗とタイムアウト", + "exceptions": "例外", + "alarms-created-daily-activity": "作成されたアラームの日別アクティビティ", + "alarms-created-hourly-activity": "作成されたアラームの時間別アクティビティ", + "alarms-created-monthly-activity": "作成されたアラームの月別アクティビティ", + "data-points": "データポイント", + "data-points-storage-days": "データポイント保存日数", + "data-points-storage-days-hourly-activity": "データポイント保存日数の時間別アクティビティ", + "data-points-storage-days-daily-activity": "データポイント保存日数の日別アクティビティ", + "data-points-storage-days-monthly-activity": "データポイント保存日数の月別アクティビティ", + "device-api": "デバイスAPI", + "email": "Email", + "email-messages": "Emailメッセージ", + "email-messages-daily-activity": "Emailメッセージの日別アクティビティ", + "email-messages-monthly-activity": "Emailメッセージの月別アクティビティ", + "executions": "実行", + "scripts": "スクリプト", + "scripts-hourly-activity": "スクリプトの時間別アクティビティ", + "scripts-daily-activity": "スクリプトの日別アクティビティ", + "scripts-monthly-activity": "スクリプトの月別アクティビティ", + "javascript": "JavaScript", + "javascript-executions": "JavaScript実行", + "tbel": "TBEL", + "tbel-executions": "TBEL実行", + "latest-error": "最新エラー", + "messages": "メッセージ", + "notifications": "通知", + "notifications-email-sms": "通知 (Email/SMS)", + "notifications-hourly-activity": "通知の時間別アクティビティ", + "permanent-failures": "${entityName} 永続的な失敗", + "permanent-timeouts": "${entityName} 永続的なタイムアウト", + "processing-failures": "${entityName} 処理失敗", + "processing-timeouts": "${entityName} 処理タイムアウト", + "rule-chain": "ルールチェーン", + "rule-engine": "ルールエンジン", + "rule-engine-daily-activity": "ルールエンジンの日別アクティビティ", + "rule-engine-executions": "ルールエンジン実行", + "rule-engine-hourly-activity": "ルールエンジンの時間別アクティビティ", + "rule-engine-monthly-activity": "ルールエンジンの月別アクティビティ", + "rule-engine-statistics": "ルールエンジン統計", + "rule-node": "ルールノード", + "sms": "SMS", + "sms-messages": "SMSメッセージ", + "sms-messages-hourly-activity": "SMS メッセージの時間別アクティビティ", + "sms-messages-daily-activity": "SMSメッセージの日別アクティビティ", + "sms-messages-monthly-activity": "SMSメッセージの月別アクティビティ", + "successful": "${entityName} 成功", + "telemetry": "テレメトリ", + "telemetry-persistence": "テレメトリ永続化", + "telemetry-persistence-daily-activity": "テレメトリ永続化の日別アクティビティ", + "telemetry-persistence-hourly-activity": "テレメトリ永続化の時間別アクティビティ", + "telemetry-persistence-monthly-activity": "テレメトリ永続化の月別アクティビティ", + "transport": "トランスポート", + "transport-msg-hourly-activity": "トランスポートメッセージの時間別アクティビティ", + "transport-msg-daily-activity": "トランスポートメッセージの日別アクティビティ", + "transport-msg-monthly-activity": "トランスポートメッセージの月別アクティビティ", + "transport-daily-activity": "トランスポートの日別アクティビティ", + "transport-data-points": "トランスポートデータポイント", + "transport-data-points-hourly-activity": "トランスポートデータポイントの時間別アクティビティ", + "transport-data-points-daily-activity": "トランスポートデータポイントの日別アクティビティ", + "transport-data-points-monthly-activity": "トランスポートデータポイントの月別アクティビティ", + "view-details": "詳細を表示", + "view-statistics": "統計を表示", + "transport-messages": "トランスポートメッセージ", + "transport-messages-hourly-activity": "トランスポートメッセージの時間別アクティビティ", + "transport-data-point-hourly-activity": "トランスポートデータポイントの時間別アクティビティ", + "javascript-function-executions": "JavaScript 関数の実行", + "javascript-function-executions-hourly-activity": "JavaScript 関数実行の時間別アクティビティ", + "javascript-function-executions-daily-activity": "JavaScript 関数実行の日別アクティビティ", + "javascript-function-executions-monthly-activity": "JavaScript 関数実行の月別アクティビティ", + "tbel-function-executions": "TBEL 関数の実行", + "tbel-function-executions-hourly-activity": "TBEL 関数実行の時間別アクティビティ", + "tbel-function-executions-daily-activity": "TBEL 関数実行の日別アクティビティ", + "tbel-function-executions-monthly-activity": "TBEL 関数実行の月別アクティビティ", + "created-reports": "作成済みレポート", + "created-reports-hourly-activity": "作成済みレポートの時間別アクティビティ", + "created-reports-daily-activity": "作成済みレポートの日別アクティビティ", + "created-reports-monthly-activity": "作成済みレポートの月別アクティビティ", + "emails": "Emails", + "emails-hourly-activity": "Emails の時間別アクティビティ", + "emails-daily-activity": "Emails の日別アクティビティ", + "emails-monthly-activity": "Emails の月別アクティビティ", + "status": { + "enabled": "有効", + "disabled": "無効", + "warning": "警告" + } + }, + "api-limit": { + "cassandra-write-queries-core": "Rest API Cassandra 書き込みクエリ", + "cassandra-read-queries-core": "Rest API と WS テレメトリ Cassandra 読み取りクエリ", + "cassandra-write-queries-rule-engine": "ルールエンジン テレメトリ Cassandra 書き込みクエリ", + "cassandra-read-queries-rule-engine": "ルールエンジン テレメトリ Cassandra 読み取りクエリ", + "cassandra-write-queries-monolith": "Monolith テレメトリ Cassandra 書き込みクエリ", + "cassandra-read-queries-monolith": "Monolith テレメトリ Cassandra 読み取りクエリ", + "entity-version-creation": "エンティティバージョン作成", + "entity-version-load": "エンティティバージョン読み込み", + "notification-requests": "通知リクエスト", + "notification-requests-per-rule": "ルールあたりの通知リクエスト", + "rest-api-requests": "REST APIリクエスト", + "rest-api-requests-per-customer": "顧客あたりのREST APIリクエスト", + "transport-messages": "トランスポートメッセージ", + "transport-messages-per-device": "デバイスあたりのトランスポートメッセージ", + "transport-messages-per-gateway": "gatewayあたりのトランスポートメッセージ", + "transport-messages-per-gateway-device": "gatewayデバイスあたりのトランスポートメッセージ", + "ws-updates-per-session": "セッションあたりのWS更新", + "edge-events": "Edgeイベント", + "edge-events-per-edge": "EdgeあたりのEdgeイベント", + "edge-uplink-messages": "Edgeアップリンクメッセージ", + "edge-uplink-messages-per-edge": "EdgeあたりのEdgeアップリンクメッセージ" + }, + "api-key": { + "api-key": "API キー", + "api-keys": "API キー", + "delete-api-key-title": "API キー '{{name}}' を削除してもよろしいですか?", + "delete-api-key-text": "注意: 確認後、このキーは復元できなくなります。", + "delete-api-keys-title": "{ count, plural, =1 {1 API キー} other {# API キー} } を削除してもよろしいですか?", + "delete-api-keys-text": "注意: 確認後、選択したすべてのキーは復元できなくなります。", + "expiration-date": "有効期限", + "date": "日付", + "description": "説明", + "disable": "無効化", + "edit-description": "説明を編集", + "enable": "API キーを有効化", + "expiration-time": "有効期限", + "expiration-time-never": "なし", + "expiration-time-custom": "カスタム", + "generate": "生成", + "generate-title": "API キーを生成", + "generate-text": "注: API キーは、作成対象のユーザーの権限を継承します。", + "generated-api-key-title": "API キーが生成されました。接続を確認しましょう!", + "generated-api-key-copy": "この API キーは再表示できません。今すぐコピーして安全に保存してください。", + "generated-api-key-command": "接続を確認するには次の手順を使用してください。結果として、現在のユーザー情報を受け取るはずです:", + "generated-api-key-insecure-url": "安全でない HTTP 接続でコマンドを実行すると、API キーが暗号化されずに送信され、盗聴される恐れがあります。", + "list": "{ count, plural, =1 {API キー} other {API キー一覧 (# 件)} }", + "manage": "管理", + "manage-api-keys": "API キーを管理", + "no-found": "API キーが見つかりません", + "selected-api-keys": "{ count, plural, =1 {API キー} other {API キー (# 件)} } を選択", + "search": "API キーを検索", + "status": "ステータス", + "status-active": "アクティブ", + "status-inactive": "非アクティブ", + "status-expired": "期限切れ" + }, + "audit-log": { + "audit": "監査", + "audit-logs": "監査ログ", + "timestamp": "タイムスタンプ", + "entity-type": "エンティティタイプ", + "entity-name": "エンティティ名", + "user": "ユーザー", + "type": "タイプ", + "status": "ステータス", + "details": "詳細", + "type-added": "追加", + "type-deleted": "削除", + "type-updated": "更新", + "type-attributes-updated": "属性を更新", + "type-attributes-deleted": "属性を削除", + "type-rpc-call": "RPC呼び出し", + "type-credentials-updated": "認証情報を更新", + "type-assigned-to-customer": "顧客に割り当て", + "type-unassigned-from-customer": "顧客から割り当て解除", + "type-assigned-to-edge": "Edgeに割り当て", + "type-unassigned-from-edge": "Edgeから割り当て解除", + "type-activated": "有効化", + "type-suspended": "一時停止", + "type-credentials-read": "認証情報を読み取り", + "type-attributes-read": "属性を読み取り", + "type-relation-add-or-update": "関係を更新", + "type-relation-delete": "関係を削除", + "type-relations-delete": "すべての関係を削除", + "type-alarm-ack": "アラームを確認", + "type-alarm-clear": "アラームをクリア", + "type-alarm-delete": "アラームを削除", + "type-alarm-assign": "アラームを割り当て", + "type-alarm-unassign": "アラームの割り当てを解除", + "type-added-comment": "コメントを追加", + "type-updated-comment": "コメントを更新", + "type-deleted-comment": "コメントを削除", + "type-login": "ログイン", + "type-logout": "ログアウト", + "type-lockout": "ロックアウト", + "status-success": "成功", + "status-failure": "失敗", + "audit-log-details": "監査ログ詳細", + "no-audit-logs-prompt": "ログが見つかりません", + "action-data": "アクションデータ", + "failure-details": "失敗詳細", + "search": "監査ログを検索", + "clear-search": "検索をクリア", + "type-assigned-from-tenant": "テナントから割り当て", + "type-assigned-to-tenant": "テナントに割り当て", + "type-provision-success": "デバイスをプロビジョニング", + "type-provision-failure": "デバイスのプロビジョニングに失敗しました", + "type-timeseries-updated": "テレメトリを更新", + "type-timeseries-deleted": "テレメトリを削除", + "type-sms-sent": "SMSを送信", + "any-type": "すべてのタイプ", + "audit-log-filter-title": "監査ログフィルター", + "filter-title": "フィルター", + "filter-types": "監査ログタイプ" + }, + "debug-settings": { + "label": "デバッグ設定", + "on-failure": "失敗のみ (24/7)", + "all-messages": "すべてのメッセージ ({{time}})", + "failures": "失敗", + "entity": "エンティティ", + "hint": { + "main-limited": "{{time}}あたりに記録される{{entity}}デバッグメッセージは{{msg}}件までです。", + "on-failure": "エラーメッセージのみをログに記録します。", + "all-messages": "すべてのデバッグメッセージをログに記録します。" + } + }, + "calculated-fields": { + "expression": "式", + "no-found": "計算フィールドが見つかりません", + "list": "{ count, plural, =1 {計算フィールド} other {計算フィールド一覧(# 件)} }", + "selected-fields": "{ count, plural, =1 {1 件の計算フィールド} other {# 件の計算フィールド} } を選択", + "type": { + "simple": "シンプル", + "simple-hint": "入力引数に基づくシンプルな算術計算。", + "script": "スクリプト", + "script-hint": "TBEL スクリプトを使用して、定義された引数に対して計算します。", + "geofencing": "ジオフェンシング", + "geofencing-hint": "設定されたジオフェンシングゾーングループに対して、エンティティの GPS 位置と遷移を評価します。", + "propagation": "伝播", + "propagation-hint": "リレーションの方向とタイプに基づき、親または子エンティティへデータを伝播します。", + "related-entities-aggregation": "関連エンティティ集計", + "related-entities-aggregation-hint": "関連エンティティの最新データを集計します。", + "time-series-data-aggregation": "時系列データ集計", + "time-series-data-aggregation-hint": "現在のエンティティの過去データを集計します。" + }, + "preview": "プレビュー", + "arguments": "引数", + "decimals-by-default": "既定で小数を使用", + "debugging": "計算フィールドのデバッグ", + "calculated-field-details": "計算フィールドの詳細", + "argument-name": "引数名", + "name": "名前", + "datasource": "データソース", + "add-argument": "引数を追加", + "test-script-function": "スクリプト関数をテスト", + "no-arguments": "設定された引数がありません", + "argument-settings": "引数設定", + "argument-current": "現在のエンティティ", + "argument-current-tenant": "現在のテナント", + "argument-device": "デバイス", + "argument-asset": "アセット", + "argument-customer": "顧客", + "argument-tenant": "現在のテナント", + "argument-owner": "現在の所有者", + "argument-relation-query": "関連エンティティ", + "argument-type": "引数タイプ", + "attribute": "属性", + "copy-argument-name": "引数名をコピー", + "timeseries-key": "時系列キー", + "device-name": "デバイス名", + "latest-telemetry": "最新テレメトリ", + "rolling": "時系列ローリング", + "attribute-scope": "属性スコープ", + "server-attributes": "サーバー属性", + "client-attributes": "クライアント属性", + "shared-attributes": "共有属性", + "attribute-key": "属性キー", + "default-value": "既定値", + "default-value-required": "既定値は必須です。", + "limit": "最大値数", + "time-window": "時間ウィンドウ", + "customer-name": "顧客名", + "asset-name": "アセット名", + "timeseries": "時系列", + "output": "出力", + "output-hint": "出力の処理方法を定義します。", + "create": "計算フィールドを新規作成", + "file": "計算フィールドファイル", + "invalid-file-error": "無効なファイル形式です。有効な JSON ファイルであることを確認してください。", + "import": "計算フィールドをインポート", + "export": "計算フィールドをエクスポート", + "export-failed-error": "計算フィールドをエクスポートできません: {{error}}", + "output-type": "出力タイプ", + "delete-title": "計算フィールド '{{title}}' を削除してもよろしいですか?", + "delete-text": "注意: 確認後、計算フィールドと関連するすべてのデータは復元できなくなります。", + "delete-multiple-title": "{ count, plural, =1 {計算フィールド 1 件} other {計算フィールド # 件} } を削除してもよろしいですか?", + "delete-multiple-text": "注意: 確認後、選択した計算フィールドはすべて削除され、関連するすべてのデータは復元できなくなります。", + "test-with-this-message": "このメッセージでテスト", + "use-latest-timestamp": "最新タイムスタンプを使用", + "entity-coordinates": "エンティティ座標", + "latitude-time-series-key": "緯度の時系列キー", + "latitude-time-series-key-required": "緯度の時系列キーは必須です。", + "longitude-time-series-key": "経度の時系列キー", + "longitude-time-series-key-required": "経度の時系列キーは必須です。", + "geofencing-zone-groups": "ジオフェンシングゾーングループ", + "geofencing-zone-groups-settings": "ジオフェンシングゾーングループ設定", + "target-zone": "対象ゾーン", + "perimeter-key": "境界キー", + "report-strategy": "レポート戦略", + "no-zone-configured": "少なくとも 1 つのゾーンが必要です。", + "no-zone-configured-required": "少なくとも 1 つのゾーングループを設定する必要があります。", + "add-zone-group": "ゾーングループを追加", + "report-transition-event-only": "遷移イベントのみ", + "report-presence-status-only": "在席ステータスのみ", + "report-transition-event-and-presence": "在席ステータスと遷移イベント", + "perimeter-attribute-key": "境界属性キー", + "perimeter-attribute-key-required": "境界属性キーは必須です。", + "perimeter-attribute-key-pattern": "境界属性キーが無効です。", + "entity-zone-relationship": "エンティティからゾーンへのパス", + "direction": "リレーション方向", + "direction-from": "エンティティ → ゾーン", + "direction-to": "ゾーン → エンティティ", + "relation-type": "リレーションタイプ", + "create-relation-with-matched-zones": "一致したゾーンに対して、ソースエンティティのリレーションを作成", + "relation-level": "リレーションレベル", + "fetch-last-available-level": "利用可能な最終レベルのみ取得", + "zone-group-refresh-interval": "ゾーングループ更新間隔", + "copy-zone-group-name": "ゾーングループ名をコピー", + "open-details-page": "エンティティ詳細ページを開く", + "level": "レベル", + "direction-level": "方向", + "direction-up": "上", + "direction-up-parent": "親へ上方向", + "direction-down": "下", + "direction-down-child": "子へ下方向", + "add-level": "レベルを追加", + "delete-level": "レベルを削除", + "no-level": "レベルが設定されていません", + "levels-required": "少なくとも 1 つのレベルを設定する必要があります。", + "max-allowed-levels-error": "リレーションレベルが許可されている最大値を超えています。", + "propagation-path-related-entities": "関連エンティティへの伝播パス", + "propagate-type": { + "arguments-only": "引数のみ", + "expression-result": "計算結果" + }, + "script": "スクリプト", + "data-propagate": "伝播するデータ", + "output-key": "出力キー", + "copy-output-key": "出力キーをコピー", + "aggregation-path-related-entities": "関連エンティティへの集計パス", + "deduplication-interval": "重複排除間隔", + "deduplication-interval-min": "重複排除間隔は少なくとも {{ sec }} 秒にしてください。", + "deduplication-interval-hint": "テレメトリ集計間の最小時間です。", + "deduplication-interval-required": "重複排除間隔は必須です。", + "calculated-field-filter-title": "計算フィールドフィルター", + "filter-title": "フィルター", + "calculated-field-types": "計算フィールドタイプ", + "events": "イベント", + "any-type": "すべてのタイプ", + "metrics": { + "metrics": "メトリクス", + "metrics-empty": "少なくとも 1 つのメトリクスを設定する必要があります。", + "metric-name": "メトリクス名", + "metric-name-required": "メトリクス名は必須です。", + "metric-name-pattern": "メトリクス名が無効です。", + "metric-name-duplicate": "同じ名前のメトリクスがすでに存在します。", + "metric-name-max-length": "メトリクス名は 256 文字未満にしてください。", + "metric-name-forbidden": "メトリクス名は予約されているため使用できません。", + "copy-metric-name": "メトリクス名をコピー", + "argument-name": "引数名", + "aggregation": "集計", + "aggregation-type": { + "avg": "平均", + "min": "最小", + "max": "最大", + "sum": "合計", + "count": "カウント", + "count-unique": "ユニーク数" + }, + "filtered": "フィルター済み", + "value-source": "値ソース", + "value-source-hint": "集計する値の取得方法を定義します。", + "value-source-type": { + "key": "キー", + "function": "関数" + }, + "no-metrics-configured": "少なくとも 1 つのメトリクスが必要です。", + "add-metric": "メトリクスを追加", + "max-metrics": "メトリクス数が上限に達しました。", + "metric-settings": "メトリクス設定", + "filter": "フィルター", + "filter-hint": "集計中のエンティティをフィルタリングできます。フィルター関数は boolean 値を返す必要があり、設定済みのすべての引数を使用できます。" + }, + "output-strategy": { + "strategy": "戦略", + "process-right-away": "直ちに処理", + "process-rule-chains": "ルールチェーン経由で処理", + "save-time-series": "時系列に保存", + "save-database": "データベースに保存", + "save-latest-values": "最新値に保存", + "send-web-sockets": "WebSockets に送信", + "save-calculated-fields": "計算フィールドに送信", + "update-attribute-only-on-value-change": "値が変化した場合のみ属性を更新", + "send-attributes-updated-notification": "属性更新通知を送信", + "ttl": "カスタム TTL", + "ttl-required": "TTL は必須です", + "ttl-min": "最小 TTL は 0 のみ許可されています", + "processing-parameters": "処理パラメーター", + "hint": { + "strategy": "結果を即時に処理するか、追加処理のためにルールチェーンへ送信するかを制御します。", + "processing-options": "処理オプション", + "update-attribute-only-on-value-change": "値が変化しているかどうかに関係なく、受信したすべてのメッセージで属性を更新します。API 使用量が増え、パフォーマンスが低下します。", + "update-attribute-only-on-value-change-enabled": "値が変化した場合のみ属性を更新します。値が変化しない場合、タイムスタンプは更新されず、通知も送信されません。", + "send-attributes-updated-notification": "デフォルトのルールチェーンに「属性更新」イベントを送信します。", + "save-time-series": "データベースの ts_kv テーブルに時系列データを保存します。", + "save-database": "属性データをデータベースに保存します。", + "save-latest-values": "新しい値がより新しい場合、データベースの ts_kv_latest テーブルの時系列データを更新します。", + "send-web-sockets-attribute": "属性データの更新について WebSocket サブスクリプションに通知します。", + "send-web-sockets-time-series": "時系列データの更新について WebSocket サブスクリプションに通知します。", + "save-calculated-fields-attribute": "属性データの更新について計算フィールドに通知します。", + "save-calculated-fields-time-series": "時系列データの更新について計算フィールドに通知します。", + "ttl": "時系列データの保持期間を定義します。無効の場合は、テナントプロファイルの TTL が使用されます。" + } + }, + "aggregate-interval-type": "集計間隔タイプ", + "aggregate-interval-value": "集計間隔値", + "aggregate-interval-value-required": "集計間隔値は必須です。", + "aggregate-interval-value-min": "集計間隔値は少なくとも { sec, plural, =0 {0 秒} =1 {1 秒} other {# 秒} } にしてください。", + "aggregate-interval-value-step-multiple-of": "集計間隔値は 1 日の約数または倍数である必要があります。", + "aggregate-period": { + "hour": "時間", + "day": "日", + "week": "週 (月 - 日)", + "week-sun-sat": "週 (日 - 土)", + "month": "月", + "quarter": "四半期", + "year": "年", + "custom": "カスタム" + }, + "aggregate-period-hint-offset": "集計間隔は次のとおりです: {{ interval }}", + "aggregate-period-hint-offset-and-so-on": "集計間隔は次のとおりです: {{ interval }} など。", + "entity-aggregation": { + "argument-hint": "データは現在のエンティティから取得されます。", + "argument-title-hint": "集計に使用する入力引数を定義します。", + "argument-setting-hint": "この計算フィールドで利用できる引数タイプは最新テレメトリのみです。", + "aggregation-interval": "集計間隔", + "aggregation-interval-hint": "集計を実行する頻度を定義します。例: 1 時間ごとに 00:00、01:00、02:00... のデータを集計します。集計結果は、集計間隔の開始時刻に対応するタイムスタンプで保存されます。", + "apply-offset": "集計間隔にオフセットを適用", + "apply-offset-hint": "各集計期間の開始時刻をどれだけずらすかを定義します(例: +10 分 - 00:10、01:10)。", + "offset-value": "オフセット値", + "offset-value-required": "オフセット値は必須です。", + "offset-value-min": "オフセット値は正の整数である必要があります。", + "offset-value-max": "オフセット値は集計間隔値より小さくする必要があります。", + "wait-delay": "遅延テレメトリの待機タイムアウトを適用", + "wait-delay-hint": "間隔終了後に遅延テレメトリを待機する時間を定義します。そのようなテレメトリが到着した場合、その間隔の結果は再計算されます。", + "duration": "待機時間", + "duration-required": "待機時間は必須です。", + "duration-min": "待機時間は少なくとも 1 分にしてください。", + "duration-hint": "間隔終了後に遅延データを待機する時間。", + "produce-intermediate-result": "中間結果を生成", + "produce-intermediate-result-hint": "現在の間隔中にメトリクスを計算して中間結果を生成します。更新は {{ time }} に 1 回を超えない頻度で行われます。" + }, + "hint": { + "arguments-simple-with-rolling": "シンプルタイプの計算フィールドには、時系列ローリングタイプのキーを含めることはできません。", + "arguments-propagate-arguments-with-rolling": "「時系列ローリング」タイプは「引数のみ」伝播と互換性がありません。", + "arguments-propagate-argument-entity-type": "エンティティタイプは「引数のみ」伝播と互換性がありません。", + "arguments-propagate-argument-must-current-entity": "少なくとも 1 つの引数は、ソースエンティティタイプとして「現在のエンティティ」を設定する必要があります。", + "arguments-empty": "引数を空にすることはできません。", + "expression-required": "式は必須です。", + "expression-invalid": "式が無効です", + "expression-max-length": "式の長さは255文字未満である必要があります。", + "argument-name-required": "引数名は必須です。", + "argument-name-pattern": "引数名が無効です。", + "argument-name-duplicate": "この名前の引数はすでに存在します。", + "argument-name-max-length": "引数名は256文字未満である必要があります。", + "argument-name-forbidden": "引数名は予約語のため使用できません。", + "output-key-required": "出力キーは必須です。", + "output-key-pattern": "出力キーが無効です。", + "output-key-duplicate": "同じ名前のキーがすでに存在します。", + "output-key-max-length": "出力キーは 256 文字未満にしてください。", + "output-key-forbidden": "出力キーは予約されているため使用できません。", + "entity-type-required": "エンティティタイプは必須です", + "name-required": "名前は必須です。", + "name-pattern": "名前が無効です。", + "name-duplicate": "同じ名前がすでに存在します。", + "name-max-length": "名前は 256 文字未満にしてください。", + "name-forbidden": "名前は予約されているため使用できません。", + "argument-type-required": "引数タイプは必須です。", + "max-args": "引数の最大数に達しました。", + "decimals-range": "デフォルトの小数桁は0〜15の数値である必要があります。", + "expression": "デフォルトの式は、温度を華氏から摂氏に変換する方法を示します。", + "arguments-entity-not-found": "引数の対象エンティティが見つかりません。", + "use-latest-timestamp": "有効にすると、計算値はサーバー時刻ではなく、引数のテレメトリの最新タイムスタンプを使用して永続化されます。", + "entity-coordinates": "エンティティの GPS 座標(緯度・経度)を提供する時系列キーを指定します。", + "geofencing-zone-groups": "チェックするジオフェンシングゾーングループを 1 つ以上定義します(例: 'allowedZones'、'restrictedZones')。各グループには一意の名前が必要で、その名前は計算フィールドの出力テレメトリキーのプレフィックスとして使用されます。", + "perimeter-attribute-key": "ジオフェンシングゾーンの境界定義を含む属性キーを設定します。境界は常にゾーンエンティティのサーバー側属性から取得されます。", + "report-strategy": "在席ステータスは、エンティティが現在ゾーングループの内側(INSIDE)か外側(OUTSIDE)かを報告します。遷移イベントは、エンティティがゾーングループに入った(ENTERED)または出た(LEFT)タイミングを報告します。", + "create-relation-with-matched-zones": "エンティティと、現在その内側にあるゾーンとのリレーションを自動的に作成・維持します。エンティティがゾーンから出るとリレーションは削除され、新しいゾーンに入ると作成されます。", + "relation-type-required": "リレーションタイプは必須です。", + "relation-level-required": "リレーションレベルは必須です。", + "relation-level-min": "リレーションレベルの最小値は 1 です。", + "relation-level-max": "リレーションレベルの最大値は {{max}} です。", + "geofencing-empty": "少なくとも 1 つのゾーングループを設定する必要があります。", + "geofencing-entity-not-found": "ジオフェンシング対象エンティティが見つかりません。", + "max-geofencing-zone": "ジオフェンシングゾーン数が上限に達しました。", + "zone-group-refresh-interval": "関連エンティティ経由で設定されたゾーングループを更新する頻度を定義します。", + "zone-group-refresh-interval-required": "ゾーングループ更新間隔は必須です。", + "zone-group-refresh-interval-min": "ゾーングループ更新間隔は少なくとも {{ min }} 秒にしてください。", + "propagation-path-related-entities": "選択した方向とリレーションタイプに基づき、関連エンティティへの直接の単一レベルのパスを定義します。", + "data-propagate": "下で設定された引数から伝播するデータを定義します。「引数のみ」は取得したデータをそのまま使用し、「計算結果」はそのデータから新しい値を計算します。", + "aggregation-path-related-entities": "方向とリレーションタイプに基づき、親または子エンティティとの直接リレーションを介した単一レベルの集計パスを定義します。デバイス、アセット、顧客、テナントの各エンティティ間のリレーションのみがサポートされます。", + "arguments-aggregation": "フィルタリングと集計に使用する入力引数を定義します。", + "setting-arguments-aggregation": "データは、集計パスで設定された関連エンティティから取得されます。", + "metrics": "設定された引数に基づいて集計されるメトリクスを定義します。", + "entity-aggregation-metrics": "指定した時間間隔にわたり、設定された引数に基づいて集計されるメトリクスを定義します。", + "import-invalid-calculated-field-type": "計算フィールドをインポートできません: 計算フィールド構造が無効です。", + "simple-expression-title": "計算値の算出方法を定義する算術式。", + "script-title": "計算ロジックと出力値を定義する TBEL スクリプト。", + "simple-arguments": "計算値の算出方法を定義する算術式。", + "script-arguments": "スクリプトで利用できる入力引数を定義します。" + } + }, + "alarm-rule": { + "alarm-rules-tab": "アラームルール", + "alarm-rule": "アラームルール", + "alarm-rules": "アラームルール", + "alarm-rules-old": "旧", + "alarm-rules-actual": "現在", + "severities": "重大度", + "cleared": "クリア条件", + "delete-title": "アラームルール '{{title}}' を削除してもよろしいですか?", + "delete-text": "注意: 確認後、アラームルールと関連するすべてのデータは復元できなくなります。", + "delete-multiple-title": "{ count, plural, =1 {アラームルール 1 件} other {アラームルール # 件} } を削除してもよろしいですか?", + "delete-multiple-text": "注意: 確認後、選択したアラームルールはすべて削除され、関連するすべてのデータは復元できなくなります。", + "create": "アラームルールを新規作成", + "add": "アラームルールを追加", + "copy": "アラームルール設定をコピー", + "details": "アラームルールの詳細", + "no-found": "アラームルールが見つかりません", + "list": "{ count, plural, =1 {アラームルール} other {アラームルール一覧 (# 件)} }", + "selected-fields": "{ count, plural, =1 {アラームルール} other {アラームルール (# 件)} } を選択", + "import": "アラームルールをインポート", + "file": "アラームルールファイル", + "export": "アラームルールをエクスポート", + "export-failed-error": "アラームルールをエクスポートできません: {{error}}", + "entity-type": "エンティティタイプ", + "entity-type-required": "エンティティタイプは必須です。", + "alarm-type": "アラームタイプ", + "alarm-type-hint": "競合を防ぐため、アラーム発生元(デバイス、アセットなど)のスコープ内で一意となる識別子(例: HighTempAlarm)。", + "alarm-type-required": "アラームタイプは必須です。", + "alarm-type-pattern": "アラームタイプが無効です。", + "alarm-type-max-length": "アラームタイプは 256 文字未満にしてください。", + "clear-alarm": "アラームをクリア", + "value-argument": "引数", + "value-argument-required": "引数は必須です。", + "static-settings": "固定設定", + "configuration": "設定", + "static-schedule": "固定", + "dynamic-schedule": "動的", + "operation-and": "AND", + "operation-or": "OR", + "condition-during": "{{during}} の間", + "condition-during-dynamic": "\"{{ attribute }}\" の間", + "condition-repeat-times": "{ count, plural, =1 {1 回} other {# 回} }繰り返す", + "condition-repeat-times-dynamic": "\"{{ attribute }}\" 回繰り返す", + "filter-preview": "フィルタープレビュー", + "condition-settings": "条件設定", + "static": "固定", + "dynamic": "動的", + "argument-filters": "引数フィルター", + "argument-name": "引数名", + "value-type": "値タイプ", + "general": "一般", + "filters": "フィルター", + "date-time-hint": "引数はエポックミリ秒である必要があります。例: 1698839340000 は 2023-11-01 12:49:00 UTC に相当します。", + "operation": "演算", + "value-source": "値ソース", + "value": "値", + "ignore-case": "大文字/小文字を区別しない", + "condition": "条件", + "script": "スクリプト", + "add-filter": "引数フィルターを追加", + "edit-filter": "引数フィルター", + "remove-filter": "引数フィルターを削除", + "no-filter": "少なくとも 1 つのフィルターが必要です。", + "conditions": { + "simple": "シンプル", + "duration": "継続時間", + "repeating": "繰り返し" + }, + "schedule-title": "スケジュール", + "edit-schedule": "アラームスケジュールを編集", + "schedule-type": "スケジューラータイプ", + "schedule-type-required": "スケジューラータイプは必須です。", + "schedule": { + "any-time": "常にアクティブ", + "specific-time": "特定の時間にアクティブ", + "custom": "カスタム" + }, + "schedule-day": { + "monday": "月曜日", + "tuesday": "火曜日", + "wednesday": "水曜日", + "thursday": "木曜日", + "friday": "金曜日", + "saturday": "土曜日", + "sunday": "日曜日" + }, + "schedule-days": "日", + "schedule-time": "時間", + "schedule-time-from": "開始", + "schedule-time-to": "終了", + "schedule-days-of-week-required": "少なくとも 1 つの曜日を選択してください。", + "tbel": "TBEL", + "expression-type": { + "simple": "シンプル", + "script": "スクリプト" + }, + "operation-type": { + "and": "AND", + "or": "OR" + }, + "filter-predicate-type": { + "string": "文字列", + "numeric": "数値", + "boolean": "真偽値", + "complex": "複合" + }, + "alarm-rule-additional-info": "追加情報", + "edit-alarm-rule-additional-info": "追加情報を編集", + "alarm-rule-additional-info-placeholder": "ここにコメントや調整内容を入力すると、アラーム詳細の「追加情報」に表示されます", + "alarm-rule-additional-info-hint": "ヒント: ${Argument name} を使用して、アラームルール条件で使用される引数の値を置換できます。", + "alarm-rule-additional-info-icon-hint": "引数名を使用して、アラームルール条件で使用される引数の値を置換します。", + "alarm-rule-mobile-dashboard": "モバイルダッシュボード", + "alarm-rule-mobile-dashboard-hint": "モバイルアプリケーションでアラーム詳細ダッシュボードとして使用されます。", + "alarm-rule-no-mobile-dashboard": "ダッシュボードが選択されていません", + "alarm-rule-condition": "アラームルール条件", + "enter-alarm-rule-condition-prompt": "条件を追加", + "enter-alarm-rule-clear-condition-prompt": "クリア条件を追加", + "edit-alarm-rule-condition": "アラーム条件", + "condition-type": "条件タイプ", + "condition-type-hint": "\"継続時間\" と \"繰り返し\" オプションは、フィルターで \"欠落期間\" の演算を使用している場合は利用できません。", + "select-alarm-severity": "アラーム重大度を選択", + "add-create-alarm-rule-prompt": "少なくとも 1 つのトリガー条件が必要です。", + "add-create-alarm-rule": "トリガー条件を追加", + "add-clear-alarm-rule": "クリア条件を追加", + "condition-duration": "条件の継続時間", + "condition-duration-value": "継続時間の値", + "condition-duration-time-unit": "時間単位", + "condition-duration-value-range": "継続時間の値は 1 ~ 2147483647 の範囲にしてください。", + "condition-duration-value-pattern": "継続時間の値は整数にしてください。", + "condition-duration-value-required": "継続時間の値は必須です。", + "condition-duration-time-unit-required": "時間単位は必須です。", + "condition-repeating-value": "イベント数", + "condition-repeating-value-hint": "アラームルール引数の更新はすべてイベントとしてカウントされます", + "condition-repeating-value-range": "イベント数は 1 ~ 2147483647 の範囲にしてください。", + "condition-repeating-value-pattern": "イベント数は整数にしてください。", + "condition-repeating-value-required": "イベント数は必須です。", + "create-conditions": "トリガー条件", + "clear-condition": "クリア条件", + "no-clear-alarm-rule": "クリア条件が設定されていません。", + "advanced-settings": "詳細設定", + "propagate-alarm": "関連エンティティへアラームを伝播", + "alarm-rule-relation-types-list": "リレーションタイプ", + "alarm-rule-relation-types-list-hint": "関連エンティティをフィルタリングするためのリレーションタイプを定義します。未設定の場合、アラームはすべての関連エンティティに伝播されます。", + "propagate-alarm-to-owner": "エンティティ所有者(顧客またはテナント)へアラームを伝播", + "propagate-alarm-to-tenant": "テナントへアラームを伝播", + "alarm-rule-filter-title": "アラームルールフィルター", + "filter-title": "フィルター", + "debugging": "アラームルールのデバッグ", + "any-type": "すべてのタイプ", + "enter-alarm-rule-type": "アラームタイプを入力", + "no-alarm-rule-types-matching": "'{{entitySubtype}}' に一致するアラームタイプが見つかりません。", + "alarm-rule-type-list-empty": "アラームタイプが選択されていません。", + "alarm-rule-type-list": "アラームタイプ一覧", + "alarm-rule-entity-list": "エンティティ一覧", + "missing-for": "欠落期間", + "time-unit": "単位", + "mode": "モード", + "type": "タイプ", + "value-required": "値は必須です。", + "min-value": "値は 1 以上である必要があります。", + "argument-in-use": "引数は一般引数として使用されています。", + "import-invalid-alarm-rule-type": "アラームルールをインポートできません: アラームルール構造が無効です。", + "no-filter-preview": "フィルターが指定されていません", + "filter-operation": { + "and": "AND", + "or": "OR" + } + }, + "ai-models": { + "ai-models": "AIモデル", + "ai-model": "AIモデル", + "model": "モデル", + "name": "名前", + "ai-provider": "AIプロバイダー", + "no-found": "AIモデルが見つかりません", + "list": "{ count, plural, =1 {AIモデル} other {AIモデル一覧 # 件} }", + "selected-fields": "{ count, plural, =1 {1 件のAIモデル} other {# 件のAIモデル} } を選択", + "add": "モデルを追加", + "delete-model-title": "モデル'{{modelName}}'を削除してもよろしいですか?", + "delete-model-text": "注意: 確認後、モデルと関連データはすべて復元できなくなります。", + "delete-models-title": "{ count, plural, =1 {1 件のモデル} other {# 件のモデル} } を削除してもよろしいですか?", + "delete-models-text": "注意: 確認後、選択したすべてのモデルが削除され、関連データはすべて復元できなくなります。", + "ai-providers": { + "openai": "OpenAI", + "azure-openai": "Azure OpenAI", + "google-ai-gemini": "Google AI Gemini", + "google-vertex-ai-gemini": "Google Vertex AI Gemini", + "mistral-ai": "Mistral AI", + "anthropic": "Anthropic", + "amazon-bedrock": "Amazon Bedrock", + "github-models": "GitHub Models", + "ollama": "Ollama" + }, + "name-required": "名前は必須です。", + "name-max-length": "名前は255文字以内である必要があります。", + "provider": "プロバイダー", + "api-key": "APIキー", + "api-key-required": "APIキーは必須です。", + "api-key-open-ai-required": "公式のOpenAI APIを使用する場合はAPIキーが必須です。", + "project-id": "プロジェクトID", + "project-id-required": "プロジェクトIDは必須です", + "location": "ロケーション", + "location-required": "ロケーションは必須です。", + "service-account-key-file": "サービスアカウントキーファイル", + "service-account-key-file-required": "サービスアカウントキーファイルは必須です。", + "no-file": "ファイルが選択されていません。", + "drop-file": "ファイルをドロップするか、クリックしてアップロードするファイルを選択してください。", + "personal-access-token": "パーソナルアクセストークン", + "personal-access-token-required": "パーソナルアクセストークンは必須です。", + "configuration": "設定", + "model-id": "モデルID", + "model-id-required": "モデルIDは必須です。", + "deployment-name": "デプロイメント名", + "deployment-name-required": "デプロイメント名は必須です", + "set": "設定", + "region": "リージョン", + "region-required": "リージョンは必須です。", + "access-key-id": "アクセスキーID", + "access-key-id-required": "アクセスキーIDは必須です。", + "secret-access-key": "シークレットアクセスキー", + "secret-access-key-required": "シークレットアクセスキーは必須です。", + "temperature": "温度", + "temperature-hint": "モデル出力のランダム性の度合いを調整します。値が高いほどランダム性が増し、低いほど減ります。", + "temperature-min": "0以上である必要があります。", + "top-p": "Top P", + "top-p-hint": "モデルが選択するための確率が高いトークンのプールを作成します。値が高いほどプールは大きく多様になり、低いほど小さくなります。", + "top-p-min-max": "0より大きく、最大1である必要があります。", + "top-k": "Top K", + "top-k-hint": "モデルの選択肢を、最も確からしい \"K\" 個のトークンの固定セットに制限します。", + "top-k-min": "0以上である必要があります。", + "presence-penalty": "出現ペナルティ", + "presence-penalty-hint": "トークンがすでにテキスト内に出現している場合、その確率に固定のペナルティを適用します。", + "frequency-penalty": "頻度ペナルティ", + "frequency-penalty-hint": "テキスト内での出現頻度に応じて増加するペナルティを、トークンの確率に適用します。", + "max-output-tokens": "最大出力トークン数", + "max-output-tokens-hint": "モデルが1回の応答で生成できるトークンの最大数を\n設定します。", + "context-length": "コンテキスト長", + "context-length-hint": "トークン単位でコンテキストウィンドウのサイズを定義します。この値は、ユーザー入力と生成された応答の両方を含む、モデルの総メモリ上限を設定します。", + "endpoint": "エンドポイント", + "endpoint-required": "エンドポイントは必須です。", + "baseurl": "ベースURL", + "baseurl-required": "ベースURLは必須です。", + "service-version": "サービスバージョン", + "check-connectivity": "接続を確認", + "check-connectivity-success": "テストリクエストは成功しました", + "check-connectivity-failed": "テストリクエストに失敗しました", + "no-model-matching": "'{{entity}}'に一致するモデルが見つかりません。", + "model-required": "モデルは必須です。", + "no-model-text": "モデルが見つかりません。", + "authentication": "認証", + "authentication-basic-hint": "標準のHTTP Basic認証を使用します。ユーザー名とパスワードは結合され、Base64エンコードされたうえで、Ollamaサーバーへの各リクエストに\"Authorization\"ヘッダーとして送信されます。", + "authentication-token-hint": "Bearerトークン認証を使用します。指定したトークンは、Ollamaサーバーへの各リクエストで\"Authorization\"ヘッダーにそのまま送信されます。", + "authentication-type": { + "none": "なし", + "basic": "Basic", + "token": "トークン" + }, + "username": "ユーザー名", + "username-required": "ユーザー名は必須です。", + "password": "パスワード", + "password-required": "パスワードは必須です。", + "token": "トークン", + "token-required": "トークンは必須です。" + }, + "confirm-on-exit": { + "message": "未保存の変更があります。このページから移動してもよろしいですか?", + "html-message": "未保存の変更があります。
このページから移動してもよろしいですか?", + "title": "未保存の変更" + }, + "contact": { + "country": "国", + "country-required": "国は必須です。", + "country-object-required": "一覧から有効な国を選択してください。", + "city": "市区町村", + "state": "州 / 県", + "postal-code": "郵便番号", + "postal-code-invalid": "郵便番号の形式が無効です。", + "address": "住所", + "address2": "住所2", + "phone": "電話番号", + "email": "Email", + "no-address": "住所なし", + "no-country-found": "国が見つかりません。", + "no-country-matching": "'{{country}}'に一致する国が見つかりません。", + "state-max-length": "州は256未満である必要があります", + "phone-max-length": "電話番号は256未満である必要があります", + "city-max-length": "指定された市区町村は256未満である必要があります" + }, + "common": { + "name": "名前", + "type": "タイプ", + "general": "一般", + "username": "ユーザー名", + "password": "パスワード", + "data": "データ", + "timestamp": "タイムスタンプ", + "enter-username": "ユーザー名を入力", + "enter-password": "パスワードを入力", + "enter-search": "検索文字列を入力", + "created-time": "作成日時", + "disabled": "無効", + "loading": "読み込み中...", + "proceed": "続行", + "open-details-page": "詳細ページを開く", + "not-found": "見つかりません", + "value": "値", + "documentation": "ドキュメント", + "time-left": "残り{{time}}", + "output": "出力", + "sort-asc": "昇順", + "sort-desc": "降順", + "suffix": { + "s": "s", + "ms": "ms" + }, + "hint": { + "name-required": "名前は必須です。", + "name-pattern": "名前が無効です。", + "name-max-length": "名前は256文字未満である必要があります。", + "title-required": "タイトルは必須です。", + "title-pattern": "タイトルが無効です。", + "title-max-length": "タイトルは256文字未満である必要があります。", + "key-required": "キーは必須です。", + "key-pattern": "キーが無効です。", + "key-max-length": "キーは256文字未満である必要があります。" + }, + "required-fields": "必須項目が未入力です" + }, + "content-type": { + "json": "JSON", + "text": "テキスト", + "binary": "バイナリ (Base64)" + }, + "color": { + "color": "色" + }, + "customer": { + "customer": "顧客", + "customers": "顧客", + "management": "顧客管理", + "dashboard": "顧客ダッシュボード", + "dashboards": "顧客ダッシュボード", + "devices": "顧客デバイス", + "entity-views": "顧客エンティティビュー", + "assets": "顧客アセット", + "public-dashboards": "公開ダッシュボード", + "public-devices": "公開デバイス", + "public-assets": "公開アセット", + "public-entity-views": "公開エンティティビュー", + "add": "顧客を追加", + "delete": "顧客を削除", + "manage-customer-users": "顧客ユーザーを管理", + "manage-customer-devices": "顧客デバイスを管理", + "manage-customer-dashboards": "顧客ダッシュボードを管理", + "manage-public-devices": "公開デバイスを管理", + "manage-public-dashboards": "公開ダッシュボードを管理", + "manage-customer-assets": "顧客アセットを管理", + "manage-customer-edges": "顧客Edgeを管理", + "manage-public-assets": "公開アセットを管理", + "add-customer-text": "新しい顧客を追加", + "no-customers-text": "顧客が見つかりません", + "customer-details": "顧客詳細", + "delete-customer-title": "顧客'{{customerTitle}}'を削除してもよろしいですか?", + "delete-customer-text": "注意: 確認後、顧客と関連データはすべて復元できなくなります。", + "delete-customers-title": "{ count, plural, =1 {1 件の顧客} other {# 件の顧客} } を削除してもよろしいですか?", + "delete-customers-action-title": "{ count, plural, =1 {1 件の顧客} other {# 件の顧客} } を削除", + "delete-customers-text": "注意: 確認後、選択したすべての顧客が削除され、関連データはすべて復元できなくなります。", + "manage-users": "ユーザーを管理", + "manage-assets": "アセットを管理", + "manage-devices": "デバイスを管理", + "manage-dashboards": "ダッシュボードを管理", + "title": "タイトル", + "title-required": "タイトルは必須です。", + "title-max-length": "タイトルは256未満である必要があります", + "description": "説明", + "details": "詳細", + "events": "イベント", + "copyId": "顧客IDをコピー", + "idCopiedMessage": "顧客IDがクリップボードにコピーされました", + "select-customer": "顧客を選択", + "no-customers-matching": "'{{entity}}'に一致する顧客が見つかりません。", + "customer-required": "顧客は必須です", + "select-default-customer": "デフォルト顧客を選択", + "default-customer": "デフォルト顧客", + "default-customer-required": "テナントレベルでダッシュボードをデバッグするにはデフォルト顧客が必要です", + "search": "顧客を検索", + "selected-customers": "{ count, plural, =1 {1 件の顧客} other {# 件の顧客} } を選択", + "edges": "顧客edgeインスタンス", + "manage-edges": "Edgesを管理" + }, + "css-size": { + "size-value-required": "サイズ値は必須です", + "invalid-size-value": "無効なサイズ値" + }, + "date": { + "last-update-n-ago": "最終更新 N 前", + "last-update-n-ago-text": "最終更新 {{ agoText }}", + "custom-date": "カスタム日付", + "format": "形式", + "preview": "プレビュー", + "auto": "自動", + "time-granularity-formats": "時間粒度の形式", + "unit-year": "年", + "unit-month": "月", + "unit-day": "日", + "unit-hour": "時間", + "unit-minute": "分", + "unit-second": "秒", + "unit-millisecond": "ミリ秒" + }, + "datetime": { + "date-from": "開始日", + "time-from": "開始時刻", + "date-to": "終了日", + "time-to": "終了時刻", + "from": "開始", + "to": "終了" + }, + "dashboard": { + "dashboard": "ダッシュボード", + "dashboards": "ダッシュボード", + "management": "ダッシュボード管理", + "view-dashboards": "ダッシュボードを表示", + "add": "ダッシュボードを追加", + "assign-dashboard-to-customer": "顧客にダッシュボードを割り当て", + "assign-dashboard-to-customer-text": "顧客に割り当てるダッシュボードを選択してください", + "assign-to-customer-text": "ダッシュボードを割り当てる顧客を選択してください", + "assign-to-customer": "顧客に割り当て", + "unassign-from-customer": "顧客から割り当て解除", + "make-public": "ダッシュボードを公開にする", + "make-private": "ダッシュボードを非公開にする", + "manage-assigned-customers": "割り当て済み顧客を管理", + "assigned-customers": "割り当て済み顧客", + "assign-to-customers": "顧客にダッシュボードを割り当て", + "assign-to-customers-text": "ダッシュボードを割り当てる顧客を選択してください", + "unassign-from-customers": "顧客からダッシュボードの割り当てを解除", + "unassign-from-customers-text": "ダッシュボードから割り当て解除する顧客を選択してください", + "no-dashboards-text": "ダッシュボードが見つかりません", + "no-widgets": "ウィジェットが設定されていません", + "add-widget": "新しいウィジェットを追加", + "add-widget-button-text": "ウィジェットを追加", + "title": "タイトル", + "image": "ダッシュボード画像", + "mobile-app-settings": "モバイルアプリケーション設定", + "mobile-order": "モバイルアプリケーションでのダッシュボード順序", + "mobile-hide": "モバイルアプリケーションでダッシュボードを非表示", + "update-image": "ダッシュボード画像を更新", + "update-new-version": "新しいバージョンをアップロード", + "upload-file-to-update": "更新するファイルをアップロード", + "take-screenshot": "スクリーンショットを撮る", + "select-widget-title": "ウィジェットを選択", + "select-widget-value": "{{title}}: ウィジェットを選択", + "select-widget-subtitle": "利用可能なウィジェットタイプ一覧", + "delete": "ダッシュボードを削除", + "title-required": "タイトルは必須です。", + "title-max-length": "タイトルは256未満である必要があります", + "description": "説明", + "details": "詳細", + "dashboard-details": "ダッシュボード詳細", + "add-dashboard-text": "新しいダッシュボードを追加", + "assign-dashboards": "ダッシュボードを割り当て", + "assign-new-dashboard": "新しいダッシュボードを割り当て", + "assign-dashboards-text": "{ count, plural, =1 {1 件のダッシュボード} other {# 件のダッシュボード} } を顧客に割り当て", + "unassign-dashboards-action-text": "{ count, plural, =1 {1 件のダッシュボード} other {# 件のダッシュボード} } を顧客から割り当て解除", + "delete-dashboards": "ダッシュボードを削除", + "unassign-dashboards": "ダッシュボードの割り当て解除", + "unassign-dashboards-action-title": "ダッシュボード'{{dashboardTitle}}'を顧客から割り当て解除してもよろしいですか?", + "delete-dashboard-title": "ダッシュボード'{{dashboardTitle}}'を削除してもよろしいですか?", + "delete-dashboard-text": "注意: 確認後、ダッシュボードと関連データはすべて復元できなくなります。", + "delete-dashboards-title": "{ count, plural, =1 {1 件のダッシュボード} other {# 件のダッシュボード} } を削除してもよろしいですか?", + "delete-dashboards-action-title": "{ count, plural, =1 {1 件のダッシュボード} other {# 件のダッシュボード} } を削除", + "delete-dashboards-text": "注意: 確認後、選択したすべてのダッシュボードが削除され、関連データはすべて復元できなくなります。", + "unassign-dashboard-title": "ダッシュボード'{{dashboardTitle}}'を割り当て解除してもよろしいですか?", + "unassign-dashboard-text": "確認後、ダッシュボードの割り当てが解除され、顧客がアクセスできなくなります。", + "unassign-dashboard": "ダッシュボードの割り当て解除", + "unassign-dashboards-title": "{ count, plural, =1 {1 件のダッシュボード} other {# 件のダッシュボード} } の割り当てを解除してもよろしいですか?", + "unassign-dashboards-text": "確認後、選択したすべてのダッシュボードの割り当てが解除され、顧客がアクセスできなくなります。", + "public-dashboard-title": "ダッシュボードは公開されました", + "public-dashboard-text": "ダッシュボード{{dashboardTitle}}は公開され、以下のリンクからアクセスできます: リンク", + "public-dashboard-notice": "注意: 関連するデバイスも公開することをお忘れなく、そのデータにアクセスするためには必要です。", + "make-private-dashboard-title": "ダッシュボード'{{dashboardTitle}}'を非公開にしてもよろしいですか?", + "make-private-dashboard-text": "確認後、ダッシュボードは非公開になり、他の人はアクセスできなくなります。", + "make-private-dashboard": "ダッシュボードを非公開にする", + "socialshare-text": "'{{dashboardTitle}}' powered by ThingsBoard", + "socialshare-title": "'{{dashboardTitle}}' powered by ThingsBoard", + "select-dashboard": "ダッシュボードを選択", + "no-dashboards-matching": "'{{entity}}'に一致するダッシュボードが見つかりません。", + "dashboard-required": "ダッシュボードは必須です。", + "select-existing": "既存のダッシュボードを選択", + "create-new": "新しいダッシュボードを作成", + "new-dashboard-title": "新しいダッシュボードタイトル", + "open-dashboard": "ダッシュボードを開く", + "set-background": "背景を設定", + "background-color": "背景色", + "background-image": "背景画像", + "background-size-mode": "背景サイズモード", + "no-image": "画像が選択されていません", + "empty-image": "画像なし", + "drop-image": "画像をドロップするか、クリックしてアップロードするファイルを選択してください。", + "maximum-upload-file-size": "アップロード可能な最大ファイルサイズ: {{ size }}", + "cannot-upload-file": "ファイルをアップロードできません", + "settings": "設定", + "move-all-widgets": "すべてのウィジェットを移動", + "move-by": "移動量", + "cols": "列", + "rows": "行", + "layout": "レイアウト", + "layout-type-default": "デフォルト", + "layout-type-scada": "SCADA", + "layout-type-divider": "区切り", + "layout-settings-type": "レイアウト設定: {{ type }} ブレークポイント", + "columns-count": "列数", + "columns-count-required": "列数は必須です。", + "min-columns-count-message": "列数の最小値として許可されるのは10のみです。", + "max-columns-count-message": "列数の最大値として許可されるのは1000のみです。", + "min-layout-width": "最小レイアウト幅", + "columns-suffix": "列", + "widgets-margins": "ウィジェット間の余白", + "margin-required": "余白の値は必須です。", + "min-margin-message": "余白の最小値として許可されるのは0のみです。", + "max-margin-message": "余白の最大値として許可されるのは50のみです。", + "horizontal-margin": "水平余白", + "horizontal-margin-required": "水平余白の値は必須です。", + "min-horizontal-margin-message": "水平余白の最小値として許可されるのは0のみです。", + "max-horizontal-margin-message": "水平余白の最大値として許可されるのは50のみです。", + "vertical-margin": "垂直余白", + "vertical-margin-required": "垂直余白の値は必須です。", + "min-vertical-margin-message": "垂直余白の最小値として許可されるのは0のみです。", + "max-vertical-margin-message": "垂直余白の最大値として許可されるのは50のみです。", + "apply-outer-margin": "レイアウトの側面に余白を適用", + "autofill-height": "レイアウト高さを自動で埋める", + "mobile-layout": "モバイルレイアウト設定", + "mobile-row-height": "モバイル行の高さ", + "mobile-row-height-required": "モバイル行の高さの値は必須です。", + "min-mobile-row-height-message": "モバイル行の高さの最小値として許可されるのは5ピクセルのみです。", + "max-mobile-row-height-message": "モバイル行の高さの最大値として許可されるのは200ピクセルのみです。", + "row-height": "行の高さ", + "row-height-required": "行の高さの値は必須です。", + "min-row-height-message": "行の高さの最小値として許可されるのは5ピクセルのみです。", + "max-row-height-message": "行の高さの最大値として許可されるのは200ピクセルのみです。", + "display-first-in-mobile-view": "モバイルビューで先頭に表示", + "title-settings": "タイトル設定", + "display-title": "ダッシュボードタイトルを表示", + "title-color": "タイトル色", + "toolbar-settings": "ツールバー設定", + "hide-toolbar": "ツールバーを非表示", + "toolbar-always-open": "ツールバーを開いたままにする", + "display-dashboards-selection": "ダッシュボード選択を表示", + "display-entities-selection": "エンティティ選択を表示", + "display-filters": "フィルターを表示", + "display-dashboard-timewindow": "時間ウィンドウを表示", + "display-dashboard-export": "エクスポートを表示", + "display-update-dashboard-image": "ダッシュボード画像の更新を表示", + "dashboard-logo-settings": "ダッシュボードロゴ設定", + "display-dashboard-logo": "ダッシュボード全画面モードでロゴを表示", + "dashboard-logo-image": "ダッシュボードロゴ画像", + "advanced-settings": "高度な設定", + "dashboard-css": "ダッシュボードCSS", + "import": "ダッシュボードをインポート", + "export": "ダッシュボードをエクスポート", + "export-failed-error": "ダッシュボードをエクスポートできません: {{error}}", + "export-prompt": "ダッシュボード画像とリソースを埋め込む", + "create-new-dashboard": "新しいダッシュボードを作成", + "dashboard-file": "ダッシュボードファイル", + "invalid-dashboard-file-error": "ダッシュボードをインポートできません: 無効なダッシュボードデータ構造です。", + "dashboard-import-missing-aliases-title": "インポートしたダッシュボードで使用されるエイリアスを設定", + "create-new-widget": "新しいウィジェットを作成", + "import-widget": "ウィジェットをインポート", + "widget-file": "ウィジェットファイル", + "invalid-widget-file-error": "ウィジェットをインポートできません: 無効なウィジェットデータ構造です。", + "widget-import-missing-aliases-title": "インポートしたウィジェットで使用されるエイリアスを設定", + "open-toolbar": "ダッシュボードツールバーを開く", + "close-toolbar": "ツールバーを閉じる", + "configuration-error": "設定エラー", + "alias-resolution-error-title": "ダッシュボードエイリアス設定エラー", + "invalid-aliases-config": "一部のエイリアスフィルターに一致するデバイスが見つかりません。
この問題を解決するため、管理者に連絡してください。", + "select-devices": "デバイスを選択", + "assignedToCustomer": "顧客に割り当て", + "assignedToCustomers": "顧客に割り当て", + "public": "公開", + "copyId": "ダッシュボードIDをコピー", + "idCopiedMessage": "ダッシュボードIDがクリップボードにコピーされました", + "public-link": "公開リンク", + "copy-public-link": "公開リンクをコピー", + "public-link-copied-message": "ダッシュボードの公開リンクがクリップボードにコピーされました", + "manage-states": "ダッシュボード状態を管理", + "states": "ダッシュボード状態", + "states-short": "状態", + "search-states": "ダッシュボード状態を検索", + "selected-states": "{ count, plural, =1 {ダッシュボード状態 1 件} other {ダッシュボード状態 # 件} } を選択", + "edit-state": "ダッシュボード状態を編集", + "delete-state": "ダッシュボード状態を削除", + "add-state": "ダッシュボード状態を追加", + "no-states-text": "状態が見つかりません", + "state": "ダッシュボード状態", + "state-name": "名前", + "state-name-required": "ダッシュボード状態名は必須です。", + "state-id": "状態ID", + "state-id-required": "ダッシュボード状態IDは必須です。", + "state-id-exists": "同じIDのダッシュボード状態がすでに存在します。", + "is-root-state": "ルート状態", + "delete-state-title": "ダッシュボード状態を削除", + "delete-state-text": "名前が'{{stateName}}'のダッシュボード状態を削除してもよろしいですか?", + "show-details": "詳細を表示", + "hide-details": "詳細を非表示", + "select-state": "対象状態を選択", + "state-controller": "状態コントローラー", + "state-controller-default": "static (非推奨)", + "search": "ダッシュボードを検索", + "selected-dashboards": "{ count, plural, =1 {ダッシュボード 1 件} other {ダッシュボード # 件} } を選択", + "home-dashboard": "ホームダッシュボード", + "home-dashboard-hide-toolbar": "ホームダッシュボードのツールバーを非表示", + "unassign-dashboard-from-edge-text": "確認後、ダッシュボードの割り当てが解除され、edgeがアクセスできなくなります。", + "unassign-dashboards-from-edge-title": "{ count, plural, =1 {ダッシュボード 1 件} other {ダッシュボード # 件} } の割り当てを解除してもよろしいですか?", + "unassign-dashboards-from-edge-text": "確認後、選択したすべてのダッシュボードの割り当てが解除され、edgeがアクセスできなくなります。", + "assign-dashboard-to-edge": "Edgeにダッシュボードを割り当て", + "assign-dashboard-to-edge-text": "Edgeに割り当てるダッシュボードを選択してください", + "non-existent-dashboard-state-error": "ID \"{{ stateId }}\" のダッシュボード状態が見つかりません", + "edit-mode": "編集モード", + "duplicate-state-action": "状態を複製", + "breakpoint-value": "ブレークポイント ({{ value }})", + "breakpoints-id": { + "default": "デフォルト", + "xs": "モバイル (xs)", + "sm": "タブレット (sm)", + "md": "ラップトップ (md)", + "lg": "デスクトップ (lg)", + "xl": "デスクトップ (xl)" + }, + "view-format-type-grid": "グリッド", + "view-format-type-list": "一覧", + "view-format": "表示形式" + }, + "datakey": { + "settings": "設定", + "general": "一般", + "advanced": "高度な設定", + "key": "キー", + "keys": "キー", + "label": "ラベル", + "color": "色", + "units": "値の横に表示する特殊記号", + "decimals": "小数点以下の桁数", + "data-generation-func": "データ生成関数", + "use-data-post-processing-func": "データ後処理関数を使用", + "configuration": "データキー設定", + "timeseries": "時系列", + "attributes": "属性", + "entity-field": "エンティティフィールド", + "alarm": "アラームフィールド", + "timeseries-required": "エンティティの時系列は必須です。", + "timeseries-or-attributes-required": "エンティティの時系列/属性は必須です。", + "alarm-fields-timeseries-or-attributes-required": "アラームフィールドまたはエンティティの時系列/属性は必須です。", + "maximum-timeseries-or-attributes": "最大 { count, plural, =1 {時系列/属性は1件まで許可されます。} other {時系列/属性は#件まで許可されます} }", + "alarm-fields-required": "アラームフィールドは必須です。", + "function-types": "関数タイプ", + "function-type": "関数タイプ", + "function-types-required": "関数タイプは必須です。", + "data-keys": "データキー", + "data-key": "データキー", + "data-keys-required": "データキーは必須です。", + "data-key-required": "データキーは必須です。", + "alarm-keys": "アラームデータキー", + "alarm-key": "アラームデータキー", + "alarm-key-functions": "アラームキー関数", + "alarm-key-function": "アラームキー関数", + "latest-keys": "最新データキー", + "latest-key": "最新データキー", + "latest-key-functions": "最新キー関数", + "latest-key-function": "最新キー関数", + "timeseries-keys": "時系列データキー", + "timeseries-key": "時系列データキー", + "timeseries-key-functions": "時系列キー関数", + "timeseries-key-function": "時系列キー関数", + "maximum-function-types": "最大 { count, plural, =1 {関数タイプは1件まで許可されます。} other {関数タイプは#件まで許可されます} }", + "time-description": "現在値のタイムスタンプ;", + "value-description": "現在の値;", + "prev-value-description": "前回の関数呼び出しの結果;", + "time-prev-description": "前回の値のタイムスタンプ;", + "prev-orig-value-description": "元の前回値;", + "aggregation": "集計", + "aggregation-type-hint-common": "パフォーマンス上の理由により、集計値の計算は\"当日\"、\"当月\"などの固定時間間隔でのみ利用でき、'直近30分' や '直近24時間' などのスライディングウィンドウ間隔では利用できません。", + "aggregation-type-none-hint": "最新値を取得します。", + "aggregation-type-min-hint": "選択した時間ウィンドウ内のデータポイントから最小値を見つけます。", + "aggregation-type-max-hint": "選択した時間ウィンドウ内のデータポイントから最大値を見つけます。", + "aggregation-type-avg-hint": "選択した時間ウィンドウ内のデータポイントの平均値を計算します。", + "aggregation-type-sum-hint": "選択した時間ウィンドウ内のデータポイントの値を合計します。", + "aggregation-type-count-hint": "選択した時間ウィンドウ内のデータポイントの総数です。", + "delta-calculation": "差分計算", + "enable-delta-calculation": "差分計算を有効化", + "enable-delta-calculation-hint": "有効にすると、データキーの値は、選択した時間ウィンドウの集計値と指定した比較期間に基づいて計算されます。パフォーマンス上の理由により、差分計算は履歴の時間ウィンドウでのみ利用でき、リアルタイム値では利用できません。たとえば、昨日のエネルギー消費量と一昨日のエネルギー消費量の差分を計算できます。", + "delta-calculation-result": "差分計算結果", + "delta-calculation-result-previous-value": "前回値", + "delta-calculation-result-delta-absolute": "差分 (絶対値)", + "delta-calculation-result-delta-percent": "差分 (パーセント)", + "source": "ソース", + "latest": "最新", + "latest-value": "最新値", + "delta": "差分", + "percent": "パーセント", + "absolute": "絶対値" + }, + "datasource": { + "type": "データソースタイプ", + "name": "名前", + "label": "ラベル", + "add-datasource-prompt": "データソースを追加してください" + }, + "details": { + "details": "詳細", + "edit-mode": "編集モード", + "edit-json": "JSONを編集", + "toggle-edit-mode": "編集モードを切り替え" + }, + "device": { + "device": "デバイス", + "device-required": "デバイスは必須です。", + "devices": "デバイス", + "management": "デバイス管理", + "view-devices": "デバイスを表示", + "device-alias": "デバイスエイリアス", + "device-type-max-length": "デバイスタイプは256未満である必要があります", + "aliases": "デバイスエイリアス", + "no-alias-matching": "'{{alias}}'が見つかりません。", + "no-aliases-found": "エイリアスが見つかりません。", + "no-key-matching": "'{{key}}'が見つかりません。", + "no-keys-found": "キーが見つかりません。", + "create-new-alias": "新しく作成します!", + "create-new-key": "新しく作成します!", + "duplicate-alias-error": "重複したエイリアス'{{alias}}'が見つかりました。
デバイスエイリアスはダッシュボード内で一意である必要があります。", + "configure-alias": "エイリアス'{{alias}}'を設定", + "no-devices-matching": "'{{entity}}'に一致するデバイスが見つかりません。", + "alias": "エイリアス", + "alias-required": "デバイスエイリアスは必須です。", + "remove-alias": "デバイスエイリアスを削除", + "add-alias": "デバイスエイリアスを追加", + "name-starts-with": "デバイス名式", + "help-text": "必要に応じて'%'を使用してください: '%device_name_contains%', '%device_name_ends', 'device_starts_with'。", + "device-list": "デバイス一覧", + "use-device-name-filter": "フィルターを使用", + "device-list-empty": "デバイスが選択されていません。", + "device-name-filter-required": "デバイス名フィルターは必須です。", + "device-name-filter-no-device-matched": "'{{device}}'で始まるデバイスが見つかりません。", + "add": "デバイスを追加", + "assign-to-customer": "顧客に割り当て", + "assign-device-to-customer": "顧客にデバイスを割り当て", + "assign-device-to-customer-text": "顧客に割り当てるデバイスを選択してください", + "make-public": "デバイスを公開にする", + "make-private": "デバイスを非公開にする", + "no-devices-text": "デバイスが見つかりません", + "assign-to-customer-text": "デバイスを割り当てる顧客を選択してください", + "device-details": "デバイス詳細", + "add-device-text": "新しいデバイスを追加", + "credentials": "認証情報", + "manage-credentials": "認証情報を管理", + "delete": "デバイスを削除", + "assign-devices": "デバイスを割り当て", + "assign-devices-text": "顧客に { count, plural, =1 {1 件のデバイス} other {# 件のデバイス} } を割り当て", + "delete-devices": "デバイスを削除", + "unassign-from-customer": "顧客から割り当て解除", + "unassign-devices": "デバイスの割り当て解除", + "unassign-devices-action-title": "顧客から { count, plural, =1 {1 件のデバイス} other {# 件のデバイス} } の割り当てを解除", + "unassign-device-from-edge-title": "デバイス'{{deviceName}}'の割り当てを解除してもよろしいですか?", + "unassign-device-from-edge-text": "確認後、デバイスの割り当てが解除され、edgeからアクセスできなくなります。", + "unassign-devices-from-edge": "Edgeからデバイスの割り当てを解除", + "assign-new-device": "新しいデバイスを割り当て", + "make-public-device-title": "デバイス'{{deviceName}}'を公開にしてもよろしいですか?", + "make-public-device-text": "確認後、デバイスとそのすべてのデータが公開され、他のユーザーがアクセスできるようになります。", + "make-private-device-title": "デバイス'{{deviceName}}'を非公開にしてもよろしいですか?", + "make-private-device-text": "確認後、デバイスとそのすべてのデータが非公開になり、他のユーザーはアクセスできなくなります。", + "view-credentials": "認証情報を表示", + "delete-device-title": "デバイス'{{deviceName}}'を削除してもよろしいですか?", + "delete-device-text": "注意: 確認後、デバイスと関連データはすべて復元できなくなります。", + "delete-devices-title": "{ count, plural, =1 {1 件のデバイス} other {# 件のデバイス} } を削除してもよろしいですか?", + "delete-devices-action-title": "{ count, plural, =1 {1 件のデバイス} other {# 件のデバイス} } を削除", + "delete-devices-text": "注意: 確認後、選択したすべてのデバイスが削除され、関連データはすべて復元できなくなります。", + "unassign-device-title": "デバイス'{{deviceName}}'の割り当てを解除してもよろしいですか?", + "unassign-device-text": "確認後、デバイスの割り当てが解除され、顧客がアクセスできなくなります。", + "unassign-device": "デバイスの割り当て解除", + "unassign-devices-title": "{ count, plural, =1 {1 件のデバイス} other {# 件のデバイス} } の割り当てを解除してもよろしいですか?", + "unassign-devices-text": "確認後、選択したすべてのデバイスの割り当てが解除され、顧客がアクセスできなくなります。", + "device-credentials": "デバイス認証情報", + "loading-device-credentials": "デバイス認証情報を読み込み中...", + "credentials-type": "認証情報タイプ", + "access-token": "アクセストークン", + "access-token-required": "アクセストークンは必須です。", + "access-token-invalid": "アクセストークンの長さは1〜32文字である必要があります。", + "certificate-pem-format": "PEM形式の証明書", + "certificate-pem-format-required": "証明書は必須です。", + "copy-access-token": "アクセストークンをコピー", + "copy-certificate": "証明書をコピー", + "copy-client-id": "クライアントIDをコピー", + "copy-user-name": "ユーザー名をコピー", + "copy-password": "パスワードをコピー", + "generate-client-id": "クライアントIDを生成", + "generate-user-name": "ユーザー名を生成", + "generate-password": "パスワードを生成", + "generate-access-token": "アクセストークンを生成", + "lwm2m-security-config": { + "identity": "クライアント識別子", + "identity-required": "クライアント識別子は必須です。", + "identity-tooltip": "PSK識別子は、標準[RFC7925]で説明されているとおり、最大128バイトの任意のPSK識別子です。\nPSK識別子はまず文字列に変換し、その後UTF-8を使用してオクテットにエンコードしなければなりません。", + "client-key": "クライアントキー", + "client-key-required": "クライアントキーは必須です。", + "client-key-tooltip-prk": "RPK公開鍵またはIDは標準[RFC7250]に準拠し、Base64形式にエンコードされている必要があります!", + "client-key-tooltip-psk": "PSKキーは標準[RFC4279]に準拠し、HexDec形式である必要があります: 32、64、128文字!", + "endpoint": "エンドポイントクライアント名", + "endpoint-required": "エンドポイントクライアント名は必須です。", + "client-public-key": "クライアント公開鍵", + "client-public-key-hint": "クライアント公開鍵が空の場合、信頼済み証明書が使用されます", + "client-public-key-tooltip": "X509公開鍵はDERエンコードされたX509v3形式で、ECアルゴリズムのみをサポートし、Base64形式にエンコードされている必要があります!", + "mode": "セキュリティ設定モード", + "client-tab": "クライアントセキュリティ設定", + "client-certificate": "クライアント証明書", + "bootstrap-tab": "ブートストラップクライアント", + "bootstrap-server": "ブートストラップサーバー", + "lwm2m-server": "LwM2Mサーバー", + "client-reboot": "登録更新トリガー", + "bootstrap-reboot": "ブートストラップ要求トリガー", + "client-publicKey-or-id": "クライアント公開鍵またはID", + "client-publicKey-or-id-required": "クライアント公開鍵またはIDは必須です。", + "client-publicKey-or-id-tooltip-psk": "PSK識別子は、標準[RFC7925]で説明されているとおり、最大128バイトの任意のPSK識別子です。\nPSK識別子はまず文字列に変換し、その後UTF-8を使用してオクテットにエンコードしなければなりません。", + "client-publicKey-or-id-tooltip-rpk": "RPK公開鍵またはIDは標準[RFC7250]に準拠し、Base64形式にエンコードされている必要があります!", + "client-publicKey-or-id-tooltip-x509": "X509公開鍵はDERエンコードされたX509v3形式で、ECアルゴリズムのみをサポートし、Base64形式にエンコードされている必要があります", + "client-secret-key": "クライアント秘密鍵", + "client-secret-key-required": "クライアント秘密鍵は必須です。", + "client-secret-key-tooltip-psk": "PSKキーは標準[RFC4279]に準拠し、HexDec形式である必要があります: 32、64、128文字!", + "client-secret-key-tooltip-prk": "RPK秘密鍵はPKCS_8形式(DERエンコード、標準[RFC5958])である必要があり、その後Base64形式にエンコードされている必要があります!", + "client-secret-key-tooltip-x509": "X509秘密鍵はPKCS_8形式(DERエンコード、標準[RFC5958])である必要があり、その後Base64形式にエンコードされている必要があります!" + }, + "client-id": "クライアントID", + "client-id-pattern": "無効な文字が含まれています。", + "user-name": "ユーザー名", + "user-name-required": "ユーザー名は必須です。", + "client-id-or-user-name-necessary": "クライアントIDおよび/またはユーザー名が必要です", + "password": "パスワード", + "secret": "シークレット", + "secret-required": "シークレットは必須です。", + "device-type": "デバイスプロファイル", + "device-type-required": "デバイスプロファイルは必須です。", + "select-device-type": "デバイスプロファイルを選択", + "enter-device-type": "デバイスプロファイルを入力", + "any-device": "任意のデバイス", + "no-device-types-matching": "'{{entitySubtype}}'に一致するデバイスプロファイルが見つかりません。", + "device-type-list-empty": "デバイスプロファイルが選択されていません!", + "device-profile-type-list-empty": "少なくとも1つのデバイスプロファイルを選択してください。", + "device-types": "デバイスプロファイル", + "name": "名前", + "name-required": "名前は必須です。", + "name-max-length": "名前は256未満である必要があります", + "label-max-length": "ラベルは256未満である必要があります", + "description": "説明", + "label": "ラベル", + "events": "イベント", + "details": "詳細", + "copyId": "デバイスIDをコピー", + "copyAccessToken": "アクセストークンをコピー", + "copy-mqtt-authentication": "MQTT認証情報をコピー", + "idCopiedMessage": "デバイスIDがクリップボードにコピーされました", + "accessTokenCopiedMessage": "デバイスのアクセストークンがクリップボードにコピーされました", + "mqtt-authentication-copied-message": "デバイスのMQTT認証情報がクリップボードにコピーされました", + "assignedToCustomer": "顧客に割り当て", + "unable-delete-device-alias-title": "デバイスエイリアスを削除できません", + "unable-delete-device-alias-text": "デバイスエイリアス'{{deviceAlias}}'は次のウィジェットで使用されているため削除できません:
{{widgetsList}}", + "is-gateway": "Gatewayかどうか", + "overwrite-activity-time": "接続されたデバイスのアクティビティ時刻を上書き", + "device-filter-title": "デバイスフィルター", + "filter-title": "フィルター", + "device-state": "デバイス状態", + "state": "状態", + "any": "任意", + "active": "アクティブ", + "inactive": "非アクティブ", + "public": "公開", + "device-public": "デバイスは公開されています", + "select-device": "デバイスを選択", + "import": "デバイスをインポート", + "device-file": "デバイスファイル", + "search": "デバイスを検索", + "selected-devices": "{ count, plural, =1 {デバイス 1 件} other {デバイス # 件} } を選択", + "device-configuration": "デバイス設定", + "transport-configuration": "トランスポート設定", + "wizard": { + "device-details": "デバイス詳細" + }, + "unassign-devices-from-edge-title": "{ count, plural, =1 {デバイス 1 件} other {デバイス # 件} } の割り当てを解除してもよろしいですか?", + "unassign-devices-from-edge-text": "確認後、選択したすべてのデバイスの割り当てが解除され、edgeからアクセスできなくなります。", + "time": "時間", + "connectivity": { + "check-connectivity": "接続を確認", + "device-created-check-connectivity": "デバイスを作成しました。接続を確認しましょう!", + "loading-check-connectivity-command": "接続確認コマンドを読み込み中...", + "use-following-instructions": "シェルを使用してデバイスの代わりにテレメトリを送信するには、以下の手順を使用してください", + "execute-following-command": "次のコマンドを実行", + "install-curl-windows": "Windows 10 b17063以降では、cURLがデフォルトで利用できます", + "install-curl-macos": "Mac OS X 10.2 6C115 (Jaguar)以降では、cURLがデフォルトで利用できます", + "install-mqtt-windows": "手順に従ってmosquitto_pubをダウンロード、インストール、設定して実行してください", + "install-coap-client": "手順に従ってcoap-clientをダウンロード、インストール、設定して実行してください", + "install-necessary-client-tools": "必要なクライアントツールをインストール", + "mqtts-x509-command": "次のドキュメントを使用して、X509認証でMQTT経由でデバイスを接続してください", + "coaps-x509-command": "次のドキュメントを使用して、X509認証でDTLS上のCoAP経由でデバイスを接続してください", + "snmp-command": "次のドキュメントを使用して、SNMP経由でデバイスを接続してください。", + "sparkplug-command": "次のドキュメントを使用して、MQTT Sparkplug経由でデバイスを接続してください。", + "lwm2m-command": "次のドキュメントを使用して、LWM2M経由でデバイスを接続してください。" + } + }, + "dynamic-form": { + "property": { + "properties": "プロパティ", + "property": "プロパティ", + "id": "ID", + "name": "名前", + "type": "タイプ", + "type-text": "テキスト", + "type-password": "パスワード", + "type-textarea": "テキストエリア", + "type-number": "数値", + "type-switch": "スイッチ", + "type-select": "選択", + "type-radios": "ラジオボタン", + "type-datetime": "日付/時刻", + "type-image": "画像", + "type-javascript": "JavaScript", + "type-json": "JSON", + "type-html": "HTML", + "type-css": "CSS", + "type-markdown": "Markdown", + "type-color": "色", + "type-color-settings": "色設定", + "type-font": "フォント", + "type-units": "単位", + "type-icon": "アイコン", + "type-fieldset": "フィールドセット", + "type-array": "配列", + "type-html-section": "HTMLセクション", + "group-title": "グループタイトル", + "no-properties": "プロパティが設定されていません", + "add-property": "プロパティを追加", + "property-settings": "プロパティ設定", + "remove-property": "プロパティを削除", + "default-value": "デフォルト値", + "value-required": "値は必須です", + "number-settings": "数値設定", + "min": "最小", + "max": "最大", + "step": "ステップ", + "selected-options-limit": "選択オプション数の上限", + "advanced-ui-settings": "高度なUI設定", + "disable-on-property": "プロパティにより無効化", + "disable-on-property-none": "なし(フィールドは常に有効)", + "display-condition-function": "表示条件関数", + "sub-label": "サブラベル", + "vertical-divider-after": "後に縦区切り線", + "input-field-suffix": "入力フィールドのサフィックス", + "property-row-classes": "プロパティ行クラス", + "property-field-classes": "プロパティフィールドクラス", + "not-unique-property-ids-error": "プロパティIDは一意である必要があります!", + "enable-multiple-select": "複数選択を有効化", + "allow-empty-select-option": "空のオプションを許可", + "select-options": "選択オプション", + "not-unique-select-option-value-error": "選択オプションの値は一意である必要があります!", + "value": "値", + "label": "ラベル", + "add-option": "オプションを追加", + "no-options": "オプションが設定されていません", + "remove-option": "オプションを削除", + "textarea-rows": "テキストエリア行数", + "help-id": "ヘルプID", + "buttons-direction": "ボタンの並び方向", + "direction-row": "行", + "direction-column": "列", + "radio-button-options": "ラジオボタンオプション", + "datetime-type": "日付/時刻フィールドタイプ", + "datetime-type-date": "日付", + "datetime-type-time": "時刻", + "datetime-type-datetime": "日付/時刻", + "enable-clear-button": "クリアボタンを有効化", + "html-section-settings": "HTMLセクション設定", + "html-section-classes": "HTMLセクションクラス", + "html-section-content": "HTMLセクション内容", + "array-item": "配列項目", + "item-type": "項目タイプ", + "item-name": "項目名", + "no-items": "項目がありません", + "support-unit-conversion": "単位変換をサポート" + }, + "clear-form": "フォームをクリア", + "clear-form-prompt": "すべてのフォームプロパティを削除してもよろしいですか?", + "import-form": "JSONからフォームをインポート", + "export-form": "フォームをJSONにエクスポート", + "json-file": "JSONファイル", + "json-content": "JSON内容", + "invalid-form-json-file-error": "JSONからフォームをインポートできません: 無効なフォームJSONデータ構造です。" + }, + "asset-profile": { + "asset-profile": "アセットプロファイル", + "asset-profiles": "アセットプロファイル", + "all-asset-profiles": "すべて", + "add": "アセットプロファイルを追加", + "edit": "アセットプロファイルを編集", + "asset-profile-details": "アセットプロファイル詳細", + "no-asset-profiles-text": "アセットプロファイルが見つかりません", + "search": "アセットプロファイルを検索", + "selected-asset-profiles": "{ count, plural, =1 {アセットプロファイル 1 件} other {アセットプロファイル # 件} } を選択", + "no-asset-profiles-matching": "'{{entity}}'に一致するアセットプロファイルが見つかりません。", + "asset-profile-required": "アセットプロファイルは必須です", + "idCopiedMessage": "アセットプロファイルIDがクリップボードにコピーされました", + "set-default": "アセットプロファイルをデフォルトにする", + "delete": "アセットプロファイルを削除", + "copyId": "アセットプロファイルIDをコピー", + "name-max-length": "名前は256未満である必要があります", + "new-device-profile-name": "アセットプロファイル名", + "new-device-profile-name-required": "アセットプロファイル名は必須です。", + "name": "名前", + "name-required": "名前は必須です。", + "image": "アセットプロファイル画像", + "description": "説明", + "default": "デフォルト", + "default-rule-chain": "デフォルトルールチェーン", + "default-edge-rule-chain": "デフォルトedgeルールチェーン", + "default-edge-rule-chain-hint": "Edgeで、このアセットプロファイルのアセットの受信データを処理するルールチェーンとして使用されます", + "mobile-dashboard": "モバイルダッシュボード", + "mobile-dashboard-hint": "モバイルアプリケーションでアセット詳細ダッシュボードとして使用されます", + "select-queue-hint": "ドロップダウンリストから選択してください。", + "delete-asset-profile-title": "アセットプロファイル'{{assetProfileName}}'を削除してもよろしいですか?", + "delete-asset-profile-text": "注意: 確認後、アセットプロファイルと関連データはすべて復元できなくなります。", + "delete-asset-profiles-title": "{ count, plural, =1 {アセットプロファイル 1 件} other {アセットプロファイル # 件} } を削除してもよろしいですか?", + "delete-asset-profiles-text": "注意: 確認後、選択したすべてのアセットプロファイルが削除され、関連データはすべて復元できなくなります。", + "set-default-asset-profile-title": "アセットプロファイル'{{assetProfileName}}'をデフォルトにしてもよろしいですか?", + "set-default-asset-profile-text": "確認後、このアセットプロファイルはデフォルトとしてマークされ、プロファイル未指定の新しいアセットに使用されます。", + "no-asset-profiles-found": "アセットプロファイルが見つかりません。", + "create-new-asset-profile": "新しく作成します!", + "create-asset-profile": "新しいアセットプロファイルを作成", + "import": "アセットプロファイルをインポート", + "export": "アセットプロファイルをエクスポート", + "export-failed-error": "アセットプロファイルをエクスポートできません: {{error}}", + "asset-profile-file": "アセットプロファイルファイル", + "invalid-asset-profile-file-error": "アセットプロファイルをインポートできません: 無効なアセットプロファイルデータ構造です。" + }, + "device-profile": { + "device-profile": "デバイスプロファイル", + "device-profiles": "デバイスプロファイル", + "all-device-profiles": "すべて", + "add": "デバイスプロファイルを追加", + "edit": "デバイスプロファイルを編集", + "device-profile-details": "デバイスプロファイル詳細", + "no-device-profiles-text": "デバイスプロファイルが見つかりません", + "search": "デバイスプロファイルを検索", + "selected-device-profiles": "{ count, plural, =1 {デバイスプロファイル 1 件} other {デバイスプロファイル # 件} } を選択", + "no-device-profiles-matching": "'{{entity}}'に一致するデバイスプロファイルが見つかりません。", + "device-profile-required": "デバイスプロファイルは必須です", + "idCopiedMessage": "デバイスプロファイルIDがクリップボードにコピーされました", + "set-default": "デバイスプロファイルをデフォルトにする", + "delete": "デバイスプロファイルを削除", + "copyId": "デバイスプロファイルIDをコピー", + "name-max-length": "名前は256未満である必要があります", + "name": "名前", + "name-required": "名前は必須です。", + "type": "プロファイルタイプ", + "type-required": "プロファイルタイプは必須です。", + "type-default": "デフォルト", + "image": "デバイスプロファイル画像", + "transport-type": "トランスポートタイプ", + "transport-type-required": "トランスポートタイプは必須です。", + "transport-type-default": "デフォルト", + "transport-type-default-hint": "基本的なMQTT、HTTP、CoAPトランスポートをサポート", + "transport-type-mqtt": "MQTT", + "transport-type-mqtt-hint": "高度なMQTTトランスポート設定を有効化", + "transport-type-coap": "CoAP", + "transport-type-coap-hint": "高度なCoAPトランスポート設定を有効化", + "transport-type-lwm2m": "LWM2M", + "transport-type-lwm2m-hint": "LWM2Mトランスポートタイプ", + "transport-type-snmp": "SNMP", + "transport-type-snmp-hint": "SNMPトランスポート設定を指定", + "transport-type-http": "HTTP", + "description": "説明", + "default": "デフォルト", + "profile-configuration": "プロファイル設定", + "transport-configuration": "トランスポート設定", + "default-rule-chain": "デフォルトルールチェーン", + "default-edge-rule-chain": "デフォルトedgeルールチェーン", + "default-edge-rule-chain-hint": "Edgeで、このデバイスプロファイルのデバイスの受信データを処理するルールチェーンとして使用されます", + "mobile-dashboard": "モバイルダッシュボード", + "mobile-dashboard-hint": "モバイルアプリケーションでデバイス詳細ダッシュボードとして使用されます", + "select-queue-hint": "ドロップダウンリストから選択してください。", + "delete-device-profile-title": "デバイスプロファイル'{{deviceProfileName}}'を削除してもよろしいですか?", + "delete-device-profile-text": "注意: 確認後、デバイスプロファイルと関連データ(関連するOTAアップデートを含む)はすべて復元できなくなります。", + "delete-device-profiles-title": "{ count, plural, =1 {デバイスプロファイル 1 件} other {デバイスプロファイル # 件} } を削除してもよろしいですか?", + "delete-device-profiles-text": "注意: 確認後、選択したすべてのデバイスプロファイルが削除され、関連データ(関連するOTAアップデートを含む)はすべて復元できなくなります。", + "set-default-device-profile-title": "デバイスプロファイル'{{deviceProfileName}}'をデフォルトにしてもよろしいですか?", + "set-default-device-profile-text": "確認後、このデバイスプロファイルはデフォルトとしてマークされ、プロファイル未指定の新しいデバイスに使用されます。", + "no-device-profiles-found": "デバイスプロファイルが見つかりません。", + "create-new-device-profile": "新しく作成します!", + "mqtt-device-topic-filters": "MQTTデバイストピックフィルター", + "mqtt-device-topic-filters-unique": "MQTTデバイストピックフィルターは一意である必要があります。", + "mqtt-device-topic-filters-spark-plug": "MQTT Sparkplug B Edge of Network (EoN) ノード。", + "mqtt-device-topic-filters-spark-plug-hint": "Sparkplug Bペイロードとトピック形式を持つEoNノードからの接続を許可します。", + "mqtt-device-topic-filters-spark-plug-attribute-metric-names": "属性として保存するSparkPlugメトリクス。", + "mqtt-device-topic-filters-spark-plug-attribute-metric-names-hint": "デバイス属性として保存されるSparkPlugメトリクスの名前。その他のすべてのメトリクスはデバイステレメトリとして保存されます。", + "mqtt-device-payload-type": "MQTTデバイスペイロード", + "mqtt-device-payload-type-json": "JSON", + "mqtt-device-payload-type-proto": "Protobuf", + "mqtt-enable-compatibility-with-json-payload-format": "他のペイロード形式との互換性を有効化。", + "mqtt-enable-compatibility-with-json-payload-format-hint": "有効にすると、プラットフォームはデフォルトでProtobufペイロード形式を使用します。解析に失敗した場合、プラットフォームはJSONペイロード形式の使用を試みます。ファームウェアアップデート中の後方互換性に有用です。たとえば、ファームウェアの初期リリースはJsonを使用し、新しいリリースはProtobufを使用します。デバイス群のファームウェア更新の過程では、ProtobufとJSONの両方を同時にサポートする必要があります。互換モードはわずかな性能低下を招くため、すべてのデバイスが更新されたらこのモードを無効にすることを推奨します。", + "mqtt-use-json-format-for-default-downlink-topics": "デフォルトのダウンリンクトピックにJson形式を使用", + "mqtt-use-json-format-for-default-downlink-topics-hint": "有効にすると、プラットフォームは次のトピックを介して属性とRPCをプッシュするためにJsonペイロード形式を使用します: v1/devices/me/attributes/response/$request_id, v1/devices/me/attributes, v1/devices/me/rpc/request/$request_id, v1/devices/me/rpc/response/$request_id。この設定は、新しい(v2)トピックを使用して送信される属性およびrpcサブスクリプションには影響しません: v2/a/res/$request_id, v2/a, v2/r/req/$request_id, v2/r/res/$request_id。ここで $request_id は整数のリクエスト識別子です。", + "mqtt-send-ack-on-validation-exception": "PUBLISHメッセージの検証失敗時にPUBACKを送信", + "mqtt-send-ack-on-validation-exception-hint": "デフォルトでは、プラットフォームはメッセージ検証失敗時にMQTTセッションを閉じます。有効にすると、セッションを閉じる代わりにPUBLISH確認応答を送信します。", + "mqtt-protocol-version": "プロトコルバージョン", + "snmp-add-mapping": "SNMPマッピングを追加", + "snmp-mapping-not-configured": "OIDから時系列/テレメトリへのマッピングが設定されていません", + "snmp-timseries-or-attribute-name": "マッピング用の時系列/属性名", + "snmp-timseries-or-attribute-type": "マッピング用の時系列/属性タイプ", + "snmp-method-pdu-type-get-request": "GetRequest", + "snmp-method-pdu-type-get-next-request": "GetNextRequest", + "snmp-oid": "OID", + "transport-device-payload-type-json": "JSON", + "transport-device-payload-type-proto": "Protobuf", + "mqtt-payload-type-required": "ペイロードタイプは必須です。", + "coap-device-type": "CoAPデバイスタイプ", + "coap-device-payload-type": "CoAPデバイスペイロード", + "coap-device-type-required": "CoAPデバイスタイプは必須です。", + "coap-device-type-default": "デフォルト", + "coap-device-type-efento": "Efento NB-IoT", + "support-level-wildcards": "単一レベル [+] およびマルチレベル [#] のワイルドカードをサポートします。", + "telemetry-topic-filter": "テレメトリトピックフィルター", + "telemetry-topic-filter-required": "テレメトリトピックフィルターは必須です。", + "attributes-topic-filter": "属性パブリッシュトピックフィルター", + "attributes-subscribe-topic-filter": "属性サブスクライブトピックフィルター", + "attributes-topic-filter-required": "属性パブリッシュトピックフィルターは必須です。", + "attributes-subscribe-topic-filter-required": "属性サブスクライブトピックは必須です", + "telemetry-proto-schema": "テレメトリprotoスキーマ", + "telemetry-proto-schema-required": "テレメトリprotoスキーマは必須です。", + "attributes-proto-schema": "属性protoスキーマ", + "attributes-proto-schema-required": "属性protoスキーマは必須です。", + "rpc-response-proto-schema": "RPCレスポンスprotoスキーマ", + "rpc-response-proto-schema-required": "RPCレスポンスprotoスキーマは必須です。", + "rpc-response-topic-filter": "RPCレスポンストピックフィルター", + "rpc-response-topic-filter-required": "RPCレスポンストピックフィルターは必須です。", + "rpc-request-proto-schema": "RPCリクエストprotoスキーマ", + "rpc-request-proto-schema-required": "RPCリクエストprotoスキーマは必須です。", + "rpc-request-proto-schema-hint": "RPCリクエストメッセージには常にフィールドが必要です: string method = 1; int32 requestId = 2; and params = 3 of any data type.", + "not-valid-pattern-topic-filter": "無効なトピックフィルターパターン", + "not-valid-single-character": "単一レベルのワイルドカード文字の使用が無効です", + "not-valid-multi-character": "マルチレベルのワイルドカード文字の使用が無効です", + "single-level-wildcards-hint": "[+] は任意のトピックフィルターレベルに適しています。例: v1/devices/+/telemetry または +/devices/+/attributes。", + "multi-level-wildcards-hint": "[#] はトピックフィルター自体を置き換えることができ、トピックの最後の記号である必要があります。例: # または v1/devices/me/#。", + "alarm-rules": "アラームルール", + "alarm-rules-with-count": "アラームルール ({{count}})", + "no-alarm-rules": "アラームルールが設定されていません", + "add-alarm-rule": "アラームルールを追加", + "edit-alarm-rule": "アラームルールを編集", + "alarm-type": "アラームタイプ", + "alarm-type-required": "アラームタイプは必須です。", + "alarm-type-unique": "アラームタイプは、デバイスプロファイルのアラームルール内で一意である必要があります。", + "alarm-type-max-length": "アラームタイプは256未満である必要があります", + "create-alarm-pattern": "{{alarmType}} アラームを作成", + "create-alarm-rules": "アラームルールを作成", + "no-create-alarm-rules": "作成条件が設定されていません", + "add-create-alarm-rule-prompt": "作成アラームルールを追加してください", + "clear-alarm-rule": "クリアアラームルール", + "no-clear-alarm-rule": "クリア条件が設定されていません", + "add-create-alarm-rule": "作成条件を追加", + "add-clear-alarm-rule": "クリア条件を追加", + "select-alarm-severity": "アラーム重大度を選択", + "alarm-severity-required": "アラーム重大度は必須です。", + "condition-duration": "条件期間", + "condition-duration-value": "期間値", + "condition-duration-time-unit": "時間単位", + "condition-duration-value-range": "期間値は1〜2147483647の範囲である必要があります。", + "condition-duration-value-pattern": "期間値は整数である必要があります。", + "condition-duration-value-required": "期間値は必須です。", + "condition-duration-time-unit-required": "時間単位は必須です。", + "advanced-settings": "高度な設定", + "alarm-rule-additional-info": "追加情報", + "edit-alarm-rule-additional-info": "追加情報を編集", + "alarm-rule-additional-info-placeholder": "ここにコメントや調整内容を入力すると、アラーム詳細の「追加情報」に表示されます", + "alarm-rule-additional-info-hint": "ヒント: ${keyName} を使用して、アラームルール条件で使用される属性またはテレメトリキーの値を置換できます。", + "alarm-rule-mobile-dashboard": "モバイルダッシュボード", + "alarm-rule-mobile-dashboard-hint": "モバイルアプリケーションでアラーム詳細ダッシュボードとして使用されます", + "alarm-rule-no-mobile-dashboard": "ダッシュボードが選択されていません", + "propagate-alarm": "関連エンティティへアラームを伝播", + "alarm-rule-relation-types-list": "リレーションタイプ", + "alarm-rule-relation-types-list-hint": "関連エンティティをフィルタリングするためのリレーションタイプを定義します。設定されていない場合、アラームはすべての関連エンティティに伝播されます。", + "propagate-alarm-to-owner": "エンティティ所有者(顧客またはテナント)へアラームを伝播", + "propagate-alarm-to-tenant": "テナントへアラームを伝播", + "alarm-rule-condition": "アラームルール条件", + "enter-alarm-rule-condition-prompt": "アラームルール条件を追加してください", + "edit-alarm-rule-condition": "アラームルール条件を編集", + "device-provisioning": "デバイスプロビジョニング", + "provision-strategy": "プロビジョニング戦略", + "provision-strategy-required": "プロビジョニング戦略は必須です。", + "provision-strategy-disabled": "無効", + "provision-strategy-created-new": "新しいデバイスの作成を許可", + "provision-strategy-check-pre-provisioned": "事前プロビジョニング済みデバイスを確認", + "provision-device-key": "プロビジョニングデバイスキー", + "provision-device-key-required": "プロビジョニングデバイスキーは必須です。", + "copy-provision-key": "プロビジョニングキーをコピー", + "provision-key-copied-message": "プロビジョニングキーがクリップボードにコピーされました", + "provision-device-secret": "プロビジョニングデバイスシークレット", + "provision-device-secret-required": "プロビジョニングデバイスシークレットは必須です。", + "copy-provision-secret": "プロビジョニングシークレットをコピー", + "provision-secret-copied-message": "プロビジョニングシークレットがクリップボードにコピーされました", + "provision-strategy-x509": { + "certificate-chain": "X509証明書チェーン", + "certificate-chain-hint": "X.509証明書戦略は、双方向TLS通信におけるクライアント証明書でデバイスをプロビジョニングするために使用されます。", + "allow-create-new-devices": "新しいデバイスを作成", + "allow-create-new-devices-hint": "選択すると、新しいデバイスが作成され、クライアント証明書がデバイス認証情報として使用されます。", + "certificate-value": "PEM形式の証明書", + "certificate-value-required": "PEM形式の証明書は必須です", + "cn-regex-variable": "CN正規表現変数", + "cn-regex-variable-required": "CN正規表現変数は必須です", + "cn-regex-variable-hint": "デバイスのX509証明書の共通名からデバイス名を取得するために必要です。" + }, + "condition": "条件", + "condition-type": "条件タイプ", + "condition-type-simple": "簡易", + "condition-type-duration": "期間", + "condition-during": "{{during}} の間", + "condition-during-dynamic": "\"{{ attribute }}\" の間 ({{during}})", + "condition-type-repeating": "繰り返し", + "condition-type-required": "条件タイプは必須です。", + "condition-repeating-value": "イベント数", + "condition-repeating-value-range": "イベント数は1〜2147483647の範囲である必要があります。", + "condition-repeating-value-pattern": "イベント数は整数である必要があります。", + "condition-repeating-value-required": "イベント数は必須です。", + "condition-repeat-times": "繰り返し { count, plural, =1 {1 回} other {# 回} }", + "condition-repeat-times-dynamic": "\"{ attribute }\" を繰り返し ({ count, plural, =1 {1 回} other {# 回} })", + "schedule-type": "スケジューラータイプ", + "schedule-type-required": "スケジューラータイプは必須です。", + "schedule": "スケジュール", + "edit-schedule": "アラームスケジュールを編集", + "schedule-any-time": "常に有効", + "schedule-specific-time": "特定の時間に有効", + "schedule-custom": "カスタム", + "schedule-day": { + "monday": "月曜日", + "tuesday": "火曜日", + "wednesday": "水曜日", + "thursday": "木曜日", + "friday": "金曜日", + "saturday": "土曜日", + "sunday": "日曜日" + }, + "schedule-days": "曜日", + "schedule-time": "時刻", + "schedule-time-from": "開始", + "schedule-time-to": "終了", + "schedule-days-of-week-required": "少なくとも1つの曜日を選択してください。", + "create-device-profile": "新しいデバイスプロファイルを作成", + "import": "デバイスプロファイルをインポート", + "export": "デバイスプロファイルをエクスポート", + "export-failed-error": "デバイスプロファイルをエクスポートできません: {{error}}", + "device-profile-file": "デバイスプロファイルファイル", + "invalid-device-profile-file-error": "デバイスプロファイルをインポートできません: 無効なデバイスプロファイルデータ構造です。", + "power-saving-mode": "省電力モード", + "power-saving-mode-type": { + "default": "デバイスプロファイルの省電力モードを使用", + "psm": "省電力モード (PSM)", + "drx": "断続受信 (DRX)", + "edrx": "拡張断続受信 (eDRX)" + }, + "edrx-cycle": "eDRXサイクル", + "edrx-cycle-required": "eDRXサイクルは必須です。", + "edrx-cycle-pattern": "eDRXサイクルは正の整数である必要があります。", + "edrx-cycle-min": "eDRXサイクルの最小値は {{ min }} 秒です。", + "paging-transmission-window": "ページング送信ウィンドウ", + "paging-transmission-window-required": "ページング送信ウィンドウは必須です。", + "paging-transmission-window-pattern": "ページング送信ウィンドウは正の整数である必要があります。", + "paging-transmission-window-min": "ページング送信ウィンドウの最小値は {{ min }} 秒です。", + "psm-activity-timer": "PSMアクティビティタイマー", + "psm-activity-timer-required": "PSMアクティビティタイマーは必須です。", + "psm-activity-timer-pattern": "PSMアクティビティタイマーは正の整数である必要があります。", + "psm-activity-timer-min": "PSMアクティビティタイマーの最小値は {{ min }} 秒です。", + "lwm2m": { + "object-list": "オブジェクト一覧", + "object-list-empty": "オブジェクトが選択されていません。", + "no-objects-found": "オブジェクトが見つかりません。", + "no-objects-matching": "'{{object}}'に一致するオブジェクトが見つかりません。", + "model-tab": "LWM2Mモデル", + "add-new-instances": "新しいインスタンスを追加", + "instances-list": "インスタンス一覧", + "instances-list-required": "インスタンス一覧は必須です。", + "instance-id-pattern": "インスタンスIDは正の整数である必要があります。", + "instance-id-max": "インスタンスIDの最大値は {{max}} です。", + "instance": "インスタンス", + "resource-label": "#ID リソース名", + "observe-label": "監視", + "attribute-label": "属性", + "telemetry-label": "テレメトリ", + "edit-observe-select": "監視を編集するには、テレメトリまたは属性を選択してください", + "edit-attributes-select": "属性を編集するには、テレメトリまたは属性を選択してください", + "no-attributes-set": "属性が設定されていません", + "key-name": "キー名", + "key-name-required": "キー名は必須です", + "attribute-name": "名前属性", + "attribute-name-required": "名前属性は必須です。", + "attribute-value": "属性値", + "attribute-value-required": "属性値は必須です。", + "attribute-value-pattern": "属性値は正の整数である必要があります。", + "edit-attributes": "属性を編集: {{ name }}", + "view-attributes": "属性を表示: {{ name }}", + "add-attribute": "属性を追加", + "edit-attribute": "属性を編集", + "view-attribute": "属性を表示", + "remove-attribute": "属性を削除", + "delete-server-text": "注意: 確認後、サーバー設定は復元できなくなります。", + "delete-server-title": "サーバーを削除してもよろしいですか?", + "mode": "セキュリティ設定モード", + "bootstrap-tab": "ブートストラップ", + "bootstrap-server-legend": "ブートストラップサーバー (ShortId...)", + "lwm2m-server-legend": "LwM2Mサーバー (ShortId...)", + "server": "サーバー", + "short-id": "短縮サーバーID", + "short-id-tooltip": "サーバー短縮ID。サーバーのオブジェクトインスタンスを関連付けるリンクとして使用されます。\nこの識別子は、LwM2Mクライアントに設定された各LwM2Mサーバーを一意に識別します。\nブートストラップサーバーリソースの値が 'false' の場合、このリソースを設定する必要があります。\nID:0 および ID:65535 の値は、LwM2Mサーバーの識別に使用してはいけません。", + "short-id-tooltip-bootstrap": "サーバー短縮ID。サーバーのオブジェクトインスタンスを関連付けるリンクとして使用されます。\nこの識別子は、LwM2Mクライアントに設定された各LwM2Mサーバーを一意に識別します。\nブートストラップサーバーリソースの値が 'false' の場合、このリソースを設定する必要があります。", + "short-id-required": "短縮サーバーIDは必須です。", + "short-id-range": "短縮サーバーIDは {{ min }} から {{ max }} の範囲である必要があります。", + "short-id-pattern": "短縮サーバーIDは正の整数である必要があります。", + "short-id-pattern-bs": "ショートサーバー ID は null のみ指定できます", + "lifetime": "クライアント登録の有効期間", + "lifetime-required": "クライアント登録の有効期間は必須です。", + "lifetime-pattern": "クライアント登録の有効期間は正の整数である必要があります。", + "default-min-period": "2つの通知間の最小期間 (s)", + "default-min-period-tooltip": "このパラメータがObservationに含まれていない場合に、LwM2MクライアントがObservationのMinimum Periodとして使用すべきデフォルト値。", + "default-min-period-required": "最小期間は必須です。", + "default-min-period-pattern": "最小期間は正の整数である必要があります。", + "notification-storing": "無効またはオフライン時の通知保存", + "binding": "バインディング", + "binding-type": { + "u": "U: クライアントは常にUDPバインディングで到達可能です。", + "m": "M: クライアントは常にMQTTバインディングで到達可能です。", + "h": "H: クライアントは常にHTTPバインディングで到達可能です。", + "t": "T: クライアントは常にTCPバインディングで到達可能です。", + "s": "S: クライアントは常にSMSバインディングで到達可能です。", + "n": "N: クライアントは、そのようなリクエストへの応答をNon-IPバインディング経由で送信する必要があります (LWM2M 1.1 からサポート)。", + "uq": "UQ: キュー・モードのUDP接続 (LWM2M 1.1 以降ではサポートされません)", + "uqs": "UQS: UDPとSMSの両方の接続が有効; UDPはキュー・モード、SMSは標準モード (LWM2M 1.1 以降ではサポートされません)", + "tq": "TQ: キュー・モードのTCP接続 (LWM2M 1.1 以降ではサポートされません)", + "tqs": "TQS: TCPとSMSの両方の接続が有効; TCPはキュー・モード、SMSは標準モード (LWM2M 1.1 以降ではサポートされません)", + "sq": "SQ: キュー・モードのSMS接続 (LWM2M 1.1 以降ではサポートされません)" + }, + "binding-tooltip": "これはLwM2Mサーバーオブジェクト - /1/x/7 の\"binding\"リソースにある一覧です。\nLwM2Mクライアントでサポートされるバインディングモードを示します。\nこの値は、デバイスオブジェクト (/3/0/16) の “Supported Binding and Modes” リソースの値と同じであるべきです。\n複数のトランスポートがサポートされていても、トランスポートセッション全体で使用できるトランスポートバインディングは1つだけです。\n例えばUDPとSMSの両方がサポートされる場合、LwM2MクライアントとLwM2Mサーバーはトランスポートセッション全体でUDPまたはSMSのいずれかで通信することを選択できます。", + "bootstrap-server": "ブートストラップサーバー", + "lwm2m-server": "LwM2Mサーバー", + "include-bootstrap-server": "ブートストラップサーバーの更新を含める", + "bootstrap-update-title": "ブートストラップサーバーはすでに設定されています。更新を除外してもよろしいですか?", + "bootstrap-update-text": "注意: 確認後、ブートストラップサーバーの設定データは復元できなくなります。", + "server-host": "ホスト", + "server-host-required": "ホストは必須です。", + "server-port": "ポート", + "server-port-required": "ポートは必須です。", + "server-port-pattern": "ポートは正の整数である必要があります。", + "server-port-range": "ポートは1〜65535の範囲である必要があります。", + "server-public-key": "サーバー公開鍵", + "server-public-key-required": "サーバー公開鍵は必須です。", + "client-hold-off-time": "ホールドオフ時間", + "client-hold-off-time-required": "ホールドオフ時間は必須です。", + "client-hold-off-time-pattern": "ホールドオフ時間は正の整数である必要があります。", + "client-hold-off-time-tooltip": "ブートストラップサーバーでのみ使用するクライアントホールドオフ時間", + "account-after-timeout": "タイムアウト後のアカウント", + "account-after-timeout-required": "タイムアウト後のアカウントは必須です。", + "account-after-timeout-pattern": "タイムアウト後のアカウントは正の整数である必要があります。", + "account-after-timeout-tooltip": "このリソースで指定されたタイムアウト値後のブートストラップサーバーアカウント。", + "server-type": "サーバータイプ", + "add-new-server-title": "新しいサーバー設定を追加", + "add-server-config": "サーバー設定を追加", + "add-lwm2m-server-config": "LwM2Mサーバーを追加", + "no-config-servers": "サーバーが設定されていません", + "others-tab": "その他の設定", + "ota-update": "OTA更新", + "use-object-19-for-ota-update": "オブジェクト19をOTAファイルメタデータ(チェックサム、サイズ、バージョン、名前)に使用", + "use-object-19-for-ota-update-hint": "OTA更新に Resource ObjectId = 19 を使用: FirmWare → InstanceId = 65534, SoftWare → InstanceId = 65535。データ形式は Base64 でラップされた JSON です。この JSON には OTA ファイルメタデータ(ファイル情報)が含まれます: \"Checksum\" (SHA256)。追加フィールド: \"Title\" (OTA名), \"Version\" (OTAバージョン), \"File Name\" (クライアントでOTAを保存するためのファイル名), \"File Size\" (バイト単位のOTAサイズ)。", + "client-strategy": "接続時のクライアント戦略", + "client-strategy-label": "戦略", + "client-strategy-only-observe": "初回接続後、クライアントへのObserveリクエストのみ", + "client-strategy-read-all": "登録後、すべてのリソースを読み取り & クライアントへのObserveリクエスト", + "fw-update": "ファームウェア更新", + "fw-update-strategy": "ファームウェア更新戦略", + "fw-update-strategy-data": "オブジェクト19とリソース0 (Data) を使用して、バイナリファイルとしてファームウェア更新をプッシュ", + "fw-update-strategy-package": "オブジェクト5とリソース0 (Package) を使用して、バイナリファイルとしてファームウェア更新をプッシュ", + "fw-update-strategy-package-uri": "パッケージをダウンロードする一意のCoAP URLを自動生成し、オブジェクト5とリソース1 (Package URI) としてファームウェア更新をプッシュ", + "sw-update": "ソフトウェア更新", + "sw-update-strategy": "ソフトウェア更新戦略", + "sw-update-strategy-package": "オブジェクト9とリソース2 (Package) を使用してバイナリファイルをプッシュ", + "sw-update-strategy-package-uri": "パッケージをダウンロードする一意のCoAP URLを自動生成し、オブジェクト9とリソース3 (Package URI) を使用してソフトウェア更新をプッシュ", + "fw-update-resource": "ファームウェア更新CoAPリソース", + "fw-update-resource-required": "ファームウェア更新CoAPリソースは必須です。", + "sw-update-resource": "ソフトウェア更新CoAPリソース", + "sw-update-resource-required": "ソフトウェア更新CoAPリソースは必須です。", + "config-json-tab": "Json設定プロファイルデバイス", + "attributes-name": { + "min-period": "最小期間", + "max-period": "最大期間", + "greater-than": "より大きい", + "less-than": "より小さい", + "step": "ステップ", + "min-evaluation-period": "最小評価期間", + "max-evaluation-period": "最大評価期間" + }, + "default-object-id": "デフォルトオブジェクトバージョン(属性)", + "default-object-id-ver": { + "v1-0": "1.0", + "v1-1": "1.1", + "v1-2": "1.2" + }, + "observe-strategy": { + "observe-strategy": "観察戦略", + "single": "単一", + "single-description": "リソースごとに1回のObserveリクエスト(精度が高いが、ネットワークトラフィックが多くなる)", + "composite-all": "すべてのリソースを複合的に観察", + "composite-all-description": "すべてのリソースを1回の複合Observeリクエストで観察(効率的だが柔軟性に欠ける)", + "composite-by-object": "オブジェクトごとに複合的に観察", + "composite-by-object-description": "リソースをオブジェクトタイプごとにグループ化し、複数のComposite Observeリクエストで観察(バランスの取れたアプローチ)" + }, + "init-attr-tel-as-obs-strategy": "Observe 戦略を使用して属性とテレメトリを初期化", + "init-attr-tel-as-obs-strategy-hint": "false の場合 - 属性とテレメトリは値を 1 つずつ読み取って初期化されます。\\ntrue の場合 - Observe 戦略を使用して値をサブスクライブすることで、属性とテレメトリが初期化されます。" + }, + "snmp": { + "add-communication-config": "通信設定を追加", + "add-mapping": "マッピングを追加", + "authentication-passphrase": "認証パスフレーズ", + "authentication-passphrase-required": "認証パスフレーズは必須です。", + "authentication-protocol": "認証プロトコル", + "authentication-protocol-required": "認証プロトコルは必須です。", + "communication-configs": "通信設定", + "community": "コミュニティ文字列", + "community-required": "コミュニティ文字列は必須です。", + "context-name": "コンテキスト名", + "data-key": "データキー", + "data-key-required": "データキーは必須です。", + "data-type": "データ型", + "data-type-required": "データ型は必須です。", + "engine-id": "エンジンID", + "host": "ホスト", + "host-required": "ホストは必須です。", + "oid": "OID", + "oid-pattern": "無効なOID形式です。", + "oid-required": "OIDは必須です。", + "please-add-communication-config": "通信設定を追加してください", + "please-add-mapping-config": "マッピング設定を追加してください", + "port": "ポート", + "port-format": "無効なポート形式です。", + "port-required": "ポートは必須です。", + "privacy-passphrase": "プライバシーパスフレーズ", + "privacy-passphrase-required": "プライバシーパスフレーズは必須です。", + "privacy-protocol": "プライバシープロトコル", + "privacy-protocol-required": "プライバシープロトコルは必須です。", + "protocol-version": "プロトコルバージョン", + "protocol-version-required": "プロトコルバージョンは必須です。", + "querying-frequency": "ポーリング頻度, ms", + "querying-frequency-invalid-format": "ポーリング頻度は正の整数である必要があります。", + "querying-frequency-required": "ポーリング頻度は必須です。", + "retries": "再試行回数", + "retries-invalid-format": "再試行回数は正の整数である必要があります。", + "retries-required": "再試行回数は必須です。", + "scope": "スコープ", + "scope-required": "スコープは必須です。", + "security-name": "セキュリティ名", + "security-name-required": "セキュリティ名は必須です。", + "timeout-ms": "タイムアウト, ms", + "timeout-ms-invalid-format": "タイムアウトは正の整数である必要があります。", + "timeout-ms-required": "タイムアウトは必須です。", + "user-name": "ユーザー名", + "user-name-required": "ユーザー名は必須です。" + } + }, + "dialog": { + "close": "ダイアログを閉じる", + "error-message-title": "エラーメッセージ:", + "error-details-title": "エラー詳細" + }, + "direction": { + "column": "列", + "row": "行" + }, + "edge": { + "edge": "Edge", + "edge-instances": "Edge インスタンス", + "instances": "インスタンス", + "edge-file": "Edge ファイル", + "name-max-length": "名前は256未満である必要があります", + "label-max-length": "ラベルは256未満である必要があります", + "type-max-length": "タイプは256未満である必要があります", + "management": "Edge 管理", + "no-edges-matching": "'{{entity}}' に一致する edges が見つかりませんでした。", + "add": "Edge を追加", + "no-edges-text": "Edges が見つかりませんでした", + "edge-details": "Edge 詳細", + "add-edge-text": "新しい Edge を追加", + "delete": "Edge を削除", + "delete-edge-title": "Edge '{{edgeName}}' を削除してもよろしいですか?", + "delete-edge-text": "注意: 確認後、Edge と関連するすべてのデータは復元できなくなります。", + "delete-edges-title": "{ count, plural, =1 {1 edge} other {# edges} } を削除してもよろしいですか?", + "delete-edges-text": "注意: 確認後、選択した edges はすべて削除され、関連するすべてのデータは復元できなくなります。", + "name": "名前", + "name-starts-with": "Edge 名が次で始まる", + "name-required": "名前は必須です。", + "description": "説明", + "details": "詳細", + "events": "イベント", + "copy-id": "Edge Id をコピー", + "id-copied-message": "Edge Id をクリップボードにコピーしました", + "sync": "Edge を同期", + "edge-required": "Edge は必須です", + "edge-type": "Edge タイプ", + "edge-type-required": "Edge タイプは必須です。", + "event-action": "イベントアクション", + "entity-id": "エンティティ ID", + "select-edge-type": "Edge タイプを選択", + "assign-to-customer": "顧客に割り当て", + "assign-to-customer-text": "Edge(s) を割り当てる顧客を選択してください", + "assign-edge-to-customer": "Edge(s) を顧客に割り当て", + "assign-edge-to-customer-text": "顧客に割り当てる edges を選択してください", + "assignedToCustomer": "顧客に割り当て", + "edge-public": "Edge は公開されています", + "assigned-to-customer": "割り当て先: {{customerTitle}}", + "unassign-from-customer": "顧客から割り当て解除", + "unassign-edge-title": "Edge '{{edgeName}}' の割り当てを解除してもよろしいですか?", + "unassign-edge-text": "確認後、edge の割り当ては解除され、顧客からアクセスできなくなります。", + "unassign-edges-title": "{ count, plural, =1 {1 edge} other {# edges} } の割り当てを解除してもよろしいですか?", + "unassign-edges-text": "確認後、選択した edges の割り当てはすべて解除され、顧客からアクセスできなくなります。", + "make-public": "Edge を公開する", + "make-public-edge-title": "Edge '{{edgeName}}' を公開してもよろしいですか?", + "make-public-edge-text": "確認後、edge とそのすべてのデータは公開され、他のユーザーがアクセスできるようになります。", + "make-private": "Edge を非公開にする", + "public": "公開", + "make-private-edge-title": "Edge '{{edgeName}}' を非公開にしてもよろしいですか?", + "make-private-edge-text": "確認後、edge とそのすべてのデータは非公開になり、他のユーザーはアクセスできなくなります。", + "import": "Edge をインポート", + "install-connect-instructions": "インストール & 接続手順", + "install-connect-instructions-edge-created": "Edge を作成しました! インストール & 接続手順を確認してください", + "loading-edge-instructions": "Edge 手順を読み込み中...", + "label": "ラベル", + "load-entity-error": "データの読み込みに失敗しました。エンティティは削除されました。", + "assign-new-edge": "新しい edge を割り当て", + "unassign-from-edge": "Edge から割り当て解除", + "edge-key": "Edge キー", + "copy-edge-key": "Edge キーをコピー", + "edge-key-copied-message": "Edge キーをクリップボードにコピーしました", + "edge-secret": "Edge シークレット", + "copy-edge-secret": "Edge シークレットをコピー", + "edge-secret-copied-message": "Edge シークレットをクリップボードにコピーしました", + "manage-assets": "アセットを管理", + "manage-devices": "デバイスを管理", + "manage-entity-views": "エンティティビューを管理", + "manage-dashboards": "ダッシュボードを管理", + "manage-rulechains": "ルールチェーンを管理", + "assets": "Edge アセット", + "devices": "Edge デバイス", + "entity-views": "Edge エンティティビュー", + "dashboard": "Edge ダッシュボード", + "dashboards": "Edge ダッシュボード", + "rulechain-templates": "ルールチェーンテンプレート", + "edge-rulechain-templates": "Edge ルールチェーンテンプレート", + "rulechains": "Edge ルールチェーン", + "search": "Edge を検索", + "selected-edges": "{ count, plural, =1 {1 edge} other {# edges} } 選択済み", + "any-edge": "任意の edge", + "no-edge-types-matching": "'{{entitySubtype}}' に一致する edge タイプは見つかりませんでした。", + "edge-type-list-empty": "選択した edge タイプはありません。", + "edge-types": "Edge タイプ", + "enter-edge-type": "Edge タイプを入力", + "deployed": "展開済み", + "pending": "保留中", + "downlinks": "ダウンリンク", + "no-downlinks-prompt": "ダウンリンクは見つかりませんでした", + "sync-process-started-successfully": "同期プロセスが正常に開始されました!", + "missing-related-rule-chains-title": "Edge に関連するルールチェーンが不足しています", + "missing-related-rule-chains-text": "Edge に割り当てられたルールチェーンは、メッセージを他のルールチェーンに転送するルールノードを使用していますが、これらのルールチェーンはこの Edge に割り当てられていません。

不足しているルールチェーンのリスト:
{{missingRuleChains}}", + "widget-datasource-error": "このウィジェットは EDGE エンティティデータソースのみをサポートしています", + "upgrade-instructions": "アップグレード手順", + "connected": "接続済み", + "disconnected": "接続解除" + }, + "edge-event": { + "type-dashboard": "ダッシュボード", + "type-asset": "アセット", + "type-device": "デバイス", + "type-device-profile": "デバイスプロファイル", + "type-asset-profile": "アセットプロファイル", + "type-entity-view": "エンティティビュー", + "type-alarm": "アラーム", + "type-rule-chain": "ルールチェーン", + "type-rule-chain-metadata": "ルールチェーンメタデータ", + "type-edge": "Edge", + "type-user": "ユーザー", + "type-tenant": "テナント", + "type-tenant-profile": "テナントプロファイル", + "type-customer": "顧客", + "type-relation": "リレーション", + "type-widgets-bundle": "ウィジェットバンドル", + "type-widgets-type": "ウィジェットタイプ", + "type-admin-settings": "管理者設定", + "type-ota-package": "OTAパッケージ", + "type-queue": "キュー", + "action-type-added": "追加", + "action-type-deleted": "削除", + "action-type-updated": "更新", + "action-type-post-attributes": "属性を送信", + "action-type-attributes-updated": "属性が更新されました", + "action-type-attributes-deleted": "属性が削除されました", + "action-type-timeseries-updated": "時系列データが更新されました", + "action-type-credentials-updated": "認証情報が更新されました", + "action-type-assigned-to-customer": "顧客に割り当て", + "action-type-unassigned-from-customer": "顧客から解除", + "action-type-relation-add-or-update": "リレーションの追加または更新", + "action-type-relation-deleted": "リレーションが削除されました", + "action-type-rpc-call": "RPC呼び出し", + "action-type-alarm-ack": "アラーム確認", + "action-type-alarm-clear": "アラーム解除", + "action-type-alarm-assigned": "アラーム割り当て", + "action-type-alarm-unassigned": "アラーム解除", + "action-type-assigned-to-edge": "Edgeに割り当て", + "action-type-unassigned-from-edge": "Edgeから解除", + "action-type-credentials-request": "認証情報リクエスト", + "action-type-entity-merge-request": "エンティティ統合リクエスト" + }, + "error": { + "unable-to-connect": "サーバーに接続できません!インターネット接続を確認してください。", + "unhandled-error-code": "処理されていないエラーコード: {{errorCode}}", + "unknown-error": "不明なエラー" + }, + "entity": { + "entity": "エンティティ", + "entities": "エンティティ", + "entities-count": "エンティティの数", + "alarms-count": "アラームの数", + "aliases": "エンティティのエイリアス", + "aliases-short": "エイリアス", + "entity-alias": "エンティティのエイリアス", + "unable-delete-entity-alias-title": "エンティティエイリアスを削除できません", + "unable-delete-entity-alias-text": "エンティティエイリアス '{{entityAlias}}' は削除できません。以下のウィジェットで使用されています:
{{widgetsList}}", + "duplicate-alias-error": "重複するエイリアス '{{alias}}' が見つかりました。
エンティティのエイリアスはダッシュボード内で一意でなければなりません。", + "missing-entity-filter-error": "エイリアス '{{alias}}' のフィルターが不足しています。", + "configure-alias": "'{{alias}}' のエイリアスを設定", + "alias": "エイリアス", + "alias-required": "エンティティエイリアスは必須です。", + "remove-alias": "エンティティエイリアスを削除", + "add-alias": "エンティティエイリアスを追加", + "edit-alias": "エンティティエイリアスを編集", + "entity-list": "エンティティリスト", + "entity-type": "エンティティタイプ", + "entity-types": "エンティティタイプ", + "entity-type-list": "エンティティタイプリスト", + "any-entity": "任意のエンティティ", + "add-entity-type": "エンティティタイプを追加", + "enter-entity-type": "エンティティタイプを入力", + "no-entities-matching": "エンティティ '{{entity}}' に一致するエンティティは見つかりませんでした。", + "no-entities-text": "エンティティは見つかりません", + "no-entity-types-matching": "エンティティタイプ '{{entityType}}' に一致するエンティティタイプは見つかりませんでした。", + "name-starts-with": "名前の表現", + "help-text": "必要に応じて '%' を使用します: '%entity_name_contains%', '%entity_name_ends', 'entity_starts_with'.", + "use-entity-name-filter": "フィルターを使用", + "entity-list-empty": "エンティティが選択されていません。", + "entity-type-list-required": "少なくとも1つのエンティティタイプを選択する必要があります。", + "entity-name-filter-required": "エンティティ名フィルターは必須です。", + "entity-name-filter-no-entity-matched": "エンティティ '{{entity}}' で始まるエンティティは見つかりませんでした。", + "all-subtypes": "すべて", + "select-entities": "エンティティを選択", + "no-aliases-found": "エイリアスが見つかりませんでした。", + "no-alias-matching": "'{{alias}}' が見つかりません。", + "create-new-alias": "新しいエイリアスを作成", + "create-new": "新規作成", + "key": "キー", + "key-name": "キー名", + "no-keys-found": "キーが見つかりませんでした。", + "no-key-matching": "'{{key}}' が見つかりません。", + "create-new-key": "新しいキーを作成", + "type": "タイプ", + "type-required": "エンティティタイプは必須です。", + "type-device": "デバイス", + "type-devices": "デバイス", + "list-of-devices": "{ count, plural, =1 {1 台のデバイス} other {# 台のデバイス} }", + "device-name-starts-with": "名前が '{{prefix}}' で始まるデバイス", + "type-device-profile": "デバイスプロファイル", + "type-device-profiles": "デバイスプロファイル", + "clear-selected-profiles": "選択したプロファイルをクリア", + "list-of-device-profiles": "{ count, plural, =1 {1 つのデバイスプロファイル} other {# 個のデバイスプロファイル} }", + "device-profile-name-starts-with": "名前が '{{prefix}}' で始まるデバイスプロファイル", + "type-asset-profile": "アセットプロファイル", + "type-asset-profiles": "アセットプロファイル", + "list-of-asset-profiles": "{ count, plural, =1 {1 つのアセットプロファイル} other {# 個のアセットプロファイル} }", + "asset-profile-name-starts-with": "名前が '{{prefix}}' で始まるアセットプロファイル", + "type-asset": "アセット", + "type-assets": "アセット", + "list-of-assets": "{ count, plural, =1 {1 つのアセット} other {# 個のアセット} }", + "asset-name-starts-with": "名前が '{{prefix}}' で始まるアセット", + "type-entity-view": "エンティティビュー", + "type-entity-views": "エンティティビュー", + "list-of-entity-views": "{ count, plural, =1 {1 つのエンティティビュー} other {# 個のエンティティビュー} }", + "entity-view-name-starts-with": "名前が '{{prefix}}' で始まるエンティティビュー", + "type-rule": "ルール", + "type-rules": "ルール", + "list-of-rules": "{ count, plural, =1 {1 つのルール} other {# 個のルール} }", + "rule-name-starts-with": "名前が '{{prefix}}' で始まるルール", + "type-plugin": "プラグイン", + "type-plugins": "プラグイン", + "list-of-plugins": "{ count, plural, =1 {1 つのプラグイン} other {# 個のプラグイン} }", + "plugin-name-starts-with": "名前が '{{prefix}}' で始まるプラグイン", + "type-tenant": "テナント", + "type-tenants": "テナント", + "list-of-tenants": "{ count, plural, =1 {1 つのテナント} other {# 個のテナント} }", + "tenant-name-starts-with": "名前が '{{prefix}}' で始まるテナント", + "type-tenant-profile": "テナントプロファイル", + "type-tenant-profiles": "テナントプロファイル", + "list-of-tenant-profiles": "{ count, plural, =1 {1 つのテナントプロファイル} other {# 個のテナントプロファイル} }", + "tenant-profile-name-starts-with": "名前が '{{prefix}}' で始まるテナントプロファイル", + "type-customer": "顧客", + "type-customers": "顧客", + "list-of-customers": "{ count, plural, =1 {1 人の顧客} other {# 人の顧客} }", + "customer-name-starts-with": "名前が '{{prefix}}' で始まる顧客", + "type-user": "ユーザー", + "type-users": "ユーザー", + "list-of-users": "{ count, plural, =1 {1 人のユーザー} other {# 人のユーザー} }", + "user-name-starts-with": "名前が '{{prefix}}' で始まるユーザー", + "type-dashboard": "ダッシュボード", + "type-dashboards": "ダッシュボード", + "list-of-dashboards": "{ count, plural, =1 {1 つのダッシュボード} other {# 個のダッシュボード} }", + "dashboard-name-starts-with": "名前が '{{prefix}}' で始まるダッシュボード", + "type-alarm": "アラーム", + "type-alarms": "アラーム", + "list-of-alarms": "{ count, plural, =1 {1 つのアラーム} other {# 個のアラーム} }", + "alarm-name-starts-with": "名前が '{{prefix}}' で始まるアラーム", + "type-rulechain": "ルールチェーン", + "type-rulechains": "ルールチェーン", + "list-of-rulechains": "{ count, plural, =1 {1 つのルールチェーン} other {# 個のルールチェーン} }", + "rulechain-name-starts-with": "名前が '{{prefix}}' で始まるルールチェーン", + "type-rulenode": "ルールノード", + "type-rulenodes": "ルールノード", + "list-of-rulenodes": "{ count, plural, =1 {1 つのルールノード} other {# 個のルールノード} }", + "rulenode-name-starts-with": "名前が '{{prefix}}' で始まるルールノード", + "type-api-key": "API キー", + "type-api-keys": "API キー", + "type-current-customer": "現在の顧客", + "type-current-tenant": "現在のテナント", + "type-current-user": "現在のユーザー", + "type-current-user-owner": "現在のユーザーの所有者", + "type-calculated-field": "計算フィールド", + "type-calculated-fields": "計算フィールド", + "type-ai-model": "AIモデル", + "type-ai-models": "AIモデル", + "type-widgets-bundle": "ウィジェットバンドル", + "type-widgets-bundles": "ウィジェットバンドル", + "list-of-widgets-bundles": "{ count, plural, =1 {ウィジェットバンドル 1 件} other {ウィジェットバンドル一覧 # 件} }", + "type-widget": "ウィジェット", + "type-widgets": "ウィジェット", + "list-of-widgets": "{ count, plural, =1 {ウィジェット 1 件} other {ウィジェット一覧 # 件} }", + "search": "エンティティを検索", + "selected-entities": "{ count, plural, =1 {1 件のエンティティ} other {# 件のエンティティ} } を選択", + "entity-name": "エンティティ名", + "entity-label": "エンティティラベル", + "details": "エンティティ詳細", + "no-entities-prompt": "エンティティが見つかりません", + "no-data": "表示するデータがありません", + "show-all-columns": "すべて表示", + "columns-to-display": "表示する列", + "type-api-usage-state": "API使用状況", + "type-edge": "Edge", + "type-edges": "Edges", + "list-of-edges": "{ count, plural, =1 {edge 1 件} other {edge一覧 # 件} }", + "edge-name-starts-with": "名前が '{{prefix}}' で始まるEdges", + "version-conflict": { + "message": "既存のバージョンを上書きしますか、それとも変更を破棄して最新バージョンを読み込みますか?", + "link": "これを使用して {{entityType}} のあなたのバージョンをダウンロードできます", + "overwrite": "バージョンを上書き", + "discard": "変更を破棄" + }, + "type-tb-resource": "リソース", + "type-tb-resources": "リソース", + "list-of-tb-resources": "{ count, plural, =1 {リソース 1 件} other {リソース一覧 # 件} }", + "type-ota-package": "OTAパッケージ", + "type-ota-packages": "OTAパッケージ", + "list-of-ota-packages": "{ count, plural, =1 {OTAパッケージ 1 件} other {OTAパッケージ一覧 # 件} }", + "type-rpc": "RPC", + "type-queue": "キュー", + "type-queue-stats": "キュー統計", + "type-queues-stats": "キュー統計", + "type-notification": "通知", + "type-notification-rule": "通知ルール", + "type-notification-rules": "通知ルール", + "list-of-notification-rules": "{ count, plural, =1 {通知ルール 1 件} other {通知ルール一覧 # 件} }", + "type-notification-target": "通知受信者", + "type-notification-targets": "通知受信者", + "list-of-notification-targets": "{ count, plural, =1 {通知受信者 1 件} other {通知受信者一覧 # 件} }", + "type-notification-request": "通知リクエスト", + "type-notification-template": "通知テンプレート", + "type-notification-templates": "通知テンプレート", + "list-of-notification-templates": "{ count, plural, =1 {通知テンプレート 1 件} other {通知テンプレート一覧 # 件} }", + "link": "リンク", + "type-oauth2-client": "OAuth 2.0 クライアント", + "type-oauth2-clients": "OAuth 2.0 クライアント", + "list-of-oauth2-clients": "{ count, plural, =1 {OAuth 2.0 クライアント 1 件} other {OAuth 2.0 クライアント一覧 # 件} }", + "type-domain": "ドメイン", + "type-domains": "ドメイン", + "list-of-domains": "{ count, plural, =1 {ドメイン 1 件} other {ドメイン一覧 # 件} }", + "type-mobile-app": "モバイルアプリケーション", + "type-mobile-apps": "モバイルアプリケーション", + "list-of-mobile-apps": "{ count, plural, =1 {モバイルアプリケーション 1 件} other {モバイルアプリケーション一覧 # 件} }", + "type-mobile-app-bundle": "モバイルバンドル", + "type-mobile-app-bundles": "モバイルバンドル", + "list-of-mobile-app-bundles": "{ count, plural, =1 {モバイルバンドル 1 件} other {モバイルバンドル一覧 # 件} }", + "limit-reached": "上限に達しました", + "limit-reached-text": "{{ entities }} の上限に達しました。さらに追加するには、システム管理者に {{ entity }} の上限引き上げを依頼してください。", + "request-limit-increase": "上限引き上げを依頼", + "request-sysadmin-text": "システム管理者ですか?", + "login-here": "ここでログイン", + "to-increase-limit": "上限を引き上げるには。", + "increase-limit-request-sent-title": "上限を引き上げるための自動リクエストをシステム管理者に送信しました", + "increase-limit-request-sent-text": "リクエストの確認と設定更新まで少し時間がかかる場合があります。変更を確認するには、このページを更新する必要がある場合があります。" + }, + "entity-field": { + "created-time": "作成日時", + "name": "名前", + "type": "タイプ", + "first-name": "名", + "last-name": "姓", + "email": "Email", + "title": "タイトル", + "country": "国", + "state": "都道府県", + "city": "市区町村", + "address": "住所", + "address2": "住所 2", + "zip": "郵便番号", + "phone": "電話番号", + "label": "ラベル", + "queue-name": "キュー名", + "service-id": "サービスID", + "owner-name": "所有者名", + "owner-type": "所有者タイプ" + }, + "entity-view": { + "entity-view": "エンティティビュー", + "entity-view-required": "エンティティビューは必須です。", + "entity-views": "エンティティビュー", + "management": "エンティティビュー管理", + "view-entity-views": "エンティティビューを表示", + "entity-view-alias": "エンティティビューエイリアス", + "aliases": "エンティティビューエイリアス", + "no-alias-matching": "'{{alias}}' は見つかりません。", + "no-aliases-found": "エイリアスが見つかりません。", + "no-key-matching": "'{{key}}' は見つかりません。", + "no-keys-found": "キーが見つかりません。", + "create-new-alias": "新しいエイリアスを作成!", + "create-new-key": "新しいキーを作成!", + "duplicate-alias-error": "重複するエイリアス '{{alias}}' が見つかりました。
エンティティビューエイリアスはダッシュボード内で一意である必要があります。", + "configure-alias": "'{{alias}}' エイリアスを設定", + "no-entity-views-matching": "'{{entity}}' に一致するエンティティビューが見つかりませんでした。", + "public": "公開", + "alias": "エイリアス", + "alias-required": "エンティティビューのエイリアスは必須です。", + "remove-alias": "エンティティビューのエイリアスを削除", + "add-alias": "エンティティビューのエイリアスを追加", + "name-starts-with": "エンティティビュー名の式", + "help-text": "必要に応じて '%' を使用してください:'%entity-view_name_contains%', '%entity-view_name_ends', 'entity-view_starts_with'。", + "entity-view-list": "エンティティビュー一覧", + "use-entity-view-name-filter": "フィルターを使用", + "entity-view-list-empty": "エンティティビューが選択されていません。", + "entity-view-name-filter-required": "エンティティビュー名フィルターは必須です。", + "entity-view-name-filter-no-entity-view-matched": "'{{entityView}}' で始まるエンティティビューは見つかりませんでした。", + "add": "エンティティビューを追加", + "entity-view-public": "エンティティビューは公開されています", + "assign-to-customer": "顧客に割り当て", + "assign-entity-view-to-customer": "エンティティビューを顧客に割り当て", + "assign-entity-view-to-customer-text": "顧客に割り当てるエンティティビューを選択してください", + "no-entity-views-text": "エンティティビューが見つかりません", + "assign-to-customer-text": "エンティティビューを割り当てる顧客を選択してください", + "entity-view-details": "エンティティビュー詳細", + "add-entity-view-text": "新しいエンティティビューを追加", + "delete": "エンティティビューを削除", + "assign-entity-views": "エンティティビューを割り当て", + "assign-entity-views-text": "{ count, plural, =1 {1 件のエンティティビュー} other {# 件のエンティティビュー} } を顧客に割り当て", + "delete-entity-views": "エンティティビューを削除", + "make-public": "エンティティビューを公開", + "make-private": "エンティティビューを非公開", + "unassign-from-customer": "顧客から削除", + "unassign-entity-views": "エンティティビューを削除", + "unassign-entity-views-action-title": "{ count, plural, =1 {1 件のエンティティビュー} other {# 件のエンティティビュー} } を顧客から削除", + "assign-new-entity-view": "新しいエンティティビューを割り当て", + "delete-entity-view-title": "エンティティビュー '{{entityViewName}}' を削除してもよろしいですか?", + "delete-entity-view-text": "確認後、エンティティビューと関連データは復元できなくなります。", + "delete-entity-views-title": "{ count, plural, =1 {1 件のエンティティビュー} other {# 件のエンティティビュー} } を削除してもよろしいですか?", + "delete-entity-views-action-title": "{ count, plural, =1 {1 件のエンティティビュー} other {# 件のエンティティビュー} } を削除", + "delete-entity-views-text": "確認後、選択したエンティティビューは削除され、関連データは復元できなくなります。", + "make-public-entity-view-title": "エンティティビュー '{{entityViewName}}' を公開してもよろしいですか?", + "make-public-entity-view-text": "確認後、エンティティビューとそのデータは公開され、他のユーザーがアクセスできるようになります。", + "make-private-entity-view-title": "エンティティビュー '{{entityViewName}}' を非公開にしてもよろしいですか?", + "make-private-entity-view-text": "確認後、エンティティビューとそのデータは非公開になり、他のユーザーはアクセスできなくなります。", + "unassign-entity-view-title": "エンティティビュー '{{entityViewName}}' を削除してもよろしいですか?", + "unassign-entity-view-text": "確認後、エンティティビューは削除され、顧客はアクセスできなくなります。", + "unassign-entity-view": "エンティティビューを削除", + "unassign-entity-views-title": "{ count, plural, =1 {1 件のエンティティビュー} other {# 件のエンティティビュー} } を削除してもよろしいですか?", + "unassign-entity-views-text": "確認後、選択したすべてのエンティティビューが削除され、顧客はアクセスできなくなります。", + "entity-view-type": "エンティティビュータイプ", + "entity-view-type-required": "エンティティビュータイプは必須です。", + "select-entity-view-type": "エンティティビュータイプを選択", + "enter-entity-view-type": "エンティティビュータイプを入力", + "any-entity-view": "任意のエンティティビュー", + "no-entity-view-types-matching": "'{{entitySubtype}}' に一致するエンティティビュータイプが見つかりませんでした。", + "entity-view-type-list-empty": "エンティティビュータイプが選択されていません。", + "entity-view-types": "エンティティビュータイプ", + "created-time": "作成日時", + "name": "名前", + "name-required": "名前は必須です。", + "name-max-length": "名前は 256 文字以内である必要があります。", + "type-max-length": "エンティティビュータイプは 256 文字以内である必要があります。", + "description": "説明", + "events": "イベント", + "details": "詳細", + "copyId": "エンティティビューIDをコピー", + "idCopiedMessage": "エンティティビューIDがクリップボードにコピーされました", + "assignedToCustomer": "顧客に割り当て済み", + "unable-entity-view-device-alias-title": "エンティティビューエイリアスを削除できません", + "unable-entity-view-device-alias-text": "デバイスエイリアス '{{entityViewAlias}}' は以下のウィジェットで使用されているため削除できません:
{{widgetsList}}", + "select-entity-view": "エンティティビューを選択", + "start-ts": "開始日時", + "end-ts": "終了日時", + "date-limits": "日付制限", + "client-attributes": "クライアント属性", + "shared-attributes": "共有属性", + "server-attributes": "サーバー属性", + "timeseries": "時系列", + "client-attributes-placeholder": "クライアント属性", + "shared-attributes-placeholder": "共有属性", + "server-attributes-placeholder": "サーバー属性", + "timeseries-placeholder": "時系列", + "target-entity": "ターゲットエンティティ", + "attributes-propagation": "属性の伝播", + "attributes-propagation-hint": "エンティティビューは、ターゲットエンティティから指定された属性を保存または更新するたびに自動的にコピーします。パフォーマンス上の理由で、ターゲットエンティティの属性は属性変更ごとにエンティティビューに伝播されません。「ビューへのコピー」ルールノードをルールチェーンに設定し、「属性更新」メッセージを新しいルールノードにリンクすることで自動的な伝播を有効にできます。", + "timeseries-data": "時系列データ", + "timeseries-data-hint": "ターゲットエンティティの時系列データキーを設定し、これらのデータはエンティティビューで読み取り専用としてアクセスされます。", + "search": "エンティティビューを検索", + "selected-entity-views": "{ count, plural, =1 {1 件のエンティティビュー} other {# 件のエンティティビュー} } を選択", + "assign-entity-view-to-edge": "エンティティビューをEdgeに割り当て", + "assign-entity-view-to-edge-text": "Edgeに割り当てるエンティティビューを選択してください", + "unassign-entity-view-from-edge-title": "エンティティビュー '{{entityViewName}}' をEdgeから削除してもよろしいですか?", + "unassign-entity-view-from-edge-text": "確認後、エンティティビューはEdgeから削除され、Edgeではアクセスできなくなります。", + "unassign-entity-views-from-edge-action-title": "Edgeから { count, plural, =1 {1 件のエンティティビュー} other {# 件のエンティティビュー} } を削除", + "unassign-entity-view-from-edge": "エンティティビューをEdgeから削除", + "unassign-entity-views-from-edge-title": "Edgeから { count, plural, =1 {1 件のエンティティビュー} other {# 件のエンティティビュー} } を削除してもよろしいですか?", + "unassign-entity-views-from-edge-text": "確認後、選択したすべてのエンティティビューはEdgeから削除され、Edgeではアクセスできなくなります。" + }, + "event": { + "event-type": "イベントタイプ", + "events-filter": "イベントフィルター", + "clean-events": "イベントをクリア", + "type-error": "エラー", + "type-lc-event": "ライフサイクルイベント", + "type-stats": "統計", + "type-debug-rule-node": "デバッグ", + "type-debug-rule-chain": "デバッグ", + "type-debug-calculated-field": "デバッグ", + "arguments": "引数", + "result": "結果", + "no-events-prompt": "イベントが見つかりません", + "error": "エラー", + "alarm": "アラーム", + "event-time": "イベント時間", + "server": "サーバー", + "body": "ボディ", + "method": "メソッド", + "type": "タイプ", + "metadata": "メタデータ", + "message": "メッセージ", + "message-id": "メッセージID", + "copy-message-id": "メッセージIDをコピー", + "message-type": "メッセージタイプ", + "data-type": "データタイプ", + "relation-type": "関連タイプ", + "data": "データ", + "event": "イベント", + "status": "ステータス", + "success": "成功", + "failed": "失敗", + "messages-processed": "処理されたメッセージ", + "max-messages-processed": "処理された最大メッセージ数", + "min-messages-processed": "処理された最小メッセージ数", + "errors-occurred": "発生したエラー", + "max-errors-occurred": "発生した最大エラー数", + "min-errors-occurred": "発生した最小エラー数", + "min-value": "最小値は0です。", "all-events": "すべて", - "entity-type": "エンティティタイプ" - }, - "extension": { - "extensions": "拡張機能", - "selected-extensions": "{ count, plural, =1 {1 extension} other {# extensions} }選択された", - "type": "タイプ", - "key": "キー", - "value": "値", - "id": "ID", - "extension-id": "内線番号", - "extension-type": "拡張タイプ", - "transformer-json": "JSON *", - "unique-id-required": "現在の拡張IDは既に存在します。", - "delete": "拡張子を削除", - "add": "内線番号を追加", - "edit": "拡張機能を編集する", - "delete-extension-title": "'{{extensionId}}'?", - "delete-extension-text": "確認後、拡張子と関連するすべてのデータが回復不能になることに注意してください。", - "delete-extensions-title": "{ count, plural, =1 {1 extension} other {# extensions} }?", - "delete-extensions-text": "注意してください。確認後、選択したすべての内線番号が削除されます。", - "converters": "コンバーター", - "converter-id": "コンバーターID", - "configuration": "構成", - "converter-configurations": "コンバータ構成", - "token": "セキュリティトークン", - "add-converter": "コンバータを追加する", - "add-config": "コンバータ設定を追加する", - "device-name-expression": "デバイス名式", - "device-type-expression": "デバイスタイプの式", - "custom": "カスタム", - "to-double": "ダブル", - "transformer": "トランス", - "json-required": "トランスフォーマーjsonが必要です。", - "json-parse": "変圧器jsonを解析できません。", - "attributes": "属性", - "add-attribute": "属性を追加する", - "add-map": "マッピング要素を追加する", - "timeseries": "タイムズ", - "add-timeseries": "時系列を追加する", - "field-required": "フィールドは必須項目です", - "brokers": "ブローカー", - "add-broker": "ブローカーを追加", - "host": "ホスト", - "port": "ポート", - "port-range": "ポートは1〜65535の範囲内にある必要があります。", - "ssl": "SSL", - "credentials": "資格情報", - "username": "ユーザー名", - "password": "パスワード", - "retry-interval": "ミリ秒単位の再試行間隔", - "anonymous": "匿名", - "basic": "ベーシック", - "pem": "PEM", - "ca-cert": "CA証明書ファイル*", - "private-key": "秘密鍵ファイル*", - "cert": "証明書ファイル*", - "no-file": "ファイルが選択されていません。", - "drop-file": "ファイルをドロップするか、クリックしてアップロードするファイルを選択します。", - "mapping": "マッピング", - "topic-filter": "トピックフィルタ", - "converter-type": "コンバータタイプ", - "converter-json": "Json", - "json-name-expression": "デバイス名json式", - "topic-name-expression": "デバイス名トピック表現", - "json-type-expression": "デバイスタイプjson式", - "topic-type-expression": "デバイスタイプトピック表現", - "attribute-key-expression": "属性キー式", - "attr-json-key-expression": "属性キーjson式", - "attr-topic-key-expression": "属性キートピック式", - "request-id-expression": "要求ID式", - "request-id-json-expression": "リクエストID json式", - "request-id-topic-expression": "リクエストIDトピック表現", - "response-topic-expression": "応答トピック表現", - "value-expression": "値式", - "topic": "トピック", - "timeout": "タイムアウト(ミリ秒)", - "converter-json-required": "コンバータjsonが必要です。", - "converter-json-parse": "コンバータjsonを解析できません。", - "filter-expression": "フィルタ式", - "connect-requests": "接続要求", - "add-connect-request": "接続要求を追加", - "disconnect-requests": "切断要求", - "add-disconnect-request": "切断リクエストを追加する", - "attribute-requests": "属性要求", - "add-attribute-request": "属性要求を追加する", - "attribute-updates": "属性の更新", - "add-attribute-update": "属性の更新を追加する", - "server-side-rpc": "サーバー側RPC", - "add-server-side-rpc-request": "サーバー側RPC要求を追加する", - "device-name-filter": "デバイス名フィルタ", - "attribute-filter": "属性フィルタ", - "method-filter": "方法フィルター", - "request-topic-expression": "トピック表現を要求する", - "response-timeout": "応答タイムアウト(ミリ秒)", - "topic-expression": "トピック表現", - "client-scope": "クライアントスコープ", - "add-device": "デバイスを追加", - "opc-server": "サーバー", - "opc-add-server": "サーバーを追加", - "opc-add-server-prompt": "サーバーを追加してください", - "opc-application-name": "アプリケーション名", - "opc-application-uri": "アプリケーションURI", - "opc-scan-period-in-seconds": "スキャン時間(秒)", - "opc-security": "セキュリティ", - "opc-identity": "身元", - "opc-keystore": "キーストア", - "opc-type": "タイプ", - "opc-keystore-type": "タイプ", - "opc-keystore-location": "ロケーション*", - "opc-keystore-password": "パスワード", - "opc-keystore-alias": "エイリアス", - "opc-keystore-key-password": "キーのパスワード", - "opc-device-node-pattern": "デバイスノードパターン", - "opc-device-name-pattern": "デバイス名パターン", - "modbus-server": "サーバー/スレーブ", - "modbus-add-server": "サーバー/スレーブを追加する", - "modbus-add-server-prompt": "サーバー/スレーブを追加してください", - "modbus-transport": "輸送", - "modbus-port-name": "シリアルポート名", - "modbus-encoding": "エンコーディング", - "modbus-parity": "パリティ", - "modbus-baudrate": "ボーレート", - "modbus-databits": "データビット", - "modbus-stopbits": "ストップビット", - "modbus-databits-range": "データビットは7〜8の範囲内にある必要があります。", - "modbus-stopbits-range": "ストップビットは1〜2の範囲内でなければなりません。", - "modbus-unit-id": "ユニットID", - "modbus-unit-id-range": "ユニットIDは1〜247の範囲で指定してください。", - "modbus-device-name": "装置名", - "modbus-poll-period": "投票期間(ミリ秒)", - "modbus-attributes-poll-period": "属性のポーリング期間(ミリ秒)", - "modbus-timeseries-poll-period": "時系列ポーリング期間(ミリ秒)", - "modbus-poll-period-range": "投票期間は正の値でなければなりません。", - "modbus-tag": "タグ", - "modbus-function": "関数", - "modbus-register-address": "登録アドレス", - "modbus-register-address-range": "レジスタのアドレスは0〜65535の範囲内である必要があります。", - "modbus-register-bit-index": "ビットインデックス", - "modbus-register-bit-index-range": "ビットインデックスは0〜15の範囲内である必要があります。", - "modbus-register-count": "レジスタ数", - "modbus-register-count-range": "レジスタ数は正の値でなければなりません。", - "modbus-byte-order": "バイト順", - "sync": { - "status": "状態", - "sync": "同期", - "not-sync": "同期しない", - "last-sync-time": "前回の同期時間", - "not-available": "利用不可" - }, - "export-extensions-configuration": "エクステンション設定のエクスポート", - "import-extensions-configuration": "エクステンション設定のインポート", - "import-extensions": "拡張機能のインポート", - "import-extension": "インポート拡張", - "export-extension": "輸出延長", - "file": "拡張機能ファイル", - "invalid-file-error": "無効な拡張ファイル" - }, - "fullscreen": { - "expand": "フルスクリーンに拡大", - "exit": "全画面表示を終了", - "toggle": "フルスクリーンモードを切り替える", - "fullscreen": "全画面表示" - }, - "function": { - "function": "関数" - }, - "grid": { - "delete-item-title": "このアイテムを削除してもよろしいですか?", - "delete-item-text": "注意してください。確認後、この項目と関連するすべてのデータは回復不能になります。", - "delete-items-title": "{ count, plural, =1 {1 item} other {# items} }?", - "delete-items-action-title": "{ count, plural, =1 {1 item} other {# items} }", - "delete-items-text": "注意してください。確認後、選択したすべてのアイテムが削除され、関連するすべてのデータは回復不能になります。", - "add-item-text": "新しいアイテムを追加", - "no-items-text": "項目は見つかりませんでした", - "item-details": "商品詳細", - "delete-item": "アイテムを削除", - "delete-items": "アイテムを削除する", - "scroll-to-top": "トップにスクロールします" - }, - "help": { - "goto-help-page": "ヘルプページに行く" - }, - "home": { - "home": "ホーム", - "profile": "プロフィール", - "logout": "ログアウト", - "menu": "メニュー", - "avatar": "アバター", - "open-user-menu": "ユーザーメニューを開く" - }, - "import": { - "no-file": "ファイルが選択されていません", - "drop-file": "JSONファイルをドロップするか、アップロードするファイルをクリックして選択します。" - }, - "item": { - "selected": "選択された" - }, - "js-func": { - "no-return-error": "関数は値を返す必要があります!", - "return-type-mismatch": "'{{type}}'タイプ!", - "tidy": "きちんとした" - }, - "key-val": { - "key": "キー", - "value": "値", - "remove-entry": "エントリを削除", - "add-entry": "エントリを追加", - "no-data": "エントリなし" - }, - "layout": { - "layout": "レイアウト", - "manage": "レイアウトの管理", - "settings": "レイアウト設定", - "color": "色", - "main": "メイン", - "right": "右", - "select": "ターゲットレイアウトを選択" - }, - "legend": { - "position": "凡例の位置", - "show-max": "最大値を表示", - "show-min": "最小値を表示", - "show-avg": "平均値を表示", - "show-total": "合計値を表示", - "settings": "凡例の設定", - "min": "最小", - "max": "最大", - "avg": "平均", - "total": "合計" - }, - "login": { - "login": "ログイン", - "request-password-reset": "リクエストパスワードのリセット", - "reset-password": "パスワードを再設定する", - "create-password": "パスワードの作成", - "passwords-mismatch-error": "入力されたパスワードは同じでなければなりません!", - "password-again": "パスワードをもう一度", - "username": "ユーザー名(電子メール)", - "remember-me": "ログイン情報を記憶", - "forgot-password": "パスワードをお忘れですか?", - "password-reset": "パスワードのリセット", - "new-password": "新しいパスワード", - "new-password-again": "新しいパスワードを再入力", - "password-link-sent-message": "パスワードリセットリンクが正常に送信されました!", - "email": "Eメール", - "login-with": "{{name}}でログイン", - "or": "または" - }, - "position": { - "top": "上", - "bottom": "下", - "left": "左", - "right": "右" - }, - "profile": { - "profile": "プロフィール", - "change-password": "パスワードを変更する", - "current-password": "現在のパスワード" - }, - "relation": { - "relations": "関係", - "direction": "方向", - "search-direction": { - "FROM": "から", - "TO": "に" - }, - "direction-type": { - "FROM": "から", - "TO": "に" - }, - "from-relations": "アウトバウンド関係", - "to-relations": "インバウンド関係", - "selected-relations": "{ count, plural, =1 {1 relation} other {# relations} }選択された", - "type": "タイプ", - "to-entity-type": "エンティティタイプへ", - "to-entity-name": "エンティティ名に", - "from-entity-type": "エンティティタイプから", - "from-entity-name": "エンティティ名から", - "to-entity": "実体へ", - "from-entity": "エンティティから", - "delete": "関係を削除する", - "relation-type": "関係タイプ", - "relation-type-required": "関係タイプが必要です。", - "any-relation-type": "いかなるタイプ", - "add": "関係を追加する", - "edit": "関係を編集する", - "delete-to-relation-title": "'{{entityName}}'?", - "delete-to-relation-text": "'{{entityName}}'現在のエンティティとは無関係です。", - "delete-to-relations-title": "{ count, plural, =1 {1 relation} other {# relations} }?", - "delete-to-relations-text": "注意してください。確認後、選択されたリレーションはすべて削除され、対応するエンティティは現在のエンティティとは無関係になります。", - "delete-from-relation-title": "'{{entityName}}'?", - "delete-from-relation-text": "'{{entityName}}'.", - "delete-from-relations-title": "{ count, plural, =1 {1 relation} other {# relations} }?", - "delete-from-relations-text": "注意してください。確認後、選択されたリレーションはすべて削除され、現在のエンティティは対応するエンティティとは無関係になります。", - "remove-relation-filter": "関係フィルタを削除する", - "add-relation-filter": "関係フィルタを追加する", - "any-relation": "関係", - "relation-filters": "関係フィルタ", - "additional-info": "追加情報(JSON)", - "invalid-additional-info": "追加情報jsonを解析できません。" - }, - "rulechain": { - "rulechain": "ルールチェーン", - "rulechains": "ルールチェーン", - "root": "ルート", - "delete": "ルールチェーンの削除", - "name": "名", - "name-required": "名前は必須です。", - "description": "説明", - "add": "ルールチェーンを追加する", - "set-root": "ルールチェーンのルートを作る", - "set-root-rulechain-title": "'{{ruleChainName}}'ルート?", - "set-root-rulechain-text": "確認後、ルールチェーンはルートになり、すべての受信トランスポートメッセージを処理します。", - "delete-rulechain-title": "'{{ruleChainName}}'?", - "delete-rulechain-text": "確認後、ルールチェーンと関連するすべてのデータが回復不能になるので注意してください。", - "delete-rulechains-title": "{ count, plural, =1 {1 rule chain} other {# rule chains} }?", - "delete-rulechains-action-title": "{ count, plural, =1 {1 rule chain} other {# rule chains} }", - "delete-rulechains-text": "確認後、選択したすべてのルールチェーンが削除され、関連するすべてのデータが回復不能になるので注意してください。", - "add-rulechain-text": "新しいルールチェーンを追加する", - "no-rulechains-text": "ルールチェーンが見つかりません", - "rulechain-details": "ルールチェーンの詳細", - "details": "詳細", - "events": "イベント", - "system": "システム", - "import": "ルールチェーンのインポート", - "export": "ルールチェーンのエクスポート", - "export-failed-error": "{{error}}", - "create-new-rulechain": "新しいルールチェーンを作成する", - "rulechain-file": "ルールチェーンファイル", - "invalid-rulechain-file-error": "ルールチェーンをインポートできません:ルールチェーンのデータ構造が無効です。", - "copyId": "ルールチェーンIDのコピー", - "idCopiedMessage": "ルールチェーンIDがクリップボードにコピーされました", - "select-rulechain": "ルールチェーンの選択", - "no-rulechains-matching": "'{{entity}}'発見されました。", - "rulechain-required": "ルールチェーンが必要です", - "management": "ルール管理", - "debug-mode": "デバッグモード" - }, - "rulenode": { - "details": "詳細", - "events": "イベント", - "search": "検索ノード", - "open-node-library": "オープンノードライブラリ", - "add": "ルールノードを追加する", - "name": "名", - "name-required": "名前は必須です。", - "type": "タイプ", - "description": "説明", - "delete": "ルールノードを削除", - "select-all-objects": "すべてのノードと接続を選択する", - "deselect-all-objects": "すべてのノードと接続の選択を解除する", - "delete-selected-objects": "選択したノードと接続を削除する", - "delete-selected": "選択を削除します", - "select-all": "すべて選択", - "copy-selected": "選択したコピー", - "deselect-all": "すべての選択を解除", - "rulenode-details": "ルールノードの詳細", - "debug-mode": "デバッグモード", - "configuration": "構成", - "link": "リンク", - "link-details": "ルールノードのリンクの詳細", - "add-link": "リンクを追加", - "link-label": "リンクラベル", - "link-label-required": "リンクラベルが必要です。", - "custom-link-label": "カスタムリンクラベル", - "custom-link-label-required": "カスタムリンクラベルが必要です。", - "link-labels": "リンクラベル", - "link-labels-required": "リンクラベルが必要です。", - "no-link-labels-found": "リンクラベルが見つかりません", - "no-link-label-matching": "'{{label}}'見つかりません。", - "create-new-link-label": "新しいものを作成してください!", - "type-filter": "フィルタ", - "type-filter-details": "設定された条件で着信メッセージをフィルタリングする", - "type-enrichment": "豊かな", - "type-enrichment-details": "メッセージメタデータに追加情報を追加する", - "type-transformation": "変換", - "type-transformation-details": "メッセージペイロードとメタデータの変更", - "type-action": "アクション", - "type-action-details": "特別なアクションを実行する", - "type-external": "外部", - "type-external-details": "外部システムとの相互作用", - "type-rule-chain": "ルールチェーン", - "type-rule-chain-details": "受信したメッセージを指定したルールチェーンに転送する", - "type-input": "入力", - "type-input-details": "ルールチェーンの論理入力、次の関連ルールノードへの着信メッセージの転送", - "type-unknown": "未知の", - "type-unknown-details": "未解決のルールノード", - "directive-is-not-loaded": "'{{directiveName}}'利用できません。", - "ui-resources-load-error": "構成UIリソースをロードできませんでした。", - "invalid-target-rulechain": "ターゲットルールチェーンを解決できません!", - "test-script-function": "テストスクリプト機能", - "message": "メッセージ", - "message-type": "メッセージタイプ", - "select-message-type": "メッセージタイプを選択", - "message-type-required": "メッセージタイプは必須です", - "metadata": "メタデータ", - "metadata-required": "メタデータのエントリを空にすることはできません。", - "output": "出力", - "test": "テスト", - "help": "助けて" - }, - "tenant": { - "tenant": "テナント", - "tenants": "テナント", - "management": "テナント管理", - "add": "テナントを追加", - "admins": "管理者", - "manage-tenant-admins": "テナント管理者の管理", - "delete": "テナントの削除", - "add-tenant-text": "新しいテナントを追加する", - "no-tenants-text": "テナントは見つかりませんでした", - "tenant-details": "テナントの詳細", - "delete-tenant-title": "'{{tenantTitle}}'?", - "delete-tenant-text": "確認後、テナントと関連するすべてのデータが回復不能になるので注意してください。", - "delete-tenants-title": "{ count, plural, =1 {1 tenant} other {# tenants} }?", - "delete-tenants-action-title": "{ count, plural, =1 {1 tenant} other {# tenants} }", - "delete-tenants-text": "注意してください。確認後、選択されたすべてのテナントが削除され、関連するすべてのデータは回復不能になります。", - "title": "タイトル", - "title-required": "タイトルは必須です。", - "description": "説明", - "details": "詳細", - "events": "イベント", - "copyId": "テナントIDをコピーする", - "idCopiedMessage": "テナントIDがクリップボードにコピーされました", - "select-tenant": "テナントを選択", - "no-tenants-matching": "'{{entity}}'発見されました。", - "tenant-required": "テナントが必要です" - }, - "timeinterval": { - "seconds-interval": "{ seconds, plural, =1 {1 second} other {# seconds} }", - "minutes-interval": "{ minutes, plural, =1 {1 minute} other {# minutes} }", - "hours-interval": "{ hours, plural, =1 {1 hour} other {# hours} }", - "days-interval": "{ days, plural, =1 {1 day} other {# days} }", - "days": "日", - "hours": "時", - "minutes": "分", - "seconds": "秒", - "advanced": "カスタム" - }, - "timewindow": { - "days": "{ days, plural, =1 { day } other {# days } }", - "hours": "{ hours, plural, =0 { hour } =1 {1 hour } other {# hours } }", - "minutes": "{ minutes, plural, =0 { minute } =1 {1 minute } other {# minutes } }", - "seconds": "{ seconds, plural, =0 { second } =1 {1 second } other {# seconds } }", - "realtime": "リアルタイム", - "history": "履歴", - "last-prefix": "直近", - "period": "{{ startTime }}{{ endTime }}", - "edit": "タイムウィンドウを編集", - "date-range": "期間", - "last": "直近", - "time-period": "期間" - }, - "user": { - "user": "ユーザー", - "users": "ユーザー", - "customer-users": "顧客ユーザー", - "tenant-admins": "テナント管理者", - "sys-admin": "システム管理者", - "tenant-admin": "テナント管理者", - "customer": "顧客", - "anonymous": "匿名", - "add": "ユーザーを追加する", - "delete": "ユーザーを削除", - "add-user-text": "新しいユーザーを追加", - "no-users-text": "ユーザが見つかりませんでした", - "user-details": "ユーザーの詳細", - "delete-user-title": "'{{userEmail}}'?", - "delete-user-text": "確認後、ユーザーと関連するすべてのデータが回復不能になるので注意してください。", - "delete-users-title": "{ count, plural, =1 {1 user} other {# users} }?", - "delete-users-action-title": "{ count, plural, =1 {1 user} other {# users} }", - "delete-users-text": "注意してください。確認後、選択したすべてのユーザーが削除され、関連するすべてのデータは回復不能になります。", - "activation-email-sent-message": "アクティベーション電子メールが正常に送信されました!", - "resend-activation": "アクティブ化を再送", - "email": "Eメール", - "email-required": "電子メールが必要です。", - "invalid-email-format": "メールフォーマットが無効です。", - "first-name": "ファーストネーム", - "last-name": "苗字", - "description": "説明", - "default-dashboard": "デフォルトのダッシュボード", - "always-fullscreen": "常に全画面表示", - "select-user": "ユーザーを選択", - "no-users-matching": "'{{entity}}'発見されました。", - "user-required": "ユーザーは必須です", - "activation-method": "起動方法", - "display-activation-link": "アクティブ化リンクを表示する", - "send-activation-mail": "アクティベーションメールを送信する", - "activation-link": "ユーザーアクティベーションリンク", - "activation-link-text": "activation link :", - "copy-activation-link": "アクティブ化リンクをコピーする", - "activation-link-copied-message": "ユーザーのアクティベーションリンクがクリップボードにコピーされました", - "details": "詳細" - }, - "value": { - "type": "値のタイプ", - "string": "文字列", - "string-value": "文字列値", - "integer": "整数", - "integer-value": "整数値", - "invalid-integer-value": "整数値が無効です", - "double": "ダブル", - "double-value": "二重価値", - "boolean": "ブール", - "boolean-value": "ブール値", - "false": "偽", - "true": "真", - "long": "長いです" - }, - "widget": { - "widget-library": "ウィジェットライブラリ", - "widget-bundle": "ウィジェットバンドル", - "select-widgets-bundle": "ウィジェットのバンドルを選択", - "management": "ウィジェット管理", - "editor": "ウィジェットエディタ", - "widget-type-not-found": "ウィジェットの設定を読み込む際に問題が発生しました。
おそらく関連付けられているウィジェットのタイプが削除されています。", - "widget-type-load-error": "次のエラーのためにウィジェットが読み込まれませんでした:", - "remove": "ウィジェットを削除", - "edit": "ウィジェットの編集", - "remove-widget-title": "'{{widgetTitle}}'?", - "remove-widget-text": "確認後、ウィジェットと関連するすべてのデータは回復不能になります。", - "timeseries": "時系列", - "search-data": "検索データ", - "no-data-found": "何もデータが見つかりませんでした", - "latest": "最新の値", - "rpc": "コントロールウィジェット", - "alarm": "アラームウィジェット", - "static": "静的ウィジェット", - "select-widget-type": "ウィジェットタイプを選択", - "missing-widget-title-error": "ウィジェットのタイトルを指定する必要があります!", - "widget-saved": "ウィジェットが保存されました", - "unable-to-save-widget-error": "ウィジェットを保存できません!ウィジェットにエラーがあります!", - "save": "ウィジェットを保存", - "saveAs": "ウィジェットを次のように保存する", - "save-widget-type-as": "ウィジェットタイプを次のように保存します", - "save-widget-type-as-text": "新しいウィジェットのタイトルを入力したり、ターゲットウィジェットのバンドルを選択してください", - "toggle-fullscreen": "フルスクリーン切り替え", - "run": "ウィジェットを実行する", - "title": "ウィジェットのタイトル", - "title-required": "ウィジェットのタイトルが必要です。", - "type": "ウィジェットタイプ", - "resources": "リソース", - "resource-url": "JavaScript / CSS URL", - "remove-resource": "リソースを削除する", - "add-resource": "リソースを追加", - "html": "HTML", - "tidy": "きちんとした", - "css": "CSS", - "settings-schema": "設定スキーマ", - "datakey-settings-schema": "データキー設定のスキーマ", - "javascript": "Javascript", - "add-widget-type": "新しいウィジェットタイプを追加する", - "widget-template-load-failed-error": "ウィジェットテンプレートを読み込めませんでした!", - "add": "ウィジェットを追加", - "undo": "ウィジェットの変更を元に戻す", - "export": "ウィジェットの書き出し" - }, - "widget-action": { - "header-button": "ウィジェットのヘッダーボタン", - "open-dashboard-state": "新しいダッシュボードの状態に移動する", - "update-dashboard-state": "現在のダッシュボードの状態を更新する", - "open-dashboard": "他のダッシュボードに移動する", - "custom": "カスタムアクション", - "target-dashboard-state": "ターゲットダッシュボードの状態", - "target-dashboard-state-required": "ターゲットダッシュボードの状態が必要です", - "set-entity-from-widget": "エンティティをウィジェットから設定する", - "target-dashboard": "ターゲットダッシュボード", - "open-right-layout": "右ダッシュボードレイアウトを開く(モバイルビュー)" - }, - "widgets-bundle": { - "current": "現在のバンドル", - "widgets-bundles": "ウィジェットバンドル", - "add": "ウィジェットのバンドルを追加", - "delete": "ウィジェットのバンドルを削除する", - "title": "タイトル", - "title-required": "タイトルは必須です。", - "add-widgets-bundle-text": "新しいウィジェットのバンドルを追加する", - "no-widgets-bundles-text": "ウィジェットバンドルが見つかりません", - "empty": "ウィジェットのバンドルが空です", - "details": "詳細", - "widgets-bundle-details": "ウィジェットのバンドルの詳細", - "delete-widgets-bundle-title": "'{{widgetsBundleTitle}}'?", - "delete-widgets-bundle-text": "確認後、ウィジェットはバンドルされ、関連するすべてのデータは回復不能になります。", - "delete-widgets-bundles-title": "{ count, plural, =1 {1 widgets bundle} other {# widgets bundles} }?", - "delete-widgets-bundles-action-title": "{ count, plural, =1 {1 widgets bundle} other {# widgets bundles} }", - "delete-widgets-bundles-text": "確認後、選択したすべてのウィジェットバンドルは削除され、関連するすべてのデータは回復不能になります。", - "no-widgets-bundles-matching": "'{{widgetsBundle}}'発見されました。", - "widgets-bundle-required": "ウィジェットバンドルが必要です。", - "system": "システム", - "import": "インポートウィジェットバンドル", - "export": "ウィジェットのエクスポートバンドル", - "export-failed-error": "{{error}}", - "create-new-widgets-bundle": "新しいウィジェットバンドルを作成する", - "widgets-bundle-file": "ウィジェットのバンドルファイル", - "invalid-widgets-bundle-file-error": "ウィジェットをインポートできません。bundle:データ構造が無効です。" - }, - "widget-config": { - "data": "データ", - "settings": "設定", - "advanced": "カスタム", - "title": "タイトル", - "general-settings": "一般設定", - "display-title": "タイトルを表示", - "drop-shadow": "影を落とす", - "enable-fullscreen": "フルスクリーンを有効にする", - "background-color": "背景色", - "text-color": "テキストの色", - "padding": "パディング", - "margin": "マージン", - "widget-style": "ウィジェットスタイル", - "title-style": "タイトルスタイル", - "mobile-mode-settings": "モバイルモードの設定", - "order": "順番", - "height": "高さ", - "units": "単位", - "decimals": "小数点以下の桁数", - "timewindow": "タイムウィンドウ", - "use-dashboard-timewindow": "ダッシュボードのタイムウィンドウを使用する", - "display-legend": "凡例を表示", - "datasources": "データソース", - "maximum-datasources": "{ count, plural, =1 {1 datasource is allowed.} other {# datasources are allowed} }", - "datasource-type": "タイプ", - "datasource-parameters": "パラメーター", - "remove-datasource": "データソースを削除", - "add-datasource": "データソースを追加", - "target-device": "ターゲットデバイス", - "alarm-source": "アラームソース", - "actions": "アクション", - "action": "アクション", - "add-action": "アクションを追加", - "search-actions": "検索アクション", - "action-source": "アクションソース", - "action-source-required": "アクションソースが必要です。", - "action-name": "名", - "action-name-required": "アクション名は必須です。", - "action-name-not-unique": "同じ名前の別のアクションがすでに存在します。\nアクション名は、同じアクションソース内で一意である必要があります。", - "action-icon": "アイコン", - "action-type": "タイプ", - "action-type-required": "アクションタイプが必要です。", - "edit-action": "アクションの編集", - "delete-action": "アクションの削除", - "delete-action-title": "ウィジェットアクションを削除する", - "delete-action-text": "'{{actionName}}'?" - }, - "widget-type": { - "import": "ウィジェットタイプをインポート", - "export": "ウィジェットのタイプをエクスポート", - "export-failed-error": "{{error}}", - "create-new-widget-type": "新しいウィジェットタイプを作成する", - "widget-type-file": "ウィジェットタイプファイル", - "invalid-widget-type-file-error": "ウィジェットタイプをインポートできません:ウィジェットタイプのデータ構造が無効です。" - }, - "widgets": { - "date-range-navigator": { - "localizationMap": { - "Sun": "日", - "Mon": "月", - "Tue": "火", - "Wed": "水", - "Thu": "木", - "Fri": "金", - "Sat": "土", - "Jan": "1月", - "Feb": "2月", - "Mar": "3月", - "Apr": "4月", - "May": "5月", - "Jun": "6月", - "Jul": "7月", - "Aug": "8月", - "Sep": "9月", - "Oct": "10月", - "Nov": "11月", - "Dec": "12月", - "January": "1月", - "February": "2月", - "March": "3月", - "April": "4月", - "June": "6月", - "July": "7月", - "August": "8月", - "September": "9月", - "October": "10月", - "November": "11月", - "December": "12月", - "Custom Date Range": "カスタム期間", - "Date Range Template": "日付範囲テンプレート", - "Today": "今日", - "Yesterday": "昨日", - "This Week": "今週", - "Last Week": "先週", - "This Month": "今月", - "Last Month": "先月", - "Year": "年", - "This Year": "今年", - "Last Year": "昨年", - "Date picker": "日付選択", - "Hour": "時", - "Day": "日", - "Week": "週間", - "2 weeks": "2週間", - "Month": "月", - "3 months": "3ヶ月", - "6 months": "6ヵ月", - "Custom interval": "カスタム間隔", - "Interval": "間隔", - "Step size": "刻み幅", - "Ok": "Ok" - } - } - }, - "icon": { - "icon": "アイコン", - "select-icon": "選択アイコン", - "material-icons": "マテリアルアイコン", - "show-all": "すべてのアイコンを表示する" - }, - "custom": { - "widget-action": { - "action-cell-button": "アクションセルボタン", - "row-click": "行のクリック", - "polygon-click": "ポリゴンクリック", - "marker-click": "マーカークリック", - "tooltip-tag-action": "ツールチップのタグアクション" - } - }, - "language": { - "language": "言語" - } -} + "has-error": "エラーが発生しています", + "entity-id": "エンティティID", + "copy-entity-id": "エンティティIDをコピー", + "entity-type": "エンティティタイプ", + "clear-filter": "フィルターをクリア", + "clear-request-title": "すべてのイベントをクリア", + "clear-request-text": "すべてのイベントをクリアしてもよろしいですか?", + "started": "開始", + "updated": "更新", + "stopped": "停止" + }, + "extension": { + "extensions": "拡張機能", + "selected-extensions": "{ count, plural, =1 {1 件の拡張機能} other {# 件の拡張機能} } が選択されました", + "type": "タイプ", + "key": "キー", + "value": "値", + "id": "ID", + "extension-id": "拡張機能ID", + "extension-type": "拡張機能タイプ", + "transformer-json": "JSON *", + "unique-id-required": "現在の拡張機能IDはすでに存在します。", + "delete": "拡張機能を削除", + "add": "拡張機能を追加", + "edit": "拡張機能を編集", + "delete-extension-title": "拡張機能 '{{extensionId}}' を削除してもよろしいですか?", + "delete-extension-text": "確認後、拡張機能とその関連データは復元できなくなりますのでご注意ください。", + "delete-extensions-title": "{ count, plural, =1 {1 件の拡張機能} other {# 件の拡張機能} } を削除してもよろしいですか?", + "delete-extensions-text": "確認後、選択したすべての拡張機能が削除されますのでご注意ください。", + "converters": "コンバーター", + "converter-id": "コンバーターID", + "configuration": "設定", + "converter-configurations": "コンバーター設定", + "token": "セキュリティトークン", + "add-converter": "コンバーターを追加", + "add-config": "コンバーター設定を追加", + "device-name-expression": "デバイス名式", + "device-type-expression": "デバイスタイプ式", + "custom": "カスタム", + "to-double": "ダブルに変換", + "transformer": "トランスフォーマー", + "json-required": "トランスフォーマーのJSONは必須です。", + "json-parse": "トランスフォーマーJSONを解析できません。", + "attributes": "属性", + "add-attribute": "属性を追加", + "add-map": "マッピング要素を追加", + "timeseries": "時系列", + "add-timeseries": "時系列を追加", + "field-required": "フィールドは必須です", + "brokers": "ブローカー", + "add-broker": "ブローカーを追加", + "host": "ホスト", + "port": "ポート", + "port-range": "ポートは 1 から 65535 の範囲内である必要があります。", + "ssl": "SSL", + "credentials": "認証情報", + "username": "ユーザー名", + "password": "パスワード", + "retry-interval": "リトライ間隔(ミリ秒単位)", + "anonymous": "匿名", + "basic": "ベーシック", + "pem": "PEM", + "ca-cert": "CA証明書ファイル *", + "private-key": "秘密鍵ファイル *", + "cert": "証明書ファイル *", + "no-file": "ファイルが選択されていません。", + "drop-file": "ファイルをドロップするか、クリックしてファイルを選択してアップロードしてください。", + "mapping": "マッピング", + "topic-filter": "トピックフィルター", + "converter-type": "コンバータタイプ", + "converter-json": "JSON", + "json-name-expression": "デバイス名のJSON式", + "topic-name-expression": "デバイス名のトピック式", + "json-type-expression": "デバイスタイプのJSON式", + "topic-type-expression": "デバイスタイプのトピック式", + "attribute-key-expression": "属性キー式", + "attr-json-key-expression": "属性キーJSON式", + "attr-topic-key-expression": "属性キートピック式", + "request-id-expression": "リクエストID式", + "request-id-json-expression": "リクエストIDJSON式", + "request-id-topic-expression": "リクエストIDトピック式", + "response-topic-expression": "レスポストピック式", + "value-expression": "値式", + "topic": "トピック", + "timeout": "タイムアウト(ミリ秒単位)", + "converter-json-required": "コンバータJSONは必須です。", + "converter-json-parse": "コンバータJSONの解析に失敗しました。", + "filter-expression": "フィルター式", + "connect-requests": "接続リクエスト", + "add-connect-request": "接続リクエストを追加", + "disconnect-requests": "切断リクエスト", + "add-disconnect-request": "切断リクエストを追加", + "attribute-requests": "属性リクエスト", + "add-attribute-request": "属性リクエストを追加", + "attribute-updates": "属性更新", + "add-attribute-update": "属性更新を追加", + "server-side-rpc": "サーバーサイドRPC", + "add-server-side-rpc-request": "サーバーサイドRPCリクエストを追加", + "device-name-filter": "デバイス名フィルター", + "attribute-filter": "属性フィルター", + "method-filter": "メソッドフィルター", + "request-topic-expression": "リクエストトピック式", + "response-timeout": "レスポンスタイムアウト(ミリ秒単位)", + "topic-expression": "トピック式", + "client-scope": "クライアントスコープ", + "add-device": "デバイスを追加", + "opc-server": "サーバー", + "opc-add-server": "サーバーを追加", + "opc-add-server-prompt": "サーバーを追加してください", + "opc-application-name": "アプリケーション名", + "opc-application-uri": "アプリケーションURI", + "opc-scan-period-in-seconds": "スキャン周期(秒単位)", + "opc-security": "セキュリティ", + "opc-identity": "アイデンティティ", + "opc-keystore": "キーストア", + "opc-type": "タイプ", + "opc-keystore-type": "タイプ", + "opc-keystore-location": "場所 *", + "opc-keystore-password": "パスワード", + "opc-keystore-alias": "エイリアス", + "opc-keystore-key-password": "鍵のパスワード", + "opc-device-node-pattern": "デバイスノードパターン", + "opc-device-name-pattern": "デバイス名パターン", + "modbus-server": "サーバー/スレーブ", + "modbus-add-server": "サーバー/スレーブを追加", + "modbus-add-server-prompt": "サーバー/スレーブを追加してください", + "modbus-transport": "トランスポート", + "modbus-tcp-reconnect": "自動再接続", + "modbus-rtu-over-tcp": "RTU over TCP", + "modbus-port-name": "シリアルポート名", + "modbus-encoding": "エンコーディング", + "modbus-parity": "パリティ", + "modbus-baudrate": "ボーレート", + "modbus-databits": "データビット", + "modbus-stopbits": "ストップビット", + "modbus-databits-range": "データビットは7から8の範囲である必要があります。", + "modbus-stopbits-range": "ストップビットは1から2の範囲である必要があります。", + "modbus-unit-id": "ユニットID", + "modbus-unit-id-range": "ユニットIDは1から247の範囲である必要があります。", + "modbus-device-name": "デバイス名", + "modbus-poll-period": "ポーリング周期(ms)", + "modbus-attributes-poll-period": "属性ポーリング周期(ms)", + "modbus-timeseries-poll-period": "時系列ポーリング周期(ms)", + "modbus-poll-period-range": "ポーリング周期は正の値である必要があります。", + "modbus-tag": "タグ", + "modbus-function": "ファンクション", + "modbus-register-address": "レジスタアドレス", + "modbus-register-address-range": "レジスタアドレスは0から65535の範囲である必要があります。", + "modbus-register-bit-index": "ビットインデックス", + "modbus-register-bit-index-range": "ビットインデックスは0から15の範囲である必要があります。", + "modbus-register-count": "レジスタ数", + "modbus-register-count-range": "レジスタ数は正の値である必要があります。", + "modbus-byte-order": "バイト順序", + "sync": { + "status": "ステータス", + "sync": "同期", + "not-sync": "未同期", + "last-sync-time": "最終同期時間", + "not-available": "利用不可" + }, + "export-extensions-configuration": "拡張機能設定をエクスポート", + "import-extensions-configuration": "拡張機能設定をインポート", + "import-extensions": "拡張機能をインポート", + "import-extension": "拡張機能をインポート", + "export-extension": "拡張機能をエクスポート", + "file": "拡張機能ファイル", + "invalid-file-error": "無効な拡張機能ファイル" + }, + "feature": { + "advanced-features": "高度な機能" + }, + "filter": { + "add": "フィルターを追加", + "edit": "フィルターを編集", + "name": "フィルター名", + "name-required": "フィルター名は必須です。", + "duplicate-filter": "同じ名前のフィルターがすでに存在します。", + "filters": "フィルター", + "unable-delete-filter-title": "フィルターを削除できません", + "unable-delete-filter-text": "フィルター '{{filter}}' は、以下のウィジェットで使用されているため削除できません:
{{widgetsList}}", + "duplicate-filter-error": "重複するフィルター '{{filter}}' が見つかりました。
フィルターはダッシュボード内で一意である必要があります。", + "missing-key-filters-error": "フィルター '{{filter}}' にキー フィルターがありません。", + "filter": "フィルター", + "editable": "編集可能", + "editable-hint": "ユーザーがダッシュボードでフィルターの値を変更できるようにします。", + "no-filters-found": "フィルターが見つかりません。", + "no-filter-text": "フィルターが指定されていません", + "add-filter-prompt": "フィルターを追加してください", + "no-filter-matching": "'{{filter}}' は見つかりません。", + "create-new-filter": "新しいフィルターを作成!", + "create-new": "新規作成", + "filter-required": "フィルターは必須です。", + "operation": { + "operation": "操作", + "equal": "等しい", + "not-equal": "等しくない", + "starts-with": "で始まる", + "ends-with": "で終わる", + "contains": "を含む", + "not-contains": "を含まない", + "greater": "より大きい", + "less": "より小さい", + "greater-or-equal": "以上", + "less-or-equal": "以下", + "and": "かつ", + "or": "または", + "in": "の中に", + "not-in": "の中にない" + }, + "ignore-case": "大文字小文字を区別しない", + "value": "値", + "remove-filter": "フィルターを削除", + "duplicate-filter-action": "フィルターを重複", + "preview": "フィルタープレビュー", + "no-filters": "フィルターが設定されていません", + "add-filter": "フィルターを追加", + "add-complex-filter": "複雑なフィルターを追加", + "add-complex": "複雑なフィルターを追加", + "complex-filter": "複雑なフィルター", + "edit-complex-filter": "複雑なフィルターを編集", + "edit-filter-user-params": "フィルタープレディケートのユーザーパラメータを編集", + "filter-user-params": "フィルタープレディケートのユーザーパラメータ", + "user-parameters": "ユーザーパラメータ", + "display-label": "表示ラベル", + "custom-label": "カスタムラベル", + "custom-label-hint": "フィルターに独自のラベルを設定できるようにします。無効にすると、ラベルが自動的に生成されます。", + "order-priority": "表示順序", + "key-filter": "キー フィルター", + "key-filters": "キー フィルター", + "key-name": "キー名", + "key-name-required": "キー名は必須です。", + "key-type": { + "key-type": "キータイプ", + "attribute": "属性", + "timeseries": "時系列", + "entity-field": "エンティティフィールド", + "constant": "定数", + "client-attribute": "クライアント属性", + "server-attribute": "サーバー属性", + "shared-attribute": "共有属性" + }, + "value-type": { + "value-type": "値のタイプ", + "string": "文字列", + "numeric": "数値", + "boolean": "ブール値", + "date-time": "日時" + }, + "value-type-required": "キーの値タイプは必須です。", + "key-value-type-change-title": "キーの値タイプを変更してもよろしいですか?", + "key-value-type-change-message": "新しい値タイプを確認すると、入力したすべてのキー フィルターが削除されます。", + "no-key-filters": "キー フィルターは設定されていません", + "add-key-filter": "キー フィルターを追加", + "remove-key-filter": "キー フィルターを削除", + "edit-key-filter": "キー フィルターを編集", + "date": "日付", + "time": "時間", + "current-tenant": "現在のテナント", + "current-customer": "現在の顧客", + "current-user": "現在のユーザー", + "current-device": "現在のデバイス", + "default-value": "デフォルト値", + "default-comma-separated-values": "デフォルトのカンマ区切り値", + "dynamic-source-type": "動的ソースタイプ", + "dynamic-value": "動的値", + "no-dynamic-value": "動的値なし", + "source-attribute": "ソース属性", + "switch-to-dynamic-value": "動的値に切り替え", + "switch-to-default-value": "デフォルト値に切り替え", + "inherit-owner": "所有者から継承", + "source-attribute-not-set": "ソース属性が設定されていない場合", + "unit": "単位" + }, + "fullscreen": { + "expand": "全画面表示に拡大", + "exit": "全画面表示を終了", + "toggle": "全画面モードの切り替え", + "fullscreen": "全画面表示" + }, + "function": { + "function": "関数" + }, + "gateway": { + "gateway-name": "Gateway名", + "gateway-name-required": "Gateway名は必須です。", + "gateways": "Gateways", + "create-new-gateway": "新しいGatewayを作成", + "create-new-gateway-text": "名前 '{{gatewayName}}' で新しいGatewayを作成してもよろしいですか?", + "launch-command": "コマンドを実行", + "no-gateway-found": "Gatewayは見つかりませんでした。", + "no-gateway-matching": " '{{item}}' は見つかりませんでした。" + }, + "grid": { + "delete-item-title": "このアイテムを削除してもよろしいですか?", + "delete-item-text": "確認後、このアイテムと関連するすべてのデータは復元できなくなりますのでご注意ください。", + "delete-items-title": "{ count, plural, =1 {1 件のアイテム} other {# 件のアイテム} } を削除してもよろしいですか?", + "delete-items-action-title": "{ count, plural, =1 {1 件のアイテム} other {# 件のアイテム} } を削除", + "delete-items-text": "確認後、選択したすべてのアイテムが削除され、関連するすべてのデータは復元できなくなります。", + "add-item-text": "新しいアイテムを追加", + "no-items-text": "アイテムが見つかりません", + "item-details": "アイテム詳細", + "delete-item": "アイテムを削除", + "delete-items": "アイテムを削除", + "scroll-to-top": "トップにスクロール" + }, + "help": { + "goto-help-page": "ヘルプページへ移動", + "show-help": "ヘルプを表示" + }, + "home": { + "home": "ホーム", + "profile": "プロフィール", + "logout": "ログアウト", + "menu": "メニュー", + "avatar": "アバター", + "open-user-menu": "ユーザーメニューを開く" + }, + "file-input": { + "browse-file": "ファイルを選択", + "browse-files": "ファイルを選択" + }, + "image": { + "gallery": "画像ギャラリー", + "search": "画像を検索", + "selected-images": "{ count, plural, =1 {1 枚の画像} other {# 枚の画像} } が選択されました", + "created-time": "作成日時", + "name": "名前", + "name-required": "名前は必須です。", + "resolution": "解像度", + "size": "サイズ", + "system": "システム", + "download-image": "画像をダウンロード", + "export-image": "画像をJSONとしてエクスポート", + "import-image": "画像をJSONからインポート", + "upload-image": "画像をアップロード", + "edit-image": "画像を編集", + "image-details": "画像の詳細", + "no-images": "画像が見つかりません", + "delete-image": "画像を削除", + "delete-image-title": "画像 '{{imageTitle}}' を削除してもよろしいですか?", + "delete-image-text": "確認後、この画像は復元できなくなりますのでご注意ください。", + "delete-images-title": "{ count, plural, =1 {1 枚の画像} other {# 枚の画像} } を削除してもよろしいですか?", + "delete-images-text": "確認後、選択したすべての画像が削除され、関連するデータも復元できなくなりますのでご注意ください。", + "list-mode": "リスト表示", + "grid-mode": "グリッド表示", + "image-preview": "画像プレビュー", + "update-image": "画像を更新", + "export-failed-error": "画像をエクスポートできませんでした: {{error}}", + "image-json-file": "画像JSONファイル", + "invalid-image-json-file-error": "画像をJSONからインポートできませんでした: 無効な画像JSONデータ構造です。", + "image-is-in-use": "画像は他のエンティティで使用されています", + "images-are-in-use": "画像は他のエンティティで使用されています", + "image-is-in-use-text": "画像 '{{title}}' は以下のエンティティで使用されているため削除されませんでした。", + "images-are-in-use-text": "すべての画像が削除されなかった理由は、他のエンティティで使用されているためです。
参照されているエンティティは、対応する画像行の 参照 ボタンをクリックすることで表示できます。
それでもこれらの画像を削除する場合は、下のテーブルで画像を選択し、選択したものを削除 ボタンをクリックしてください。", + "delete-image-in-use-text": "それでも画像を削除する場合は、とにかく削除 ボタンをクリックしてください。", + "system-entities": "システムエンティティ:", + "entities": "エンティティ:", + "references": "参照", + "include-system-images": "システム画像を含める", + "clear-image": "画像をクリア", + "no-image": "画像なし", + "no-image-selected": "画像が選択されていません", + "browse-from-gallery": "ギャラリーから選択", + "set-link": "リンクを設定", + "image-link": "画像リンク", + "link": "リンク", + "copy-image-link": "画像リンクをコピー", + "embed-image": "画像を埋め込む", + "embed-to-html": "HTMLに埋め込む", + "embed-to-html-hint": "この機能により、リンクが無許可のユーザーにも利用可能になります。", + "embed-to-html-text": "以下のコードスニペットを使用することで、プレーンHTMLベースのコンポーネントに画像を埋め込むことができます。
そのようなコンポーネントには、HTMLカードウィジェット、セルコンテンツ関数などが含まれます。", + "embed-to-angular-template": "Angular HTMLテンプレートに埋め込む", + "embed-to-angular-template-text": "以下のコードスニペットを使用することで、Angular HTMLテンプレートに画像を埋め込み、コンポーネントで使用できます。
そのようなコンポーネントには、Markdownウィジェット、ウィジェットエディターのHTMLセクション、カスタムアクションなどが含まれます。" + }, + "image-input": { + "drop-images-or": "画像をドラッグアンドドロップするか", + "drag-and-drop": "ドラッグ&ドロップ", + "or": "または", + "browse": "参照", + "no-images": "画像が選択されていません", + "images": "画像" + }, + "import": { + "no-file": "ファイルが選択されていません", + "drop-file": "JSONファイルをドロップするか、クリックしてファイルを選択してアップロードしてください。", + "drop-json-file-or": "JSONファイルをドラッグアンドドロップするか", + "drop-file-csv": "CSVファイルをドロップするか、クリックしてファイルを選択してアップロードしてください。", + "drop-file-csv-or": "CSVファイルをドラッグアンドドロップするか", + "column-value": "値", + "column-title": "タイトル", + "column-example": "例:値データ", + "column-key": "属性/テレメトリキー", + "credentials": "認証情報", + "csv-delimiter": "CSV区切り文字", + "csv-first-line-header": "最初の行に列名が含まれています", + "csv-update-data": "属性/テレメトリの更新", + "details": "詳細", + "import-csv-number-columns-error": "ファイルには少なくとも2列が含まれている必要があります", + "import-csv-invalid-format-error": "無効なファイル形式です。行:'{{line}}'", + "column-type": { + "name": "名前", + "type": "タイプ", + "label": "ラベル", + "column-type": "列タイプ", + "client-attribute": "クライアント属性", + "shared-attribute": "共有属性", + "server-attribute": "サーバー属性", + "timeseries": "時系列", + "entity-field": "エンティティフィールド", + "access-token": "アクセストークン", + "x509": "X.509", + "mqtt": { + "client-id": "MQTTクライアントID", + "user-name": "MQTTユーザー名", + "password": "MQTTパスワード" + }, + "lwm2m": { + "client-endpoint": "LwM2Mエンドポイントクライアント名", + "security-config-mode": "LwM2Mセキュリティ設定モード", + "client-identity": "LwM2MクライアントID", + "client-key": "LwM2Mクライアントキー", + "client-cert": "LwM2Mクライアント公開鍵", + "bootstrap-server-security-mode": "LwM2Mブートストラップサーバーセキュリティモード", + "bootstrap-server-secret-key": "LwM2Mブートストラップサーバー秘密鍵", + "bootstrap-server-public-key-id": "LwM2Mブートストラップサーバー公開鍵またはID", + "lwm2m-server-security-mode": "LwM2Mサーバーセキュリティモード", + "lwm2m-server-secret-key": "LwM2Mサーバー秘密鍵", + "lwm2m-server-public-key-id": "LwM2Mサーバー公開鍵またはID" + }, + "snmp": { + "host": "SNMPホスト", + "port": "SNMPポート", + "version": "SNMPバージョン(v1、v2c、またはv3)", + "community-string": "SNMPコミュニティ文字列" + }, + "isgateway": "Gatewayかどうか", + "activity-time-from-gateway-device": "Gatewayデバイスからの活動時間", + "description": "説明", + "routing-key": "Edgeキー", + "secret": "Edgeシークレット" + }, + "stepper-text": { + "select-file": "ファイルを選択", + "configuration": "設定をインポート", + "column-type": "列タイプを選択", + "creat-entities": "新しいエンティティを作成中" + }, + "message": { + "create-entities": "{{count}} 件の新しいエンティティが正常に作成されました。", + "update-entities": "{{count}} 件のエンティティが正常に更新されました。", + "error-entities": "{{count}} 件のエンティティ作成中にエラーが発生しました。" + } + }, + "scada": { + "symbols": "SCADAシンボル", + "search": "シンボルを検索", + "selected-symbols": "{ count, plural, =1 {1 件のシンボル} other {# 件のシンボル} } が選択されました", + "download-symbol": "SCADAシンボルをダウンロード", + "export-symbol": "SCADAシンボルをJSONとしてエクスポート", + "import-symbol": "SCADAシンボルをJSONからインポート", + "upload-symbol": "SCADAシンボルをアップロード", + "update-symbol": "SCADAシンボルを更新", + "edit-symbol": "SCADAシンボルを編集", + "symbol-details": "SCADAシンボルの詳細", + "mode-svg": "SVG", + "mode-xml": "XML", + "no-symbols": "シンボルが見つかりません", + "show-hidden-elements": "隠された要素を表示", + "hide-hidden-elements": "隠された要素を非表示", + "delete-symbol": "SCADAシンボルを削除", + "delete-symbol-title": "SCADAシンボル '{{imageTitle}}' を削除してもよろしいですか?", + "delete-symbol-text": "確認後、SCADAシンボルは復元できなくなりますのでご注意ください。", + "delete-symbols-title": "{ count, plural, =1 {1 件のSCADAシンボル} other {# 件のSCADAシンボル} } を削除してもよろしいですか?", + "delete-symbols-text": "確認後、選択したすべてのSCADAシンボルが削除され、関連するデータは復元できなくなりますのでご注意ください。", + "include-system-symbols": "システムシンボルを含める", + "symbol-preview": "シンボルプレビュー", + "general": "一般", + "tags": "タグ", + "properties": "プロパティ", + "title": "タイトル", + "description": "説明", + "search-tags": "タグを検索", + "widget-size": "ウィジェットサイズ", + "cols": "列", + "rows": "行", + "state-render-function": "状態レンダリング関数", + "preview": "プレビュー", + "preview-widget-action-text": "ウィジェットアクション '{{type}}' が正常に呼び出されました!", + "no-symbol": "SCADAシンボルなし", + "no-symbol-selected": "SCADAシンボルが選択されていません", + "clear-symbol": "SCADAシンボルをクリア", + "browse-symbol-from-gallery": "ギャラリーからSCADAシンボルを選択", + "zoom-in": "ズームイン", + "zoom-out": "ズームアウト", + "create-widget": "ウィジェットを作成", + "create-widget-from-symbol": "SCADAシンボルからウィジェットを作成", + "hidden": "隠された", + "tag": { + "tag": "タグ", + "on-click-action": "クリック時のアクション", + "no-tags": "タグが設定されていません", + "delete-tag-text": "{{elementType}} 要素からタグ {{tag}} を削除してもよろしいですか?", + "update-tag": "タグを更新", + "enter-tag": "タグを入力", + "tag-settings": "タグ設定", + "remove-tag": "タグを削除", + "add-tag": "タグを追加" + }, + "behavior": { + "behavior": "動作", + "id": "ID", + "name": "名前", + "type": "タイプ", + "no-behaviors": "動作が設定されていません", + "add-behavior": "動作を追加", + "type-action": "アクション", + "type-value": "値", + "type-widget-action": "ウィジェットアクション", + "behavior-settings": "動作設定", + "remove-behavior": "動作を削除", + "hint": "ヒント", + "group-title": "グループタイトル", + "value-type": "値のタイプ", + "default-value": "デフォルト値", + "true-label": "真ラベル", + "false-label": "偽ラベル", + "state-label": "状態ラベル", + "default-payload": "デフォルトペイロード", + "not-unique-behavior-ids-error": "動作IDは一意でなければなりません!", + "default-settings": "デフォルト設定" + }, + "symbol": { + "symbol": "SCADAシンボル", + "fluid-presence": "流体の存在", + "fluid-presence-hint": "パイプ内に流体が存在するかどうかを示します。", + "fluid-present": "流体が存在", + "present": "存在", + "absent": "不在", + "flow-presence": "流れの存在", + "flow-presence-hint": "パイプ内で流体が流れているかどうかを示します。", + "flow-present": "流れあり", + "flow-direction": "流れの方向", + "flow-direction-hint": "流体の流れる方向を示します。", + "forward": "前方", + "reverse": "逆方向", + "flow-animation-speed": "流れのアニメーション速度", + "flow-animation-speed-hint": "流れのアニメーション速度を示す倍数値。1 - 通常の速度、0 - アニメーションなし、< 1 - より遅いアニメーション、> 1 - より速いアニメーション。", + "leak": "漏れ", + "leak-hint": "パイプ内に漏れがあるかどうかを示します。", + "leak-present": "漏れあり", + "fluid-color": "流体の色", + "pipe-color": "パイプの色", + "horizontal-pipe": "水平パイプ", + "vertical-pipe": "垂直パイプ", + "horizontal-fluid-color": "水平流体の色", + "vertical-fluid-color": "垂直流体の色", + "left-pipe": "左パイプ", + "right-pipe": "右パイプ", + "top-pipe": "上パイプ", + "bottom-pipe": "下パイプ", + "left-fluid-color": "左流体の色", + "right-fluid-color": "右流体の色", + "top-fluid-color": "上流体の色", + "bottom-fluid-color": "下流体の色", + "display": "表示", + "display-format": "表示形式", + "value": "値", + "decimals": "小数点以下の桁数", + "units": "単位", + "flow-meter-value-hint": "流量計表示に表示される倍数値", + "value-hint": "現在の値を示す倍数値", + "running": "実行中", + "running-hint": "コンポーネントが実行中の状態かどうかを示します。", + "warning-state": "警告状態", + "warning": "警告", + "warning-click": "警告クリック", + "warning-state-hint": "コンポーネントが警告状態かどうかを示します。", + "critical-state": "重大状態", + "critical": "重大", + "critical-click": "重大クリック", + "critical-state-hint": "コンポーネントが重大状態かどうかを示します。", + "critical-state-animation": "重大状態アニメーション", + "critical-state-animation-hint": "コンポーネントが重大状態の時に点滅アニメーションを有効にするかどうか。", + "warning-critical-state-animation": "警告/重大状態アニメーション", + "warning-critical-state-animation-hint": "コンポーネントが警告または重大状態の時に点滅アニメーションを有効にするかどうか。", + "animation": "アニメーション", + "broken": "破損", + "broken-hint": "コンポーネントが破損しているかどうかを示します。", + "on-display-click": "表示クリック時", + "on-display-click-hint": "ユーザーが表示をクリックした時に発動するアクション。", + "pipe": "パイプ", + "default-border-color": "デフォルトの境界線色", + "active-border-color": "アクティブ境界線色", + "warning-border-color": "警告境界線色", + "critical-border-color": "重大境界線色", + "background-color": "背景色", + "rotation-animation-speed": "回転アニメーション速度", + "rotation-animation-speed-hint": "回転アニメーションの速度を示す倍数値。1 - 通常の速度、0 - アニメーションなし、< 1 - より遅いアニメーション、> 1 - より速いアニメーション。", + "on-click": "クリック時", + "on-click-hint": "ユーザーがコンポーネントをクリックした時に発動するアクション。", + "connectors-positions": "コネクタの位置", + "right-connector": "右コネクタ", + "right-top-connector": "右上コネクタ", + "right-bottom-connector": "右下コネクタ", + "left-connector": "左コネクタ", + "left-top-connector": "左上コネクタ", + "left-bottom-connector": "左下コネクタ", + "top-left-connector": "左上コネクタ", + "top-right-connector": "右上コネクタ", + "top-connector": "上コネクタ", + "bottom-connector": "下コネクタ", + "running-color": "実行中の色", + "stopped-color": "停止中の色", + "stopped": "停止中", + "warning-color": "警告色", + "critical-color": "重大色", + "opened": "開放", + "opened-hint": "コンポーネントが開放状態かどうかを示します。", + "open": "開く", + "open-hint": "ユーザーがコンポーネントを開くためにクリックしたときに発動するアクション。", + "close": "閉じる", + "close-hint": "ユーザーがコンポーネントを閉じるためにクリックしたときに発動するアクション。", + "close-state-animation": "閉じた状態のアニメーション", + "close-state-animation-hint": "コンポーネントが閉じた状態の時に点滅アニメーションを有効にするかどうか。", + "opened-color": "開放時の色", + "closed-color": "閉じた時の色", + "opened-rotation-angle": "開放時の回転角度", + "closed-rotation-angle": "閉じた時の回転角度", + "tank-capacity": "タンク容量", + "tank-capacity-hint": "タンクの総容量を示す倍数値。", + "current-volume": "現在の体積", + "current-volume-hint": "現在の占有体積を示す倍数値。", + "tank-color": "タンクの色", + "value-box": "値ボックス", + "value-text": "値テキスト", + "scale": "スケール", + "transparent-mode": "透過モード", + "major-ticks": "主目盛り", + "intervals": "間隔", + "major-ticks-color": "主目盛りの色", + "normal": "通常", + "minor-ticks": "副目盛り", + "minor-ticks-color": "副目盛りの色", + "temperature": "温度", + "temperature-hint": "現在の温度を示す倍数値。", + "update-temperature": "温度を更新", + "update-temperature-hint": "ユーザーが現在の温度を変更するためにクリックしたときに発動するアクション。", + "run": "実行", + "run-hint": "ユーザーがコンポーネントを実行するためにクリックしたときに発動するアクション。", + "stop": "停止", + "stop-hint": "ユーザーがコンポーネントを停止するためにクリックしたときに発動するアクション。", + "temperature-step": "温度ステップ増分", + "heat-pump-color": "ヒートポンプの色", + "power-button-background": "電源ボタンの背景", + "value-box-background": "値ボックスの背景", + "value-units": "値の単位", + "enable-units-scale": "スケールに単位を表示", + "filtration-mode": "濾過モード", + "filtration-mode-hint": "現在の濾過モードを示す整数値。", + "filtration-mode-update": "濾過モード更新状態", + "filtration-mode-update-hint": "ユーザーが現在の濾過モードを変更するためにクリックしたときに発動するアクション。", + "filter-mode": "フィルター", + "waste-mode": "廃棄", + "backwash-mode": "バックウォッシュ", + "recirculate-mode": "再循環", + "rinse-mode": "すすぎ", + "closed-mode": "閉じた状態", + "sand-filter-color": "砂フィルターの色", + "mode-box-background": "モードボックスの背景", + "border-color": "境界線の色", + "label-color": "ラベルの色", + "water-leak-hint": "漏れがあるかどうかを示します。", + "default-color": "デフォルトの色", + "leak-color": "漏れの色", + "full-value": "満水値", + "full-value-hint": "満水値を示す倍数値。", + "label": "ラベル", + "icon": "アイコン", + "button-color": "ボタンの色", + "on-label": "'オン' ラベルテキスト", + "off-label": "'オフ' ラベルテキスト", + "arrow-presence": "矢印の存在", + "arrow-presence-hint": "コネクタに矢印があるかどうかを示します。", + "arrow-present": "矢印あり", + "arrow-direction": "流れの方向", + "arrow-direction-hint": "流れの方向を示します。", + "flow-animation": "流れの存在", + "flow-animation-hint": "コネクタ内で流体が流れているかどうかを示します。", + "flow": "流れ", + "flow-line": "ライン", + "flow-line-style": "ラインスタイル", + "flow-style-hint": "完璧なアニメーション同期を実現するため、ダッシュとギャップの値の合計が100で割り切れるように設定してください。", + "flow-dash-cap": "ダッシュキャップ", + "dash-cap-butt": "バット", + "dash-cap-round": "ラウンド", + "dash-cap-square": "スクエア", + "dash": "ダッシュ", + "gap": "ギャップ", + "main-line": "メインライン", + "line": "ライン", + "line-color": "ラインの色", + "arrow-color": "矢印の色", + "target-value": "ターゲット値", + "target-value-hint": "スケール上のターゲットポイントを示します。", + "min-max-value": "最小値と最大値", + "min-value": "最小", + "max-value": "最大", + "progress-bar": "プログレスバー", + "progress-arrow": "プログレスアロー", + "warning-scale-color": "警告スケールの色", + "critical-scale-color": "重大スケールの色", + "scale-color": "スケールの色", + "target": "ターゲット", + "high-warning-state": "高警告状態", + "show-high-warning-scale": "高警告スケールを表示", + "high-warning-scale": "高警告スケール", + "high-warning-state-hint": "倍数値が高警告範囲を示し、最大または高い重大値までです。", + "low-warning-state": "低警告状態", + "show-low-warning-scale": "低警告スケールを表示", + "low-warning-scale": "低警告スケール", + "low-warning-state-hint": "倍数値が低警告範囲を示し、最小または低い重大値までです。", + "high-critical-state": "高重大状態", + "show-high-critical-scale": "高重大スケールを表示", + "high-critical-scale": "高重大スケール", + "high-critical-state-hint": "倍数値が高重大範囲を示し、最大値スケールまでです。", + "low-critical-state": "低重大状態", + "show-low-critical-scale": "低重大状態のスケールを表示", + "low-critical-scale": "低重大状態", + "low-critical-state-hint": "倍数値が低重大範囲を示し、最小値スケールまでです。", + "filter-color": "フィルターの色", + "colors": "色", + "indicator-colors": "インジケーターの色", + "enabled": "有効", + "disabled": "無効", + "on": "ON", + "off": "OFF", + "on-off-state": "オン/オフ状態", + "on-off-state-hint": "コンポーネントがオンまたはオフの状態かどうかを示します。", + "on-update-state": "オン更新状態", + "on-update-state-hint": "ユーザーがオンに状態を更新するためにクリックしたときに発動するアクション。", + "off-update-state": "オフ更新状態", + "off-update-state-hint": "ユーザーがオフに状態を更新するためにクリックしたときに発動するアクション。", + "voltage": "電圧", + "input-voltage": "入力電圧", + "input-voltage-hint": "入力電圧の値を示す倍数値。", + "output-voltage": "出力電圧", + "output-voltage-hint": "出力電圧の値を示す倍数値。", + "first-phase-voltage": "第1相電圧", + "second-phase-voltage": "第2相電圧", + "third-phase-voltage": "第3相電圧", + "phase-voltage-hint": "現在の相の電圧値を示す倍数値。", + "voltage-hint": "現在の電圧を示す倍数値。", + "current-voltage-color": "現在の電圧の色", + "phase-indicator-color": "相インジケーターの色", + "measured": "測定済み", + "measured-hint": "キロワット時でのエネルギー使用量を示す倍数値。", + "day-rate": "昼間料金", + "night-rate": "夜間料金", + "off-peak-rate": "オフピーク料金", + "peak-rate": "ピーク料金", + "export-rate": "輸出料金", + "operating-mode": "運転モード", + "bypass-mode": "バイパス", + "operating-mode-hint": "現在の運転モードを示す整数値(0 - OFF、1 - ON、2 - BYPASS)。", + "connected": "接続済み", + "connected-hint": "コンポーネントが接続状態かどうかを示します。", + "disconnected": "切断", + "indicator": "インジケーター", + "operation-mode": "運転モード", + "operation-mode-hint": "インバーターが電源モードまたはインバーターモードにあるかどうかを示します。", + "operation-mode-indicators-color": "運転モードインジケーターの色", + "mains-on-mode": "電源オンモード", + "inverter-on-mode": "インバーターオンモード", + "charging-mode": "充電モード", + "charging-mode-hint": "現在の充電モードを示す整数値(1 - バルク、2 - 吸収、3 - フロート)。", + "charging-mode-indicators-color": "充電モードインジケーターの色", + "inverter-faults": "故障", + "inverter-fault-indicators-color": "故障インジケーターの色", + "overload-fault": "過負荷", + "overload-fault-hint": "インバーターが過負荷状態かどうかを示します。", + "low-battery-fault": "低バッテリー", + "low-battery-fault-hint": "バッテリーが過度に放電しているかどうかを示します。", + "temperature-fault": "温度", + "temperature-fault-hint": "インバーター内の高温を示します。", + "triangle": "三角形", + "socket": "ソケット", + "left-button": "左ボタン", + "right-button": "右ボタン", + "alarm-colors": "アラームの色", + "hook-color": "フックの色" + } + }, + "item": { + "selected": "選択済み" + }, + "js-func": { + "no-return-error": "関数は値を返さなければなりません!", + "return-type-mismatch": "関数は'{{type}}'タイプの値を返さなければなりません!", + "tidy": "整理", + "mini": "ミニ", + "modules": "モジュール", + "remove-module": "モジュールを削除", + "no-modules": "モジュールが設定されていません", + "add-module": "モジュールを追加", + "module-alias": "エイリアス", + "invalid-module-alias-name": "無効なエイリアス名", + "module-resource": "JSモジュールリソース", + "not-unique-module-aliases-error": "モジュールのエイリアスは一意でなければなりません!", + "show-module-info": "モジュール情報を表示", + "show-module-source-code": "モジュールのソースコードを表示", + "module-members": "モジュールメンバー", + "module-no-members": "モジュールにはエクスポートされたメンバーがありません", + "module-load-error": "モジュールの読み込みエラー", + "source-code": "ソースコード", + "source-code-load-error": "ソースコード読み込みエラー", + "no-js-module-text": "JSモジュールが見つかりません", + "no-js-module-matching": "'{{module}}'に一致するJSモジュールは見つかりませんでした。" + }, + "key-val": { + "key": "キー", + "value": "値", + "remove-entry": "エントリーを削除", + "add-entry": "エントリーを追加", + "no-data": "エントリーがありません" + }, + "layout": { + "layout": "レイアウト", + "layouts": "レイアウト", + "manage": "レイアウトの管理", + "settings": "レイアウト設定", + "color": "色", + "main": "メイン", + "right": "右", + "left": "左", + "select": "ターゲットレイアウトを選択", + "percentage-width": "パーセンテージ幅 (%)", + "fixed-width": "固定幅 (px)", + "left-width": "左カラム (%)", + "right-width": "右カラム (%)", + "pick-fixed-side": "固定側: ", + "layout-fixed-width": "固定幅 (px)", + "value-min-error": "値は {{min}}{{unit}} より大きくなければなりません", + "value-max-error": "値は {{max}}{{unit}} より小さくなければなりません", + "layout-fixed-width-required": "固定幅は必須です", + "right-width-percentage-required": "右側のパーセンテージは必須です", + "left-width-percentage-required": "左側のパーセンテージは必須です", + "divider": "区切り線", + "right-side": "右側レイアウト", + "left-side": "左側レイアウト", + "add-new-breakpoint": "新しいブレークポイントを追加", + "breakpoint": "ブレークポイント", + "breakpoints": "ブレークポイント", + "copy-from": "コピー元", + "size": "サイズ", + "delete-breakpoint-title": "ブレークポイント '{{name}}' を削除してもよろしいですか?", + "delete-breakpoint-text": "確認後、ブレークポイントは復元できなくなり、設定はデフォルトのブレークポイントに戻りますのでご注意ください。" + }, + "legend": { + "direction": "方向", + "position": "位置", + "show-values": "値を表示", + "min-option": "最小", + "max-option": "最大", + "average-option": "平均", + "total-option": "合計", + "latest-option": "最新", + "sort-legend": "凡例内でデータキーを並べ替え", + "show-max": "最大値を表示", + "show-min": "最小値を表示", + "show-avg": "平均値を表示", + "show-total": "合計値を表示", + "show-latest": "最新値を表示", + "settings": "凡例設定", + "min": "最小", + "max": "最大", + "avg": "平均", + "total": "合計", + "latest": "最新", + "Min": "最小", + "Max": "最大", + "Avg": "平均", + "Total": "合計", + "Latest": "最新", + "comparison-time-ago": { + "previousInterval": "(前のインターバル)", + "customInterval": "(カスタムインターバル)", + "days": "(日前)", + "weeks": "(週前)", + "months": "(月前)", + "years": "(年前)" + }, + "column-title": "列タイトル", + "label": "ラベル", + "value": "値" + }, + "login": { + "login": "ログイン", + "request-password-reset": "パスワードリセットをリクエスト", + "reset-password": "パスワードをリセット", + "create-password": "パスワードを作成", + "two-factor-authentication": "二要素認証", + "passwords-mismatch-error": "入力したパスワードは一致していなければなりません!", + "password-again": "パスワード(再入力)", + "sign-in": "サインインしてください", + "username": "ユーザー名(メールアドレス)", + "remember-me": "次回以降のログインを記憶", + "forgot-password": "パスワードを忘れましたか?", + "password-reset": "パスワードリセット", + "expired-password-reset-message": "認証情報の有効期限が切れています!\n新しいパスワードを作成してください。", + "new-password": "新しいパスワード", + "new-password-again": "新しいパスワードを再入力", + "password-link-sent-message": "リセットリンクが送信されました", + "email": "メールアドレス", + "invalid-email-format": "無効なメールアドレス形式です。", + "sign-in-with": "{{name}} でサインイン", + "sign-in-to-your-account": "アカウントにサインイン", + "or": "または", + "error": "ログインエラー", + "verify-your-identity": "本人確認を行ってください", + "select-way-to-verify": "確認方法を選択", + "resend-code": "コードを再送信", + "resend-code-wait": "{ time, plural, =1 {1秒} other {#秒} } 後に再送信", + "try-another-way": "別の方法を試す", + "totp-auth-description": "認証アプリからセキュリティコードを入力してください。", + "totp-auth-placeholder": "コード", + "sms-auth-description": "セキュリティコードが {{contact}} の電話番号に送信されました。", + "sms-auth-placeholder": "SMSコード", + "email-auth-description": "セキュリティコードが {{contact}} のメールアドレスに送信されました。", + "email-auth-placeholder": "メールコード", + "backup-code-auth-description": "バックアップコードの1つを入力してください。", + "backup-code-auth-placeholder": "バックアップコード", + "activation-link-expired": "アクティベーションリンクの有効期限が切れました", + "activation-link-expired-message": "プロファイルをアクティブにするリンクの有効期限が切れました。新しいメールを受け取るためにログインページに戻ってください。", + "reset-password-link-expired": "パスワードリセットリンクの有効期限が切れました", + "reset-password-link-expired-message": "パスワードをリセットするリンクの有効期限が切れました。新しいメールを受け取るためにログインページに戻ってください。", + "two-fa": "二要素認証", + "two-fa-required": "二要素認証が必要です", + "set-up-verification-method": "続行するには認証方法を設定してください", + "set-up-verification-method-login": "認証方法を設定するか、ログインしてください", + "enable-authenticator-app": "認証アプリを有効化", + "enable-authenticator-app-description": "認証アプリのセキュリティコードを入力してください", + "enable-authenticator-sms": "SMS 認証を有効化", + "enable-authenticator-sms-description": "次に送信した 6 桁のコードを入力してください: ", + "enable-authenticator-email": "email 認証を有効化", + "enable-authenticator-email-description": "セキュリティコードを次のメールアドレスに送信しました: ", + "enter-key-manually": "または、この 32 桁のキーを手動で入力してください:", + "continue": "続行", + "confirm": "確認", + "authenticator-app-success": "認証アプリを有効化しました", + "authenticator-app-success-description": "次回ログイン時は、二要素認証コードの入力が必要です", + "authenticator-sms-success": "SMS 認証を有効化しました", + "authenticator-sms-success-description": "次回ログイン時に、電話番号に送信されるセキュリティコードの入力を求められます", + "authenticator-email-success": "Email 認証を有効化しました", + "authenticator-email-success-description": "次回ログイン時に、メールアドレスに送信されるセキュリティコードの入力を求められます", + "authenticator-backup-code-success": "バックアップコードを有効化しました", + "authenticator-backup-code-success-description": "次回ログイン時に、セキュリティコードの入力、またはバックアップコードのいずれか 1 つの使用を求められます。", + "add-verification-method": "認証方法を追加", + "get-backup-code": "バックアップコードを取得", + "copy-key": "キーをコピー", + "send-code": "コードを送信", + "email-label": "Email", + "email-description": "認証に使用するメールアドレスを入力してください。", + "sms-description": "認証に使用する電話番号を入力してください。", + "backup-code-description": "アカウントにログインする際に使用できるよう、コードを印刷して手元に保管してください。各バックアップコードは 1 回のみ使用できます。", + "backup-code-warn": "このページを離れると、これらのコードは再表示できません。以下のオプションを使用して安全に保管してください。", + "download-txt": "ダウンロード(txt)", + "print": "印刷", + "verification-code": "6 桁のコード", + "verification-code-invalid": "認証コード形式が無効です", + "verification-code-incorrect": "認証コードが正しくありません", + "verification-code-many-request": "認証コード確認のリクエストが多すぎます", + "scan-qr-code": "認証アプリでこの QR コードをスキャンしてください", + "phone-input": { + "phone-input-label": "電話番号", + "phone-input-required": "電話番号は必須です", + "phone-input-validation": "電話番号が無効、または使用できません", + "phone-input-pattern": "無効な電話番号です。E.164 形式である必要があります(例: {{phoneNumber}})", + "phone-input-hint": "E.164 形式の電話番号(例: {{phoneNumber}})" + } + }, + "mobile": { + "add-application": "アプリケーションを追加", + "app-id": "アプリサイト関連ID", + "app-id-required": "アプリサイト関連IDは必須です", + "app-id-pattern": "無効なアプリサイト関連IDの形式", + "app-store-link": "App Storeリンク", + "app-store-link-required": "App Storeリンクは必須です", + "application-details": "アプリケーションの詳細", + "application-package": "アプリケーションパッケージ", + "application-secret": "アプリケーションシークレット", + "application-secret-required": "アプリケーションシークレットは必須です", + "application": "アプリケーション", + "applications": "アプリケーション", + "copy-app-id": "アプリIDをコピー", + "copy-app-store-link": "App Storeリンクをコピー", + "copy-application-package": "アプリケーションパッケージをコピー", + "copy-application-secret": "アプリケーションシークレットをコピー", + "copy-google-play-link": "Google Playリンクをコピー", + "copy-sha256-certificate-fingerprints": "SHA256証明書のフィンガープリントをコピー", + "delete-application": "アプリケーションを削除", + "delete-application-button-text": "結果を理解し、アプリケーションを削除", + "delete-application-text": "この操作は元に戻せません。これによりアプリケーションが完全に削除されます。
永久に削除したくない場合は、アプリケーションを一時停止できます。
削除する場合は、確認のために\"{{phrase}}\"を入力してください。", + "delete-application-title-short": "アプリケーション '{{name}}' を削除してもよろしいですか?", + "delete-application-text-short": "確認後、アプリケーションと関連データは復元できなくなりますのでご注意ください。", + "delete-application-phrase": "アプリケーションを削除", + "delete-applications-bundle-text": "確認後、モバイルバンドルと関連データは復元できなくなりますのでご注意ください。", + "delete-applications-bundle-title": "モバイルバンドル '{{bundleName}}' を削除してもよろしいですか?", + "generate-application-secret": "アプリケーションシークレットを生成", + "google-play-link": "Google Playリンク", + "google-play-link-required": "Google Playリンクは必須です", + "latest-version": "最新バージョン", + "min-version": "最小バージョン", + "invalid-version-pattern": "無効なバージョン形式です。形式は major.minor.patch(例:1.0.0)を使用してください。", + "mobile-center": "モバイルセンター", + "mobile-package": "アプリケーションパッケージ", + "mobile-package-max-length": "アプリケーションパッケージは256文字以内である必要があります", + "mobile-package-required": "アプリケーションパッケージは必須です。", + "mobile-package-pattern": "アプリケーションパッケージの形式が無効です", + "mobile-package-title": "アプリケーションタイトル", + "mobile-package-title-max-length": "アプリケーションタイトルは256文字以内である必要があります", + "no-application": "アプリケーションが見つかりません", + "no-bundles": "バンドルが見つかりません", + "platform-type": "プラットフォームタイプ", + "search-application": "アプリケーションを検索", + "search-bundles": "バンドルを検索", + "set": "設定", + "sha256-certificate-fingerprints": "SHA256証明書フィンガープリント", + "sha256-certificate-fingerprints-required": "SHA256証明書フィンガープリントは必須です", + "sha256-certificate-fingerprints-pattern": "無効なSHA256証明書フィンガープリント形式", + "show-hidden-pages": "隠されたページを表示", + "status": "ステータス", + "status-type": { + "deprecated": "非推奨", + "draft": "下書き", + "published": "公開済み", + "suspended": "一時停止" + }, + "store-information": "ストア情報", + "version-information": "バージョン情報", + "min-version-release-notes": "最小バージョンのリリースノート", + "latest-version-release-notes": "最新バージョンのリリースノート", + "bundle": "バンドル", + "bundles": "バンドル", + "add-bundle": "バンドルを追加", + "title": "タイトル", + "title-required": "タイトルは必須です", + "title-cannot-contain-only-spaces": "タイトルはスペースのみで構成できません", + "title-max-length": "タイトルは256文字以内である必要があります", + "oauth-clients": "OAuth 2.0クライアント", + "android-app": "Androidアプリ", + "android-application": "Androidアプリケーション", + "ios-app": "iOSアプリ", + "ios-application": "iOSアプリケーション", + "invalid-store-link": "無効なストアリンク", + "enable-oauth": "OAuth 2.0を有効化", + "enable-self-registration": "セルフ登録を有効化", + "edit-bundle": "バンドルを編集", + "description": "説明", + "basic-settings": "基本設定", + "no-application-matching": "'{{entity}}' に一致するアプリケーションは見つかりませんでした。", + "no-bundle-matching": "'{{entity}}' に一致するバンドルは見つかりませんでした。", + "application-required": "アプリケーションは必須です。", + "bundle-required": "バンドルは必須です。", + "no-application-text": "アプリケーションが見つかりません", + "no-bundle-text": "バンドルが見つかりません", + "layout": "レイアウト", + "pages": "ページ", + "hide-all-pages": "すべてのページを非表示", + "reset-to-default-pages": "デフォルトのページにリセット", + "add-specific-page": "特定のページを追加", + "visible": "表示", + "hidden": "非表示", + "reset-to-page-default": "ページをデフォルトにリセット", + "mobile-599": "モバイル(最大599px)", + "tablet-959": "タブレット(最大959px)", + "max-element-number": "最大要素数", + "page-name": "ページ名", + "page-name-required": "ページ名は必須です。", + "page-name-cannot-contain-only-spaces": "ページ名はスペースのみで構成できません。", + "page-name-max-length": "ページ名は256文字以内である必要があります", + "page-type": "ページタイプ", + "pages-types": { + "dashboard": "ダッシュボード", + "web-view": "ウェブビュー", + "custom": "カスタム" + }, + "url": "URL", + "invalid-url-format": "無効なURL形式", + "path": "パス", + "invalid-path-format": "無効なパス形式", + "custom-page": "カスタムページ", + "edit-page": "ページを編集", + "edit-custom-page": "カスタムページを編集", + "delete-page": "ページを削除", + "qr-code-widget": "QRコードウィジェット", + "type-here": "ここに入力", + "configuration-dialog": "設定ダイアログ", + "configuration-app": "設定アプリ", + "configuration-step": { + "prepare-environment-title": "開発環境の準備", + "prepare-environment-text": "Flutter ThingsBoardモバイルアプリケーションにはFlutter SDKが必要です。Flutter SDKのセットアップ手順に従ってください。", + "get-source-code-title": "アプリソースコードの取得", + "get-source-code-text": "Flutter ThingsBoardモバイルアプリケーションのソースコードは、GitHubリポジトリからクローンして取得できます:", + "configure-app-settings-title": "アプリ設定の構成", + "configure-app-settings-text": "設定ファイルをダウンロードし、前の手順でクローンしたプロジェクトのルートディレクトリに配置してください。", + "download-file": "ファイルをダウンロード", + "run-app-title": "アプリを実行", + "run-app-text": "IDEに記載された方法でアプリを実行してください。\nターミナルを使用する場合、次のコマンドでアプリを実行します:", + "more-information": "詳細情報は、はじめにのドキュメントに記載されています。", + "getting-started": "はじめにガイド" + } + }, + "notification": { + "action-button": "アクションボタン", + "action-type": "アクションタイプ", + "active": "アクティブ", + "add-notification-recipients-group": "通知受信者グループを追加", + "add-notification-template": "通知テンプレートを追加", + "add-recipient": "受信者を追加", + "add-recipients": "受信者を追加", + "add-rule": "ルールを追加", + "add-stage": "ステージを追加", + "add-template": "テンプレートを追加", + "after": "後", + "alarm-assignment-trigger-settings": "アラーム割り当てトリガー設定", + "alarm-comment-trigger-settings": "アラームコメントトリガー設定", + "alarm-trigger-settings": "アラームトリガー設定", + "all": "すべて", + "api-feature-hint": "フィールドが空の場合、トリガーはすべてのAPI機能に適用されます", + "api-usage-trigger-settings": "API使用トリガー設定", + "new-platform-version-trigger-settings": "新しいプラットフォームバージョントリガー設定", + "rate-limits-trigger-settings": "制限超過トリガー設定", + "task-processing-failure-trigger-settings": "タスク処理失敗トリガー設定", + "resources-shortage-trigger-settings": "リソース不足トリガー設定", + "at-least-one-should-be-selected": "少なくとも1つは選択する必要があります", + "basic-settings": "基本設定", + "button-text": "ボタンテキスト", + "button-text-required": "ボタンテキストは必須です", + "button-text-max-length": "ボタンテキストは{{length}}文字以下である必要があります", + "compose": "作成", + "conversation": "会話", + "conversation-required": "会話は必須です", + "copy-notification-template": "通知テンプレートをコピー", + "copy-rule": "ルールをコピー", + "copy-template": "テンプレートをコピー", + "create-new": "新規作成", + "created": "作成済み", + "customize-messages": "メッセージをカスタマイズ", + "cpu-threshold": "CPUの閾値", + "delete-notification-text": "確認後、通知は復元できなくなりますのでご注意ください。", + "delete-notification-title": "通知を削除してもよろしいですか?", + "delete-notifications-text": "確認後、通知は復元できなくなりますのでご注意ください。", + "delete-notifications-title": "{ count, plural, =1 {1 通知} other {# 通知} } を削除してもよろしいですか?", + "delete-recipient-text": "確認後、受信者は復元できなくなりますのでご注意ください。", + "delete-recipient-title": "受信者 '{{recipientName}}' を削除してもよろしいですか?", + "delete-recipients-text": "確認後、受信者は復元できなくなりますのでご注意ください。", + "delete-recipients-title": "{ count, plural, =1 {1 受信者} other {# 受信者} } を削除してもよろしいですか?", + "delete-request-text": "確認後、リクエストは復元できなくなりますのでご注意ください。", + "delete-request-title": "リクエストを削除してもよろしいですか?", + "delete-requests-text": "確認後、リクエストは復元できなくなりますのでご注意ください。", + "delete-requests-title": "{ count, plural, =1 {1 リクエスト} other {# リクエスト} } を削除してもよろしいですか?", + "delete-rule-text": "確認後、ルールは復元できなくなりますのでご注意ください。", + "delete-rule-title": "ルール '{{ruleName}}' を削除してもよろしいですか?", + "delete-rules-text": "確認後、ルールは復元できなくなりますのでご注意ください。", + "delete-rules-title": "{ count, plural, =1 {1 ルール} other {# ルール} } を削除してもよろしいですか?", + "delete-template-text": "確認後、テンプレートは復元できなくなりますのでご注意ください。", + "delete-template-title": "テンプレート '{{templateName}}' を削除してもよろしいですか?", + "delete-templates-text": "確認後、テンプレートは復元できなくなりますのでご注意ください。", + "delete-templates-title": "{ count, plural, =1 {1 テンプレート} other {# テンプレート} } を削除してもよろしいですか?", + "deleted": "削除済み", + "delivery-method": { + "delivery-method": "配信方法", + "email": "メール", + "email-preview": "メール通知プレビュー", + "slack": "Slack", + "slack-preview": "Slack通知プレビュー", + "microsoft-teams": "Microsoft Teams", + "microsoft-teams-preview": "Microsoft Teams通知プレビュー", + "sms": "SMS", + "sms-preview": "SMS通知プレビュー", + "web": "Web", + "web-preview": "Web通知プレビュー", + "mobile-app": "モバイルアプリ", + "mobile-app-preview": "モバイルアプリ通知プレビュー" + }, + "delivery-method-not-configure-click": "配信方法が設定されていません。クリックして設定してください。", + "delivery-method-not-configure-contact": "配信方法が設定されていません。システム管理者に連絡してください。", + "delivery-methods": "配信方法", + "description": "説明", + "device-activity-trigger-settings": "デバイスアクティブトリガー設定", + "device-list-rule-hint": "フィールドが空の場合、トリガーはすべてのデバイスに適用されます。", + "device-profiles-list-rule-hint": "フィールドが空の場合、トリガーはすべてのデバイスプロファイルに適用されます。", + "disabled": "無効", + "edge-trigger-settings": "Edgeトリガー設定", + "edge-list-rule-hint": "フィールドが空の場合、トリガーはすべてのEdgeインスタンスに適用されます。", + "edit-notification-recipients-group": "通知受信者グループを編集", + "edit-notification-template": "通知テンプレートを編集", + "edit-rule": "ルールを編集", + "edit-template": "テンプレートを編集", + "enabled": "有効", + "entities-limit-trigger-settings": "エンティティ制限トリガー設定", + "entity-action-trigger-settings": "エンティティアクショントリガー設定", + "entity-type": "エンティティタイプ", + "escalation-chain": "エスカレーションチェーン", + "failed-send": "送信失敗", + "fails": "{ count, plural, =1 {1 回の失敗} other {# 回の失敗} }", + "filter": "フィルター", + "first-recipient": "最初の受信者", + "inactive": "非アクティブ", + "inbox": "受信トレイ", + "notification-inbox": "通知 / 受信トレイ", + "input-field-support-templatization": "入力フィールドはテンプレート化をサポートします。", + "input-fields-support-templatization": "入力フィールドはテンプレート化をサポートします。", + "link": "リンク", + "link-required": "リンクは必須です", + "link-max-length": "リンクは{{ length }}文字以内である必要があります", + "link-type": { + "dashboard": "ダッシュボードを開く", + "link": "URLリンクを開く" + }, + "loading-notifications": "通知を読み込んでいます...", + "management": "通知管理", + "mark-all-as-read": "すべてを既読にする", + "mark-as-read": "既読にする", + "message": "メッセージ", + "message-required": "メッセージは必須です", + "message-max-length": "メッセージは{{ length }}文字以内である必要があります", + "name": "名前", + "name-required": "名前は必須です", + "new-notification": "新しい通知", + "no-inbox-notification": "通知が見つかりません", + "no-notification-request": "通知リクエストがありません", + "no-notification-templates": "通知テンプレートが見つかりません", + "no-notifications-yet": "まだ通知はありません", + "no-recipients-notification": "受信者の通知がありません", + "no-recipients-matching": "'{{entity}}' に一致する受信者は見つかりませんでした。", + "no-recipients-text": "受信者が見つかりません", + "no-rule": "設定されたルールがありません", + "no-rules-notification": "ルールの通知がありません", + "no-severity-found": "重大度が見つかりません", + "no-severity-matching": "'{{severity}}' が見つかりません。", + "no-template-matching": "'{{template}}' に一致するリソースが見つかりませんでした。", + "create-new-template": "新しいテンプレートを作成!", + "not-found-slack-recipient": "Slackの受信者が見つかりません", + "notification": "通知", + "notification-center": "通知センター", + "notification-tap-action": "通知タップアクション", + "notification-tap-action-hint": "無効の場合、デフォルトのアラームダッシュボードが使用されます", + "notify": "通知", + "notify-again": "再度通知", + "notify-alarm-action": { + "acknowledged": "アラームが承認されました", + "assigned": "アラームが割り当てられました", + "cleared": "アラームが解除されました", + "created": "アラームが作成されました", + "severity-changed": "アラームの重大度が変更されました", + "unassigned": "アラームの割り当てが解除されました" + }, + "notify-on": "通知を送信する", + "notify-on-comment-update": "コメントの更新時に通知", + "notify-on-required": "通知先は必須です", + "notify-on-unassign": "割り当て解除時に通知", + "notify-only-user-comments": "ユーザーコメントのみ通知", + "only-rule-chain-lifecycle-failures": "ルールチェーンのライフサイクル失敗のみ", + "only-rule-node-lifecycle-failures": "ルールノードのライフサイクル失敗のみ", + "platform-users": "プラットフォームユーザー", + "ram-threshold": "RAM閾値", + "rate-limits": "レート制限", + "rate-limits-hint": "フィールドが空の場合、トリガーはすべてのレート制限に適用されます", + "recipient": "受信者", + "recipient-group": "受信者グループ", + "recipient-type": { + "affected-tenant-administrators": "影響を受けたテナント管理者", + "affected-user": "影響を受けたユーザー", + "all-users": "すべてのユーザー", + "customer-users": "顧客ユーザー", + "system-administrators": "システム管理者", + "tenant-administrators": "テナント管理者", + "user-filters": "ユーザーフィルター", + "user-list": "ユーザーリスト", + "users-entity-owner": "エンティティオーナーのユーザー" + }, + "recipients": "受信者", + "notification-recipient": "通知受信者", + "notification-recipient-required": "通知受信者は必須です。", + "notification-recipients": "通知 / 受信者", + "recipients-count": "{ count, plural, =1 {1 受信者} other {# 受信者} }", + "recipients-required": "受信者は必須です", + "refresh-allow-delivery-method": "配信方法の許可をリフレッシュ", + "request-search": "リクエスト検索", + "request-status": { + "processing": "処理中", + "scheduled": "スケジュール済み", + "sent": "送信済み" + }, + "review": "レビュー", + "rule": "ルール", + "rule-chain-list-rule-hint": "フィールドが空の場合、トリガーはすべてのルールチェーンに適用されます。", + "rule-engine-events-trigger-settings": "ルールエンジンイベントトリガー設定", + "rule-engine-filter": "ルールエンジンフィルター", + "rule-name": "ルール名", + "rule-name-required": "名前は必須です", + "rule-disable": "通知ルールを無効にする", + "rule-enable": "通知ルールを有効にする", + "rule-node-filter": "ルールノードフィルター", + "rules": "ルール", + "notification-rules": "通知 / ルール", + "scheduler-later": "後でスケジュール", + "search-notification": "通知を検索", + "search-recipients": "受信者を検索", + "search-rules": "ルールを検索", + "search-templates": "テンプレートを検索", + "see-documentation": "ドキュメントを見る", + "selected-notifications": "{ count, plural, =1 {1 通知} other {# 通知} } 選択済み", + "selected-recipients": "{ count, plural, =1 {1 受信者} other {# 受信者} } 選択済み", + "selected-requests": "{ count, plural, =1 {1 リクエスト} other {# リクエスト} } 選択済み", + "selected-rules": "{ count, plural, =1 {1 ルール} other {# ルール} } 選択済み", + "selected-template": "{ count, plural, =1 {1 テンプレート} other {# テンプレート} } 選択済み", + "send-notification": "通知を送信", + "sent": "送信済み", + "setup": "設定", + "notification-sent": "通知 / 送信済み", + "set-entity-from-notification": "通知からエンティティをダッシュボード状態に設定", + "slack-chanel-type": "Slackチャンネルタイプ", + "slack-chanel-types": { + "direct": "ダイレクトメッセージ", + "private-channel": "プライベートチャンネル", + "public-channel": "パブリックチャンネル" + }, + "start-from-scratch": "最初から始める", + "status": "ステータス", + "stop-escalation-alarm-status-become": "アラームステータスが次に変更された場合、エスカレーションを停止:", + "storage-threshold": "ストレージ閾値", + "subject": "件名", + "subject-required": "件名は必須です", + "subject-max-length": "件名は{{ length }}文字以内である必要があります", + "template": "テンプレート", + "template-name": "テンプレート名", + "template-required": "テンプレートは必須です", + "template-type": { + "alarm": "アラーム", + "alarm-assignment": "アラーム割り当て", + "alarm-comment": "アラームコメント", + "api-usage-limit": "API 使用量上限", + "device-activity": "デバイスアクティビティ", + "entities-limit": "エンティティ上限", + "entities-limit-increase-request": "エンティティ上限引き上げリクエスト", + "entity-action": "エンティティアクション", + "general": "一般", + "rule-engine-lifecycle-event": "ルールエンジンライフサイクルイベント", + "rule-node": "ルールノード", + "new-platform-version": "プラットフォームの新バージョン", + "rate-limits": "レート制限超過", + "edge-communication-failure": "Edge 通信障害", + "edge-connection": "Edge 接続", + "task-processing-failure": "タスク処理失敗", + "resources-shortage": "リソース不足" + }, + "templates": "テンプレート", + "notification-templates": "通知 / テンプレート", + "tenant-profiles-list-rule-hint": "フィールドが空の場合、トリガーはすべてのテナントプロファイルに適用されます", + "tenants-list-rule-hint": "フィールドが空の場合、トリガーはすべてのテナントに適用されます", + "threshold": "閾値", + "theme-color": "テーマカラー", + "time": "時間", + "track-rule-node-events": "ルールノードイベントを追跡", + "trigger": { + "alarm": "アラーム", + "alarm-assignment": "アラーム割り当て", + "alarm-comment": "アラームコメント", + "api-usage-limit": "API使用制限", + "device-activity": "デバイスアクティビティ", + "entities-limit": "エンティティ制限", + "entity-action": "エンティティアクション", + "rule-engine-lifecycle-event": "ルールエンジンライフサイクルイベント", + "new-platform-version": "新しいプラットフォームバージョン", + "rate-limits": "レート制限超過", + "edge-connection": "Edge接続", + "edge-communication-failure": "Edge通信障害", + "task-processing-failure": "タスク処理失敗", + "resources-shortage": "リソース不足", + "trigger": "トリガー", + "trigger-required": "トリガーは必須です" + }, + "type": "タイプ", + "unread": "未読", + "updated": "更新済み", + "use-deprecated-webhook-connectors": "廃止予定のWebhookコネクタを使用", + "use-old-api": "古いAPIを使用", + "use-template": "テンプレートを使用", + "view-all": "すべて表示", + "warning": "警告", + "webhook-url": "Webhook URL", + "webhook-url-required": "Webhook URLは必須です", + "workflow-url": "ワークフローURL", + "workflow-url-required": "ワークフローURLは必須です", + "channel-name": "チャンネル名", + "channel-name-required": "チャンネル名は必須です", + "settings": { + "notification-settings": "通知設定", + "reset-all": "すべての設定をリセット", + "reset-all-title": "フォームをリセットしてもよろしいですか?", + "reset-all-text": "確認後、設定フォームはデフォルト値にリセットされ、保存されます。", + "type": "タイプ", + "enable-all": "すべてを有効にする", + "disable-all": "すべてを無効にする", + "delivery-not-configured": "配信方法が設定されていません" + } + }, + "ota-update": { + "add": "パッケージを追加", + "assign-firmware": "割り当てられたファームウェア", + "assign-firmware-required": "割り当てられたファームウェアは必須です", + "assign-software": "割り当てられたソフトウェア", + "assign-software-required": "割り当てられたソフトウェアは必須です", + "auto-generate-checksum": "チェックサムを自動生成", + "checksum": "チェックサム", + "checksum-hint": "チェックサムが空の場合、自動的に生成されます", + "checksum-algorithm": "チェックサムアルゴリズム", + "checksum-copied-message": "パッケージのチェックサムがクリップボードにコピーされました", + "change-firmware": "ファームウェアの変更により、{ count, plural, =1 {1 デバイス} other {# デバイス} } の更新が行われる可能性があります。", + "change-software": "ソフトウェアの変更により、{ count, plural, =1 {1 デバイス} other {# デバイス} } の更新が行われる可能性があります。", + "change-ota-setting-title": "OTA設定を変更してもよろしいですか?", + "chose-compatible-device-profile": "アップロードされたパッケージは、選択されたプロファイルを持つデバイスでのみ使用可能です。", + "chose-firmware-distributed-device": "デバイスに配布されるファームウェアを選択", + "chose-software-distributed-device": "デバイスに配布されるソフトウェアを選択", + "content-type": "コンテンツタイプ", + "copy-checksum": "チェックサムをコピー", + "copy-direct-url": "直接URLをコピー", + "copyId": "パッケージIDをコピー", + "copied": "コピー完了!", + "delete": "パッケージを削除", + "delete-ota-update-text": "確認後、OTAアップデートは復元できなくなりますのでご注意ください。", + "delete-ota-update-title": "OTAアップデート '{{title}}' を削除してもよろしいですか?", + "delete-ota-updates-text": "確認後、すべての選択されたOTAアップデートは削除されます。", + "delete-ota-updates-title": "{ count, plural, =1 {1 OTAアップデート} other {# OTAアップデート} } を削除してもよろしいですか?", + "description": "説明", + "direct-url": "直接URL", + "direct-url-copied-message": "パッケージの直接URLがクリップボードにコピーされました", + "direct-url-required": "直接URLは必須です", + "download": "パッケージをダウンロード", + "drop-file": "パッケージファイルをドラッグ&ドロップするか、クリックして選択してください。", + "drop-package-file-or": "パッケージファイルをドラッグ&ドロップするか", + "file-name": "ファイル名", + "file-size": "ファイルサイズ", + "file-size-bytes": "ファイルサイズ(バイト)", + "idCopiedMessage": "パッケージIDがクリップボードにコピーされました", + "no-firmware-matching": "'{{entity}}' に一致する互換性のあるファームウェアOTAアップデートパッケージは見つかりませんでした。", + "no-firmware-text": "互換性のあるファームウェアOTAアップデートパッケージはプロビジョニングされていません。", + "no-packages-text": "パッケージが見つかりません", + "no-software-matching": "'{{entity}}' に一致する互換性のあるソフトウェアOTAアップデートパッケージは見つかりませんでした。", + "no-software-text": "互換性のあるソフトウェアOTAアップデートパッケージはプロビジョニングされていません。", + "ota-update": "OTAアップデート", + "ota-update-details": "OTAアップデートの詳細", + "ota-updates": "OTAアップデート", + "package-file": "パッケージファイル", + "package-type": "パッケージタイプ", + "packages-repository": "パッケージリポジトリ", + "search": "パッケージを検索", + "selected-package": "{ count, plural, =1 {1 パッケージ} other {# パッケージ} } 選択済み", + "title": "タイトル", + "title-required": "タイトルは必須です。", + "title-max-length": "タイトルは256文字以内である必要があります", + "types": { + "firmware": "ファームウェア", + "software": "ソフトウェア" + }, + "upload-binary-file": "バイナリファイルをアップロード", + "use-external-url": "外部URLを使用", + "version": "バージョン", + "version-required": "バージョンは必須です。", + "version-tag": "バージョンタグ", + "version-tag-hint": "カスタムタグは、デバイスから報告されるパッケージバージョンと一致する必要があります。", + "version-max-length": "バージョンは256文字以内である必要があります", + "warning-after-save-no-edit": "パッケージがアップロードされると、タイトル、バージョン、デバイスプロファイル、およびパッケージタイプを変更できなくなります。" + }, + "position": { + "top": "上", + "bottom": "下", + "left": "左", + "right": "右" + }, + "profile": { + "profile": "プロフィール", + "last-login-time": "最終ログイン", + "change-password": "パスワードを変更", + "current-password": "現在のパスワード", + "copy-jwt-token": "JWTトークンをコピー", + "jwt-token": "JWTトークン", + "token-valid-till": "トークンの有効期限", + "tokenCopiedSuccessMessage": "JWTトークンがクリップボードにコピーされました", + "tokenCopiedWarnMessage": "JWTトークンは期限切れです!ページを更新してください。" + }, + "profiles": { + "profiles": "プロフィール" + }, + "security": { + "security": "セキュリティ", + "general-settings": "一般的なセキュリティ設定", + "access-token": "アクセストークン", + "access-token-required": "アクセストークンは必須です", + "clientId": "クライアントID", + "clientId-required": "クライアントIDは必須です", + "username": "ユーザー名", + "username-required": "ユーザー名は必須です", + "ca-cert": "CA証明書", + "2fa": { + "2fa": "二段階認証", + "2fa-description": "二段階認証は、アカウントへの不正アクセスから保護します。ログイン時にセキュリティコードを入力するだけです。", + "authenticate-with": "以下の方法で認証できます:", + "disable-2fa-provider-text": "{{name}}を無効にすると、アカウントのセキュリティが低下します", + "disable-2fa-provider-title": "{{name}}を無効にしてもよろしいですか?", + "get-new-code": "新しいコードを取得", + "main-2fa-method": "主要な二段階認証方法として使用", + "dialog": { + "activation-step-description-email": "次回ログイン時に、あなたのメールアドレスに送信されたセキュリティコードを入力するよう求められます。", + "activation-step-description-sms": "次回ログイン時に、あなたの電話番号に送信されたセキュリティコードを入力するよう求められます。", + "activation-step-description-totp": "次回ログイン時に、二段階認証コードを入力する必要があります。", + "activation-step-label": "アクティベーション", + "backup-code-description": "コードを印刷しておくと、アカウントにログインする際に便利です。各バックアップコードは1回のみ使用できます。", + "backup-code-warn": "このページを離れると、これらのコードは再度表示できなくなります。以下のオプションで安全に保存してください。", + "download-txt": "ダウンロード (txt)", + "email-step-description": "認証に使用するメールアドレスを入力してください。", + "email-step-label": "メールアドレス", + "enable-email-title": "メール認証を有効にする", + "enable-sms-title": "SMS認証を有効にする", + "enable-totp-title": "認証アプリを有効にする", + "enter-verification-code": "ここに6桁のコードを入力", + "get-backup-code-title": "バックアップコードを取得", + "next": "次へ", + "scan-qr-code": "このQRコードを認証アプリでスキャン", + "send-code": "コードを送信", + "sms-step-description": "認証に使用する電話番号を入力してください。", + "sms-step-label": "電話番号", + "success": "成功!", + "totp-step-description-install": "Google Authenticator、Authy、またはDuoなどのアプリをインストールできます。", + "totp-step-description-open": "携帯電話の認証アプリを開いてください。", + "totp-step-label": "アプリを取得", + "verification-code": "6桁のコード", + "verification-code-invalid": "無効な認証コード形式", + "verification-code-incorrect": "認証コードが正しくありません", + "verification-code-many-request": "認証コードのリクエストが多すぎます", + "verification-step-description": "{{address}}に送信された6桁のコードを入力してください", + "verification-step-label": "認証" + }, + "provider": { + "email": "メール", + "email-description": "セキュリティコードをメールアドレスに送信して認証します。", + "email-hint": "認証コードは{{ info }}に送信されます。", + "sms": "SMS", + "sms-description": "電話を使用して認証します。ログイン時にSMSメッセージでセキュリティコードを送信します。", + "sms-hint": "認証コードは{{ info }}にテキストメッセージで送信されます。", + "totp": "認証アプリ", + "totp-description": "Google Authenticator、Authy、またはDuoなどのアプリを使用して認証します。ログイン用のセキュリティコードを生成します。", + "totp-hint": "認証アプリがアカウントに設定されています。", + "backup_code": "バックアップコード", + "backup-code-description": "これらの印刷可能な一回限りのパスコードを使用すると、旅行中などに電話が使えないときにサインインできます。", + "backup-code-hint": "{{ info }} の単一使用コードが現在有効です" + } + }, + "password-requirement": { + "at-least": "少なくとも:", + "character": "{ count, plural, =1 {1 文字} other {# 文字} }", + "digit": "{ count, plural, =1 {1 桁} other {# 桁} }", + "password-tooltip-min-length": "長さは少なくとも {{minimumLength}} 文字", + "password-tooltip-max-length": "長さは最大 {{maximumLength}} 文字", + "password-tooltip-uppercase": "大文字 {{minimumUppercaseLetters}} 文字", + "password-tooltip-lowercase": "小文字 {{minimumLowercaseLetters}} 文字", + "password-tooltip-digit": "数字 {{minimumDigits}} 個", + "password-tooltip-special-characters": "特殊文字 {{minimumSpecialCharacters}} 文字", + "incorrect-password-try-again": "パスワードが正しくありません。もう一度お試しください", + "lowercase-letter": "{ count, plural, =1 {小文字 1 文字} other {小文字 # 文字} }", + "new-passwords-not-match": "新しいパスワードが一致しません", + "password-should-not-contain-spaces": "パスワードにスペースを含めないでください", + "password-not-meet-requirements": "パスワードが要件を満たしていません", + "password-requirements": "パスワード要件", + "password-should-difference": "新しいパスワードは現在のパスワードと異なる必要があります", + "special-character": "{ count, plural, =1 {特殊文字 1 文字} other {特殊文字 # 文字} }", + "uppercase-letter": "{ count, plural, =1 {大文字 1 文字} other {大文字 # 文字} }", + "at-most": "最大:" + } + }, + "relation": { + "relations": "リレーション", + "direction": "方向", + "clear-relation-type": "リレーションタイプをクリア", + "search-direction": { + "FROM": "送信元", + "TO": "宛先" + }, + "direction-type": { + "FROM": "送信元", + "TO": "宛先" + }, + "from-relations": "アウトバウンドリレーション", + "to-relations": "インバウンドリレーション", + "selected-relations": "{ count, plural, =1 {1 リレーション} other {# リレーション} } 選択済み", + "type": "タイプ", + "to-entity-type": "宛先エンティティタイプ", + "to-entity-name": "宛先エンティティ名", + "from-entity-type": "送信元エンティティタイプ", + "from-entity-name": "送信元エンティティ名", + "to-entity": "宛先エンティティ", + "from-entity": "送信元エンティティ", + "delete": "リレーションを削除", + "relation-type": "リレーションタイプ", + "relation-type-required": "リレーションタイプは必須です。", + "relation-type-max-length": "リレーションタイプは256文字以内である必要があります", + "any-relation-type": "任意のタイプ", + "add": "リレーションを追加", + "edit": "リレーションを編集", + "delete-to-relation-title": "エンティティ '{{entityName}}' へのリレーションを削除してもよろしいですか?", + "delete-to-relation-text": "確認後、エンティティ '{{entityName}}' は現在のエンティティから関連付けが解除されます。", + "delete-to-relations-title": "{ count, plural, =1 {1 リレーション} other {# リレーション} } を削除してもよろしいですか?", + "delete-to-relations-text": "確認後、すべての選択されたリレーションが削除され、対応するエンティティは現在のエンティティから関連付けが解除されます。", + "delete-from-relation-title": "エンティティ '{{entityName}}' からのリレーションを削除してもよろしいですか?", + "delete-from-relation-text": "確認後、現在のエンティティはエンティティ '{{entityName}}' から関連付けが解除されます。", + "delete-from-relations-title": "{ count, plural, =1 {1 リレーション} other {# リレーション} } を削除してもよろしいですか?", + "delete-from-relations-text": "確認後、すべての選択されたリレーションが削除され、現在のエンティティは対応するエンティティから関連付けが解除されます。", + "remove-relation-filter": "リレーションフィルターを削除", + "remove-filter": "フィルターを削除", + "add-relation-filter": "リレーションフィルターを追加", + "any-relation": "任意のリレーション", + "relation-filters": "リレーションフィルター", + "relation-filter": "リレーションフィルター", + "additional-info": "追加情報(JSON)", + "invalid-additional-info": "追加情報のJSONの解析に失敗しました。", + "no-relations-text": "リレーションが見つかりません", + "not": "ない", + "copy-type": "タイプをコピー" + }, + "resource": { + "add": "リソースを追加", + "all-types": "すべて", + "copyId": "リソースIDをコピー", + "delete": "リソースを削除", + "delete-resource-text": "確認後、リソースは復元できなくなりますのでご注意ください。", + "delete-resource-title": "リソース '{{resourceTitle}}' を削除してもよろしいですか?", + "delete-resources-action-title": "{ count, plural, =1 {1 リソース} other {# リソース} } を削除", + "delete-resources-text": "選択されたリソースは、デバイスプロファイルで使用されている場合でも削除されることに注意してください。", + "delete-resources-title": "{ count, plural, =1 {1 リソース} other {# リソース} } を削除してもよろしいですか?", + "download": "リソースをダウンロード", + "drop-file": "リソースファイルをドラッグ&ドロップするか、クリックして選択してください。", + "drop-resource-file-or": "リソースファイルをドラッグ&ドロップするか", + "empty": "リソースは空です", + "file-name": "ファイル名", + "idCopiedMessage": "リソースIDがクリップボードにコピーされました", + "no-resource-matching": "'{{widgetsBundle}}' に一致するリソースは見つかりませんでした。", + "no-resource-text": "リソースが見つかりません", + "open-widgets-bundle": "ウィジェットバンドルを開く", + "resource": "リソース", + "resource-file": "リソースファイル", + "resource-files": "リソースファイル", + "resource-library-details": "リソースの詳細", + "resource-type": "リソースタイプ", + "resources-library": "リソースライブラリ", + "search": "リソースを検索", + "selected-resources": "{ count, plural, =1 {1 リソース} other {# リソース} } 選択済み", + "system": "システム", + "title": "タイトル", + "title-required": "タイトルは必須です。", + "title-max-length": "タイトルは256文字以内である必要があります", + "type": { + "jks": "JKS", + "js-module": "JSモジュール", + "lwm2m-model": "LWM2Mモデル", + "pkcs-12": "PKCS #12", + "general": "一般" + }, + "resource-sub-type": "サブタイプ", + "sub-type": { + "image": "画像", + "scada-symbol": "SCADAシンボル", + "extension": "拡張機能", + "module": "モジュール" + }, + "resource-is-in-use": "リソースは他のエンティティによって使用されています", + "resources-are-in-use": "リソースは他のエンティティによって使用されています", + "resource-is-in-use-text": "リソース '{{title}}' は以下のエンティティによって使用されているため、削除されませんでした。", + "resources-are-in-use-text": "すべてのリソースが削除されなかったのは、他のエンティティによって使用されているためです。
参照されているエンティティは、対応するリソース行の 参照 ボタンをクリックすることで確認できます。
それでもこれらのリソースを削除したい場合は、テーブルから選択し、選択したリソースを削除 ボタンをクリックしてください。", + "delete-resource-in-use-text": "それでもリソースを削除したい場合は、削除してもよい ボタンをクリックしてください。" + }, + "javascript": { + "add": "JavaScriptリソースを追加", + "delete": "JavaScriptリソースを削除", + "delete-javascript-resource-text": "確認後、JavaScriptリソースは復元できなくなりますのでご注意ください。", + "delete-javascript-resource-title": "JavaScriptリソース '{{resourceTitle}}' を削除してもよろしいですか?", + "delete-javascript-resources-action-title": "JavaScript { count, plural, =1 {1 リソース} other {# リソース} } を削除", + "delete-javascript-resources-text": "選択されたJavaScriptリソースは、JavaScript関数で使用されている場合でも削除されることに注意してください。", + "delete-javascript-resources-title": "JavaScript { count, plural, =1 {1 リソース} other {# リソース} } を削除してもよろしいですか?", + "delete-javascript-resource-in-use-text": "それでもJavaScriptリソースを削除したい場合は、削除してもよい ボタンをクリックしてください。", + "download": "JavaScriptリソースをダウンロード", + "upload-from-file": "ファイルからJavaScriptをアップロード", + "resource-file": "JavaScriptリソースファイル", + "drop-file": "JavaScriptファイルをドラッグ&ドロップするか、クリックして選択してください。", + "drop-resource-file-or": "JavaScriptファイルをドラッグ&ドロップするか", + "javascript-library": "JavaScriptライブラリ", + "javascript-type": "JavaScriptタイプ", + "javascript-resource-details": "JavaScriptリソースの詳細", + "javascript-resource-is-in-use": "JavaScriptリソースは他のエンティティによって使用されています", + "javascript-resources-are-in-use": "JavaScriptリソースは他のエンティティによって使用されています", + "javascript-resource-is-in-use-text": "JavaScriptリソース '{{title}}' は以下のエンティティによって使用されているため、削除されませんでした。", + "javascript-resources-are-in-use-text": "すべてのJavaScriptリソースが削除されなかったのは、他のエンティティによって使用されているためです。
参照されているエンティティは、対応するリソース行の 参照 ボタンをクリックすることで確認できます。
それでもこれらのJavaScriptリソースを削除したい場合は、テーブルから選択し、選択したJavaScriptリソースを削除 ボタンをクリックしてください。", + "search": "JavaScriptリソースを検索", + "selected-javascript-resources": "{ count, plural, =1 {1 JavaScriptリソース} other {# JavaScriptリソース} } 選択済み", + "no-javascript-resource-text": "JavaScriptリソースが見つかりません", + "all-types": "すべて", + "module-script": "モジュールスクリプト" + }, + "rpc": { + "error": { + "target-device-is-not-set": "ターゲットデバイスが設定されていません!", + "invalid-target-entity": "RPCコマンドは{{entityType}}エンティティではサポートされていません。", + "failed-to-resolve-target-device": "ターゲットデバイスの解決に失敗しました!", + "request-timeout": "リクエストタイムアウト", + "rpc-http-error": "エラー: {{status}} - {{statusText}}" + } + }, + "rulechain": { + "rulechain": "ルールチェーン", + "rulechain-events": "ルールチェーンイベント", + "rulechains": "ルールチェーン", + "root": "ルート", + "delete": "ルールチェーンを削除", + "name": "名前", + "name-required": "名前は必須です。", + "name-max-length": "名前は256文字以内である必要があります", + "description": "説明", + "add": "ルールチェーンを追加", + "set-root": "ルールチェーンをルートに設定", + "set-root-rulechain-title": "ルールチェーン '{{ruleChainName}}' をルートに設定してもよろしいですか?", + "set-root-rulechain-text": "確認後、ルールチェーンはルートとなり、すべての受信トランスポートメッセージを処理します。", + "delete-rulechain-title": "ルールチェーン '{{ruleChainName}}' を削除してもよろしいですか?", + "delete-rulechain-text": "確認後、ルールチェーンとすべての関連データは復元できなくなります。", + "delete-rulechains-title": "{ count, plural, =1 {1 ルールチェーン} other {# ルールチェーン} } を削除してもよろしいですか?", + "delete-rulechains-action-title": "{ count, plural, =1 {1 ルールチェーン} other {# ルールチェーン} } を削除", + "delete-rulechains-text": "確認後、すべての選択されたルールチェーンが削除され、すべての関連データは復元できなくなります。", + "add-rulechain-text": "新しいルールチェーンを追加", + "no-rulechains-text": "ルールチェーンが見つかりません", + "rulechain-details": "ルールチェーンの詳細", + "details": "詳細", + "events": "イベント", + "system": "システム", + "import": "ルールチェーンをインポート", + "export": "ルールチェーンをエクスポート", + "export-failed-error": "ルールチェーンをエクスポートできません: {{error}}", + "create-new-rulechain": "新しいルールチェーンを作成", + "rulechain-file": "ルールチェーンファイル", + "invalid-rulechain-file-error": "ルールチェーンをインポートできません: 無効なルールチェーンデータ構造", + "copyId": "ルールチェーンIDをコピー", + "idCopiedMessage": "ルールチェーンIDがクリップボードにコピーされました", + "select-rulechain": "ルールチェーンを選択", + "no-rulechains-matching": "'{{entity}}' に一致するルールチェーンは見つかりませんでした。", + "rulechain-required": "ルールチェーンは必須です", + "management": "ルール管理", + "debug-mode": "デバッグモード", + "search": "ルールチェーンを検索", + "selected-rulechains": "{ count, plural, =1 {1 ルールチェーン} other {# ルールチェーン} } 選択済み", + "open-rulechain": "ルールチェーンを開く", + "edge-template-root": "テンプレートルート", + "assign-to-edge": "Edgeに割り当て", + "edge-rulechain": "Edgeルールチェーン", + "unassign-rulechain-from-edge-text": "確認後、このルールチェーンはEdgeから割り当て解除され、Edgeからアクセスできなくなります。", + "unassign-rulechains-from-edge-title": "{ count, plural, =1 {1 ルールチェーン} other {# ルールチェーン} } をEdgeから割り当て解除してもよろしいですか?", + "unassign-rulechains-from-edge-text": "確認後、選択したすべてのルールチェーンはEdgeから割り当て解除され、Edgeからアクセスできなくなります。", + "assign-rulechain-to-edge-title": "ルールチェーンをEdgeに割り当て", + "assign-rulechain-to-edge-text": "Edgeに割り当てるルールチェーンを選択してください", + "set-edge-template-root-rulechain": "ルールチェーンをEdgeテンプレートルートとして設定", + "set-edge-template-root-rulechain-title": "ルールチェーン '{{ruleChainName}}' をEdgeテンプレートルートとして設定してもよろしいですか?", + "set-edge-template-root-rulechain-text": "確認後、このルールチェーンはEdgeテンプレートルートとなり、新しく作成されたEdgeのルートルールチェーンとなります。", + "invalid-rulechain-type-error": "ルールチェーンをインポートできません: 無効なルールチェーンタイプ。期待されるタイプは {{expectedRuleChainType}} です。", + "set-auto-assign-to-edge": "ルールチェーンを作成時にEdgeに自動的に割り当て", + "set-auto-assign-to-edge-title": "作成時にEdgeルールチェーン '{{ruleChainName}}' をEdgeに自動的に割り当ててもよろしいですか?", + "set-auto-assign-to-edge-text": "確認後、このEdgeルールチェーンは作成時に自動的にEdgeに割り当てられます。", + "unset-auto-assign-to-edge": "作成時にルールチェーンをEdgeに自動的に割り当てない", + "unset-auto-assign-to-edge-title": "作成時にEdgeルールチェーン '{{ruleChainName}}' をEdgeに自動的に割り当てないことを確認してもよろしいですか?", + "unset-auto-assign-to-edge-text": "確認後、このEdgeルールチェーンは作成時にEdgeに自動的に割り当てられなくなります。", + "unassign-rulechain-title": "ルールチェーン '{{ruleChainName}}' を解除してもよろしいですか?", + "unassign-rulechains": "ルールチェーンを解除" + }, + "rulenode": { + "rule-node-events": "ルールノードイベント", + "details": "詳細", + "events": "イベント", + "search": "ノードを検索", + "open-node-library": "ノードライブラリを開く", + "close-node-library": "ノードライブラリを閉じる", + "add": "ルールノードを追加", + "name": "名前", + "name-required": "名前は必須です。", + "name-max-length": "名前は256文字以内である必要があります", + "type": "タイプ", + "rule-node-description": "ルールノードの説明", + "delete": "ルールノードを削除", + "select-all-objects": "すべてのノードと接続を選択", + "deselect-all-objects": "すべてのノードと接続を選択解除", + "delete-selected-objects": "選択されたノードと接続を削除", + "delete-selected": "選択されたものを削除", + "create-nested-rulechain": "ネストされたルールチェーンを作成", + "select-all": "すべてを選択", + "copy-selected": "選択したものをコピー", + "deselect-all": "すべてを選択解除", + "rulenode-details": "ルールノードの詳細", + "debug-mode": "デバッグモード", + "singleton": "シングルトン", + "configuration": "構成", + "link": "リンク", + "link-details": "ルールノードリンクの詳細", + "add-link": "リンクを追加", + "link-label": "リンクラベル", + "link-label-required": "リンクラベルは必須です。", + "custom-link-label": "カスタムリンクラベル", + "custom-link-label-required": "カスタムリンクラベルは必須です。", + "link-labels": "リンクラベル", + "link-labels-required": "リンクラベルは必須です。", + "no-link-labels-found": "リンクラベルが見つかりません", + "no-link-label-matching": "'{{label}}' は見つかりませんでした。", + "create-new-link-label": "新しいリンクラベルを作成", + "type-filter": "フィルター", + "type-filter-details": "設定した条件で受信メッセージをフィルタリング", + "type-enrichment": "エンリッチメント", + "type-enrichment-details": "メッセージメタデータに追加情報を付加", + "type-transformation": "変換", + "type-transformation-details": "メッセージのペイロードとメタデータを変更", + "type-action": "アクション", + "type-action-details": "特別なアクションを実行", + "type-external": "外部", + "type-external-details": "外部システムと連携", + "type-rule-chain": "ルールチェーン", + "type-rule-chain-details": "受信メッセージを指定したルールチェーンへ転送", + "type-flow": "フロー", + "type-flow-details": "メッセージフローを整理", + "type-input": "入力", + "type-input-details": "ルールチェーンの論理入力。受信メッセージを次の関連ルールノードに転送", + "type-unknown": "不明", + "type-unknown-details": "解決できないルールノード", + "directive-is-not-loaded": "定義された構成ディレクティブ '{{directiveName}}' は利用できません。", + "ui-resources-load-error": "構成UIリソースの読み込みに失敗しました。", + "invalid-target-rulechain": "ターゲットルールチェーンを解決できません!", + "test-script-function": "スクリプト関数をテスト", + "script-lang-java-script": "JavaScript", + "script-lang-tbel": "TBEL", + "message": "メッセージ", + "message-type": "メッセージタイプ", + "select-message-type": "メッセージタイプを選択", + "message-type-required": "メッセージタイプは必須です", + "metadata": "メタデータ", + "metadata-required": "メタデータのエントリは空にできません。", + "output": "出力", + "test": "テスト", + "help": "ヘルプ", + "reset-debug-settings": "すべてのノードのデバッグ設定をリセット", + "test-with-this-message": "このメッセージで{{test}}", + "queue-hint": "メッセージを別キューへ転送するためのキューを選択します。既定では 'Main' キューが使用されます。", + "queue-singleton-hint": "マルチインスタンス環境でメッセージを転送するためのキューを選択します。既定では 'Main' キューが使用されます。" + }, + "rule-node-config": { + "id": "ID", + "additional-info": "追加情報", + "advanced-settings": "詳細設定", + "create-entity-if-not-exists": "エンティティが存在しない場合は新規作成", + "create-entity-if-not-exists-hint": "有効にすると、指定したパラメータの新しいエンティティが、まだ存在しない場合に作成されます。既存のエンティティは、そのままリレーションに使用されます。", + "select-device-connectivity-event": "デバイス接続イベントを選択", + "entity-name-pattern": "名前パターン", + "device-name-pattern": "デバイス名", + "asset-name-pattern": "アセット名", + "entity-view-name-pattern": "エンティティビュー名", + "customer-title-pattern": "顧客タイトル", + "dashboard-name-pattern": "ダッシュボードタイトル", + "user-name-pattern": "ユーザーEmail", + "edge-name-pattern": "Edge名", + "entity-name-pattern-required": "名前パターンは必須です", + "entity-name-pattern-hint": "名前パターンフィールドはテンプレート化をサポートします。$[messageKey] を使用してメッセージから値を抽出し、${metadataKey} を使用してメタデータから値を抽出します。", + "copy-message-type": "メッセージタイプをコピー", + "entity-type-pattern": "タイプパターン", + "entity-type-pattern-required": "タイプパターンは必須です", + "message-type-value": "メッセージタイプ値", + "message-type-value-required": "メッセージタイプ値は必須です", + "message-type-value-max-length": "メッセージタイプ値は256文字以内である必要があります", + "output-message-type": "出力メッセージタイプ", + "entity-cache-expiration": "エンティティキャッシュ有効期限(秒)", + "entity-cache-expiration-hint": "見つかったエンティティレコードを保存できる最大時間間隔を指定します。0 は、レコードが期限切れにならないことを意味します。", + "entity-cache-expiration-required": "エンティティキャッシュ有効期限は必須です。", + "entity-cache-expiration-range": "エンティティキャッシュ有効期限は0以上である必要があります。", + "customer-name-pattern": "顧客タイトル", + "customer-name-pattern-required": "顧客タイトルは必須です", + "customer-name-pattern-hint": "$[messageKey] を使用してメッセージから値を抽出し、${metadataKey} を使用してメタデータから値を抽出します。", + "create-customer-if-not-exists": "顧客が存在しない場合は新規作成", + "unassign-from-customer": "オリジネーターがダッシュボードの場合、特定の顧客から割り当て解除", + "unassign-from-customer-tooltip": "複数の顧客に同時に割り当て可能なのはダッシュボードのみです。\nメッセージのオリジネーターがダッシュボードの場合、割り当て解除する顧客のタイトルを明示的に指定する必要があります。", + "customer-cache-expiration": "顧客キャッシュ有効期限(秒)", + "customer-cache-expiration-hint": "見つかった顧客レコードを保存できる最大時間間隔を指定します。0 は、レコードが期限切れにならないことを意味します。", + "customer-cache-expiration-required": "顧客キャッシュ有効期限は必須です。", + "customer-cache-expiration-range": "顧客キャッシュ有効期限は0以上である必要があります。", + "interval-start": "間隔開始", + "interval-end": "間隔終了", + "time-unit": "時間単位", + "fetch-mode": "取得モード", + "order-by-timestamp": "タイムスタンプで並べ替え", + "limit": "制限", + "limit-hint": "最小値は2、最大値は1000です。単一のエントリを取得する場合は、取得モード 'First' または 'Last' を選択してください。", + "limit-required": "制限は必須です。", + "limit-range": "制限は2〜1000の範囲である必要があります。", + "time-unit-milliseconds": "ミリ秒", + "time-unit-seconds": "秒", + "time-unit-minutes": "分", + "time-unit-hours": "時間", + "time-unit-days": "日", + "time-value-range": "1〜2147483647 の範囲で指定できます。", + "start-interval-value-required": "間隔開始は必須です。", + "end-interval-value-required": "間隔終了は必須です。", + "filter": "フィルター", + "switch": "スイッチ", + "math-templatization-tooltip": "このフィールドはテンプレート化をサポートします。$[messageKey] を使用してメッセージから値を抽出し、${metadataKey} を使用してメタデータから値を抽出します。", + "add-message-type": "メッセージタイプを追加", + "select-message-types-required": "少なくとも1つのメッセージタイプを選択してください。", + "select-message-types": "メッセージタイプを選択", + "no-message-types-found": "メッセージタイプが見つかりません", + "no-message-type-matching": "'{{messageType}}' は見つかりませんでした。", + "create-new-message-type": "新しいメッセージタイプを作成します。", + "message-types-required": "メッセージタイプは必須です。", + "client-attributes": "クライアント属性", + "shared-attributes": "共有属性", + "server-attributes": "サーバー属性", + "attributes-keys": "属性キー", + "attributes-keys-required": "属性キーは必須です", + "attributes-scope": "属性スコープ", + "attributes-scope-value": "属性スコープ値", + "attributes-scope-value-copy": "属性スコープ値をコピー", + "attributes-scope-hint": "メタデータキー 'scope' を使用して、メッセージごとに属性スコープを動的に設定できます。指定した場合、構成で設定したスコープより優先されます。", + "notify-device": "デバイスへの通知を強制", + "send-attributes-updated-notification": "属性更新通知を送信", + "send-attributes-updated-notification-hint": "更新された属性に関する通知を、ルールエンジンキューへ別メッセージとして送信します。", + "send-attributes-deleted-notification": "属性削除通知を送信", + "send-attributes-deleted-notification-hint": "削除された属性に関する通知を、ルールエンジンキューへ別メッセージとして送信します。", + "update-attributes-only-on-value-change": "値が変化した場合のみ属性を保存", + "update-attributes-only-on-value-change-hint": "値が変化したかどうかに関係なく、受信メッセージごとに属性を更新します。APIの使用量が増え、パフォーマンスが低下します。", + "update-attributes-only-on-value-change-hint-enabled": "値が変化した場合にのみ属性を更新します。値が変化していない場合、属性のタイムスタンプ更新も属性変更通知の送信も行われません。", + "fetch-credentials-to-metadata": "認証情報をメタデータに取得", + "notify-device-on-update-hint": "有効にすると、共有属性の更新についてデバイスへの通知を強制します。無効の場合、通知動作は受信メッセージのメタデータに含まれる 'notifyDevice' パラメータで制御されます。通知をオフにするには、メタデータに 'notifyDevice' パラメータを含め、値を 'false' に設定する必要があります。それ以外の場合は、デバイスへの通知がトリガーされます。", + "notify-device-on-delete-hint": "有効にすると、共有属性の削除についてデバイスへの通知を強制します。無効の場合、通知動作は受信メッセージのメタデータに含まれる 'notifyDevice' パラメータで制御されます。通知をオンにするには、メタデータに 'notifyDevice' パラメータを含め、値を 'true' に設定する必要があります。それ以外の場合は、デバイスへの通知はトリガーされません。", + "latest-timeseries": "最新の時系列データキー", + "timeseries-keys": "時系列キー", + "timeseries-keys-required": "少なくとも1つの時系列キーを選択してください。", + "add-timeseries-key": "時系列キーを追加", + "add-message-field": "メッセージフィールドを追加", + "relation-search-parameters": "リレーション検索パラメータ", + "relation-parameters": "リレーションパラメータ", + "add-metadata-field": "メタデータフィールドを追加", + "data-keys": "メッセージフィールド名", + "copy-from": "コピー元", + "data-to-metadata": "データ→メタデータ", + "metadata-to-data": "メタデータ→データ", + "use-regular-expression-hint": "正規表現を使用して、パターンでキーをコピーします。\n\nヒントとコツ:\n'Enter' を押してフィールド名の入力を完了します。\n'Backspace' を押してフィールド名を削除します。複数のフィールド名をサポートします。", + "interval": "間隔", + "interval-required": "間隔は必須です", + "interval-hint": "秒単位の重複排除間隔。", + "interval-min-error": "許可される最小値は1です", + "max-pending-msgs": "保留中メッセージの最大数", + "max-pending-msgs-hint": "一意の重複排除IDごとにメモリに保持されるメッセージの最大数。", + "max-pending-msgs-required": "保留中メッセージの最大数は必須です", + "max-pending-msgs-max-error": "許可される最大値は1000です", + "max-pending-msgs-min-error": "許可される最小値は1です", + "max-retries": "最大再試行回数", + "max-retries-required": "最大再試行回数は必須です", + "max-retries-hint": "重複排除されたメッセージをキューに投入する最大再試行回数。再試行の間に10秒の遅延が使用されます", + "max-retries-max-error": "許可される最大値は100です", + "max-retries-min-error": "許可される最小値は0です", + "strategy": "戦略", + "strategy-required": "戦略は必須です", + "strategy-all-hint": "重複排除期間中に到着したすべてのメッセージを、単一のJSON配列メッセージとして返します。各要素は msg と metadata の内部プロパティを持つオブジェクトを表します。", + "strategy-first-hint": "重複排除期間中に到着した最初のメッセージを返します。", + "strategy-last-hint": "重複排除期間中に到着した最後のメッセージを返します。", + "first": "最初", + "last": "最後", + "all": "すべて", + "output-msg-type-hint": "重複排除結果のメッセージタイプ。", + "queue-name-hint": "重複排除結果を発行するキュー名。", + "keys": "キー", + "keys-required": "キーは必須です", + "rename-keys-in": "キー名の変更対象", + "data": "データ", + "message": "メッセージ", + "metadata": "メタデータ", + "current-key-name": "現在のキー名", + "key-name-required": "キー名は必須です", + "new-key-name": "新しいキー名", + "new-key-name-required": "新しいキー名は必須です", + "metadata-keys": "メタデータフィールド名", + "json-path-expression": "JSONパス式", + "json-path-expression-required": "JSONパス式は必須です", + "json-path-expression-hint": "JSONPath は、JSON構造内の要素または要素集合へのパスを指定します。'$' はルートオブジェクトまたは配列を表します。", + "relations-query": "リレーションクエリ", + "device-relations-query": "デバイスリレーションクエリ", + "max-relation-level": "最大リレーションレベル", + "max-relation-level-error": "値は0より大きいか、未指定である必要があります。", + "max-relation-level-invalid": "値は整数である必要があります。", + "relation-type": "リレーションタイプ", + "relation-type-pattern": "リレーションタイプパターン", + "relation-type-pattern-required": "リレーションタイプパターンは必須です", + "relation-types-list": "伝播するリレーションタイプ", + "relation-types-list-hint": "「伝播するリレーションタイプ」を選択しない場合、アラームはリレーションタイプによるフィルタリングなしで伝播されます。", + "unlimited-level": "無制限レベル", + "latest-telemetry": "最新のテレメトリ", + "add-telemetry-key": "テレメトリキーを追加", + "delete-from": "削除元", + "use-regular-expression-delete-hint": "正規表現を使用して、パターンでキーを削除します。\n\nヒントとコツ:\n'Enter' を押してフィールド名の入力を完了します。\n'Backspace' を押してフィールド名を削除します。\n複数のフィールド名をサポートします。", + "fetch-into": "取得先", + "attr-mapping": "属性マッピング:", + "source-attribute": "ソース属性キー", + "source-attribute-required": "ソース属性キーは必須です。", + "source-telemetry": "ソーステレメトリキー", + "source-telemetry-required": "ソーステレメトリキーは必須です。", + "target-key": "ターゲットキー", + "target-key-required": "ターゲットキーは必須です。", + "attr-mapping-required": "少なくとも1つのマッピングエントリを指定してください。", + "fields-mapping": "フィールドマッピング", + "fields-mapping-hint": "メッセージフィールドを $entityId に設定すると、メッセージのオリジネーターIDが指定したテーブル列に保存されます。", + "relations-query-config-direction-suffix": "オリジネーター", + "profile-name": "プロファイル名", + "fetch-circle-parameter-info-from-metadata-hint": "メタデータフィールド '{{perimeterKeyName}}' は次の形式で定義する必要があります: {\"latitude\":48.196, \"longitude\":24.6532, \"radius\":100.0, \"radiusUnit\":\"METER\"}", + "fetch-poligon-parameter-info-from-metadata-hint": "メタデータフィールド '{{perimeterKeyName}}' は次の形式で定義する必要があります: [[48.19736,24.65235],[48.19800,24.65060],...,[48.19849,24.65420]]", + "short-templatization-tooltip": "メッセージから値を抽出するには $[messageKey] を使用し、メタデータから値を抽出するには ${metadataKey} を使用します。", + "fields-mapping-required": "少なくとも1つのフィールドマッピングを指定してください。", + "at-least-one-field-required": "少なくとも1つの入力フィールドに値が指定されている必要があります。", + "originator-fields-sv-map-hint": "ターゲットキーのフィールドはテンプレート化をサポートします。メッセージから値を抽出するには $[messageKey] を使用し、メタデータから値を抽出するには ${metadataKey} を使用します。", + "sv-map-hint": "テンプレート化をサポートするのはターゲットキーのフィールドのみです。メッセージから値を抽出するには $[messageKey] を使用し、メタデータから値を抽出するには ${metadataKey} を使用します。", + "source-field": "ソースフィールド", + "source-field-required": "ソースフィールドは必須です。", + "originator-source": "オリジネーターソース", + "new-originator": "新しいオリジネーター", + "originator-customer": "顧客", + "originator-tenant": "テナント", + "originator-related": "関連エンティティ", + "originator-alarm-originator": "アラームオリジネーター", + "originator-entity": "名前パターンによるエンティティ", + "clone-message": "メッセージを複製", + "transform": "変換", + "default-ttl": "デフォルトTTL", + "default-ttl-required": "デフォルトTTLは必須です。", + "default-ttl-hint": "ルールノードはメッセージメタデータから Time-to-Live(TTL)値を取得します。値が存在しない場合は、構成で指定されたTTLがデフォルトになります。値が0に設定されている場合は、テナントプロファイル構成のTTLが適用されます。", + "default-ttl-zero-hint": "値が0に設定されている場合、TTLは適用されません。", + "min-default-ttl-message": "最小TTLは0のみ許可されています。", + "generation-parameters": "生成パラメータ", + "message-count": "生成メッセージ数の上限(0 - 無制限)", + "message-count-required": "生成メッセージ数の上限は必須です。", + "min-message-count-message": "最小メッセージ数は0のみ許可されています。", + "period-seconds": "期間(秒)", + "period-seconds-required": "期間は必須です。", + "generation-frequency-seconds": "生成頻度(秒)", + "generation-frequency-required": "生成頻度は必須です。", + "min-generation-frequency-message": "最小は60秒のみ許可されています。", + "script-lang-tbel": "TBEL", + "script-lang-js": "JS", + "use-metadata-period-in-seconds-patterns": "秒単位の期間パターンを使用", + "use-metadata-period-in-seconds-patterns-hint": "選択すると、ルールノードはメッセージのメタデータまたはデータから、間隔が秒であるものとして秒単位の期間パターンを使用します。", + "period-in-seconds-pattern": "秒単位の期間パターン", + "period-in-seconds-pattern-required": "秒単位の期間パターンは必須です", + "min-period-seconds-message": "期間の最小値は60秒のみ許可されています。", + "originator": "オリジネーター", + "message-body": "メッセージ本文", + "message-metadata": "メッセージメタデータ", + "generate": "生成", + "current-rule-node": "現在のルールノード", + "current-tenant": "現在のテナント", + "generator-function": "ジェネレーター関数", + "test-generator-function": "ジェネレーター関数をテスト", + "generator": "ジェネレーター", + "test-filter-function": "フィルター関数をテスト", + "test-switch-function": "スイッチ関数をテスト", + "test-transformer-function": "トランスフォーマー関数をテスト", + "transformer": "トランスフォーマー", + "alarm-create-condition": "アラーム作成条件", + "test-condition-function": "条件関数をテスト", + "alarm-clear-condition": "アラームクリア条件", + "alarm-details-builder": "アラーム詳細ビルダー", + "test-details-function": "詳細関数をテスト", + "alarm-type": "アラームタイプ", + "select-entity-types": "エンティティタイプを選択", + "alarm-type-required": "アラームタイプは必須です。", + "alarm-severity": "アラーム重大度", + "alarm-severity-required": "アラーム重大度は必須です", + "alarm-severity-pattern": "アラーム重大度パターン", + "alarm-status-filter": "アラームステータスフィルター", + "alarm-status-list-empty": "アラームステータス一覧が空です", + "no-alarm-status-matching": "一致するアラームステータスが見つかりませんでした。", + "propagate": "関連エンティティへアラームを伝播", + "propagate-to-owner": "エンティティ所有者(顧客またはテナント)へアラームを伝播", + "propagate-to-tenant": "テナントへアラームを伝播", + "condition": "条件", + "details": "詳細", + "to-string": "文字列へ変換", + "test-to-string-function": "文字列変換関数をテスト", + "from-template": "送信元", + "from-template-required": "送信元は必須です", + "message-to-metadata": "メッセージからメタデータへ", + "metadata-to-message": "メタデータからメッセージへ", + "from-message": "メッセージから", + "from-metadata": "メタデータから", + "to-template": "宛先", + "to-template-required": "宛先テンプレートは必須です", + "mail-address-list-template-hint": "カンマ区切りのアドレス一覧。メタデータの値には ${metadataKey} を使用し、メッセージ本文の値には $[messageKey] を使用します", + "cc-template": "Cc", + "bcc-template": "Bcc", + "subject-template": "件名", + "subject-template-required": "件名テンプレートは必須です", + "body-template": "本文", + "body-template-required": "本文テンプレートは必須です", + "dynamic-mail-body-type": "動的メール本文タイプ", + "mail-body-type": "メール本文タイプ", + "body-type-template": "本文タイプテンプレート", + "reply-routing-configuration": "返信ルーティング設定", + "rpc-reply-routing-configuration-hint": "これらの構成パラメータは、返信を返送するために使用するサービス、セッション、リクエストを識別するメタデータキー名を指定します。", + "reply-routing-configuration-hint": "これらの構成パラメータは、返信を返送するために使用するサービスとリクエストを識別するメタデータキー名を指定します。", + "request-id-metadata-attribute": "リクエストID", + "service-id-metadata-attribute": "サービスID", + "session-id-metadata-attribute": "セッションID", + "timeout-sec": "秒単位のタイムアウト", + "timeout-required": "タイムアウトは必須です", + "min-timeout-message": "最小タイムアウト値は0のみ許可されています。", + "endpoint-url-pattern": "エンドポイントURLパターン", + "endpoint-url-pattern-required": "エンドポイントURLパターンは必須です", + "request-method": "リクエストメソッド", + "use-simple-client-http-factory": "シンプルクライアントHTTPファクトリーを使用", + "ignore-request-body": "リクエスト本文なし", + "parse-to-plain-text": "プレーンテキストに解析", + "parse-to-plain-text-hint": "選択すると、リクエスト本文のメッセージペイロードはJSON文字列からプレーンテキストに変換されます。例: msg = \"Hello,\\t\"world\"\" は Hello, \"world\" に解析されます", + "read-timeout": "ミリ秒単位の読み取りタイムアウト", + "read-timeout-hint": "値が0の場合、タイムアウトは無制限になります", + "max-parallel-requests-count": "並列リクエスト最大数", + "max-parallel-requests-count-hint": "値が0の場合、並列処理の制限なしを指定します", + "max-response-size": "最大レスポンスサイズ (in KB)", + "max-response-size-hint": "JSONやXMLペイロードなどのHTTPメッセージをデコードまたはエンコードする際に、データをバッファリングするために割り当てられる最大メモリ量", + "headers": "ヘッダー", + "headers-hint": "ヘッダー/値フィールドで、メタデータの値には ${metadataKey} を使用し、メッセージ本文の値には $[messageKey] を使用します", + "header": "ヘッダー", + "header-required": "ヘッダーは必須です", + "value": "値", + "value-required": "値は必須です", + "topic-pattern": "トピックパターン", + "key-pattern": "キーパターン", + "key-pattern-hint": "任意。有効なパーティション番号が指定されている場合、レコード送信時に使用されます。パーティションが指定されていない場合は、代わりにキーが使用されます。どちらも指定されていない場合は、ラウンドロビン方式でパーティションが割り当てられます。", + "topic-pattern-required": "トピックパターンは必須です", + "topic": "トピック", + "topic-required": "トピックは必須です", + "bootstrap-servers": "ブートストラップサーバー", + "bootstrap-servers-required": "ブートストラップサーバーの値は必須です", + "other-properties": "その他のプロパティ", + "key": "キー", + "key-required": "キーは必須です", + "retries": "失敗時の自動再試行回数", + "min-retries-message": "最小再試行回数は0のみ許可されています。", + "batch-size-bytes": "生成するバッチサイズ(バイト)", + "min-batch-size-bytes-message": "最小バッチサイズは0のみ許可されています。", + "linger-ms": "ローカルでバッファリングする時間(ms)", + "min-linger-ms-message": "最小値は0 msのみ許可されています。", + "buffer-memory-bytes": "クライアントバッファの最大サイズ(バイト)", + "min-buffer-memory-message": "最小バッファサイズは0のみ許可されています。", + "memory-buffer-size-range": "メモリバッファサイズは0〜{{max}} KBの範囲である必要があります", + "acks": "確認応答数", + "topic-arn-pattern": "トピックARNパターン", + "topic-arn-pattern-required": "トピックARNパターンは必須です", + "aws-access-key-id": "AWSアクセスキーID", + "aws-access-key-id-required": "AWSアクセスキーIDは必須です", + "aws-secret-access-key": "AWSシークレットアクセスキー", + "aws-secret-access-key-required": "AWSシークレットアクセスキーは必須です", + "aws-region": "AWSリージョン", + "aws-region-required": "AWSリージョンは必須です", + "exchange-name-pattern": "エクスチェンジ名パターン", + "routing-key-pattern": "ルーティングキーパターン", + "message-properties": "メッセージプロパティ", + "host": "ホスト", + "host-required": "ホストは必須です", + "port": "ポート", + "port-required": "ポートは必須です", + "port-range": "ポートは1〜65535の範囲である必要があります。", + "virtual-host": "仮想ホスト", + "username": "ユーザー名", + "password": "パスワード", + "automatic-recovery": "自動リカバリー", + "connection-timeout-ms": "接続タイムアウト(ms)", + "min-connection-timeout-ms-message": "最小値は0 msのみ許可されています。", + "handshake-timeout-ms": "ハンドシェイクタイムアウト(ms)", + "min-handshake-timeout-ms-message": "最小値は0 msのみ許可されています。", + "client-properties": "クライアントプロパティ", + "queue-url-pattern": "キューURLパターン", + "queue-url-pattern-required": "キューURLパターンは必須です", + "delay-seconds": "遅延(秒)", + "min-delay-seconds-message": "最小値は0秒のみ許可されています。", + "max-delay-seconds-message": "最大値は900秒のみ許可されています。", + "name": "名前", + "name-required": "名前は必須です。", + "queue-type": "キュータイプ", + "sqs-queue-standard": "標準", + "sqs-queue-fifo": "FIFO", + "gcp-project-id": "GCPプロジェクトID", + "gcp-project-id-required": "GCPプロジェクトIDは必須です", + "gcp-service-account-key": "GCPサービスアカウントキー ファイル", + "gcp-service-account-key-required": "GCPサービスアカウントキー ファイルは必須です", + "pubsub-topic-name": "トピック名", + "pubsub-topic-name-required": "トピック名は必須です", + "message-attributes": "メッセージ属性", + "message-attributes-hint": "名前/値フィールドで、メタデータから値を取得するには ${metadataKey} を使用し、メッセージ本文から値を取得するには $[messageKey] を使用します", + "connect-timeout": "接続タイムアウト(秒単位)", + "connect-timeout-required": "接続タイムアウトは必須です。", + "connect-timeout-range": "接続タイムアウトは1から200の範囲内である必要があります。", + "client-id": "クライアントID", + "client-id-hint": "ヒント:オプションです。空白のままにすると自動生成されます。クライアントIDを指定する場合は注意してください。ほとんどのMQTTブローカーは同じクライアントIDで複数の接続を許可しません。そのようなブローカーに接続するには、MQTTクライアントIDが一意である必要があります。プラットフォームがマイクロサービスモードで動作している場合、ルールノードのコピーが各マイクロサービスで起動されます。これにより同じIDを持つMQTTクライアントが複数作成され、ルールノードの失敗を引き起こす可能性があります。このような失敗を回避するには、以下の\"クライアントIDにサービスIDをサフィックスとして追加\"オプションを有効にしてください。", + "append-client-id-suffix": "クライアントIDにサービスIDをサフィックスとして追加", + "client-id-suffix-hint": "ヒント:オプションです。\"クライアントID\"を明示的に指定した場合に適用されます。選択すると、サービスIDがサフィックスとしてクライアントIDに追加されます。プラットフォームがマイクロサービスモードで動作している場合の失敗を回避するのに役立ちます。", + "device-id": "デバイスID", + "device-id-required": "デバイスIDは必須です。", + "clean-session": "クリーンセッション", + "enable-ssl": "SSLを有効化", + "credentials": "認証情報", + "credentials-type": "認証情報タイプ", + "credentials-type-required": "認証情報タイプは必須です。", + "credentials-anonymous": "匿名", + "credentials-basic": "ベーシック", + "credentials-pem": "PEM", + "credentials-pem-hint": "少なくともサーバーCA証明書ファイル、またはクライアント証明書ファイルとクライアント秘密鍵ファイルのペアが必要です", + "credentials-sas": "共有アクセス署名", + "sas-key": "SASキー", + "sas-key-required": "SASキーは必須です。", + "hostname": "ホスト名", + "hostname-required": "ホスト名は必須です。", + "azure-ca-cert": "CA証明書ファイル", + "username-required": "ユーザー名は必須です。", + "password-required": "パスワードは必須です。", + "ca-cert": "CA証明書ファイル", + "private-key": "秘密鍵ファイル", + "cert": "証明書ファイル", + "no-file": "ファイルが選択されていません。", + "drop-file": "ファイルをドロップするか、クリックしてファイルを選択してアップロードしてください。", + "private-key-password": "秘密鍵のパスワード", + "use-system-smtp-settings": "システムのSMTP設定を使用", + "use-metadata-dynamic-interval": "動的間隔を使用", + "metadata-dynamic-interval-hint": "間隔開始と間隔終了の入力フィールドはテンプレート化をサポートします。置換されるテンプレート値はミリ秒で設定する必要があります。メッセージから値を抽出するには $[messageKey] を使用し、メタデータから値を抽出するには ${metadataKey} を使用します。", + "use-metadata-interval-patterns-hint": "選択すると、ルールノードは間隔がミリ秒であるものとして、メッセージのメタデータまたはデータから開始/終了間隔パターンを使用します。", + "use-message-alarm-data": "メッセージのアラームデータを使用", + "overwrite-alarm-details": "アラーム詳細を上書き", + "use-alarm-severity-pattern": "アラーム重大度パターンを使用", + "check-all-keys": "指定したすべてのフィールドが存在することを確認", + "check-all-keys-hint": "選択すると、指定したすべてのキーがメッセージデータとメタデータに存在することを確認します。", + "check-relation-to-specific-entity": "特定エンティティとのリレーションを確認", + "check-relation-to-specific-entity-tooltip": "有効にすると、特定のエンティティとのリレーションの存在を確認します。それ以外の場合は、任意のエンティティとのリレーションの存在を確認します。どちらの場合も、リレーション検索は設定された方向とタイプに基づきます。", + "check-relation-hint": "方向とリレーションタイプに基づき、特定エンティティまたは任意のエンティティへのリレーションの存在を確認します。", + "delete-relation-with-specific-entity": "特定エンティティとのリレーションを削除", + "delete-relation-with-specific-entity-hint": "有効にすると、1つの特定エンティティとのリレーションのみを削除します。それ以外の場合は、一致するすべてのエンティティとのリレーションが削除されます。", + "delete-relation-hint": "受信メッセージのオリジネーターから、方向とタイプに基づいて、指定したエンティティまたはエンティティ一覧へのリレーションを削除します。", + "remove-current-relations": "現在のリレーションを削除", + "remove-current-relations-hint": "方向とタイプに基づいて、受信メッセージのオリジネーターから現在のリレーションを削除します。", + "change-originator-to-related-entity": "オリジネーターを関連エンティティに変更", + "change-originator-to-related-entity-hint": "送信されたメッセージを別のエンティティからのメッセージとして処理するために使用します。", + "start-interval": "間隔開始", + "end-interval": "間隔終了", + "start-interval-required": "間隔開始は必須です。", + "end-interval-required": "間隔終了は必須です。", + "smtp-protocol": "SMTPプロトコル", + "smtp-host": "SMTPホスト", + "smtp-host-required": "SMTPホストは必須です。", + "smtp-port": "SMTPポート", + "smtp-port-required": "SMTPポートを指定する必要があります。", + "smtp-port-range": "SMTPポートは1〜65535の範囲である必要があります。", + "timeout-msec": "タイムアウト (msec)", + "min-timeout-msec-message": "最小値は0 msのみ許可されています。", + "enter-username": "ユーザー名を入力", + "enter-password": "パスワードを入力", + "enable-tls": "TLSを有効化", + "tls-version": "TLSバージョン", + "enable-proxy": "プロキシを有効化", + "use-system-proxy-properties": "システムのプロキシプロパティを使用", + "proxy-host": "プロキシホスト", + "proxy-host-required": "プロキシホストは必須です。", + "proxy-port": "プロキシポート", + "proxy-port-required": "プロキシポートは必須です。", + "proxy-port-range": "プロキシポートは1〜65535の範囲である必要があります。", + "proxy-user": "プロキシユーザー", + "proxy-password": "プロキシパスワード", + "proxy-scheme": "プロキシスキーム", + "numbers-to-template": "送信先電話番号テンプレート", + "numbers-to-template-required": "送信先電話番号テンプレートは必須です", + "numbers-to-template-hint": "カンマ区切りの電話番号。メタデータの値には ${metadataKey} を使用し、メッセージ本文の値には $[messageKey] を使用します", + "sms-message-template": "SMSメッセージテンプレート", + "sms-message-template-required": "SMSメッセージテンプレートは必須です", + "use-system-sms-settings": "システムのSMSプロバイダー設定を使用", + "min-period-0-seconds-message": "最小期間は0秒のみ許可されます。", + "max-pending-messages": "保留中メッセージの最大数", + "max-pending-messages-required": "保留中メッセージの最大数は必須です。", + "max-pending-messages-range": "保留中メッセージの最大数は1〜100000の範囲である必要があります。", + "originator-types-filter": "発生元タイプフィルター", + "interval-seconds": "秒単位の間隔", + "interval-seconds-required": "間隔は必須です。", + "int-range": "値は最大整数制限 (2147483648) を超えないようにしてください", + "min-interval-seconds-message": "最小間隔は1秒です。", + "output-timeseries-key-prefix": "出力時系列キープレフィックス", + "output-timeseries-key-prefix-required": "出力時系列キープレフィックスは必須です。", + "separator-hint": "フィールド入力を完了するには \"Enter\" を押してください。", + "select-details": "詳細を選択", + "entity-details-id": "ID", + "entity-details-title": "タイトル", + "entity-details-country": "国", + "entity-details-state": "都道府県", + "entity-details-city": "市区町村", + "entity-details-zip": "郵便番号", + "entity-details-address": "住所", + "entity-details-address2": "住所2", + "entity-details-additional_info": "追加情報", + "entity-details-phone": "電話番号", + "entity-details-email": "Email", + "email-sender": "Email送信者", + "fields-to-check": "チェックするフィールド", + "add-detail": "詳細を追加", + "check-all-keys-tooltip": "有効にすると、受信メッセージとそのメタデータ内の、メッセージおよびメタデータのフィールド名に列挙されたすべてのフィールドの存在を確認します。", + "fields-to-check-hint": "\"Enter\" を押してフィールド名の入力を完了します。複数のフィールド名に対応しています。", + "entity-details-list-empty": "少なくとも1つの詳細を選択してください。", + "alarm-status": "アラームステータス", + "alarm-required": "少なくとも1つのアラームステータスを選択してください。", + "no-entity-details-matching": "一致するエンティティ詳細が見つかりませんでした。", + "custom-table-name": "カスタムテーブル名", + "custom-table-name-required": "テーブル名は必須です", + "custom-table-hint": "テーブルはCassandraクラスターに作成されている必要があり、共通のTBテーブルへのデータ挿入を避けるために、名前はプレフィックス 'cs_tb_' で始まる必要があります。ここには 'cs_tb_' プレフィックスなしでテーブル名を入力してください。", + "message-field": "メッセージフィールド", + "message-field-required": "メッセージフィールドは必須です。", + "table-col": "テーブル列", + "table-col-required": "テーブル列は必須です。", + "latitude-field-name": "緯度フィールド名", + "longitude-field-name": "経度フィールド名", + "latitude-field-name-required": "緯度フィールド名は必須です。", + "longitude-field-name-required": "経度フィールド名は必須です。", + "fetch-perimeter-info-from-metadata": "メタデータからペリメータ情報を取得", + "fetch-perimeter-info-from-metadata-tooltip": "ペリメータタイプが 'Polygon' に設定されている場合、メタデータフィールド '{{perimeterKeyName}}' の値は、追加の解析を行わずにペリメータ定義として設定されます。それ以外の場合、ペリメータタイプが 'Circle' に設定されていると、'{{perimeterKeyName}}' メタデータフィールドの値が解析され、円のペリメータ定義に使用する 'latitude'、'longitude'、'radius'、'radiusUnit' フィールドが抽出されます。", + "perimeter-key-name": "ペリメータキー名", + "perimeter-key-name-hint": "ペリメータ情報を含むメタデータフィールド名。", + "perimeter-key-name-required": "ペリメータキー名は必須です。", + "perimeter-circle": "円", + "perimeter-polygon": "ポリゴン", + "perimeter-type": "ペリメータタイプ", + "circle-center-latitude": "中心緯度", + "circle-center-latitude-required": "中心緯度は必須です。", + "circle-center-longitude": "中心経度", + "circle-center-longitude-required": "中心経度は必須です。", + "range-unit-meter": "メートル", + "range-unit-kilometer": "キロメートル", + "range-unit-foot": "フィート", + "range-unit-mile": "マイル", + "range-unit-nautical-mile": "海里", + "range-units": "範囲単位", + "range-units-required": "範囲単位は必須です。", + "range": "範囲", + "range-required": "範囲は必須です。", + "polygon-definition": "ポリゴン定義", + "polygon-definition-required": "ポリゴン定義は必須です。", + "polygon-definition-hint": "ポリゴンを手動で定義するには、次の形式を使用します: [[lat1,lon1],[lat2,lon2], ... ,[latN,lonN]]。", + "min-inside-duration": "最小内側滞在時間", + "min-inside-duration-value-required": "最小内側滞在時間は必須です", + "min-inside-duration-time-unit": "最小内側滞在時間の時間単位", + "min-outside-duration": "最小外側滞在時間", + "min-outside-duration-value-required": "最小外側滞在時間は必須です", + "min-outside-duration-time-unit": "最小外側滞在時間の時間単位", + "tell-failure-if-absent": "失敗を通知", + "tell-failure-if-absent-hint": "選択したキーのうち少なくとも1つが存在しない場合、送信メッセージは \"Failure\" を報告します。", + "get-latest-value-with-ts": "最新テレメトリ値のタイムスタンプを取得", + "get-latest-value-with-ts-hint": "選択した場合、最新テレメトリ値にはタイムスタンプも含まれます。例: \"temp\": \"{\"ts\":1574329385897, \"value\":42}\"", + "ignore-null-strings": "null文字列を無視", + "ignore-null-strings-hint": "選択した場合、ルールノードは値が空のエンティティフィールドを無視します。", + "add-metadata-key-values-as-kafka-headers": "メッセージメタデータのキー値ペアをKafkaレコードヘッダーに追加", + "add-metadata-key-values-as-kafka-headers-hint": "選択した場合、メッセージメタデータのキー値ペアが、事前定義された文字セットエンコーディングを使用するバイト配列として、送信レコードのヘッダーに追加されます。", + "charset-encoding": "文字セットエンコーディング", + "charset-encoding-required": "文字セットエンコーディングは必須です。", + "charset-us-ascii": "US-ASCII", + "charset-iso-8859-1": "ISO-8859-1", + "charset-utf-8": "UTF-8", + "charset-utf-16be": "UTF-16BE", + "charset-utf-16le": "UTF-16LE", + "charset-utf-16": "UTF-16", + "select-queue-hint": "キュー名はドロップダウンリストから選択するか、カスタム名を追加できます。", + "device-profile-node-hint": "アラーム状態評価の継続性を確保するために、持続時間や繰り返し条件がある場合に有用です。", + "persist-alarm-rules": "アラームルールの状態を永続化", + "persist-alarm-rules-hint": "有効にすると、ルールノードは処理状態をデータベースに保存します。", + "fetch-alarm-rules": "アラームルールの状態を取得", + "fetch-alarm-rules-hint": "有効にすると、ルールノードは初期化時に処理状態を復元し、サーバー再起動後でもアラームが発生するようにします。無効の場合、デバイスから最初のメッセージが到着したときに状態が復元されます。", + "input-value-key": "入力値キー", + "input-value-key-required": "入力値キーは必須です。", + "output-value-key": "出力値キー", + "output-value-key-required": "出力値キーは必須です。", + "number-of-digits-after-floating-point": "小数点以下の桁数", + "number-of-digits-after-floating-point-range": "小数点以下の桁数は0〜15の範囲である必要があります。", + "failure-if-delta-negative": "デルタが負の場合は失敗を通知", + "failure-if-delta-negative-tooltip": "デルタ値が負の場合、ルールノードはメッセージ処理を失敗にします。", + "use-caching": "キャッシュを使用", + "use-caching-tooltip": "ルールノードはパフォーマンス向上のため、受信メッセージから届く \"{{inputValueKey}}\" の値をキャッシュします。注意: 別の場所で \"{{inputValueKey}}\" の値を変更しても、キャッシュは更新されません。", + "add-time-difference-between-readings": "\"{{inputValueKey}}\" の読み取り間の時間差を追加", + "add-time-difference-between-readings-tooltip": "有効にすると、ルールノードは送信メッセージに \"{{periodValueKey}}\" を追加します。", + "period-value-key": "期間値キー", + "period-value-key-required": "期間値キーは必須です。", + "general-pattern-hint": "メタデータの値には ${metadataKey}、メッセージ本文の値には $[messageKey] を使用します。", + "alarm-severity-pattern-hint": "メタデータの値には ${metadataKey}、メッセージ本文の値には $[messageKey] を使用します。アラーム重大度はシステム(CRITICAL、MAJOR など)である必要があります。", + "output-node-name-hint": "ルールノード名 は、出力メッセージの リレーションタイプ に対応し、呼び出し元ルールチェーン内で他のルールノードへメッセージを転送するために使用されます。", + "use-server-ts": "サーバータイムスタンプを使用", + "use-server-ts-hint": "明示的なタイムスタンプがない時系列データに対して、サーバーの現在のタイムスタンプを使用します。これは、複数のソースからのメッセージを処理する場合や、メッセージが順不同で到着した場合でも、適切な順序を維持するのに役立ちます。", + "kv-map-pattern-hint": "すべての入力フィールドはテンプレート化をサポートします。$[messageKey] を使用してメッセージから値を抽出し、${metadataKey} を使用してメタデータから値を抽出します。", + "kv-map-single-pattern-hint": "入力フィールドはテンプレート化をサポートします。$[messageKey] を使用してメッセージから値を抽出し、${metadataKey} を使用してメタデータから値を抽出します。", + "shared-scope": "共有スコープ", + "server-scope": "サーバースコープ", + "client-scope": "クライアントスコープ", + "attribute-type": "属性", + "attribute-type-description": "データベースから属性値を取得", + "attribute-type-result-description": "結果をデータベース内のエンティティ属性として保存", + "constant-type": "定数", + "constant-type-description": "定数値を定義", + "time-series-type": "時系列", + "time-series-type-description": "データベースから最新の時系列値を取得", + "time-series-type-result-description": "結果をエンティティの時系列としてデータベースに保存", + "message-body-type": "メッセージ", + "message-body-type-description": "受信メッセージから引数値を取得", + "message-body-type-result-description": "結果を送信メッセージに追加", + "message-metadata-type": "メタデータ", + "message-metadata-type-description": "受信メッセージのメタデータから引数値を取得", + "message-metadata-result-description": "結果を送信メッセージのメタデータに追加", + "argument-tile": "引数", + "no-arguments-prompt": "引数が設定されていません", + "result-title": "結果", + "functions-field-input": "関数", + "no-option-found": "オプションが見つかりません", + "argument-source-field-input": "ソース", + "argument-source-field-input-required": "引数ソースは必須です。", + "argument-key-field-input": "キー", + "argument-key-field-input-required": "引数キーは必須です。", + "constant-value-field-input": "定数値", + "constant-value-field-input-required": "定数値は必須です。", + "attribute-scope-field-input": "属性スコープ", + "attribute-scope-field-input-required": "属性スコープは必須です。", + "default-value-field-input": "デフォルト値", + "type-field-input": "タイプ", + "type-field-input-required": "タイプは必須です。", + "key-field-input": "キー", + "add-entity-type": "エンティティタイプを追加", + "add-device-profile": "デバイスプロファイルを追加", + "key-field-input-required": "キーは必須です。", + "number-floating-point-field-input": "小数点以下の桁数", + "number-floating-point-field-input-hint": "0 を指定すると結果を整数に変換します", + "add-to-message-field-input": "メッセージに追加", + "add-to-metadata-field-input": "メタデータに追加", + "custom-expression-field-input": "数式", + "custom-expression-field-input-required": "数式は必須です", + "custom-expression-field-input-hint": "評価する数式を指定します。デフォルトの式は華氏を摂氏に変換する方法を示します", + "retained-message": "保持メッセージ", + "attributes-mapping": "属性マッピング", + "latest-telemetry-mapping": "最新テレメトリマッピング", + "add-mapped-attribute-to": "マッピングされた属性の追加先", + "add-mapped-latest-telemetry-to": "マッピングされた最新テレメトリの追加先", + "add-mapped-fields-to": "マッピングされたフィールドの追加先", + "add-selected-details-to": "選択した詳細の追加先", + "clear-selected-types": "選択したタイプをクリア", + "clear-selected-details": "選択した詳細をクリア", + "clear-selected-fields": "選択したフィールドをクリア", + "clear-selected-keys": "選択したキーをクリア", + "geofence-configuration": "ジオフェンス設定", + "coordinate-field-names": "座標フィールド名", + "coordinate-field-hint": "ルールノードはメッセージから指定されたフィールドの取得を試みます。存在しない場合はメタデータから参照します。", + "presence-monitoring-strategy": "在圏監視戦略", + "presence-monitoring-strategy-on-first-message": "最初のメッセージ時", + "presence-monitoring-strategy-on-each-message": "メッセージごと", + "presence-monitoring-strategy-on-first-message-hint": "前回の在圏ステータス 'Entered' または 'Left' の更新から、設定された最小時間が経過した後の最初のメッセージで、在圏ステータス 'Inside' または 'Outside' を報告します。", + "presence-monitoring-strategy-on-each-message-hint": "在圏ステータス 'Entered' または 'Left' の更新後、各メッセージで在圏ステータス 'Inside' または 'Outside' を報告します。", + "fetch-credentials-to": "資格情報の取得先", + "add-originator-attributes-to": "発生元属性の追加先", + "originator-attributes": "発生元属性", + "fetch-latest-telemetry-with-timestamp": "最新テレメトリをタイムスタンプ付きで取得", + "fetch-latest-telemetry-with-timestamp-tooltip": "選択した場合、最新テレメトリ値はタイムスタンプ付きで送信メタデータに追加されます。例: \"{{latestTsKeyName}}\": \"{\"ts\":1574329385897, \"value\":42}\"", + "tell-failure": "属性が不足している場合は失敗を通知", + "tell-failure-tooltip": "選択したキーのうち少なくとも1つが存在しない場合、送信メッセージは \"Failure\" を報告します。", + "created-time": "作成時刻", + "chip-help": "{{inputName}} の入力を完了するには 'Enter' を押してください。 \n{{inputName}} を削除するには 'Backspace' を押してください。 \n複数の値に対応しています。", + "detail": "詳細", + "field-name": "フィールド名", + "device-profile": "デバイスプロファイル", + "entity-type": "エンティティタイプ", + "message-type": "メッセージタイプ", + "timeseries-key": "時系列キー", + "type": "タイプ", + "first-name": "名", + "last-name": "姓", + "label": "ラベル", + "originator-fields-mapping": "発生元フィールドマッピング", + "add-mapped-originator-fields-to": "マッピングされた発生元フィールドの追加先", + "fields": "フィールド", + "skip-empty-fields": "空のフィールドをスキップ", + "skip-empty-fields-tooltip": "値が空のフィールドは、出力メッセージ/出力メタデータに追加されません。", + "fetch-interval": "取得間隔", + "fetch-strategy": "取得戦略", + "fetch-timeseries-from-to": "{{startInterval}} {{startIntervalTimeUnit}} 前から {{endInterval}} {{endIntervalTimeUnit}} 前までの時系列を取得。", + "fetch-timeseries-from-to-invalid": "時系列の取得が無効です(\"間隔開始\" は \"間隔終了\" より小さい必要があります)。", + "use-metadata-dynamic-interval-tooltip": "選択すると、ルールノードはメッセージおよびメタデータのパターンに基づいて動的なインターバルの開始と終了を使用します。", + "all-mode-hint": "取得モード \"All\" を選択すると、ルールノードは設定可能なクエリパラメータを使用して取得間隔からテレメトリを取得します。", + "first-mode-hint": "取得モード \"First\" を選択すると、ルールノードは取得間隔の開始に最も近いテレメトリを取得します。", + "last-mode-hint": "取得モード \"Last\" を選択すると、ルールノードは取得間隔の終了に最も近いテレメトリを取得します。", + "ascending": "昇順", + "descending": "降順", + "min": "最小", + "max": "最大", + "average": "平均", + "sum": "合計", + "count": "件数", + "none": "なし", + "last-level-relation-tooltip": "選択すると、ルールノードは最大関係レベルで設定されたレベルでのみ関連エンティティを検索します。", + "last-level-device-relation-tooltip": "選択すると、ルールノードは最大関係レベルで設定されたレベルでのみ関連デバイスを検索します。", + "data-to-fetch": "取得するデータ", + "mapping-of-customers": "顧客のマッピング", + "map-fields-required": "すべてのマッピングフィールドは必須です。", + "attributes": "属性", + "related-device-attributes": "関連デバイス属性", + "add-selected-attributes-to": "選択した属性の追加先", + "device-profiles": "デバイスプロファイル", + "mapping-of-tenant": "テナントのマッピング", + "add-attribute-key": "属性キーを追加", + "message-template": "メッセージテンプレート", + "message-template-required": "メッセージテンプレートは必須です", + "use-system-slack-settings": "システムのSlack設定を使用", + "slack-api-token": "Slack APIトークン", + "slack-api-token-required": "Slack APIトークンは必須です", + "keys-mapping": "キーのマッピング", + "add-key": "キーを追加", + "recipients": "受信者", + "message-subject-and-content": "メッセージ件名と内容", + "template-rules-hint": "両方の入力フィールドはテンプレート化をサポートします。メッセージから値を抽出するには $[messageKey] を使用し、メッセージメタデータから値を抽出するには ${metadataKey} を使用します。", + "originator-customer-desc": "受信メッセージのオリジネーターの顧客を新しいオリジネーターとして使用します。", + "originator-tenant-desc": "現在のテナントを新しいオリジネーターとして使用します。", + "originator-related-entity-desc": "関連エンティティを新しいオリジネーターとして使用します。設定された関係タイプと方向に基づいて検索します。", + "originator-alarm-originator-desc": "アラームオリジネーターを新しいオリジネーターとして使用します。受信メッセージのオリジネーターがアラームエンティティの場合のみ。", + "originator-entity-by-name-pattern-desc": "DBから取得したエンティティを新しいオリジネーターとして使用します。エンティティタイプと指定された名前パターンに基づいて検索します。", + "email-from-template-hint": "メッセージから値を抽出するには $[messageKey] を使用し、メタデータから値を抽出するには ${metadataKey} を使用します。", + "recipients-block-main-hint": "カンマ区切りのアドレスリスト。すべての入力フィールドはテンプレート化をサポートします。メッセージから値を抽出するには $[messageKey] を使用し、メタデータから値を抽出するには ${metadataKey} を使用します。", + "forward-msg-default-rule-chain": "メッセージをオリジネーターのデフォルトルールチェーンへ転送", + "forward-msg-default-rule-chain-tooltip": "有効にすると、メッセージはオリジネーターのデフォルトルールチェーン(または、オリジネーターのエンティティプロファイルにデフォルトルールチェーンが定義されていない場合は設定のルールチェーン)に転送されます。", + "exclude-zero-deltas": "出力メッセージからゼロデルタを除外", + "exclude-zero-deltas-hint": "有効にすると、\"{{outputValueKey}}\" の出力キーは値が 0 ではない場合にのみ出力メッセージに追加されます。", + "exclude-zero-deltas-time-difference-hint": "有効にすると、\"{{outputValueKey}}\" と \"{{periodValueKey}}\" の出力キーは、\"{{outputValueKey}}\" の値が 0 ではない場合にのみ出力メッセージに追加されます。", + "search-direction-from": "発生元からターゲットエンティティへ", + "search-direction-to": "ターゲットエンティティから発生元へ", + "del-relation-direction-from": "発生元から", + "del-relation-direction-to": "発生元へ", + "target-entity": "ターゲットエンティティ", + "function-configuration": "関数設定", + "function-name": "関数名", + "function-name-required": "関数名は必須です。", + "qualifier": "修飾子", + "qualifier-hint": "修飾子が指定されていない場合、デフォルトの修飾子 \"$LATEST\" が使用されます。", + "aws-credentials": "AWS認証情報", + "connection-timeout": "接続タイムアウト", + "connection-timeout-required": "接続タイムアウトは必須です。", + "connection-timeout-min": "最小接続タイムアウトは0です。", + "connection-timeout-hint": "最初に接続を確立する際に、諦めてタイムアウトするまで待機する秒数。値が0の場合は無限を意味し、推奨されません。", + "request-timeout": "リクエストタイムアウト", + "request-timeout-required": "リクエストタイムアウトは必須です", + "request-timeout-min": "最小リクエストタイムアウトは0です", + "request-timeout-hint": "リクエストが完了するのを、諦めてタイムアウトするまで待機する秒数。値が0の場合は無限を意味し、推奨されません。", + "units": "単位", + "tell-failure-aws-lambda": "AWS Lambda関数の実行で例外が発生した場合は失敗を通知", + "tell-failure-aws-lambda-hint": "AWS Lambda関数の実行で例外が発生した場合、ルールノードはメッセージ処理を失敗にします。", + "basic-mode": "基本", + "advanced-mode": "詳細", + "save-time-series": { + "processing-settings": "処理設定", + "processing-settings-hint": "受信メッセージの処理方法を定義します。基本処理設定では事前設定された戦略を選択でき、高度な設定では各アクションごとに個別の処理戦略を選択できます。", + "advanced-settings-hint": "処理戦略を設定する際は注意してください。特定の組み合わせにより予期しない動作が発生する場合があります。", + "strategy": "戦略", + "deduplication-interval": "重複排除間隔", + "deduplication-interval-required": "重複排除間隔は必須です", + "deduplication-interval-min-max-range": "重複排除間隔は最小1秒、最大1日である必要があります", + "strategy-type": { + "every-message": "メッセージごとに", + "skip": "スキップ", + "deduplicate": "重複排除", + "web-sockets-only": "WebSocketsのみ" + }, + "time-series": "時系列", + "latest": "最新値", + "web-sockets": "WebSockets", + "calculated-fields-and-alarm-rules": "計算フィールドとアラームルール" + }, + "save-attribute": { + "processing-settings": "処理設定", + "processing-settings-hint": "受信メッセージの処理方法を定義します。基本処理設定では事前設定された戦略を選択でき、高度な設定では各アクションごとに個別の処理戦略を選択できます。", + "advanced-settings-hint": "処理戦略を設定する際は注意してください。特定の組み合わせにより予期しない動作が発生する場合があります。", + "strategy": "戦略", + "deduplication-interval": "重複排除間隔", + "deduplication-interval-required": "重複排除間隔は必須です", + "deduplication-interval-min-max-range": "重複排除間隔は最小1秒、最大1日である必要があります", + "scope": "スコープ", + "strategy-type": { + "every-message": "メッセージごとに", + "skip": "スキップ", + "deduplicate": "重複排除", + "web-sockets-only": "WebSocketsのみ" + }, + "attributes": "属性" + }, + "key-val": { + "key": "キー", + "value": "値", + "see-examples": "例を見る。", + "remove-entry": "エントリを削除", + "remove-mapping-entry": "マッピングエントリを削除", + "add-mapping-entry": "マッピングを追加", + "add-entry": "エントリを追加", + "copy-key-values-from": "キー値をコピー元", + "delete-key-values": "キー値を削除", + "delete-key-values-from": "キー値を削除元", + "at-least-one-key-error": "少なくとも1つのキーを選択してください。", + "unique-key-value-pair-error": "'{{keyText}}' は '{{valText}}' と異なる必要があります!" + }, + "mail-body-types": { + "plain-text": "プレーンテキスト", + "html": "HTML", + "dynamic": "動的", + "use-body-type-template": "本文タイプテンプレートを使用", + "plain-text-description": "特別なスタイルや書式設定のない、シンプルな非装飾テキストです。", + "html-text-description": "メール本文で書式設定、リンク、画像にHTMLタグを使用できます。", + "dynamic-text-description": "テンプレート化機能に基づいて、プレーンテキストまたはHTMLの本文タイプを動的に使用できます。", + "after-template-evaluation-hint": "テンプレート評価後の値は、HTMLの場合は true、プレーンテキストの場合は false である必要があります。" + }, + "ai": { + "ai-model": "AIモデル", + "model": "モデル", + "ai-model-hint": "このルールノードが送信するリクエストを処理する事前設定済みのAIモデルを選択するか、\"新規作成\"を使用して新しいモデルを設定します。", + "prompt-settings": "プロンプト設定", + "prompt-settings-hint": "オプションのシステムプロンプトはAIの一般的な役割と制約を設定し、ユーザープロンプトは実行する具体的なタスクを定義します。両方のフィールドはテンプレート化もサポートします。", + "system-prompt": "システムプロンプト", + "system-prompt-max-length": "システムプロンプトは500000文字以下である必要があります。", + "system-prompt-blank": "システムプロンプトを空欄にできません。", + "user-prompt": "ユーザープロンプト", + "user-prompt-required": "ユーザープロンプトは必須です。", + "user-prompt-max-length": "ユーザープロンプトは500000文字以下である必要があります。", + "user-prompt-blank": "ユーザープロンプトを空欄にできません。", + "response-format": "レスポンス形式", + "response-text": "テキスト", + "response-json": "JSON", + "response-json-schema": "JSON Schema", + "response-format-hint-TEXT": "モデルが任意のテキストを生成できるようにします。生成結果は有効なJSONオブジェクトである場合も、そうでない場合もあります。出力が有効なJSONオブジェクトでない場合、自動的に \"response\" キー配下のJSONオブジェクトとしてラップされます。", + "response-format-hint-JSON": "モデルは有効なJSONを生成する必要があります。出力が有効なJSONオブジェクトでない場合、自動的に \"response\" キー配下のJSONオブジェクトとしてラップされます。", + "response-format-hint-JSON_SCHEMA": "モデルは、提供されたスキーマで定義された特定の構造とデータ型に一致するJSONを生成する必要があります。出力が有効なJSONオブジェクトでない場合、自動的に \"response\" キー配下のJSONオブジェクトとしてラップされます。", + "response-json-schema-hint": "有効なJSON Schemaは任意に入力できますが、このルールノードはその機能の限定されたサブセットのみをサポートします。詳細はノードドキュメントを参照してください。", + "response-json-schema-required": "JSON Schemaは必須です", + "advanced-settings": "詳細設定", + "timeout": "タイムアウト", + "timeout-hint": "リクエストが終了する前にAIモデルからの応答を待機する最大時間 \nを指定します。", + "timeout-required": "タイムアウトは必須です", + "timeout-validation": "1秒から10分の範囲である必要があります。", + "force-acknowledgement": "確認応答を強制", + "force-acknowledgement-hint": "有効にすると、受信メッセージは直ちに確認応答されます。その後、モデルの応答は別の新しいメッセージとしてキューに追加されます。", + "ai-resources": "AIリソース" + } + }, + "timezone": { + "timezone": "タイムゾーン", + "select-timezone": "タイムゾーンを選択", + "no-timezones-matching": "'{{timezone}}' に一致するタイムゾーンが見つかりませんでした。", + "timezone-required": "タイムゾーンは必須です。", + "browser-time": "ブラウザー時刻" + }, + "queue": { + "queue-name": "キュー", + "no-queues-found": "キューが見つかりません。", + "no-queues-matching": "'{{queue}}' に一致するキューが見つかりませんでした。", + "select-name": "キュー名を選択", + "name": "名前", + "name-required": "キュー名は必須です!", + "name-unique": "キュー名が一意ではありません!", + "name-pattern": "キュー名に ASCII 英数字、'.'、'_'、'-' 以外の文字が含まれています!", + "queue-required": "キューは必須です!", + "topic-required": "キュートピックは必須です!", + "poll-interval-required": "ポーリング間隔は必須です!", + "poll-interval-min-value": "ポーリング間隔の値は 1 未満にできません", + "partitions-required": "パーティションは必須です!", + "partitions-min-value": "パーティション数は 1 未満にできません", + "pack-processing-timeout-required": "処理タイムアウトは必須です", + "pack-processing-timeout-min-value": "処理タイムアウトの値は 1 未満にできません", + "batch-size-required": "バッチサイズは必須です!", + "batch-size-min-value": "バッチサイズの値は 1 未満にできません", + "retries-required": "リトライ回数は必須です!", + "retries-min-value": "リトライ回数は負にできません", + "failure-percentage-required": "失敗率は必須です!", + "failure-percentage-min-value": "失敗率の値は 0 未満にできません", + "failure-percentage-max-value": "失敗率の値は 100 を超えられません", + "pause-between-retries-required": "リトライ間の待機時間は必須です!", + "pause-between-retries-min-value": "リトライ間の待機時間は 1 未満にできません", + "max-pause-between-retries-required": "リトライ間の最大待機時間は必須です!", + "max-pause-between-retries-min-value": "リトライ間の最大待機時間は 1 未満にできません", + "submit-strategy-type-required": "送信戦略タイプは必須です!", + "processing-strategy-type-required": "処理戦略タイプは必須です!", + "queues": "キュー", + "selected-queues": "{ count, plural, =1 {キュー 1 件} other {キュー # 件} } を選択", + "delete-queue-title": "キュー '{{queueName}}' を削除してもよろしいですか?", + "delete-queues-title": "{ count, plural, =1 {キュー 1 件} other {キュー # 件} } を削除してもよろしいですか?", + "delete-queue-text": "注意: 確認後、キューと関連データはすべて復元できなくなります。", + "delete-queues-text": "確認後、選択したすべてのキューが削除され、アクセスできなくなります。", + "search": "キューを検索", + "add": "キューを追加", + "details": "キュー詳細", + "topic": "トピック", + "submit-settings": "送信設定", + "submit-strategy": "戦略タイプ *", + "grouping-parameter": "グルーピングパラメータ", + "processing-settings": "リトライ処理設定", + "processing-strategy": "処理タイプ *", + "retries-settings": "リトライ設定", + "polling-settings": "ポーリング設定", + "batch-processing": "バッチ処理", + "poll-interval": "ポーリング間隔", + "partitions": "パーティション", + "immediate-processing": "即時処理", + "consumer-per-partition": "各コンシューマーごとにメッセージをポーリング", + "consumer-per-partition-hint": "各パーティションごとに個別のコンシューマーを有効化します", + "duplicate-msg-to-all-partitions": "すべてのパーティションにメッセージを複製", + "processing-timeout": "処理時間(ms)", + "batch-size": "バッチサイズ", + "retries": "リトライ回数(0 – 無制限)", + "failure-percentage": "リトライをスキップする失敗メッセージ率(%)", + "pause-between-retries": "リトライ間隔(秒)", + "max-pause-between-retries": "追加リトライ間隔(秒)", + "delete": "キューを削除", + "copyId": "キューIDをコピー", + "idCopiedMessage": "キューIDがクリップボードにコピーされました", + "description": "説明", + "description-hint": "このテキストは、選択した戦略の代わりにキューの説明として表示されます", + "alt-description": "送信戦略: {{submitStrategy}}, 処理戦略: {{processingStrategy}}", + "custom-properties": "カスタムプロパティ", + "custom-properties-hint": "カスタムキュー(トピック)作成プロパティ。例: 'retention.ms:604800000;retention.bytes:1048576000'", + "strategies": { + "sequential-by-originator-label": "オリジネーター別に順次処理", + "sequential-by-originator-hint": "例: デバイスAの新しいメッセージは、デバイスAの前のメッセージがACKされるまで送信されません", + "sequential-by-tenant-label": "テナント別に順次処理", + "sequential-by-tenant-hint": "例: テナントAの新しいメッセージは、テナントAの前のメッセージがACKされるまで送信されません", + "sequential-label": "順次処理", + "sequential-hint": "新しいメッセージは、前のメッセージがACKされるまで送信されません", + "burst-label": "バースト", + "burst-hint": "すべてのメッセージは到着した順にルールチェーンへ送信されます", + "batch-label": "バッチ", + "batch-hint": "新しいバッチは、前のバッチがACKされるまで送信されません", + "skip-all-failures-label": "すべての失敗をスキップ", + "skip-all-failures-hint": "すべての失敗を無視します", + "skip-all-failures-and-timeouts-label": "すべての失敗とタイムアウトをスキップ", + "skip-all-failures-and-timeouts-hint": "すべての失敗とタイムアウトを無視します", + "retry-all-label": "すべて再試行", + "retry-all-hint": "処理パック内のすべてのメッセージを再試行します", + "retry-failed-label": "失敗を再試行", + "retry-failed-hint": "処理パック内の失敗したメッセージをすべて再試行します", + "retry-timeout-label": "タイムアウトを再試行", + "retry-timeout-hint": "処理パック内のタイムアウトしたメッセージをすべて再試行します", + "retry-failed-and-timeout-label": "失敗とタイムアウトを再試行", + "retry-failed-and-timeout-hint": "処理パック内の失敗したメッセージとタイムアウトしたメッセージをすべて再試行します" + } + }, + "queue-statistics": { + "queue-statistics": "キュー統計", + "no-queue-statistics-matching": "'{{entity}}' に一致するキュー統計が見つかりませんでした。", + "queue-statistics-required": "キュー統計は必須です。", + "list-of-queue-statistics": "{ count, plural, =1 {キュー統計 1 件} other {キュー統計 # 件の一覧} }", + "selected-queue-statistics": "{ count, plural, =1 {キュー統計 1 件} other {キュー統計 # 件} } を選択", + "no-queue-statistics-text": "キュー統計が見つかりません", + "queue-statistics-starts-with": "名前が '{{prefix}}' で始まるキュー統計" + }, + "server-error": { + "general": "一般サーバーエラー", + "authentication": "認証エラー", + "jwt-token-expired": "JWTトークンの有効期限切れ", + "tenant-trial-expired": "テナントのトライアル期限切れ", + "credentials-expired": "認証情報の有効期限切れ", + "permission-denied": "権限がありません", + "invalid-arguments": "引数が無効です", + "bad-request-params": "リクエストパラメータが不正です", + "item-not-found": "項目が見つかりません", + "too-many-requests": "リクエストが多すぎます", + "too-many-updates": "更新が多すぎます", + "entities-limit-exceeded": "エンティティ上限を超えました" + }, + "tenant": { + "tenant": "テナント", + "tenants": "テナント", + "management": "テナント管理", + "add": "テナントを追加", + "admins": "管理者", + "manage-tenant-admins": "テナント管理者を管理", + "delete": "テナントを削除", + "add-tenant-text": "新しいテナントを追加", + "no-tenants-text": "テナントが見つかりません", + "tenant-details": "テナント詳細", + "title-max-length": "タイトルは 256 未満にしてください", + "delete-tenant-title": "テナント '{{tenantTitle}}' を削除してもよろしいですか?", + "delete-tenant-text": "注意: 確認後、テナントと関連データはすべて復元できなくなります。", + "delete-tenants-title": "{ count, plural, =1 {テナント 1 件} other {テナント # 件} } を削除してもよろしいですか?", + "delete-tenants-action-title": "{ count, plural, =1 {テナント 1 件} other {テナント # 件} } を削除", + "delete-tenants-text": "注意: 確認後、選択したすべてのテナントが削除され、関連データはすべて復元できなくなります。", + "title": "タイトル", + "title-required": "タイトルは必須です。", + "description": "説明", + "details": "詳細", + "events": "イベント", + "copyId": "テナントIDをコピー", + "idCopiedMessage": "テナントIDがクリップボードにコピーされました", + "select-tenant": "テナントを選択", + "no-tenants-matching": "'{{entity}}' に一致するテナントが見つかりませんでした。", + "tenant-required": "テナントは必須です", + "search": "テナントを検索", + "selected-tenants": "{ count, plural, =1 {テナント 1 件} other {テナント # 件} } を選択", + "isolated-tb-rule-engine": "分離された ThingsBoard ルールエンジン キューを使用", + "isolated-tb-rule-engine-details": "各テナントに専用のルールエンジンキューが割り当てられます" + }, + "tenant-profile": { + "tenant-profile": "テナントプロファイル", + "tenant-profiles": "テナントプロファイル", + "add": "テナントプロファイルを追加", + "add-profile": "プロファイルを追加", + "debug": "デバッグ", + "edit": "テナントプロファイルを編集", + "tenant-profile-details": "テナントプロファイル詳細", + "no-tenant-profiles-text": "テナントプロファイルが見つかりません", + "name-max-length": "名前は 256 未満にしてください", + "search": "テナントプロファイルを検索", + "selected-tenant-profiles": "{ count, plural, =1 {テナントプロファイル 1 件} other {テナントプロファイル # 件} } を選択", + "no-tenant-profiles-matching": "'{{entity}}' に一致するテナントプロファイルが見つかりませんでした。", + "tenant-profile-required": "テナントプロファイルは必須です", + "idCopiedMessage": "テナントプロファイルIDがクリップボードにコピーされました", + "set-default": "テナントプロファイルをデフォルトに設定", + "delete": "テナントプロファイルを削除", + "copyId": "テナントプロファイルIDをコピー", + "name": "名前", + "name-required": "名前は必須です。", + "data": "プロファイルデータ", + "profile-configuration": "プロファイル設定", + "description": "説明", + "default": "デフォルト", + "delete-tenant-profile-title": "テナントプロファイル '{{tenantProfileName}}' を削除してもよろしいですか?", + "delete-tenant-profile-text": "注意: 確認後、テナントプロファイルと関連データはすべて復元できなくなります。", + "delete-tenant-profiles-title": "{ count, plural, =1 {テナントプロファイル 1 件} other {テナントプロファイル # 件} } を削除してもよろしいですか?", + "delete-tenant-profiles-text": "注意: 確認後、選択したすべてのテナントプロファイルが削除され、関連データはすべて復元できなくなります。", + "set-default-tenant-profile-title": "テナントプロファイル '{{tenantProfileName}}' をデフォルトに設定してもよろしいですか?", + "set-default-tenant-profile-text": "確認後、このテナントプロファイルはデフォルトとしてマークされ、プロファイルが指定されていない新しいテナントに使用されます。", + "no-tenant-profiles-found": "テナントプロファイルが見つかりません。", + "create-new-tenant-profile": "新規作成!", + "create-tenant-profile": "新しいテナントプロファイルを作成", + "import": "テナントプロファイルをインポート", + "export": "テナントプロファイルをエクスポート", + "export-failed-error": "テナントプロファイルをエクスポートできません: {{error}}", + "tenant-profile-file": "テナントプロファイルファイル", + "invalid-tenant-profile-file-error": "テナントプロファイルをインポートできません: テナントプロファイルのデータ構造が無効です。", + "advanced-settings": "詳細設定", + "entities": "エンティティ", + "rule-engine": "ルールエンジン", + "time-to-live": "TTL", + "calculated-fields": "計算フィールド", + "alarms-and-notifications": "アラームと通知", + "ota-files-in-bytes": "ファイル", + "ws-title": "WS", + "unlimited": "(0 - 無制限)", + "maximum-devices": "デバイス最大数", + "maximum-devices-required": "デバイス最大数は必須です。", + "maximum-devices-range": "デバイス最大数は負にできません", + "maximum-assets": "アセット最大数", + "maximum-assets-required": "アセット最大数は必須です。", + "maximum-assets-range": "アセット最大数は負にできません", + "maximum-customers": "顧客最大数", + "maximum-customers-required": "顧客最大数は必須です。", + "maximum-customers-range": "顧客最大数は負にできません", + "maximum-users": "ユーザー最大数", + "maximum-users-required": "ユーザー最大数は必須です。", + "maximum-users-range": "ユーザー最大数は負にできません", + "maximum-dashboards": "ダッシュボード最大数", + "maximum-dashboards-required": "ダッシュボード最大数は必須です。", + "maximum-dashboards-range": "ダッシュボード最大数は負にできません", + "maximum-edges": "Edge 最大数", + "maximum-edges-required": "Edge 最大数は必須です。", + "maximum-edges-range": "Edge 最大数は負にできません", + "maximum-rule-chains": "ルールチェーン最大数", + "maximum-rule-chains-required": "ルールチェーン最大数は必須です。", + "maximum-rule-chains-range": "ルールチェーン最大数は負にできません", + "maximum-resources-sum-data-size": "リソースファイルの合計最大サイズ(バイト)", + "maximum-resources-sum-data-size-required": "リソースファイルの合計最大サイズは必須です。", + "maximum-resources-sum-data-size-range": "リソースファイルの合計最大サイズは負にできません", + "maximum-resource-size": "リソースファイルの最大サイズ(バイト)", + "maximum-resource-size-required": "リソースファイルの最大サイズは必須です", + "maximum-resource-size-range": "リソースファイルの最大サイズは負にできません", + "maximum-ota-packages-sum-data-size": "OTAパッケージファイルの合計最大サイズ(バイト)", + "maximum-ota-package-sum-data-size-required": "OTAパッケージファイルの合計最大サイズは必須です。", + "maximum-ota-package-sum-data-size-range": "OTAパッケージファイルの合計最大サイズは負にできません", + "maximum-debug-duration-min": "最大デバッグ時間(分)", + "maximum-debug-duration-min-range": "最大デバッグ時間は負にできません", + "rest-requests-for-tenant": "テナントのRESTリクエスト", + "transport-tenant-telemetry-msg-rate-limit": "トランスポート:テナントのテレメトリメッセージ", + "transport-tenant-telemetry-data-points-rate-limit": "トランスポート:テナントのテレメトリデータポイント", + "transport-device-msg-rate-limit": "トランスポート:デバイスメッセージ", + "transport-device-telemetry-msg-rate-limit": "トランスポート:デバイスのテレメトリメッセージ", + "transport-device-telemetry-data-points-rate-limit": "トランスポート:デバイスのテレメトリデータポイント", + "transport-gateway-msg-rate-limit": "トランスポート:Gatewayメッセージ", + "transport-gateway-telemetry-msg-rate-limit": "トランスポート:Gatewayのテレメトリメッセージ", + "transport-gateway-telemetry-data-points-rate-limit": "トランスポート:Gatewayのテレメトリデータポイント", + "transport-gateway-device-msg-rate-limit": "トランスポート:Gatewayデバイスメッセージ", + "transport-gateway-device-telemetry-msg-rate-limit": "トランスポート:Gatewayデバイスのテレメトリメッセージ", + "transport-gateway-device-telemetry-data-points-rate-limit": "トランスポート:Gatewayデバイスのテレメトリデータポイント", + "tenant-entity-export-rate-limit": "エンティティバージョン作成", + "tenant-entity-import-rate-limit": "エンティティバージョン読み込み", + "tenant-notification-request-rate-limit": "通知リクエスト", + "tenant-notification-requests-per-rule-rate-limit": "通知ルールごとの通知リクエスト", + "max-calculated-fields": "エンティティあたりの計算フィールド最大数", + "max-calculated-fields-range": "エンティティあたりの計算フィールド最大数は負にできません", + "max-calculated-fields-required": "エンティティあたりの計算フィールド最大数は必須です", + "max-data-points-per-rolling-arg": "ローリング引数の最大データポイント数", + "max-data-points-per-rolling-arg-range": "ローリング引数の最大データポイント数は負にできません", + "max-data-points-per-rolling-arg-required": "ローリング引数の最大データポイント数は必須です", + "max-arguments-per-cf": "計算フィールドあたりの引数最大数", + "max-arguments-per-cf-range": "計算フィールドあたりの引数最大数は負にできません", + "max-arguments-per-cf-required": "計算フィールドあたりの引数最大数は必須です", + "max-related-level-per-argument": "「関連エンティティ」引数あたりの最大リレーションレベル", + "max-related-level-per-argument-range": "「関連エンティティ」引数あたりのリレーションレベルの最大値は '1' 未満にできません", + "max-related-level-per-argument-required": "「関連エンティティ」引数あたりのリレーションレベルの最大値は必須です", + "min-allowed-scheduled-update-interval": "「関連エンティティ」引数の許可される最小更新間隔(秒)", + "min-allowed-scheduled-update-interval-range": "許可される最小更新間隔の最小値は負の値にできません", + "min-allowed-deduplication-interval": "許可される最小重複排除間隔(秒)", + "min-allowed-deduplication-interval-range": "許可される最小重複排除間隔の値は負の値にできません", + "min-allowed-deduplication-interval-required": "許可される最小重複排除間隔は必須です", + "intermediate-aggregation-interval": "中間集計間隔(秒)", + "intermediate-aggregation-interval-range": "中間集計間隔の値は '1' 未満にできません", + "intermediate-aggregation-interval-required": "中間集計間隔は必須です", + "reevaluation-check-interval": "再評価チェック間隔(秒)", + "reevaluation-check-interval-range": "再評価チェック間隔の値は '1' 未満にできません", + "reevaluation-check-interval-required": "再評価チェック間隔は必須です", + "alarms-reevaluation-interval": "アラーム再評価間隔(秒)", + "alarms-reevaluation-interval-range": "アラーム再評価間隔の値は '1' 未満にできません", + "alarms-reevaluation-interval-required": "アラーム再評価間隔は必須です", + "min-allowed-aggregation-interval": "許可される最小集計間隔(秒)", + "min-allowed-aggregation-interval-range": "許可される最小集計間隔の値は負の値にできません", + "min-allowed-aggregation-interval-required": "許可される最小集計間隔は必須です", + "min-allowed-scheduled-update-interval-required": "許可される最小更新間隔の最小値は必須です", + "max-state-size": "状態の最大サイズ(KB)", + "max-state-size-range": "状態の最大サイズ(KB)は負にできません", + "max-state-size-required": "状態の最大サイズ(KB)は必須です", + "max-value-argument-size": "単一値引数の最大サイズ(KB)", + "max-value-argument-size-range": "単一値引数の最大サイズ(KB)は負にできません", + "max-value-argument-size-required": "単一値引数の最大サイズ(KB)は必須です", + "max-transport-messages": "トランスポートメッセージ最大数", + "max-transport-messages-required": "トランスポートメッセージ最大数は必須です。", + "max-transport-messages-range": "トランスポートメッセージ最大数は負にできません", + "max-transport-data-points": "トランスポートデータポイント最大数 ", + "max-transport-data-points-required": "トランスポートデータポイント最大数 は必須です。", + "max-transport-data-points-range": "トランスポートデータポイント最大数 は負にできません", + "max-r-e-executions": "ルールエンジン実行最大数", + "max-r-e-executions-required": "ルールエンジン実行最大数は必須です。", + "max-r-e-executions-range": "ルールエンジン実行最大数は負にできません", + "max-j-s-executions": "JavaScript 実行最大数 ", + "max-j-s-executions-required": "JavaScript 実行最大数 は必須です。", + "max-j-s-executions-range": "JavaScript 実行最大数 は負にできません", + "max-tbel-executions": "TBEL 実行最大数", + "max-tbel-executions-required": "TBEL 実行最大数は必須です。", + "max-tbel-executions-range": "TBEL 実行最大数は負にできません", + "max-d-p-storage-days": "データポイント保存日数最大数", + "max-d-p-storage-days-required": "データポイント保存日数最大数は必須です。", + "max-d-p-storage-days-range": "データポイント保存日数最大数は負にできません", + "default-storage-ttl-days": "デフォルトのストレージ TTL 日数", + "default-storage-ttl-days-required": "デフォルトのストレージ TTL 日数は必須です。", + "default-storage-ttl-days-range": "デフォルトのストレージ TTL 日数は負にできません", + "alarms-ttl-days": "アラーム TTL 日数", + "alarms-ttl-days-required": "アラーム TTL 日数は必須です", + "alarms-ttl-days-days-range": "アラーム TTL 日数は負にできません", + "rpc-ttl-days": "RPC TTL 日数", + "rpc-ttl-days-required": "RPC TTL 日数は必須です", + "rpc-ttl-days-days-range": "RPC TTL 日数は負にできません", + "queue-stats-ttl-days": "キュー統計 TTL 日数", + "queue-stats-ttl-days-required": "キュー統計 TTL 日数は必須です", + "queue-stats-ttl-days-range": "キュー統計 TTL 日数は負にできません", + "rule-engine-exceptions-ttl-days": "ルールエンジン例外 TTL 日数", + "rule-engine-exceptions-ttl-days-required": "ルールエンジン例外 TTL 日数は必須です", + "rule-engine-exceptions-ttl-days-range": "ルールエンジン例外 TTL 日数は負にできません", + "max-rule-node-executions-per-message": "メッセージあたりのルールノード実行最大数", + "max-rule-node-executions-per-message-required": "メッセージあたりのルールノード実行最大数は必須です。", + "max-rule-node-executions-per-message-range": "メッセージあたりのルールノード実行最大数は負にできません", + "max-emails": "送信 Emails 最大数", + "max-emails-required": "送信 Emails 最大数は必須です。", + "max-emails-range": "送信 Emails 最大数は負にできません", + "sms-enabled": "SMS を有効化", + "max-sms": "送信 SMS 最大数", + "max-sms-required": "送信 SMS 最大数は必須です。", + "max-sms-range": "送信 SMS 最大数は負にできません", + "max-created-alarms": "作成アラーム最大数", + "max-created-alarms-required": "作成アラーム最大数は必須です。", + "max-created-alarms-range": "作成アラーム最大数は負にできません", + "no-queue": "キューが設定されていません", + "add-queue": "キューを追加", + "queues-with-count": "キュー({{count}})", + "tenant-rest-limits": "テナントのRESTリクエスト", + "customer-rest-limits": "顧客のRESTリクエスト", + "incorrect-pattern-for-rate-limits": "形式は、容量と期間(秒)のペアをカンマ区切りにし、ペア内はコロンで区切ります。例: 100:1,2000:60", + "too-small-value-zero": "値は 0 より大きい必要があります", + "too-small-value-one": "値は 1 より大きい必要があります", + "queue-size-is-limited-by-system-configuration": "キューのサイズはシステム設定によっても制限されます。", + "cassandra-write-tenant-core-limits-configuration": "Rest API Cassandra 書き込みクエリ", + "cassandra-read-tenant-core-limits-configuration": "Rest API および WS テレメトリ Cassandra 読み取りクエリ", + "cassandra-write-tenant-rule-engine-limits-configuration": "ルールエンジンテレメトリ Cassandra 書き込みクエリ", + "cassandra-read-tenant-rule-engine-limits-configuration": "ルールエンジンテレメトリ Cassandra 読み取りクエリ", + "ws-limit-max-sessions-per-tenant": "テナントあたりのセッション最大数", + "ws-limit-max-sessions-per-customer": "顧客あたりのセッション最大数", + "ws-limit-max-sessions-per-regular-user": "通常ユーザーあたりのセッション最大数", + "ws-limit-max-sessions-per-public-user": "パブリックユーザーあたりのセッション最大数", + "ws-limit-queue-per-session": "セッションあたりのメッセージキュー最大サイズ", + "ws-limit-max-subscriptions-per-tenant": "テナントあたりのサブスクリプション最大数", + "ws-limit-max-subscriptions-per-customer": "顧客あたりのサブスクリプション最大数", + "ws-limit-max-subscriptions-per-regular-user": "通常ユーザーあたりのサブスクリプション最大数", + "ws-limit-max-subscriptions-per-public-user": "パブリックユーザーあたりのサブスクリプション最大数", + "ws-limit-updates-per-session": "セッションあたりの WS 更新", + "relation-search-entity-limit": "リレーション検索エンティティ上限", + "relation-search-entity-limit-hint": "リレーションパスの最終レベルで解決されるエンティティ数を制限します。「関連エンティティ」引数および伝播フィールドに適用されます。", + "relation-search-entity-limit-required": "リレーション検索エンティティ上限は必須です", + "relation-search-entity-limit-range": "リレーション検索エンティティ上限は '1' 未満にできません", + "rate-limits": { + "add-limit": "制限を追加", + "and-also-less-than": "かつ次より小さい", + "advanced-settings": "詳細設定", + "edit-limit": "制限を編集", + "calculated-field-debug-event-rate-limit": "計算フィールドのデバッグイベント", + "edit-calculated-field-debug-event-rate-limit": "計算フィールドのデバッグイベントのレート制限を編集", + "edit-transport-tenant-msg-title": "トランスポート:テナントメッセージのレート制限を編集", + "edit-transport-tenant-telemetry-msg-title": "トランスポート:テナントのテレメトリメッセージのレート制限を編集", + "edit-transport-tenant-telemetry-data-points-title": "トランスポート:テナントのテレメトリデータポイントのレート制限を編集", + "edit-transport-device-msg-title": "トランスポート:デバイスメッセージのレート制限を編集", + "edit-transport-device-telemetry-msg-title": "トランスポート:デバイスのテレメトリメッセージのレート制限を編集", + "edit-transport-device-telemetry-data-points-title": "トランスポート:デバイスのテレメトリデータポイントのレート制限を編集", + "edit-transport-gateway-msg-title": "トランスポート:Gatewayメッセージのレート制限を編集", + "edit-transport-gateway-telemetry-msg-title": "トランスポート:Gatewayのテレメトリメッセージのレート制限を編集", + "edit-transport-gateway-telemetry-data-points-title": "トランスポート:Gatewayのテレメトリデータポイントのレート制限を編集", + "edit-transport-gateway-device-msg-title": "トランスポート:Gatewayデバイスメッセージのレート制限を編集", + "edit-transport-gateway-device-telemetry-msg-title": "トランスポート:Gatewayデバイスのテレメトリメッセージのレート制限を編集", + "edit-transport-gateway-device-telemetry-data-points-title": "トランスポート:Gatewayデバイスのテレメトリデータポイントのレート制限を編集", + "edit-tenant-rest-limits-title": "テナントのRESTリクエストのレート制限を編集", + "edit-customer-rest-limits-title": "顧客のRESTリクエストのレート制限を編集", + "edit-ws-limit-updates-per-session-title": "セッションあたりの WS 更新のレート制限を編集", + "edit-cassandra-write-tenant-core-limits-configuration": "Rest API Cassandra 書き込みクエリを編集", + "edit-cassandra-read-tenant-core-limits-configuration": "Rest API および WS テレメトリ Cassandra 読み取りクエリを編集", + "edit-cassandra-write-tenant-rule-engine-limits-configuration": "ルールエンジンテレメトリ Cassandra 書き込みクエリを編集", + "edit-cassandra-read-tenant-rule-engine-limits-configuration": "ルールエンジンテレメトリ Cassandra 読み取りクエリを編集", + "edit-tenant-entity-export-rate-limit-title": "エンティティバージョン作成のレート制限を編集", + "edit-tenant-entity-import-rate-limit-title": "エンティティバージョン読み込みのレート制限を編集", + "edit-tenant-notification-request-rate-limit-title": "通知リクエストのレート制限を編集", + "edit-tenant-notification-requests-per-rule-rate-limit-title": "通知ルールごとの通知リクエストのレート制限を編集", + "edit-edge-events-rate-limit": "Edge イベントのレート制限を編集", + "edit-edge-events-per-edge-rate-limit": "Edge あたりの Edge イベントのレート制限を編集", + "edge-events-rate-limit": "Edge イベント", + "edge-events-per-edge-rate-limit": "Edge あたりの Edge イベント", + "edit-edge-uplink-messages-rate-limit": "Edge アップリンクメッセージのレート制限を編集", + "edit-edge-uplink-messages-per-edge-rate-limit": "Edge あたりの Edge アップリンクメッセージのレート制限を編集", + "edge-uplink-messages-rate-limit": "Edge アップリンクメッセージ", + "edge-uplink-messages-per-edge-rate-limit": "Edge あたりの Edge アップリンクメッセージ", + "messages-per": "次あたりのメッセージ数", + "not-set": "未設定", + "number-of-messages": "メッセージ数", + "number-of-messages-required": "メッセージ数は必須です。", + "number-of-messages-min": "最小値は 1 です。", + "preview": "プレビュー", + "per-seconds": "秒あたり", + "per-seconds-required": "時間レートは必須です。", + "per-seconds-min": "最小値は 1 です。", + "per-seconds-duplicate": "時間レートが重複しています。各時間間隔は一意である必要があります。", + "rate-limits": "レート制限", + "remove-limit": "制限を削除", + "transport-tenant-msg": "トランスポート:テナントメッセージ", + "transport-tenant-telemetry-msg": "トランスポート:テナントのテレメトリメッセージ", + "transport-tenant-telemetry-data-points": "トランスポート:テナントのテレメトリデータポイント", + "transport-device-msg": "トランスポート:デバイスメッセージ", + "transport-device-telemetry-msg": "トランスポート:デバイスのテレメトリメッセージ", + "transport-device-telemetry-data-points": "トランスポート:デバイスのテレメトリデータポイント", + "transport-gateway-msg": "トランスポート:Gatewayメッセージ", + "transport-gateway-telemetry-msg": "トランスポート:Gatewayのテレメトリメッセージ", + "transport-gateway-telemetry-data-points": "トランスポート:Gatewayのテレメトリデータポイント", + "transport-gateway-device-msg": "トランスポート:Gatewayデバイスメッセージ", + "transport-gateway-device-telemetry-msg": "トランスポート:Gatewayデバイスのテレメトリメッセージ", + "transport-gateway-device-telemetry-data-points": "トランスポート:Gatewayデバイスのテレメトリデータポイント", + "sec": "秒" + } + }, + "timeinterval": { + "seconds-interval": "{ seconds, plural, =1 {1秒} other {#秒} }", + "minutes-interval": "{ minutes, plural, =1 {1分} other {#分} }", + "hours-interval": "{ hours, plural, =1 {1時間} other {#時間} }", + "days-interval": "{ days, plural, =1 {1日} other {#日} }", + "days": "日", + "hours": "時間", + "minutes": "分", + "seconds": "秒", + "advanced": "高度な設定", + "custom": "カスタム", + "predefined": { + "yesterday": "昨日", + "day-before-yesterday": "一昨日", + "this-day-last-week": "先週の同じ日", + "previous-week": "前週(日 - 土)", + "previous-week-iso": "前週(月 - 日)", + "previous-month": "前月", + "previous-quarter": "前四半期", + "previous-half-year": "前半期", + "previous-year": "前年", + "current-hour": "現在の時間", + "current-day": "今日", + "current-day-so-far": "今日(現在まで)", + "current-week": "今週(日 - 土)", + "current-week-iso": "今週(月 - 日)", + "current-week-so-far": "今週(現在まで)(日 - 土)", + "current-week-iso-so-far": "今週(現在まで)(月 - 日)", + "current-month": "今月", + "current-month-so-far": "今月(現在まで)", + "current-quarter": "今四半期", + "current-quarter-so-far": "今四半期(現在まで)", + "current-half-year": "今半期", + "current-half-year-so-far": "今半期(現在まで)", + "current-year": "今年", + "current-year-so-far": "今年(現在まで)" + }, + "type": { + "week": "週(日 - 土)", + "week-iso": "週(月 - 日)", + "month": "月", + "quarter": "四半期" + } + }, + "timeunit": { + "milliseconds": "ミリ秒", + "seconds": "秒", + "minutes": "分", + "hours": "時間", + "days": "日" + }, + "timewindow": { + "timewindow": "時間範囲", + "timewindow-settings": "時間範囲設定", + "years": "{ years, plural, =1 {1年 } other {#年 } }", + "years-short": "{{ years }}年", + "months": "{ months, plural, =1 {1か月 } other {#か月 } }", + "months-short": "{{ months }}か月", + "weeks": "{ weeks, plural, =1 {1週 } other {#週 } }", + "weeks-short": "{{ weeks }}週", + "days": "{ days, plural, =1 {1日 } other {#日 } }", + "days-short": "{{ days }}日", + "hours": "{ hours, plural, =0 {時間 } =1 {1時間 } other {#時間 } }", + "hr": "{{ hr }} 時間", + "hr-short": "{{ hr }}時間", + "minutes": "{ minutes, plural, =0 {分 } =1 {1分 } other {#分 } }", + "min": "{{ min }} 分", + "min-short": "{{ min }}分", + "seconds": "{ seconds, plural, =0 {秒 } =1 {1秒 } other {#秒 } }", + "sec": "{{ sec }} 秒", + "sec-short": "{{ sec }}秒", + "short": { + "years": "{ years, plural, =1 {1年 } other {#年 } }", + "days": "{ days, plural, =1 {1日 } other {#日 } }", + "hours": "{ hours, plural, =1 {1時間 } other {#時間 } }", + "minutes": "{{minutes}} 分 ", + "seconds": "{{seconds}} 秒 " + }, + "realtime": "リアルタイム", + "history": "履歴", + "last-prefix": "過去", + "period": "{{ startTime }} から {{ endTime }} まで", + "edit": "時間範囲を編集", + "date-range": "日付範囲", + "for-all-time": "全期間", + "last": "過去", + "time-period": "期間", + "hide": "非表示", + "interval": "間隔", + "just-now": "たった今", + "just-now-lower": "たった今", + "ago": "前", + "style": "時間範囲スタイル", + "icon": "アイコン", + "icon-position": "アイコン位置", + "icon-position-left": "左", + "icon-position-right": "右", + "font": "フォント", + "color": "色", + "displayTypePrefix": "リアルタイム/履歴のプレフィックスを表示", + "preview": "プレビュー", + "relative": "相対", + "range": "範囲", + "hide-timewindow-section": "エンドユーザーに時間範囲セクションを表示しない", + "hide-last-interval": "エンドユーザーに「過去」間隔を表示しない", + "hide-relative-interval": "エンドユーザーに相対間隔を表示しない", + "hide-fixed-interval": "エンドユーザーに固定間隔を表示しない", + "hide-aggregation": "エンドユーザーに集計を表示しない", + "hide-group-interval": "エンドユーザーにグルーピング間隔を表示しない", + "hide-max-values": "エンドユーザーに最大値を表示しない", + "hide-timezone": "エンドユーザーにタイムゾーンを表示しない", + "disable-custom-interval": "カスタム間隔の選択を無効化", + "edit-aggregation-functions-list": "集計関数リストを編集", + "edit-aggregation-functions-list-hint": "利用可能なオプションのリストを指定できます。", + "allowed-aggregation-functions": "許可された集計関数", + "edit-intervals-list": "間隔リストを編集", + "allowed-agg-intervals": "グルーピング間隔", + "default-agg-interval": "デフォルトのグルーピング間隔", + "edit-intervals-list-hint": "利用可能な間隔オプションのリストを指定できます。", + "edit-grouping-intervals-list-hint": "グルーピング間隔リストとデフォルトのグルーピング間隔を設定できます。", + "all": "すべて", + "save-current-settings-as-default": "現在の設定を既定の時間ウィンドウとして保存", + "hide-option-from-end-users": "エンドユーザーにオプションを表示しない" + }, + "tooltip": { + "trigger": "トリガー", + "trigger-point": "ポイント", + "trigger-axis": "軸", + "label": "ラベル", + "value": "値", + "date": "日付", + "show-date-time-interval": "日時間隔を表示", + "show-date-time-interval-hint": "データ集計に従って日時間隔を表示します。", + "hide-zero-tooltip-values": "0 の値を非表示", + "show-stack-total": "積み上げモードで合計値を表示", + "background-color": "背景色", + "background-blur": "背景のぼかし" + }, + "unit": { + "set-unit-conversion": "単位変換を設定", + "unit-settings": { + "unit-settings": "単位設定", + "source-unit": "元の単位", + "source-unit-hint": "これは保存された値の単位です。変換元の単位です。元データで使用されている記号を入力してください(例: m, km, ft, in)。", + "target-metric-unit": "変換先のメートル法単位", + "target-metric-unit-hint": "元の値を変換するメートル法(SI)の単位を選択します(例: cm, mm, km)。", + "target-imperial-unit": "変換先のヤード・ポンド法単位", + "target-imperial-unit-hint": "元の値を変換するヤード・ポンド法の単位を選択します(例: in, ft, yd)。", + "target-hybrid-unit": "変換先のハイブリッド単位", + "target-hybrid-unit-hint": "元の値を変換するハイブリッド単位を選択します(例: cm, in, km)。ハイブリッド単位はメートル法またはヤード・ポンド法の単位を組み合わせます。", + "enable-unit-conversion": "単位変換を有効化", + "enable-unit-conversion-hint": "オンにすると変換が有効になります。オフの場合、元の値は変更されずにそのまま渡されます。対応する測定グループに単位が 1 つしかない場合(例: Luminous flux, AQI)は無効になります。" + }, + "unit-system": "単位系", + "unit-system-type": { + "AUTO": "自動", + "METRIC": "メートル法", + "IMPERIAL": "ヤード・ポンド法", + "HYBRID": "ハイブリッド" + }, + "measures": { + "absorbed-dose-rate": "吸収線量率", + "acceleration": "加速度", + "acidity": "酸性度", + "air-quality-index": "大気質指数", + "amount-of-substance": "物質量", + "angle": "角度", + "angular-acceleration": "角加速度", + "area": "面積", + "area-density": "面密度", + "capacitance": "静電容量", + "catalytic-activity": "触媒活性", + "catalytic-concentration": "触媒濃度", + "charge": "電荷", + "current-density": "電流密度", + "data-transfer-rate": "データ転送速度", + "density": "密度", + "digital": "デジタル", + "dimension-ratio": "寸法比", + "dynamic-viscosity": "粘度", + "earthquake-magnitude": "地震マグニチュード", + "electric-charge-density": "電荷密度", + "electric-current": "電流", + "electric-dipole-moment": "電気双極子モーメント", + "electric-field-strength": "電界強度", + "electric-flux": "電束", + "electric-permittivity": "誘電率", + "electric-polarizability": "電気分極率", + "electrical-conductance": "電気コンダクタンス", + "electrical-conductivity": "電気伝導率", + "energy": "エネルギー", + "energy-density": "エネルギー密度", + "force": "力", + "frequency": "周波数", + "fuel-efficiency": "燃費", + "heat-capacity": "熱容量", + "illuminance": "照度", + "inductance": "インダクタンス", + "kinematic-viscosity": "動粘度", + "length": "長さ", + "light-exposure": "露光量", + "linear-charge-density": "線電荷密度", + "logarithmic-ratio": "対数比", + "luminous-efficacy": "発光効率", + "luminous-flux": "光束", + "luminous-intensity": "光度", + "magnetic-field-gradient": "磁場勾配", + "magnetic-flux": "磁束", + "magnetic-flux-density": "磁束密度", + "magnetic-moment": "磁気モーメント", + "magnetic-permeability": "透磁率", + "mass": "質量", + "mass-fraction": "質量分率", + "molar-concentration": "モル濃度", + "molar-energy": "モルエネルギー", + "molar-heat-capacity": "モル熱容量", + "molar-mass": "モル質量", + "number-concentration": "数濃度", + "parts-per-million": "ppm", + "power": "電力", + "power-density": "電力密度", + "pressure": "圧力", + "radiance": "放射輝度", + "radiant-intensity": "放射強度", + "radiation-dose": "放射線量", + "radioactive-decay": "放射性崩壊", + "radioactivity": "放射能", + "radioactivity-concentration": "放射能濃度", + "reciprocal-length": "逆長さ", + "resistance": "抵抗", + "reynolds-number": "レイノルズ数", + "signal-level": "信号レベル", + "solid-angle": "立体角", + "specific-energy": "比エネルギー", + "specific-heat-capacity": "比熱容量", + "specific-humidity": "比湿", + "specific-volume": "比容積", + "speed": "速度", + "surface-charge-density": "表面電荷密度", + "surface-tension": "表面張力", + "temperature": "温度", + "thermal-conductivity": "熱伝導率", + "time": "時間", + "torque": "トルク", + "turbidity": "濁度", + "voltage": "電圧", + "volume": "体積", + "volume-flow": "体積流量" + }, + "millimeter": "ミリメートル", + "centimeter": "センチメートル", + "decimeter": "デシメートル", + "angstrom": "オングストローム", + "nanometer": "ナノメートル", + "micrometer": "マイクロメートル", + "meter": "メートル", + "kilometer": "キロメートル", + "inch": "インチ", + "foot": "フィート", + "foot-us": "フィート(米国測量)", + "yard": "ヤード", + "mile": "マイル", + "nautical-mile": "海里", + "astronomical-unit": "天文単位", + "reciprocal-metre": "逆メートル", + "meter-per-meter": "メートル毎メートル", + "steradian": "ステラジアン", + "thou": "サウ", + "barleycorn": "バーレイコーン", + "hand": "ハンド", + "chain": "チェーン", + "furlong": "ファーロング", + "league": "リーグ", + "fathom": "ファゾム", + "cable": "ケーブル", + "link": "リンク", + "rod": "ロッド", + "nanogram": "ナノグラム", + "microgram": "マイクログラム", + "milligram": "ミリグラム", + "gram": "グラム", + "kilogram": "キログラム", + "tonne": "トン", + "ounce": "オンス", + "pound": "ポンド", + "stone": "ストーン", + "hundredweight-count": "ハンドレッドウェイト(カウント)", + "short-tons": "ショートトン", + "dalton": "ダルトン", + "grain": "グレーン", + "drachm": "ドラクム", + "quarter": "クォーター", + "slug": "スラグ", + "carat": "カラット", + "cubic-millimeter": "立方ミリメートル", + "cubic-centimeter": "立方センチメートル", + "cubic-meter": "立方メートル", + "cubic-kilometer": "立方キロメートル", + "microliter": "マイクロリットル", + "milliliter": "ミリリットル", + "liter": "リットル", + "hectoliter": "ヘクトリットル", + "cubic-inch": "立方インチ", + "cubic-foot": "立方フィート", + "cubic-yard": "立方ヤード", + "fluid-ounce": "液量オンス", + "fluid-ounce-per-second": "液量オンス毎秒", + "pint": "パイント", + "quart": "クォート", + "gallon": "ガロン", + "oil-barrels": "バレル(石油)", + "cubic-meter-per-kilogram": "立方メートル毎キログラム", + "gill": "ジル", + "hogshead": "ホッグスヘッド", + "teaspoon": "ティースプーン", + "tablespoon": "テーブルスプーン", + "cup": "カップ", + "celsius": "摂氏", + "kelvin": "ケルビン", + "rankine": "ランキン", + "fahrenheit": "華氏", + "percent": "パーセント", + "meter-per-second": "メートル毎秒", + "kilometer-per-hour": "キロメートル毎時", + "foot-per-second": "フィート毎秒", + "foot-per-minute": "フィート毎分", + "mile-per-hour": "マイル毎時", + "knot": "ノット", + "inch-per-second": "インチ毎秒", + "inch-per-hour": "インチ毎時", + "millimeters-per-minute": "ミリメートル毎分", + "meter-per-minute": "メートル毎分", + "kilometer-per-hour-squared": "キロメートル毎時毎時", + "foot-per-second-squared": "フィート毎秒毎秒", + "pascal": "パスカル", + "kilopascal": "キロパスカル", + "megapascal": "メガパスカル", + "gigapascal": "ギガパスカル", + "millibar": "ミリバール", + "bar": "バール", + "kilobar": "キロバール", + "newton": "ニュートン", + "newton-meter": "ニュートンメートル", + "foot-pounds": "フィートポンド", + "inch-pounds": "インチポンド", + "newton-per-meter": "ニュートン毎メートル", + "atmospheres": "気圧", + "pounds-per-square-inch": "psi", + "kilopound-per-square-inch": "キロpsi", + "torr": "トル", + "inches-of-mercury": "水銀柱インチ", + "pascal-per-square-meter": "パスカル毎平方メートル", + "pound-per-square-inch": "psi", + "newton-per-square-meter": "ニュートン毎平方メートル", + "kilogram-force-per-square-meter": "キログラム重毎平方メートル", + "pascal-per-square-centimeter": "パスカル毎平方センチメートル", + "ton-force-per-square-inch": "トン重毎平方インチ", + "kilonewton-per-square-meter": "キロニュートン毎平方メートル", + "newton-per-square-millimeter": "ニュートン毎平方ミリメートル", + "microjoule": "マイクロジュール", + "millijoule": "ミリジュール", + "joule": "ジュール", + "kilojoule": "キロジュール", + "megajoule": "メガジュール", + "gigajoule": "ギガジュール", + "watt-hour": "ワット時", + "watt-minute": "ワット分", + "kilowatt-hour": "キロワット時", + "milliwatt-hour": "ミリワット時", + "megawatt-hour": "メガワット時", + "gigawatt-hour": "ギガワット時", + "electron-volts": "電子ボルト", + "joules-per-coulomb": "ジュール毎クーロン", + "british-thermal-unit": "英熱量単位(BTU)", + "thousand-british-thermal-unit": "千BTU", + "million-british-thermal-unit": "百万BTU", + "foot-pound": "フィートポンド", + "calorie": "カロリー", + "small-calorie": "小カロリー", + "kilocalorie": "キロカロリー", + "joule-per-kelvin": "ジュール毎ケルビン", + "joule-per-kilogram-kelvin": "ジュール毎キログラム・ケルビン", + "joule-per-kilogram": "ジュール毎キログラム", + "watt-per-meter-kelvin": "ワット毎メートル・ケルビン", + "joule-per-cubic-meter": "ジュール毎立方メートル", + "therm": "サーム", + "electric-dipole-moment": "電気双極子モーメント", + "magnetic-dipole-moment": "磁気双極子モーメント", + "debye": "デバイ", + "coulomb-per-square-meter-per-volt": "クーロン毎平方メートル毎ボルト", + "milliwatt": "ミリワット", + "microwatt": "マイクロワット", + "watt": "ワット", + "kilowatt": "キロワット", + "megawatt": "メガワット", + "gigawatt": "ギガワット", + "metric-horsepower": "仏馬力", + "milliwatt-per-square-centimeter": "ミリワット毎平方センチメートル", + "watt-per-square-centimeter": "ワット毎平方センチメートル", + "kilowatt-per-square-centimeter": "キロワット毎平方センチメートル", + "milliwatt-per-square-meter": "ミリワット毎平方メートル", + "watt-per-square-meter": "ワット毎平方メートル", + "kilowatt-per-square-meter": "キロワット毎平方メートル", + "watt-per-square-inch": "ワット毎平方インチ", + "kilowatt-per-square-inch": "キロワット毎平方インチ", + "horsepower": "馬力", + "btu-per-hour": "BTU毎時", + "btu-per-second": "BTU毎秒", + "btu-per-day": "BTU毎日", + "mbtu-per-hour": "千BTU毎時", + "mbtu-per-second": "千BTU毎秒", + "mbtu-per-day": "千BTU毎日", + "mmbtu-per-hour": "百万BTU毎時", + "mmbtu-per-second": "百万BTU毎秒", + "mmbtu-per-day": "百万BTU毎日", + "foot-pound-per-second": "フィートポンド毎秒", + "coulomb": "クーロン", + "millicoulomb": "ミリクーロン", + "microcoulomb": "マイクロクーロン", + "nanocoulomb": "ナノクーロン", + "picocoulomb": "ピコクーロン", + "coulomb-per-meter": "クーロン毎メートル", + "coulomb-per-cubic-meter": "クーロン毎立方メートル", + "coulomb-per-square-meter": "クーロン毎平方メートル", + "square-millimeter": "平方ミリメートル", + "square-centimeter": "平方センチメートル", + "square-meter": "平方メートル", + "hectare": "ヘクタール", + "square-kilometer": "平方キロメートル", + "square-inch": "平方インチ", + "square-foot": "平方フィート", + "square-yard": "平方ヤード", + "acre": "エーカー", + "square-mile": "平方マイル", + "are": "アール", + "barn": "バーン", + "circular-inch": "サーキュラーインチ", + "milliampere-hour": "ミリアンペア時", + "ampere-hours": "アンペア時", + "kiloampere-hours": "キロアンペア時", + "nanoampere": "ナノアンペア", + "picoampere": "ピコアンペア", + "microampere": "マイクロアンペア", + "milliampere": "ミリアンペア", + "ampere": "アンペア", + "kiloampere": "キロアンペア", + "megaampere": "メガアンペア", + "gigaampere": "ギガアンペア", + "microampere-per-square-centimeter": "マイクロアンペア毎平方センチメートル", + "ampere-per-square-meter": "アンペア毎平方メートル", + "ampere-per-meter": "アンペア毎メートル", + "oersted": "エルステッド", + "bohr-magneton": "ボーア磁子", + "ampere-meter-squared": "アンペア・平方メートル", + "nanovolt": "ナノボルト", + "picovolt": "ピコボルト", + "millivolt": "ミリボルト", + "microvolt": "マイクロボルト", + "volt": "ボルト", + "kilovolt": "キロボルト", + "megavolt": "メガボルト", + "dbmV": "デシベルボルト", + "dbm": "デシベルミリワット", + "volt-meter": "ボルトメートル", + "kilovolt-meter": "キロボルトメートル", + "megavolt-meter": "メガボルトメートル", + "microvolt-meter": "マイクロボルトメートル", + "millivolt-meter": "ミリボルトメートル", + "nanovolt-meter": "ナノボルトメートル", + "ohm": "オーム", + "microohm": "マイクロオーム", + "milliohm": "ミリオーム", + "kilohm": "キロオーム", + "megohm": "メガオーム", + "gigohm": "ギガオーム", + "millihertz": "ミリヘルツ", + "hertz": "ヘルツ", + "kilohertz": "キロヘルツ", + "megahertz": "メガヘルツ", + "gigahertz": "ギガヘルツ", + "terahertz": "テラヘルツ", + "rpm": "回転数/分", + "candela-per-square-meter": "カンデラ毎平方メートル", + "candela": "カンデラ", + "lumen": "ルーメン", + "lux": "ルクス", + "foot-candle": "フートキャンドル", + "lumen-per-square-meter": "ルーメン毎平方メートル", + "lux-second": "ルクス秒", + "lumen-second": "ルーメン秒", + "lumens-per-watt": "ルーメン毎ワット", + "mole": "モル", + "nanomole": "ナノモル", + "micromole": "マイクロモル", + "millimole": "ミリモル", + "kilomole": "キロモル", + "mole-per-cubic-meter": "モル毎立方メートル", + "rssi": "受信信号強度インジケーター", + "ppm": "ppm", + "ppb": "ppb", + "micrograms-per-cubic-meter": "マイクログラム毎立方メートル", + "aqi": "AQI", + "gram-per-cubic-meter": "グラム毎立方メートル", + "gram-per-kilogram": "比湿", + "millimeters-per-second": "ミリメートル毎秒", + "neper": "ネーパ", + "bel": "ベル", + "decibel": "デシベル", + "meters-per-second-squared": "メートル毎秒毎秒", + "becquerel": "ベクレル", + "curie": "キュリー", + "gray": "グレイ", + "sievert": "シーベルト", + "roentgen": "レントゲン", + "cps": "カウント/秒", + "rad": "ラド", + "rem": "レム", + "dps": "崩壊/秒", + "rutherford": "ラザフォード", + "coulombs-per-kilogram": "クーロン毎キログラム", + "becquerels-per-cubic-meter": "ベクレル毎立方メートル", + "curies-per-liter": "キュリー毎リットル", + "becquerels-per-second": "ベクレル毎秒", + "curies-per-second": "キュリー毎秒", + "gy-per-second": "グレイ毎秒", + "watt-per-steradian": "ワット毎ステラジアン", + "watt-per-square-metre-steradian": "ワット毎平方メートル・ステラジアン", + "ph-level": "pH", + "turbidity": "濁度", + "mg-per-liter": "ミリグラム毎リットル", + "microsiemens-per-centimeter": "マイクロジーメンス毎センチメートル", + "millisiemens-per-meter": "ミリジーメンス毎メートル", + "siemens-per-meter": "ジーメンス毎メートル", + "kilogram-per-cubic-meter": "キログラム毎立方メートル", + "gram-per-cubic-centimeter": "グラム毎立方センチメートル", + "kilogram-per-square-meter": "キログラム毎平方メートル", + "milligram-per-milliliter": "ミリグラム毎ミリリットル", + "milligram-per-cubic-meter": "ミリグラム毎立方メートル", + "pound-per-cubic-foot": "ポンド毎立方フィート", + "ounces-per-cubic-inch": "オンス毎立方インチ", + "tons-per-cubic-yard": "トン毎立方ヤード", + "particle-density": "粒子密度", + "kilometers-per-liter": "キロメートル毎リットル", + "miles-per-gallon": "マイル毎ガロン", + "liters-per-100-km": "100 km あたりリットル", + "gallons-per-mile": "マイルあたりガロン", + "liters-per-hour": "リットル毎時", + "gallons-per-hour": "ガロン毎時", + "beats-per-minute": "拍/分", + "millimeters-of-mercury": "水銀柱ミリメートル", + "milligrams-per-deciliter": "ミリグラム毎デシリットル", + "g-force": "G(加速度)", + "kilonewton": "キロニュートン", + "kilogram-force": "キログラム重", + "pound-force": "ポンド重", + "kilopound-force": "キロポンド重", + "dyne": "ダイン", + "poundal": "パウンダル", + "kip": "キップ", + "gal": "ガル", + "gravity": "重力", + "hectopascal": "ヘクトパスカル", + "atmosphere": "気圧", + "millibars": "ミリバール", + "inch-of-mercury": "水銀柱インチ", + "richter-scale": "リヒター尺度", + "nanosecond": "ナノ秒", + "microsecond": "マイクロ秒", + "millisecond": "ミリ秒", + "second": "秒", + "minute": "分", + "hour": "時間", + "day": "日", + "week": "週", + "month": "月", + "year": "年", + "cubic-foot-per-minute": "立方フィート毎分", + "cubic-meters-per-hour": "立方メートル毎時", + "cubic-meters-per-second": "立方メートル毎秒", + "liter-per-second": "リットル毎秒", + "liter-per-minute": "リットル毎分", + "gallons-per-minute": "ガロン毎分", + "cubic-foot-per-second": "立方フィート毎秒", + "milliliters-per-minute": "ミリリットル毎分", + "cubic-decimeter-per-second": "立方デシメートル毎秒", + "bit": "ビット", + "byte": "バイト", + "kilobyte": "キロバイト", + "megabyte": "メガバイト", + "gigabyte": "ギガバイト", + "terabyte": "テラバイト", + "petabyte": "ペタバイト", + "exabyte": "エクサバイト", + "zettabyte": "ゼタバイト", + "yottabyte": "ヨタバイト", + "bit-per-second": "ビット毎秒", + "kilobit-per-second": "キロビット毎秒", + "megabit-per-second": "メガビット毎秒", + "gigabit-per-second": "ギガビット毎秒", + "terabit-per-second": "テラビット毎秒", + "byte-per-second": "バイト毎秒", + "kilobyte-per-second": "キロバイト毎秒", + "megabyte-per-second": "メガバイト毎秒", + "gigabyte-per-second": "ギガバイト毎秒", + "degree": "度", + "radian": "ラジアン", + "gradian": "グラード", + "arcminute": "分(角分)", + "arcsecond": "秒(角秒)", + "milliradian": "ミリラジアン", + "revolution": "回転", + "siemens": "ジーメンス", + "millisiemens": "ミリジーメンス", + "microsiemens": "マイクロジーメンス", + "kilosiemens": "キロジーメンス", + "megasiemens": "メガジーメンス", + "gigasiemens": "ギガジーメンス", + "farad": "ファラド", + "millifarad": "ミリファラド", + "microfarad": "マイクロファラド", + "nanofarad": "ナノファラド", + "picofarad": "ピコファラド", + "kilofarad": "キロファラド", + "megafarad": "メガファラド", + "gigafarad": "ギガファラド", + "terfarad": "テラファラド", + "farad-per-meter": "ファラド毎メートル", + "tesla": "テスラ", + "gauss": "ガウス", + "kilogauss": "キロガウス", + "millitesla": "ミリテスラ", + "microtesla": "マイクロテスラ", + "nanotesla": "ナノテスラ", + "kilotesla": "キロテスラ", + "megatesla": "メガテスラ", + "millitesla-square-meters": "ミリテスラ平方メートル", + "gamma": "ガンマ", + "lambda": "ラムダ", + "square-meter-per-second": "平方メートル毎秒", + "square-centimeter-per-second": "平方センチメートル毎秒", + "stoke": "ストークス", + "centistokes": "センチストークス", + "square-foot-per-second": "平方フィート毎秒", + "square-inch-per-second": "平方インチ毎秒", + "pascal-second": "パスカル秒", + "centipoise": "センチポアズ", + "poise": "ポアズ", + "reynolds": "レイノルズ", + "pound-per-foot-hour": "ポンド毎フィート時", + "newton-second-per-square-meter": "ニュートン秒毎平方メートル", + "dyne-second-per-square-centimeter": "ダイン秒毎平方センチメートル", + "kilogram-per-meter-second": "キログラム毎メートル秒", + "tesla-square-meters": "テスラ平方メートル", + "maxwell": "マクスウェル", + "tesla-per-meter": "テスラ毎メートル", + "gauss-per-centimeter": "ガウス毎センチメートル", + "weber": "ウェーバ", + "microweber": "マイクロウェーバ", + "milliweber": "ミリウェーバ", + "gauss-square-centimeter": "ガウス平方センチメートル", + "kilogauss-square-centimeter": "キロガウス平方センチメートル", + "henry": "ヘンリー", + "millihenry": "ミリヘンリー", + "microhenry": "マイクロヘンリー", + "nanohenry": "ナノヘンリー", + "henry-per-meter": "ヘンリー毎メートル", + "tesla-meter-per-ampere": "テスラメートル毎アンペア", + "gauss-per-oersted": "ガウス毎エルステッド", + "kilogram-per-mole": "キログラム毎モル", + "gram-per-mole": "グラム毎モル", + "milligram-per-mole": "ミリグラム毎モル", + "joule-per-mole": "ジュール毎モル", + "joule-per-mole-kelvin": "ジュール毎モル・ケルビン", + "millivolts-per-meter": "ミリボルト毎メートル", + "volts-per-meter": "ボルト毎メートル", + "kilovolts-per-meter": "キロボルト毎メートル", + "radian-per-second": "ラジアン毎秒", + "radian-per-second-squared": "ラジアン毎秒毎秒", + "revolutions-per-minute-per-second": "角加速度", + "deg-per-second": "度毎秒", + "rotation-per-minute": "回転/分", + "degrees-brix": "ブリックス度", + "katal": "カタル", + "katal-per-cubic-metre": "カタル毎立方メートル", + "paris-inch": "パリインチ" + }, + "user": { + "user": "ユーザー", + "users": "ユーザー", + "customer-users": "顧客ユーザー", + "tenant-admins": "テナント管理者", + "sys-admin": "システム管理者", + "tenant-admin": "テナント管理者", + "customer": "顧客", + "anonymous": "匿名", + "add": "ユーザーを追加", + "delete": "ユーザーを削除", + "add-user-text": "新しいユーザーを追加", + "no-users-text": "ユーザーが見つかりません", + "user-details": "ユーザー詳細", + "delete-user-title": "ユーザー '{{userEmail}}' を削除してもよろしいですか?", + "delete-user-text": "確認後、ユーザーと関連データは復元できなくなりますのでご注意ください。", + "delete-users-title": "{ count, plural, =1 {1人のユーザー} other {#人のユーザー} } を削除してもよろしいですか?", + "delete-users-action-title": "{ count, plural, =1 {1人のユーザー} other {#人のユーザー} } を削除", + "delete-users-text": "確認後、選択したユーザーはすべて削除され、関連データは復元できなくなりますのでご注意ください。", + "activation-email-sent-message": "アクティベーションメールが正常に送信されました!", + "resend-activation": "アクティベーションを再送", + "email": "メール", + "email-required": "メールは必須です。", + "invalid-email-format": "無効なメール形式です。", + "first-name": "名前", + "last-name": "苗字", + "description": "説明", + "default-dashboard": "デフォルトダッシュボード", + "always-fullscreen": "常に全画面表示", + "select-user": "ユーザーを選択", + "no-users-matching": "「{{entity}}」に一致するユーザーが見つかりません。", + "user-required": "ユーザーは必須です", + "activation-method": "アクティベーション方法", + "display-activation-link": "アクティベーションリンクを表示", + "send-activation-mail": "アクティベーションメールを送信", + "activation-link": "ユーザーアクティベーションリンク", + "activation-link-text": "ユーザーをアクティベートするには、次のアクティベーションリンクを使用してください(有効期限:{{activationLinkTtl}}):", + "copy-activation-link": "アクティベーションリンクをコピー", + "activation-link-copied-message": "ユーザーアクティベーションリンクがクリップボードにコピーされました", + "details": "詳細", + "login-as-tenant-admin": "テナント管理者としてログイン", + "login-as-customer-user": "顧客ユーザーとしてログイン", + "search": "ユーザーを検索", + "selected-users": "{ count, plural, =1 {1人のユーザー} other {#人のユーザー} } を選択", + "disable-account": "ユーザーアカウントを無効化", + "enable-account": "ユーザーアカウントを有効化", + "enable-account-message": "ユーザーアカウントが正常に有効化されました!", + "disable-account-message": "ユーザーアカウントが正常に無効化されました!", + "copyId": "ユーザーIDをコピー", + "idCopiedMessage": "ユーザーIDがクリップボードにコピーされました", + "user-list": "ユーザーリスト", + "user-list-required": "ユーザーリストは必須です" + }, + "value": { + "type": "値の型", + "string": "文字列", + "string-value": "文字列の値", + "string-value-required": "文字列の値は必須です", + "integer": "整数", + "integer-value": "整数の値", + "integer-value-required": "整数の値は必須です", + "invalid-integer-value": "無効な整数の値です", + "double": "倍精度浮動小数点", + "double-value": "倍精度浮動小数点の値", + "double-value-required": "倍精度浮動小数点の値は必須です", + "boolean": "ブール値", + "boolean-value": "ブール値", + "false": "偽", + "true": "真", + "long": "長整数", + "json": "JSON", + "json-value": "JSONの値", + "json-value-invalid": "JSONの値は無効な形式です", + "json-value-required": "JSONの値は必須です" + }, + "version-control": { + "version-control": "バージョン管理", + "management": "バージョン管理", + "search": "バージョンを検索", + "branch": "ブランチ", + "default": "デフォルト", + "select-branch": "ブランチを選択", + "branch-required": "ブランチは必須です", + "create-entity-version": "エンティティバージョンを作成", + "version-name": "バージョン名", + "version-name-required": "バージョン名は必須です", + "author": "作成者", + "export-relations": "関連をエクスポート", + "export-attributes": "属性をエクスポート", + "export-credentials": "認証情報をエクスポート", + "export-calculated-fields": "計算フィールドをエクスポート", + "export-alarm-rules": "アラームルールをエクスポート", + "entity-versions": "エンティティバージョン", + "versions": "バージョン", + "created-time": "作成時間", + "version-id": "バージョンID", + "no-entity-versions-text": "エンティティバージョンが見つかりません", + "no-versions-text": "バージョンが見つかりません", + "copy-full-version-id": "完全なバージョンIDをコピー", + "create-version": "バージョンを作成", + "creating-version": "バージョン作成中... しばらくお待ちください", + "nothing-to-commit": "コミットする変更はありません", + "restore-version": "バージョンを復元", + "restore-entity-from-version": "バージョン '{{versionName}}' からエンティティを復元", + "restoring-entity-version": "エンティティバージョンを復元中... しばらくお待ちください", + "load-relations": "関連を読み込む", + "load-attributes": "属性を読み込む", + "load-credentials": "認証情報を読み込む", + "load-calculated-fields": "計算フィールドを読み込む", + "load-alarm-rules": "アラームルールを読み込み", + "compare-with-current": "現在のバージョンと比較", + "diff-entity-with-version": "エンティティバージョン '{{versionName}}' と差分を表示", + "previous-difference": "前の差分", + "next-difference": "次の差分", + "current": "現在のバージョン", + "differences": "{ count, plural, =1 {1つの差分} other {#個の差分} }", + "create-entities-version": "エンティティバージョンを作成", + "default-sync-strategy": "デフォルトの同期戦略", + "sync-strategy-merge": "マージ", + "sync-strategy-overwrite": "上書き", + "entities-to-export": "エクスポートするエンティティ", + "entities-to-restore": "復元するエンティティ", + "sync-strategy": "同期戦略", + "all-entities": "すべてのエンティティ", + "no-entities-to-export-prompt": "エクスポートするエンティティを指定してください", + "no-entities-to-restore-prompt": "復元するエンティティを指定してください", + "add-entity-type": "エンティティタイプを追加", + "remove-all": "すべて削除", + "version-create-result": "{ added, plural, =0 {エンティティは追加されませんでした} =1 {1エンティティが追加されました} other {#エンティティが追加されました} }.
{ modified, plural, =0 {エンティティは変更されませんでした} =1 {1エンティティが変更されました} other {#エンティティが変更されました} }.
{ removed, plural, =0 {エンティティは削除されませんでした} =1 {1エンティティが削除されました} other {#エンティティが削除されました} }。", + "remove-other-entities": "他のエンティティを削除", + "find-existing-entity-by-name": "名前で既存のエンティティを検索", + "restore-entities-from-version": "バージョン '{{versionName}}' からエンティティを復元", + "restoring-entities-from-version": "エンティティを復元中... しばらくお待ちください", + "no-entities-restored": "復元されたエンティティはありません", + "created": "{{created}} 作成済み", + "updated": "{{updated}} 更新済み", + "deleted": "{{deleted}} 削除済み", + "remove-other-entities-confirm-text": "ご注意ください!これにより現在のすべてのエンティティが
削除され、復元したいバージョンには存在しません。

確認のため、\"remove other entities\" と入力してください。", + "auto-commit-to-branch": "{{ branch }}ブランチに自動コミット", + "default-create-entity-version-name": "{{entityName}} の更新", + "sync-strategy-merge-hint": "選択したエンティティをリポジトリに作成または更新します。他のリポジトリエンティティは変更されません。", + "sync-strategy-overwrite-hint": "選択したエンティティをリポジトリに作成または更新します。他のリポジトリエンティティは削除されます。", + "device-credentials-conflict": "外部ID {{entityId}} のデバイスの読み込みに失敗しました
別のデバイスにすでに同じ認証情報がデータベースに存在しています。
復元フォームで認証情報の読み込み設定を無効にすることを検討してください。", + "missing-referenced-entity": "外部ID {{sourceEntityId}} の{{sourceEntityTypeName}}の読み込みに失敗しました
欠落している{{targetEntityTypeName}}のID {{targetEntityId}} を参照しています。", + "runtime-failed": "失敗: {{message}}", + "auto-commit-settings-read-only-hint": "自動コミット機能はリポジトリ設定で読み取り専用オプションが有効な場合は機能しません。", + "rollback-on-error": "エラー時にロールバック", + "rollback-on-error-hint": "復元するエンティティが大量にある場合、パフォーマンス向上のためこのオプションを無効にすることを検討してください。\n注意:バージョンの読み込み中にエラーが発生した場合、すでに永続化されたエンティティ(関連、属性など)はそのまま残ります。" + }, + "widget": { + "widget-library": "ウィジェットライブラリ", + "widget-bundle": "ウィジェットバンドル", + "all-bundles": "すべてのバンドル", + "select-widgets-bundle": "ウィジェットバンドルを選択", + "widgets": "ウィジェット", + "all-widgets": "すべてのウィジェット", + "widget": "ウィジェット", + "select-widget": "ウィジェットを選択", + "no-widgets-matching": "'{{entity}}' に一致するウィジェットは見つかりませんでした。", + "no-widgets": "ウィジェットはまだありません", + "no-widgets-text": "ウィジェットが見つかりません", + "management": "ウィジェット管理", + "editor": "ウィジェットエディタ", + "confirm-to-exit-editor-html": "未保存のウィジェット設定があります。
このページを離れますか?", + "widget-type-not-found": "ウィジェットの設定の読み込みに問題があります。
おそらく関連するウィジェットタイプが削除されました。", + "widget-type-load-error": "ウィジェットが以下のエラーにより読み込まれませんでした:", + "remove": "ウィジェットを削除", + "delete": "ウィジェットを削除", + "edit": "ウィジェットを編集", + "remove-widget-title": "ウィジェット '{{widgetTitle}}' を削除してもよろしいですか?", + "remove-widget-text": "確認後、ウィジェットと関連するすべてのデータは回復できなくなります。", + "replace-reference-with-widget-copy": "参照をウィジェットのコピーに置き換える", + "timeseries": "タイムシリーズ", + "search-data": "データを検索", + "no-data-found": "データが見つかりません", + "latest": "最新の値", + "rpc": "コントロールウィジェット", + "alarm": "アラームウィジェット", + "static": "静的ウィジェット", + "timeseries-short": "シリーズ", + "latest-short": "最新", + "rpc-short": "コントロール", + "alarm-short": "アラーム", + "static-short": "静的", + "select-widget-type": "ウィジェットタイプを選択", + "missing-widget-title-error": "ウィジェットのタイトルは必須です!", + "widget-saved": "ウィジェットが保存されました", + "unable-to-save-widget-error": "ウィジェットを保存できません!ウィジェットにエラーがあります!", + "save": "ウィジェットを保存", + "saveAs": "ウィジェットを名前を付けて保存", + "move": "ウィジェットを移動", + "save-widget-as": "ウィジェットを名前を付けて保存", + "save-widget-as-text": "新しいウィジェットのタイトルを入力してください", + "toggle-fullscreen": "全画面表示の切り替え", + "run": "ウィジェットを実行", + "widget-title": "ウィジェットのタイトル", + "title": "タイトル", + "title-required": "ウィジェットのタイトルは必須です。", + "title-max-length": "タイトルは256文字以下にしてください。", + "system": "システム", + "type": "ウィジェットの種類", + "resources": "リソース", + "resource-url": "JavaScript/CSS の URL", + "resource-is-extension": "拡張機能ですか", + "remove-resource": "リソースを削除", + "add-resource": "リソースを追加", + "html": "HTML", + "tidy": "整理", + "css": "CSS", + "settings-form": "設定フォーム", + "data-key-settings-form": "データキー設定フォーム", + "latest-data-key-settings-form": "最新のデータキー設定フォーム", + "widget-settings": "ウィジェットの設定", + "description": "説明", + "tags": "タグ", + "image-preview": "画像プレビュー", + "settings-form-selector": "設定フォームの選択", + "data-key-settings-form-selector": "データキー設定フォームの選択", + "latest-data-key-settings-form-selector": "最新のデータキー設定フォームの選択", + "all": "すべて", + "actual": "実際", + "scada": "SCADAシンボル", + "deprecated": "非推奨", + "has-basic-mode": "基本モードがあります", + "basic-mode-form-selector": "基本モードフォームの選択", + "basic-mode": "基本", + "advanced-mode": "高度", + "javascript": "JavaScript", + "js": "JS", + "delete-widget-title": "ウィジェット '{{widgetName}}' を削除してもよろしいですか?", + "delete-widget-text": "確認後、ウィジェットと関連するすべてのデータは回復不可能になります。", + "delete-widgets-title": "{ count, plural, =1 {1 ウィジェット} other {# ウィジェット} } を削除してもよろしいですか?", + "delete-widgets-text": "注意してください。確認後、選択したすべてのウィジェットが削除され、関連するデータは回復不可能になります。", + "delete-widget": "ウィジェットを削除", + "widget-template-load-failed-error": "ウィジェットテンプレートの読み込みに失敗しました!", + "details": "詳細", + "widget-details": "ウィジェットの詳細", + "add": "ウィジェットを追加", + "add-existing-widget": "既存のウィジェットを追加", + "add-new-widget": "新しいウィジェットを追加", + "search-widgets": "ウィジェットを検索", + "selected-widgets": "{ count, plural, =1 {1 ウィジェット} other {# ウィジェット} } が選択されました", + "undo": "ウィジェットの変更を元に戻す", + "export": "ウィジェットをエクスポート", + "export-prompt": "ウィジェットの画像とリソースを埋め込む", + "export-widgets": "ウィジェットをエクスポート", + "export-widgets-prompt": "ウィジェットの画像とリソースを埋め込む", + "import": "ウィジェットをインポート", + "no-data": "ウィジェットに表示するデータがありません", + "data-overflow": "ウィジェットは {{total}} 件のエンティティのうち {{count}} 件を表示しています", + "alarm-data-overflow": "ウィジェットは {{totalEntities}} 件のエンティティのうち {{allowedEntities}} 件(最大許可) のアラームを表示しています", + "search": "ウィジェットを検索", + "filter": "ウィジェットフィルタータイプ", + "loading-widgets": "ウィジェットを読み込み中...", + "widget-template-error": "無効なウィジェットHTMLテンプレートです。", + "reference": "参照" + }, + "widget-action": { + "header-button": "ウィジェットヘッダーボタン", + "do-nothing": "何もしない", + "open-dashboard-state": "新しいダッシュボードステートに移動", + "update-dashboard-state": "現在のダッシュボードステートを更新", + "open-dashboard": "別のダッシュボードに移動", + "custom": "カスタムアクション", + "custom-pretty": "カスタムアクション(HTMLテンプレート付き)", + "custom-pretty-error-title": "カスタムダイアログエラー", + "custom-pretty-template-error": "無効なカスタムダイアログテンプレートです。", + "custom-pretty-controller-error": "カスタムダイアログ機能の評価中にエラーが発生しました。", + "mobile-action": "モバイルアクション", + "target-dashboard-state": "ターゲットダッシュボードステート", + "target-dashboard-state-required": "ターゲットダッシュボードステートは必須です", + "set-entity-from-widget": "ウィジェットからエンティティを設定", + "target-dashboard": "ターゲットダッシュボード", + "select-target-dashboard": "ターゲットダッシュボードを選択", + "target-dashboard-required": "ターゲットダッシュボードは必須です。", + "open-right-layout": "右側ダッシュボードレイアウトを開く(モバイルビュー)", + "state-display-type": "ダッシュボードステート表示オプション", + "open-normal": "通常", + "open-in-separate-dialog": "別のダイアログで開く", + "open-in-popover": "ポップオーバーで開く", + "dialog-title": "ダイアログタイトル", + "dialog-hide-dashboard-toolbar": "ダイアログ内でダッシュボードツールバーを非表示", + "dialog-width": "ダイアログの幅(ビューポートの幅に対するパーセント)", + "dialog-height": "ダイアログの高さ(ビューポートの高さに対するパーセント)", + "dialog-size-range-error": "ダイアログサイズのパーセント値は1から100の範囲である必要があります。", + "popover-preferred-placement": "ポップオーバーの推奨配置", + "popover-placement-top": "上", + "popover-placement-topLeft": "左上", + "popover-placement-topRight": "右上", + "popover-placement-right": "右", + "popover-placement-rightTop": "右上", + "popover-placement-rightBottom": "右下", + "popover-placement-bottom": "下", + "popover-placement-bottomLeft": "左下", + "popover-placement-bottomRight": "右下", + "popover-placement-left": "左", + "popover-placement-leftTop": "左上", + "popover-placement-leftBottom": "左下", + "popover-hide-on-click-outside": "外側クリックでポップオーバーを非表示", + "popover-hide-dashboard-toolbar": "ポップオーバー内でダッシュボードツールバーを非表示", + "popover-width": "ポップオーバーの幅", + "popover-height": "ポップオーバーの高さ", + "popover-style": "ポップオーバーのスタイル", + "open-new-browser-tab": "新しいブラウザタブで開く", + "open-URL": "URLを開く", + "URL": "URL", + "url-required": "URLは必須です。", + "mobile": { + "device-provision": "デバイスのプロビジョニング", + "action-type": "モバイルアクションの種類", + "select-action-type": "モバイルアクションの種類を選択", + "action-type-required": "モバイルアクションの種類は必須です", + "take-picture-from-gallery": "ギャラリーから写真を撮る", + "take-photo": "写真を撮る", + "map-direction": "地図の方向を開く", + "map-location": "地図の位置を開く", + "scan-qr-code": "QRコードをスキャン", + "make-phone-call": "電話をかける", + "get-location": "電話の位置を取得", + "take-screenshot": "スクリーンショットを撮る", + "handle-provision-success-function": "プロビジョニング成功処理関数", + "get-location-function": "位置情報取得関数", + "process-launch-result-function": "起動結果処理関数", + "get-phone-number-function": "電話番号取得関数", + "process-image-function": "画像処理関数", + "process-qr-code-function": "QR コード処理関数", + "process-location-function": "位置情報処理関数", + "handle-empty-result-function": "空結果処理関数", + "handle-error-function": "エラー処理関数", + "handle-non-mobile-fallback-function": "非モバイルフォールバック処理関数", + "save-to-gallery": "ギャラリーに保存", + "provision-type": "プロビジョニングタイプ", + "auto": "自動", + "wi-fi": "Wi-Fi", + "ble": "BLE", + "soft-ap": "Soft AP" + }, + "custom-action-function": "カスタムアクション機能", + "custom-pretty-function": "カスタムアクション(HTMLテンプレート付き)機能", + "map-item-type": "マップアイテムの種類", + "map-item": { + "marker": "マーカー", + "polygon": "ポリゴン", + "rectangle": "長方形", + "circle": "円", + "polyline": "ポリライン" + }, + "place-map-item": "マップアイテムを配置", + "map-item-tooltip": { + "customize-map-item-tooltips": "マップアイテムのツールチップをカスタマイズ", + "place-marker": "マーカーを配置", + "start-draw-rectangle": "長方形を描き始める", + "finish-draw-rectangle": "長方形を描き終わる", + "start-draw-polygon": "ポリゴンを描き始める", + "continue-draw-polygon": "ポリゴンの描画を続ける", + "finish-draw-polygon": "ポリゴンを描き終わる", + "start-draw-circle": "円を描き始める", + "finish-draw-circle": "円を描き終わる", + "start-draw-polyline": "ポリラインの描画を開始", + "finish-draw-polyline": "ポリラインの描画を完了" + } + }, + "widgets-bundle": { + "current": "現在のバンドル", + "widgets-bundles": "ウィジェットバンドル", + "widgets-bundle-widgets": "ウィジェットバンドルのウィジェット", + "add": "ウィジェットバンドルを追加", + "delete": "ウィジェットバンドルを削除", + "title": "タイトル", + "title-required": "タイトルは必須です。", + "title-max-length": "タイトルは256文字以下である必要があります。", + "description": "説明", + "image-preview": "画像プレビュー", + "scada": "SCADAウィジェットバンドル", + "order": "順序", + "add-widgets-bundle-text": "新しいウィジェットバンドルを追加", + "no-widgets-bundles-text": "ウィジェットバンドルが見つかりません", + "empty": "ウィジェットバンドルは空です", + "details": "詳細", + "widgets-bundle-details": "ウィジェットバンドルの詳細", + "delete-widgets-bundle-title": "ウィジェットバンドル '{{widgetsBundleTitle}}' を削除してもよろしいですか?", + "delete-widgets-bundle-text": "確認後、ウィジェットバンドルと関連するすべてのデータは回復不可能になります。", + "delete-widgets-bundles-title": "{ count, plural, =1 {1 ウィジェットバンドル} other {# ウィジェットバンドル} } を削除してもよろしいですか?", + "delete-widgets-bundles-action-title": "{ count, plural, =1 {1 ウィジェットバンドル} other {# ウィジェットバンドル} } を削除", + "delete-widgets-bundles-text": "確認後、選択したすべてのウィジェットバンドルが削除され、関連するデータは回復不可能になります。", + "no-widgets-bundles-matching": "'{{widgetsBundle}}' に一致するウィジェットバンドルが見つかりませんでした。", + "widgets-bundle-required": "ウィジェットバンドルは必須です。", + "system": "システム", + "import": "ウィジェットバンドルをインポート", + "export": "ウィジェットバンドルをエクスポート", + "export-widgets-bundle-widgets-prompt": "エクスポートするデータにバンドルのウィジェットを含めます(そうでない場合は、参照されているウィジェットFQNのみがエクスポートされます)", + "export-failed-error": "ウィジェットバンドルのエクスポートに失敗しました: {{error}}", + "create-new-widgets-bundle": "新しいウィジェットバンドルを作成", + "widgets-bundle-file": "ウィジェットバンドルファイル", + "invalid-widgets-bundle-file-error": "ウィジェットバンドルのインポートに失敗しました: 無効なウィジェットバンドルのデータ構造。", + "search": "ウィジェットバンドルを検索", + "selected-widgets-bundles": "{ count, plural, =1 {1 ウィジェットバンドル} other {# ウィジェットバンドル} } が選択されました", + "open-widgets-bundle": "ウィジェットバンドルを開く", + "loading-widgets-bundles": "ウィジェットバンドルを読み込み中...", + "create-new": "新しいウィジェットバンドルを作成" + }, + "widget-config": { + "data": "データ", + "settings": "設定", + "advanced": "高度な設定", + "appearance": "外観", + "widget-card": "ウィジェットカード", + "mobile": "モバイル", + "title": "タイトル", + "title-tooltip": "タイトルツールチップ", + "general-settings": "一般設定", + "display-title": "ウィジェットタイトルの表示", + "card-title": "カードタイトル", + "drop-shadow": "ドロップシャドウ", + "enable-fullscreen": "全画面表示を有効にする", + "background-color": "背景色", + "text-color": "テキスト色", + "border-radius": "ボーダー半径", + "padding": "パディング", + "margin": "マージン", + "widget-style": "ウィジェットスタイル", + "widget-css": "ウィジェットCSS", + "title-style": "タイトルスタイル", + "mobile-mode-settings": "モバイルモード", + "order": "順序", + "height": "高さ", + "mobile-hide": "モバイルモードでウィジェットを非表示", + "desktop-hide": "デスクトップモードでウィジェットを非表示", + "units": "値の隣に表示する特殊記号", + "units-by-default": "デフォルトの単位", + "decimals": "小数点以下の桁数", + "decimals-by-default": "デフォルトの小数点", + "default-data-key-parameter-hint": "このパラメーターは、データキー設定によって上書きされない限り、すべてのウィジェット値に適用されます", + "units-short": "単位", + "decimals-short": "小数点", + "decimals-suffix": "小数点", + "digits-suffix": "桁", + "timewindow": "時間ウィンドウ", + "use-dashboard-timewindow": "ダッシュボードの時間ウィンドウを使用", + "use-widget-timewindow": "ウィジェットの時間ウィンドウを使用", + "display-timewindow": "時間ウィンドウを表示", + "legend": "凡例", + "display-legend": "凡例を表示", + "datasources": "データソース", + "datasource": "データソース", + "maximum-datasources": "最大{ count, plural, =1 {1つのデータソースのみ許可されています。} other {#件のデータソースが許可されています。}}", + "timeseries-key-error": "少なくとも1つの時系列データキーを指定する必要があります", + "datasource-type": "タイプ", + "datasource-parameters": "パラメータ", + "remove-datasource": "データソースを削除", + "add-datasource": "データソースを追加", + "target-device": "ターゲットデバイス", + "alarm-source": "アラームソース", + "actions": "アクション", + "action": "アクション", + "add-action": "アクションを追加", + "search-actions": "アクションを検索", + "no-actions-text": "アクションが見つかりません", + "action-source": "アクションソース", + "select-action-source": "アクションソースを選択", + "action-source-required": "アクションソースは必須です。", + "column-index": "列インデックス", + "select-column-index": "列インデックスを選択", + "column-index-required": "列インデックスは必須です。", + "not-set": "設定されていません", + "action-name": "名前", + "action-name-required": "アクション名は必須です。", + "action-name-not-unique": "同じ名前のアクションがすでに存在します。\nアクション名は同一のアクションソース内で一意である必要があります。", + "action-icon": "アイコン", + "header-button": { + "button-settings": "ボタン設定", + "button-type": "ボタンタイプ", + "button-type-basic": "基本", + "button-type-raised": " raised", + "button-type-stroked": "ストローク", + "button-type-flat": "フラット", + "button-type-icon": "アイコン", + "button-type-mini-fab": "FAB", + "colors": "色", + "color": "色", + "background": "背景", + "border": "枠線", + "advanced-button-style": "高度なボタンスタイル", + "button-style": "ボタンスタイル" + }, + "show-hide-action-using-function": "関数を使ってアクションの表示/非表示", + "show-action-function": "アクション表示関数", + "action-type": "タイプ", + "action-type-required": "アクションタイプは必須です。", + "edit-action": "アクションを編集", + "delete-action": "アクションを削除", + "delete-action-title": "ウィジェットアクションの削除", + "delete-action-text": "アクション名 '{{actionName}}' のウィジェットアクションを削除してもよろしいですか?", + "title-icon": "タイトルアイコン", + "display-icon": "タイトルアイコンを表示", + "card-icon": "カードアイコン", + "icon": "アイコン", + "icon-color": "アイコンの色", + "icon-size": "アイコンのサイズ", + "advanced-settings": "高度な設定", + "data-settings": "データ設定", + "limits": "制限", + "no-data-display-message": "\"表示するデータがありません\" の代替メッセージ", + "data-page-size": "データソースごとの最大エンティティ数", + "settings-component-not-found": "セレクタ '{{selector}}' の設定フォームコンポーネントが見つかりません", + "preview": "プレビュー", + "set": "設定", + "set-message": "メッセージを設定", + "advanced-title-style": "高度なタイトルスタイル", + "card-style": "カードスタイル", + "text": "テキスト", + "background": "背景", + "advanced-widget-style": "高度なウィジェットスタイル", + "card-buttons": "カードボタン", + "show-card-buttons": "カードボタンを表示", + "card-border-radius": "カードの枠線の半径", + "card-padding": "カードのパディング", + "card-appearance": "カードの外観", + "color": "色", + "tooltip": "ツールチップ", + "units-required": "単位は必須です。", + "list-layout": "リストレイアウト", + "layout": "レイアウト", + "resize-options": "リサイズオプション", + "resizable": "リサイズ可能", + "preserve-aspect-ratio": "アスペクト比を維持" + }, + "widget-type": { + "import": "ウィジェットタイプをインポート", + "export": "ウィジェットタイプをエクスポート", + "export-failed-error": "ウィジェットのエクスポートに失敗しました: {{error}}", + "widget-file": "ウィジェットファイル", + "invalid-widget-file-error": "ウィジェットのインポートに失敗しました: 無効なウィジェットデータ構造です。" + }, + "markdown": { + "edit": "編集", + "preview": "プレビュー", + "copy-code": "コピーするにはクリック", + "copied": "コピーしました!" + }, + "widgets": { + "mobile-app-qr-code": { + "configuration-hint": "設定はプラットフォームのメイン設定でのモバイルアプリQRコードウィジェットに依存します", + "get-it-on-google-play": "Google Playで入手", + "download-on-the-app-store": "App Storeでダウンロード" + }, + "action-button": { + "behavior": "動作", + "on-click": "クリック時", + "on-click-hint": "ボタンがクリックされたときにトリガーされるアクション", + "first-button-click": "最初のボタンクリック", + "first-button-click-hint": "最初のボタンを押している間のアクション。", + "second-button-click": "2番目のボタンクリック", + "second-button-click-hint": "2番目のボタンを押している間のアクション。", + "button-click-hint": "ウィジェットを押している間のアクション" + }, + "command-button": { + "behavior": "動作", + "on-click": "クリック時", + "on-click-hint": "ボタンがクリックされたときに実行されるアクション" + }, + "power-button": { + "behavior": "動作", + "power-on": "電源 'オン'", + "power-on-hint": "コンポーネントの電源をオンにするアクション。", + "power-off": "電源 'オフ'", + "power-off-hint": "コンポーネントの電源をオフにするアクション。", + "on-label": "オン", + "off-label": "オフ", + "layout": "レイアウト", + "layout-default": "デフォルト", + "layout-simplified": "簡易版", + "layout-outlined": "アウトライン", + "layout-default-volume": "デフォルト.ボリューム", + "layout-simplified-volume": "簡易版.ボリューム", + "layout-outlined-volume": "アウトライン.ボリューム", + "layout-default-icon": "デフォルト.アイコン", + "layout-simplified-icon": "簡易版.アイコン", + "layout-outlined-icon": "アウトライン.アイコン", + "main": "メイン", + "background": "背景", + "button-icon-on": "ボタンアイコン 'オン'", + "button-icon-off": "ボタンアイコン 'オフ'", + "power-on-colors": "電源 'オン' の色", + "power-off-colors": "電源 'オフ' の色", + "disabled-colors": "無効の色", + "button": "ボタン" + }, + "toggle-button": { + "behavior": "動作", + "checked": "チェック済み", + "unchecked": "未チェック", + "check": "チェック", + "check-hint": "コンポーネントをチェックするためのアクション。", + "uncheck": "チェック解除", + "uncheck-hint": "コンポーネントのチェックを解除するためのアクション。", + "auto-scale": "自動スケール", + "horizontal-fill": "横方向にフィル", + "vertical-fill": "縦方向にフィル", + "button-appearance": "ボタンの外観" + }, + "segmented-button": { + "layout": "レイアウト", + "layout-squared": "角型", + "layout-rounded": "丸型", + "card-border": "カードの枠線", + "button-appearance": "ボタンの外観", + "first": "最初", + "second": "次", + "color-styles": "カラースタイル", + "selected": "選択済み", + "unselected": "未選択" + }, + "button": { + "layout": "レイアウト", + "outlined": "アウトライン", + "filled": "塗りつぶし", + "underlined": "下線付き", + "basic": "基本", + "auto-scale": "自動スケール", + "label": "ラベル", + "icon": "アイコン", + "border-radius": "枠線の角丸", + "color-palette": "カラーパレット", + "main": "メイン", + "background": "背景", + "border": "枠線", + "custom-styles": "カスタムスタイル", + "clear-style": "スタイルをクリア", + "shadow": "影", + "enabled": "有効", + "disabled": "無効", + "preview": "プレビュー", + "copy-style-from": "スタイルをコピー元から" + }, + "value-stepper": { + "behavior": "動作", + "simplified": "簡易版", + "filled": "塗りつぶし", + "outlined": "アウトライン", + "volume": "ボリューム", + "initial-state": "初期状態", + "initial-state-hint": "初期値を取得するためのアクション。", + "disabled-state": "無効状態", + "disabled-state-hint": "コンポーネントが無効になる条件を設定。", + "right-button-click": "右ボタンクリック", + "right-button-click-hint": "右ボタンを押している間のアクション。", + "left-button-click": "左ボタンクリック", + "left-button-click-hint": "左ボタンを押している間のアクション。", + "auto-scale": "自動スケール", + "value-range": "範囲", + "min-range": "最小", + "max-range": "最大", + "value-increment-decrement-step": "値の増減ステップ", + "value": "値", + "value-box-background": "値ボックスの背景", + "border": "枠線", + "button-appearance": "ボタンの外観", + "left": "左", + "right": "右", + "left-button": "左ボタン", + "right-button": "右ボタン", + "icon": "アイコン", + "color-palette": "カラーパレット", + "main": "メイン", + "background": "背景", + "button-icon-on": "ボタンアイコン 'オン'", + "button-on-colors": "電源 'オン' の色", + "disabled-colors": "無効の色" + }, + "button-state": { + "activated-state": "アクティブ状態", + "activated-state-hint": "ボタンがアクティブである条件を設定。", + "disabled-state": "無効状態", + "disabled-state-hint": "ボタンが無効である条件を設定。", + "selected-state": "選択されたボタン", + "selected-state-hint": "ボタンが選択される条件を設定。", + "enabled": "有効", + "hovered": "ホバー", + "pressed": "押された", + "activated": "アクティブ", + "disabled": "無効", + "initial": "最初のボタン", + "first": "最初", + "second": "次" + }, + "background": { + "background": "背景", + "background-settings": "背景設定", + "background-type-image": "画像", + "background-type-color": "色", + "image-url": "画像URL", + "overlay": "オーバーレイ", + "enable-overlay": "オーバーレイを有効にする", + "blur": "ぼかし", + "preview": "プレビュー" + }, + "bar-chart": { + "bar-appearance": "バーの外観", + "label-on-bar": "バー上のラベル", + "value-on-bar": "バー上の値", + "bar-chart-style": "バーグラフのスタイル", + "bar-axis": "バー軸" + }, + "polar-area-chart": { + "polar-axis": "極軸", + "start-angle": "開始角度", + "polar-area-chart-style": "極エリアチャートスタイル" + }, + "battery-level": { + "layout": "レイアウト", + "layout-vertical-solid": "縦方向. ソリッド", + "layout-horizontal-solid": "横方向. ソリッド", + "layout-vertical-divided": "縦方向. 分割", + "layout-horizontal-divided": "横方向. 分割", + "icon": "アイコン", + "value": "値", + "auto-scale": "自動スケール", + "battery-level-color": "バッテリーレベルの色", + "battery-shape-color": "バッテリー形状の色", + "battery-level-card-style": "バッテリーレベルカードスタイル", + "sections-count": "セクションの数" + }, + "signal-strength": { + "value": "値", + "last-update": "最終更新", + "no-signal": "信号なし", + "layout": "レイアウト", + "layout-wifi": "Wi-Fi", + "layout-cellular-bar": "セルラーバー", + "icon": "アイコン", + "date": "日付", + "active-bars-color": "アクティブな信号バーの色", + "inactive-bars-color": "非アクティブな信号バーの色", + "signal-strength-card-style": "信号強度カードスタイル", + "no-signal-rssi-value": "\"信号なし\" RSSI値" + }, + "status-widget": { + "behavior": "動作", + "layout": "レイアウト", + "layout-default": "デフォルト", + "layout-center": "中央", + "layout-icon": "アイコン", + "on": "オン", + "off": "オフ", + "label": "ラベル", + "status": "ステータス", + "icon": "アイコン", + "color-palette": "カラーパレット", + "disabled-color-palette": "無効なカラーパレット", + "primary": "プライマリ", + "primary-color-hint": "アイコンとラベルの色", + "secondary": "セカンダリ", + "secondary-color-hint": "ステータスの色", + "background": "背景" + }, + "chart": { + "common-settings": "共通設定", + "enable-stacking-mode": "スタッキングモードを有効にする", + "selection": "時間範囲の選択", + "enable-selection-mode": "選択モードを有効にする", + "line-shadow-size": "ラインシャドウのサイズ", + "display-smooth-lines": "スムーズ(曲線)ラインを表示", + "default-bar-width": "非集計データのデフォルトのバー幅(ミリ秒)", + "bar-alignment": "バーの配置", + "bar-alignment-left": "左", + "bar-alignment-right": "右", + "bar-alignment-center": "中央", + "default-font": "デフォルトフォント", + "default-font-size": "デフォルトフォントサイズ", + "default-font-color": "デフォルトフォントカラー", + "thresholds-line-width": "すべてのしきい値のデフォルトのライン幅", + "tooltip-settings": "ツールチップ設定", + "tooltip": "ツールチップ", + "show-tooltip": "ツールチップを表示", + "hover-individual-points": "個々のポイントをホバー", + "show-cumulative-values": "スタッキングモードで累積値を表示", + "hide-zero-false-values": "ツールチップからゼロ/偽の値を非表示", + "tooltip-value-format-function": "ツールチップの値のフォーマット関数", + "grid-settings": "グリッド設定", + "show-vertical-lines": "縦線を表示", + "show-horizontal-lines": "横線を表示", + "grid-outline-border-width": "グリッドアウトライン/枠線の幅(px)", + "primary-color": "プライマリカラー", + "background-color": "背景色", + "ticks-color": "目盛りの色", + "xaxis-settings": "X軸設定", + "axis-title": "軸タイトル", + "xaxis-tick-labels-settings": "X軸の目盛りラベル設定", + "show-tick-labels": "軸目盛りラベルを表示", + "yaxis-settings": "Y軸設定", + "min-scale-value": "スケールの最小値", + "max-scale-value": "スケールの最大値", + "yaxis-tick-labels-settings": "Y軸の目盛りラベル設定", + "tick-step-size": "目盛り間のステップサイズ", + "number-of-decimals": "表示する小数点以下の桁数", + "ticks-formatter-function": "目盛りのフォーマット関数", + "comparison-settings": "比較設定", + "enable-comparison": "比較を有効にする", + "time-for-comparison": "比較期間", + "time-for-comparison-previous-interval": "前のインターバル(デフォルト)", + "time-for-comparison-days": "1日前", + "time-for-comparison-weeks": "1週間前", + "time-for-comparison-months": "1ヶ月前", + "time-for-comparison-years": "1年前", + "time-for-comparison-custom-interval": "カスタムインターバル", + "custom-interval-value": "カスタムインターバル値(ms)", + "comparison-x-axis-settings": "比較X軸設定", + "axis-position": "軸の位置", + "axis-position-top": "上(デフォルト)", + "axis-position-bottom": "下", + "custom-legend-settings": "カスタム凡例設定", + "enable-custom-legend": "カスタム凡例を有効にする(これにより、キーラベルに属性/時系列の値を使用できるようになります)", + "key-name": "キー名", + "key-name-required": "キー名は必須です", + "key-type": "キータイプ", + "key-type-attribute": "属性", + "key-type-timeseries": "時系列", + "label-keys-list": "ラベルで使用するキーリスト", + "no-label-keys": "設定されたキーはありません", + "add-label-key": "新しいキーを追加", + "line-width": "ライン幅", + "color": "色", + "data-is-hidden-by-default": "データはデフォルトで非表示です", + "disable-data-hiding": "データの非表示を無効にする", + "remove-from-legend": "凡例からデータキーを削除", + "exclude-from-stacking": "スタッキングから除外(「スタッキング」モードで使用可能)", + "line-settings": "ライン設定", + "show-line": "ラインを表示", + "fill-line": "ラインを塗りつぶし", + "fill-line-opacity": "塗りつぶしの不透明度", + "points-settings": "ポイント設定", + "show-points": "ポイントを表示", + "points-line-width": "ポイントのライン幅", + "points-radius": "ポイントの半径", + "point-shape": "ポイントの形状", + "point-shape-circle": "円", + "point-shape-cross": "十字", + "point-shape-diamond": "ひし形", + "point-shape-square": "四角", + "point-shape-triangle": "三角形", + "point-shape-custom": "カスタム関数", + "point-shape-draw-function": "ポイント形状描画関数", + "show-separate-axis": "別々の軸を表示", + "axis-position-left": "左", + "axis-position-right": "右", + "thresholds": "しきい値", + "no-thresholds": "設定されたしきい値はありません", + "add-threshold": "しきい値を追加", + "show-values-for-comparison": "比較のために履歴値を表示", + "comparison-values-label": "履歴値ラベル", + "comparison-line-color": "比較線の色", + "threshold-settings": "しきい値設定", + "use-as-threshold": "キー値をしきい値として使用", + "threshold-line-width": "しきい値のライン幅", + "threshold-color": "しきい値の色", + "common-pie-settings": "共通の円グラフ設定", + "radius": "半径", + "inner-radius": "内半径", + "tilt": "傾き", + "common-pie-settings-range-error": "値は0から1の範囲である必要があります", + "stroke-settings": "線設定", + "width-pixels": "幅(ピクセル)", + "show-labels": "ラベルを表示", + "animation-settings": "アニメーション設定", + "animated-pie": "円グラフのアニメーションを有効にする(実験的)", + "border-settings": "枠線設定", + "border-width": "枠線の幅", + "border-color": "枠線の色", + "legend-settings": "凡例設定", + "display-legend": "凡例を表示", + "labels-font-color": "ラベルのフォント色", + "series": "シリーズ", + "add-series": "シリーズを追加", + "series-settings": "シリーズ設定", + "remove-series": "シリーズを削除", + "no-series": "設定されたシリーズはありません", + "no-series-error": "少なくとも1つのシリーズを指定する必要があります", + "chart-appearance": "グラフの外観", + "vertical-grid-lines": "縦のグリッドライン", + "horizontal-grid-lines": "横のグリッドライン", + "chart-background": "グラフ背景", + "grid-lines-color": "グリッドラインの色", + "border": "枠線", + "axis": "軸", + "vertical-axis": "縦軸", + "ticks": "目盛り", + "horizontal-axis": "横軸", + "shape-empty-circle": "空の円", + "shape-circle": "円", + "shape-rect": "長方形", + "shape-round-rect": "角丸長方形", + "shape-triangle": "三角形", + "shape-diamond": "ひし形", + "shape-pin": "ピン", + "shape-arrow": "矢印", + "shape-none": "なし", + "line-type-solid": "実線", + "line-type-dashed": "破線", + "line-type-dotted": "点線", + "label-position-top": "上", + "label-position-bottom": "下", + "label-position-outside": "外側", + "label-position-inside": "内側", + "fill": "塗りつぶし", + "fill-type-none": "なし", + "fill-type-solid": "実線", + "fill-type-opacity": "不透明度", + "fill-type-gradient": "グラデーション", + "background": "背景", + "opacity": "不透明度", + "gradient-stops": "グラデーションストップ", + "gradient-start": "開始", + "gradient-end": "終了", + "animation": { + "animation": "アニメーション", + "animation-threshold": "アニメーションしきい値", + "animation-duration": "アニメーションの期間", + "animation-easing": "アニメーションのイージング", + "animation-delay": "アニメーションの遅延", + "update-animation-duration": "アニメーション期間を更新", + "update-animation-easing": "アニメーションのイージングを更新", + "update-animation-delay": "アニメーションの遅延を更新" + }, + "chart-axis": { + "limit": "上限", + "source": "ソース", + "key-value": "キー / 値", + "value-required": "値は必須です。", + "entity-key-required": "エンティティキーは必須です。", + "key-required": "キーは必須です。", + "scale-limits": "スケール上限/下限", + "scale-appearance": "スケール表示", + "scale": "スケール", + "scale-min": "最小", + "scale-max": "最大", + "scale-auto": "自動" + }, + "bar": { + "show-border": "枠線を表示", + "border-width": "枠線の幅", + "border-radius": "枠線の角丸", + "bar-width": "バーの幅", + "label": "ラベル", + "label-hint": "バーの上にラベルを表示。", + "series-label-hint": "バーの上に値とともにラベルを表示。", + "label-background": "ラベルの背景" + } + }, + "color": { + "color-settings": "カラー設定", + "color-type-constant": "定数", + "color-type-gradient": "グラデーション", + "color-type-range": "範囲", + "color-type-function": "関数", + "color": "色", + "value-range": "値の範囲", + "from": "開始", + "to": "終了", + "color-function": "色関数", + "copy-color-settings-from": "カラー設定をコピー元からコピー", + "copy-from": "コピー元", + "settings-type": "設定タイプ", + "basic-mode": "基本", + "advanced-mode": "詳細", + "entity-alias": "エンティティエイリアス", + "entity-attribute": "エンティティ属性", + "gradient-color": "グラデーションカラー", + "gradient-color-min": "色", + "gradient-start": "グラデーション開始色", + "gradient-start-min": "開始", + "gradient-end": "グラデーション終了色", + "gradient-end-min": "終了", + "start-value": "開始値", + "end-value": "終了値", + "gradient-type": "グラデーションタイプ" + }, + "dashboard-state": { + "dashboard-state-settings": "ダッシュボード状態設定", + "dashboard-state": "ダッシュボード状態ID", + "autofill-state-layout": "デフォルトで状態レイアウトの高さを自動入力", + "default-margin": "デフォルトのウィジェットマージン", + "default-background-color": "デフォルトの背景色", + "sync-parent-state-params": "親ダッシュボードと状態パラメータを同期" + }, + "date-range-navigator": { + "date-range-picker-settings": "日付範囲ピッカー設定", + "hide-date-range-picker": "日付範囲ピッカーを非表示", + "picker-one-panel": "日付範囲ピッカー1パネル", + "picker-auto-confirm": "日付範囲ピッカー自動確認", + "picker-show-template": "日付範囲ピッカーのテンプレートを表示", + "first-day-of-week": "週の初めの日", + "interval-settings": "インターバル設定", + "hide-interval": "インターバルを非表示", + "initial-interval": "初期インターバル", + "interval-hour": "時間", + "interval-day": "日", + "interval-week": "週", + "interval-two-weeks": "2週間", + "interval-month": "月", + "interval-three-months": "3ヶ月", + "interval-six-months": "6ヶ月", + "step-settings": "ステップ設定", + "hide-step-size": "ステップサイズを非表示", + "initial-step-size": "初期ステップサイズ", + "hide-labels": "ラベルを非表示", + "use-session-storage": "セッションストレージを使用", + "localizationMap": { + "Sun": "日", + "Mon": "月", + "Tue": "火", + "Wed": "水", + "Thu": "木", + "Fri": "金", + "Sat": "土", + "Jan": "1月", + "Feb": "2月", + "Mar": "3月", + "Apr": "4月", + "May": "5月", + "Jun": "6月", + "Jul": "7月", + "Aug": "8月", + "Sep": "9月", + "Oct": "10月", + "Nov": "11月", + "Dec": "12月", + "January": "1月", + "February": "2月", + "March": "3月", + "April": "4月", + "June": "6月", + "July": "7月", + "August": "8月", + "September": "9月", + "October": "10月", + "November": "11月", + "December": "12月", + "Custom Date Range": "カスタム日付範囲", + "Date Range Template": "日付範囲テンプレート", + "Today": "今日", + "Yesterday": "昨日", + "This Week": "今週", + "Last Week": "先週", + "This Month": "今月", + "Last Month": "先月", + "Year": "年", + "This Year": "今年", + "Last Year": "昨年", + "Date picker": "日付ピッカー", + "Hour": "時間", + "Day": "日", + "Week": "週", + "2 weeks": "2週間", + "Month": "月", + "3 months": "3ヶ月", + "6 months": "6ヶ月", + "Custom interval": "カスタムインターバル", + "Interval": "インターバル", + "Step size": "ステップサイズ", + "Ok": "OK" + } + }, + "doughnut": { + "doughnut-appearance": "ドーナツの外観", + "layout": "レイアウト", + "layout-default": "デフォルト", + "layout-with-total": "合計あり", + "central-total-value": "中央の合計値", + "doughnut-card-style": "ドーナツカードスタイル" + }, + "entities-hierarchy": { + "hierarchy-data-settings": "階層データ設定", + "relations-query-function": "ノード関係クエリ関数", + "has-children-function": "ノードに子がいる関数", + "node-state-settings": "ノード状態設定", + "node-opened-function": "デフォルトのノード開閉関数", + "node-disabled-function": "ノード無効関数", + "display-settings": "表示設定", + "node-icon-function": "ノードアイコン関数", + "node-text-function": "ノードテキスト関数", + "sort-settings": "並べ替え設定", + "nodes-sort-function": "ノード並べ替え関数" + }, + "edge": { + "display-default-title": "デフォルトタイトルを表示" + }, + "gateway": { + "general-settings": "一般設定", + "widget-title": "ウィジェットのタイトル", + "default-archive-file-name": "デフォルトのアーカイブファイル名", + "device-type-for-new-gateway": "新しいgatewayのデバイスタイプ", + "messages-settings": "メッセージ設定", + "save-config-success-message": "正常に保存されたgateway構成についてのテキストメッセージ", + "device-name-exists-message": "入力した名前のデバイスがすでに存在する場合のテキストメッセージ", + "gateway-title": "Gatewayフォーム", + "read-only": "読み取り専用", + "events-title": "Gatewayイベントフォームタイトル", + "events-filter": "イベントフィルター", + "event-key-contains": "イベントキーに含まれる...", + "show-connector": "コネクタ用に表示", + "connector-state-param-key": "コネクタ状態パラメーターキー", + "message": "メッセージ", + "level": "レベル", + "created-time": "作成時間" + }, + "gauge": { + "default-color": "デフォルトの色", + "radial-gauge-settings": "放射状ゲージ設定", + "ticks-settings": "目盛り設定", + "min-value": "最小値", + "max-value": "最大値", + "min-value-short": "最小", + "max-value-short": "最大", + "start-ticks-angle": "目盛り開始角度", + "ticks-angle": "目盛り角度", + "major-ticks": "主要目盛り", + "major-ticks-count": "主要目盛りの数", + "major-ticks-color": "主要目盛りの色", + "minor-ticks": "副目盛り", + "minor-ticks-count": "副目盛りの数", + "minor-ticks-color": "副目盛りの色", + "tick-numbers-font": "目盛り番号フォント", + "unit-title-settings": "単位タイトル設定", + "show-unit-title": "単位タイトルを表示", + "unit-title": "単位タイトル", + "title-font": "タイトルテキストフォント", + "units-settings": "単位設定", + "units-font": "単位テキストフォント", + "value-box-settings": "値ボックス設定", + "show-value-box": "値ボックスを表示", + "value-box": "値ボックス", + "value-int": "値の整数部分の桁数", + "value-text": "値テキスト", + "value-text-shadow": "値テキストの影", + "value-font": "値テキストフォント", + "rect-stroke-color-start": "矩形の枠線色 - 開始グラデーション", + "rect-stroke-color-end": "矩形の枠線色 - 終了グラデーション", + "background-color": "背景色", + "shadow-color": "影の色", + "value-box-rect-stroke-color": "値ボックスの矩形枠線色", + "value-box-rect-stroke-color-end": "値ボックスの矩形枠線色 - 終了グラデーション", + "value-box-background-color": "値ボックスの背景色", + "value-box-shadow-color": "値ボックスの影の色", + "plate-settings": "プレート設定", + "show-plate-border": "プレート枠線を表示", + "plate-color": "プレートの色", + "needle-settings": "針設定", + "needle-circle-size": "針の円のサイズ", + "needle-color": "針の色", + "needle-color-start": "針の色 - 開始グラデーション", + "needle-color-end": "針の色 - 終了グラデーション", + "needle-color-shadow-up": "針の上半分の影の色", + "needle-color-shadow-down": "針の下半分の影の色", + "highlights-settings": "ハイライト設定", + "highlights-width": "ハイライトの幅", + "highlights": "ハイライト", + "highlight-from": "開始", + "highlight-to": "終了", + "highlight-color": "色", + "no-highlights": "設定されたハイライトはありません", + "add-highlight": "ハイライトを追加", + "animation-settings": "アニメーション設定", + "enable-animation": "アニメーションを有効にする", + "animation-duration-rule": "アニメーションの期間とルール", + "animation-duration": "アニメーションの期間", + "animation-rule": "アニメーションルール", + "animation-linear": "線形", + "animation-quad": "四角", + "animation-quint": "五角", + "animation-cycle": "サイクル", + "animation-bounce": "バウンス", + "animation-elastic": "エラスティック", + "animation-dequad": "デクアッド", + "animation-dequint": "デクイン", + "animation-decycle": "デサイクル", + "animation-debounce": "デバウンス", + "animation-delastic": "デラスティック", + "linear-gauge-settings": "リニアゲージ設定", + "bar-stroke": "バーの枠線", + "bar-stroke-width": "バーの枠線幅", + "bar-stroke-color": "バーの枠線色", + "bar-background-color": "バー背景色 - 開始グラデーション", + "bar-background-color-end": "バー背景色 - 終了グラデーション", + "progress-bar-color": "進行状況バーの色", + "progress-bar": "進行状況バー", + "progress-bar-color-start": "進行状況バーの色 - 開始グラデーション", + "progress-bar-color-end": "進行状況バーの色 - 終了グラデーション", + "major-ticks-names": "主要目盛り名", + "show-stroke-ticks": "目盛り枠線を表示", + "major-ticks-font": "主要目盛りフォント", + "border-color": "枠線の色", + "border-width": "枠線の幅", + "needle-circle": "針の円", + "needle-circle-color": "針の円の色", + "animation-target": "アニメーションターゲット", + "animation-target-needle": "針", + "animation-target-plate": "プレート", + "common-settings": "共通ゲージ設定", + "gauge-type": "ゲージタイプ", + "gauge-type-arc": "アーク", + "gauge-type-donut": "ドーナツ", + "gauge-type-horizontal-bar": "横バー", + "gauge-type-vertical-bar": "縦バー", + "donut-start-angle": "開始角度(度)", + "bar-settings": "ゲージバー設定", + "relative-bar-width": "相対的なバー幅", + "neon-glow-brightness": "ネオングロー効果の明るさ(0-100)", + "neon-glow-brightness-hint": "0 - 効果を無効にする", + "stripes-thickness": "ストライプの厚さ", + "stripes-thickness-hint": "0 - ストライプなし", + "rounded-line-cap": "丸みを帯びたラインキャップ", + "bar-color-settings": "バーの色設定", + "use-precise-level-color-values": "正確な色レベルを使用", + "bar-colors": "バーの色(下から上へ)", + "color": "色", + "no-bar-colors": "設定されたバーの色はありません", + "add-bar-color": "バーの色を追加", + "from": "開始", + "to": "終了", + "fixed-level-colors": "境界値を使用したバーの色", + "gauge-title-settings": "ゲージタイトル設定", + "show-gauge-title": "ゲージタイトルを表示", + "gauge-title": "ゲージタイトル", + "gauge-title-font": "ゲージタイトルフォント", + "unit-title-and-timestamp-settings": "単位タイトルとタイムスタンプ設定", + "show-timestamp": "タイムスタンプ", + "timestamp-format": "タイムスタンプ形式", + "label-font": "値の下に表示されるラベルのフォント", + "value-settings": "値設定", + "show-value": "値テキストを表示", + "min-max-settings": "最小/最大ラベル設定", + "show-min-max": "最小および最大値を表示", + "min-max-font": "最小および最大ラベルのフォント", + "show-ticks": "目盛りを表示", + "tick-width": "目盛りの幅", + "tick-color": "目盛りの色", + "tick-values": "目盛り値", + "no-tick-values": "設定された目盛り値はありません", + "add-tick-value": "目盛り値を追加", + "gauge-appearance": "ゲージの外観", + "units-title": "単位タイトル", + "value": "値", + "ticks": "目盛り", + "arrow-and-scale-color": "矢印とスケールのデフォルト色", + "scale-settings": "スケール設定", + "scale": "スケール", + "scale-color": "スケールの色", + "compass-appearance": "コンパスの外観", + "label": "ラベル", + "labels": "ラベル", + "label-style": "ラベルスタイル", + "simple-gauge-type": "タイプ", + "gauge-bar-background": "ゲージバーの背景", + "bar-color": "バーの色", + "min-and-max-value": "最小および最大値", + "min-and-max-label": "最小および最大ラベル", + "font": "フォント", + "tick-width-and-color": "目盛りの幅と色", + "min-max-validation-text": "最大値は最小値より大きくなければなりません" + }, + "gpio": { + "pin": "ピン", + "label": "ラベル", + "row": "行", + "column": "列", + "color": "色", + "panel-settings": "パネル設定", + "background-color": "背景色", + "gpio-switches": "GPIOスイッチ", + "no-gpio-switches": "設定されたGPIOスイッチはありません", + "add-gpio-switch": "GPIOスイッチを追加", + "gpio-status-request": "GPIOステータス要求", + "method-name": "メソッド名", + "method-body": "メソッドボディ", + "gpio-status-change-request": "GPIOステータス変更要求", + "parse-gpio-status-function": "GPIOステータス解析関数", + "gpio-leds": "GPIO LEDs", + "no-gpio-leds": "設定されたGPIO LEDsはありません", + "add-gpio-led": "GPIO LEDを追加" + }, + "html-card": { + "html": "HTML", + "css": "CSS" + }, + "input-widgets": { + "attribute-not-allowed": "このウィジェットでは属性パラメーターは使用できません", + "blocked-location": "ブラウザで位置情報がブロックされています", + "claim-device": "デバイスをクレーム", + "claim-failed": "デバイスのクレームに失敗しました!", + "claim-not-found": "デバイスが見つかりません!", + "claim-successful": "デバイスは正常にクレームされました!", + "date": "日付", + "device-name": "デバイス名", + "device-name-required": "デバイス名は必須です", + "discard-changes": "変更を破棄", + "entity-attribute-required": "エンティティ属性は必須です", + "entity-coordinate-required": "緯度と経度の両方のフィールドが必要です", + "entity-timeseries-required": "エンティティの時系列は必須です", + "get-location": "現在位置を取得", + "invalid-date": "無効な日付", + "latitude": "緯度", + "longitude": "経度", + "min-value-error": "最小値は{{value}}です", + "max-value-error": "最大値は{{value}}です", + "not-allowed-entity": "選択したエンティティには共有属性を持つことができません", + "no-attribute-selected": "属性が選択されていません", + "no-datakey-selected": "データキーが選択されていません", + "no-coordinate-specified": "緯度/経度のデータキーが指定されていません", + "no-entity-selected": "エンティティが選択されていません", + "no-image": "画像がありません", + "no-support-geolocation": "ブラウザは位置情報をサポートしていません", + "no-support-web-camera": "ブラウザはカメラをサポートしていません", + "enable-https-use-widget": "このウィジェットを使用するにはHTTPSを有効にしてください", + "no-found-your-camera": "カメラが見つかりません", + "no-permission-camera": "ユーザーにより許可が拒否されました / このサイトにはカメラ使用の許可がありません", + "no-timeseries-selected": "時系列が選択されていません", + "secret-key": "シークレットキー", + "secret-key-required": "シークレットキーは必須です", + "switch-attribute-value": "エンティティ属性の値を切り替え", + "switch-camera": "カメラを切り替え", + "switch-timeseries-value": "エンティティの時系列値を切り替え", + "take-photo": "写真を撮る", + "time": "時間", + "timeseries-not-allowed": "このウィジェットでは時系列パラメーターは使用できません", + "update-failed": "更新に失敗しました", + "update-successful": "更新が成功しました", + "update-attribute": "属性を更新", + "update-timeseries": "時系列を更新", + "value": "値", + "general-settings": "一般設定", + "widget-title": "ウィジェットタイトル", + "claim-button-label": "クレームボタンのラベル", + "show-secret-key-field": "'シークレットキー'入力フィールドを表示", + "labels-settings": "ラベル設定", + "show-labels": "ラベルを表示", + "device-name-label": "デバイス名入力フィールドのラベル", + "secret-key-label": "シークレットキー入力フィールドのラベル", + "messages-settings": "メッセージ設定", + "claim-device-success-message": "デバイスクレーム成功のテキストメッセージ", + "claim-device-not-found-message": "デバイスが見つからない場合のテキストメッセージ", + "claim-device-failed-message": "デバイスクレーム失敗のテキストメッセージ", + "claim-device-name-required-message": "'デバイス名は必須' エラーメッセージ", + "claim-device-secret-key-required-message": "'シークレットキーは必須' エラーメッセージ", + "show-label": "ラベルを表示", + "label": "ラベル", + "required": "必須", + "required-error-message": "'必須' エラーメッセージ", + "show-result-message": "結果メッセージを表示", + "integer-field-settings": "整数フィールド設定", + "min-value": "最小値", + "max-value": "最大値", + "double-field-settings": "倍精度フィールド設定", + "text-field-settings": "テキストフィールド設定", + "min-length": "最小長さ", + "max-length": "最大長さ", + "checkbox-settings": "チェックボックス設定", + "true-label": "チェック済みラベル", + "false-label": "未チェックラベル", + "image-input-settings": "画像入力設定", + "display-preview": "プレビューを表示", + "display-clear-button": "クリアボタンを表示", + "display-apply-button": "適用ボタンを表示", + "display-discard-button": "破棄ボタンを表示", + "datetime-field-settings": "日付/時刻フィールド設定", + "display-time-input": "時間入力を表示", + "latitude-key-name": "緯度キー名", + "longitude-key-name": "経度キー名", + "show-get-location-button": "「現在位置を取得」ボタンを表示", + "use-high-accuracy": "高精度を使用", + "location-fields-settings": "位置情報フィールド設定", + "latitude-label": "緯度のラベル", + "longitude-label": "経度のラベル", + "input-fields-alignment": "入力フィールドの配置", + "input-fields-alignment-column": "列(デフォルト)", + "input-fields-alignment-row": "行", + "layout": "レイアウト", + "row-gap": "行間のギャップ(ピクセル)", + "column-gap": "列間のギャップ(ピクセル)", + "latitude-field-required": "緯度フィールドは必須です", + "longitude-field-required": "経度フィールドは必須です", + "attribute-settings": "属性設定", + "widget-mode": "ウィジェットモード", + "widget-mode-update-attribute": "属性を更新", + "widget-mode-update-timeseries": "時系列を更新", + "attribute-scope": "属性範囲", + "attribute-scope-server": "サーバー属性", + "attribute-scope-shared": "共有属性", + "value-required": "値は必須です", + "image-settings": "画像設定", + "image-format": "画像形式", + "image-format-jpeg": "JPEG", + "image-format-png": "PNG", + "image-format-webp": "WEBP", + "image-quality": "損失圧縮を使用する画像品質(JPEGやWEBPなど)", + "max-image-width": "最大画像幅", + "max-image-height": "最大画像高さ", + "action-buttons": "アクションボタン", + "show-action-buttons": "アクションボタンを表示", + "update-all-values": "変更された値だけでなく、すべての値を更新", + "save-button-label": "'SAVE' ボタンラベル", + "reset-button-label": "'UNDO' ボタンラベル", + "group-settings": "グループ設定", + "show-group-title": "異なるエンティティに関連するフィールドのグループタイトルを表示", + "group-title": "グループタイトル", + "fields-alignment": "フィールドの配置", + "fields-alignment-row": "行(デフォルト)", + "fields-alignment-column": "列", + "fields-in-row": "行のフィールド数", + "option-value": "値(空のオプションを作成するために 'null' を入力)", + "option-label": "ラベル", + "hide-input-field": "入力フィールドを非表示", + "datakey-type": "データキータイプ", + "datakey-type-server": "サーバー属性(デフォルト)", + "datakey-type-shared": "共有属性", + "datakey-type-timeseries": "時系列", + "datakey-value-type": "データキーの値のタイプ", + "datakey-value-type-string": "文字列", + "datakey-value-type-double": "倍精度", + "datakey-value-type-integer": "整数", + "datakey-value-type-json": "JSON", + "datakey-value-type-boolean-checkbox": "ブール値(チェックボックス)", + "datakey-value-type-boolean-switch": "ブール値(スイッチ)", + "datakey-value-type-date-time": "日付と時刻", + "datakey-value-type-date": "日付", + "datakey-value-type-time": "時間", + "datakey-value-type-select": "選択", + "datakey-value-type-radio": "ラジオ", + "datakey-value-type-color": "色", + "value-is-required": "値は必須です", + "ability-to-edit-attribute": "属性の編集能力", + "ability-to-edit-attribute-editable": "編集可能(デフォルト)", + "ability-to-edit-attribute-disabled": "無効", + "ability-to-edit-attribute-readonly": "読み取り専用", + "disable-on-datakey-name": "他のデータキーの偽の値で無効にする(データキー名を指定)", + "field-appearance": "フィールドの外観", + "appearance-fill": "塗りつぶし", + "appearance-outline": "アウトライン", + "subscript-sizing": "添え字サイズ", + "subscript-sizing-fixed": "固定", + "subscript-sizing-dynamic": "動的", + "slide-toggle-settings": "スライドトグル設定", + "slide-toggle-label-position": "スライドトグルラベル位置", + "slide-toggle-label-position-after": "後", + "slide-toggle-label-position-before": "前", + "select-options": "選択肢", + "no-select-options": "設定された選択肢はありません", + "add-select-option": "選択肢を追加", + "numeric-field-settings": "数値フィールド設定", + "step-interval": "値の間のステップ間隔", + "error-messages": "エラーメッセージ", + "min-value-error-message": "'最小値' エラーメッセージ", + "max-value-error-message": "'最大値' エラーメッセージ", + "invalid-date-error-message": "'無効な日付' エラーメッセージ", + "invalid-JSON-error-message": "'無効なJSON' エラーメッセージ", + "icon-settings": "アイコン設定", + "dialog-editor-settings": "ダイアログエディター設定", + "use-custom-icon": "カスタムアイコンを使用", + "input-cell-icon": "入力セル前に表示するアイコン", + "value-conversion-settings": "値変換設定", + "get-value-settings": "値取得設定", + "use-get-value-function": "getValue関数を使用", + "get-value-function": "getValue関数", + "set-value-settings": "値設定設定", + "use-set-value-function": "setValue関数を使用", + "set-value-function": "setValue関数", + "json-invalid": "JSON値の形式が無効です", + "title": "タイトル", + "cancel-button-label": "'キャンセル' ボタンラベル", + "radio-button-settings": "ラジオボタン設定", + "color": "色", + "columns": "列", + "radio-options": "ラジオオプション", + "no-radio-options": "設定されたラジオオプションはありません", + "add-radio-option": "ラジオオプションを追加", + "radio-label-position": "ラベル位置", + "radio-label-position-before": "前", + "radio-label-position-after": "後", + "save-image": "画像を保存", + "save-to-gallery": "撮影した画像を画像ギャラリーに自動保存", + "public-image": "画像を未認証のユーザーにも公開します" + }, + "invalid-qr-code-text": "QRコードの入力テキストが無効です。入力は文字列タイプである必要があります", + "qr-code": { + "use-qr-code-text-function": "QRコードテキスト関数を使用", + "qr-code-text-pattern": "QRコードテキストパターン(例: '${entityName} | ${keyName} - some text.')", + "qr-code-text-pattern-hint": "QRコードテキストパターンは、エンティティのエイリアス内で最初に見つかったキーの値を使用します。", + "qr-code-text-pattern-required": "QRコードテキストパターンは必須です。", + "qr-code-text-function": "QRコードテキスト関数" + }, + "label-widget": { + "label-pattern": "パターン", + "label-pattern-hint": "ヒント: 例: 'Text ${keyName} units.' または ${#<key index>} units'", + "label-pattern-required": "パターンは必須です", + "label-position": "位置(背景に対するパーセンテージ)", + "x-pos": "X", + "y-pos": "Y", + "background-color": "背景色", + "font-settings": "フォント設定", + "background-image": "背景画像", + "labels": "ラベル", + "no-labels": "設定されたラベルはありません", + "add-label": "ラベルを追加" + }, + "navigation": { + "title": "タイトル", + "navigation-path": "ナビゲーションパス", + "filter-type": "フィルタータイプ", + "filter-type-all": "すべてのアイテム", + "filter-type-include": "アイテムを含む", + "filter-type-exclude": "アイテムを除外", + "items": "アイテム", + "enter-urls-to-filter": "フィルターするURLを入力..." + }, + "persistent-table": { + "rpc-id": "RPC ID", + "message-type": "メッセージタイプ", + "method": "メソッド", + "params": "パラメータ", + "created-time": "作成時間", + "expiration-time": "有効期限", + "retries": "再試行回数", + "status": "ステータス", + "filter": "フィルター", + "refresh": "リフレッシュ", + "add": "RPCリクエストを追加", + "details": "詳細", + "delete": "削除", + "delete-request-title": "永続的なRPCリクエストを削除", + "delete-request-text": "リクエストを削除してもよろしいですか?", + "details-title": "詳細 RPC ID: ", + "additional-info": "追加情報", + "response": "レスポンス", + "any-status": "任意のステータス", + "rpc-status-list": "RPCステータスリスト", + "no-request-prompt": "表示するリクエストはありません", + "send-request": "リクエストを送信", + "add-title": "永続的なRPCリクエストを作成", + "method-error": "メソッドは必須です。", + "timeout-error": "最小タイムアウト値は5000(5秒)です。", + "white-space-error": "空白は許可されていません。", + "rpc-status": { + "QUEUED": "待機中", + "SENT": "送信済み", + "DELIVERED": "配信済み", + "SUCCESSFUL": "成功", + "TIMEOUT": "タイムアウト", + "EXPIRED": "期限切れ", + "FAILED": "失敗" + }, + "rpc-search-status-all": "すべて", + "message-types": { + "false": "双方向", + "true": "一方向" + }, + "general-settings": "一般設定", + "enable-filter": "フィルターを有効にする", + "enable-sticky-header": "スクロール中にヘッダーを表示", + "enable-sticky-action": "スクロール中にアクション列を表示", + "display-request-details": "リクエスト詳細を表示", + "allow-send-request": "RPCリクエストの送信を許可", + "allow-delete-request": "リクエストの削除を許可", + "columns-settings": "列設定", + "display-columns": "表示する列", + "column": "列", + "no-columns-found": "列が見つかりません", + "no-columns-matching": "'{{column}}' が見つかりません。" + }, + "range-chart": { + "chart": "チャート", + "data-zoom": "データズーム", + "range-chart-appearance": "範囲チャートの外観", + "range-colors": "範囲の色", + "out-of-range-color": "範囲外の色", + "show-range-thresholds": "範囲しきい値を表示", + "range-thresholds-settings": "範囲しきい値設定", + "fill-area": "塗りつぶし領域", + "fill-area-opacity": "塗りつぶし領域の不透明度", + "range-chart-style": "範囲チャートスタイル" + }, + "knob": { + "behavior": "動作", + "initial-value": "初期値", + "initial-value-hint": "ノブの初期値を取得するためのアクション。", + "on-value-change": "値の変更時", + "on-value-change-hint": "ノブの値が変更されたときにトリガーされるアクション。", + "range": "範囲", + "min": "最小", + "max": "最大", + "value": "値", + "fallback-initial-value": "フォールバック初期値" + }, + "rpc": { + "value-settings": "値設定", + "initial-value": "初期値", + "retrieve-value-settings": "値の取得設定(オン/オフ)", + "retrieve-value-method": "値を取得する方法", + "retrieve-value-method-none": "取得しない", + "retrieve-value-method-rpc": "RPCのget値メソッドを呼び出す", + "retrieve-value-method-attribute": "属性をサブスクライブする", + "retrieve-value-method-timeseries": "時系列をサブスクライブする", + "attribute-value-key": "属性キー", + "timeseries-value-key": "時系列キー", + "get-value-method": "RPCのget値メソッド", + "parse-value-function": "値解析関数", + "update-value-settings": "値設定の更新", + "set-value-method": "RPCのset値メソッド", + "convert-value-function": "値変換関数", + "rpc-settings": "RPC設定", + "request-timeout": "RPCリクエストタイムアウト(ms)", + "persistent-rpc-settings": "永続的なRPC設定", + "request-persistent": "RPCリクエスト永続化", + "persistent-polling-interval": "永続的なRPCコマンドレスポンスを取得するポーリング間隔(ms)", + "common-settings": "共通設定", + "switch-title": "スイッチタイトル", + "show-on-off-labels": "オン/オフラベルを表示", + "slide-toggle-label": "スライドトグルラベル", + "label-position": "ラベル位置", + "label-position-before": "前", + "label-position-after": "後", + "slider-color": "スライダーの色", + "slider-color-primary": "プライマリ", + "slider-color-accent": "アクセント", + "slider-color-warn": "警告", + "button-style": "ボタンスタイル", + "button-raised": "浮き上がったボタン", + "button-primary": "プライマリカラー", + "button-background-color": "ボタンの背景色", + "button-text-color": "ボタンのテキストカラー", + "widget-title": "ウィジェットタイトル", + "button-label": "ボタンラベル", + "device-attribute-scope": "デバイス属性範囲", + "server-attribute": "サーバー属性", + "shared-attribute": "共有属性", + "device-attribute-parameters": "デバイス属性パラメーター", + "is-one-way-command": "一方向コマンドかどうか", + "rpc-method": "RPCメソッド", + "rpc-method-params": "RPCメソッドパラメーター", + "show-rpc-error": "RPCコマンド実行エラーを表示", + "led-title": "LEDタイトル", + "led-color": "LEDの色", + "check-status-settings": "ステータス確認設定", + "perform-rpc-status-check": "RPCデバイスステータス確認を実行", + "retrieve-led-status-value-method": "方法を使用してLEDステータス値を取得", + "led-status-value-attribute": "LEDステータス値を含むデバイス属性", + "led-status-value-timeseries": "LEDステータス値を含むデバイスタイムシリーズ", + "check-status-method": "RPCデバイスステータスメソッド", + "parse-led-status-value-function": "LEDステータス値解析関数", + "knob-title": "ノブタイトル" + }, + "maps": { + "map-type": { + "type": "地図タイプ", + "map": "地図", + "image": "画像" + }, + "image": { + "image-source": "画像ソース", + "image-source-image": "画像", + "image-source-entity-key": "エンティティキー", + "source-entity-alias": "ソースエンティティエイリアス", + "image-url-key": "画像URLキー", + "image-url-key-required": "画像URLキーは必須です" + }, + "control": { + "map-controls": "地図コントロール", + "position": "位置", + "position-topleft": "左上", + "position-topright": "右上", + "position-bottomleft": "左下", + "position-bottomright": "右下", + "zoom-actions": "ズームアクション", + "zoom-scroll": "スクロール", + "zoom-double-click": "ダブルクリック", + "zoom-control-buttons": "コントロールボタン", + "scale": "スケール", + "scale-metric": "メートル法", + "scale-imperial": "インペリアル単位", + "switch-to-drag-mode-using-button": "ボタンを使用してドラッグモードに切り替え" + }, + "timeline": { + "control-panel": "タイムラインコントロールパネル", + "time-step": "時間ステップ", + "speed-options": "速度オプション", + "timestamp": "タイムスタンプ", + "snap-to-real-location": "実際の位置にスナップ", + "location-snap-filter-function": "位置スナップフィルター関数", + "no-trips-data-available": "利用可能な旅行データはありません" + }, + "map-action": { + "map-action-buttons": "地図アクションボタン", + "label": "ラベル", + "icon": "アイコン", + "color": "色", + "action": "アクション", + "add-button": "ボタンを追加", + "no-action-buttons-configured": "設定されたアクションボタンはありません", + "remove-action-button": "アクションボタンを削除", + "map-action-button": "地図アクションボタン", + "button-requires": "ボタンにはラベルまたはアイコンが必要です" + }, + "common": { + "common-map-settings": "共通の地図設定", + "fit-map-bounds": "地図の境界を調整してすべてのマーカーをカバー", + "default-map-center-position": "デフォルトの地図中央位置", + "default-map-zoom-level": "デフォルトの地図ズームレベル", + "entities-limit": "読み込むエンティティの制限" + }, + "layer": { + "label": "ラベル", + "layer": "レイヤー", + "layers": "レイヤー", + "map-layers": "地図レイヤー", + "add-layer": "レイヤーを追加", + "layer-settings": "レイヤー設定", + "remove-layer": "レイヤーを削除", + "no-layers": "設定されたレイヤーはありません", + "roadmap": "道路地図", + "satellite": "衛星", + "hybrid": "ハイブリッド", + "reference": { + "reference-layer": "参照レイヤー", + "no-layer": "レイヤーなし", + "openstreetmap-hybrid": "OpenStreetMap ハイブリッド", + "world-edition-hybrid": "ワールドエディション ハイブリッド", + "enhanced-contrast-hybrid": "強調コントラスト ハイブリッド" + }, + "provider": { + "provider": "プロバイダー", + "openstreet": { + "title": "OpenStreet", + "mapnik": "Mapnik", + "hot": "HOT", + "esri-street": "WorldStreetMap", + "esri-topo": "WorldTopoMap", + "esri-imagery": "WorldImagery", + "cartodb-positron": "Positron", + "cartodb-dark-matter": "DarkMatter" + }, + "google": { + "title": "Google", + "roadmap": "道路地図", + "satellite": "衛星", + "hybrid": "ハイブリッド", + "terrain": "地形" + }, + "here": { + "title": "HERE", + "normal-day": "通常の日", + "normal-night": "通常の夜", + "hybrid-day": "ハイブリッドの日", + "terrain-day": "地形の日" + }, + "tencent": { + "title": "Tencent", + "normal": "通常", + "satellite": "衛星", + "terrain": "地形" + }, + "custom": { + "title": "カスタム", + "tile-url": "タイルURL" + } + }, + "credentials": { + "credentials": "認証情報", + "api-key": "APIキー" + } + }, + "overlays": { + "overlays": "オーバーレイ", + "overlays-hint": "地図エンティティのデータソース、外観、動作、編集オプション、およびグループ化を設定", + "trips": "旅行", + "markers": "マーカー", + "polygons": "ポリゴン", + "circles": "円", + "polylines": "ポリライン" + }, + "data-layer": { + "source": "ソース", + "filter": "フィルター", + "additional-data-keys": "追加データキー", + "additional-datasources": "追加データソース", + "additional-datasources-hint": "地図に表示されていないエンティティから属性またはテレメトリデータにアクセスするためのデータソース、地図オーバーレイ関数で使用可能。", + "more-datasources": "さらにデータソース", + "data-keys": "データキー", + "add-datasource": "データソースを追加", + "no-datasources": "設定されたデータソースはありません", + "remove-datasource": "データソースを削除", + "behavior": "動作", + "on-click": "クリック時", + "on-click-hint": "ユーザーが地図アイテムをクリックしたときに呼び出されるアクション。", + "groups": "グループ", + "groups-hint": "オーバーレイに割り当てられたグループ名のリスト、地図上での可視性の切り替えに使用されます。", + "color": "色", + "color-settings": "色設定", + "color-type-constant": "定数", + "color-type-range": "範囲", + "color-type-function": "関数", + "color-range-source-key": "色範囲ソースキー", + "color-range-source-key-required": "色範囲ソースキーは必須です", + "color-range": "色範囲", + "color-function": "色関数", + "label": "ラベル", + "tooltip": "ツールチップ", + "pattern-type-pattern": "パターン", + "pattern-type-function": "関数", + "label-pattern": "ラベル(パターン例: '${entityName}', '${entityName}: (テキスト ${keyName} 単位.)')", + "label-function": "ラベル関数", + "tooltip-pattern": "ツールチップ(例: 'テキスト ${keyName} 単位.' または リンクテキスト)", + "tooltip-function": "ツールチップ関数", + "tooltip-trigger": "ツールチップトリガー", + "tooltip-trigger-click": "クリック時にツールチップを表示", + "tooltip-trigger-hover": "ホバー時にツールチップを表示", + "auto-close-tooltips": "ツールチップを自動的に閉じる", + "tooltip-offset": "ツールチップオフセット", + "tooltip-offset-horizontal": "水平方向", + "tooltip-offset-vertical": "垂直方向", + "tooltip-tag-actions": "タグアクション", + "add-tooltip-tag-action": "タグアクションを追加", + "edit-tooltip-tag-action": "タグアクションを編集", + "remove-tooltip-tag-action": "タグアクションを削除", + "action-add": "追加", + "action-edit": "編集", + "action-move": "移動", + "action-remove": "削除", + "edit-instruments": "インスツルメント", + "persist-location-attribute-scope": "位置を永続化する属性の範囲", + "enable-snapping": "精密描画のために他の頂点にスナッピングを有効にする", + "enable-snapping-hint": "新しいポイントを既存の形状と自動的に整列させ、描画を簡単かつ正確にします。", + "drag-drop-mode": "ドラッグ&ドロップモード", + "trip": { + "no-trips": "設定された旅行はありません", + "add-trip": "旅行を追加", + "trip-configuration": "旅行設定", + "remove-trip": "旅行を削除" + }, + "marker": { + "marker": "マーカー", + "latitude-key": "緯度キー", + "longitude-key": "経度キー", + "x-pos-key": "X位置キー", + "y-pos-key": "Y位置キー", + "latitude-key-required": "緯度キーは必須です", + "longitude-key-required": "経度キーは必須です", + "x-pos-key-required": "X位置キーは必須です", + "y-pos-key-required": "Y位置キーは必須です", + "no-markers": "設定されたマーカーはありません", + "add-marker": "マーカーを追加", + "marker-configuration": "マーカー設定", + "remove-marker": "マーカーを削除", + "marker-type": "マーカータイプ", + "marker-type-shape": "形状", + "marker-type-icon": "アイコン", + "marker-type-image": "画像", + "shape": "形状", + "icon": "アイコン", + "image": "画像", + "marker-shapes": "マーカー形状", + "marker-icon": "マーカーアイコン", + "marker-appearance": "マーカーの外観", + "marker-image": "マーカー画像", + "marker-image-type-image": "画像", + "marker-image-type-function": "関数", + "custom-marker-image-size": "カスタムマーカー画像サイズ", + "marker-image-function": "マーカー画像関数", + "marker-images": "マーカー画像", + "marker-offset": "マーカーオフセット", + "offset-horizontal": "水平方向", + "offset-vertical": "垂直方向", + "rotate-marker": "マーカーを回転", + "offset-angle": "オフセット角度", + "position-conversion": "位置変換", + "position-conversion-function": "位置変換関数、x,y 座標を0から1の範囲で返す必要があります", + "clustering": { + "use-map-markers-clustering": "地図マーカーのクラスタリングを使用", + "zoom-on-cluster-click": "クラスタをクリックしたときにズーム", + "max-zoom": "マーカーがクラスタの一部として含まれる最大ズームレベル(0 - 18)", + "max-radius": "クラスタがカバーする最大半径", + "zoom-animation": "ズーム時のマーカーのアニメーション", + "bounds-on-cluster-mouse-over": "クラスタにマウスオーバーしたときのマーカーの境界", + "spiderfy-max-zoom-level": "最大ズームレベルでスパイダーファイ(すべてのクラスターマーカーを見るため)", + "load-optimization": "読み込み最適化", + "chunked-load": "ページがフリーズしないようにマーカーをチャンクで追加", + "lazy-load": "マーカーを遅延読み込みで追加", + "use-cluster-marker-color-function": "クラスターマーカーの色関数を使用", + "marker-color-function": "マーカー色関数" + }, + "edit": "マーカーを編集", + "remove-marker-for": "'{{entityName}}'のマーカーを削除", + "place-marker": "マーカーを配置", + "place-marker-hint": "クリックしてマーカーを配置", + "place-marker-hint-with-entity": "'{{entityName}}'エンティティのマーカーを配置するにはクリック" + }, + "path": { + "path": "パス", + "path-decorator": "パスデコレーター", + "decorator-symbol": "デコレーターシンボル", + "decorator-symbol-arrow-head": "矢印", + "decorator-symbol-dash": "ダッシュ", + "decorator-arrangement": "デコレーター配置", + "decorator-offset": "開始", + "decorator-end-offset": "終了", + "decorator-repeat": "繰り返し" + }, + "points": { + "points": "ポイント", + "point-tooltip": "ポイントツールチップ" + }, + "shape": { + "fill": "塗りつぶし", + "fill-type-color": "色", + "fill-type-stripe": "ストライプ", + "fill-type-image": "画像", + "color": "色", + "stripe": "ストライプ", + "image": "画像", + "stroke": "枠線", + "fill-image": "塗りつぶし画像", + "fill-image-type-image": "画像", + "fill-image-type-function": "関数", + "preserve-aspect-ratio": "アスペクト比を保持", + "opacity": "不透明度", + "angle": "回転角度", + "scale": "スケール", + "fill-image-function": "形状塗りつぶし画像関数", + "fill-images": "形状塗りつぶし画像", + "stripe-pattern": "ストライプパターン", + "first-stripe": "最初のストライプ", + "second-stripe": "2番目のストライプ" + }, + "polygon": { + "polygon-key": "ポリゴンキー", + "polygon-key-required": "ポリゴンキーは必須です", + "no-polygons": "設定されたポリゴンはありません", + "add-polygon": "ポリゴンを追加", + "polygon-configuration": "ポリゴン設定", + "remove-polygon": "ポリゴンを削除", + "edit": "ポリゴンを編集", + "remove-polygon-for": "'{{entityName}}'のポリゴンを削除", + "cut": "ポリゴン領域を切り取る", + "rotate": "ポリゴンを回転", + "draw-rectangle": "矩形を描画", + "draw-polygon": "ポリゴンを描画", + "polygon-place-first-point-cut-hint": "最初のポイントを配置するにはクリック", + "continue-polygon-cut-hint": "描画を続けるにはクリック", + "finish-polygon-cut-hint": "最初のマーカーをクリックして描画を終了し、保存", + "polygon-place-first-point-hint": "ポリゴン: 最初のポイントを配置するにはクリック", + "polygon-place-first-point-hint-with-entity": "'{{entityName}}'のポリゴン: 最初のポイントを配置するにはクリック", + "continue-polygon-hint": "ポリゴン: 描画を続けるにはクリック", + "continue-polygon-hint-with-entity": "'{{entityName}}'のポリゴン: 描画を続けるにはクリック", + "finish-polygon-hint": "ポリゴン: 最初のマーカーをクリックして描画を終了", + "finish-polygon-hint-with-entity": "'{{entityName}}'のポリゴン: 最初のマーカーをクリックして描画を終了し、保存", + "rectangle-place-first-point-hint": "矩形: 最初のポイントを配置するにはクリック", + "rectangle-place-first-point-hint-with-entity": "'{{entityName}}'の矩形: 最初のポイントを配置するにはクリック", + "finish-rectangle-hint": "矩形: 描画を終了するにはクリック", + "finish-rectangle-hint-with-entity": "'{{entityName}}'の矩形: 描画を終了して保存するにはクリック" + }, + "circle": { + "circle-key": "円キー", + "circle-key-required": "円キーは必須です", + "no-circles": "設定された円はありません", + "add-circle": "円を追加", + "circle-configuration": "円設定", + "remove-circle": "円を削除", + "edit": "円を編集", + "remove-circle-for": "'{{entityName}}'の円を削除", + "draw-circle": "円を描画", + "place-circle-center-hint-with-entity": "'{{entityName}}'の円: 円の中心を配置するにはクリック", + "place-circle-center-hint": "円: 円の中心を配置するにはクリック", + "finish-circle-hint-with-entity": "'{{entityName}}'の円: 描画を終了して保存するにはクリック", + "finish-circle-hint": "円: 描画を終了するにはクリック" + }, + "polyline": { + "polyline-key": "ポリラインキー", + "polyline-key-required": "ポリラインキーは必須です", + "no-polylines": "ポリラインが設定されていません", + "add-polylines": "ポリラインを追加", + "polyline-configuration": "ポリライン設定", + "remove-polyline": "ポリラインを削除", + "edit": "ポリラインを編集", + "cut": "ポリライン領域を切り取り", + "rotate": "ポリラインを回転", + "remove-polyline-for": "'{{entityName}}' のポリラインを削除", + "draw-polyline": "ポリラインを描画", + "polyline-place-first-point-hint-with-entity": "'{{entityName}}' のポリライン: クリックして最初のポイントを配置", + "polyline-place-first-point-hint": "ポリライン: クリックして最初のポイントを配置", + "finish-polyline-hint-with-entity": "'{{entityName}}' のポリライン: クリックして描画を完了", + "finish-polyline-hint": "ポリライン: クリックして描画を完了", + "polyline-place-first-point-cut-hint": "クリックして最初のポイントを配置", + "finish-polyline-cut-hint": "最初のマーカーをクリックして完了し保存" + }, + "select-entity": "エンティティを選択", + "select-entity-hint": "ヒント: 選択後、マップをクリックして位置を設定します" + }, + "select-entity": "エンティティを選択", + "select-entity-hint": "ヒント: 選択後、位置を設定するには地図をクリック", + "tooltips": { + "placeMarker": "'{{entityName}}'エンティティを配置するにはクリック", + "firstVertex": "'{{entityName}}'のポリゴン: 最初のポイントを配置するにはクリック", + "firstVertex-cut": "最初のポイントを配置するにはクリック", + "continueLine": "'{{entityName}}'のポリゴン: 描画を続けるにはクリック", + "continueLine-cut": "描画を続けるにはクリック", + "finishLine": "描画を終了するには既存のマーカーをクリック", + "finishPoly": "'{{entityName}}'のポリゴン: 最初のマーカーをクリックして描画を終了し、保存", + "finishPoly-cut": "最初のマーカーをクリックして描画を終了し、保存", + "finishRect": "'{{entityName}}'のポリゴン: 描画を終了して保存するにはクリック", + "startCircle": "'{{entityName}}'の円: 円の中心を配置するにはクリック", + "finishCircle": "'{{entityName}}'の円: 円の描画を終了するにはクリック", + "placeCircleMarker": "円マーカーを配置するにはクリック" + }, + "actions": { + "finish": "終了", + "cancel": "キャンセル", + "removeLastVertex": "最後のポイントを削除" + }, + "buttonTitles": { + "drawMarkerButton": "エンティティを配置", + "drawPolyButton": "ポリゴンを作成", + "drawLineButton": "ポリラインを作成", + "drawCircleButton": "円を作成", + "drawRectButton": "矩形を作成", + "editButton": "編集モード", + "dragButton": "ドラッグ&ドロップモード", + "cutButton": "ポリゴン領域を切り取る", + "deleteButton": "削除", + "drawCircleMarkerButton": "円マーカーを作成", + "rotateButton": "ポリゴンを回転" + }, + "map-provider-settings": "地図プロバイダー設定", + "map-provider": "地図プロバイダー", + "map-provider-google": "Google マップ", + "map-provider-openstreet": "OpenStreet マップ", + "map-provider-here": "HERE マップ", + "map-provider-image": "画像地図", + "map-provider-tencent": "Tencent マップ", + "openstreet-provider": "OpenStreet マッププロバイダー", + "openstreet-provider-mapnik": "OpenStreetMap.Mapnik(デフォルト)", + "openstreet-provider-hot": "OpenStreetMap.HOT", + "openstreet-provider-esri-street": "Esri.WorldStreetMap", + "openstreet-provider-esri-topo": "Esri.WorldTopoMap", + "openstreet-provider-esri-imagery": "Esri.WorldImagery", + "openstreet-provider-cartodb-positron": "CartoDB.Positron", + "openstreet-provider-cartodb-dark-matter": "CartoDB.DarkMatter", + "use-custom-provider": "カスタムプロバイダーを使用", + "custom-provider-tile-url": "カスタムプロバイダータイルURL", + "google-maps-api-key": "Google Maps APIキー", + "default-map-type": "デフォルトの地図タイプ", + "google-map-type-roadmap": "道路地図", + "google-map-type-satelite": "衛星", + "google-map-type-hybrid": "ハイブリッド", + "google-map-type-terrain": "地形", + "map-layer": "地図レイヤー", + "here-map-normal-day": "HERE.normalDay(デフォルト)", + "here-map-normal-night": "HERE.normalNight", + "here-map-hybrid-day": "HERE.hybridDay", + "here-map-terrain-day": "HERE.terrainDay", + "credentials": "認証情報", + "here-app-id": "HEREアプリID", + "here-app-code": "HEREアプリコード", + "here-api-key": "HERE APIキー", + "here-use-new-version-api-3": "APIバージョン3を使用", + "tencent-maps-api-key": "Tencent Maps APIキー", + "tencent-map-type-roadmap": "道路地図", + "tencent-map-type-satelite": "衛星", + "tencent-map-type-hybrid": "ハイブリッド", + "image-map-background": "画像地図背景", + "image-map-background-from-entity-attribute": "エンティティ属性から画像地図背景を取得", + "image-url-source-entity-alias": "画像URLソースエンティティエイリアス", + "image-url-source-entity-attribute": "画像URLソースエンティティ属性", + "common-map-settings": "共通の地図設定", + "x-pos-key-name": "X位置キー名", + "y-pos-key-name": "Y位置キー名", + "latitude-key-name": "緯度キー名", + "longitude-key-name": "経度キー名", + "default-map-zoom-level": "デフォルトの地図ズームレベル(0 - 20)", + "default-map-center-position": "デフォルトの地図中央位置(0,0)", + "disable-scroll-zooming": "スクロールズームを無効にする", + "disable-double-click-zooming": "ダブルクリックズームを無効にする", + "disable-zoom-control-buttons": "ズームコントロールボタンを無効にする", + "fit-map-bounds": "地図の境界を調整してすべてのマーカーをカバー", + "use-default-map-center-position": "デフォルトの地図中央位置を使用", + "entities-limit": "読み込むエンティティの制限", + "markers-settings": "マーカー設定", + "marker-offset-x": "位置に対するマーカーXオフセット(マーカー幅で乗算)", + "marker-offset-y": "位置に対するマーカーYオフセット(マーカー高さで乗算)", + "position-function": "位置変換関数、x,y 座標を0から1の範囲で返す必要があります", + "draggable-marker": "ドラッグ可能なマーカー", + "label": "ラベル", + "show-label": "ラベルを表示", + "use-label-function": "ラベル関数を使用", + "label-pattern": "ラベル(パターン例: '${entityName}', '${entityName}: (テキスト ${keyName} 単位.)')", + "label-function": "ラベル関数", + "tooltip": "ツールチップ", + "show-tooltip": "ツールチップを表示", + "show-tooltip-action": "ツールチップ表示のアクション", + "show-tooltip-action-click": "クリック時にツールチップを表示(デフォルト)", + "show-tooltip-action-hover": "ホバー時にツールチップを表示", + "auto-close-tooltips": "ツールチップを自動的に閉じる", + "use-tooltip-function": "ツールチップ関数を使用", + "tooltip-pattern": "ツールチップ(例: 'テキスト ${keyName} 単位.' または リンクテキスト)", + "tooltip-function": "ツールチップ関数", + "tooltip-offset-x": "マーカーアンカーに対するツールチップXオフセット(マーカー幅で乗算)", + "tooltip-offset-y": "マーカーアンカーに対するツールチップYオフセット(マーカー高さで乗算)", + "color": "色", + "use-color-function": "色関数を使用", + "color-function": "色関数", + "marker-image": "マーカー画像", + "use-marker-image-function": "マーカー画像関数を使用", + "custom-marker-image": "カスタムマーカー画像", + "custom-marker-image-size": "カスタムマーカー画像サイズ(px)", + "marker-image-function": "マーカー画像関数", + "marker-images": "マーカー画像", + "polygon-settings": "ポリゴン設定", + "show-polygon": "ポリゴンを表示", + "polygon-key-name": "ポリゴンキー名", + "enable-polygon-edit": "ポリゴン編集を有効にする", + "polygon-label": "ポリゴンラベル", + "show-polygon-label": "ポリゴンラベルを表示", + "use-polygon-label-function": "ポリゴンラベル関数を使用", + "polygon-label-pattern": "ポリゴンラベル(パターン例: '${entityName}', '${entityName}: (テキスト ${keyName} 単位.)')", + "polygon-label-function": "ポリゴンラベル関数", + "polygon-tooltip": "ポリゴンツールチップ", + "show-polygon-tooltip": "ポリゴンツールチップを表示", + "auto-close-polygon-tooltips": "ポリゴンツールチップを自動的に閉じる", + "use-polygon-tooltip-function": "ポリゴンツールチップ関数を使用", + "polygon-tooltip-pattern": "ツールチップ(例: 'テキスト ${keyName} 単位.' または リンクテキスト)", + "polygon-tooltip-function": "ポリゴンツールチップ関数", + "polygon-color": "ポリゴン色", + "polygon-opacity": "ポリゴン不透明度", + "use-polygon-color-function": "ポリゴン色関数を使用", + "polygon-color-function": "ポリゴン色関数", + "polygon-stroke": "ポリゴン枠線", + "stroke-color": "枠線の色", + "stroke-opacity": "枠線の不透明度", + "stroke-weight": "枠線の太さ", + "use-polygon-stroke-color-function": "ポリゴン枠線色関数を使用", + "polygon-stroke-color-function": "ポリゴン枠線色関数", + "circle-settings": "円設定", + "show-circle": "円を表示", + "circle-key-name": "円キー名", + "enable-circle-edit": "円編集を有効にする", + "circle-label": "円ラベル", + "show-circle-label": "円ラベルを表示", + "use-circle-label-function": "円ラベル関数を使用", + "circle-label-pattern": "円ラベル(パターン例: '${entityName}', '${entityName}: (テキスト ${keyName} 単位.)')", + "circle-label-function": "円ラベル関数", + "circle-tooltip": "円ツールチップ", + "show-circle-tooltip": "円ツールチップを表示", + "auto-close-circle-tooltips": "円ツールチップを自動的に閉じる", + "use-circle-tooltip-function": "円ツールチップ関数を使用", + "circle-tooltip-pattern": "ツールチップ(例: 'テキスト ${keyName} 単位.' または リンクテキスト)", + "circle-tooltip-function": "円ツールチップ関数", + "circle-fill-color": "円塗りつぶし色", + "circle-fill-color-opacity": "円塗りつぶし色の不透明度", + "use-circle-fill-color-function": "円塗りつぶし色関数を使用", + "circle-fill-color-function": "円塗りつぶし色関数", + "circle-stroke": "円枠線", + "use-circle-stroke-color-function": "円枠線色関数を使用", + "circle-stroke-color-function": "円枠線色関数", + "markers-clustering-settings": "マーカーのクラスタリング設定", + "use-map-markers-clustering": "地図マーカーのクラスタリングを使用", + "zoom-on-cluster-click": "クラスタをクリックしたときにズーム", + "max-cluster-zoom": "マーカーがクラスタの一部として含まれる最大ズームレベル(0 - 18)", + "max-cluster-radius-pixels": "クラスタがカバーする最大半径(ピクセル)", + "cluster-zoom-animation": "ズーム時のマーカーアニメーションを表示", + "show-markers-bounds-on-cluster-mouse-over": "クラスタにマウスオーバーしたときにマーカーの境界を表示", + "spiderfy-max-zoom-level": "最大ズームレベルでスパイダーファイ(すべてのクラスターマーカーを見るため)", + "load-optimization": "読み込み最適化", + "cluster-chunked-loading": "ページがフリーズしないようにマーカーをチャンクで追加", + "cluster-markers-lazy-load": "マーカーの遅延読み込みを使用", + "editor-settings": "エディター設定", + "enable-snapping": "精密描画のために他の頂点にスナッピングを有効にする", + "init-draggable-mode": "地図をドラッグ可能モードで初期化", + "hide-all-edit-buttons": "すべての編集コントロールボタンを非表示", + "hide-draw-buttons": "描画ボタンを非表示", + "hide-edit-buttons": "編集ボタンを非表示", + "hide-remove-button": "削除ボタンを非表示", + "route-map-settings": "ルート地図設定", + "trip-animation-settings": "旅行アニメーション設定", + "normalization-step": "正規化データステップ(ms)", + "tooltip-background-color": "ツールチップ背景色", + "tooltip-font-color": "ツールチップフォント色", + "tooltip-opacity": "ツールチップ不透明度(0-1)", + "auto-close-tooltip": "ツールチップを自動的に閉じる", + "rotation-angle": "マーカーの追加回転角度を設定(度)", + "path-settings": "パス設定", + "path-color": "パス色", + "use-path-color-function": "パス色関数を使用", + "path-color-function": "パス色関数", + "path-decorator": "パスデコレーター", + "use-path-decorator": "パスデコレーターを使用", + "decorator-symbol": "デコレーターシンボル", + "decorator-symbol-arrow-head": "矢印", + "decorator-symbol-dash": "ダッシュ", + "decorator-symbol-size": "デコレーターシンボルのサイズ(px)", + "use-path-decorator-custom-color": "パスデコレーターのカスタムカラーを使用", + "decorator-custom-color": "デコレーターのカスタムカラー", + "decorator-offset": "デコレーターオフセット", + "end-decorator-offset": "終了デコレーターオフセット", + "decorator-repeat": "デコレーターの繰り返し", + "points-settings": "ポイント設定", + "show-points": "ポイントを表示", + "point-color": "ポイントの色", + "point-size": "ポイントのサイズ(px)", + "use-point-color-function": "ポイント色関数を使用", + "point-color-function": "ポイント色関数", + "use-point-as-anchor": "ポイントをアンカーとして使用", + "point-as-anchor-function": "ポイントをアンカーとして使用する関数", + "independent-point-tooltip": "独立したポイントツールチップ", + "clustering-markers": "マーカーのクラスタリング", + "use-icon-create-function": "マーカーの色関数を使用", + "marker-color-function": "マーカー色関数" + }, + "markdown": { + "use-markdown-text-function": "Markdown/HTML値関数を使用", + "markdown-text-function": "Markdown/HTML値関数", + "markdown-text-pattern": "Markdown/HTMLパターン(変数を使用したmarkdownまたはHTML、例: '${entityName} または ${keyName} - 一部のテキスト.')", + "apply-default-markdown-style": "デフォルトのMarkdownスタイルを適用", + "markdown-css": "Markdown/HTML CSS" + }, + "simple-card": { + "label": "ラベル", + "label-position": "ラベル位置", + "label-position-left": "左", + "label-position-top": "上" + }, + "single-switch": { + "behavior": "動作", + "layout": "レイアウト", + "layout-right": "右", + "layout-left": "左", + "layout-centered": "中央", + "auto-scale": "自動スケール", + "label": "ラベル", + "icon": "アイコン", + "switch-color": "スイッチの色", + "on": "オン", + "off": "オフ", + "disabled": "無効", + "tumbler-color": "タンブラーの色", + "on-label": "オンラベル", + "off-label": "オフラベル", + "switch": "スイッチ" + }, + "slider": { + "behavior": "動作", + "initial-value": "初期値", + "initial-value-hint": "スライダーの初期値を取得するためのアクション。", + "on-value-change": "値変更時", + "on-value-change-hint": "スライダーの値が変更されたときにトリガーされるアクション。", + "layout": "レイアウト", + "layout-default": "デフォルト", + "layout-extended": "拡張", + "layout-simplified": "簡易", + "auto-scale": "自動スケール", + "icon": "アイコン", + "value": "値", + "range": "範囲", + "min": "最小", + "max": "最大", + "range-ticks": "範囲目盛り", + "tick-marks": "目盛り", + "colors": "色", + "main": "メイン", + "background": "背景", + "left-icon": "左アイコン", + "right-icon": "右アイコン", + "slider": "スライダー" + }, + "value-card": { + "layout": "レイアウト", + "layout-square": "正方形", + "layout-vertical": "縦", + "layout-centered": "中央", + "layout-simplified": "簡易", + "layout-horizontal": "横", + "layout-horizontal-reversed": "横(逆)", + "label": "ラベル", + "icon": "アイコン", + "value": "値", + "date": "日付", + "value-card-style": "値カードスタイル", + "auto-scale": "自動スケール" + }, + "label-card": { + "auto-scale": "自動スケール", + "label": "ラベル", + "icon": "アイコン", + "label-card-style": "ラベルカードスタイル" + }, + "label-value-card": { + "value": "値", + "label-value-card-style": "ラベルと値カードのスタイル" + }, + "liquid-level-card": { + "layout-simple": "シンプル", + "layout-percentage": "パーセンテージ", + "layout-absolute": "絶対", + "layout": "レイアウト", + "background-overlay": "値の背景オーバーレイ", + "total-volume": "総容量", + "total-volume-units": "総容量単位", + "tank": "タンク", + "shape": "形状", + "datasource-units": "ソース単位", + "widget-units": "ウィジェット単位", + "decimals": "小数点", + "liquid": "液体", + "liquid-color": "液体の色", + "value": "値", + "value-font": "値のフォント", + "level": "レベル", + "last-update": "最終更新", + "shape-by-attribute": "属性名でタンク形状を設定", + "tooltip-background": "背景色", + "background-blur": "背景のぼかし", + "tank-color": "タンクの色", + "static": "静的", + "see-examples": "例を見る", + "attribute": "属性", + "shape-type": "タイプ", + "v-oval": "縦楕円", + "v-cylinder": "縦シリンダー", + "v-capsule": "縦カプセル", + "rectangle": "矩形", + "h-oval": "横楕円", + "h-ellipse": "横楕円形", + "h-dish-ends": "横皿型端", + "h-cylinder": "横シリンダー", + "h-capsule": "横カプセル", + "h-elliptical_2_1": "横2:1楕円", + "icon": "カードアイコン", + "title": "カードタイトル", + "units": "単位", + "color-and-font": "色とフォント", + "shape-attribute-name": "属性名", + "total-volume-required": "総容量は必須です。", + "attribute-name-required": "属性名は必須です。", + "attribute-key-not-set": "属性 '{{attributeName}}' のキーが設定されていません", + "attribute-key-invalid": "属性 '{{attributeName}}' のキーが無効です" + }, + "aggregated-value-card": { + "subtitle": "サブタイトル", + "chart": "チャート", + "values": "値", + "value-appearance": "値の外観", + "position": "位置", + "position-center": "中央", + "position-right-top": "右上", + "position-right-bottom": "右下", + "position-left-top": "左上", + "position-left-bottom": "左下", + "font": "フォント", + "color": "色", + "arrow": "矢印", + "display-up-down-arrow": "上下矢印を表示", + "add-value": "値を追加", + "remove-value": "値を削除", + "no-values": "設定された値はありません", + "aggregation": "集計", + "aggregated-value-card-style": "集計値カードスタイル", + "auto-scale": "自動スケール" + }, + "value-chart-card": { + "layout": "レイアウト", + "layout-left": "左", + "layout-right": "右", + "auto-scale": "自動スケール", + "icon": "アイコン", + "value": "値", + "chart": "チャート", + "value-chart-card-style": "値チャートカードスタイル" + }, + "progress-bar": { + "layout": "レイアウト", + "layout-default": "デフォルト", + "layout-simplified": "簡易", + "auto-scale": "自動スケール", + "icon": "アイコン", + "value": "値", + "range": "範囲", + "min": "最小", + "max": "最大", + "range-ticks": "範囲目盛り", + "bar": "バー", + "bar-color": "バーの色", + "bar-background": "バーの背景", + "progress-bar-card-style": "プログレスバーカードスタイル" + }, + "notification": { + "max-notification-display": "表示する最大通知数", + "counter": "カウンター", + "counter-hint": "\"ウィジェットタイトル\"が有効な場合にカウンターが表示されます", + "icon": "アイコン", + "counter-value": "値", + "counter-color": "色", + "notification-button": "通知ボタン", + "button-view-all": "すべて表示", + "button-filter": "フィルター", + "type-filter": "タイプフィルター", + "button-mark-read": "すべてを既読にマーク", + "notification-types": "通知タイプ", + "notification-type": "通知タイプ", + "search-type": "タイプ検索", + "any-type": "任意のタイプ" + }, + "alarm-count": { + "alarm-count-card-style": "アラームカウントカードスタイル" + }, + "entity-count": { + "entity-count-card-style": "エンティティカウントカードスタイル" + }, + "count": { + "layout": "レイアウト", + "layout-column": "列", + "layout-row": "行", + "label": "ラベル", + "icon": "アイコン", + "icon-background": "アイコン背景", + "value": "値", + "chevron": "シェブロン", + "auto-scale": "自動スケール" + }, + "table": { + "common-table-settings": "共通テーブル設定", + "enable-search": "検索を有効にする", + "enable-sticky-header": "ヘッダーを常に表示", + "enable-sticky-action": "アクション列を常に表示", + "hidden-cell-button-display-mode": "隠れたセルボタンアクションの表示モード", + "show-empty-space-hidden-action": "隠れたセルボタンアクションの代わりに空白を表示", + "dont-reserve-space-hidden-action": "隠れたアクションボタンのためにスペースを予約しない", + "display-timestamp": "タイムスタンプ", + "timestamp-column-name": "タイムスタンプ", + "display-pagination": "ページネーションを表示", + "default-page-size": "デフォルトのページサイズ", + "page-step-settings": "ページステップ設定", + "page-step-count": "ステップ数", + "page-step-increment": "ステップ増分", + "page-step-count-format-message": "1から100の範囲の整数値である必要があります。", + "page-step-increment-format-message": "1以上の整数値である必要があります。", + "use-entity-label-tab-name": "タブ名にエンティティラベルを使用", + "hide-empty-lines": "空白行を非表示", + "row-style": "行スタイル", + "use-row-style-function": "行スタイル関数を使用", + "row-style-function": "行スタイル関数", + "cell-style": "セルスタイル", + "use-cell-style-function": "セルスタイル関数を使用", + "cell-style-function": "セルスタイル関数", + "cell-content": "セルコンテンツ", + "use-cell-content-function": "セルコンテンツ関数を使用", + "cell-content-function": "セルコンテンツ関数", + "show-latest-data-column": "最新データ列を表示", + "latest-data-column-order": "最新データ列の順序", + "entities-table-title": "エンティティテーブルタイトル", + "enable-select-column-display": "表示する列を選択を有効にする", + "display-entity-name": "エンティティ名列を表示", + "entity-name-column-title": "エンティティ名列タイトル", + "display-entity-label": "エンティティラベル列を表示", + "entity-label-column-title": "エンティティラベル列タイトル", + "display-entity-type": "エンティティタイプ列を表示", + "default-sort-order": "デフォルトの並べ替え順序", + "custom-title": "カスタムヘッダータイトル", + "column-width": "列の幅(pxまたは%)", + "default-column-visibility": "デフォルトの列表示設定", + "column-visibility-visible": "表示", + "column-visibility-hidden": "非表示", + "column-visibility-hidden-mobile": "モバイルモードでは非表示", + "column-selection-to-display": "'表示する列' の列選択", + "column-selection-to-display-enabled": "有効", + "column-selection-to-display-disabled": "無効", + "alarms-table-title": "アラームテーブルタイトル", + "enable-alarms-selection": "アラーム選択を有効にする", + "enable-alarms-search": "アラーム検索を有効にする", + "enable-alarm-filter": "アラームフィルターを有効にする", + "display-alarm-details": "アラーム詳細を表示", + "allow-alarms-ack": "アラーム確認を許可", + "allow-alarms-clear": "アラームクリアを許可", + "display-alarm-activity": "アラーム活動を表示", + "allow-alarms-assign": "アラームの割り当てを許可", + "columns": "列", + "column-settings": "列設定", + "remove-column": "列を削除", + "add-column": "列を追加", + "no-columns": "設定された列はありません", + "columns-to-display": "表示する列", + "table-header": "テーブルヘッダー", + "header-buttons": "ヘッダーボタン", + "table-buttons": "テーブルボタン", + "pagination": "ページネーション", + "rows": "行", + "timeseries-column-error": "少なくとも1つの時系列列を指定する必要があります", + "alarm-column-error": "少なくとも1つのアラーム列を指定する必要があります", + "table-tabs": "テーブルタブ", + "show-cell-actions-menu-mobile": "モバイルモードでセルアクションのドロップダウンメニューを表示", + "disable-sorting": "ソートを無効にする", + "sort-by": "タブの並べ替え基準", + "sort-timestamp-option": "作成日時" + }, + "latest-chart": { + "total": "合計", + "auto-scale": "自動スケール", + "clockwise-layout": "時計回りのレイアウト", + "sort-series": "ラベルで系列をソート", + "tooltip-value-type-absolute": "絶対", + "tooltip-value-type-percentage": "パーセンテージ" + }, + "pie-chart": { + "pie-chart-appearance": "円グラフの外観", + "label": "ラベル", + "border": "枠線", + "radius": "半径", + "pie-chart-card-style": "円グラフカードスタイル" + }, + "radar-chart": { + "radar-appearance": "レーダーの外観", + "shape": "形状", + "shape-polygon": "ポリゴン", + "shape-circle": "円形", + "color": "色", + "line": "線", + "points": "ポイント", + "points-label": "ポイントラベル", + "radar-axis": "レーダー軸", + "axis-label": "軸ラベル", + "ticks-label": "目盛りラベル", + "radar-chart-style": "レーダーチャートスタイル", + "max-axes-scaling": "最大軸スケーリング", + "max-axes-scaling-hint": "各レーダー軸に個別の最大値を設定するか(別々に)、またはウィジェットデータセットに基づいてすべての軸で最高値を共有するか(共通)を選択します。", + "separate": "別々に", + "common": "共通" + }, + "time-series-chart": { + "chart": "チャート", + "chart-style": "チャートスタイル", + "data-zoom": "データズーム", + "stack-mode": "スタックモード", + "stack-mode-hint": "チャート上で系列を積み重ねます。同じ単位の系列は互いに重ねて表示されます。", + "axes": "軸", + "y-axes": "Y軸", + "line-type": "線の種類", + "line-width": "線の幅", + "type-line": "線", + "type-bar": "バー", + "type-point": "ポイント", + "no-aggregation-bar-width-strategy": "非集計データのバー幅戦略", + "no-aggregation-bar-width-strategy-group": "グループ", + "no-aggregation-bar-width-strategy-separate": "別々に", + "bar-group-width": "バーグループ幅", + "bar-width": "バー幅", + "bar-width-relative": "時間ウィンドウの割合", + "bar-width-absolute": "絶対値(ms)", + "comparison": { + "comparison": "比較", + "comparison-hint": "比較は過去のデータにのみ機能します!", + "show": "表示", + "settings": "比較設定", + "show-values-for-comparison": "比較のために過去のデータを表示", + "comparison-values-label": "比較キーラベル", + "comparison-values-label-auto": "自動", + "comparison-data-color": "比較データの色" + }, + "threshold": { + "thresholds": "閾値", + "source": "ソース", + "key-value": "キー / 値", + "no-thresholds": "設定された閾値はありません", + "add-threshold": "閾値を追加", + "type-constant": "定数", + "type-latest-key": "キー", + "type-entity": "エンティティ", + "threshold-settings": "閾値設定", + "remove-threshold": "閾値を削除", + "threshold-value-required": "閾値の値は必須です。", + "key-required": "キーは必須です。", + "entity-key-required": "エンティティキーは必須です。", + "line-appearance": "線の外観", + "line-color": "線の色", + "start-symbol": "開始シンボル", + "end-symbol": "終了シンボル", + "symbol-size": "サイズ", + "label": "ラベル", + "label-position-start": "開始", + "label-position-middle": "中央", + "label-position-end": "終了", + "label-position-inside-start": "内側開始", + "label-position-inside-start-top": "内側開始上", + "label-position-inside-start-bottom": "内側開始下", + "label-position-inside-middle": "内側中央", + "label-position-inside-middle-top": "内側中央上", + "label-position-inside-middle-bottom": "内側中央下", + "label-position-inside-end": "内側終了", + "label-position-inside-end-top": "内側終了上", + "label-position-inside-end-bottom": "内側終了下", + "label-background": "ラベルの背景" + }, + "state": { + "states": "状態", + "label": "ラベル", + "ticks-value": "目盛りの値", + "source": "ソース", + "value-range": "値 / 範囲", + "no-states": "設定された状態はありません", + "add-state": "状態を追加", + "type-constant": "定数", + "type-range": "範囲", + "from": "から", + "to": "まで", + "remove-state": "状態を削除" + }, + "grid": { + "grid": "グリッド", + "background-color": "背景色", + "border": "枠線" + }, + "axis": { + "axes": "軸", + "x-axis": "X軸", + "y-axis": "Y軸", + "y-axis-settings": "Y軸設定", + "comparison-x-axis-settings": "比較X軸設定", + "remove-y-axis": "Y軸を削除", + "id": "ID", + "label": "ラベル", + "position": "位置", + "position-left": "左", + "position-right": "右", + "position-top": "上", + "position-bottom": "下", + "tick-labels": "目盛りラベル", + "ticks-formatter-function": "目盛り書式関数", + "ticks-generator-function": "目盛り生成関数", + "show-ticks": "目盛りを表示", + "show-line": "線を表示", + "show-split-lines": "分割線を表示", + "show-split-lines-x-axis-hint": "有効にすると、チャート上の縦線が表示されます。", + "show-split-lines-y-axis-hint": "有効にすると、チャート上の横線が表示されます。", + "ticks-interval": "目盛り間隔", + "ticks-interval-hint": "軸の分割間隔を強制的に設定します。", + "split-number": "分割数", + "split-number-hint": "軸が分割されるセグメント数。", + "min": "最小", + "max": "最大", + "show": "表示", + "add-y-axis": "Y軸を追加" + }, + "series": { + "legend-settings": "凡例設定", + "show-in-legend": "凡例に表示", + "show-in-legend-hint": "凡例に系列名とデータを表示します。", + "hidden-by-default": "デフォルトで非表示", + "hidden-by-default-hint": "デフォルトで凡例に系列を非表示にします。", + "series-type": "系列タイプ", + "type": "タイプ", + "type-line": "線", + "type-bar": "バー", + "line": { + "line": "線", + "show-line": "線を表示", + "step-line": "ステップライン", + "step-type-start": "開始", + "step-type-middle": "中央", + "step-type-end": "終了", + "smooth-line": "スムーズライン" + }, + "point": { + "points": "ポイント", + "show-points": "ポイントを表示", + "point-label": "ポイントラベル", + "point-label-hint": "系列ポイント上に値を表示するラベルを表示。", + "point-label-background": "ポイントラベルの背景", + "point-shape": "ポイントの形状", + "point-size": "ポイントのサイズ" + } + } + }, + "wind-speed-direction": { + "layout": "レイアウト", + "layout-default": "デフォルト", + "layout-advanced": "詳細", + "layout-simplified": "簡易", + "values": "値", + "wind-direction": "風向", + "center-value": "中央の値", + "icon": "アイコン", + "arrow": "矢印", + "ticks": "目盛り", + "labels-type": "ラベルの種類", + "directional-names": "方位名", + "degrees": "度", + "major-ticks": "主目盛り", + "minor-ticks": "補助目盛り", + "wind-speed-direction-card-style": "風速・風向カードのスタイル", + "ticks-color": "目盛りの色", + "ticks-labels-type": "目盛りラベルの種類", + "arrow-color": "矢印の色" + }, + "value-source": { + "value-source": "値のソース", + "predefined-value": "定数", + "entity-attribute": "エンティティ属性", + "value": "値", + "value-required": "値は必須です。", + "key-required": "キーは必須です。", + "entity-key-required": "エンティティキーは必須です。", + "source-entity-alias": "ソースエンティティエイリアス", + "source-entity-attribute": "ソースエンティティ属性", + "type-constant": "定数", + "type-latest-key": "キー", + "type-entity": "エンティティ" + }, + "rpc-state": { + "initial-state": "初期状態", + "initial-state-hint": "コンポーネントの初期状態(オン/オフ)を取得するアクション。", + "disabled-state": "無効状態", + "disabled-state-hint": "コンポーネントが無効になる条件を設定します。", + "turn-on": "'オン'にする", + "turn-on-hint": "'オン'に切り替えたときにトリガーされるアクション", + "turn-off": "'オフ'にする", + "turn-off-hint": "'オフ'に切り替えたときにトリガーされるアクション", + "on": "オン", + "off": "オフ", + "disabled": "無効" + }, + "value-action": { + "do-nothing": "何もしない", + "execute-rpc": "RPCを実行", + "get-attribute": "属性を取得", + "set-attribute": "属性を設定", + "get-time-series": "時系列データを取得", + "get-alarm-status": "アラーム状態を取得", + "get-dashboard-state": "ダッシュボード状態IDを取得", + "get-dashboard-state-object": "ダッシュボード状態オブジェクトを取得", + "add-time-series": "時系列データを追加", + "execute-rpc-text": "RPCメソッド '{{methodName}}' を実行", + "get-time-series-text": "時系列 '{{key}}' を使用", + "get-attribute-text": "属性 '{{key}}' を使用", + "get-alarm-status-text": "アラーム状態を使用", + "get-dashboard-state-text": "ダッシュボード状態を使用", + "get-dashboard-state-object-text": "ダッシュボード状態オブジェクトを使用", + "when-dashboard-state-is-text": "ダッシュボード状態IDが '{{state}}' の場合", + "when-dashboard-state-function-is-text": "f(ダッシュボード状態ID)が '{{state}}' の場合", + "when-dashboard-state-object-function-is-text": "f(ダッシュボード状態オブジェクト)が '{{state}}' の場合", + "set-attribute-to-value-text": "'{{key}}' 属性を {{value}} に設定", + "add-time-series-value-text": "'{{key}}' 時系列値を {{value}} に追加", + "set-attribute-text": "'{{key}}' 属性を設定", + "add-time-series-text": "'{{key}}' 時系列データを追加", + "action": "アクション", + "value": "値", + "init-value-hint": "デバイスがデータを送信するまで設定される値。", + "method": "メソッド", + "method-name-required": "メソッド名は必須です。", + "request-timeout-ms": "RPCリクエストタイムアウト(ms)", + "request-timeout-required": "リクエストタイムアウトは必須です。", + "min-request-timeout-error": "リクエストタイムアウト値は5000ms(5秒)以上である必要があります。", + "request-persistent": "RPCリクエストの永続性", + "persistent-polling-interval": "永続的なポーリング間隔(ms)", + "persistent-polling-interval-hint": "永続的なRPCコマンドレスポンスを取得するためのポーリング間隔(ms)", + "persistent-polling-interval-required": "永続的なポーリング間隔は必須です。", + "min-persistent-polling-interval-error": "永続的なポーリング間隔値は1000ms(1秒)以上である必要があります。", + "attribute-scope": "属性スコープ", + "attribute-key": "属性キー", + "attribute-key-required": "属性キーは必須です。", + "time-series-key": "時系列キー", + "time-series-key-required": "時系列キーは必須です。", + "action-result-converter": "アクション結果コンバーター", + "converter-none": "なし", + "converter-function": "関数", + "converter-constant": "定数", + "converter-value": "値", + "parse-value-function": "値解析関数", + "state-when-result-is": "結果が'{{state}}'のとき", + "parameters": "パラメータ", + "convert-value-function": "値変換関数", + "error": { + "target-entity-is-not-set": "ターゲットエンティティが設定されていません!", + "failed-to-perform-action": "{{ actionLabel }}アクションの実行に失敗しました。", + "invalid-attribute-scope": "{{scope}} 属性スコープは{{entityType}}エンティティではサポートされていません。" + } + }, + "widget-font": { + "font-settings": "フォント設定", + "font-family": "フォントファミリ", + "size": "サイズ", + "relative-font-size": "相対フォントサイズ(パーセント)", + "font-style": "スタイル", + "font-style-normal": "標準", + "font-style-italic": "斜体", + "font-style-oblique": "傾斜体", + "font-weight": "太さ", + "font-weight-normal": "標準", + "font-weight-bold": "太字", + "font-weight-bolder": "より太字", + "font-weight-lighter": "より細字", + "color": "色", + "shadow-color": "影の色", + "preview": "プレビュー", + "line-height": "行の高さ", + "auto": "自動" + }, + "home": { + "no-data-available": "データがありません" + }, + "system-info": { + "cpu": "CPU", + "ram": "RAM", + "disk": "ディスク", + "cpu-warning-text": "CPU使用率が高い状態です。システム障害を避けるため、システムパフォーマンスを最適化してください。", + "cpu-critical-text": "CPU使用率が非常に高い状態です。システム障害を避けるため、システムパフォーマンスを最適化してください。", + "ram-warning-text": "RAMの空き容量が少なくなっています。システム障害を避けるため、システムパフォーマンスを最適化するか、RAMのサイズを増加させてください。", + "ram-critical-text": "RAMの空き容量が非常に少ない状態です。システム障害を避けるため、システムパフォーマンスを最適化するか、RAMのサイズを増加させてください。", + "disk-warning-text": "ディスクの空き容量が少なくなっています。データ損失を避けるため、ディスクの空き容量を確保するか、ディスクの容量を増加させてください。", + "disk-critical-text": "ディスクの空き容量が非常に少ない状態です。データ損失を避けるため、ディスクの空き容量を確保するか、ディスクの容量を増加させてください。" + }, + "cluster-info": { + "service-id": "サービスID", + "service-type": "サービスタイプ", + "no-data": "データなし" + }, + "transport-messages": { + "title": "トランスポートメッセージ", + "info": "デバイスから送信されたすべてのメッセージ" + }, + "activity": { + "title": "アクティビティ" + }, + "documentation": { + "title": "ドキュメント", + "add-link": "リンクを追加", + "add-link-title": "ドキュメントリンクを追加", + "name": "名前", + "name-required": "名前は必須です。", + "link": "リンク", + "link-required": "リンクは必須です。", + "columns": "列" + }, + "quick-links": { + "title": "クイックリンク", + "add-link": "リンクを追加", + "add-link-title": "クイックリンクを追加", + "quick-link": "クイックリンク", + "quick-link-required": "クイックリンクは必須です。", + "no-links-matching": "'{{name}}' に一致するリンクは見つかりませんでした。", + "columns": "列" + }, + "recent-dashboards": { + "title": "ダッシュボード", + "last": "最後に表示したもの", + "starred": "お気に入り", + "name": "名前", + "last-viewed": "最後に表示した日時", + "no-last-viewed-dashboards": "最後に表示したダッシュボードはまだありません" + }, + "configured-features": { + "title": "設定された機能", + "info": "設定が必要な機能の状態", + "email-feature": "メール", + "sms-feature": "SMS", + "slack-feature": "Slack", + "oauth2-feature": "OAuth 2", + "2fa-feature": "2FA", + "feature-configured": "機能は設定されています。\n設定するにはクリック", + "feature-not-configured": "機能は設定されていません。\n設定するにはクリック" + }, + "version-info": { + "title": "バージョン", + "contact-us": "お問い合わせ", + "current-version": "現在のバージョン", + "current": "現在", + "available-version": "利用可能なバージョン", + "available": "利用可能", + "upgrade": "アップグレード", + "version-is-up-to-date": "バージョンは最新です" + }, + "usage-info": { + "title": "使用状況", + "entities": "エンティティ", + "api-calls": "API呼び出し" + }, + "functions": { + "title": "機能", + "pe-feature-tooltip": "ThingsBoard\nProfessional Edition のみ", + "switch-to-pe": "PEに切り替え", + "alarms": "アラーム", + "dashboards": "ダッシュボード", + "entities-and-relations": "エンティティ & リレーション", + "profiles": "プロファイル", + "advanced-features": "高度な機能", + "notification-center": "通知センター", + "api-usage": "API使用状況", + "customers": "顧客", + "customers-hierarchy": "顧客階層", + "roles-and-permissions": "ロール & 権限", + "groups": "グループ", + "integrations": "統合", + "solution-templates": "ソリューションテンプレート", + "scheduler": "スケジューラ", + "white-labeling": "ホワイトラベリング" + }, + "devices": { + "view-docs": "ドキュメントを見る", + "inactive": "非アクティブ", + "active": "アクティブ", + "total": "合計" + }, + "alarms": { + "critical": "クリティカル", + "assigned-to-me": "私に割り当てられた", + "total": "合計" + }, + "getting-started": { + "get-started": "始める", + "finish": "終了", + "done-welcome-title": "ようこそ", + "done-welcome-text": "お疲れ様でした!", + "sys-admin": { + "step1": { + "title": "テナント & テナント管理者の作成", + "content": "

テナントとは、デバイスやアセットを所有または製造する個人または組織です。テナントには複数のテナント管理者ユーザー、顧客、デバイス、アセットがあります。

テナント管理者は、テナントアカウント内でデバイス、アセット、顧客、ダッシュボードを作成および管理できます。

作成方法については、以下のドキュメントを参照してください:

", + "how-to-create-tenant": "テナント & テナント管理者を作成する方法" + }, + "step2": { + "title": "機能の設定: メールサーバー", + "content": "

メールサーバーの設定は、ユーザーの有効化、パスワードの回復、アラーム通知の配信に不可欠です。

設定方法については、以下のドキュメントを参照してください:

", + "how-to-configure-mail-server": "メールサーバーを設定する方法" + }, + "step3": { + "title": "機能の設定: SMSプロバイダー", + "content": "

SMSプロバイダーを設定して、顧客にアラームをSMSで通知します。

設定方法については、以下のドキュメントを参照してください:

", + "how-to-configure-sms-provider": "SMSプロバイダーを設定する方法" + }, + "step4": { + "title": "機能の設定: ホワイトラベリング", + "content": "

コードを記述せず、サービスを再起動せずに、会社や製品のロゴやカラースキームを簡単にカスタマイズできます。

設定方法については、以下のドキュメントを参照してください:

" + }, + "step5": { + "title": "機能の設定: 2FA", + "content": "

二要素認証でプラットフォームアカウントのセキュリティを強化します。

設定方法については、以下のドキュメントを参照してください:

" + }, + "step6": { + "title": "機能の設定: OAuth 2", + "content": "

OAuth 2.0を使用したシングルサインオン機能で、テナントと顧客ユーザーのログインを簡素化します。

設定方法については、以下のドキュメントを参照してください:

" + } + }, + "tenant-admin": { + "step1": { + "title": "デバイスの作成", + "content": "

UIを通じて最初のデバイスをプラットフォームにプロビジョニングします。手順については、以下のドキュメントを参照してください:

", + "how-to-create-device": "デバイスの作成方法" + }, + "step2": { + "title": "デバイスの接続", + "content-before": "

デバイスを接続するには、デバイスの認証情報が必要です。このガイドでは、デフォルトで自動生成された認証情報(アクセストークン)を使用することをお勧めします。

  • デバイステーブルに移動
  • デバイスの行をクリックしてデバイスの詳細を開く
  • 「アクセストークンをコピー」ボタンを押す

HTTP経由でデータを公開するための簡単なコマンドを使用します。$ACCESS_TOKEN をデバイスのアクセストークンに置き換えることを忘れないでください:

", + "ubuntu": { + "install-curl": "UbuntuにcURLをインストール:" + }, + "macos": { + "install-curl": "MacOSにcURLをインストール:" + }, + "windows": { + "install-curl": "Windows 10 b17063以降、cURLはデフォルトで使用可能です。" + }, + "replace-access-token": "$ACCESS_TOKEN をデバイスのトークンに置き換える:", + "content-after": "

MQTT、CoAPなど、他のプロトコルも使用できます。

設定方法については、以下のドキュメントを参照してください:

", + "how-to-connect-device": "デバイスの接続方法" + }, + "step3": { + "title": "ダッシュボードの作成", + "content": "

アセット、デバイスなどのエンティティからデータを可視化するためのダッシュボードを作成します。

作成方法については、以下のドキュメントを参照してください:

", + "how-to-create-dashboard": "ダッシュボードの作成方法" + }, + "step4": { + "title": "アラームルールの設定", + "alarm-rules": "アラームルール", + "content": "

温度が25°Cに達したときにアラームを発生させましょう。設定方法については、以下のドキュメントを参照してください:

", + "how-to-configure-alarm-rules": "アラームルールの設定方法" + }, + "step5": { + "title": "アラームの作成", + "content-before": "

アラームをトリガーするには、新しいテレメトリ値として26°C以上を送信してください。

", + "replace-access-token": "$ACCESS_TOKEN をデバイスのトークンに置き換える:", + "content-after": "

設定方法については、以下のドキュメントを参照してください:

", + "how-to-create-alarm": "アラームの作成方法" + }, + "step6": { + "title": "顧客の作成とダッシュボードの共有", + "content": "

エンドユーザー用のダッシュボードを作成することにより、顧客ユーザーは自分のデバイスのみを表示でき、他の顧客のデータは非表示にされます。

作成方法については、以下のドキュメントを参照してください:

" + } + } + }, + "api-usage": { + "api-usage": "API 使用状況", + "label": "ラベル", + "state-name": "状態名", + "status": "ステータス", + "status-required": "ステータスは必須です。", + "limit": "最大上限", + "limit-required": "最大上限は必須です。", + "current-number": "現在の数", + "current-number-required": "現在の数は必須です。", + "add-key": "キーを追加", + "no-key": "キーがありません", + "delete-key": "キーを削除", + "target-dashboard-state": "対象ダッシュボード状態", + "go-to-main-state": "既定ビューに移動" + } + }, + "icon": { + "icon": "アイコン", + "icons": "アイコン", + "custom": "カスタム", + "select-icon": "アイコンを選択", + "material-icons": "マテリアルアイコン", + "show-all": "すべてのアイコンを表示", + "search-icon": "アイコンを検索", + "no-icons-found": "'{{iconSearch}}' のアイコンは見つかりませんでした" + }, + "phone-input": { + "phone-input-label": "電話番号", + "phone-input-required": "電話番号は必須です", + "phone-input-validation": "電話番号が無効か、利用不可能です", + "phone-input-pattern": "無効な電話番号です。E.164形式でなければなりません。例: {{phoneNumber}}", + "phone-input-hint": "E.164形式の電話番号。例: {{phoneNumber}}" + }, + "custom": { + "widget-action": { + "action-cell-button": "アクションセルボタン", + "row-click": "行をクリックしたとき", + "cell-click": "セルをクリックしたとき", + "polygon-click": "ポリゴンをクリックしたとき", + "marker-click": "マーカーをクリックしたとき", + "circle-click": "円をクリックしたとき", + "tooltip-tag-action": "ツールチップタグアクション", + "node-selected": "ノードが選択されたとき", + "element-click": "HTML要素をクリックしたとき", + "pie-slice-click": "スライスをクリックしたとき", + "row-double-click": "行をダブルクリックしたとき", + "cell-double-click": "セルをダブルクリックしたとき", + "card-click": "カードをクリックしたとき", + "click": "クリックしたとき" + } + }, + "paginator": { + "items-per-page": "ページあたりのアイテム数:", + "first-page-label": "最初のページ", + "last-page-label": "最後のページ", + "next-page-label": "次のページ", + "previous-page-label": "前のページ", + "items-per-page-separator": "の" + }, + "language": { + "auto": "自動", + "language": "言語" + } +} \ No newline at end of file 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 b1866fb746..01d828b1be 100644 --- a/ui-ngx/src/assets/locale/locale.constant-nl_NL.json +++ b/ui-ngx/src/assets/locale/locale.constant-nl_NL.json @@ -78,6 +78,7 @@ "show-more": "Meer weergeven", "dont-show-again": "Niet opnieuw weergeven", "see-documentation": "Bekijk documentatie", + "see-debug-events": "Debuggebeurtenissen bekijken", "clear": "Wissen", "upload": "Uploaden", "delete-anyway": "Toch verwijderen", @@ -485,6 +486,7 @@ "2fa": { "2fa": "Twee-factor-authenticatie", "available-providers": "Beschikbare providers", + "available-providers-required": "Er moet ten minste één 2FA-provider zijn geconfigureerd.", "issuer-name": "Naam uitgever", "issuer-name-required": "Naam uitgever is verplicht.", "max-verification-failures-before-user-lockout": "Maximaal aantal verificatiefouten vóór accountvergrendeling", @@ -513,7 +515,9 @@ "verification-message-template-required": "Sjabloon verificatiebericht is verplicht.", "within-time": "Binnen tijd (sec)", "within-time-pattern": "Tijd moet een positief geheel getal zijn.", - "within-time-required": "Tijd is verplicht." + "within-time-required": "Tijd is verplicht.", + "force-2fa": "Twee-factor-authenticatie afdwingen", + "enforce-for": "Afdwingen voor" }, "jwt": { "security-settings": "JWT-beveiligingsinstellingen", @@ -545,16 +549,11 @@ "slack-settings": "Slack-instellingen", "mobile-settings": "Mobiele instellingen", "firebase-service-account-file": "Firebase serviceaccountreferenties JSON-bestand", - "select-firebase-service-account-file": "Sleep je Firebase serviceaccountreferentiesbestand hierheen of ", - "trendz": "Trendz", - "trendz-settings": "Trendz-instellingen", - "trendz-url": "Trendz-URL", - "trendz-url-required": "Trendz-URL is vereist", - "trendz-api-key": "Trendz API-sleutel", - "trendz-enable": "Trendz inschakelen" + "select-firebase-service-account-file": "Sleep je Firebase serviceaccountreferentiesbestand hierheen of " }, "alarm": { "alarm": "Alarm", + "alarm-list": "Alarmlijst", "alarms": "Alarmen", "all-alarms": "Alle alarmen", "select-alarm": "Selecteer alarm", @@ -655,7 +654,16 @@ "alarm-type": "Alarmtype", "enter-alarm-type": "Voer alarmtype in", "no-alarm-types-matching": "Geen alarmtypen gevonden die overeenkomen met '{{entitySubtype}}'.", - "alarm-type-list-empty": "Geen alarmtypen geselecteerd." + "alarm-type-list-empty": "Geen alarmtypen geselecteerd.", + "system-comments": { + "acked-by-user": "Alarm is bevestigd door gebruiker {{userName}}", + "cleared-by-user": "Alarm is beëindigd door gebruiker {{userName}}", + "assigned-to-user": "Alarm is toegewezen door gebruiker {{userName}} aan gebruiker {{assigneeName}}", + "unassigned-to-user": "Alarmtoewijzing is verwijderd door gebruiker {{userName}}", + "unassigned-from-deleted-user": "Alarmtoewijzing is verwijderd omdat gebruiker {{userName}} - is verwijderd", + "comment-deleted": "Gebruiker {{userName}} heeft de opmerking verwijderd", + "severity-changed": "Alarmernst is bijgewerkt van {{oldSeverity}} naar {{newSeverity}}" + } }, "alarm-activity": { "add": "Voeg een opmerking toe...", @@ -760,6 +768,7 @@ "name-max-length": "Naam mag maximaal 256 tekens bevatten", "label-max-length": "Label mag maximaal 256 tekens bevatten", "description": "Beschrijving", + "description-required": "Beschrijving is vereist.", "type": "Type", "type-required": "Type is verplicht.", "details": "Details", @@ -873,6 +882,9 @@ "alarms-created-monthly-activity": "Maandelijkse activiteit gegenereerde alarmen", "data-points": "Datapunten", "data-points-storage-days": "Opslagduur van datapunten (dagen)", + "data-points-storage-days-hourly-activity": "Datapuntenopslagdagen: uurlijkse activiteit", + "data-points-storage-days-daily-activity": "Datapuntenopslagdagen: dagelijkse activiteit", + "data-points-storage-days-monthly-activity": "Datapuntenopslagdagen: maandelijkse activiteit", "device-api": "Apparaat-API", "email": "E-mail", "email-messages": "E-mailberichten", @@ -906,6 +918,7 @@ "rule-node": "Rule node", "sms": "SMS", "sms-messages": "SMS-berichten", + "sms-messages-hourly-activity": "SMS-berichten: uurlijkse activiteit", "sms-messages-daily-activity": "Dagelijkse activiteit SMS-berichten", "sms-messages-monthly-activity": "Maandelijkse activiteit SMS-berichten", "successful": "${entityName} Succesvol", @@ -915,13 +928,38 @@ "telemetry-persistence-hourly-activity": "Uurlijkse activiteit telemetrie-opslag", "telemetry-persistence-monthly-activity": "Maandelijkse activiteit telemetrie-opslag", "transport": "Transport", + "transport-msg-hourly-activity": "Transportberichten: uurlijkse activiteit", + "transport-msg-daily-activity": "Transportberichten: dagelijkse activiteit", + "transport-msg-monthly-activity": "Transportberichten: maandelijkse activiteit", "transport-daily-activity": "Dagelijkse activiteit transport", "transport-data-points": "Transport datapunten", - "transport-hourly-activity": "Uurlijkse activiteit transport", + "transport-data-points-hourly-activity": "Transportdatapunten: uurlijkse activiteit", + "transport-data-points-daily-activity": "Transportdatapunten: dagelijkse activiteit", + "transport-data-points-monthly-activity": "Transportdatapunten: maandelijkse activiteit", "transport-messages": "Transportberichten", - "transport-monthly-activity": "Maandelijkse activiteit transport", - "view-details": "Details bekijken", - "view-statistics": "Statistieken bekijken" + "transport-messages-hourly-activity": "Transportberichten: uurlijkse activiteit", + "transport-data-point-hourly-activity": "Transportdatapunt: uurlijkse activiteit", + "javascript-function-executions": "JavaScript-functie-uitvoeringen", + "javascript-function-executions-hourly-activity": "JavaScript-functie-uitvoeringen: uurlijkse activiteit", + "javascript-function-executions-daily-activity": "JavaScript-functie-uitvoeringen: dagelijkse activiteit", + "javascript-function-executions-monthly-activity": "JavaScript-functie-uitvoeringen: maandelijkse activiteit", + "tbel-function-executions": "TBEL-functie-uitvoeringen", + "tbel-function-executions-hourly-activity": "TBEL-functie-uitvoeringen: uurlijkse activiteit", + "tbel-function-executions-daily-activity": "TBEL-functie-uitvoeringen: dagelijkse activiteit", + "tbel-function-executions-monthly-activity": "TBEL-functie-uitvoeringen: maandelijkse activiteit", + "created-reports": "Aangemaakte rapporten", + "created-reports-hourly-activity": "Aangemaakte rapporten: uurlijkse activiteit", + "created-reports-daily-activity": "Aangemaakte rapporten: dagelijkse activiteit", + "created-reports-monthly-activity": "Aangemaakte rapporten: maandelijkse activiteit", + "emails": "E-mails", + "emails-hourly-activity": "E-mails: uurlijkse activiteit", + "emails-daily-activity": "E-mails: dagelijkse activiteit", + "emails-monthly-activity": "E-mails: maandelijkse activiteit", + "status": { + "enabled": "Ingeschakeld", + "disabled": "Uitgeschakeld", + "warning": "Waarschuwing" + } }, "api-limit": { "cassandra-write-queries-core": "Rest API Cassandra schrijfbewerkingen", @@ -946,6 +984,40 @@ "edge-uplink-messages": "Edge-uplinkberichten", "edge-uplink-messages-per-edge": "Edge-uplinkberichten per edge" }, + "api-key": { + "api-key": "API-sleutel", + "api-keys": "API-sleutels", + "delete-api-key-title": "Weet u zeker dat u de API-sleutel '{{name}}' wilt verwijderen?", + "delete-api-key-text": "Let op: na bevestiging kan de sleutel niet meer worden hersteld.", + "delete-api-keys-title": "Weet u zeker dat u { count, plural, =1 {1 API-sleutel} other {# API-sleutels} } wilt verwijderen?", + "delete-api-keys-text": "Let op: na bevestiging kunnen alle geselecteerde sleutels niet meer worden hersteld.", + "expiration-date": "Vervaldatum", + "date": "datum", + "description": "Beschrijving", + "disable": "Uitschakelen", + "edit-description": "Beschrijving bewerken", + "enable": "API-sleutel inschakelen ", + "expiration-time": "Vervaltijd", + "expiration-time-never": "Nooit", + "expiration-time-custom": "Aangepast", + "generate": "Genereren", + "generate-title": "API-sleutel genereren", + "generate-text": "Opmerking: de API-sleutel erft de machtigingen van de gebruiker waarvoor deze is aangemaakt.", + "generated-api-key-title": "API-sleutel gegenereerd. Laten we de connectiviteit controleren!", + "generated-api-key-copy": "Zorg ervoor dat u uw API-sleutel nu kopieert en opslaat, want u kunt deze niet opnieuw bekijken.", + "generated-api-key-command": "Gebruik de volgende instructies om de connectiviteit te controleren. Als resultaat zou u de huidige gebruikersinformatie moeten ontvangen:", + "generated-api-key-insecure-url": "Het uitvoeren van opdrachten via een onveilige HTTP-verbinding verzendt uw API-sleutel onversleuteld, waardoor deze kwetsbaar is voor onderschepping.", + "list": "{ count, plural, =1 {Eén API-sleutel} other {Lijst met # API-sleutels} }", + "manage": "Beheren", + "manage-api-keys": "API-sleutels beheren", + "no-found": "Geen API-sleutels gevonden", + "selected-api-keys": "{ count, plural, =1 {1 API-sleutel} other {# API-sleutels} } geselecteerd", + "search": "API-sleutels zoeken", + "status": "Status", + "status-active": "Actief", + "status-inactive": "Inactief", + "status-expired": "Verlopen" + }, "audit-log": { "audit": "Audit", "audit-logs": "Auditlogs", @@ -999,7 +1071,11 @@ "type-provision-failure": "Provisioning apparaat mislukt", "type-timeseries-updated": "Telemetrie bijgewerkt", "type-timeseries-deleted": "Telemetrie verwijderd", - "type-sms-sent": "SMS verzonden" + "type-sms-sent": "SMS verzonden", + "any-type": "Alle typen", + "audit-log-filter-title": "Auditlogfilter", + "filter-title": "Filter", + "filter-types": "Auditlogtypen" }, "debug-settings": { "label": "Debugconfiguratie", @@ -1020,12 +1096,25 @@ "selected-fields": "{ count, plural, =1 {1 berekend veld} other {# berekende velden} } geselecteerd", "type": { "simple": "Eenvoudig", - "script": "Script" + "simple-hint": "Eenvoudige rekenkundige berekening op basis van invoerargumenten.", + "script": "Script", + "script-hint": "Berekening over gedefinieerde argumenten met behulp van een TBEL-script.", + "geofencing": "Geofencing", + "geofencing-hint": "Evaluatie van de GPS-positie van de entiteit en overgangen ten opzichte van geconfigureerde geofencingzonegroepen.", + "propagation": "Propagatie", + "propagation-hint": "Propagatie van gegevens naar bovenliggende of onderliggende entiteiten op basis van relatierichting en relatietype.", + "related-entities-aggregation": "Aggregatie van gerelateerde entiteiten", + "related-entities-aggregation-hint": "Aggregatie van de nieuwste gegevens van gerelateerde entiteiten.", + "time-series-data-aggregation": "Aggregatie van tijdreeksgegevens", + "time-series-data-aggregation-hint": "Aggregatie van historische gegevens van een huidige entiteit." }, + "preview": "Voorbeeld", "arguments": "Argumenten", "decimals-by-default": "Standaard aantal decimalen", "debugging": "Debuggen berekend veld", + "calculated-field-details": "Details van berekend veld", "argument-name": "Argumentnaam", + "name": "Naam", "datasource": "Databron", "add-argument": "Argument toevoegen", "test-script-function": "Scriptfunctie testen", @@ -1037,8 +1126,9 @@ "argument-asset": "Asset", "argument-customer": "Klant", "argument-tenant": "Huidige tenant", + "argument-owner": "Huidige eigenaar", + "argument-relation-query": "Gerelateerde entiteiten", "argument-type": "Argumenttype", - "see-debug-events": "Debuggebeurtenissen bekijken", "attribute": "Attribuut", "copy-argument-name": "Argumentnaam kopiëren", "timeseries-key": "Tijdreeks-sleutel", @@ -1051,12 +1141,14 @@ "shared-attributes": "Gedeelde attributen", "attribute-key": "Attribuutsleutel", "default-value": "Standaardwaarde", + "default-value-required": "Standaardwaarde is vereist.", "limit": "Maximale waarden", "time-window": "Tijdsvenster", "customer-name": "Klantnaam", "asset-name": "Assetnaam", "timeseries": "Tijdreeks", "output": "Uitvoer", + "output-hint": "Bepaalt hoe de uitvoer wordt verwerkt.", "create": "Nieuw berekend veld aanmaken", "file": "Berekend veld-bestand", "invalid-file-error": "Ongeldig bestandsformaat. Zorg ervoor dat het een geldig JSON-bestand is.", @@ -1070,9 +1162,175 @@ "delete-multiple-text": "Let op: na bevestiging worden alle geselecteerde berekende velden verwijderd en zijn de gegevens onherstelbaar.", "test-with-this-message": "Test met dit bericht", "use-latest-timestamp": "Gebruik laatste tijdstempel", + "entity-coordinates": "Entiteitscoördinaten", + "latitude-time-series-key": "Tijdreeksleutel voor breedtegraad", + "latitude-time-series-key-required": "Tijdreeksleutel voor breedtegraad is vereist.", + "longitude-time-series-key": "Tijdreeksleutel voor lengtegraad", + "longitude-time-series-key-required": "Tijdreeksleutel voor lengtegraad is vereist.", + "geofencing-zone-groups": "Geofencingzonegroepen", + "geofencing-zone-groups-settings": "Instellingen voor geofencingzonegroepen", + "target-zone": "Doelzone", + "perimeter-key": "Perimetersleutel", + "report-strategy": "Rapportagestrategie", + "no-zone-configured": "Er is ten minste één zone vereist.", + "no-zone-configured-required": "Er moet ten minste één zonegroep zijn geconfigureerd.", + "add-zone-group": "Zonegroep toevoegen", + "report-transition-event-only": "Alleen overgangsgebeurtenissen", + "report-presence-status-only": "Alleen aanwezigheidsstatus", + "report-transition-event-and-presence": "Aanwezigheidsstatus en overgangsgebeurtenissen", + "perimeter-attribute-key": "Perimeterattribuutsleutel", + "perimeter-attribute-key-required": "Perimeterattribuutsleutel is vereist.", + "perimeter-attribute-key-pattern": "Perimeterattribuutsleutel is ongeldig.", + "entity-zone-relationship": "Pad van entiteit naar zones", + "direction": "Relatierichting", + "direction-from": "Van entiteit naar zone", + "direction-to": "Van zone naar entiteit", + "relation-type": "Relatietype", + "create-relation-with-matched-zones": "Relaties aanmaken voor bronentiteit met overeenkomende zones", + "relation-level": "Relatieniveau", + "fetch-last-available-level": "Alleen laatst beschikbare niveau ophalen", + "zone-group-refresh-interval": "Vernieuwingsinterval voor zonegroepen", + "copy-zone-group-name": "Zonegroepnaam kopiëren", + "open-details-page": "Detailspagina van entiteit openen", + "level": "Niveau", + "direction-level": "Richting", + "direction-up": "Omhoog", + "direction-up-parent": "Omhoog naar bovenliggend", + "direction-down": "Omlaag", + "direction-down-child": "Omlaag naar onderliggend", + "add-level": "Niveau toevoegen", + "delete-level": "Niveau verwijderen", + "no-level": "Geen niveau geconfigureerd", + "levels-required": "Er moet ten minste één niveau zijn geconfigureerd.", + "max-allowed-levels-error": "Relatieniveau overschrijdt het maximaal toegestane.", + "propagation-path-related-entities": "Propagatiepad naar gerelateerde entiteiten", + "propagate-type": { + "arguments-only": "Alleen argumenten", + "expression-result": "Berekeningsresultaat" + }, + "script": "Script", + "data-propagate": "Gegevens om te propageren", + "output-key": "Uitvoersleutel", + "copy-output-key": "Uitvoersleutel kopiëren", + "aggregation-path-related-entities": "Aggregatiepad naar gerelateerde entiteiten", + "deduplication-interval": "Deduplicatie-interval", + "deduplication-interval-min": "Deduplicatie-interval moet ten minste {{ sec }} seconden zijn.", + "deduplication-interval-hint": "Minimale tijd tussen telemetrie-aggregaties.", + "deduplication-interval-required": "Deduplicatie-interval is vereist.", + "calculated-field-filter-title": "Filter voor berekend veld", + "filter-title": "Filter", + "calculated-field-types": "Typen berekend veld", + "events": "Gebeurtenissen", + "any-type": "Alle typen", + "metrics": { + "metrics": "Metrieken", + "metrics-empty": "Er moet ten minste één metriek zijn geconfigureerd.", + "metric-name": "Metrieknaam", + "metric-name-required": "Metrieknaam is vereist.", + "metric-name-pattern": "Metrieknaam is ongeldig.", + "metric-name-duplicate": "Er bestaat al een metriek met deze naam.", + "metric-name-max-length": "Metrieknaam moet korter zijn dan 256 tekens.", + "metric-name-forbidden": "Metrieknaam is gereserveerd en kan niet worden gebruikt.", + "copy-metric-name": "Metrieknaam kopiëren", + "argument-name": "Argumentnaam", + "aggregation": "Aggregatie", + "aggregation-type": { + "avg": "Gemiddelde", + "min": "Minimum", + "max": "Maximum", + "sum": "Som", + "count": "Aantal", + "count-unique": "Uniek aantal" + }, + "filtered": "Gefilterd", + "value-source": "Waardebron", + "value-source-hint": "Bepaalt hoe de waarde voor aggregatie wordt verkregen.", + "value-source-type": { + "key": "Sleutel", + "function": "Functie" + }, + "no-metrics-configured": "Er is ten minste één metriek vereist.", + "add-metric": "Metriek toevoegen", + "max-metrics": "Maximumaantal metrieken bereikt.", + "metric-settings": "Metriekinstellingen", + "filter": "Filter", + "filter-hint": "Schakelt het filteren van entiteiten tijdens aggregatie in. De filterfunctie moet een booleaanse waarde retourneren en kan alle geconfigureerde argumenten gebruiken." + }, + "output-strategy": { + "strategy": "Strategie", + "process-right-away": "Onmiddellijk verwerken", + "process-rule-chains": "Verwerken via Regelketens", + "save-time-series": "Opslaan in tijdreeksgegevens", + "save-database": "Opslaan in database", + "save-latest-values": "Opslaan in nieuwste waarden", + "send-web-sockets": "Verzenden naar WebSockets", + "save-calculated-fields": "Verzenden naar Berekende velden", + "update-attribute-only-on-value-change": "Attribuut alleen bij waardewijziging bijwerken", + "send-attributes-updated-notification": "'Attributes Updated'-notificatie verzenden", + "ttl": "Aangepaste TTL", + "ttl-required": "TTL is vereist", + "ttl-min": "Alleen een minimale TTL van 0 is toegestaan", + "processing-parameters": "Verwerkingsparameters", + "hint": { + "strategy": "Bepaalt of het resultaat onmiddellijk wordt verwerkt of naar een regelketen wordt verzonden voor aanvullende verwerking.", + "processing-options": "Verwerkingsopties", + "update-attribute-only-on-value-change": "Werkt het attribuut bij bij elk binnenkomend bericht, ongeacht of de waarde is gewijzigd. Dit verhoogt het API-gebruik en verlaagt de prestaties.", + "update-attribute-only-on-value-change-enabled": "Werkt het attribuut alleen bij wanneer de waarde wijzigt. Als de waarde ongewijzigd is, worden tijdstempels niet bijgewerkt en worden er geen notificaties verzonden.", + "send-attributes-updated-notification": "Verzendt een 'Attributes Updated'-gebeurtenis naar de standaardregelketen.", + "save-time-series": "Slaat tijdreeksgegevens op in de ts_kv-tabel in de database.", + "save-database": "Slaat attribuutgegevens op in de database.", + "save-latest-values": "Werkt tijdreeksgegevens bij in de ts_kv_latest-tabel in de database als de nieuwe waarde recenter is.", + "send-web-sockets-attribute": "Stelt WebSocket-abonnementen op de hoogte van updates van de attribuutgegevens.", + "send-web-sockets-time-series": "Stelt WebSocket-abonnementen op de hoogte van updates van de tijdreeksgegevens.", + "save-calculated-fields-attribute": "Stelt berekende velden op de hoogte van updates van de attribuutgegevens.", + "save-calculated-fields-time-series": "Stelt berekende velden op de hoogte van updates van de tijdreeksgegevens.", + "ttl": "Bepaalt de bewaarperiode voor tijdreeksgegevens. Als dit is uitgeschakeld, wordt de TTL van het Tenantprofiel gebruikt." + } + }, + "aggregate-interval-type": "Aggregatieintervaltype", + "aggregate-interval-value": "Aggregatieintervalwaarde", + "aggregate-interval-value-required": "Aggregatieintervalwaarde is vereist.", + "aggregate-interval-value-min": "Aggregatieintervalwaarde moet ten minste { sec, plural, =0 {0 seconde} =1 {1 seconde} other {# seconden} } zijn.", + "aggregate-interval-value-step-multiple-of": "Aggregatieintervalwaarde moet een deler of veelvoud van 1 dag zijn.", + "aggregate-period": { + "hour": "Uur", + "day": "Dag", + "week": "Week (ma - zo)", + "week-sun-sat": "Week (zo - za)", + "month": "Maand", + "quarter": "Kwartaal", + "year": "Jaar", + "custom": "Aangepast" + }, + "aggregate-period-hint-offset": "Uw aggregatieinterval is: {{ interval }}", + "aggregate-period-hint-offset-and-so-on": "Uw aggregatieinterval is: {{ interval }} en zo verder.", + "entity-aggregation": { + "argument-hint": "Gegevens worden opgehaald van de huidige entiteit.", + "argument-title-hint": "Bepaalt de invoerargumenten die voor aggregatie worden gebruikt.", + "argument-setting-hint": "Nieuwste telemetrie is het enige beschikbare argumenttype voor dit berekende veld.", + "aggregation-interval": "Aggregatieinterval", + "aggregation-interval-hint": "Bepaalt hoe vaak aggregatie wordt uitgevoerd. Voorbeeld: elke 1 uur worden gegevens geaggregeerd om 00:00, 01:00, 02:00, enz. Aggregatieresultaten worden opgeslagen met de tijdstempel die overeenkomt met het begin van het aggregatieinterval.", + "apply-offset": "Offset toepassen op aggregatieinterval", + "apply-offset-hint": "Bepaalt hoeveel het begin van elke aggregatieperiode wordt verschoven (bijv. +10 minuten - 00:10, 01:10).", + "offset-value": "Offsetwaarde", + "offset-value-required": "Offsetwaarde is vereist.", + "offset-value-min": "Offsetwaarde moet een positief geheel getal zijn.", + "offset-value-max": "Offsetwaarde moet kleiner zijn dan de waarde van het aggregatieinterval.", + "wait-delay": "Wachttime-out toepassen voor vertraagde telemetrie", + "wait-delay-hint": "Bepaalt hoe lang er na het einde van het interval op vertraagde telemetrie wordt gewacht. Als dergelijke telemetrie binnenkomt, wordt het resultaat voor dat interval opnieuw berekend.", + "duration": "Duur", + "duration-required": "Duur is vereist.", + "duration-min": "Duur moet minimaal 1 minuut zijn.", + "duration-hint": "Hoelang er wordt gewacht op vertraagde gegevens nadat het interval is afgelopen.", + "produce-intermediate-result": "Tussenresultaat genereren", + "produce-intermediate-result-hint": "Berekent metrieken tijdens het huidige interval om een tussenresultaat te genereren. Updates vinden niet vaker plaats dan één keer per {{ time }}." + }, "hint": { - "arguments-simple-with-rolling": "Berekende velden van het type 'eenvoudig' mogen geen sleutels bevatten met een rollende tijdreeks.", - "arguments-empty": "Argumenten mogen niet leeg zijn.", + "arguments-simple-with-rolling": "Een berekend veld van het type Eenvoudig mag geen sleutels bevatten met het type 'Time series rolling'.", + "arguments-propagate-arguments-with-rolling": "Het type 'Time series rolling' is niet compatibel met propagatie van 'Arguments only'.", + "arguments-propagate-argument-entity-type": "Entiteittype is niet compatibel met propagatie van 'Arguments only'.", + "arguments-propagate-argument-must-current-entity": "Ten minste één argument moet zijn geconfigureerd met het bronentiteittype 'Current entity'.", + "arguments-empty": "Er moet ten minste één argument worden opgegeven.", "expression-required": "Expressie is vereist.", "expression-invalid": "Expressie is ongeldig", "expression-max-length": "De lengte van de expressie moet minder dan 255 tekens zijn.", @@ -1081,12 +1339,218 @@ "argument-name-duplicate": "Een argument met deze naam bestaat al.", "argument-name-max-length": "Argumentnaam mag niet langer zijn dan 256 tekens.", "argument-name-forbidden": "Deze argumentnaam is gereserveerd en mag niet worden gebruikt.", + "output-key-required": "Uitvoersleutel is vereist.", + "output-key-pattern": "Uitvoersleutel is ongeldig.", + "output-key-duplicate": "Er bestaat al een sleutel met deze naam.", + "output-key-max-length": "Uitvoersleutel moet korter zijn dan 256 tekens.", + "output-key-forbidden": "Uitvoersleutel is gereserveerd en kan niet worden gebruikt.", + "entity-type-required": "Entiteittype is vereist", + "name-required": "Naam is vereist.", + "name-pattern": "Naam is ongeldig.", + "name-duplicate": "Er bestaat al een item met deze naam.", + "name-max-length": "Naam moet korter zijn dan 256 tekens.", + "name-forbidden": "Naam is gereserveerd en kan niet worden gebruikt.", "argument-type-required": "Argumenttype is vereist.", "max-args": "Maximum aantal argumenten bereikt.", "decimals-range": "Het aantal decimalen moet een getal zijn tussen 0 en 15.", "expression": "Standaardexpressie toont hoe temperatuur van Fahrenheit naar Celsius wordt omgerekend.", "arguments-entity-not-found": "Doelentiteit van het argument niet gevonden.", - "use-latest-timestamp": "Indien ingeschakeld, wordt de berekende waarde opgeslagen met de meest recente tijdstempel van de telemetrie van de argumenten, in plaats van met de servertijd." + "use-latest-timestamp": "Indien ingeschakeld, wordt de berekende waarde opgeslagen met de meest recente tijdstempel van de telemetrie van de argumenten, in plaats van met de servertijd.", + "entity-coordinates": "Geef de tijdreeksleutels op die de GPS-coördinaten van de entiteit (breedtegraad en lengtegraad) leveren.", + "geofencing-zone-groups": "Definieer één of meer geofencingzonegroepen om te controleren (bijv. 'allowedZones', 'restrictedZones'). Elke groep moet een unieke naam hebben, die wordt gebruikt als voorvoegsel voor uitvoertelemetriesleutels van het berekende veld.", + "perimeter-attribute-key": "Stel de attribuutsleutel in die de perimeterdefinitie van de geofencingzone bevat. De perimeter wordt altijd genomen uit server-side-attributen van de zone-entiteit.", + "report-strategy": "Aanwezigheidsstatus rapporteert of de entiteit zich momenteel BINNEN of BUITEN de zonegroep bevindt. Overgangsgebeurtenissen rapporteren wanneer de entiteit de zonegroep BETRAD of VERLIET.", + "create-relation-with-matched-zones": "Maak automatisch relaties aan en onderhoud deze tussen de entiteit en de zones waarin deze zich momenteel bevindt. Relaties worden verwijderd wanneer de entiteit een zone verlaat en aangemaakt wanneer deze een nieuwe zone binnenkomt.", + "relation-type-required": "Relatietype is vereist.", + "relation-level-required": "Relatieniveau is vereist.", + "relation-level-min": "Minimale waarde voor relatieniveau is 1.", + "relation-level-max": "Maximale waarde voor relatieniveau is {{max}}.", + "geofencing-empty": "Er moet ten minste één zonegroep zijn geconfigureerd.", + "geofencing-entity-not-found": "Geofencingdoelentiteit niet gevonden.", + "max-geofencing-zone": "Maximumaantal geofencingzones bereikt.", + "zone-group-refresh-interval": "Bepaalt hoe vaak zonegroepen die via gerelateerde entiteiten zijn geconfigureerd, worden vernieuwd.", + "zone-group-refresh-interval-required": "Vernieuwingsinterval voor zonegroepen is vereist.", + "zone-group-refresh-interval-min": "Vernieuwingsinterval voor zonegroepen moet ten minste {{ min }} seconden zijn.", + "propagation-path-related-entities": "Definieert een direct pad op één niveau naar een gerelateerde entiteit op basis van de geselecteerde richting en het relatietype. Alleen relaties tussen apparaat-, asset-, klant- en tenantentiteiten worden ondersteund. Het maximumaantal entiteiten dat via het relatiepad wordt opgelost is {{ max }}.", + "data-propagate": "Bepaalt de gegevens die moeten worden gepropageerd vanuit de hieronder geconfigureerde argumenten. 'Alleen argumenten' gebruikt de opgehaalde gegevens rechtstreeks, terwijl 'Berekeningsresultaat' een nieuwe waarde berekent op basis van die gegevens.", + "aggregation-path-related-entities": "Definieert een aggregatiepad op één niveau via directe relaties met bovenliggende of onderliggende entiteiten, op basis van richting en relatietype. Alleen relaties tussen apparaat-, asset-, klant- en tenantentiteiten worden ondersteund. Het maximumaantal entiteiten dat via het relatiepad wordt opgelost is {{ max }}.", + "arguments-aggregation": "Bepaalt de invoerargumenten die worden gebruikt voor filteren en aggregatie.", + "setting-arguments-aggregation": "Gegevens worden opgehaald van gerelateerde entiteiten die zijn geconfigureerd in het aggregatiepad.", + "metrics": "Bepaalt metrieken die worden geaggregeerd op basis van geconfigureerde argumenten.", + "entity-aggregation-metrics": "Bepaalt metrieken die op basis van geconfigureerde argumenten over de opgegeven tijdintervallen worden geaggregeerd.", + "import-invalid-calculated-field-type": "Kan berekend veld niet importeren: Ongeldige structuur van berekend veld.", + "simple-expression-title": "Rekenkundige expressie die bepaalt hoe de berekende waarde wordt berekend.", + "script-title": "TBEL-script dat de berekeningslogica en uitvoerwaarden definieert.", + "simple-arguments": "Rekenkundige expressie die bepaalt hoe de berekende waarde wordt berekend.", + "script-arguments": "Bepaalt de invoerargumenten die beschikbaar zijn voor het script." + } + }, + "alarm-rule": { + "alarm-rules-tab": "Alarmregels", + "alarm-rule": "Alarmregel", + "alarm-rules": "Alarmregels", + "alarm-rules-old": "Oud", + "alarm-rules-actual": "Actueel", + "severities": "Ernstniveaus", + "cleared": "Beëindigingsvoorwaarde", + "delete-title": "Weet u zeker dat u de alarmregel '{{title}}' wilt verwijderen?", + "delete-text": "Let op: na bevestiging kunnen de alarmregel en alle gerelateerde gegevens niet meer worden hersteld.", + "delete-multiple-title": "Weet u zeker dat u { count, plural, =1 {1 alarmregel} other {# alarmregels} } wilt verwijderen?", + "delete-multiple-text": "Let op: na bevestiging worden alle geselecteerde alarmregels verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld.", + "create": "Nieuwe alarmregel maken", + "add": "Alarmregel toevoegen", + "copy": "Alarmregelconfiguratie kopiëren", + "details": "Alarmregeldetails", + "no-found": "Geen alarmregels gevonden", + "list": "{ count, plural, =1 {Eén alarmregel} other {Lijst met # alarmregels} }", + "selected-fields": "{ count, plural, =1 {1 alarmregel} other {# alarmregels} } geselecteerd", + "import": "Alarmregel importeren", + "file": "Alarmregelbestand", + "export": "Alarmregel exporteren", + "export-failed-error": "Kan alarmregel niet exporteren: {{error}}", + "entity-type": "Entiteittype", + "entity-type-required": "Entiteittype is vereist.", + "alarm-type": "Alarmtype", + "alarm-type-hint": "Unieke identificatie (bijv. HighTempAlarm) binnen het bereik van de alarminitiator (Apparaat, Asset, enz.) om conflicten te voorkomen.", + "alarm-type-required": "Alarmtype is vereist.", + "alarm-type-pattern": "Alarmtype is ongeldig.", + "alarm-type-max-length": "Alarmtype moet korter zijn dan 256 tekens.", + "clear-alarm": "Alarm beëindigen", + "value-argument": "Argument", + "value-argument-required": "Argument is vereist.", + "static-settings": "Statische instellingen", + "configuration": "Configuratie", + "static-schedule": "Statisch", + "dynamic-schedule": "Dynamisch", + "operation-and": "EN", + "operation-or": "OF", + "condition-during": "Gedurende {{during}}", + "condition-during-dynamic": "Gedurende \"{{ attribute }}\"", + "condition-repeat-times": "Herhaalt { count, plural, =1 {1 keer} other {# keer} }", + "condition-repeat-times-dynamic": "Herhaalt \"{{ attribute }}\" keer", + "filter-preview": "Filtervoorbeeld", + "condition-settings": "Voorwaarde-instellingen", + "static": "Statisch", + "dynamic": "Dynamisch", + "argument-filters": "Argumentfilters", + "argument-name": "Argumentnaam", + "value-type": "Waardetype", + "general": "Algemeen", + "filters": "Filters", + "date-time-hint": "Het argument moet in epoch-millisconden zijn. Voorbeeld: 1698839340000 is gelijk aan 2023-11-01 12:49:00 UTC.", + "operation": "Bewerking", + "value-source": "Waardebron", + "value": "Waarde", + "ignore-case": "Hoofdlettergebruik negeren", + "condition": "Voorwaarde", + "script": "Script", + "add-filter": "Argumentfilter toevoegen", + "edit-filter": "Argumentfilter", + "remove-filter": "Argumentfilter verwijderen", + "no-filter": "Er is ten minste één filter vereist.", + "conditions": { + "simple": "Eenvoudig", + "duration": "Duur", + "repeating": "Herhalend" + }, + "schedule-title": "Planning", + "edit-schedule": "Alarmplanning bewerken", + "schedule-type": "Plannertype", + "schedule-type-required": "Plannertype is vereist.", + "schedule": { + "any-time": "Altijd actief", + "specific-time": "Actief op een specifiek tijdstip", + "custom": "Aangepast" + }, + "schedule-day": { + "monday": "Maandag", + "tuesday": "Dinsdag", + "wednesday": "Woensdag", + "thursday": "Donderdag", + "friday": "Vrijdag", + "saturday": "Zaterdag", + "sunday": "Zondag" + }, + "schedule-days": "Dagen", + "schedule-time": "Tijd", + "schedule-time-from": "Van", + "schedule-time-to": "Tot", + "schedule-days-of-week-required": "Er moet ten minste één dag van de week worden geselecteerd.", + "tbel": "TBEL", + "expression-type": { + "simple": "Eenvoudig", + "script": "Script" + }, + "operation-type": { + "and": "En", + "or": "Of" + }, + "filter-predicate-type": { + "string": "String", + "numeric": "Numeriek", + "boolean": "Booleaans", + "complex": "Complex" + }, + "alarm-rule-additional-info": "Aanvullende informatie", + "edit-alarm-rule-additional-info": "Aanvullende informatie bewerken", + "alarm-rule-additional-info-placeholder": "Geef hier uw opmerkingen en aanpassingen op om ze te tonen in Alarmdetails onder Aanvullende informatie", + "alarm-rule-additional-info-hint": "Tip: gebruik ${Argumentnaam} om waarden te vervangen van de argumenten die in de alarmregelvoorwaarde worden gebruikt.", + "alarm-rule-additional-info-icon-hint": "Gebruik Argumentnaam om waarden te vervangen van de argumenten die in de alarmregelvoorwaarde worden gebruikt.", + "alarm-rule-mobile-dashboard": "Mobiel dashboard", + "alarm-rule-mobile-dashboard-hint": "Wordt door de mobiele applicatie gebruikt als dashboard voor alarmdetails.", + "alarm-rule-no-mobile-dashboard": "Geen dashboard geselecteerd", + "alarm-rule-condition": "Alarmregelvoorwaarde", + "enter-alarm-rule-condition-prompt": "Voorwaarde toevoegen", + "enter-alarm-rule-clear-condition-prompt": "Beëindigingsvoorwaarde toevoegen", + "edit-alarm-rule-condition": "Alarmvoorwaarde", + "condition-type": "Voorwaardetype", + "condition-type-hint": "De opties \"Duur\" en \"Herhalend\" zijn niet beschikbaar wanneer de bewerking \"Missing for\" in het filter wordt gebruikt.", + "select-alarm-severity": "Alarmernst selecteren", + "add-create-alarm-rule-prompt": "Er is ten minste één triggervoorwaarde vereist.", + "add-create-alarm-rule": "Triggervoorwaarde toevoegen", + "add-clear-alarm-rule": "Beëindigingsvoorwaarde toevoegen", + "condition-duration": "Voorwaardenduur", + "condition-duration-value": "Duurwaarde", + "condition-duration-time-unit": "Tijdseenheid", + "condition-duration-value-range": "Duurwaarde moet in een bereik van 1 tot 2147483647 liggen.", + "condition-duration-value-pattern": "Duurwaarde moet een geheel getal zijn.", + "condition-duration-value-required": "Duurwaarde is vereist.", + "condition-duration-time-unit-required": "Tijdseenheid is vereist.", + "condition-repeating-value": "Aantal gebeurtenissen", + "condition-repeating-value-hint": "Een update van elk alarmregelargument wordt als gebeurtenis geteld", + "condition-repeating-value-range": "Aantal gebeurtenissen moet in een bereik van 1 tot 2147483647 liggen.", + "condition-repeating-value-pattern": "Aantal gebeurtenissen moet een geheel getal zijn.", + "condition-repeating-value-required": "Aantal gebeurtenissen is vereist.", + "create-conditions": "Triggervoorwaarden", + "clear-condition": "Beëindigingsvoorwaarde", + "no-clear-alarm-rule": "Geen beëindigingsvoorwaarde geconfigureerd.", + "advanced-settings": "Geavanceerde instellingen", + "propagate-alarm": "Alarm naar gerelateerde entiteiten propageren", + "alarm-rule-relation-types-list": "Relatietypen", + "alarm-rule-relation-types-list-hint": "Definieert relatietypen om de gerelateerde entiteiten te filteren. Als dit niet is ingesteld, wordt het alarm naar alle gerelateerde entiteiten gepropageerd.", + "propagate-alarm-to-owner": "Alarm naar entiteiteigenaar propageren (Klant of Tenant)", + "propagate-alarm-to-tenant": "Alarm naar Tenant propageren", + "alarm-rule-filter-title": "Alarmregelfilter", + "filter-title": "Filter", + "debugging": "Alarmregeldebugging", + "any-type": "Alle typen", + "enter-alarm-rule-type": "Alarmtype invoeren", + "no-alarm-rule-types-matching": "Geen alarmtypen gevonden die overeenkomen met '{{entitySubtype}}'.", + "alarm-rule-type-list-empty": "Geen alarmtypen geselecteerd.", + "alarm-rule-type-list": "Alarmtypelijst", + "alarm-rule-entity-list": "Entiteitenlijst", + "missing-for": "ontbreekt gedurende", + "time-unit": "Eenheid", + "mode": "Modus", + "type": "Type", + "value-required": "Waarde is vereist.", + "min-value": "Waarde moet 1 of hoger zijn.", + "argument-in-use": "Argument wordt gebruikt als algemeen argument.", + "import-invalid-alarm-rule-type": "Kan alarmregel niet importeren: Ongeldige alarmregelstructuur.", + "no-filter-preview": "Geen filter opgegeven", + "filter-operation": { + "and": "En", + "or": "Of" } }, "ai-models": { @@ -1193,6 +1657,7 @@ "contact": { "country": "Land", "country-required": "Land is verplicht.", + "country-object-required": "Selecteer een geldig land uit de lijst.", "city": "Stad", "state": "Staat / Provincie", "postal-code": "Postcode", @@ -1229,6 +1694,8 @@ "documentation": "Documentatie", "time-left": "{{time}} resterend", "output": "Uitvoer", + "sort-asc": "Oplopend", + "sort-desc": "Aflopend", "suffix": { "s": "s", "ms": "ms" @@ -1365,6 +1832,8 @@ "mobile-order": "Volgorde in mobiele applicatie", "mobile-hide": "Verberg dashboard in mobiele applicatie", "update-image": "Dashboardafbeelding bijwerken", + "update-new-version": "Nieuwe versie uploaden", + "upload-file-to-update": "Bestand uploaden om bij te werken", "take-screenshot": "Schermafbeelding maken", "select-widget-title": "Selecteer widget", "select-widget-value": "{{title}}: selecteer widget", @@ -1733,6 +2202,8 @@ "bootstrap-tab": "Bootstrapclient", "bootstrap-server": "Bootstrapserver", "lwm2m-server": "LwM2M-server", + "client-reboot": "Registratie-update-trigger", + "bootstrap-reboot": "Bootstrap-Request-trigger", "client-publicKey-or-id": "Client publieke sleutel of ID", "client-publicKey-or-id-required": "Client publieke sleutel of ID is verplicht.", "client-publicKey-or-id-tooltip-psk": "De PSK-identificatie is een willekeurige identificatie tot 128 bytes zoals beschreven in de standaard [RFC7925].\nDe PSK-identificatie MOET eerst worden omgezet naar een tekenreeks en vervolgens in UTF-8 worden gecodeerd.", @@ -1780,7 +2251,6 @@ "unable-delete-device-alias-text": "Apparaat-alias '{{deviceAlias}}' kan niet worden verwijderd omdat het wordt gebruikt door de volgende widget(s):
{{widgetsList}}", "is-gateway": "Is gateway", "overwrite-activity-time": "Activiteitstijd voor verbonden apparaat overschrijven", - "device-filter": "Apparaatfilter", "device-filter-title": "Apparaatfilter", "filter-title": "Filter", "device-state": "Apparaatstatus", @@ -2234,7 +2704,8 @@ "short-id-required": "Korte server-ID is verplicht.", "short-id-range": "Korte server-ID moet tussen {{ min }} en {{ max }} liggen.", "short-id-pattern": "Korte server-ID moet een positief geheel getal zijn.", - "lifetime": "Registratieduur client", + "short-id-pattern-bs": "Kort server-ID mag uitsluitend null zijn", + "lifetime": "Clientregistratielevensduur", "lifetime-required": "Registratieduur is verplicht.", "lifetime-pattern": "Registratieduur moet een positief geheel getal zijn.", "default-min-period": "Minimale periode tussen meldingen (s)", @@ -2328,7 +2799,9 @@ "composite-all-description": "Alle resources worden geobserveerd met één samengesteld Observe-verzoek (efficiënter, minder flexibel)", "composite-by-object": "Samengesteld per object", "composite-by-object-description": "Resources worden gegroepeerd per objecttype en geobserveerd via afzonderlijke samengestelde Observe-verzoeken (gebalanceerde aanpak)" - } + }, + "init-attr-tel-as-obs-strategy": "Attributen en telemetrie initialiseren met Observe-strategie", + "init-attr-tel-as-obs-strategy-hint": "Als false - attributen en telemetrie worden geïnitialiseerd door hun waarden één voor één te lezen.\\nAls true - attributen en telemetrie worden geïnitialiseerd door op hun waarden te abonneren met behulp van de Observe-strategie." }, "snmp": { "add-communication-config": "Communicatieconfiguratie toevoegen", @@ -2644,6 +3117,8 @@ "type-rulenodes": "Regelknopen", "list-of-rulenodes": "{ count, plural, =1 {Eén regelknoop} other {Lijst van # regelknopen} }", "rulenode-name-starts-with": "Regelknopen waarvan de namen beginnen met '{{prefix}}'", + "type-api-key": "API-sleutel", + "type-api-keys": "API-sleutels", "type-current-customer": "Huidige klant", "type-current-tenant": "Huidige tenant", "type-current-user": "Huidige gebruiker", @@ -2665,6 +3140,7 @@ "details": "Entiteitdetails", "no-entities-prompt": "Geen entiteiten gevonden", "no-data": "Geen gegevens om weer te geven", + "show-all-columns": "Alles weergeven", "columns-to-display": "Kolommen om weer te geven", "type-api-usage-state": "API-gebruikstoestand", "type-edge": "Edge", @@ -2710,7 +3186,15 @@ "list-of-mobile-apps": "{ count, plural, =1 {Eén mobiele applicatie} other {Lijst van # mobiele applicaties} }", "type-mobile-app-bundle": "Mobiele bundel", "type-mobile-app-bundles": "Mobiele bundels", - "list-of-mobile-app-bundles": "{ count, plural, =1 {Eén mobiele bundel} other {Lijst van # mobiele bundels} }" + "list-of-mobile-app-bundles": "{ count, plural, =1 {Eén mobiele bundel} other {Lijst van # mobiele bundels} }", + "limit-reached": "Limiet bereikt", + "limit-reached-text": "U heeft de limiet van {{ entities }} bereikt. Vraag uw systeembeheerder om uw limiet voor {{ entity }} te verhogen en meer toe te voegen.", + "request-limit-increase": "Limietverhoging aanvragen", + "request-sysadmin-text": "Bent u de systeembeheerder?", + "login-here": "Hier aanmelden", + "to-increase-limit": "om de limiet te verhogen.", + "increase-limit-request-sent-title": "We hebben een geautomatiseerd verzoek naar uw systeembeheerder gestuurd om de limiet te verhogen", + "increase-limit-request-sent-text": "Geef hen de tijd om het verzoek te beoordelen en de instellingen bij te werken. Mogelijk moet u deze pagina vernieuwen om de wijzigingen te zien." }, "entity-field": { "created-time": "Aangemaakt op", @@ -3787,6 +4271,7 @@ "two-factor-authentication": "Twee-factor authenticatie", "passwords-mismatch-error": "Ingevoerde wachtwoorden moeten gelijk zijn!", "password-again": "Wachtwoord opnieuw", + "sign-in": "Meld u aan", "username": "Gebruikersnaam (e-mail)", "remember-me": "Onthoud mij", "forgot-password": "Wachtwoord vergeten?", @@ -3797,7 +4282,8 @@ "password-link-sent-message": "Resetlink is verzonden", "email": "E-mail", "invalid-email-format": "Ongeldig e-mailformaat.", - "login-with": "Inloggen met {{name}}", + "sign-in-with": "Aanmelden met {{name}}", + "sign-in-to-your-account": "Aanmelden bij uw account", "or": "of", "error": "Inlogfout", "verify-your-identity": "Verifieer uw identiteit", @@ -3816,7 +4302,51 @@ "activation-link-expired": "Activatielink is verlopen", "activation-link-expired-message": "De link om uw profiel te activeren is verlopen. U kunt terugkeren naar de inlogpagina om een nieuwe e-mail te ontvangen.", "reset-password-link-expired": "Wachtwoord resetlink is verlopen", - "reset-password-link-expired-message": "De link om uw wachtwoord opnieuw in te stellen is verlopen. U kunt terugkeren naar de inlogpagina om een nieuwe e-mail te ontvangen." + "reset-password-link-expired-message": "De link om uw wachtwoord opnieuw in te stellen is verlopen. U kunt terugkeren naar de inlogpagina om een nieuwe e-mail te ontvangen.", + "two-fa": "Twee-factorauthenticatie", + "two-fa-required": "Twee-factorauthenticatie is vereist", + "set-up-verification-method": "Stel een verificatiemethode in om door te gaan", + "set-up-verification-method-login": "Stel een verificatiemethode in of meld u aan", + "enable-authenticator-app": "Authenticator-app inschakelen", + "enable-authenticator-app-description": "Voer de beveiligingscode in uit uw authenticator-app", + "enable-authenticator-sms": "SMS-authenticator inschakelen", + "enable-authenticator-sms-description": "Voer een 6-cijferige code in die we zojuist hebben verzonden naar ", + "enable-authenticator-email": "E-mailauthenticator inschakelen", + "enable-authenticator-email-description": "Er is een beveiligingscode verzonden naar uw e-mailadres op ", + "enter-key-manually": "of voer deze 32-cijferige sleutel handmatig in:", + "continue": "Doorgaan", + "confirm": "Bevestigen", + "authenticator-app-success": "Authenticator-app succesvol ingeschakeld", + "authenticator-app-success-description": "De volgende keer dat u zich aanmeldt, moet u een twee-factorauthenticatiecode invoeren", + "authenticator-sms-success": "SMS-authenticator succesvol ingeschakeld", + "authenticator-sms-success-description": "De volgende keer dat u zich aanmeldt, wordt u gevraagd de beveiligingscode in te voeren die naar het telefoonnummer wordt verzonden", + "authenticator-email-success": "E-mailauthenticator succesvol ingeschakeld", + "authenticator-email-success-description": "De volgende keer dat u zich aanmeldt, wordt u gevraagd de beveiligingscode in te voeren die naar uw e-mailadres wordt verzonden", + "authenticator-backup-code-success": "Back-upcode succesvol ingeschakeld", + "authenticator-backup-code-success-description": "De volgende keer dat u zich aanmeldt, wordt u gevraagd de beveiligingscode in te voeren of een van de back-upcodes te gebruiken.", + "add-verification-method": "Verificatiemethode toevoegen", + "get-backup-code": "Back-upcode ophalen", + "copy-key": "Sleutel kopiëren", + "send-code": "Code verzenden", + "email-label": "E-mail", + "email-description": "Voer een e-mail in om als authenticator te gebruiken.", + "sms-description": "Voer een telefoonnummer in om als authenticator te gebruiken.", + "backup-code-description": "Druk de codes af zodat u ze bij de hand heeft wanneer u ze nodig heeft om u aan te melden bij uw account. U kunt elke back-upcode één keer gebruiken.", + "backup-code-warn": "Zodra u deze pagina verlaat, kunnen deze codes niet opnieuw worden weergegeven. Bewaar ze veilig met de onderstaande opties.", + "download-txt": "Downloaden (txt)", + "print": "Afdrukken", + "verification-code": "6-cijferige code", + "verification-code-invalid": "Ongeldig verificatiecodeformaat", + "verification-code-incorrect": "Verificatiecode is onjuist", + "verification-code-many-request": "Te veel verzoeken om verificatiecode te controleren", + "scan-qr-code": "Scan deze QR-code met uw verificatie-app", + "phone-input": { + "phone-input-label": "Telefoonnummer", + "phone-input-required": "Telefoonnummer is vereist", + "phone-input-validation": "Telefoonnummer is ongeldig of niet mogelijk", + "phone-input-pattern": "Ongeldig telefoonnummer. Moet in E.164-formaat zijn, bijv. {{phoneNumber}}", + "phone-input-hint": "Telefoonnummer in E.164-formaat, bijv. {{phoneNumber}}" + } }, "mobile": { "add-application": "Applicatie toevoegen", @@ -4184,6 +4714,7 @@ "api-usage-limit": "API-gebruikslimiet", "device-activity": "Apparaatactiviteit", "entities-limit": "Entiteitenlimiet", + "entities-limit-increase-request": "Verzoek om verhoging van entiteitenlimiet", "entity-action": "Entiteithandeling", "general": "Algemeen", "rule-engine-lifecycle-event": "Levenscyclusgebeurtenis van regelengine", @@ -4401,6 +4932,12 @@ "at-least": "Ten minste:", "character": "{ count, plural, =1 {1 teken} other {# tekens} }", "digit": "{ count, plural, =1 {1 cijfer} other {# cijfers} }", + "password-tooltip-min-length": "Minimaal {{minimumLength}} tekens lang", + "password-tooltip-max-length": "Maximaal {{maximumLength}} tekens lang", + "password-tooltip-uppercase": "{{minimumUppercaseLetters}} hoofdletter", + "password-tooltip-lowercase": "{{minimumLowercaseLetters}} kleine letter", + "password-tooltip-digit": "{{minimumDigits}} cijfer", + "password-tooltip-special-characters": "{{minimumSpecialCharacters}} speciaal teken", "incorrect-password-try-again": "Onjuist wachtwoord. Probeer opnieuw", "lowercase-letter": "{ count, plural, =1 {1 kleine letter} other {# kleine letters} }", "new-passwords-not-match": "Nieuw wachtwoord komt niet overeen", @@ -4459,7 +4996,8 @@ "additional-info": "Aanvullende info (JSON)", "invalid-additional-info": "Kan aanvullende info JSON niet ontleden.", "no-relations-text": "Geen relaties gevonden", - "not": "Niet" + "not": "Niet", + "copy-type": "Type kopiëren" }, "resource": { "add": "Bron toevoegen", @@ -5410,7 +5948,7 @@ "time-series": "Tijdreeksen", "latest": "Laatste waarden", "web-sockets": "WebSockets", - "calculated-fields": "Berekende velden" + "calculated-fields-and-alarm-rules": "Berekende velden en alarmregels" }, "save-attribute": { "processing-settings": "Verwerkingsinstellingen", @@ -5605,7 +6143,8 @@ "bad-request-params": "Ongeldige aanvraagparameters", "item-not-found": "Item niet gevonden", "too-many-requests": "Te veel aanvragen", - "too-many-updates": "Te veel updates" + "too-many-updates": "Te veel updates", + "entities-limit-exceeded": "Entiteitenlimiet overschreden" }, "tenant": { "tenant": "Tenant", @@ -5743,6 +6282,27 @@ "max-arguments-per-cf": "Maximaal aantal argumenten per berekend veld", "max-arguments-per-cf-range": "Maximaal aantal argumenten mag niet negatief zijn", "max-arguments-per-cf-required": "Maximaal aantal argumenten is verplicht", + "max-related-level-per-argument": "Maximaal relatieniveau per argument 'Gerelateerde entiteiten'", + "max-related-level-per-argument-range": "Het maximale relatieniveau per argument 'Gerelateerde entiteiten' mag niet lager zijn dan '1'", + "max-related-level-per-argument-required": "Het maximale relatieniveau per argument 'Gerelateerde entiteiten' is vereist", + "min-allowed-scheduled-update-interval": "Minimaal toegestaan update-interval voor argumenten 'Gerelateerde entiteiten' (seconden)", + "min-allowed-scheduled-update-interval-range": "De minimale waarde voor het minimaal toegestane update-interval mag niet negatief zijn", + "min-allowed-deduplication-interval": "Minimaal toegestaan deduplicatie-interval (seconden)", + "min-allowed-deduplication-interval-range": "De waarde van het minimaal toegestane deduplicatie-interval mag niet negatief zijn", + "min-allowed-deduplication-interval-required": "Minimaal toegestaan deduplicatie-interval is vereist", + "intermediate-aggregation-interval": "Tussentijds aggregatie-interval (seconden)", + "intermediate-aggregation-interval-range": "De waarde van het tussentijds aggregatie-interval mag niet lager zijn dan '1'", + "intermediate-aggregation-interval-required": "Tussentijds aggregatie-interval is vereist", + "reevaluation-check-interval": "Herbeoordelingscontrole-interval (seconden)", + "reevaluation-check-interval-range": "De waarde van het herbeoordelingscontrole-interval mag niet lager zijn dan '1'", + "reevaluation-check-interval-required": "Herbeoordelingscontrole-interval is vereist", + "alarms-reevaluation-interval": "Herbeoordelingsinterval voor alarmen (seconden)", + "alarms-reevaluation-interval-range": "De waarde van het herbeoordelingsinterval voor alarmen mag niet lager zijn dan '1'", + "alarms-reevaluation-interval-required": "Herbeoordelingsinterval voor alarmen is vereist", + "min-allowed-aggregation-interval": "Minimaal toegestaan aggregatie-interval (seconden)", + "min-allowed-aggregation-interval-range": "De waarde van het minimaal toegestane aggregatie-interval mag niet negatief zijn", + "min-allowed-aggregation-interval-required": "Minimaal toegestaan aggregatie-interval is vereist", + "min-allowed-scheduled-update-interval-required": "De minimale waarde voor het minimaal toegestane update-interval is vereist", "max-state-size": "Maximale staatsgrootte in KB", "max-state-size-range": "Staatsgrootte mag niet negatief zijn", "max-state-size-required": "Staatsgrootte is verplicht", @@ -5818,6 +6378,10 @@ "ws-limit-max-subscriptions-per-regular-user": "Maximaal aantal abonnementen per reguliere gebruiker", "ws-limit-max-subscriptions-per-public-user": "Maximaal aantal abonnementen per publieke gebruiker", "ws-limit-updates-per-session": "WS-updates per sessie", + "relation-search-entity-limit": "Relatiezoekentiteitenlimiet", + "relation-search-entity-limit-hint": "Beperkt het aantal entiteiten dat op het laatste niveau van het relatiepad wordt opgelost. Van toepassing op argumenten 'Gerelateerde entiteiten' en propagatievelden.", + "relation-search-entity-limit-required": "Relatiezoekentiteitenlimiet is vereist", + "relation-search-entity-limit-range": "Relatiezoekentiteitenlimiet kan niet lager zijn dan '1'", "rate-limits": { "add-limit": "Limiet toevoegen", "and-also-less-than": "en ook minder dan", @@ -6003,7 +6567,9 @@ "default-agg-interval": "Standaard groeperingsinterval", "edit-intervals-list-hint": "Lijst met beschikbare intervalopties kan worden gespecificeerd.", "edit-grouping-intervals-list-hint": "Het is mogelijk om de lijst met groeperingsintervallen en het standaardinterval te configureren.", - "all": "Alles" + "all": "Alles", + "save-current-settings-as-default": "Huidige instellingen opslaan als standaardtijdvenster", + "hide-option-from-end-users": "Optie verbergen voor eindgebruikers" }, "tooltip": { "trigger": "Trigger", @@ -6657,7 +7223,8 @@ "export-relations": "Exporteer relaties", "export-attributes": "Exporteer attributen", "export-credentials": "Exporteer inloggegevens", - "export-calculated-fields": "Exporteer berekende velden", + "export-calculated-fields": "Berekende velden exporteren \nen alarmregels", + "export-alarm-rules": "Alarmregels exporteren", "entity-versions": "Entiteitversies", "versions": "Versies", "created-time": "Aangemaakt op", @@ -6675,6 +7242,7 @@ "load-attributes": "Attributen laden", "load-credentials": "Inloggegevens laden", "load-calculated-fields": "Berekende velden laden", + "load-alarm-rules": "Alarmregels laden", "compare-with-current": "Vergelijk met huidige", "diff-entity-with-version": "Verschil met entiteitversie '{{versionName}}'", "previous-difference": "Vorige verschil", @@ -6884,7 +7452,23 @@ "scan-qr-code": "QR-code scannen", "make-phone-call": "Telefoongesprek voeren", "get-location": "Telefoonlocatie ophalen", - "take-screenshot": "Schermafbeelding maken" + "take-screenshot": "Schermafbeelding maken", + "handle-provision-success-function": "Provisioning-succesfunctie afhandelen", + "get-location-function": "Locatiefunctie ophalen", + "process-launch-result-function": "Startresultaatfunctie verwerken", + "get-phone-number-function": "Telefoonnummerfunctie ophalen", + "process-image-function": "Afbeeldingsfunctie verwerken", + "process-qr-code-function": "QR-codefunctie verwerken", + "process-location-function": "Locatiefunctie verwerken", + "handle-empty-result-function": "Leegresultaatfunctie afhandelen", + "handle-error-function": "Foutfunctie afhandelen", + "handle-non-mobile-fallback-function": "Non-Mobile-terugvalfunctie afhandelen", + "save-to-gallery": "Opslaan in galerij", + "provision-type": "Provisioningtype", + "auto": "Auto", + "wi-fi": "Wi-Fi", + "ble": "BLE", + "soft-ap": "Soft AP" }, "custom-action-function": "Aangepaste actiefunctie", "custom-pretty-function": "Aangepaste actie (met HTML-sjabloon) functie", @@ -6893,7 +7477,8 @@ "marker": "Markering", "polygon": "Polygoon", "rectangle": "Rechthoek", - "circle": "Cirkel" + "circle": "Cirkel", + "polyline": "Polylijn" }, "place-map-item": "Kaartobject plaatsen", "map-item-tooltip": { @@ -6905,7 +7490,9 @@ "continue-draw-polygon": "Doorgaan met polygoon tekenen", "finish-draw-polygon": "Teken polygoon beëindigen", "start-draw-circle": "Teken cirkel starten", - "finish-draw-circle": "Teken cirkel beëindigen" + "finish-draw-circle": "Teken cirkel beëindigen", + "start-draw-polyline": "Polylijn tekenen starten", + "finish-draw-polyline": "Polylijn tekenen voltooien" } }, "widgets-bundle": { @@ -7471,10 +8058,18 @@ "update-animation-delay": "Vertraging update-animatie" }, "chart-axis": { + "limit": "Limiet", + "source": "Bron", + "key-value": "Sleutel / Waarde", + "value-required": "Waarde is vereist.", + "entity-key-required": "Entiteitsleutel is vereist.", + "key-required": "Sleutel is vereist.", + "scale-limits": "Schaallimieten", + "scale-appearance": "Schaalweergave", "scale": "Schaal", "scale-min": "min", "scale-max": "max", - "scale-auto": "Automatisch" + "scale-auto": "Auto" }, "bar": { "show-border": "Toon rand", @@ -8015,7 +8610,10 @@ "add-radio-option": "Voeg radio-optie toe", "radio-label-position": "Labelpositie", "radio-label-position-before": "Voor", - "radio-label-position-after": "Na" + "radio-label-position-after": "Na", + "save-image": "Afbeelding opslaan", + "save-to-gallery": "Vastgelegde afbeeldingen automatisch opslaan in Afbeeldingsgalerij", + "public-image": "Maakt de afbeelding beschikbaar voor elke onbevoegde gebruiker" }, "invalid-qr-code-text": "Ongeldige invoertekst voor QR-code. Invoer moet van het type string zijn", "qr-code": { @@ -8310,7 +8908,8 @@ "trips": "Reizen", "markers": "Markeringen", "polygons": "Polygonen", - "circles": "Cirkels" + "circles": "Cirkels", + "polylines": "Polylijnen" }, "data-layer": { "source": "Bron", @@ -8507,10 +9106,29 @@ "finish-circle-hint-with-entity": "Cirkel voor '{{entityName}}': klik om te voltooien en op te slaan", "finish-circle-hint": "Cirkel: klik om tekenen te voltooien" }, - "select-entity": "Selecteer entiteit", - "select-entity-hint": "Tip: klik op de kaart na selectie om positie in te stellen" + "polyline": { + "polyline-key": "Polylijnsleutel", + "polyline-key-required": "Polylijnsleutel is vereist", + "no-polylines": "Geen polylijnen geconfigureerd", + "add-polylines": "Polylijn toevoegen", + "polyline-configuration": "Polylijnconfiguratie", + "remove-polyline": "Polylijn verwijderen", + "edit": "Polylijn bewerken", + "cut": "Polylijngebied uitsnijden", + "rotate": "Polylijn roteren", + "remove-polyline-for": "Polylijn verwijderen voor '{{entityName}}'", + "draw-polyline": "Polylijn tekenen", + "polyline-place-first-point-hint-with-entity": "Polylijn voor '{{entityName}}': klik om het eerste punt te plaatsen", + "polyline-place-first-point-hint": "Polylijn: klik om het eerste punt te plaatsen", + "finish-polyline-hint-with-entity": "Polylijn voor '{{entityName}}': klik om het tekenen te voltooien", + "finish-polyline-hint": "Polylijn: klik om het tekenen te voltooien", + "polyline-place-first-point-cut-hint": "Klik om het eerste punt te plaatsen", + "finish-polyline-cut-hint": "Klik op de eerste markering om te voltooien en op te slaan" + }, + "select-entity": "Entiteit selecteren", + "select-entity-hint": "Tip: klik na selectie op de kaart om de positie in te stellen" }, - "select-entity": "Selecteer entiteit", + "select-entity": "Entiteit selecteren", "select-entity-hint": "Tip: klik na selectie op de kaart om de positie in te stellen", "tooltips": { "placeMarker": "Klik om entiteit '{{entityName}}' te plaatsen", @@ -8948,6 +9566,7 @@ "show-empty-space-hidden-action": "Lege ruimte tonen in plaats van verborgen knopactie", "dont-reserve-space-hidden-action": "Geen ruimte reserveren voor verborgen actieknoppen", "display-timestamp": "Tijdstempel", + "timestamp-column-name": "Tijdstempel", "display-pagination": "Paginering weergeven", "default-page-size": "Standaard paginagrootte", "page-step-settings": "Instellingen paginastappen", @@ -9009,7 +9628,9 @@ "alarm-column-error": "Ten minste één alarmkolom moet worden opgegeven", "table-tabs": "Tabeltabs", "show-cell-actions-menu-mobile": "Toon keuzemenu celacties in mobiele modus", - "disable-sorting": "Sortering uitschakelen" + "disable-sorting": "Sortering uitschakelen", + "sort-by": "Tabbladen sorteren op", + "sort-timestamp-option": "Aanmaaktijd" }, "latest-chart": { "total": "Totaal", @@ -9501,11 +10122,28 @@ "content": "

Door dashboards voor eindgebruikers aan te maken, kan een klantgebruiker alleen zijn eigen apparaten zien. Gegevens van andere klanten blijven verborgen.

Volg de documentatie om dit te doen:

" } } + }, + "api-usage": { + "api-usage": "API-gebruik", + "label": "Label", + "state-name": "Statusnaam", + "status": "Status", + "status-required": "Status is vereist.", + "limit": "Maximale limiet", + "limit-required": "Maximale limiet is vereist.", + "current-number": "Huidig aantal", + "current-number-required": "Huidig aantal is vereist.", + "add-key": "Sleutel toevoegen", + "no-key": "Geen sleutel", + "delete-key": "Sleutel verwijderen", + "target-dashboard-state": "Doeldashboardstatus", + "go-to-main-state": "Naar standaardweergave gaan" } }, "icon": { "icon": "Pictogram", "icons": "Pictogrammen", + "custom": "Aangepast", "select-icon": "Selecteer pictogram", "material-icons": "Material pictogrammen", "show-all": "Toon alle pictogrammen", @@ -9546,6 +10184,7 @@ "items-per-page-separator": "van" }, "language": { + "auto": "Auto", "language": "Taal" } } \ No newline at end of file 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 066f1ec940..b7f6e8d8f0 100644 --- a/ui-ngx/src/assets/locale/locale.constant-tr_TR.json +++ b/ui-ngx/src/assets/locale/locale.constant-tr_TR.json @@ -78,6 +78,7 @@ "show-more": "Daha fazla göster", "dont-show-again": "Bir daha gösterme", "see-documentation": "Dokümantasyonu görüntüle", + "see-debug-events": "Hata Ayıklama Olaylarını Görüntüle", "clear": "Temizle", "upload": "Yükle", "delete-anyway": "Yine de sil", @@ -485,6 +486,7 @@ "2fa": { "2fa": "İki faktörlü kimlik doğrulama", "available-providers": "Mevcut sağlayıcılar", + "available-providers-required": "En az bir 2FA sağlayıcısı yapılandırılmalıdır.", "issuer-name": "Yayımlayıcı adı", "issuer-name-required": "Yayımlayıcı adı gereklidir.", "max-verification-failures-before-user-lockout": "Kullanıcı kilitlenmeden önceki maksimum doğrulama başarısızlığı", @@ -513,7 +515,9 @@ "verification-message-template-required": "Doğrulama mesajı şablonu gereklidir.", "within-time": "Belirli süre içinde (sn)", "within-time-pattern": "Süre pozitif bir tamsayı olmalıdır.", - "within-time-required": "Süre gereklidir." + "within-time-required": "Süre gereklidir.", + "force-2fa": "İki Faktörlü Kimlik Doğrulamayı Zorunlu Kıl", + "enforce-for": "Şunun İçin Zorunlu Kıl" }, "jwt": { "security-settings": "JWT güvenlik ayarları", @@ -545,16 +549,11 @@ "slack-settings": "Slack ayarları", "mobile-settings": "Mobil ayarlar", "firebase-service-account-file": "Firebase servis hesabı kimlik bilgileri JSON dosyası", - "select-firebase-service-account-file": "Firebase servis hesabı kimlik bilgileri dosyanızı sürükleyip bırakın veya ", - "trendz": "Trendz", - "trendz-settings": "Trendz ayarları", - "trendz-url": "Trendz URL'si", - "trendz-url-required": "Trendz URL'si gereklidir", - "trendz-api-key": "Trendz API anahtarı", - "trendz-enable": "Trendz'i etkinleştir" + "select-firebase-service-account-file": "Firebase servis hesabı kimlik bilgileri dosyanızı sürükleyip bırakın veya " }, "alarm": { "alarm": "Alarm", + "alarm-list": "Alarm Listesi", "alarms": "Alarmlar", "all-alarms": "Tüm alarmlar", "select-alarm": "Alarm seçin", @@ -655,7 +654,16 @@ "alarm-type": "Alarm türü", "enter-alarm-type": "Alarm türünü girin", "no-alarm-types-matching": "'{{entitySubtype}}' ile eşleşen alarm türü bulunamadı.", - "alarm-type-list-empty": "Seçilmiş alarm türü yok." + "alarm-type-list-empty": "Seçilmiş alarm türü yok.", + "system-comments": { + "acked-by-user": "Alarm, {{userName}} adlı kullanıcı tarafından onaylandı", + "cleared-by-user": "Alarm, {{userName}} adlı kullanıcı tarafından temizlendi", + "assigned-to-user": "Alarm, {{userName}} adlı kullanıcı tarafından {{assigneeName}} adlı kullanıcıya atandı", + "unassigned-to-user": "Alarm, {{userName}} adlı kullanıcı tarafından atamadan çıkarıldı", + "unassigned-from-deleted-user": "{{userName}} adlı kullanıcı silindiği için alarm atamadan çıkarıldı", + "comment-deleted": "{{userName}} adlı kullanıcı yorumunu sildi", + "severity-changed": "Alarm önceliği {{oldSeverity}} değerinden {{newSeverity}} değerine güncellendi" + } }, "alarm-activity": { "add": "Yorum ekle...", @@ -760,6 +768,7 @@ "name-max-length": "Ad 256 karakterden kısa olmalıdır", "label-max-length": "Etiket 256 karakterden kısa olmalıdır", "description": "Açıklama", + "description-required": "Açıklama gereklidir.", "type": "Tür", "type-required": "Tür gereklidir.", "details": "Detaylar", @@ -873,6 +882,9 @@ "alarms-created-monthly-activity": "Aylık oluşturulan alarmlar", "data-points": "Veri noktaları", "data-points-storage-days": "Veri noktası saklama süresi (gün)", + "data-points-storage-days-hourly-activity": "Veri noktaları depolama günleri saatlik etkinlik", + "data-points-storage-days-daily-activity": "Veri noktaları depolama günleri günlük etkinlik", + "data-points-storage-days-monthly-activity": "Veri noktaları depolama günleri aylık etkinlik", "device-api": "Cihaz API'si", "email": "E-posta", "email-messages": "E-posta mesajları", @@ -906,6 +918,7 @@ "rule-node": "Kural Düğümü", "sms": "SMS", "sms-messages": "SMS mesajları", + "sms-messages-hourly-activity": "SMS mesajları saatlik etkinlik", "sms-messages-daily-activity": "Günlük SMS mesajları", "sms-messages-monthly-activity": "Aylık SMS mesajları", "successful": "${entityName} Başarılı", @@ -915,13 +928,40 @@ "telemetry-persistence-hourly-activity": "Telemetri kalıcılığı saatlik etkinliği", "telemetry-persistence-monthly-activity": "Telemetri kalıcılığı aylık etkinliği", "transport": "İletim", + "transport-msg-hourly-activity": "Taşıma mesajları saatlik etkinlik", + "transport-msg-daily-activity": "Taşıma mesajları günlük etkinlik", + "transport-msg-monthly-activity": "Taşıma mesajları aylık etkinlik", "transport-daily-activity": "İletim günlük etkinliği", "transport-data-points": "İletim veri noktaları", - "transport-hourly-activity": "İletim saatlik etkinliği", - "transport-messages": "İletim mesajları", - "transport-monthly-activity": "İletim aylık etkinliği", + "transport-data-points-hourly-activity": "Taşıma veri noktaları saatlik etkinlik", + "transport-data-points-daily-activity": "Taşıma veri noktaları günlük etkinlik", + "transport-data-points-monthly-activity": "Taşıma veri noktaları aylık etkinlik", "view-details": "Detayları görüntüle", - "view-statistics": "İstatistikleri görüntüle" + "view-statistics": "İstatistikleri görüntüle", + "transport-messages": "Taşıma mesajları", + "transport-messages-hourly-activity": "Taşıma mesajları saatlik etkinlik", + "transport-data-point-hourly-activity": "Taşıma veri noktası saatlik etkinlik", + "javascript-function-executions": "JavaScript işlev yürütmeleri", + "javascript-function-executions-hourly-activity": "JavaScript işlev yürütmeleri saatlik etkinlik", + "javascript-function-executions-daily-activity": "JavaScript işlev yürütmeleri günlük etkinlik", + "javascript-function-executions-monthly-activity": "JavaScript işlev yürütmeleri aylık etkinlik", + "tbel-function-executions": "TBEL işlev yürütmeleri", + "tbel-function-executions-hourly-activity": "TBEL işlev yürütmeleri saatlik etkinlik", + "tbel-function-executions-daily-activity": "TBEL işlev yürütmeleri günlük etkinlik", + "tbel-function-executions-monthly-activity": "TBEL işlev yürütmeleri aylık etkinlik", + "created-reports": "Oluşturulan raporlar", + "created-reports-hourly-activity": "Oluşturulan raporlar saatlik etkinlik", + "created-reports-daily-activity": "Oluşturulan raporlar günlük etkinlik", + "created-reports-monthly-activity": "Oluşturulan raporlar aylık etkinlik", + "emails": "Emails", + "emails-hourly-activity": "Emails saatlik etkinlik", + "emails-daily-activity": "Emails günlük etkinlik", + "emails-monthly-activity": "Emails aylık etkinlik", + "status": { + "enabled": "Etkin", + "disabled": "Devre Dışı", + "warning": "Uyarı" + } }, "api-limit": { "cassandra-write-queries-core": "Rest API Cassandra yazma sorguları", @@ -946,6 +986,40 @@ "edge-uplink-messages": "Edge yukarı bağlantı mesajları", "edge-uplink-messages-per-edge": "Edge başına yukarı bağlantı mesajları" }, + "api-key": { + "api-key": "API anahtarı", + "api-keys": "API anahtarları", + "delete-api-key-title": "“{{name}}” API anahtarını silmek istediğinizden emin misiniz?", + "delete-api-key-text": "Dikkat: Onaydan sonra anahtar kurtarılamaz.", + "delete-api-keys-title": "{ count, plural, =1 {1 API anahtarı} other {# API anahtarı} } silmek istediğinizden emin misiniz?", + "delete-api-keys-text": "Dikkat: Onaydan sonra seçilen tüm anahtarlar kurtarılamaz.", + "expiration-date": "Son Kullanma Tarihi", + "date": "tarih", + "description": "Açıklama", + "disable": "Devre Dışı Bırak", + "edit-description": "Açıklamayı Düzenle", + "enable": "API Anahtarını Etkinleştir ", + "expiration-time": "Son Kullanma Saati", + "expiration-time-never": "Asla", + "expiration-time-custom": "Özel", + "generate": "Oluştur", + "generate-title": "API Anahtarı Oluştur", + "generate-text": "Not: API anahtarı, oluşturulduğu kullanıcının izinlerini devralır.", + "generated-api-key-title": "API anahtarı oluşturuldu. Bağlantıyı kontrol edelim!", + "generated-api-key-copy": "API anahtarınızı şimdi kopyalayıp kaydettiğinizden emin olun; çünkü bir daha göremeyeceksiniz.", + "generated-api-key-command": "Bağlantıyı kontrol etmek için aşağıdaki talimatları kullanın. Sonuç olarak, geçerli kullanıcı bilgilerini almanız gerekir:", + "generated-api-key-insecure-url": "Güvenli olmayan bir HTTP bağlantısı üzerinden komut çalıştırmak, API anahtarınızı şifrelenmemiş şekilde gönderir ve ele geçirilmeye karşı savunmasız hâle getirir.", + "list": "{ count, plural, =1 {Bir API anahtarı} other {# API anahtarı listesi} }", + "manage": "Yönet", + "manage-api-keys": "API Anahtarlarını Yönet", + "no-found": "API anahtarı bulunamadı", + "selected-api-keys": "{ count, plural, =1 {1 API anahtarı} other {# API anahtarı} } seçildi", + "search": "API anahtarlarını ara", + "status": "Durum", + "status-active": "Etkin", + "status-inactive": "Etkin Değil", + "status-expired": "Süresi Doldu" + }, "audit-log": { "audit": "Denetim", "audit-logs": "Denetim günlükleri", @@ -999,7 +1073,11 @@ "type-provision-failure": "Cihaz tedarik işlemi başarısız oldu", "type-timeseries-updated": "Telemetri güncellendi", "type-timeseries-deleted": "Telemetri silindi", - "type-sms-sent": "SMS gönderildi" + "type-sms-sent": "SMS gönderildi", + "any-type": "Herhangi Bir Tür", + "audit-log-filter-title": "Denetim Günlüğü Filtresi", + "filter-title": "Filtre", + "filter-types": "Denetim günlüğü türleri" }, "debug-settings": { "label": "Hata Ayıklama Yapılandırması", @@ -1020,12 +1098,25 @@ "selected-fields": "{ count, plural, =1 {1 hesaplanmış alan} other {# hesaplanmış alan} } seçildi", "type": { "simple": "Basit", - "script": "Komut dosyası" + "simple-hint": "Girdi bağımsız değişkenlerine dayalı basit aritmetik hesaplama.", + "script": "Betik", + "script-hint": "TBEL betiği kullanılarak tanımlı bağımsız değişkenler üzerinde hesaplama.", + "geofencing": "Coğrafi Çitleme", + "geofencing-hint": "Varlık GPS konumu ve geçişlerinin, yapılandırılmış coğrafi çitleme bölge gruplarına göre değerlendirilmesi.", + "propagation": "Yayılım", + "propagation-hint": "İlişki yönü ve türüne bağlı olarak verilerin üst veya alt varlıklara yayılması.", + "related-entities-aggregation": "İlgili varlıkların toplulaştırılması", + "related-entities-aggregation-hint": "İlgili varlıklardan en son verilerin toplulaştırılması.", + "time-series-data-aggregation": "Zaman serisi verilerinin toplulaştırılması", + "time-series-data-aggregation-hint": "Geçerli bir varlıktan geçmiş verilerin toplulaştırılması." }, + "preview": "Önizleme", "arguments": "Argümanlar", "decimals-by-default": "Varsayılan ondalık", "debugging": "Hesaplanmış alan hata ayıklama", + "calculated-field-details": "Hesaplanmış alan ayrıntıları", "argument-name": "Argüman adı", + "name": "Ad", "datasource": "Veri kaynağı", "add-argument": "Argüman ekle", "test-script-function": "Komut dosyası işlevini test et", @@ -1037,8 +1128,9 @@ "argument-asset": "Varlık", "argument-customer": "Müşteri", "argument-tenant": "Geçerli kiracı", + "argument-owner": "Geçerli sahip", + "argument-relation-query": "İlgili varlıklar", "argument-type": "Argüman türü", - "see-debug-events": "Hata ayıklama olaylarını görüntüle", "attribute": "Öznitelik", "copy-argument-name": "Argüman adını kopyala", "timeseries-key": "Zaman serisi anahtarı", @@ -1051,12 +1143,14 @@ "shared-attributes": "Paylaşılan öznitelikler", "attribute-key": "Öznitelik anahtarı", "default-value": "Varsayılan değer", + "default-value-required": "Varsayılan değer gereklidir.", "limit": "Maksimum değer", "time-window": "Zaman aralığı", "customer-name": "Müşteri adı", "asset-name": "Varlık adı", "timeseries": "Zaman serisi", "output": "Çıktı", + "output-hint": "Çıktının nasıl işlendiğini tanımlar.", "create": "Yeni hesaplanmış alan oluştur", "file": "Hesaplanmış alan dosyası", "invalid-file-error": "Geçersiz dosya biçimi. Lütfen dosyanın geçerli bir JSON dosyası olduğundan emin olun.", @@ -1070,23 +1164,395 @@ "delete-multiple-text": "Dikkat, onaydan sonra seçilen tüm hesaplanmış alanlar ve ilgili tüm veriler geri alınamaz hale gelecektir.", "test-with-this-message": "Bu mesaj ile test et", "use-latest-timestamp": "En son zaman damgasını kullan", + "entity-coordinates": "Varlık koordinatları", + "latitude-time-series-key": "Enlem zaman serisi anahtarı", + "latitude-time-series-key-required": "Enlem zaman serisi anahtarı gereklidir.", + "longitude-time-series-key": "Boylam zaman serisi anahtarı", + "longitude-time-series-key-required": "Boylam zaman serisi anahtarı gereklidir.", + "geofencing-zone-groups": "Coğrafi çitleme bölge grupları", + "geofencing-zone-groups-settings": "Coğrafi çitleme bölge grubu ayarları", + "target-zone": "Hedef bölge", + "perimeter-key": "Çevre anahtarı", + "report-strategy": "Raporlama stratejisi", + "no-zone-configured": "En az bir bölge gereklidir.", + "no-zone-configured-required": "En az bir bölge grubu yapılandırılmalıdır.", + "add-zone-group": "Bölge Grubu Ekle", + "report-transition-event-only": "Yalnızca geçiş olayları", + "report-presence-status-only": "Yalnızca bulunma durumu", + "report-transition-event-and-presence": "Bulunma durumu ve geçiş olayları", + "perimeter-attribute-key": "Çevre öznitelik anahtarı", + "perimeter-attribute-key-required": "Çevre öznitelik anahtarı gereklidir.", + "perimeter-attribute-key-pattern": "Çevre öznitelik anahtarı geçersiz.", + "entity-zone-relationship": "Varlıktan Bölgelere Giden Yol", + "direction": "İlişki yönü", + "direction-from": "Varlıktan bölgeye", + "direction-to": "Bölgeden varlığa", + "relation-type": "İlişki türü", + "create-relation-with-matched-zones": "Kaynak varlık için eşleşen bölgelerle ilişkiler oluştur", + "relation-level": "İlişki düzeyi", + "fetch-last-available-level": "Yalnızca son kullanılabilir düzeyi getir", + "zone-group-refresh-interval": "Bölge grupları yenileme aralığı", + "copy-zone-group-name": "Bölge grubu adını kopyala", + "open-details-page": "Varlık ayrıntıları sayfasını aç", + "level": "Düzey", + "direction-level": "Yön", + "direction-up": "Yukarı", + "direction-up-parent": "Üste (üst öğeye)", + "direction-down": "Aşağı", + "direction-down-child": "Alta (alt öğeye)", + "add-level": "Düzey Ekle", + "delete-level": "Düzeyi Sil", + "no-level": "Yapılandırılmış düzey yok", + "levels-required": "En az bir düzey yapılandırılmalıdır.", + "max-allowed-levels-error": "İlişki düzeyi izin verilen azami değeri aşıyor.", + "propagation-path-related-entities": "İlgili varlıklara yayılım yolu", + "propagate-type": { + "arguments-only": "Yalnızca bağımsız değişkenler", + "expression-result": "Hesaplama sonucu" + }, + "script": "Betik", + "data-propagate": "Yayılacak veri", + "output-key": "Çıktı anahtarı", + "copy-output-key": "Çıktı anahtarını kopyala", + "aggregation-path-related-entities": "İlgili varlıklara toplulaştırma yolu", + "deduplication-interval": "Yinelenenleri ayıklama aralığı", + "deduplication-interval-min": "Yinelenenleri ayıklama aralığı en az {{ sec }} saniye olmalıdır.", + "deduplication-interval-hint": "Telemetri toplulaştırmaları arasındaki asgari süre.", + "deduplication-interval-required": "Yinelenenleri ayıklama aralığı gereklidir.", + "calculated-field-filter-title": "Hesaplanmış alan filtresi", + "filter-title": "Filtre", + "calculated-field-types": "Hesaplanmış alan türleri", + "events": "Olaylar", + "any-type": "Herhangi Bir Tür", + "metrics": { + "metrics": "Metrikler", + "metrics-empty": "En az bir metrik yapılandırılmalıdır.", + "metric-name": "Metrik adı", + "metric-name-required": "Metrik adı gereklidir.", + "metric-name-pattern": "Metrik adı geçersiz.", + "metric-name-duplicate": "Bu isimde bir metrik zaten mevcut.", + "metric-name-max-length": "Metrik adı 256 karakterden kısa olmalıdır.", + "metric-name-forbidden": "Metrik adı rezerve edilmiştir ve kullanılamaz.", + "copy-metric-name": "Metrik adını kopyala", + "argument-name": "Bağımsız değişken adı", + "aggregation": "Toplama", + "aggregation-type": { + "avg": "Ortalama", + "min": "Minimum", + "max": "Maksimum", + "sum": "Toplam", + "count": "Sayım", + "count-unique": "Benzersiz sayım" + }, + "filtered": "Filtrelenmiş", + "value-source": "Değer kaynağı", + "value-source-hint": "Toplama için değerin nasıl elde edileceğini tanımlar.", + "value-source-type": { + "key": "Anahtar", + "function": "Fonksiyon" + }, + "no-metrics-configured": "En az bir metrik gereklidir.", + "add-metric": "Metrik Ekle", + "max-metrics": "Maksimum metrik sayısına ulaşıldı.", + "metric-settings": "Metrik ayarları", + "filter": "Filtre", + "filter-hint": "Toplama sırasında varlıkların filtrelenmesini sağlar. Filtre fonksiyonu bir boolean değer döndürmeli ve tüm yapılandırılmış bağımsız değişkenleri kullanabilir." + }, + "output-strategy": { + "strategy": "Strateji", + "process-right-away": "Hemen işleme", + "process-rule-chains": "Kural Zincirleri ile işleme", + "save-time-series": "Zaman serilerine kaydet", + "save-database": "Veritabanına kaydet", + "save-latest-values": "Son değerlere kaydet", + "send-web-sockets": "Web Soketlerine gönder", + "save-calculated-fields": "Hesaplanmış alanlara gönder", + "update-attribute-only-on-value-change": "Yalnızca değer değiştiğinde özniteliği güncelle", + "send-attributes-updated-notification": "Öznitelik güncelleme bildirimini gönder", + "ttl": "Özel TTL", + "ttl-required": "TTL gereklidir", + "ttl-min": "Sadece 0 minimum TTL izni verilir", + "processing-parameters": "İşleme parametreleri", + "hint": { + "strategy": "Sonucun hemen işlenip işlenmeyeceğini veya ek işlem için kural zincirine gönderilip gönderilmeyeceğini kontrol eder.", + "processing-options": "İşleme seçenekleri", + "update-attribute-only-on-value-change": "Değer değişse de değişmese de her gelen mesajda öznitelik güncellenir. Bu, API kullanımını artırır ve performansı düşürür.", + "update-attribute-only-on-value-change-enabled": "Öznitelik yalnızca değer değiştiğinde güncellenir. Değer değişmediyse, zaman damgaları güncellenmez ve bildirim gönderilmez.", + "send-attributes-updated-notification": "Öznitelikler güncellendi olayı, varsayılan kural zincirine gönderilir.", + "save-time-series": "Zaman serisi verisi, veritabanındaki ts_kv tablosuna kaydedilir.", + "save-database": "Öznitelik verisi veritabanına kaydedilir.", + "save-latest-values": "Yeni değer daha güncelse, zaman serisi verisi veritabanındaki ts_kv_latest tablosuna güncellenir.", + "send-web-sockets-attribute": "WebSocket aboneliklerine, öznitelik verisi güncellemeleri hakkında bildirim gönderir.", + "send-web-sockets-time-series": "WebSocket aboneliklerine, zaman serisi verisi güncellemeleri hakkında bildirim gönderir.", + "save-calculated-fields-attribute": "Hesaplanmış alanlara, öznitelik verisi güncellemeleri hakkında bildirim gönderir.", + "save-calculated-fields-time-series": "Hesaplanmış alanlara, zaman serisi verisi güncellemeleri hakkında bildirim gönderir.", + "ttl": "Zaman serisi verisinin saklama süresini tanımlar. Devre dışı bırakıldığında, Kiracı Profili TTL'si kullanılır." + } + }, + "aggregate-interval-type": "Toplama aralığı türü", + "aggregate-interval-value": "Toplama aralığı değeri", + "aggregate-interval-value-required": "Toplama aralığı değeri gereklidir.", + "aggregate-interval-value-min": "Toplama aralığı değeri en az { sec, plural, =0 {0 saniye} =1 {1 saniye} other {# saniye} } olmalıdır.", + "aggregate-interval-value-step-multiple-of": "Toplama aralığı değeri, 1 günün katları veya böleni olmalıdır.", + "aggregate-period": { + "hour": "Saat", + "day": "Gün", + "week": "Hafta (Pzt - Pazar)", + "week-sun-sat": "Hafta (Pazar - Cumartesi)", + "month": "Ay", + "quarter": "Çeyrek", + "year": "Yıl", + "custom": "Özel" + }, + "aggregate-period-hint-offset": "Toplama aralığınız: {{ interval }} olacak.", + "aggregate-period-hint-offset-and-so-on": "Toplama aralığınız: {{ interval }} olacak ve devam edecek.", + "entity-aggregation": { + "argument-hint": "Veri mevcut varlıktan alınacaktır.", + "argument-title-hint": "Toplama için kullanılan giriş bağımsız değişkenlerini tanımlar.", + "argument-setting-hint": "Son telemetri, bu hesaplanmış alan için mevcut tek bağımsız değişken türüdür.", + "aggregation-interval": "Toplama aralığı", + "aggregation-interval-hint": "Toplamanın ne sıklıkla yapılacağını tanımlar. Örnek: her 1 saat, 00:00, 01:00, 02:00, vb. saatlerde veri toplar. Toplama sonuçları, toplama aralığının başlangıcına karşılık gelen zaman damgası ile saklanır.", + "apply-offset": "Toplama aralığına offset uygula", + "apply-offset-hint": "Her toplama döneminin başlangıcını ne kadar kaydıracağını tanımlar (örneğin, +10 dakika - 00:10, 01:10).", + "offset-value": "Offset değeri", + "offset-value-required": "Offset değeri gereklidir.", + "offset-value-min": "Offset değeri pozitif bir tam sayı olmalıdır.", + "offset-value-max": "Offset değeri, toplama aralığı değerinden küçük olmalıdır.", + "wait-delay": "Gecikmeli telemetri için bekleme süresi uygula", + "wait-delay-hint": "Aralık bittiğinde gecikmeli telemetriyi beklemek için ne kadar süre bekleyeceğinizi tanımlar. Eğer böyle bir telemetri gelirse, o aralık için sonuç yeniden hesaplanacaktır.", + "duration": "Süre", + "duration-required": "Süre gereklidir.", + "duration-min": "Süre en az 1 dakika olmalıdır.", + "duration-hint": "Aralık bittiğinde gecikmeli veriyi beklemek için ne kadar süre bekleyeceğinizi tanımlar.", + "produce-intermediate-result": "Ara sonuç üret", + "produce-intermediate-result-hint": "Mevcut aralıkta metrikler hesaplanarak ara sonuç üretilir. Güncellemeler, her {{ time }}'de bir kez yapılacaktır." + }, "hint": { - "arguments-simple-with-rolling": "Basit türde hesaplanmış alan zaman serisi kaydırma tipi anahtar içermemelidir.", - "arguments-empty": "Argümanlar boş olmamalıdır.", + "arguments-simple-with-rolling": "Basit türdeki hesaplanmış alan, zaman serisi yuvarlama türüyle anahtarlar içermemelidir.", + "arguments-propagate-arguments-with-rolling": "'Zaman serisi yuvarlama' türü, 'Yalnızca bağımsız değişkenler' yayılımıyla uyumsuzdur.", + "arguments-propagate-argument-entity-type": "Varlık türü, 'Yalnızca bağımsız değişkenler' yayılımıyla uyumsuzdur.", + "arguments-propagate-argument-must-current-entity": "En az bir bağımsız değişken, 'Mevcut varlık' kaynak varlık türü ile yapılandırılmalıdır.", + "arguments-empty": "En az bir bağımsız değişken belirtilmelidir.", "expression-required": "İfade gereklidir.", - "expression-invalid": "İfade geçersiz", - "expression-max-length": "İfade uzunluğu 255 karakterden az olmalıdır.", - "argument-name-required": "Argüman adı gereklidir.", - "argument-name-pattern": "Argüman adı geçersiz.", - "argument-name-duplicate": "Bu adda bir argüman zaten mevcut.", - "argument-name-max-length": "Argüman adı 256 karakterden kısa olmalıdır.", - "argument-name-forbidden": "Bu argüman adı rezerve edilmiştir ve kullanılamaz.", - "argument-type-required": "Argüman türü gereklidir.", - "max-args": "Maksimum argüman sayısına ulaşıldı.", - "decimals-range": "Varsayılan ondalık sayısı 0 ile 15 arasında olmalıdır.", - "expression": "Varsayılan ifade, sıcaklığı Fahrenheit'tan Celsius'a dönüştürmeyi gösterir.", - "arguments-entity-not-found": "Argüman hedef varlığı bulunamadı.", - "use-latest-timestamp": "Etkinleştirilirse, hesaplanan değer sunucu zamanı yerine argümanlardan gelen telemetri için en son zaman damgası ile kaydedilir." + "expression-invalid": "İfade geçersiz.", + "expression-max-length": "İfade uzunluğu 255 karakterden kısa olmalıdır.", + "argument-name-required": "Bağımsız değişken adı gereklidir.", + "argument-name-pattern": "Bağımsız değişken adı geçersiz.", + "argument-name-duplicate": "Bu isimde bir bağımsız değişken zaten mevcut.", + "argument-name-max-length": "Bağımsız değişken adı 256 karakterden kısa olmalıdır.", + "argument-name-forbidden": "Bağımsız değişken adı rezerve edilmiştir ve kullanılamaz.", + "output-key-required": "Çıktı anahtarı gereklidir.", + "output-key-pattern": "Çıktı anahtarı geçersiz.", + "output-key-duplicate": "Bu isimde bir anahtar zaten mevcut.", + "output-key-max-length": "Çıktı anahtarı 256 karakterden kısa olmalıdır.", + "output-key-forbidden": "Çıktı anahtarı rezerve edilmiştir ve kullanılamaz.", + "entity-type-required": "Varlık türü gereklidir.", + "name-required": "Ad gereklidir.", + "name-pattern": "Ad geçersiz.", + "name-duplicate": "Bu isimde bir ad zaten mevcut.", + "name-max-length": "Ad 256 karakterden kısa olmalıdır.", + "name-forbidden": "Ad rezerve edilmiştir ve kullanılamaz.", + "argument-type-required": "Bağımsız değişken türü gereklidir.", + "max-args": "Maksimum bağımsız değişken sayısına ulaşıldı.", + "decimals-range": "Ondalıklar varsayılan olarak 0 ile 15 arasında bir sayı olmalıdır.", + "expression": "Varsayılan ifade, bir sıcaklık değerini Fahrenheit'ten Celsius'a nasıl dönüştüreceğini gösterir.", + "arguments-entity-not-found": "Bağımsız değişken hedef varlığı bulunamadı.", + "use-latest-timestamp": "Etkinleştirilirse, hesaplanan değer, bağımsız değişkenlerin telemetrisindeki en son zaman damgası kullanılarak saklanacaktır, sunucu zamanı yerine.", + "entity-coordinates": "Varlık GPS koordinatlarını (enlem ve boylam) sağlayan zaman serisi anahtarlarını belirtin.", + "geofencing-zone-groups": "Kontrol edilecek bir veya daha fazla coğrafi çitleme bölgesi grubu tanımlayın (örneğin 'allowedZones', 'restrictedZones'). Her grup, hesaplanmış alan çıktısı telemetri anahtarları için önek olarak kullanılacak benzersiz bir ada sahip olmalıdır.", + "perimeter-attribute-key": "Coğrafi çitleme bölgesi çevre tanımını içeren öznitelik anahtarını ayarlayın. Çevre her zaman bölge varlıklarının sunucu tarafı özniteliklerinden alınır.", + "report-strategy": "Bulunma durumu, varlığın şu anda bölge grubunun İÇİNDE mi yoksa DIŞINDA mı olduğunu rapor eder. Geçiş olayları, varlığın bölge grubuna GİRDİĞİ veya ÇIKTIĞI zamanı rapor eder.", + "create-relation-with-matched-zones": "Varlık ile şu anda içinde bulunduğu bölgeler arasında ilişkiler otomatik olarak oluşturulup korunur. Varlık bir bölgeden ayrıldığında ilişkiler kaldırılır ve yeni bir bölgeye girdiğinde oluşturulur.", + "relation-type-required": "İlişki türü gereklidir.", + "relation-level-required": "İlişki düzeyi gereklidir.", + "relation-level-min": "Minimum ilişki düzeyi değeri 1'dir.", + "relation-level-max": "Maksimum ilişki düzeyi değeri {{max}}'dir.", + "geofencing-empty": "En az bir bölge grubu yapılandırılmalıdır.", + "geofencing-entity-not-found": "Coğrafi çitleme hedef varlığı bulunamadı.", + "max-geofencing-zone": "Maksimum coğrafi çitleme bölgesi sayısına ulaşıldı.", + "zone-group-refresh-interval": "İlgili varlıklar aracılığıyla yapılandırılan bölge gruplarının ne sıklıkla yenileneceğini tanımlar.", + "zone-group-refresh-interval-required": "Bölge gruplarının yenileme aralığı gereklidir.", + "zone-group-refresh-interval-min": "Bölge grubu yenileme aralığı en az {{ min }} saniye olmalıdır.", + "propagation-path-related-entities": "Seçilen yön ve ilişki türüne göre, ilgili bir varlığa doğrudan, tek seviyeli bir yolu tanımlar. Yalnızca cihaz, varlık, müşteri ve kiracı varlıkları arasındaki ilişkiler desteklenir. İlişki yolu ile çözülmüş maksimum varlık sayısı {{ max }}'dir.", + "data-propagate": "Aşağıda yapılandırılan bağımsız değişkenlerden hangi verilerin yayılacağını tanımlar. 'Yalnızca bağımsız değişkenler', alınan verileri doğrudan kullanırken, 'İfade sonucu' bu verilerden yeni bir değer hesaplar.", + "aggregation-path-related-entities": "Yön ve ilişki türüne dayalı olarak, üst veya alt varlıklarla doğrudan ilişkiler aracılığıyla tek seviyeli bir toplama yolunu tanımlar. Yalnızca cihaz, varlık, müşteri ve kiracı varlıkları arasındaki ilişkiler desteklenir. İlişki yolu ile çözülmüş maksimum varlık sayısı {{ max }}'dir.", + "arguments-aggregation": "Filtreleme ve toplama için kullanılan giriş bağımsız değişkenlerini tanımlar.", + "setting-arguments-aggregation": "Veriler, toplama yolunda yapılandırılan ilgili varlıklardan alınacaktır.", + "metrics": "Yapılandırılmış bağımsız değişkenlere dayalı olarak toplanan metrikleri tanımlar.", + "entity-aggregation-metrics": "Belirtilen zaman aralıklarında yapılandırılmış bağımsız değişkenlere dayalı olarak toplanan metrikleri tanımlar.", + "import-invalid-calculated-field-type": "Hesaplanmış alan ithal edilemedi: Geçersiz hesaplanmış alan yapısı.", + "simple-expression-title": "Hesaplanan değerin nasıl hesaplanacağını tanımlayan aritmetik ifade.", + "script-title": "Hesaplama mantığını ve çıktı değerlerini tanımlayan TBEL betiği.", + "simple-arguments": "Hesaplanan değerin nasıl hesaplanacağını tanımlayan aritmetik ifade.", + "script-arguments": "Betiğe mevcut olan giriş bağımsız değişkenlerini tanımlar." + } + }, + "alarm-rule": { + "alarm-rules-tab": "Alarm kuralları", + "alarm-rule": "Alarm kuralı", + "alarm-rules": "Alarm kuralları", + "alarm-rules-old": "Eski", + "alarm-rules-actual": "Geçerli", + "severities": "Öncelikler", + "cleared": "Koşul temizlendi", + "delete-title": "“{{title}}” alarm kuralını silmek istediğinizden emin misiniz?", + "delete-text": "Dikkat, onaydan sonra alarm kuralı ve tüm ilişkili veriler geri getirilemez olacaktır.", + "delete-multiple-title": "{ count, plural, =1 {1 alarm kuralı} other {# alarm kuralı} } silmek istediğinizden emin misiniz?", + "delete-multiple-text": "Dikkat, onaydan sonra tüm seçilen alarm kuralları silinecek ve tüm ilişkili veriler geri getirilemez olacaktır.", + "create": "Yeni alarm kuralı oluştur", + "add": "Alarm kuralı ekle", + "copy": "Alarm kuralı yapılandırmasını kopyala", + "details": "Alarm kuralı ayrıntıları", + "no-found": "Alarm kuralı bulunamadı", + "list": "{ count, plural, =1 {Bir alarm kuralı} other {# alarm kuralı listesi} }", + "selected-fields": "{ count, plural, =1 {1 alarm kuralı} other {# alarm kuralı} } seçildi", + "import": "Alarm kuralı içe aktar", + "file": "Alarm kuralı dosyası", + "export": "Alarm kuralı dışa aktar", + "export-failed-error": "Alarm kuralı dışa aktarılamadı: {{error}}", + "entity-type": "Varlık türü", + "entity-type-required": "Varlık türü gereklidir.", + "alarm-type": "Alarm türü", + "alarm-type-hint": "Alarm kaynağı (Cihaz, Varlık, vb.) kapsamında çakışmaları önlemek için benzersiz tanımlayıcı (örneğin, HighTempAlarm).", + "alarm-type-required": "Alarm türü gereklidir.", + "alarm-type-pattern": "Alarm türü geçersiz.", + "alarm-type-max-length": "Alarm türü 256 karakterden kısa olmalıdır.", + "clear-alarm": "Alarmı temizle", + "value-argument": "Bağımsız değişken", + "value-argument-required": "Bağımsız değişken gereklidir.", + "static-settings": "Statik ayarlar", + "configuration": "Yapılandırma", + "static-schedule": "Statik", + "dynamic-schedule": "Dinamik", + "operation-and": "VE", + "operation-or": "VEYA", + "condition-during": "{{during}} süresince", + "condition-during-dynamic": "\"{{ attribute }}\" süresince", + "condition-repeat-times": "{ count, plural, =1 {1 kez} other {# kez} } tekrarlar", + "condition-repeat-times-dynamic": "\"{{ attribute }}\" kadar tekrarlar", + "filter-preview": "Filtre önizlemesi", + "condition-settings": "Koşul ayarları", + "static": "Statik", + "dynamic": "Dinamik", + "argument-filters": "Bağımsız değişken filtreleri", + "argument-name": "Bağımsız değişken adı", + "value-type": "Değer türü", + "general": "Genel", + "filters": "Filtreler", + "date-time-hint": "Bağımsız değişken epoch milisaniye cinsinden olmalıdır. Örnek: 1698839340000, 2023-11-01 12:49:00 UTC'ye eşittir.", + "operation": "İşlem", + "value-source": "Değer kaynağı", + "value": "Değer", + "ignore-case": "Büyük/küçük harf duyarlılığını göz ardı et", + "condition": "Koşul", + "script": "Betik", + "add-filter": "Bağımsız değişken filtresi ekle", + "edit-filter": "Bağımsız değişken filtresi", + "remove-filter": "Bağımsız değişken filtresini kaldır", + "no-filter": "En az bir filtre gereklidir.", + "conditions": { + "simple": "Basit", + "duration": "Süre", + "repeating": "Tekrarlayan" + }, + "schedule-title": "Zamanlama", + "edit-schedule": "Alarm zamanlamasını düzenle", + "schedule-type": "Zamanlayıcı türü", + "schedule-type-required": "Zamanlayıcı türü gereklidir.", + "schedule": { + "any-time": "Her zaman etkin", + "specific-time": "Belirli bir zamanda etkin", + "custom": "Özel" + }, + "schedule-day": { + "monday": "Pazartesi", + "tuesday": "Salı", + "wednesday": "Çarşamba", + "thursday": "Perşembe", + "friday": "Cuma", + "saturday": "Cumartesi", + "sunday": "Pazar" + }, + "schedule-days": "Günler", + "schedule-time": "Zaman", + "schedule-time-from": "Başlangıç", + "schedule-time-to": "Bitiş", + "schedule-days-of-week-required": "En az bir hafta günü seçilmelidir.", + "tbel": "TBEL", + "expression-type": { + "simple": "Basit", + "script": "Betik" + }, + "operation-type": { + "and": "Ve", + "or": "Veya" + }, + "filter-predicate-type": { + "string": "Dize", + "numeric": "Sayısal", + "boolean": "Mantıksal", + "complex": "Karmaşık" + }, + "alarm-rule-additional-info": "Ekstra bilgi", + "edit-alarm-rule-additional-info": "Ekstra bilgiyi düzenle", + "alarm-rule-additional-info-placeholder": "Lütfen alarm ayrıntılarında Ekstra bilgi altında görüntülenmesi için yorumlarınızı ve düzenlemelerinizi buraya yazın", + "alarm-rule-additional-info-hint": "İpucu: alarm kuralı koşulunda kullanılan bağımsız değişkenlerin değerlerini yerine koymak için ${Bağımsız değişken adı} kullanın.", + "alarm-rule-additional-info-icon-hint": "Bağımsız değişkenlerin değerlerini yerine koymak için Bağımsız değişken adını kullanın.", + "alarm-rule-mobile-dashboard": "Mobil gösterge paneli", + "alarm-rule-mobile-dashboard-hint": "Mobil uygulama tarafından alarm ayrıntıları gösterge paneli olarak kullanılır.", + "alarm-rule-no-mobile-dashboard": "Hiçbir gösterge paneli seçilmedi", + "alarm-rule-condition": "Alarm kuralı koşulu", + "enter-alarm-rule-condition-prompt": "Koşul ekle", + "enter-alarm-rule-clear-condition-prompt": "Temizleme koşulu ekle", + "edit-alarm-rule-condition": "Alarm koşulu", + "condition-type": "Koşul türü", + "condition-type-hint": "\"Süre\" ve \"Tekrarlayan\" seçenekleri, filtrede \"Eksik\" işlemi kullanıldığında mevcut değildir.", + "select-alarm-severity": "Alarm önceliğini seçin", + "add-create-alarm-rule-prompt": "En az bir tetikleyici koşul gereklidir.", + "add-create-alarm-rule": "Tetikleyici koşulu ekle", + "add-clear-alarm-rule": "Temizleme koşulu ekle", + "condition-duration": "Koşul süresi", + "condition-duration-value": "Süre değeri", + "condition-duration-time-unit": "Zaman birimi", + "condition-duration-value-range": "Süre değeri 1 ile 2147483647 arasında olmalıdır.", + "condition-duration-value-pattern": "Süre değeri tamsayı olmalıdır.", + "condition-duration-value-required": "Süre değeri gereklidir.", + "condition-duration-time-unit-required": "Zaman birimi gereklidir.", + "condition-repeating-value": "Olay sayısı", + "condition-repeating-value-hint": "Herhangi bir alarm kuralı bağımsız değişkeninin güncellenmesi olay olarak sayılır.", + "condition-repeating-value-range": "Olay sayısı 1 ile 2147483647 arasında olmalıdır.", + "condition-repeating-value-pattern": "Olay sayısı tamsayı olmalıdır.", + "condition-repeating-value-required": "Olay sayısı gereklidir.", + "create-conditions": "Tetikleyici koşullar", + "clear-condition": "Temizleme koşulu", + "no-clear-alarm-rule": "Temizleme koşulu yapılandırılmadı.", + "advanced-settings": "Gelişmiş ayarlar", + "propagate-alarm": "Alarmı ilgili varlıklara yay", + "alarm-rule-relation-types-list": "İlişki türleri", + "alarm-rule-relation-types-list-hint": "İlgili varlıkları filtrelemek için ilişki türlerini tanımlar. Belirtilmezse, alarm tüm ilgili varlıklara yayılacaktır.", + "propagate-alarm-to-owner": "Alarmı varlık sahibine yay (Müşteri veya Kiracı)", + "propagate-alarm-to-tenant": "Alarmı Kiracıya yay", + "alarm-rule-filter-title": "Alarm kuralı filtresi", + "filter-title": "Filtre", + "debugging": "Alarm kuralı hata ayıklama", + "any-type": "Herhangi bir tür", + "enter-alarm-rule-type": "Alarm türünü girin", + "no-alarm-rule-types-matching": "‘{{entitySubtype}}’ için eşleşen alarm türleri bulunamadı.", + "alarm-rule-type-list-empty": "Hiç alarm türü seçilmedi.", + "alarm-rule-type-list": "Alarm türü listesi", + "alarm-rule-entity-list": "Varlık listesi", + "missing-for": "Eksik", + "time-unit": "Zaman birimi", + "mode": "Mod", + "type": "Tür", + "value-required": "Değer gereklidir.", + "min-value": "Değer 1 veya daha büyük olmalıdır.", + "argument-in-use": "Bağımsız değişken genel bağımsız değişken olarak kullanılıyor.", + "import-invalid-alarm-rule-type": "Alarm kuralı içe aktarılamadı: Geçersiz alarm kuralı yapısı.", + "no-filter-preview": "Filtre belirtilmedi", + "filter-operation": { + "and": "Ve", + "or": "Veya" } }, "ai-models": { @@ -1111,15 +1577,17 @@ "mistral-ai": "Mistral AI", "anthropic": "Anthropic", "amazon-bedrock": "Amazon Bedrock", - "github-models": "GitHub Modelleri" + "github-models": "GitHub Modelleri", + "ollama": "Ollama" }, - "name-required": "Ad gerekli.", + "name-required": "Ad zorunludur.", "name-max-length": "Ad en fazla 255 karakter olmalıdır.", "provider": "Sağlayıcı", "api-key": "API anahtarı", - "api-key-required": "API anahtarı gerekli.", + "api-key-required": "API anahtarı zorunludur.", + "api-key-open-ai-required": "Resmî OpenAI API'si kullanılırken API anahtarı zorunludur.", "project-id": "Proje Kimliği", - "project-id-required": "Proje kimliği gerekli.", + "project-id-required": "Proje Kimliği zorunludur", "location": "Konum", "location-required": "Konum gerekli.", "service-account-key-file": "Hizmet hesabı anahtar dosyası", @@ -1154,17 +1622,34 @@ "frequency-penalty": "Frekans cezası", "frequency-penalty-hint": "Bir belirtecin metinde geçme sıklığına göre olasılığına ceza uygular.", "max-output-tokens": "Maksimum çıktı belirteçleri", - "max-output-tokens-min": "0'dan büyük olmalıdır.", "max-output-tokens-hint": "Modelin tek bir yanıtta üretebileceği maksimum belirteç sayısını ayarlar.", + "context-length": "Bağlam uzunluğu", + "context-length-hint": "Token cinsinden bağlam penceresinin boyutunu tanımlar. Bu değer, hem kullanıcının girdisini hem de üretilen yanıtı içeren model için toplam bellek sınırını belirler.", "endpoint": "Uç nokta", "endpoint-required": "Uç nokta gereklidir.", + "baseurl": "Base URL", + "baseurl-required": "Base URL zorunludur.", "service-version": "Servis versiyonu", "check-connectivity": "Bağlantıyı kontrol et", "check-connectivity-success": "Test isteği başarılı oldu", "check-connectivity-failed": "Test isteği başarısız oldu", "no-model-matching": "'{{entity}}' ile eşleşen model bulunamadı.", "model-required": "Model gereklidir.", - "no-model-text": "Model bulunamadı." + "no-model-text": "Model bulunamadı.", + "authentication": "Kimlik doğrulama", + "authentication-basic-hint": "Standart HTTP Basic kimlik doğrulamasını kullanır. Kullanıcı adı ve parola birleştirilir, Base64 ile kodlanır ve Ollama sunucusuna yapılan her istekte \"Authorization\" başlığında gönderilir.", + "authentication-token-hint": "Bearer token kimlik doğrulamasını kullanır. Sağlanan token, Ollama sunucusuna yapılan her istekte doğrudan \"Authorization\" başlığında gönderilecektir.", + "authentication-type": { + "none": "Yok", + "basic": "Basic", + "token": "Token" + }, + "username": "Kullanıcı adı", + "username-required": "Kullanıcı adı zorunludur.", + "password": "Parola", + "password-required": "Parola zorunludur.", + "token": "Token", + "token-required": "Token zorunludur." }, "confirm-on-exit": { "message": "Kaydedilmemiş değişiklikleriniz var. Bu sayfadan ayrılmak istediğinizden emin misiniz?", @@ -1174,6 +1659,7 @@ "contact": { "country": "Ülke", "country-required": "Ülke gereklidir.", + "country-object-required": "Lütfen listeden geçerli bir ülke seçin.", "city": "Şehir", "state": "Eyalet / İl", "postal-code": "Posta Kodu", @@ -1210,6 +1696,8 @@ "documentation": "Dokümantasyon", "time-left": "{{time}} kaldı", "output": "Çıktı", + "sort-asc": "Artan", + "sort-desc": "Azalan", "suffix": { "s": "sn", "ms": "ms" @@ -1346,6 +1834,8 @@ "mobile-order": "Mobil uygulamadaki pano sırası", "mobile-hide": "Panoyu mobil uygulamada gizle", "update-image": "Pano görselini güncelle", + "update-new-version": "Yeni sürüm yükle", + "upload-file-to-update": "Yükseltmek için dosya yükle", "take-screenshot": "Ekran görüntüsü al", "select-widget-title": "Widget seç", "select-widget-value": "{{title}}: widget seç", @@ -1714,6 +2204,8 @@ "bootstrap-tab": "Başlatma İstemcisi", "bootstrap-server": "Başlatma Sunucusu", "lwm2m-server": "LwM2M Sunucusu", + "client-reboot": "Kayıt Güncelleme Tetikleyicisi", + "bootstrap-reboot": "Bootstrap-Request Tetikleyicisi", "client-publicKey-or-id": "İstemci Genel Anahtarı veya Kimliği", "client-publicKey-or-id-required": "İstemci Genel Anahtarı veya Kimliği gereklidir.", "client-publicKey-or-id-tooltip-psk": "[RFC7925] standardına göre PSK tanımlayıcısı en fazla 128 baytlık rastgele bir tanımlayıcıdır.\nTanımlayıcı önce karakter dizisine çevrilmeli ve ardından UTF-8 ile kodlanmalıdır.", @@ -1761,7 +2253,6 @@ "unable-delete-device-alias-text": "'{{deviceAlias}}' cihaz takma adı aşağıdaki widget(lar) tarafından kullanıldığı için silinemiyor:
{{widgetsList}}", "is-gateway": "Ağ geçidi mi", "overwrite-activity-time": "Bağlı cihaz için etkinlik zamanını üzerine yaz", - "device-filter": "Cihaz filtresi", "device-filter-title": "Cihaz Filtresi", "filter-title": "Filtre", "device-state": "Cihaz durumu", @@ -2215,6 +2706,7 @@ "short-id-required": "Kısa sunucu kimliği gereklidir.", "short-id-range": "Kısa sunucu kimliği {{ min }} ile {{ max }} arasında olmalıdır.", "short-id-pattern": "Kısa sunucu kimliği pozitif bir tamsayı olmalıdır.", + "short-id-pattern-bs": "Kısa sunucu ID'si yalnızca null olmalıdır", "lifetime": "İstemci kayıt süresi", "lifetime-required": "İstemci kayıt süresi gereklidir.", "lifetime-pattern": "İstemci kayıt süresi pozitif bir tamsayı olmalıdır.", @@ -2309,7 +2801,9 @@ "composite-all-description": "Tüm kaynaklar tek Composite Observe isteğiyle gözlemlenir (daha verimli, daha az esnek)", "composite-by-object": "Nesnelere göre birleştir", "composite-by-object-description": "Kaynaklar nesne türüne göre gruplanır ve ayrı Composite Observe istekleri ile gözlemlenir (dengeli yaklaşım)" - } + }, + "init-attr-tel-as-obs-strategy": "Öznitelikleri ve telemetrileri Observe stratejisi ile başlat", + "init-attr-tel-as-obs-strategy-hint": "Eğer yanlışsa - öznitelikler ve telemetri değerleri tek tek okunarak başlatılır.\\nEğer doğruysa - öznitelikler ve telemetri, Observe stratejisi kullanılarak değerlerine abone olunarak başlatılır." }, "snmp": { "add-communication-config": "İletişim yapılandırması ekle", @@ -2625,6 +3119,8 @@ "type-rulenodes": "Kural düğümleri", "list-of-rulenodes": "{ count, plural, =1 {Bir kural düğümü} other {# kural düğümü listesi} }", "rulenode-name-starts-with": "'{{prefix}}' ile başlayan kural düğümleri", + "type-api-key": "API anahtarı", + "type-api-keys": "API anahtarları", "type-current-customer": "Mevcut Müşteri", "type-current-tenant": "Mevcut Kiracı", "type-current-user": "Mevcut Kullanıcı", @@ -2646,6 +3142,7 @@ "details": "Varlık ayrıntıları", "no-entities-prompt": "Varlık bulunamadı", "no-data": "Görüntülenecek veri yok", + "show-all-columns": "Tümünü Göster", "columns-to-display": "Görüntülenecek sütunlar", "type-api-usage-state": "API Kullanım Durumu", "type-edge": "Uç", @@ -2691,7 +3188,15 @@ "list-of-mobile-apps": "{ count, plural, =1 {Bir mobil uygulama} other {# mobil uygulama listesi} }", "type-mobile-app-bundle": "Mobil paket", "type-mobile-app-bundles": "Mobil paketler", - "list-of-mobile-app-bundles": "{ count, plural, =1 {Bir mobil paket} other {# mobil paket listesi} }" + "list-of-mobile-app-bundles": "{ count, plural, =1 {Bir mobil paket} other {# mobil paket listesi} }", + "limit-reached": "Sınır aşıldı", + "limit-reached-text": "{{ entities }} sınırına ulaştınız. Daha fazla eklemek için lütfen Sistem Yöneticinizden {{ entity }} sınırınızı artırmasını isteyin.", + "request-limit-increase": "Sınır artışı talep et", + "request-sysadmin-text": "Sistem Yöneticisi misiniz?", + "login-here": "Buradan giriş yap", + "to-increase-limit": "sınırı artırmak için.", + "increase-limit-request-sent-title": "Sistem Yöneticinize sınır artışı için otomatik bir talep gönderdik", + "increase-limit-request-sent-text": "Lütfen talepleri inceleyip ayarları güncellemeleri için biraz zaman verin. Değişiklikleri görmek için bu sayfayı yenileyebilirsiniz." }, "entity-field": { "created-time": "Oluşturulma zamanı", @@ -3768,6 +4273,7 @@ "two-factor-authentication": "İki adımlı doğrulama", "passwords-mismatch-error": "Girilen şifreler aynı olmalıdır!", "password-again": "Şifre tekrar", + "sign-in": "Lütfen giriş yapın", "username": "Kullanıcı adı (e-posta)", "remember-me": "Beni hatırla", "forgot-password": "Şifrenizi mi unuttunuz?", @@ -3778,7 +4284,8 @@ "password-link-sent-message": "Sıfırlama bağlantısı gönderildi", "email": "E-posta", "invalid-email-format": "Geçersiz e-posta formatı.", - "login-with": "{{name}} ile giriş yap", + "sign-in-with": "{{name}} ile giriş yap", + "sign-in-to-your-account": "Hesabınıza giriş yapın", "or": "veya", "error": "Giriş hatası", "verify-your-identity": "Kimliğinizi doğrulayın", @@ -3797,7 +4304,51 @@ "activation-link-expired": "Aktivasyon bağlantısının süresi doldu", "activation-link-expired-message": "Profilinizi aktifleştirmek için gönderilen bağlantının süresi doldu. Yeni bir e-posta almak için giriş sayfasına dönebilirsiniz.", "reset-password-link-expired": "Şifre sıfırlama bağlantısının süresi doldu", - "reset-password-link-expired-message": "Şifre sıfırlama bağlantısının süresi doldu. Yeni bir e-posta almak için giriş sayfasına dönebilirsiniz." + "reset-password-link-expired-message": "Şifre sıfırlama bağlantısının süresi doldu. Yeni bir e-posta almak için giriş sayfasına dönebilirsiniz.", + "two-fa": "İki faktörlü kimlik doğrulama", + "two-fa-required": "İki faktörlü kimlik doğrulama gereklidir", + "set-up-verification-method": "Devam etmek için bir doğrulama yöntemi ayarlayın", + "set-up-verification-method-login": "Bir doğrulama yöntemi ayarlayın veya giriş yapın", + "enable-authenticator-app": "Authenticator uygulamasını etkinleştir", + "enable-authenticator-app-description": "Lütfen doğrulama uygulamanızdan güvenlik kodunu girin", + "enable-authenticator-sms": "SMS doğrulayıcıyı etkinleştir", + "enable-authenticator-sms-description": "Az önce gönderdiğimiz 6 haneli kodu girin", + "enable-authenticator-email": "E-posta doğrulayıcıyı etkinleştir", + "enable-authenticator-email-description": "Bir güvenlik kodu, e-posta adresinize gönderildiği için lütfen kontrol edin", + "enter-key-manually": "veya bu 32 haneli anahtarı manuel olarak girin:", + "continue": "Devam et", + "confirm": "Onayla", + "authenticator-app-success": "Authenticator uygulaması başarıyla etkinleştirildi", + "authenticator-app-success-description": "Bir dahaki sefere giriş yaptığınızda, iki faktörlü kimlik doğrulama kodu girmeniz gerekecek", + "authenticator-sms-success": "SMS doğrulayıcı başarıyla etkinleştirildi", + "authenticator-sms-success-description": "Bir dahaki sefere giriş yaptığınızda, telefon numarasına gönderilecek güvenlik kodunu girmeniz istenecektir", + "authenticator-email-success": "E-posta doğrulayıcı başarıyla etkinleştirildi", + "authenticator-email-success-description": "Bir dahaki sefere giriş yaptığınızda, e-posta adresinize gönderilecek güvenlik kodunu girmeniz istenecektir", + "authenticator-backup-code-success": "Yedek kod başarıyla etkinleştirildi", + "authenticator-backup-code-success-description": "Bir dahaki sefere giriş yaptığınızda, güvenlik kodunu girmeniz veya yedek kodlardan birini kullanmanız istenecektir.", + "add-verification-method": "Doğrulama yöntemi ekle", + "get-backup-code": "Yedek kodu al", + "copy-key": "Anahtarı kopyala", + "send-code": "Kodu gönder", + "email-label": "E-posta", + "email-description": "Doğrulayıcı olarak kullanmak için bir e-posta adresi girin.", + "sms-description": "Doğrulayıcı olarak kullanmak için bir telefon numarası girin.", + "backup-code-description": "Kodları yazdırarak, hesabınıza giriş yapmak için gerektiğinde kullanabilirsiniz. Her yedek kodu bir kez kullanılabilir.", + "backup-code-warn": "Bu sayfayı terk ettiğinizde, bu kodlar bir daha gösterilemez. Aşağıdaki seçenekleri kullanarak güvenli bir şekilde saklayın.", + "download-txt": "İndir (txt)", + "print": "Yazdır", + "verification-code": "6 haneli kod", + "verification-code-invalid": "Geçersiz doğrulama kodu formatı", + "verification-code-incorrect": "Doğrulama kodu yanlış", + "verification-code-many-request": "Doğrulama kodunu kontrol etmek için çok fazla istek yapıldı", + "scan-qr-code": "Bu QR kodunu doğrulama uygulamanızla tarayın", + "phone-input": { + "phone-input-label": "Telefon numarası", + "phone-input-required": "Telefon numarası gereklidir", + "phone-input-validation": "Telefon numarası geçersiz veya mümkün değil", + "phone-input-pattern": "Geçersiz telefon numarası. E.164 formatında olmalıdır, örn. {{phoneNumber}}", + "phone-input-hint": "Telefon Numarası E.164 formatında olmalıdır, örn. {{phoneNumber}}" + } }, "mobile": { "add-application": "Uygulama ekle", @@ -4165,6 +4716,7 @@ "api-usage-limit": "API kullanım limiti", "device-activity": "Cihaz etkinliği", "entities-limit": "Varlık sınırı", + "entities-limit-increase-request": "Varlık sınırı artırma talebi", "entity-action": "Varlık işlemi", "general": "Genel", "rule-engine-lifecycle-event": "Kural motoru yaşam döngüsü olayı", @@ -4382,6 +4934,12 @@ "at-least": "En az:", "character": "{ count, plural, =1 {1 karakter} other {# karakter} }", "digit": "{ count, plural, =1 {1 rakam} other {# rakam} }", + "password-tooltip-min-length": "En az {{minimumLength}} karakter uzunluğunda olmalı", + "password-tooltip-max-length": "En fazla {{maximumLength}} karakter uzunluğunda olmalı", + "password-tooltip-uppercase": "{{minimumUppercaseLetters}} büyük harf karakter", + "password-tooltip-lowercase": "{{minimumLowercaseLetters}} küçük harf karakter", + "password-tooltip-digit": "{{minimumDigits}} rakam", + "password-tooltip-special-characters": "{{minimumSpecialCharacters}} özel karakter", "incorrect-password-try-again": "Hatalı şifre. Lütfen tekrar deneyin", "lowercase-letter": "{ count, plural, =1 {1 küçük harf} other {# küçük harf} }", "new-passwords-not-match": "Yeni şifreler eşleşmedi", @@ -4440,7 +4998,8 @@ "additional-info": "Ek bilgi (JSON)", "invalid-additional-info": "Ek bilgi json'u ayrıştırılamadı.", "no-relations-text": "İlişki bulunamadı", - "not": "Değil" + "not": "Değil", + "copy-type": "Kopyalama türü" }, "resource": { "add": "Kaynak ekle", @@ -4477,15 +5036,21 @@ "jks": "JKS", "js-module": "JS modülü", "lwm2m-model": "LWM2M modeli", - "pkcs-12": "PKCS #12" + "pkcs-12": "PKCS #12", + "general": "Genel" }, "resource-sub-type": "Alt tür", "sub-type": { - "image": "resim", - "scada-symbol": "Scada sembolü", + "image": "Görsel", + "scada-symbol": "SCADA sembolü", "extension": "Uzantı", "module": "Modül" - } + }, + "resource-is-in-use": "Kaynak diğer varlıklar tarafından kullanılıyor", + "resources-are-in-use": "Kaynaklar diğer varlıklar tarafından kullanılıyor", + "resource-is-in-use-text": "Kaynak '{{title}}' aşağıdaki varlıklar tarafından kullanıldığı için silinmedi:", + "resources-are-in-use-text": "Tüm kaynaklar silinmedi çünkü bazıları diğer varlıklar tarafından kullanılıyor.
İlgili varlıkları, ilgili kaynak satırındaki Referanslar düğmesine tıklayarak görüntüleyebilirsiniz.
Bu kaynakları yine de silmek istiyorsanız, aşağıdaki tabloda onları seçin ve Seçilenleri Sil düğmesine tıklayın.", + "delete-resource-in-use-text": "Kaynağı yine de silmek istiyorsanız Yine de Sil düğmesine tıklayın." }, "javascript": { "add": "JavaScript kaynağı ekle", @@ -4930,26 +5495,26 @@ "request-method": "İstek yöntemi", "use-simple-client-http-factory": "Basit HTTP istemci fabrikasını kullan", "ignore-request-body": "İstek içeriği olmadan", - "parse-to-plain-text": "Düz metne dönüştür", - "parse-to-plain-text-hint": "Seçildiğinde, istek içeriği JSON dizisinden düz metne dönüştürülür, örn. msg = \"Hello,\\t\"world\"\" will be parsed to Hello, \"world\"", - "read-timeout": "Okuma zaman aşımı (milisaniye)", - "read-timeout-hint": "0 değeri, sınırsız zaman aşımı anlamına gelir", - "max-parallel-requests-count": "Maksimum paralel istek sayısı", - "max-parallel-requests-count-hint": "0 değeri, paralel işlemeye sınırsız izin verir", - "max-response-size": "Maksimum yanıt boyutu (KB)", - "max-response-size-hint": "HTTP mesajlarını çözümlerken/şifrelerken ayrılacak maksimum bellek miktarı (örneğin JSON veya XML yükleri için)", - "headers": "Başlıklar", - "headers-hint": "Başlık/değer alanlarında meta veriden değer almak için ${metadataKey}, mesaj içeriğinden değer almak için $[messageKey] kullanın", - "header": "Başlık", - "header-required": "Başlık gereklidir", + "parse-to-plain-text": "Düz metne ayrıştır", + "parse-to-plain-text-hint": "Seçilirse, istek gövdesindeki mesaj yükü JSON dizgesinden düz metne dönüştürülür; örn. msg = \"Hello,\\t\"world\"\" ifadesi Hello, \"world\" olarak ayrıştırılır", + "read-timeout": "Okuma zaman aşımı (ms cinsinden)", + "read-timeout-hint": "0 değeri sonsuz zaman aşımı anlamına gelir", + "max-parallel-requests-count": "Maksimum eşzamanlı istek sayısı", + "max-parallel-requests-count-hint": "0 değeri paralel işlemde herhangi bir sınır olmadığını belirtir", + "max-response-size": "Maksimum yanıt boyutu (KB cinsinden)", + "max-response-size-hint": "HTTP iletilerini (JSON veya XML yükleri gibi) kodlarken ya da kodunu çözerken veri arabelleğe alma için ayrılan maksimum bellek miktarı", + "headers": "Üstbilgiler", + "headers-hint": "Üstbilgi/değer alanlarında, meta veriden değer almak için ${metadataKey}, ileti gövdesinden değer almak için $[messageKey] kullanın", + "header": "Üstbilgi", + "header-required": "Üstbilgi zorunludur", "value": "Değer", - "value-required": "Değer gereklidir", + "value-required": "Değer zorunludur", "topic-pattern": "Konu deseni", "key-pattern": "Anahtar deseni", - "key-pattern-hint": "İsteğe bağlı. Geçerli bir bölüm numarası belirtilirse kayıt gönderilirken kullanılır. Belirtilmemişse anahtar kullanılır. Her ikisi de belirtilmemişse round-robin yöntemi kullanılır.", - "topic-pattern-required": "Konu deseni gereklidir", + "key-pattern-hint": "İsteğe bağlıdır. Geçerli bir bölüm (partition) numarası belirtilirse, kayıt gönderilirken bu değer kullanılır. Herhangi bir bölüm belirtilmezse, bunun yerine anahtar kullanılır. Her ikisi de belirtilmezse, bölümler döngüsel olarak (round-robin) atanır.", + "topic-pattern-required": "Konu deseni zorunludur", "topic": "Konu", - "topic-required": "Konu gereklidir", + "topic-required": "Konu zorunludur", "bootstrap-servers": "Başlangıç sunucuları", "bootstrap-servers-required": "Başlangıç sunucuları değeri gereklidir", "other-properties": "Diğer özellikler", @@ -5385,7 +5950,7 @@ "time-series": "Zaman serisi", "latest": "Son değerler", "web-sockets": "WebSockets", - "calculated-fields": "Hesaplanmış alanlar" + "calculated-fields-and-alarm-rules": "Hesaplanmış alanlar ve alarm kuralları" }, "save-attribute": { "processing-settings": "İşleme ayarları", @@ -5431,32 +5996,33 @@ "ai": { "ai-model": "Yapay Zeka modeli", "model": "Model", - "ai-model-hint": "Bu kural düğümü tarafından gönderilen istekleri işlemek için önceden yapılandırılmış bir yapay zeka modeli seçin veya yeni bir tane yapılandırmak için \"Yeni oluştur\" seçeneğini kullanın.", + "ai-model-hint": "Bu kural düğümü tarafından gönderilen istekleri işlemek için önceden yapılandırılmış Yapay Zeka modelini seçin veya yeni bir tane yapılandırmak için \"Yeni oluştur\" seçeneğini kullanın.", "prompt-settings": "İstem ayarları", - "prompt-settings-hint": "İsteğe bağlı sistem istemi, yapay zekanın genel rolünü ve kısıtlamalarını belirlerken, kullanıcı istemi gerçekleştirilmesi gereken belirli görevi tanımlar. Her iki alan da şablonlaştırmayı destekler.", + "prompt-settings-hint": "İsteğe bağlı sistem istemi, YZ'nin genel rolünü ve kısıtlarını belirlerken, kullanıcı istemi gerçekleştirilecek belirli görevi tanımlar. Her iki alan da şablonlaştırmayı destekler.", "system-prompt": "Sistem istemi", - "system-prompt-max-length": "Sistem istemi en fazla 500000 karakter olmalıdır.", - "system-prompt-blank": "Sistem istemi boş olmamalıdır.", + "system-prompt-max-length": "Sistem istemi 500000 karakter veya daha az olmalıdır.", + "system-prompt-blank": "Sistem istemi boş bırakılmamalıdır.", "user-prompt": "Kullanıcı istemi", - "user-prompt-required": "Kullanıcı istemi gereklidir.", - "user-prompt-max-length": "Kullanıcı istemi en fazla 500000 karakter olmalıdır.", - "user-prompt-blank": "Kullanıcı istemi boş olmamalıdır.", - "response-format": "Yanıt formatı", + "user-prompt-required": "Kullanıcı istemi zorunludur.", + "user-prompt-max-length": "Kullanıcı istemi 500000 karakter veya daha az olmalıdır.", + "user-prompt-blank": "Kullanıcı istemi boş bırakılmamalıdır.", + "response-format": "Yanıt biçimi", "response-text": "Metin", "response-json": "JSON", "response-json-schema": "JSON Şeması", - "response-format-hint-TEXT": "Modelin geçerli bir JSON nesnesi olup olmayabileceği rastgele metin üretmesine olanak tanır. Çıktı geçerli bir JSON nesnesi değilse, otomatik olarak \"response\" anahtarı altında bir JSON nesnesine sarılır.", - "response-format-hint-JSON": "Modelin geçerli bir JSON yanıtı üretmesi gereklidir. Çıktı geçerli bir JSON nesnesi değilse, otomatik olarak \"response\" anahtarı altında bir JSON nesnesine sarılır.", - "response-format-hint-JSON_SCHEMA": "Modelin, sağlanan şemada tanımlanan belirli yapı ve veri türleriyle eşleşen bir JSON üretmesi gereklidir. Çıktı geçerli bir JSON nesnesi değilse, otomatik olarak \"response\" anahtarı altında bir JSON nesnesine sarılır.", - "response-json-schema-hint": "Geçerli herhangi bir JSON Şeması girilebilir, ancak bu kural düğümü yalnızca sınırlı bir alt kümesini destekler. Ayrıntılar için düğüm belgelerine bakın.", - "response-json-schema-required": "JSON Şeması gereklidir", + "response-format-hint-TEXT": "Modelin rastgele metin üretmesine izin verir; bu metin geçerli bir JSON nesnesi olabilir veya olmayabilir. Çıktı geçerli bir JSON nesnesi değilse, otomatik olarak \"response\" anahtarının altında bir JSON nesnesine sarılır.", + "response-format-hint-JSON": "Modelin geçerli bir JSON olan bir yanıt üretmesi gerekir. Çıktı geçerli bir JSON nesnesi değilse, otomatik olarak \"response\" anahtarının altında bir JSON nesnesine sarılır.", + "response-format-hint-JSON_SCHEMA": "Modelin, sağlanan şemada tanımlanan belirli yapı ve veri türleriyle eşleşen bir JSON üretmesi gerekir. Çıktı geçerli bir JSON nesnesi değilse, otomatik olarak \"response\" anahtarının altında bir JSON nesnesine sarılır.", + "response-json-schema-hint": "Her geçerli JSON Şeması girilebilir, ancak bu kural düğümü bunun özelliklerinin yalnızca sınırlı bir alt kümesini destekler. Ayrıntılar için düğüm belgelerine bakın.", + "response-json-schema-required": "JSON Şeması zorunludur", "advanced-settings": "Gelişmiş ayarlar", "timeout": "Zaman aşımı", - "timeout-hint": "Yapay zeka modelinden yanıt beklemek için maksimum süre. \nSüre aşılırsa istek sonlandırılır.", - "timeout-required": "Zaman aşımı gereklidir", + "timeout-hint": "İstek sonlandırılmadan önce YZ modelinden \nyanıt beklemek için azami süre.", + "timeout-required": "Zaman aşımı zorunludur", "timeout-validation": "1 saniye ile 10 dakika arasında olmalıdır.", - "force-acknowledgement": "Zorunlu onaylama", - "force-acknowledgement-hint": "Etkinleştirilirse, gelen mesaj anında onaylanır. Modelin yanıtı ayrı, yeni bir mesaj olarak kuyruğa alınır." + "force-acknowledgement": "Onayı zorla", + "force-acknowledgement-hint": "Etkinleştirilirse, gelen ileti hemen onaylanır. Modelin yanıtı daha sonra ayrı, yeni bir ileti olarak kuyruğa alınır.", + "ai-resources": "Yapay Zeka kaynakları" } }, "timezone": { @@ -5579,7 +6145,8 @@ "bad-request-params": "Hatalı istek parametreleri", "item-not-found": "Öğe bulunamadı", "too-many-requests": "Çok fazla istek yapıldı", - "too-many-updates": "Çok fazla güncelleme yapıldı" + "too-many-updates": "Çok fazla güncelleme yapıldı", + "entities-limit-exceeded": "Varlık sınırı aşıldı" }, "tenant": { "tenant": "Kiracı", @@ -5717,6 +6284,27 @@ "max-arguments-per-cf": "Hesaplanmış alan başına maksimum argüman sayısı", "max-arguments-per-cf-range": "Hesaplanmış alan başına maksimum argüman sayısı negatif olamaz", "max-arguments-per-cf-required": "Hesaplanmış alan başına maksimum argüman sayısı gereklidir", + "max-related-level-per-argument": "'İlgili varlıklar' bağımsız değişkeni için maksimum ilişki düzeyi", + "max-related-level-per-argument-range": "'İlgili varlıklar' bağımsız değişkeni için ilişki düzeyi maksimum sayısı '1' den küçük olamaz", + "max-related-level-per-argument-required": "'İlgili varlıklar' bağımsız değişkeni için ilişki düzeyi maksimum sayısı gereklidir", + "min-allowed-scheduled-update-interval": "'İlgili varlıklar' bağımsız değişkenleri için minimum izin verilen güncelleme aralığı (saniye)", + "min-allowed-scheduled-update-interval-range": "Minimum izin verilen güncelleme aralığı negatif olamaz", + "min-allowed-deduplication-interval": "Minimum izin verilen yinelenen ayıklama aralığı (saniye)", + "min-allowed-deduplication-interval-range": "Minimum izin verilen yinelenen ayıklama aralığı değeri negatif olamaz", + "min-allowed-deduplication-interval-required": "Minimum izin verilen yinelenen ayıklama aralığı gereklidir", + "intermediate-aggregation-interval": "Ara toplama aralığı (saniye)", + "intermediate-aggregation-interval-range": "Ara toplama aralığı değeri '1' den küçük olamaz", + "intermediate-aggregation-interval-required": "Ara toplama aralığı gereklidir", + "reevaluation-check-interval": "Yeniden değerlendirme kontrol aralığı (saniye)", + "reevaluation-check-interval-range": "Yeniden değerlendirme kontrol aralığı değeri '1' den küçük olamaz", + "reevaluation-check-interval-required": "Yeniden değerlendirme kontrol aralığı gereklidir", + "alarms-reevaluation-interval": "Alarm yeniden değerlendirme aralığı (saniye)", + "alarms-reevaluation-interval-range": "Alarm yeniden değerlendirme aralığı değeri '1' den küçük olamaz", + "alarms-reevaluation-interval-required": "Alarm yeniden değerlendirme aralığı gereklidir", + "min-allowed-aggregation-interval": "Minimum izin verilen toplama aralığı (saniye)", + "min-allowed-aggregation-interval-range": "Minimum izin verilen toplama aralığı değeri negatif olamaz", + "min-allowed-aggregation-interval-required": "Minimum izin verilen toplama aralığı gereklidir", + "min-allowed-scheduled-update-interval-required": "Minimum izin verilen güncelleme aralığı sayısı gereklidir", "max-state-size": "Durumun maksimum boyutu (KB)", "max-state-size-range": "Durumun maksimum boyutu (KB) negatif olamaz", "max-state-size-required": "Durumun maksimum boyutu (KB) gereklidir", @@ -5756,19 +6344,19 @@ "rule-engine-exceptions-ttl-days": "Kural Motoru istisnaları TTL süresi (gün)", "rule-engine-exceptions-ttl-days-required": "Kural Motoru istisnaları TTL süresi gereklidir", "rule-engine-exceptions-ttl-days-range": "Kural Motoru istisnaları TTL süresi negatif olamaz", - "max-rule-node-executions-per-message": "Mesaj başına Kural düğümü yürütme maksimum sayısı", - "max-rule-node-executions-per-message-required": "Mesaj başına Kural düğümü yürütme maksimum sayısı gereklidir.", - "max-rule-node-executions-per-message-range": "Mesaj başına Kural düğümü yürütme maksimum sayısı negatif olamaz", - "max-emails": "Gönderilen e-posta maksimum sayısı", - "max-emails-required": "Gönderilen e-posta maksimum sayısı gereklidir.", - "max-emails-range": "Gönderilen e-posta maksimum sayısı negatif olamaz", + "max-rule-node-executions-per-message": "Mesaj başına kural düğümü yürütme maksimum sayısı", + "max-rule-node-executions-per-message-required": "Mesaj başına kural düğümü yürütme maksimum sayısı zorunludur.", + "max-rule-node-executions-per-message-range": "Mesaj başına kural düğümü yürütme maksimum sayısı negatif olamaz", + "max-emails": "Gönderilen e-postaların maksimum sayısı", + "max-emails-required": "Gönderilen e-postaların maksimum sayısı zorunludur.", + "max-emails-range": "Gönderilen e-postaların maksimum sayısı negatif olamaz", "sms-enabled": "SMS etkin", - "max-sms": "Gönderilen SMS maksimum sayısı", - "max-sms-required": "Gönderilen SMS maksimum sayısı gereklidir.", - "max-sms-range": "Gönderilen SMS maksimum sayısı negatif olamaz", - "max-created-alarms": "Oluşturulan alarm maksimum sayısı", - "max-created-alarms-required": "Oluşturulan alarm maksimum sayısı gereklidir.", - "max-created-alarms-range": "Oluşturulan alarm maksimum sayısı negatif olamaz", + "max-sms": "Gönderilen SMS'lerin maksimum sayısı", + "max-sms-required": "Gönderilen SMS'lerin maksimum sayısı zorunludur.", + "max-sms-range": "Gönderilen SMS'lerin maksimum sayısı negatif olamaz", + "max-created-alarms": "Oluşturulan alarmların maksimum sayısı", + "max-created-alarms-required": "Oluşturulan alarmların maksimum sayısı zorunludur.", + "max-created-alarms-range": "Oluşturulan alarmların maksimum sayısı negatif olamaz", "no-queue": "Tanımlı Kuyruk yok", "add-queue": "Kuyruk Ekle", "queues-with-count": "Kuyruklar ({{count}})", @@ -5792,6 +6380,10 @@ "ws-limit-max-subscriptions-per-regular-user": "Normal kullanıcı başına abonelik maksimum sayısı", "ws-limit-max-subscriptions-per-public-user": "Genel kullanıcı başına abonelik maksimum sayısı", "ws-limit-updates-per-session": "Oturum başına WS güncellemeleri", + "relation-search-entity-limit": "İlişki arama varlık sınırı", + "relation-search-entity-limit-hint": "İlişki yolunun son seviyesinde çözümlenen varlık sayısını sınırlar. 'İlgili varlıklar' bağımsız değişkenlerine ve Yayılma alanlarına uygulanır.", + "relation-search-entity-limit-required": "İlişki arama varlık sınırı gereklidir", + "relation-search-entity-limit-range": "İlişki arama varlık sınırı '1' den küçük olamaz", "rate-limits": { "add-limit": "Sınır ekle", "and-also-less-than": "ve ayrıca daha az", @@ -5977,7 +6569,9 @@ "default-agg-interval": "Varsayılan gruplama aralığı", "edit-intervals-list-hint": "Kullanılabilir aralık seçeneklerinin listesi belirtilebilir.", "edit-grouping-intervals-list-hint": "Gruplama aralıkları listesi ve varsayılan gruplama aralığı yapılandırılabilir.", - "all": "Tümü" + "all": "Tümü", + "save-current-settings-as-default": "Geçerli ayarları varsayılan zaman penceresi olarak kaydet", + "hide-option-from-end-users": "Son kullanıcılardan seçeneği gizle" }, "tooltip": { "trigger": "Tetikleyici", @@ -5986,9 +6580,10 @@ "label": "Etiket", "value": "Değer", "date": "Tarih", - "show-date-time-interval": "Tarih ve saat aralığını göster", - "show-date-time-interval-hint": "Veri toplamaya göre tarih ve saat aralığını göster.", + "show-date-time-interval": "Tarih-saat aralığını göster", + "show-date-time-interval-hint": "Veri toplulaştırmasına göre tarih-saat aralığını göster.", "hide-zero-tooltip-values": "Sıfır değerleri gizle", + "show-stack-total": "Yığın modunda toplam değeri göster", "background-color": "Arka plan rengi", "background-blur": "Arka plan bulanıklığı" }, @@ -6630,7 +7225,8 @@ "export-relations": "İlişkileri dışa aktar", "export-attributes": "Öznitelikleri dışa aktar", "export-credentials": "Kimlik bilgilerini dışa aktar", - "export-calculated-fields": "Hesaplanmış alanları dışa aktar", + "export-calculated-fields": "Hesaplanmış alanları ve alarm kurallarını dışa aktar", + "export-alarm-rules": "Alarm kurallarını dışa aktar", "entity-versions": "Varlık sürümleri", "versions": "Sürümler", "created-time": "Oluşturulma zamanı", @@ -6648,6 +7244,7 @@ "load-attributes": "Öznitelikleri yükle", "load-credentials": "Kimlik bilgilerini yükle", "load-calculated-fields": "Hesaplanmış alanları yükle", + "load-alarm-rules": "Alarm kurallarını yükle", "compare-with-current": "Mevcut ile karşılaştır", "diff-entity-with-version": "'{{versionName}}' sürümü ile farkları karşılaştır", "previous-difference": "Önceki fark", @@ -6857,7 +7454,23 @@ "scan-qr-code": "QR Kodu tara", "make-phone-call": "Telefon araması yap", "get-location": "Telefon konumunu al", - "take-screenshot": "Ekran görüntüsü al" + "take-screenshot": "Ekran görüntüsü al", + "handle-provision-success-function": "Sağlama başarı fonksiyonunu işle", + "get-location-function": "Konum alma fonksiyonu", + "process-launch-result-function": "Başlatma sonucu fonksiyonunu işle", + "get-phone-number-function": "Telefon numarası alma fonksiyonu", + "process-image-function": "Resim işleme fonksiyonu", + "process-qr-code-function": "QR kodunu işleme fonksiyonu", + "process-location-function": "Konum işleme fonksiyonu", + "handle-empty-result-function": "Boş sonuç fonksiyonunu işle", + "handle-error-function": "Hata fonksiyonunu işle", + "handle-non-mobile-fallback-function": "Mobil olmayan geri dönüş fonksiyonunu işle", + "save-to-gallery": "Galeriye kaydet", + "provision-type": "Sağlama türü", + "auto": "Otomatik", + "wi-fi": "Wi-Fi", + "ble": "BLE", + "soft-ap": "Soft AP" }, "custom-action-function": "Özel eylem işlevi", "custom-pretty-function": "Özel eylem (HTML şablonlu) işlevi", @@ -6866,7 +7479,8 @@ "marker": "İşaretçi", "polygon": "Poligon", "rectangle": "Dikdörtgen", - "circle": "Daire" + "circle": "Daire", + "polyline": "Çokgen" }, "place-map-item": "Harita öğesi yerleştir", "map-item-tooltip": { @@ -6878,7 +7492,9 @@ "continue-draw-polygon": "Poligon çizimine devam et", "finish-draw-polygon": "Poligon çizimini bitir", "start-draw-circle": "Daire çizmeye başla", - "finish-draw-circle": "Daire çizimini bitir" + "finish-draw-circle": "Daire çizimini bitir", + "start-draw-polyline": "Çokgen çizmeye başla", + "finish-draw-polyline": "Çokgen çizmeyi bitir" } }, "widgets-bundle": { @@ -7444,9 +8060,17 @@ "update-animation-delay": "Güncelleme animasyon gecikmesi" }, "chart-axis": { + "limit": "Sınır", + "source": "Kaynak", + "key-value": "Anahtar / Değer", + "value-required": "Değer gereklidir.", + "entity-key-required": "Varlık anahtarı gereklidir.", + "key-required": "Anahtar gereklidir.", + "scale-limits": "Ölçek sınırları", + "scale-appearance": "Ölçek görünümü", "scale": "Ölçek", "scale-min": "min", - "scale-max": "maks", + "scale-max": "max", "scale-auto": "Otomatik" }, "bar": { @@ -7988,7 +8612,10 @@ "add-radio-option": "Radyo seçeneği ekle", "radio-label-position": "Etiket konumu", "radio-label-position-before": "Önce", - "radio-label-position-after": "Sonra" + "radio-label-position-after": "Sonra", + "save-image": "Resmi kaydet", + "save-to-gallery": "Yakalanan resimleri otomatik olarak Resim Galerisi'ne kaydet", + "public-image": "Resmi, yetkisiz kullanıcılar için erişilebilir hale getir" }, "invalid-qr-code-text": "QR kod için geçersiz giriş metni. Giriş metni dize türünde olmalıdır", "qr-code": { @@ -8283,7 +8910,8 @@ "trips": "Rotalar", "markers": "İşaretçiler", "polygons": "Poligonlar", - "circles": "Daireler" + "circles": "Daireler", + "polylines": "Çokgenler" }, "data-layer": { "source": "Kaynak", @@ -8480,11 +9108,30 @@ "finish-circle-hint-with-entity": "'{{entityName}}' için daire: tamamlamak ve kaydetmek için tıklayın", "finish-circle-hint": "Daire: çizimi tamamlamak için tıklayın" }, + "polyline": { + "polyline-key": "Çokgen anahtarı", + "polyline-key-required": "Çokgen anahtarı gereklidir", + "no-polylines": "Yapılandırılmış çokgen yok", + "add-polylines": "Çokgen ekle", + "polyline-configuration": "Çokgen yapılandırması", + "remove-polyline": "Çokgeni kaldır", + "edit": "Çokgeni düzenle", + "cut": "Çokgen alanını kes", + "rotate": "Çokgeni döndür", + "remove-polyline-for": "'{{entityName}}' için çokgeni kaldır", + "draw-polyline": "Çokgen çiz", + "polyline-place-first-point-hint-with-entity": "'{{entityName}}' için çokgen: İlk noktayı yerleştirmek için tıklayın", + "polyline-place-first-point-hint": "Çokgen: İlk noktayı yerleştirmek için tıklayın", + "finish-polyline-hint-with-entity": "'{{entityName}}' için çokgen: Çizmeyi bitirmek için tıklayın", + "finish-polyline-hint": "Çokgen: Çizmeyi bitirmek için tıklayın", + "polyline-place-first-point-cut-hint": "İlk noktayı yerleştirmek için tıklayın", + "finish-polyline-cut-hint": "İlk işarete tıklayarak bitir ve kaydet" + }, "select-entity": "Varlık seç", - "select-entity-hint": "İpucu: seçimden sonra haritaya tıklayarak konum belirleyin" + "select-entity-hint": "İpucu: Seçim yaptıktan sonra, konum belirlemek için haritaya tıklayın" }, "select-entity": "Varlık seç", - "select-entity-hint": "İpucu: seçimden sonra haritaya tıklayarak konum belirleyin", + "select-entity-hint": "İpucu: Seçim yaptıktan sonra, konum belirlemek için haritaya tıklayın", "tooltips": { "placeMarker": "'{{entityName}}' varlığını yerleştirmek için tıklayın", "firstVertex": "'{{entityName}}' için poligon: ilk noktayı yerleştirmek için tıklayın", @@ -8921,6 +9568,7 @@ "show-empty-space-hidden-action": "Gizli hücre buton eylemi yerine boş alan göster", "dont-reserve-space-hidden-action": "Gizli eylem düğmeleri için alan ayırma", "display-timestamp": "Zaman damgası", + "timestamp-column-name": "Zaman damgası", "display-pagination": "Sayfalama göster", "default-page-size": "Varsayılan sayfa boyutu", "page-step-settings": "Sayfa adımı ayarları", @@ -8982,7 +9630,9 @@ "alarm-column-error": "En az bir alarm sütunu belirtilmelidir", "table-tabs": "Tablo sekmeleri", "show-cell-actions-menu-mobile": "Mobil modda hücre eylem açılır menüsünü göster", - "disable-sorting": "Sıralamayı devre dışı bırak" + "disable-sorting": "Sıralamayı devre dışı bırak", + "sort-by": "Sekmeleri şuna göre sırala", + "sort-timestamp-option": "Oluşma zamanı" }, "latest-chart": { "total": "Toplam", @@ -9366,7 +10016,7 @@ }, "functions": { "title": "Fonksiyonlar", - "pe-feature-tooltip": "Yalnızca ThingsBoard\nProfesyonel Sürümde", + "pe-feature-tooltip": "Yalnızca ThingsBoard\nProfessional Edition", "switch-to-pe": "PE sürümüne geç", "alarms": "Alarmlar", "dashboards": "Panolar", @@ -9474,11 +10124,28 @@ "content": "

Son kullanıcı panoları oluşturarak, müşteri kullanıcısı yalnızca kendi cihazlarını görebilir ve diğer müşterilerin verileri gizli olur.

Nasıl yapılacağına dair dökümantasyona göz atın:

" } } + }, + "api-usage": { + "api-usage": "API kullanımı", + "label": "Etiket", + "state-name": "Durum adı", + "status": "Durum", + "status-required": "Durum gereklidir.", + "limit": "Maksimum sınır", + "limit-required": "Maksimum sınır gereklidir.", + "current-number": "Mevcut sayı", + "current-number-required": "Mevcut sayı gereklidir.", + "add-key": "Anahtar ekle", + "no-key": "Anahtar yok", + "delete-key": "Anahtarı sil", + "target-dashboard-state": "Hedef pano durumu", + "go-to-main-state": "Varsayılan görünüme git" } }, "icon": { "icon": "Simge", "icons": "Simgeler", + "custom": "Özel", "select-icon": "Simge seç", "material-icons": "Material simgeleri", "show-all": "Tüm simgeleri göster", @@ -9519,6 +10186,7 @@ "items-per-page-separator": "toplam" }, "language": { + "auto": "Auto", "language": "Dil" } -} +} \ No newline at end of file From 3966b3ef5a065e52072e3c58efe9f2d69b8808be Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Mon, 19 Jan 2026 17:33:18 +0200 Subject: [PATCH 205/579] UI: Fixed ja_JP plural locale maximum-datasources --- ui-ngx/src/assets/locale/locale.constant-ja_JP.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/assets/locale/locale.constant-ja_JP.json b/ui-ngx/src/assets/locale/locale.constant-ja_JP.json index 1a67637a44..d4726ac3e9 100644 --- a/ui-ngx/src/assets/locale/locale.constant-ja_JP.json +++ b/ui-ngx/src/assets/locale/locale.constant-ja_JP.json @@ -7580,7 +7580,7 @@ "display-legend": "凡例を表示", "datasources": "データソース", "datasource": "データソース", - "maximum-datasources": "最大{ count, plural, =1 {1つのデータソースのみ許可されています。} other {#件のデータソースが許可されています。}}", + "maximum-datasources": "最大{ count, plural, =1 {1つのデータソースのみ許可されています。} other {#件のデータソースが許可されています。} }", "timeseries-key-error": "少なくとも1つの時系列データキーを指定する必要があります", "datasource-type": "タイプ", "datasource-parameters": "パラメータ", From 41cb827c625c3458350fde3e29042fc992125521 Mon Sep 17 00:00:00 2001 From: dshvaika Date: Wed, 21 Jan 2026 14:46:34 +0200 Subject: [PATCH 206/579] Added missing logic to handle propagation path updates --- .../server/service/cf/ctx/state/CalculatedFieldCtx.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java index ab38287b89..7485171514 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java @@ -726,6 +726,9 @@ public class CalculatedFieldCtx implements Closeable { return true; } } + if (cfType == CalculatedFieldType.PROPAGATION && !propagationArgument.equals(other.propagationArgument)) { + return true; + } if (hasGeofencingZoneGroupConfigurationChanges(other)) { return true; } From 924c9cf5d038084fda404185c8e7a60b3cd508f6 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Wed, 21 Jan 2026 09:19:47 +0100 Subject: [PATCH 207/579] hotfix count query by tenant on cf_manager init --- .../device/DefaultNativeAssetRepository.java | 25 ++++++++++--------- .../device/DefaultNativeDeviceRepository.java | 24 +++++++++--------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeAssetRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeAssetRepository.java index 3a11f70a94..e7ba0c206c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeAssetRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeAssetRepository.java @@ -26,6 +26,7 @@ import org.thingsboard.server.common.data.id.AssetProfileId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; +import java.util.Map; import java.util.UUID; @Repository @@ -41,22 +42,22 @@ public class DefaultNativeAssetRepository extends AbstractNativeRepository imple @Override public PageData findProfileEntityIdInfos(Pageable pageable) { String PROFILE_ASSET_ID_INFO_QUERY = "SELECT tenant_id as tenantId, asset_profile_id as profileId, id as id FROM asset ORDER BY created_time ASC LIMIT %s OFFSET %s"; - return find(COUNT_QUERY, PROFILE_ASSET_ID_INFO_QUERY, pageable, row -> { - AssetId id = new AssetId((UUID) row.get("id")); - AssetProfileId profileId = new AssetProfileId((UUID) row.get("profileId")); - var tenantIdObj = row.get("tenantId"); - return ProfileEntityIdInfo.create(tenantIdObj != null ? (UUID) tenantIdObj : TenantId.SYS_TENANT_ID.getId(), profileId, id); - }); + return find(COUNT_QUERY, PROFILE_ASSET_ID_INFO_QUERY, pageable, DefaultNativeAssetRepository::toInfo); } @Override public PageData findProfileEntityIdInfosByTenantId(UUID tenantId, Pageable pageable) { String PROFILE_ASSET_ID_INFO_QUERY = String.format("SELECT tenant_id as tenantId, asset_profile_id as profileId, id as id FROM asset WHERE tenant_id = '%s' ORDER BY created_time ASC LIMIT %%s OFFSET %%s", tenantId); - return find(COUNT_QUERY, PROFILE_ASSET_ID_INFO_QUERY, pageable, row -> { - AssetId id = new AssetId((UUID) row.get("id")); - AssetProfileId profileId = new AssetProfileId((UUID) row.get("profileId")); - var tenantIdObj = row.get("tenantId"); - return ProfileEntityIdInfo.create(tenantIdObj != null ? (UUID) tenantIdObj : TenantId.SYS_TENANT_ID.getId(), profileId, id); - }); + String COUNT_QUERY_BY_TENANT = String.format("SELECT count(id) FROM asset WHERE tenant_id = '%s';", tenantId); + return find(COUNT_QUERY_BY_TENANT, PROFILE_ASSET_ID_INFO_QUERY, pageable, DefaultNativeAssetRepository::toInfo); } + + private static ProfileEntityIdInfo toInfo(Map row) { + var tenantIdObj = row.get("tenantId"); + UUID tenantId = tenantIdObj != null ? (UUID) tenantIdObj : TenantId.SYS_TENANT_ID.getId(); + AssetId id = new AssetId((UUID) row.get("id")); + AssetProfileId profileId = new AssetProfileId((UUID) row.get("profileId")); + return ProfileEntityIdInfo.create(tenantId, profileId, id); + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeDeviceRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeDeviceRepository.java index b039f30d32..c4ba36ce2e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeDeviceRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeDeviceRepository.java @@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; +import java.util.Map; import java.util.UUID; @Repository @@ -53,23 +54,22 @@ public class DefaultNativeDeviceRepository extends AbstractNativeRepository impl @Override public PageData findProfileEntityIdInfos(Pageable pageable) { String PROFILE_DEVICE_ID_INFO_QUERY = "SELECT tenant_id as tenantId, device_profile_id as profileId, id as id FROM device ORDER BY created_time ASC LIMIT %s OFFSET %s"; - return find(COUNT_QUERY, PROFILE_DEVICE_ID_INFO_QUERY, pageable, row -> { - DeviceId id = new DeviceId((UUID) row.get("id")); - DeviceProfileId profileId = new DeviceProfileId((UUID) row.get("profileId")); - var tenantIdObj = row.get("tenantId"); - return ProfileEntityIdInfo.create(tenantIdObj != null ? (UUID) tenantIdObj : TenantId.SYS_TENANT_ID.getId(), profileId, id); - }); + return find(COUNT_QUERY, PROFILE_DEVICE_ID_INFO_QUERY, pageable, DefaultNativeDeviceRepository::toInfo); } @Override public PageData findProfileEntityIdInfosByTenantId(UUID tenantId, Pageable pageable) { String PROFILE_DEVICE_ID_INFO_QUERY = String.format("SELECT tenant_id as tenantId, device_profile_id as profileId, id as id FROM device WHERE tenant_id = '%s' ORDER BY created_time ASC LIMIT %%s OFFSET %%s", tenantId); - return find(COUNT_QUERY, PROFILE_DEVICE_ID_INFO_QUERY, pageable, row -> { - DeviceId id = new DeviceId((UUID) row.get("id")); - DeviceProfileId profileId = new DeviceProfileId((UUID) row.get("profileId")); - var tenantIdObj = row.get("tenantId"); - return ProfileEntityIdInfo.create(tenantIdObj != null ? (UUID) tenantIdObj : TenantId.SYS_TENANT_ID.getId(), profileId, id); - }); + String COUNT_QUERY_BY_TENANT = String.format("SELECT count(id) FROM device WHERE tenant_id = '%s';", tenantId); + return find(COUNT_QUERY_BY_TENANT, PROFILE_DEVICE_ID_INFO_QUERY, pageable, DefaultNativeDeviceRepository::toInfo); + } + + private static ProfileEntityIdInfo toInfo(Map row) { + var tenantIdObj = row.get("tenantId"); + UUID tenantId = tenantIdObj != null ? (UUID) tenantIdObj : TenantId.SYS_TENANT_ID.getId(); + DeviceId id = new DeviceId((UUID) row.get("id")); + DeviceProfileId profileId = new DeviceProfileId((UUID) row.get("profileId")); + return ProfileEntityIdInfo.create(tenantId, profileId, id); } } From 73fa6734c4925708d4632f7bcf4f7d9145bf15fa Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Thu, 22 Jan 2026 09:54:11 +0200 Subject: [PATCH 208/579] updated error message on cf init --- .../CalculatedFieldManagerMessageProcessor.java | 6 +++--- .../server/service/cf/ctx/state/CalculatedFieldCtx.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldManagerMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldManagerMessageProcessor.java index fed1cc3ada..65ec0b332b 100644 --- a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldManagerMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldManagerMessageProcessor.java @@ -262,7 +262,7 @@ public class CalculatedFieldManagerMessageProcessor extends AbstractContextAware try { cfCtx.init(); } catch (Exception e) { - throw CalculatedFieldException.builder().ctx(cfCtx).eventEntity(cf.getEntityId()).cause(e).errorMessage("Failed to initialize CF context").build(); + throw CalculatedFieldException.builder().ctx(cfCtx).eventEntity(cf.getEntityId()).cause(e).errorMessage(e.getMessage()).build(); } calculatedFields.put(cf.getId(), cfCtx); // We use copy on write lists to safely pass the reference to another actor for the iteration. @@ -289,7 +289,7 @@ public class CalculatedFieldManagerMessageProcessor extends AbstractContextAware try { newCfCtx.init(); } catch (Exception e) { - throw CalculatedFieldException.builder().ctx(newCfCtx).eventEntity(newCfCtx.getEntityId()).cause(e).errorMessage("Failed to initialize CF context").build(); + throw CalculatedFieldException.builder().ctx(newCfCtx).eventEntity(newCfCtx.getEntityId()).cause(e).errorMessage(e.getMessage()).build(); } finally { calculatedFields.put(newCf.getId(), newCfCtx); List oldCfList = entityIdCalculatedFields.get(newCf.getEntityId()); @@ -552,7 +552,7 @@ public class CalculatedFieldManagerMessageProcessor extends AbstractContextAware try { cfCtx.init(); } catch (Exception e) { - throw CalculatedFieldException.builder().ctx(cfCtx).eventEntity(cf.getEntityId()).cause(e).errorMessage("Failed to initialize CF context").build(); + throw CalculatedFieldException.builder().ctx(cfCtx).eventEntity(cf.getEntityId()).cause(e).errorMessage(e.getMessage()).build(); } finally { calculatedFields.put(cf.getId(), cfCtx); // We use copy on write lists to safely pass the reference to another actor for the iteration. diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java index 3438760778..5d0ff5c2ff 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java @@ -114,7 +114,7 @@ public class CalculatedFieldCtx { initialized = true; } catch (Exception e) { initialized = false; - throw new RuntimeException("Failed to init calculated field ctx. Invalid expression syntax.", e); + throw new RuntimeException("Failed to initialize CF context. The script expression is invalid. Please check for syntax errors or unsupported functions.", e); } } else { if (isValidExpression(expression)) { @@ -128,7 +128,7 @@ public class CalculatedFieldCtx { initialized = true; } else { initialized = false; - throw new RuntimeException("Failed to init calculated field ctx. Invalid expression syntax."); + throw new RuntimeException("Failed to initialize CF context. The expression has invalid syntax or unknown variables. Ensure all mathematical operators are correct."); } } } From a2da95760c91fff67ff2cf55214cb79fd2a719cb Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Thu, 22 Jan 2026 11:18:42 +0200 Subject: [PATCH 209/579] Fix API key controller, when user update description or activity --- .../server/controller/ApiKeyController.java | 10 +++++++--- .../server/controller/ApiKeyControllerTest.java | 9 ++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java b/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java index 2c6ae69ca5..09972bd6c2 100644 --- a/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java +++ b/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java @@ -77,7 +77,11 @@ public class ApiKeyController extends BaseController { User user = checkUserId(apiKeyInfo.getUserId(), Operation.WRITE); apiKeyInfo.setTenantId(user.getTenantId()); checkEntity(apiKeyInfo.getId(), apiKeyInfo, Resource.API_KEY); - return checkNotNull(apiKeyService.saveApiKey(apiKeyInfo.getTenantId(), apiKeyInfo)); + ApiKey savedApiKey = checkNotNull(apiKeyService.saveApiKey(apiKeyInfo.getTenantId(), apiKeyInfo)); + if (apiKeyInfo.getId() != null) { + savedApiKey.setValue(null); + } + return savedApiKey; } @ApiOperation(value = "Get User Api Keys (getUserApiKeys)", @@ -121,7 +125,7 @@ public class ApiKeyController extends BaseController { ApiKey apiKey = checkApiKeyId(apiKeyId, Operation.WRITE); checkUserId(apiKey.getUserId(), Operation.WRITE); apiKey.setDescription(description.orElse(null)); - return apiKeyService.saveApiKey(apiKey.getTenantId(), apiKey); + return new ApiKeyInfo(apiKeyService.saveApiKey(apiKey.getTenantId(), apiKey)); } @ApiOperation(value = "Enable or disable API key (enableApiKey)", @@ -137,7 +141,7 @@ public class ApiKeyController extends BaseController { ApiKey apiKey = checkApiKeyId(apiKeyId, Operation.WRITE); checkUserId(apiKey.getUserId(), Operation.WRITE); apiKey.setEnabled(enabledValue); - return apiKeyService.saveApiKey(apiKey.getTenantId(), apiKey); + return new ApiKeyInfo(apiKeyService.saveApiKey(apiKey.getTenantId(), apiKey)); } @ApiOperation(value = "Delete API key by ID (deleteApiKey)", diff --git a/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java index 9c7f7a898d..836d1cbfad 100644 --- a/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java @@ -53,7 +53,14 @@ public class ApiKeyControllerTest extends AbstractControllerTest { Assert.assertEquals(tenantId, savedApiKey.getTenantId()); Assert.assertEquals(tenantAdminUser.getId(), savedApiKey.getUserId()); - doDelete("/api/apiKey/" + savedApiKey.getId()).andExpect(status().isOk()); + String newDescription = "Updated API Key Description"; + savedApiKey.setDescription(newDescription); + ApiKey updatedApiKey = doPost("/api/apiKey", savedApiKey, ApiKey.class); + Assert.assertNotNull(updatedApiKey); + Assert.assertEquals(newDescription, updatedApiKey.getDescription()); + Assert.assertNull("Verify we do not expose API key value on update", updatedApiKey.getValue()); + + doDelete("/api/apiKey/" + updatedApiKey.getId()).andExpect(status().isOk()); } @Test From 19d50f14846cf37555ec86ddb2e57743bf19bf60 Mon Sep 17 00:00:00 2001 From: Maksym Tsymbarov Date: Thu, 22 Jan 2026 16:24:48 +0200 Subject: [PATCH 210/579] Fixed send rpc and segmented button widgets --- ...gmented-button-basic-config.component.html | 2 - ...segmented-button-basic-config.component.ts | 48 ++++++++++++++++++ ...nted-button-widget-settings.component.html | 2 - ...mented-button-widget-settings.component.ts | 49 +++++++++++++++++++ .../send-rpc-widget-settings.component.html | 13 ++--- .../send-rpc-widget-settings.component.ts | 4 +- 6 files changed, 102 insertions(+), 16 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/segmented-button-basic-config.component.html b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/segmented-button-basic-config.component.html index b677374c19..f748c13f81 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/segmented-button-basic-config.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/segmented-button-basic-config.component.html @@ -126,7 +126,6 @@ subscriptSizing="dynamic" [predefinedValuesButton]="true" [predefinedValues]="predefinedValues" - [disabled]="!segmentedButtonWidgetConfigForm.get('leftAppearance').get('showLabel').value" placeholderText="{{ 'widget-config.set' | translate }}" formControlName="label" > @@ -164,7 +163,6 @@ subscriptSizing="dynamic" [predefinedValuesButton]="true" [predefinedValues]="predefinedValues" - [disabled]="!segmentedButtonWidgetConfigForm.get('rightAppearance').get('showLabel').value" placeholderText="{{ 'widget-config.set' | translate }}" formControlName="label" > diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/segmented-button-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/segmented-button-basic-config.component.ts index d2d6968831..895848a933 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/segmented-button-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/segmented-button-basic-config.component.ts @@ -142,4 +142,52 @@ export class SegmentedButtonBasicConfigComponent extends BasicWidgetConfigCompon return this.widgetConfig; } + + protected validatorTriggers(): string[] { + return ['appearance.leftAppearance.showLabel', 'appearance.leftAppearance.showIcon', 'appearance.rightAppearance.showLabel', 'appearance.rightAppearance.showIcon',]; + } + + protected updateValidators(emitEvent: boolean) { + const showLeftLabel: boolean = this.segmentedButtonWidgetConfigForm.get('appearance.leftAppearance.showLabel').value; + const showRightLabel: boolean = this.segmentedButtonWidgetConfigForm.get('appearance.rightAppearance.showLabel').value; + + const showLeftIcon: boolean = this.segmentedButtonWidgetConfigForm.get('appearance.leftAppearance.showIcon').value; + const showRightIcon: boolean = this.segmentedButtonWidgetConfigForm.get('appearance.rightAppearance.showIcon').value; + + if (showLeftLabel) { + this.segmentedButtonWidgetConfigForm.get('appearance.leftAppearance.label').enable({emitEvent}); + this.segmentedButtonWidgetConfigForm.get('appearance.leftAppearance.labelFont').enable({emitEvent}); + } else { + this.segmentedButtonWidgetConfigForm.get('appearance.leftAppearance.label').disable({emitEvent}); + this.segmentedButtonWidgetConfigForm.get('appearance.leftAppearance.labelFont').disable({emitEvent}); + } + + if (showRightLabel) { + this.segmentedButtonWidgetConfigForm.get('appearance.rightAppearance.label').enable({emitEvent}); + this.segmentedButtonWidgetConfigForm.get('appearance.rightAppearance.labelFont').enable({emitEvent}); + } else { + this.segmentedButtonWidgetConfigForm.get('appearance.rightAppearance.label').disable({emitEvent}); + this.segmentedButtonWidgetConfigForm.get('appearance.rightAppearance.labelFont').disable({emitEvent}); + } + + if (showLeftIcon) { + this.segmentedButtonWidgetConfigForm.get('appearance.leftAppearance.icon').enable({emitEvent}); + this.segmentedButtonWidgetConfigForm.get('appearance.leftAppearance.iconSize').enable({emitEvent}); + this.segmentedButtonWidgetConfigForm.get('appearance.leftAppearance.iconSizeUnit').enable({emitEvent}); + } else { + this.segmentedButtonWidgetConfigForm.get('appearance.leftAppearance.icon').disable({emitEvent}); + this.segmentedButtonWidgetConfigForm.get('appearance.leftAppearance.iconSize').disable({emitEvent}); + this.segmentedButtonWidgetConfigForm.get('appearance.leftAppearance.iconSizeUnit').disable({emitEvent}); + } + + if (showRightIcon) { + this.segmentedButtonWidgetConfigForm.get('appearance.rightAppearance.icon').enable({emitEvent}); + this.segmentedButtonWidgetConfigForm.get('appearance.rightAppearance.iconSize').enable({emitEvent}); + this.segmentedButtonWidgetConfigForm.get('appearance.rightAppearance.iconSizeUnit').enable({emitEvent}); + } else { + this.segmentedButtonWidgetConfigForm.get('appearance.rightAppearance.icon').disable({emitEvent}); + this.segmentedButtonWidgetConfigForm.get('appearance.rightAppearance.iconSize').disable({emitEvent}); + this.segmentedButtonWidgetConfigForm.get('appearance.rightAppearance.iconSizeUnit').disable({emitEvent}); + } + } } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/segmented-button-widget-settings.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/segmented-button-widget-settings.component.html index 67579541c9..fc27e782e2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/segmented-button-widget-settings.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/segmented-button-widget-settings.component.html @@ -117,7 +117,6 @@ brackets="curly" subscriptSizing="dynamic" predefinedValuesButton="true" - [disabled]="!segmentedButtonWidgetSettingsForm.get('leftAppearance').get('showLabel').value" [predefinedValues]="predefinedValues" placeholderText="{{ 'widget-config.set' | translate }}" formControlName="label" @@ -155,7 +154,6 @@ brackets="curly" subscriptSizing="dynamic" predefinedValuesButton="true" - [disabled]="!segmentedButtonWidgetSettingsForm.get('rightAppearance').get('showLabel').value" [predefinedValues]="predefinedValues" placeholderText="{{ 'widget-config.set' | translate }}" formControlName="label" diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/segmented-button-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/segmented-button-widget-settings.component.ts index b0eaf5c464..540688c18e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/segmented-button-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/segmented-button-widget-settings.component.ts @@ -38,6 +38,7 @@ import { WidgetButtonToggleState, widgetButtonToggleStatesTranslations } from '@home/components/widget/lib/button/segmented-button-widget.models'; +import { ValueCardLayout } from '@home/components/widget/lib/cards/value-card-widget.models'; @Component({ selector: 'tb-segmented-button-widget-settings', @@ -139,4 +140,52 @@ export class SegmentedButtonWidgetSettingsComponent extends WidgetSettingsCompon }) }); } + + protected validatorTriggers(): string[] { + return ['appearance.leftAppearance.showLabel', 'appearance.leftAppearance.showIcon', 'appearance.rightAppearance.showLabel', 'appearance.rightAppearance.showIcon',]; + } + + protected updateValidators(emitEvent: boolean) { + const showLeftLabel: boolean = this.segmentedButtonWidgetSettingsForm.get('appearance.leftAppearance.showLabel').value; + const showRightLabel: boolean = this.segmentedButtonWidgetSettingsForm.get('appearance.rightAppearance.showLabel').value; + + const showLeftIcon: boolean = this.segmentedButtonWidgetSettingsForm.get('appearance.leftAppearance.showIcon').value; + const showRightIcon: boolean = this.segmentedButtonWidgetSettingsForm.get('appearance.rightAppearance.showIcon').value; + + if (showLeftLabel) { + this.segmentedButtonWidgetSettingsForm.get('appearance.leftAppearance.label').enable({emitEvent}); + this.segmentedButtonWidgetSettingsForm.get('appearance.leftAppearance.labelFont').enable({emitEvent}); + } else { + this.segmentedButtonWidgetSettingsForm.get('appearance.leftAppearance.label').disable({emitEvent}); + this.segmentedButtonWidgetSettingsForm.get('appearance.leftAppearance.labelFont').disable({emitEvent}); + } + + if (showRightLabel) { + this.segmentedButtonWidgetSettingsForm.get('appearance.rightAppearance.label').enable({emitEvent}); + this.segmentedButtonWidgetSettingsForm.get('appearance.rightAppearance.labelFont').enable({emitEvent}); + } else { + this.segmentedButtonWidgetSettingsForm.get('appearance.rightAppearance.label').disable({emitEvent}); + this.segmentedButtonWidgetSettingsForm.get('appearance.rightAppearance.labelFont').disable({emitEvent}); + } + + if (showLeftIcon) { + this.segmentedButtonWidgetSettingsForm.get('appearance.leftAppearance.icon').enable({emitEvent}); + this.segmentedButtonWidgetSettingsForm.get('appearance.leftAppearance.iconSize').enable({emitEvent}); + this.segmentedButtonWidgetSettingsForm.get('appearance.leftAppearance.iconSizeUnit').enable({emitEvent}); + } else { + this.segmentedButtonWidgetSettingsForm.get('appearance.leftAppearance.icon').disable({emitEvent}); + this.segmentedButtonWidgetSettingsForm.get('appearance.leftAppearance.iconSize').disable({emitEvent}); + this.segmentedButtonWidgetSettingsForm.get('appearance.leftAppearance.iconSizeUnit').disable({emitEvent}); + } + + if (showRightIcon) { + this.segmentedButtonWidgetSettingsForm.get('appearance.rightAppearance.icon').enable({emitEvent}); + this.segmentedButtonWidgetSettingsForm.get('appearance.rightAppearance.iconSize').enable({emitEvent}); + this.segmentedButtonWidgetSettingsForm.get('appearance.rightAppearance.iconSizeUnit').enable({emitEvent}); + } else { + this.segmentedButtonWidgetSettingsForm.get('appearance.rightAppearance.icon').disable({emitEvent}); + this.segmentedButtonWidgetSettingsForm.get('appearance.rightAppearance.iconSize').disable({emitEvent}); + this.segmentedButtonWidgetSettingsForm.get('appearance.rightAppearance.iconSizeUnit').disable({emitEvent}); + } + } } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/send-rpc-widget-settings.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/send-rpc-widget-settings.component.html index ea21202511..72bc8d8219 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/send-rpc-widget-settings.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/send-rpc-widget-settings.component.html @@ -18,15 +18,10 @@
widgets.rpc.common-settings - + + widgets.rpc.widget-title + + widgets.rpc.button-label diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/send-rpc-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/send-rpc-widget-settings.component.ts index 91dbf23e85..b8af3eaf0d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/send-rpc-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/send-rpc-widget-settings.component.ts @@ -15,7 +15,7 @@ /// import { Component } from '@angular/core'; -import { WidgetSettings, WidgetSettingsComponent, widgetTitleAutocompleteValues } from '@shared/models/widget.models'; +import { WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @@ -32,8 +32,6 @@ export class SendRpcWidgetSettingsComponent extends WidgetSettingsComponent { contentTypes = ContentType; - predefinedValues = widgetTitleAutocompleteValues; - constructor(protected store: Store, private fb: UntypedFormBuilder) { super(store); From a2116dc2f6b19554dec1692977a03047b6e4b37e Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Thu, 22 Jan 2026 16:26:01 +0200 Subject: [PATCH 211/579] UI: Fixed CVE-2026-22610 --- ui-ngx/patches/@angular+compiler+18.2.13.patch | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ui-ngx/patches/@angular+compiler+18.2.13.patch b/ui-ngx/patches/@angular+compiler+18.2.13.patch index a4245cb0e9..af8e6995cd 100644 --- a/ui-ngx/patches/@angular+compiler+18.2.13.patch +++ b/ui-ngx/patches/@angular+compiler+18.2.13.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/@angular/compiler/fesm2022/compiler.mjs b/node_modules/@angular/compiler/fesm2022/compiler.mjs -index a00b189..260e7be 100755 +index a00b189..58896de 100755 --- a/node_modules/@angular/compiler/fesm2022/compiler.mjs +++ b/node_modules/@angular/compiler/fesm2022/compiler.mjs @@ -18631,6 +18631,7 @@ function SECURITY_SCHEMA() { @@ -86,3 +86,12 @@ index a00b189..260e7be 100755 ]); registerContext(SecurityContext.RESOURCE_URL, [ 'applet|code', +@@ -18659,6 +18729,8 @@ function SECURITY_SCHEMA() { + 'object|codebase', + 'object|data', + 'script|src', ++ 'script|href', ++ 'script|xlink:href', + ]); + } + return _SECURITY_SCHEMA; From a7fa6e6d31b33fd72b8f3859405100f60a76c888 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Thu, 22 Jan 2026 15:13:08 +0200 Subject: [PATCH 212/579] UI: Fixed help link for API key --- ui-ngx/src/app/shared/models/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/shared/models/constants.ts b/ui-ngx/src/app/shared/models/constants.ts index 036223eec1..2890b4827c 100644 --- a/ui-ngx/src/app/shared/models/constants.ts +++ b/ui-ngx/src/app/shared/models/constants.ts @@ -217,7 +217,7 @@ export const HelpLinks = { mobileQrCode: `${helpBaseUrl}/docs${docPlatformPrefix}/user-guide/ui/mobile-qr-code/`, calculatedField: `${helpBaseUrl}/docs${docPlatformPrefix}/user-guide/calculated-fields/`, aiModels: `${helpBaseUrl}/docs${docPlatformPrefix}/samples/analytics/ai-models/`, - apiKeys: `${helpBaseUrl}/docs${docPlatformPrefix}/user-guide/ui/api-keys`, + apiKeys: `${helpBaseUrl}/docs${docPlatformPrefix}/user-guide/security/api-keys/`, timewindowSettings: `${helpBaseUrl}/docs${docPlatformPrefix}/user-guide/dashboards/#time-window`, trendzSettings: `${helpBaseUrl}/docs/trendz/`, alarmRules: `${helpBaseUrl}/docs${docPlatformPrefix}/user-guide/alarm-rules/`, From 1b190b84e5ce9a62ad64700269377042d455b366 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Tue, 20 Jan 2026 12:52:33 +0100 Subject: [PATCH 213/579] RocksDB log ingested init path on debug level --- .../main/java/org/thingsboard/server/edqs/util/TbRocksDb.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/edqs/src/main/java/org/thingsboard/server/edqs/util/TbRocksDb.java b/common/edqs/src/main/java/org/thingsboard/server/edqs/util/TbRocksDb.java index 9141321dcb..c731cf4548 100644 --- a/common/edqs/src/main/java/org/thingsboard/server/edqs/util/TbRocksDb.java +++ b/common/edqs/src/main/java/org/thingsboard/server/edqs/util/TbRocksDb.java @@ -16,6 +16,7 @@ package org.thingsboard.server.edqs.util; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.rocksdb.Options; import org.rocksdb.RocksDB; import org.rocksdb.RocksIterator; @@ -26,6 +27,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.function.BiConsumer; +@Slf4j public class TbRocksDb { protected final String path; @@ -45,6 +47,7 @@ public class TbRocksDb { @SneakyThrows public void init() { + log.debug("RocksDB init in {}", path); Files.createDirectories(Path.of(path).getParent()); db = RocksDB.open(dbOptions, path); } From f4e2ebde5463a5a1a420bc96069256fe3270b70e Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Tue, 20 Jan 2026 12:58:35 +0100 Subject: [PATCH 214/579] Tests Edge - replaced port 7070 with dynamic port to allow parallel tests in surefire forks --- .../server/controller/EdgeControllerTest.java | 10 +++++++++- .../thingsboard/server/edge/AbstractEdgeTest.java | 14 +++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java index 8c12f8713d..0d0de0a66c 100644 --- a/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java @@ -36,7 +36,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; +import org.springframework.test.util.TestSocketUtils; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.ThingsBoardExecutors; import org.thingsboard.server.common.data.AdminSettings; @@ -121,7 +124,12 @@ import static org.thingsboard.server.edge.AbstractEdgeTest.CONNECT_MESSAGE_COUNT public class EdgeControllerTest extends AbstractControllerTest { public static final String EDGE_HOST = "localhost"; - public static final int EDGE_PORT = 7070; + public static final int EDGE_PORT = TestSocketUtils.findAvailableTcpPort(); + @DynamicPropertySource + static void props(DynamicPropertyRegistry registry) { + log.debug("edges.rpc.port = {}", EDGE_PORT); + registry.add("edges.rpc.port", () -> EDGE_PORT); + } private IdComparator idComparator = new IdComparator<>(); diff --git a/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java index cf2f1d1161..b46811daf5 100644 --- a/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java @@ -26,7 +26,10 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; +import org.springframework.test.util.TestSocketUtils; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.Customer; @@ -116,6 +119,15 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. }) @Slf4j abstract public class AbstractEdgeTest extends AbstractControllerTest { + + public static final String EDGE_HOST = "localhost"; + public static final int EDGE_PORT = TestSocketUtils.findAvailableTcpPort(); + @DynamicPropertySource + static void props(DynamicPropertyRegistry registry) { + log.debug("edges.rpc.port = {}", EDGE_PORT); + registry.add("edges.rpc.port", () -> EDGE_PORT); + } + public static final Integer CONNECT_MESSAGE_COUNT = 17; public static final Integer INSTALLATION_MESSAGE_COUNT = 8; public static final Integer SYNC_MESSAGE_COUNT = CONNECT_MESSAGE_COUNT + INSTALLATION_MESSAGE_COUNT; @@ -142,7 +154,7 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest { //8 installation messages installation(); - edgeImitator = new EdgeImitator("localhost", 7070, edge.getRoutingKey(), edge.getSecret()); + edgeImitator = new EdgeImitator(EDGE_HOST, EDGE_PORT, edge.getRoutingKey(), edge.getSecret()); // 17 connect messages + 8 installation messages edgeImitator.expectMessageAmount(SYNC_MESSAGE_COUNT); edgeImitator.ignoreType(OAuth2ClientUpdateMsg.class); From 8599020aed9243afab004275b20307131fae298b Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Tue, 20 Jan 2026 13:10:24 +0100 Subject: [PATCH 215/579] Tests: Rock DB location moved to the target for safe surefire parallel fork run and easy clean by maven --- pom.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ccc305b6b3..bfb4bbf1ae 100755 --- a/pom.xml +++ b/pom.xml @@ -662,8 +662,10 @@ ${surefire.version} - -XX:+UseStringDeduplication -XX:MaxGCPauseMillis=20 - --add-opens java.base/java.lang.reflect=ALL-UNNAMED + -XX:+UseStringDeduplication -XX:MaxGCPauseMillis=200 + --add-opens=java.base/java.lang.reflect=ALL-UNNAMED + -Dqueue.edqs.local.rocksdb_path="target/rocks/fork_${surefire.forkNumber}/edqs" + -Dqueue.calculated_fields.rocks_db_path="target/rocks/fork_${surefire.forkNumber}/cf" From 2c533c0f86dc3854e5a818d487cbd614d4bf7e37 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Tue, 20 Jan 2026 13:27:09 +0100 Subject: [PATCH 216/579] tests: reducing logging noise --- .../org/thingsboard/server/controller/AbstractWebTest.java | 2 +- application/src/test/resources/logback-test.xml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java index d540fcf49e..599dcf3138 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java @@ -404,7 +404,7 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest { jdbcTemplate.execute("TRUNCATE TABLE notification"); - log.info("Executed web test teardown"); + log.debug("Executed web test teardown"); } private void verifyNoTenantsLeft() throws Exception { diff --git a/application/src/test/resources/logback-test.xml b/application/src/test/resources/logback-test.xml index 13c93da411..eafb4e1fba 100644 --- a/application/src/test/resources/logback-test.xml +++ b/application/src/test/resources/logback-test.xml @@ -42,6 +42,9 @@ + + + From 9a2489f5b69f3a449e977785af435c402f2e78f2 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Wed, 21 Jan 2026 22:23:07 +0100 Subject: [PATCH 217/579] tests: DefaultTbResourceDataCache destroy cache on bean destroy that fixes flaky test --- .../server/dao/resource/DefaultTbResourceDataCache.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dao/src/main/java/org/thingsboard/server/dao/resource/DefaultTbResourceDataCache.java b/dao/src/main/java/org/thingsboard/server/dao/resource/DefaultTbResourceDataCache.java index 343c37299e..925b8c2912 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/resource/DefaultTbResourceDataCache.java +++ b/dao/src/main/java/org/thingsboard/server/dao/resource/DefaultTbResourceDataCache.java @@ -19,6 +19,7 @@ import com.github.benmanes.caffeine.cache.AsyncLoadingCache; import com.github.benmanes.caffeine.cache.Caffeine; import com.google.common.util.concurrent.FluentFuture; import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -55,6 +56,12 @@ public class DefaultTbResourceDataCache implements TbResourceDataCache { .buildAsync((key, executor) -> CompletableFuture.supplyAsync(() -> resourceService.getResourceDataInfo(key.tenantId(), key.resourceId()), executor)); } + @PreDestroy + private void destroy() { + cache.synchronous().invalidateAll(); + cache = null; + } + @Override public FluentFuture getResourceDataInfoAsync(TenantId tenantId, TbResourceId resourceId) { log.trace("Retrieving resource data info by id [{}], tenant id [{}] from cache", resourceId, tenantId); From 7b9c53d348c66f4d398d4e71893d3ab6272574ef Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Wed, 21 Jan 2026 22:29:01 +0100 Subject: [PATCH 218/579] tests: EdgeImitator - fix for ConcurrentModification at AbstractEdgeTest.validateMsgsCnt:387 --- .../server/edge/imitator/EdgeImitator.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java b/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java index 36579e8e22..d1596b1c59 100644 --- a/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java +++ b/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java @@ -72,6 +72,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; @@ -102,8 +103,13 @@ public class EdgeImitator { @Getter private EdgeConfiguration configuration; - @Getter - private final List downlinkMsgs; + private final ConcurrentLinkedDeque downlinkMsgs; + + //Returns collection copy as Unmodifiable list + //This addressing the issue: DeviceEdgeTest>AbstractEdgeTest.setupEdgeTest:212->AbstractEdgeTest.verifyEdgeConnectionAndInitialData:306->AbstractEdgeTest.validateMsgsCnt:387 » ConcurrentModification + public List getDownlinkMsgs() { + return downlinkMsgs.stream().toList(); + } @Getter private UplinkResponseMsg latestResponseMsg; @@ -112,7 +118,7 @@ public class EdgeImitator { edgeRpcClient = new EdgeGrpcClient(); messagesLatch = new CountDownLatch(0); responsesLatch = new CountDownLatch(0); - downlinkMsgs = new ArrayList<>(); + downlinkMsgs = new ConcurrentLinkedDeque<>(); ignoredTypes = new ArrayList<>(); this.routingKey = routingKey; this.routingSecret = routingSecret; @@ -452,7 +458,7 @@ public class EdgeImitator { } public AbstractMessage getLatestMessage() { - return downlinkMsgs.get(downlinkMsgs.size() - 1); + return downlinkMsgs.peekLast(); } public void ignoreType(Class type) { From 5305ccf18081662c454b8e1f92e9973a3e4b2607 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Wed, 21 Jan 2026 22:45:56 +0100 Subject: [PATCH 219/579] tests: standardizing timeouts to address flakiness in parallel runs and busy CI env --- .../notification/NotificationRuleApiTest.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java index 41982ab91a..7175f0981d 100644 --- a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java +++ b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java @@ -237,12 +237,12 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { .set("bool", BooleanNode.TRUE); doPost("/api/plugins/telemetry/" + device.getId() + "/" + DataConstants.SHARED_SCOPE, attr); - await().atMost(10, TimeUnit.SECONDS) + await().atMost(TIMEOUT, TimeUnit.SECONDS) .until(() -> alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType) != null); Alarm alarm = alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType); long ts = System.currentTimeMillis(); - await().atMost(15, TimeUnit.SECONDS) + await().atMost(TIMEOUT, TimeUnit.SECONDS) .until(() -> clients.values().stream().allMatch(client -> client.getLastDataUpdate() != null)); clients.forEach((expectedDelay, wsClient) -> { Notification notification = wsClient.getLastDataUpdate().getUpdate(); @@ -290,8 +290,8 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { alarm.setOriginator(device.getId()); alarm = doPost("/api/alarm", alarm, Alarm.class); - await().atMost(15, TimeUnit.SECONDS) - .pollDelay(2, TimeUnit.SECONDS) + await().atMost(TIMEOUT, TimeUnit.SECONDS) + .pollDelay(1, TimeUnit.SECONDS) .untilAsserted(() -> { List notifications = getMyNotifications(false, 10); assertThat(notifications).singleElement().matches(notification -> { @@ -344,7 +344,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { .set("bool", BooleanNode.TRUE); doPost("/api/plugins/telemetry/" + device.getId() + "/" + DataConstants.SHARED_SCOPE, attr); - await().atMost(10, TimeUnit.SECONDS) + await().atMost(TIMEOUT, TimeUnit.SECONDS) .until(() -> alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType) != null); Alarm alarm = alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType); getWsClient().waitForUpdate(true); @@ -354,14 +354,14 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { assertThat(notification.getInfo()).asInstanceOf(type(AlarmNotificationInfo.class)) .extracting(AlarmNotificationInfo::getAlarmId).isEqualTo(alarm.getUuidId()); - await().atMost(10, TimeUnit.SECONDS).until(() -> findNotificationRequests(EntityType.ALARM).getTotalElements() == escalationTable.size()); + await().atMost(TIMEOUT, TimeUnit.SECONDS).until(() -> findNotificationRequests(EntityType.ALARM).getTotalElements() == escalationTable.size()); NotificationRequestInfo scheduledNotificationRequest = findNotificationRequests(EntityType.ALARM).getData().stream() .filter(NotificationRequest::isScheduled) .findFirst().orElse(null); assertThat(scheduledNotificationRequest).extracting(NotificationRequest::getInfo).isEqualTo(notification.getInfo()); alarmSubscriptionService.clearAlarm(tenantId, alarm.getId(), System.currentTimeMillis(), null); - await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + await().atMost(TIMEOUT, TimeUnit.SECONDS).untilAsserted(() -> { assertThat(findNotificationRequests(EntityType.ALARM).getData()).filteredOn(NotificationRequest::isScheduled).isEmpty(); }); } @@ -479,7 +479,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { } loginTenantAdmin(); - List notifications = await().atMost(15, TimeUnit.SECONDS) + List notifications = await().atMost(TIMEOUT, TimeUnit.SECONDS) .until(() -> getMyNotifications(true, 10).stream() .filter(notification -> notification.getType() == NotificationType.RATE_LIMITS) .collect(Collectors.toList()), list -> list.size() == 3); @@ -499,7 +499,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { }); loginSysAdmin(); - notifications = await().atMost(15, TimeUnit.SECONDS) + notifications = await().atMost(TIMEOUT, TimeUnit.SECONDS) .until(() -> getMyNotifications(true, 10).stream() .filter(notification -> notification.getType() == NotificationType.RATE_LIMITS) .collect(Collectors.toList()), list -> list.size() == 1); @@ -720,7 +720,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { .updateInfo(new UpdateMessage(true, "CHANGED", "test", "test", "test", "test")) .build()); - await().atMost(5, TimeUnit.SECONDS) + await().atMost(TIMEOUT, TimeUnit.SECONDS) .untilAsserted(() -> { assertThat(getMyNotifications(false, 100)).size().isEqualTo(2); }); @@ -803,7 +803,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { method.setAccessible(true); method.invoke(systemInfoService); - await().atMost(10, TimeUnit.SECONDS).until(() -> getMyNotifications(false, 100).size() == 1); + await().atMost(TIMEOUT, TimeUnit.SECONDS).until(() -> getMyNotifications(false, 100).size() == 1); Notification notification = getMyNotifications(false, 100).get(0); assertThat(notification.getSubject()).isEqualTo("Warning: RAM shortage"); assertThat(notification.getText()).isEqualTo("RAM shortage"); @@ -830,7 +830,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { .build()); TimeUnit.MILLISECONDS.sleep(300); } - await().atMost(10, TimeUnit.SECONDS).until(() -> getMyNotifications(false, 100).size() == 1); + await().atMost(TIMEOUT, TimeUnit.SECONDS).until(() -> getMyNotifications(false, 100).size() == 1); Notification notification = getMyNotifications(false, 100).get(0); assertThat(notification.getSubject()).isEqualTo("Warning: RAM shortage"); assertThat(notification.getText()).isEqualTo("RAM shortage"); @@ -842,7 +842,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { .serviceType("serviceType") .serviceId("serviceId") .build()); - await("").atMost(5, TimeUnit.SECONDS).untilAsserted(() -> assertThat(getMyNotifications(false, 100)).size().isOne()); + await("").atMost(TIMEOUT, TimeUnit.SECONDS).untilAsserted(() -> assertThat(getMyNotifications(false, 100)).size().isOne()); } @Test @@ -873,7 +873,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { method.invoke(systemInfoService); - await().atMost(10, TimeUnit.SECONDS).until(() -> getMyNotifications(false, 100).size() == 1); + await().atMost(TIMEOUT, TimeUnit.SECONDS).until(() -> getMyNotifications(false, 100).size() == 1); Notification notification = getMyNotifications(false, 100).get(0); assertThat(notification.getSubject()).isEqualTo("Warning: RAM shortage"); assertThat(notification.getText()).isEqualTo("RAM shortage"); From b35f46a8eedd4e3117aa10078ff30dc7172c198a Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Wed, 21 Jan 2026 23:22:44 +0100 Subject: [PATCH 220/579] tests: reducing logging noise for dao, cache for CaffeineCacheMetrics --- common/cache/src/test/resources/logback-test.xml | 3 +++ dao/src/test/resources/logback-test.xml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/common/cache/src/test/resources/logback-test.xml b/common/cache/src/test/resources/logback-test.xml index 29dddea8df..9b4c5b62df 100644 --- a/common/cache/src/test/resources/logback-test.xml +++ b/common/cache/src/test/resources/logback-test.xml @@ -9,6 +9,9 @@ + + + diff --git a/dao/src/test/resources/logback-test.xml b/dao/src/test/resources/logback-test.xml index fe0887c678..92cd10f2ca 100644 --- a/dao/src/test/resources/logback-test.xml +++ b/dao/src/test/resources/logback-test.xml @@ -19,6 +19,9 @@ + + + From 243fbec9301a07a643754de4c3e06fdbf173620b Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 01:58:54 +0100 Subject: [PATCH 221/579] tests: spring.main.banner-mode=off --- application/src/test/resources/application-test.properties | 1 + dao/src/test/resources/application-test.properties | 1 + 2 files changed, 2 insertions(+) diff --git a/application/src/test/resources/application-test.properties b/application/src/test/resources/application-test.properties index b8bdcf67e6..e79289340c 100644 --- a/application/src/test/resources/application-test.properties +++ b/application/src/test/resources/application-test.properties @@ -1,3 +1,4 @@ +spring.main.banner-mode=off js.evaluator=mock transport.lwm2m.server.security.credentials.enabled=true transport.lwm2m.server.security.credentials.type=KEYSTORE diff --git a/dao/src/test/resources/application-test.properties b/dao/src/test/resources/application-test.properties index 1c2c0c5519..60605e1710 100644 --- a/dao/src/test/resources/application-test.properties +++ b/dao/src/test/resources/application-test.properties @@ -1,3 +1,4 @@ +spring.main.banner-mode=off zk.enabled=false zk.url=localhost:2181 zk.zk_dir=/thingsboard From 141ac802650dfe72061bf094371d4e5d792927b0 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 02:14:35 +0100 Subject: [PATCH 222/579] tests: transport.mqtt.bind_port is @DynamicPropertySource. Dynamic MQTT port are set in a single AbstractMqttIntegrationTest to be compatible with parallel test run --- .../controller/EntityViewControllerTest.java | 14 ++++++++++++-- .../thingsboard/server/edge/DeviceEdgeTest.java | 10 ++++++++++ .../AbstractTransportIntegrationTest.java | 1 - .../mqtt/AbstractMqttIntegrationTest.java | 13 +++++++++++++ .../transport/mqtt/MqttGatewayRateLimitsTest.java | 10 ++++++++++ .../transport/mqtt/mqttv3/MqttTestClient.java | 6 +++++- .../transport/mqtt/mqttv5/MqttV5TestClient.java | 6 +++++- .../server/msa/rule/node/MqttNodeTest.java | 3 ++- 8 files changed, 57 insertions(+), 6 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/EntityViewControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/EntityViewControllerTest.java index 7812f769b1..421f3785ca 100644 --- a/application/src/test/java/org/thingsboard/server/controller/EntityViewControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/EntityViewControllerTest.java @@ -38,6 +38,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.servlet.ResultActions; import org.thingsboard.common.util.ThingsBoardExecutors; @@ -85,6 +87,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; +import static org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest.MQTT_PORT; +import static org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest.MQTT_URL; @TestPropertySource(properties = { "transport.mqtt.enabled=true", @@ -94,6 +98,12 @@ import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; @ContextConfiguration(classes = {EntityViewControllerTest.Config.class}) @DaoSqlTest public class EntityViewControllerTest extends AbstractControllerTest { + @DynamicPropertySource + static void props(DynamicPropertyRegistry registry) { + log.warn("transport.mqtt.bind_port = {}", MQTT_PORT); + registry.add("transport.mqtt.bind_port", () -> MQTT_PORT); + } + static final TypeReference> PAGE_DATA_ENTITY_VIEW_TYPE_REF = new TypeReference<>() { }; static final TypeReference> PAGE_DATA_ENTITY_VIEW_INFO_TYPE_REF = new TypeReference<>() { @@ -650,7 +660,7 @@ public class EntityViewControllerTest extends AbstractControllerTest { String viewDeviceId = testDevice.getId().getId().toString(); String clientId = MqttAsyncClient.generateClientId(); - MqttAsyncClient client = new MqttAsyncClient("tcp://localhost:1883", clientId, new MemoryPersistence()); + MqttAsyncClient client = new MqttAsyncClient(MQTT_URL, clientId, new MemoryPersistence()); MqttConnectOptions options = new MqttConnectOptions(); options.setUserName(accessToken); @@ -701,7 +711,7 @@ public class EntityViewControllerTest extends AbstractControllerTest { assertNotNull(accessToken); String clientId = MqttAsyncClient.generateClientId(); - MqttAsyncClient client = new MqttAsyncClient("tcp://localhost:1883", clientId, new MemoryPersistence()); + MqttAsyncClient client = new MqttAsyncClient(MQTT_URL, clientId, new MemoryPersistence()); MqttConnectOptions options = new MqttConnectOptions(); options.setUserName(accessToken); diff --git a/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java index f9b89f4d2c..a8f82f8b7d 100644 --- a/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java @@ -22,10 +22,13 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.gson.JsonObject; import com.google.protobuf.AbstractMessage; import io.netty.handler.codec.mqtt.MqttQoS; +import lombok.extern.slf4j.Slf4j; import org.awaitility.Awaitility; import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.adaptor.JsonConverter; @@ -85,12 +88,19 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.thingsboard.server.gen.edge.v1.UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE; +import static org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest.MQTT_PORT; @TestPropertySource(properties = { "transport.mqtt.enabled=true" }) +@Slf4j @DaoSqlTest public class DeviceEdgeTest extends AbstractEdgeTest { + @DynamicPropertySource + static void props(DynamicPropertyRegistry registry) { + log.warn("transport.mqtt.bind_port = {}", MQTT_PORT); + registry.add("transport.mqtt.bind_port", () -> MQTT_PORT); + } private static final String DEFAULT_DEVICE_TYPE = "default"; diff --git a/application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java index 0badcd2656..bc06d81588 100644 --- a/application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java @@ -30,7 +30,6 @@ public abstract class AbstractTransportIntegrationTest extends AbstractControlle protected static final int DEFAULT_WAIT_TIMEOUT_SECONDS = 30; - protected static final String MQTT_URL = "tcp://localhost:1883"; protected static final String COAP_BASE_URL = "coap://localhost:5683/api/v1/"; protected static final AtomicInteger atomicInteger = new AtomicInteger(2); diff --git a/application/src/test/java/org/thingsboard/server/transport/mqtt/AbstractMqttIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/mqtt/AbstractMqttIntegrationTest.java index 364b8fbe6a..962d85ec7c 100644 --- a/application/src/test/java/org/thingsboard/server/transport/mqtt/AbstractMqttIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/mqtt/AbstractMqttIntegrationTest.java @@ -19,7 +19,10 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import io.netty.handler.codec.mqtt.MqttQoS; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttException; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; +import org.springframework.test.util.TestSocketUtils; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; @@ -58,6 +61,16 @@ import static org.junit.Assert.assertNotNull; @Slf4j public abstract class AbstractMqttIntegrationTest extends AbstractTransportIntegrationTest { + public static final String MQTT_HOST = "localhost"; + public static final int MQTT_PORT = TestSocketUtils.findAvailableTcpPort(); + public static final String MQTT_URL = "tcp://" + MQTT_HOST + ":" + MQTT_PORT; + + @DynamicPropertySource + static void props(DynamicPropertyRegistry registry) { + log.warn("transport.mqtt.bind_port = {}", MQTT_PORT); + registry.add("transport.mqtt.bind_port", () -> MQTT_PORT); + } + protected Device savedGateway; protected String gatewayAccessToken; diff --git a/application/src/test/java/org/thingsboard/server/transport/mqtt/MqttGatewayRateLimitsTest.java b/application/src/test/java/org/thingsboard/server/transport/mqtt/MqttGatewayRateLimitsTest.java index c455ae45d4..541ca40072 100644 --- a/application/src/test/java/org/thingsboard/server/transport/mqtt/MqttGatewayRateLimitsTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/mqtt/MqttGatewayRateLimitsTest.java @@ -16,12 +16,15 @@ package org.thingsboard.server.transport.mqtt; import com.fasterxml.jackson.databind.node.ObjectNode; +import lombok.extern.slf4j.Slf4j; import org.awaitility.Awaitility; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.Device; @@ -43,13 +46,20 @@ import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.eq; import static org.thingsboard.server.common.data.limit.LimitedApi.TRANSPORT_MESSAGES_PER_GATEWAY; import static org.thingsboard.server.common.data.limit.LimitedApi.TRANSPORT_MESSAGES_PER_GATEWAY_DEVICE; +import static org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest.MQTT_PORT; @DaoSqlTest @TestPropertySource(properties = { "service.integrations.supported=ALL", "transport.mqtt.enabled=true", }) +@Slf4j public class MqttGatewayRateLimitsTest extends AbstractControllerTest { + @DynamicPropertySource + static void props(DynamicPropertyRegistry registry) { + log.warn("transport.mqtt.bind_port = {}", MQTT_PORT); + registry.add("transport.mqtt.bind_port", () -> MQTT_PORT); + } private static final String GATEWAY_TOPIC = "v1/gateway/telemetry"; private static final String DEVICE_TOPIC = "v1/devices/me/telemetry"; diff --git a/application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/MqttTestClient.java b/application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/MqttTestClient.java index 7e5cc031a5..4c34d9bc81 100644 --- a/application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/MqttTestClient.java +++ b/application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/MqttTestClient.java @@ -27,12 +27,16 @@ import org.thingsboard.server.common.data.StringUtils; import java.util.concurrent.TimeUnit; +import static org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest.MQTT_HOST; +import static org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest.MQTT_PORT; + public class MqttTestClient { - private static final String MQTT_URL = "tcp://localhost:1883"; private static final int TIMEOUT = 30; // seconds public static final long TIMEOUT_MS = TimeUnit.SECONDS.toMillis(TIMEOUT); + private String MQTT_URL = "tcp://" + MQTT_HOST + ":" + MQTT_PORT; + private final MqttAsyncClient client; public void setCallback(MqttTestCallback callback) { diff --git a/application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/MqttV5TestClient.java b/application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/MqttV5TestClient.java index 545fc148e2..558fa1a46a 100644 --- a/application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/MqttV5TestClient.java +++ b/application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/MqttV5TestClient.java @@ -27,12 +27,16 @@ import org.thingsboard.server.common.data.StringUtils; import java.util.concurrent.TimeUnit; +import static org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest.MQTT_HOST; +import static org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest.MQTT_PORT; + public class MqttV5TestClient { // We should copy part of MqttV3TestClient, due to different package names in import - private static final String MQTT_URL = "tcp://localhost:1883"; private static final int TIMEOUT = 30; // seconds private static final long TIMEOUT_MS = TimeUnit.SECONDS.toMillis(TIMEOUT); + private String MQTT_URL = "tcp://" + MQTT_HOST + ":" + MQTT_PORT; + private final MqttAsyncClient client; public void setCallback(MqttCallback callback) { diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/rule/node/MqttNodeTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/rule/node/MqttNodeTest.java index 67f6258767..6fff0b4b6a 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/rule/node/MqttNodeTest.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/rule/node/MqttNodeTest.java @@ -65,6 +65,7 @@ import static org.thingsboard.server.msa.prototypes.DevicePrototypes.defaultDevi public class MqttNodeTest extends AbstractContainerTest { private static final String TOPIC = "tb/mqtt/device"; + private static final String CONTAINER_MQTT_URL = "tcp://localhost:1883"; private Device device; @@ -94,7 +95,7 @@ public class MqttNodeTest extends AbstractContainerTest { responseClient.connect(); responseClient.subscribe(TOPIC, messageListener); - MqttClient mqttClient = new MqttClient("tcp://localhost:1883", StringUtils.randomAlphanumeric(10), new MemoryPersistence()); + MqttClient mqttClient = new MqttClient(CONTAINER_MQTT_URL, StringUtils.randomAlphanumeric(10), new MemoryPersistence()); MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); mqttConnectOptions.setUserName(deviceCredentials.getCredentialsId()); mqttClient.connect(mqttConnectOptions); From 9577cb0aeed2127d6911109b5084e8bd1c27135a Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 03:17:00 +0100 Subject: [PATCH 223/579] tests: PortFinder.findAvailableUdpPort added --- .../thingsboard/server/utils/PortFinder.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 application/src/test/java/org/thingsboard/server/utils/PortFinder.java diff --git a/application/src/test/java/org/thingsboard/server/utils/PortFinder.java b/application/src/test/java/org/thingsboard/server/utils/PortFinder.java new file mode 100644 index 0000000000..23990363ce --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/utils/PortFinder.java @@ -0,0 +1,29 @@ +/** + * 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. + */ +package org.thingsboard.server.utils; + +import java.net.DatagramSocket; +import java.net.SocketException; + +public class PortFinder { + public static int findAvailableUdpPort() { + try (DatagramSocket socket = new DatagramSocket(0)) { + return socket.getLocalPort(); + } catch (SocketException e) { + throw new IllegalStateException("No available UDP ports found", e); + } + } +} From bcfe4c26417d09a55d33d11e8b0879dd50de5a5b Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 03:18:48 +0100 Subject: [PATCH 224/579] tests: coap transport tests refactored to use dynamic UPD ports to be able to test in parallel --- .../AbstractTransportIntegrationTest.java | 2 -- .../coap/AbstractCoapIntegrationTest.java | 14 ++++++++ .../server/transport/coap/CoapTestClient.java | 3 +- .../AbstractCoapSecurityIntegrationTest.java | 36 ++++++++++++------- .../server/msa/AbstractCoapClientTest.java | 4 +-- 5 files changed, 42 insertions(+), 17 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java index bc06d81588..b0a1d21992 100644 --- a/application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java @@ -30,8 +30,6 @@ public abstract class AbstractTransportIntegrationTest extends AbstractControlle protected static final int DEFAULT_WAIT_TIMEOUT_SECONDS = 30; - protected static final String COAP_BASE_URL = "coap://localhost:5683/api/v1/"; - protected static final AtomicInteger atomicInteger = new AtomicInteger(2); public static final String DEVICE_TELEMETRY_PROTO_SCHEMA = "syntax =\"proto3\";\n" + diff --git a/application/src/test/java/org/thingsboard/server/transport/coap/AbstractCoapIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/coap/AbstractCoapIntegrationTest.java index 7240ab0afa..cf23a5be97 100644 --- a/application/src/test/java/org/thingsboard/server/transport/coap/AbstractCoapIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/coap/AbstractCoapIntegrationTest.java @@ -16,7 +16,10 @@ package org.thingsboard.server.transport.coap; import lombok.extern.slf4j.Slf4j; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; +import org.springframework.test.util.TestSocketUtils; import org.thingsboard.server.common.data.CoapDeviceType; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; @@ -40,6 +43,7 @@ import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadCo import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration; import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.transport.AbstractTransportIntegrationTest; +import org.thingsboard.server.utils.PortFinder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -52,6 +56,16 @@ import static org.junit.Assert.assertNotNull; @Slf4j public abstract class AbstractCoapIntegrationTest extends AbstractTransportIntegrationTest { + public static final String COAP_HOST = "localhost"; + public static final int COAP_PORT = PortFinder.findAvailableUdpPort(); + public static final String COAP_BASE_URL = "coap://" + COAP_HOST + ":" + COAP_PORT + "/api/v1/"; + + @DynamicPropertySource + static void props(DynamicPropertyRegistry registry) { + log.info("coap.bind_port = {}", COAP_PORT); + registry.add("coap.bind_port", () -> COAP_PORT); + } + protected final byte[] EMPTY_PAYLOAD = new byte[0]; protected CoapTestClient client; protected static final String PAYLOAD_VALUES_STR = "{\"key1\":\"value1\", \"key2\":true, \"key3\": 3.0, \"key4\": 4," + diff --git a/application/src/test/java/org/thingsboard/server/transport/coap/CoapTestClient.java b/application/src/test/java/org/thingsboard/server/transport/coap/CoapTestClient.java index ce72d68fc6..df7e9babc9 100644 --- a/application/src/test/java/org/thingsboard/server/transport/coap/CoapTestClient.java +++ b/application/src/test/java/org/thingsboard/server/transport/coap/CoapTestClient.java @@ -28,9 +28,10 @@ import org.thingsboard.server.common.msg.session.FeatureType; import java.io.IOException; +import static org.thingsboard.server.transport.coap.AbstractCoapIntegrationTest.COAP_BASE_URL; + public class CoapTestClient { - private static final String COAP_BASE_URL = "coap://localhost:5683/api/v1/"; private static final long CLIENT_REQUEST_TIMEOUT = 60000L; private final CoapClient client; diff --git a/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java index cfb449aa33..9c42d87369 100644 --- a/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java @@ -21,7 +21,10 @@ import lombok.extern.slf4j.Slf4j; import org.eclipse.californium.core.CoapResponse; import org.eclipse.californium.core.coap.CoAP; import org.junit.Assert; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; +import org.springframework.test.util.TestSocketUtils; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.CoapDeviceType; import org.thingsboard.server.common.data.Device; @@ -37,9 +40,11 @@ import org.thingsboard.server.transport.coap.AbstractCoapIntegrationTest; import org.thingsboard.server.transport.coap.x509.CertPrivateKey; import org.thingsboard.server.transport.coap.x509.CoapClientX509Test; import org.thingsboard.server.transport.coap.CoapTestConfigProperties; +import org.thingsboard.server.utils.PortFinder; import java.io.IOException; import java.io.InputStream; +import java.net.DatagramSocket; import java.net.ServerSocket; import java.security.GeneralSecurityException; import java.security.KeyStore; @@ -70,7 +75,17 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. "transport.coap.enabled=true", }) public abstract class AbstractCoapSecurityIntegrationTest extends AbstractCoapIntegrationTest { - private static final String COAPS_BASE_URL = "coaps://localhost:5684/api/v1/"; + + public static final String COAPS_HOST = "localhost"; + public static final int COAPS_PORT = PortFinder.findAvailableUdpPort(); + public static final String COAPS_BASE_URL = "coaps://" + COAPS_HOST + ":" + COAPS_PORT + "/api/v1/"; + + @DynamicPropertySource + static void props(DynamicPropertyRegistry registry) { + log.info("coap.dtls.bind_port = {}", COAPS_PORT); + registry.add("coap.dtls.bind_port", () -> COAPS_PORT); + } + protected final String CREDENTIALS_PATH = "coap/credentials/"; protected final String CREDENTIALS_PATH_CLIENT = CREDENTIALS_PATH + "client/"; protected final String CREDENTIALS_PATH_CLIENT_CERT_PEM = CREDENTIALS_PATH_CLIENT + "cert.pem"; @@ -160,17 +175,20 @@ public abstract class AbstractCoapSecurityIntegrationTest extends AbstractCoapIn CertPrivateKey certPrivateKey = new CertPrivateKey(CREDENTIALS_PATH_CLIENT_CERT_PEM, CREDENTIALS_PATH_CLIENT_KEY_PEM); CertPrivateKey certPrivateKey_01 = new CertPrivateKey(CREDENTIALS_PATH_CLIENT + "cert_01.pem", CREDENTIALS_PATH_CLIENT + "key_01.pem"); - Integer fixedPort = getFreePort(); + int fixedPort = PortFinder.findAvailableUdpPort(); CoapClientX509Test clientX509 = clientX509UpdateTest(FeatureType.ATTRIBUTES, certPrivateKey, "CoapX509TrustNo_" + FeatureType.TELEMETRY.name(), deviceProfile.getId(), fixedPort); clientX509.disconnect(); await("Need to make port " + fixedPort + " free") .atMost(40, TimeUnit.SECONDS) - .until(() -> isPortAvailable(fixedPort)); + .until(() -> isUDPPortAvailable(fixedPort)); CoapClientX509Test clientX509_01 = clientX509UpdateTest(FeatureType.ATTRIBUTES, certPrivateKey_01, "CoapX509TrustNo_" + FeatureType.TELEMETRY.name() + "_01", deviceProfile.getId(), fixedPort, PAYLOAD_VALUES_STR_01); clientX509_01.disconnect(); + await("Await to make port " + fixedPort + " free") + .atMost(40, TimeUnit.SECONDS) + .until(() -> isUDPPortAvailable(fixedPort)); } private CoapClientX509Test clientX509UpdateTest(FeatureType featureType, CertPrivateKey certPrivateKey, @@ -274,15 +292,9 @@ public abstract class AbstractCoapSecurityIntegrationTest extends AbstractCoapIn } } - private static int getFreePort() throws IOException { - try (ServerSocket socket = new ServerSocket(0)) { - return socket.getLocalPort(); - } - } - - private static boolean isPortAvailable(int port) { - try (ServerSocket serverSocket = new ServerSocket(port)) { - serverSocket.setReuseAddress(true); + private static boolean isUDPPortAvailable(int port) { + try (DatagramSocket socket = new DatagramSocket(port)) { + socket.setReuseAddress(true); return true; } catch (IOException e) { return false; diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/AbstractCoapClientTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/AbstractCoapClientTest.java index d4d9d08474..e409a82600 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/AbstractCoapClientTest.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/AbstractCoapClientTest.java @@ -28,7 +28,7 @@ import org.thingsboard.server.common.msg.session.FeatureType; public abstract class AbstractCoapClientTest extends AbstractContainerTest{ - private static final String COAP_BASE_URL = "coap://localhost:5683/api/v1/"; + private static final String CONTAINER_COAP_BASE_URL = "coap://localhost:5683/api/v1/"; private static final long CLIENT_REQUEST_TIMEOUT = 60000L; @@ -54,7 +54,7 @@ public abstract class AbstractCoapClientTest extends AbstractContainerTest{ protected byte[] createCoapClientAndPublish(String deviceName) throws Exception { String provisionRequestMsg = createTestProvisionMessage(deviceName); Configuration.addDefaultModule(MODULE_DEFINITIONS_PROVIDER); - String featureTokenUrl = COAP_BASE_URL + FeatureType.PROVISION.name().toLowerCase(); + String featureTokenUrl = CONTAINER_COAP_BASE_URL + FeatureType.PROVISION.name().toLowerCase(); client = new CoapClient(featureTokenUrl); return client.setTimeout(CLIENT_REQUEST_TIMEOUT) .post(provisionRequestMsg.getBytes(), MediaTypeRegistry.APPLICATION_JSON) From f4334436ff45c0653fafd53d80f818ff3b6b9c7e Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 03:46:12 +0100 Subject: [PATCH 225/579] tests: log warn dynamic property coap.bind_port coap.dtls.bind_port --- .../server/transport/coap/AbstractCoapIntegrationTest.java | 2 +- .../coap/security/AbstractCoapSecurityIntegrationTest.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/transport/coap/AbstractCoapIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/coap/AbstractCoapIntegrationTest.java index cf23a5be97..69d40f5409 100644 --- a/application/src/test/java/org/thingsboard/server/transport/coap/AbstractCoapIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/coap/AbstractCoapIntegrationTest.java @@ -62,7 +62,7 @@ public abstract class AbstractCoapIntegrationTest extends AbstractTransportInteg @DynamicPropertySource static void props(DynamicPropertyRegistry registry) { - log.info("coap.bind_port = {}", COAP_PORT); + log.warn("coap.bind_port = {}", COAP_PORT); registry.add("coap.bind_port", () -> COAP_PORT); } diff --git a/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java index 9c42d87369..b0531457a4 100644 --- a/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java @@ -82,7 +82,7 @@ public abstract class AbstractCoapSecurityIntegrationTest extends AbstractCoapIn @DynamicPropertySource static void props(DynamicPropertyRegistry registry) { - log.info("coap.dtls.bind_port = {}", COAPS_PORT); + log.warn("coap.dtls.bind_port = {}", COAPS_PORT); registry.add("coap.dtls.bind_port", () -> COAPS_PORT); } @@ -297,6 +297,7 @@ public abstract class AbstractCoapSecurityIntegrationTest extends AbstractCoapIn socket.setReuseAddress(true); return true; } catch (IOException e) { + log.warn("Failed to open UDP port on port " + port, e); return false; } } From 189c2ac6ae30245e989b509751a9b529071cde7a Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 03:48:43 +0100 Subject: [PATCH 226/579] tests: fixed Coap X509 Test client by calling dtlsConnector.destroy() on client.disconnect(); --- .../server/transport/coap/x509/CoapClientX509Test.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/application/src/test/java/org/thingsboard/server/transport/coap/x509/CoapClientX509Test.java b/application/src/test/java/org/thingsboard/server/transport/coap/x509/CoapClientX509Test.java index 0f65298d86..aff3902609 100644 --- a/application/src/test/java/org/thingsboard/server/transport/coap/x509/CoapClientX509Test.java +++ b/application/src/test/java/org/thingsboard/server/transport/coap/x509/CoapClientX509Test.java @@ -97,6 +97,9 @@ public class CoapClientX509Test { if (clientX509 != null) { clientX509.shutdown(); } + if (dtlsConnector != null) { + dtlsConnector.destroy(); + } } public CoapResponse postMethod(String requestBody) throws ConnectorException, IOException { From 94f30191884478eea88ca05fafdcde5c8f44591e Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 14:51:20 +0100 Subject: [PATCH 227/579] tests: AbstractCoapSecurityIntegrationTest import cleanup --- .../coap/security/AbstractCoapSecurityIntegrationTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java index b0531457a4..ec68a346f0 100644 --- a/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java @@ -45,7 +45,6 @@ import org.thingsboard.server.utils.PortFinder; import java.io.IOException; import java.io.InputStream; import java.net.DatagramSocket; -import java.net.ServerSocket; import java.security.GeneralSecurityException; import java.security.KeyStore; import java.security.PrivateKey; From 59ff87d2bcd905b025b20a84f7c56b3b41d9674c Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 14:53:21 +0100 Subject: [PATCH 228/579] DeviceProfileDataValidator - refactored validation to allow use-defined ports for LWM@M (also useful for tests in parallel). Addressing the issue: DeviceProfile object is invalid: [LwM2M Server "Port" value = 53197. This value for security PSK must be 5686!] --- .../validator/DeviceProfileDataValidator.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java index 130251eb35..6402ec0d1f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java @@ -96,6 +96,18 @@ public class DeviceProfileDataValidator extends AbstractHasOtaPackageValidator Date: Thu, 22 Jan 2026 16:06:26 +0100 Subject: [PATCH 229/579] tests: CoapClientX509Test disconnect() is awaiting until UDP fixedPort released. reuse socket removed for UPD isUDPPortAvailable as not useful --- .../AbstractTransportIntegrationTest.java | 2 +- .../AbstractCoapSecurityIntegrationTest.java | 19 ------------------- .../coap/x509/CoapClientX509Test.java | 11 +++++++++++ .../thingsboard/server/utils/PortFinder.java | 13 +++++++++++++ 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java index b0a1d21992..c91fea282d 100644 --- a/application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java @@ -28,7 +28,7 @@ import java.util.concurrent.atomic.AtomicInteger; @Slf4j public abstract class AbstractTransportIntegrationTest extends AbstractControllerTest { - protected static final int DEFAULT_WAIT_TIMEOUT_SECONDS = 30; + public static final int DEFAULT_WAIT_TIMEOUT_SECONDS = 30; protected static final AtomicInteger atomicInteger = new AtomicInteger(2); diff --git a/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java index ec68a346f0..04434ff53d 100644 --- a/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/coap/security/AbstractCoapSecurityIntegrationTest.java @@ -24,7 +24,6 @@ import org.junit.Assert; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.util.TestSocketUtils; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.CoapDeviceType; import org.thingsboard.server.common.data.Device; @@ -44,7 +43,6 @@ import org.thingsboard.server.utils.PortFinder; import java.io.IOException; import java.io.InputStream; -import java.net.DatagramSocket; import java.security.GeneralSecurityException; import java.security.KeyStore; import java.security.PrivateKey; @@ -55,9 +53,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.TimeUnit; -import static org.awaitility.Awaitility.await; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -178,16 +174,10 @@ public abstract class AbstractCoapSecurityIntegrationTest extends AbstractCoapIn CoapClientX509Test clientX509 = clientX509UpdateTest(FeatureType.ATTRIBUTES, certPrivateKey, "CoapX509TrustNo_" + FeatureType.TELEMETRY.name(), deviceProfile.getId(), fixedPort); clientX509.disconnect(); - await("Need to make port " + fixedPort + " free") - .atMost(40, TimeUnit.SECONDS) - .until(() -> isUDPPortAvailable(fixedPort)); CoapClientX509Test clientX509_01 = clientX509UpdateTest(FeatureType.ATTRIBUTES, certPrivateKey_01, "CoapX509TrustNo_" + FeatureType.TELEMETRY.name() + "_01", deviceProfile.getId(), fixedPort, PAYLOAD_VALUES_STR_01); clientX509_01.disconnect(); - await("Await to make port " + fixedPort + " free") - .atMost(40, TimeUnit.SECONDS) - .until(() -> isUDPPortAvailable(fixedPort)); } private CoapClientX509Test clientX509UpdateTest(FeatureType featureType, CertPrivateKey certPrivateKey, @@ -291,14 +281,5 @@ public abstract class AbstractCoapSecurityIntegrationTest extends AbstractCoapIn } } - private static boolean isUDPPortAvailable(int port) { - try (DatagramSocket socket = new DatagramSocket(port)) { - socket.setReuseAddress(true); - return true; - } catch (IOException e) { - log.warn("Failed to open UDP port on port " + port, e); - return false; - } - } } diff --git a/application/src/test/java/org/thingsboard/server/transport/coap/x509/CoapClientX509Test.java b/application/src/test/java/org/thingsboard/server/transport/coap/x509/CoapClientX509Test.java index aff3902609..ebbed25243 100644 --- a/application/src/test/java/org/thingsboard/server/transport/coap/x509/CoapClientX509Test.java +++ b/application/src/test/java/org/thingsboard/server/transport/coap/x509/CoapClientX509Test.java @@ -51,6 +51,7 @@ import java.util.List; import java.util.concurrent.TimeUnit; import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.awaitility.Awaitility.await; import static org.eclipse.californium.core.config.CoapConfig.DEFAULT_BLOCKWISE_STATUS_LIFETIME_IN_SECONDS; import static org.eclipse.californium.scandium.config.DtlsConfig.DTLS_AUTO_HANDSHAKE_TIMEOUT; import static org.eclipse.californium.scandium.config.DtlsConfig.DTLS_CIPHER_SUITES; @@ -71,6 +72,8 @@ import static org.eclipse.californium.scandium.config.DtlsConfig.MODULE; import static org.eclipse.californium.scandium.dtls.SignatureAndHashAlgorithm.SHA256_WITH_ECDSA; import static org.eclipse.californium.scandium.dtls.SignatureAndHashAlgorithm.SHA256_WITH_RSA; import static org.eclipse.californium.scandium.dtls.SignatureAndHashAlgorithm.SHA384_WITH_ECDSA; +import static org.thingsboard.server.transport.AbstractTransportIntegrationTest.DEFAULT_WAIT_TIMEOUT_SECONDS; +import static org.thingsboard.server.utils.PortFinder.isUDPPortAvailable; @Slf4j public class CoapClientX509Test { @@ -82,6 +85,7 @@ public class CoapClientX509Test { private final Configuration config; private final CertPrivateKey certPrivateKey; private final String coapsBaseUrl; + private final Integer fixedPort; @Getter private CoAP.Type type = CoAP.Type.CON; @@ -90,6 +94,7 @@ public class CoapClientX509Test { this.certPrivateKey = certPrivateKey; this.coapsBaseUrl = coapsBaseUrl; this.config = createConfiguration(); + this.fixedPort = fixedPort; this.dtlsConnector = createDTLSConnector(fixedPort); this.clientX509 = createClient(getFeatureTokenUrl(featureType)); } @@ -99,6 +104,12 @@ public class CoapClientX509Test { } if (dtlsConnector != null) { dtlsConnector.destroy(); + if (fixedPort != null) { + log.debug("Awaiting releasing UDP fixedPort {}", fixedPort); + await("Await client UDP port " + fixedPort + " to disconnect") + .atMost(DEFAULT_WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS) + .until(() -> isUDPPortAvailable(fixedPort)); + } } } diff --git a/application/src/test/java/org/thingsboard/server/utils/PortFinder.java b/application/src/test/java/org/thingsboard/server/utils/PortFinder.java index 23990363ce..21a1f1eb0d 100644 --- a/application/src/test/java/org/thingsboard/server/utils/PortFinder.java +++ b/application/src/test/java/org/thingsboard/server/utils/PortFinder.java @@ -15,9 +15,13 @@ */ package org.thingsboard.server.utils; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; import java.net.DatagramSocket; import java.net.SocketException; +@Slf4j public class PortFinder { public static int findAvailableUdpPort() { try (DatagramSocket socket = new DatagramSocket(0)) { @@ -26,4 +30,13 @@ public class PortFinder { throw new IllegalStateException("No available UDP ports found", e); } } + + public static boolean isUDPPortAvailable(int port) { + try (DatagramSocket socket = new DatagramSocket(port)) { + return true; + } catch (IOException e) { + log.debug("Failed to open UDP port {}", port, e); + return false; + } + } } From a706859711f995bfa53c358e20101f77377d6fac Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 19:13:46 +0100 Subject: [PATCH 230/579] tests: log MockMvc error responses >= 400 for easier investigation --- .../thingsboard/server/controller/AbstractWebTest.java | 10 +++++++++- application/src/test/resources/logback-test.xml | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java index 599dcf3138..44c383a5f0 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java @@ -60,6 +60,7 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.ResultMatcher; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.context.WebApplicationContext; @@ -330,7 +331,14 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest { if (this.mockMvc == null) { this.mockMvc = webAppContextSetup(webApplicationContext) - .apply(springSecurity()).build(); + .apply(springSecurity()) + // conditional printing of non 2xx responses + .alwaysDo(result -> { + if (result.getResponse().getStatus() >= 400) { + MockMvcResultHandlers.log().handle(result); + } + }) + .build(); } loginSysAdmin(); diff --git a/application/src/test/resources/logback-test.xml b/application/src/test/resources/logback-test.xml index eafb4e1fba..6faaf97536 100644 --- a/application/src/test/resources/logback-test.xml +++ b/application/src/test/resources/logback-test.xml @@ -45,6 +45,9 @@ + + + From 45da022944b4bb0e66a6491154b32763bd43ab0b Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 19:15:35 +0100 Subject: [PATCH 231/579] tests: bump versions 3.5.4 1.21.4 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index bfb4bbf1ae..58e0c32e43 100755 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ 1.2.5 1.2.5 1.7.1 - 3.2.5 + 3.5.4 3.4.0 2.8.8TB 2.2.30 @@ -127,7 +127,7 @@ 5.0.0 7.10.1 - 1.20.6 + 1.21.4 1.0.2 1.12 6.1.0 From a4f755b624457d77024f56fa6250e6645590c159 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 19:21:31 +0100 Subject: [PATCH 232/579] tests: refactored blackbox test for LWM2M test client (UDP DatagramSocket instead TCP ServerSocket), ensure UDP socket is available before and after LWM2M client start stop --- .../thingsboard/server/msa/PortFinder.java | 42 +++++++++++++++++++ .../lwm2m/AbstractLwm2mClientTest.java | 8 ++-- .../lwm2m/client/LwM2MTestClient.java | 21 +++++++++- 3 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 msa/black-box-tests/src/test/java/org/thingsboard/server/msa/PortFinder.java diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/PortFinder.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/PortFinder.java new file mode 100644 index 0000000000..8bd036bf15 --- /dev/null +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/PortFinder.java @@ -0,0 +1,42 @@ +/** + * 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. + */ +package org.thingsboard.server.msa; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.DatagramSocket; +import java.net.SocketException; + +@Slf4j +public class PortFinder { + public static int findAvailableUdpPort() { + try (DatagramSocket socket = new DatagramSocket(0)) { + return socket.getLocalPort(); + } catch (SocketException e) { + throw new IllegalStateException("No available UDP ports found", e); + } + } + + public static boolean isUDPPortAvailable(int port) { + try (DatagramSocket socket = new DatagramSocket(port)) { + return true; + } catch (IOException e) { + log.debug("Failed to open UDP port {}", port, e); + return false; + } + } +} diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/lwm2m/AbstractLwm2mClientTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/lwm2m/AbstractLwm2mClientTest.java index f991e1b29c..c5673ae667 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/lwm2m/AbstractLwm2mClientTest.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/lwm2m/AbstractLwm2mClientTest.java @@ -57,12 +57,12 @@ import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.security.DeviceCredentialsType; import org.thingsboard.server.msa.AbstractContainerTest; +import org.thingsboard.server.msa.PortFinder; import org.thingsboard.server.msa.WsClient; import org.thingsboard.server.msa.connectivity.lwm2m.client.LwM2MTestClient; import org.thingsboard.server.msa.connectivity.lwm2m.client.Lwm2mTestHelper.LwM2MClientState; import org.thingsboard.server.msa.mapper.WsTelemetryResponse; -import java.net.ServerSocket; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.util.ArrayList; @@ -229,10 +229,8 @@ public class AbstractLwm2mClientTest extends AbstractContainerTest { String endpoint, ScheduledExecutorService executor) throws Exception { this.executor = executor; LwM2MTestClient lwM2MTestClient = new LwM2MTestClient(executor, endpoint); - try (ServerSocket socket = new ServerSocket(0)) { - int clientPort = socket.getLocalPort(); - lwM2MTestClient.init(security, clientPort); - } + int clientPort = PortFinder.findAvailableUdpPort(); + lwM2MTestClient.init(security, clientPort); return lwM2MTestClient; } diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/lwm2m/client/LwM2MTestClient.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/lwm2m/client/LwM2MTestClient.java index 64f4d6f08a..61a763562c 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/lwm2m/client/LwM2MTestClient.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/lwm2m/client/LwM2MTestClient.java @@ -65,6 +65,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; import static org.eclipse.californium.scandium.config.DtlsConfig.DTLS_CONNECTION_ID_LENGTH; import static org.eclipse.californium.scandium.config.DtlsConfig.DTLS_RECOMMENDED_CIPHER_SUITES_ONLY; import static org.eclipse.leshan.core.LwM2mId.ACCESS_CONTROL; @@ -72,6 +73,7 @@ import static org.eclipse.leshan.core.LwM2mId.DEVICE; import static org.eclipse.leshan.core.LwM2mId.FIRMWARE; import static org.eclipse.leshan.core.LwM2mId.SECURITY; import static org.eclipse.leshan.core.LwM2mId.SERVER; +import static org.thingsboard.server.msa.PortFinder.isUDPPortAvailable; import static org.thingsboard.server.msa.connectivity.lwm2m.client.Lwm2mTestHelper.BINARY_APP_DATA_CONTAINER; import static org.thingsboard.server.msa.connectivity.lwm2m.client.Lwm2mTestHelper.LwM2MClientState.ON_BOOTSTRAP_FAILURE; import static org.thingsboard.server.msa.connectivity.lwm2m.client.Lwm2mTestHelper.LwM2MClientState.ON_BOOTSTRAP_STARTED; @@ -95,7 +97,6 @@ import static org.thingsboard.server.msa.connectivity.lwm2m.client.Lwm2mTestHelp import static org.thingsboard.server.msa.connectivity.lwm2m.client.Lwm2mTestHelper.serverId; import static org.thingsboard.server.msa.connectivity.lwm2m.client.Lwm2mTestHelper.shortServerId; - @Slf4j @Data public class LwM2MTestClient { @@ -115,8 +116,11 @@ public class LwM2MTestClient { private int countUpdateRegistrationSuccess; private int countReadObserveAfterUpdateRegistrationSuccess; + private int clientPort; + public void init(Security security, int clientPort) throws InvalidDDFFileException, IOException { assertThat(leshanClient).as("client already initialized").isNull(); + this.clientPort = clientPort; List models = new ArrayList<>(); for (String resourceName : resources) { @@ -342,12 +346,27 @@ public class LwM2MTestClient { } }); + } + + public void start() { leshanClient.start(); + if (clientPort > 0) { + log.error("Await UDP clientPort {} to be available before leshanClient.start()", clientPort); + await("Await UDP clientPort " + clientPort + " to be available before leshanClient.start()") + .atMost(30, TimeUnit.SECONDS) + .until(() -> isUDPPortAvailable(clientPort)); + } } public void destroy() { if (leshanClient != null) { leshanClient.destroy(true); + if (clientPort > 0) { + log.error("Await UDP clientPort {} to disconnect after leshanClient.stop(deregister)", clientPort); + await("Await client UDP port " + clientPort + " to disconnect after leshanClient.stop(deregister)") + .atMost(30, TimeUnit.SECONDS) + .until(() -> isUDPPortAvailable(clientPort)); + } } if (lwM2MDevice != null) { lwM2MDevice.destroy(); From 4bd812b6fdcabe022ba52ad0449067fc601d561f Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 19:33:56 +0100 Subject: [PATCH 233/579] tests: LWM2M transport refactored and fixed to run in parallel. Improved UPD port operation experience for stability. additional logs added --- .../lwm2m/AbstractLwM2MIntegrationTest.java | 61 ++++++++++++------- .../transport/lwm2m/client/FwLwM2MDevice.java | 2 +- .../lwm2m/client/LwM2MTestClient.java | 24 +++++++- .../lwm2m/client/LwM2mTemperatureSensor.java | 1 + .../AbstractSecurityLwM2MIntegrationTest.java | 4 +- .../security/sql/PskLwm2mIntegrationTest.java | 4 +- pom.xml | 15 ++++- 7 files changed, 81 insertions(+), 30 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java index c323df200a..8d0f0f2af0 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java @@ -38,6 +38,8 @@ import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.http.HttpStatus; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.ThingsBoardExecutors; @@ -84,8 +86,8 @@ import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; import org.thingsboard.server.transport.lwm2m.server.client.ResourceUpdateResult; import org.thingsboard.server.transport.lwm2m.server.uplink.DefaultLwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; +import org.thingsboard.server.utils.PortFinder; -import java.net.ServerSocket; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -140,13 +142,27 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportInte private LwM2mClientContext clientContextTest; // Lwm2m Server - public static final int port = 5685; - public static final int securityPort = 5686; - public static final int portBs = 5687; - public static final int securityPortBs = 5688; + public static final String LWM2M_HOST = "localhost"; + public static final int LWM2M_PORT = PortFinder.findAvailableUdpPort(); // 5685 + public static final int LWM2MS_PORT = PortFinder.findAvailableUdpPort(); //5686 + + public static final String LWM2M_BOOTSTRAP_HOST = "localhost"; + public static final int LWM2M_BOOTSTRAP_PORT = PortFinder.findAvailableUdpPort(); // 5687 + public static final int LWM2MS_BOOTSTRAP_PORT = PortFinder.findAvailableUdpPort(); // 5688 + + @DynamicPropertySource + static void props(DynamicPropertyRegistry registry) { + log.warn("transport.lwm2m.server.bind_port = {}", LWM2M_PORT); + registry.add("transport.lwm2m.server.bind_port", () -> LWM2M_PORT); + log.warn("transport.lwm2m.server.security.bind_port = {}", LWM2MS_PORT); + registry.add("transport.lwm2m.server.security.bind_port", () -> LWM2MS_PORT); + + log.warn("transport.lwm2m.bootstrap.bind_port = {}", LWM2M_BOOTSTRAP_PORT); + registry.add("transport.lwm2m.bootstrap.bind_port", () -> LWM2M_BOOTSTRAP_PORT); + log.warn("transport.lwm2m.bootstrap.security.bind_port = {}", LWM2MS_BOOTSTRAP_PORT); + registry.add("transport.lwm2m.bootstrap.security.bind_port", () -> LWM2MS_BOOTSTRAP_PORT); + } - public static final String host = "localhost"; - public static final String hostBs = "localhost"; public static final Integer shortServerId = 123; public static final Integer shortServerIdBs0 = 0; public static final int serverId = 1; @@ -154,10 +170,10 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportInte public static final String COAP = "coap://"; public static final String COAPS = "coaps://"; - public static final String URI = COAP + host + ":" + port; - public static final String SECURE_URI = COAPS + host + ":" + securityPort; - public static final String URI_BS = COAP + hostBs + ":" + portBs; - public static final String SECURE_URI_BS = COAPS + hostBs + ":" + securityPortBs; + public static final String URI = COAP + LWM2M_HOST + ":" + LWM2M_PORT; + public static final String SECURE_URI = COAPS + LWM2M_HOST + ":" + LWM2MS_PORT; + public static final String URI_BS = COAP + LWM2M_BOOTSTRAP_HOST + ":" + LWM2M_BOOTSTRAP_PORT; + public static final String SECURE_URI_BS = COAPS + LWM2M_BOOTSTRAP_HOST + ":" + LWM2MS_BOOTSTRAP_PORT; public static final Security SECURITY_NO_SEC = noSec(URI, shortServerId); protected final String OBSERVE_ATTRIBUTES_WITHOUT_PARAMS = @@ -572,12 +588,11 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportInte this.clientDestroy(false); lwM2MTestClient = new LwM2MTestClient(this.executor, endpoint, resources); - try (ServerSocket socket = new ServerSocket(0)) { - int clientPort = socket.getLocalPort(); - lwM2MTestClient.init(security, securityBs, clientPort, isRpc, - this.defaultLwM2mUplinkMsgHandlerTest, this.clientContextTest, - clientDtlsCidLength, queueMode, supportFormatOnly_SenMLJSON_SenMLCBOR, value3_0_9); - } + int clientPort = PortFinder.findAvailableUdpPort(); + //automatic client port assignment + lwM2MTestClient.init(security, securityBs, 0 /* clientPort */, isRpc, + this.defaultLwM2mUplinkMsgHandlerTest, this.clientContextTest, + clientDtlsCidLength, queueMode, supportFormatOnly_SenMLJSON_SenMLCBOR, value3_0_9); lwM2MTestClient.setDeviceIdStr(deviceIdStr); } @@ -715,8 +730,8 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportInte bootstrapServerCredential.setServerPublicKey(""); bootstrapServerCredential.setShortServerId(isBootstrap ? shortServerIdBs0 : shortServerId); bootstrapServerCredential.setBootstrapServerIs(isBootstrap); - bootstrapServerCredential.setHost(isBootstrap ? hostBs : host); - bootstrapServerCredential.setPort(isBootstrap ? portBs : port); + bootstrapServerCredential.setHost(isBootstrap ? LWM2M_BOOTSTRAP_HOST : LWM2M_HOST); + bootstrapServerCredential.setPort(isBootstrap ? LWM2M_BOOTSTRAP_PORT : LWM2M_PORT); return bootstrapServerCredential; } @@ -731,11 +746,15 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportInte return credentials; } - protected void awaitObserveReadAll(int cntObserve, String deviceIdStr) throws Exception { + awaitObserveReadAll(cntObserve, deviceIdStr, ""); + } + + protected void awaitObserveReadAll(int cntObserve, String deviceIdStr, String assertionAlias) throws Exception { try { await("ObserveReadAll: countObserve " + cntObserve) - .atMost(40, TimeUnit.SECONDS) + .alias(assertionAlias) + .atMost(TIMEOUT, TimeUnit.SECONDS) .until(() -> cntObserve == getCntObserveAll(deviceIdStr)); } catch (ConditionTimeoutException e) { int current = getCntObserveAll(deviceIdStr); diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/FwLwM2MDevice.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/FwLwM2MDevice.java index e2d57077a3..979a2b8c96 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/FwLwM2MDevice.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/FwLwM2MDevice.java @@ -33,7 +33,6 @@ import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicInteger; import static org.thingsboard.server.dao.service.OtaPackageServiceTest.TARGET_FW_VERSION; import static org.thingsboard.server.dao.service.OtaPackageServiceTest.TITLE; @@ -137,6 +136,7 @@ public class FwLwM2MDevice extends BaseInstanceEnabler implements Destroyable { @Override public void destroy() { scheduler.shutdownNow(); + this.leshanClient = null; } private void startDownloading() { diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MTestClient.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MTestClient.java index 37b30dca97..908c2d52d3 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MTestClient.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MTestClient.java @@ -78,6 +78,7 @@ import java.util.Set; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import static org.awaitility.Awaitility.await; import static org.eclipse.californium.scandium.config.DtlsConfig.DTLS_CONNECTION_ID_LENGTH; import static org.eclipse.californium.scandium.config.DtlsConfig.DTLS_RECOMMENDED_CIPHER_SUITES_ONLY; import static org.eclipse.leshan.core.LwM2mId.ACCESS_CONTROL; @@ -88,6 +89,7 @@ import static org.eclipse.leshan.core.LwM2mId.SECURITY; import static org.eclipse.leshan.core.LwM2mId.SERVER; import static org.eclipse.leshan.core.LwM2mId.SOFTWARE_MANAGEMENT; import static org.eclipse.leshan.core.node.codec.DefaultLwM2mEncoder.getDefaultPathEncoder; +import static org.thingsboard.server.transport.AbstractTransportIntegrationTest.DEFAULT_WAIT_TIMEOUT_SECONDS; import static org.thingsboard.server.transport.lwm2m.AbstractLwM2MIntegrationTest.serverId; import static org.thingsboard.server.transport.lwm2m.AbstractLwM2MIntegrationTest.serverIdBs; import static org.thingsboard.server.transport.lwm2m.AbstractLwM2MIntegrationTest.shortServerId; @@ -118,6 +120,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.OBJECT_INST import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.TEMPERATURE_SENSOR; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.lwm2mClientResources; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.setDtlsConnectorConfigCidLength; +import static org.thingsboard.server.utils.PortFinder.isUDPPortAvailable; @Slf4j @@ -140,12 +143,14 @@ public class LwM2MTestClient { private LwM2mClientContext clientContext; private LwM2mTemperatureSensor lwM2mTemperatureSensor12; private String deviceIdStr; + private int clientPort; - public void init(Security security, Security securityBs, int port, boolean isRpc, + public void init(Security security, Security securityBs, int clientPort, boolean isRpc, LwM2mUplinkMsgHandler defaultLwM2mUplinkMsgHandler, LwM2mClientContext clientContext, Integer cIdLength, boolean queueMode, boolean supportFormatOnly_SenMLJSON_SenMLCBOR, Integer value3_0_9) throws InvalidDDFFileException, IOException { Assert.assertNull("client already initialized", leshanClient); + this.clientPort = clientPort; this.defaultLwM2mUplinkMsgHandlerTest = defaultLwM2mUplinkMsgHandler; this.clientContext = clientContext; @@ -266,7 +271,7 @@ public class LwM2MTestClient { // Set Californium Configuration endpointsBuilder.setConfiguration(clientCoapConfig); - endpointsBuilder.setClientAddress(new InetSocketAddress(port).getAddress()); + endpointsBuilder.setClientAddress(new InetSocketAddress(clientPort).getAddress()); // creates EndpointsProvider @@ -461,10 +466,19 @@ public class LwM2MTestClient { if (lwM2MTemperatureSensor != null) { lwM2MTemperatureSensor.destroy(); } + if (lwM2mTemperatureSensor12 != null) { + lwM2mTemperatureSensor12.destroy(); + } } public void start(boolean isStartLw) { if (leshanClient != null) { + if (clientPort > 0) { + log.error("Await UDP clientPort {} to be available before leshanClient.start()", clientPort); + await("Await UDP clientPort " + clientPort + " to be available before leshanClient.start()") + .atMost(DEFAULT_WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS) + .until(() -> isUDPPortAvailable(clientPort)); + } leshanClient.start(); if (isStartLw) { this.awaitClientAfterStartConnectLw(); @@ -477,6 +491,12 @@ public class LwM2MTestClient { public void stop(boolean deregister) { if (leshanClient != null) { leshanClient.stop(deregister); + if (clientPort > 0) { + log.error("Await UDP clientPort {} to disconnect after leshanClient.stop(deregister)", clientPort); + await("Await client UDP port " + clientPort + " to disconnect after leshanClient.stop(deregister)") + .atMost(DEFAULT_WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS) + .until(() -> isUDPPortAvailable(clientPort)); + } } } diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2mTemperatureSensor.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2mTemperatureSensor.java index 64978af44d..bca551e989 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2mTemperatureSensor.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2mTemperatureSensor.java @@ -169,6 +169,7 @@ public class LwM2mTemperatureSensor extends BaseInstanceEnabler implements Destr @Override public void destroy() { + this.leshanClient = null; } private void sendCollected() { diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/AbstractSecurityLwM2MIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/AbstractSecurityLwM2MIntegrationTest.java index d6e9e2d9b0..4adc398fa8 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/AbstractSecurityLwM2MIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/AbstractSecurityLwM2MIntegrationTest.java @@ -359,8 +359,8 @@ public abstract class AbstractSecurityLwM2MIntegrationTest extends AbstractLwM2M } bootstrapServerCredential.setShortServerId(isBootstrap ? shortServerIdBs0 : shortServerId); bootstrapServerCredential.setBootstrapServerIs(isBootstrap); - bootstrapServerCredential.setHost(isBootstrap ? hostBs : host); - bootstrapServerCredential.setPort(isBootstrap ? securityPortBs : securityPort); + bootstrapServerCredential.setHost(isBootstrap ? LWM2M_BOOTSTRAP_HOST : LWM2M_HOST); + bootstrapServerCredential.setPort(isBootstrap ? LWM2MS_BOOTSTRAP_PORT : LWM2MS_PORT); return bootstrapServerCredential; } diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/PskLwm2mIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/PskLwm2mIntegrationTest.java index 420ebd16b2..29beace952 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/PskLwm2mIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/PskLwm2mIntegrationTest.java @@ -136,7 +136,7 @@ public class PskLwm2mIntegrationTest extends AbstractSecurityLwM2MIntegrationTes ON_REGISTRATION_SUCCESS, true); - awaitObserveReadAll(1, lwm2mDevice.getId().getId().toString()); + awaitObserveReadAll(1, lwm2mDevice.getId().getId().toString(), "before client stops for the first time"); lwM2MTestClient.stop(true); DeviceProfile foundDeviceProfile = doGet("/api/deviceProfile/" + lwm2mDevice.getDeviceProfileId().getId().toString(), DeviceProfile.class); @@ -146,7 +146,7 @@ public class PskLwm2mIntegrationTest extends AbstractSecurityLwM2MIntegrationTes Assert.assertNotNull(lwm2mDeviceProfileManyParams); lwM2MTestClient.start(true); - awaitObserveReadAll(1, lwm2mDevice.getId().getId().toString()); + awaitObserveReadAll(1, lwm2mDevice.getId().getId().toString(), "second after client restart"); awaitUpdateReg(3); } diff --git a/pom.xml b/pom.xml index 58e0c32e43..8f5708bcec 100755 --- a/pom.xml +++ b/pom.xml @@ -172,6 +172,16 @@ true + + default-surefire-java-opts + + + !env.SUREFIRE_JAVA_OPTS + + + + + @@ -664,8 +674,9 @@ -XX:+UseStringDeduplication -XX:MaxGCPauseMillis=200 --add-opens=java.base/java.lang.reflect=ALL-UNNAMED - -Dqueue.edqs.local.rocksdb_path="target/rocks/fork_${surefire.forkNumber}/edqs" - -Dqueue.calculated_fields.rocks_db_path="target/rocks/fork_${surefire.forkNumber}/cf" + -Dqueue.edqs.local.rocksdb_path="target/rocksdb/fork_${surefire.forkNumber}/edqs" + -Dqueue.calculated_fields.rocks_db_path="target/rocksdb/fork_${surefire.forkNumber}/cf" + ${env.SUREFIRE_JAVA_OPTS} From 342060c54a75a49b2d4e5609ba373db9079d4dc3 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 22 Jan 2026 23:36:58 +0100 Subject: [PATCH 234/579] tests: fixed EdgeImitator usage in controller test by providing Modifiable Deque getDownlinkMsgsDeque --- .../server/controller/EdgeControllerTest.java | 87 ++++++++++--------- .../server/edge/imitator/EdgeImitator.java | 5 ++ 2 files changed, 49 insertions(+), 43 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java index 0d0de0a66c..fc65d67949 100644 --- a/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java @@ -102,6 +102,7 @@ import org.thingsboard.server.service.edge.instructions.EdgeUpgradeInstructionsS import java.util.ArrayList; import java.util.Collections; +import java.util.Deque; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -924,11 +925,11 @@ public class EdgeControllerTest extends AbstractControllerTest { verifyFetchersMsgs(edgeImitator, savedDevice); // verify queue msgs - Assert.assertTrue(popDeviceProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); - Assert.assertTrue(popDeviceMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Test Sync Edge Device 1")); - Assert.assertTrue(popDeviceCredentialsMsg(edgeImitator.getDownlinkMsgs(), savedDevice.getId())); - Assert.assertTrue(popAssetProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); - Assert.assertTrue(popAssetMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Test Sync Edge Asset 1")); + Assert.assertTrue(popDeviceProfileMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); + Assert.assertTrue(popDeviceMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Test Sync Edge Device 1")); + Assert.assertTrue(popDeviceCredentialsMsg(edgeImitator.getDownlinkMsgsDeque(), savedDevice.getId())); + Assert.assertTrue(popAssetProfileMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); + Assert.assertTrue(popAssetMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Test Sync Edge Asset 1")); printQueueMsgsIfNotEmpty(edgeImitator); // 17 connect messages @@ -1008,32 +1009,32 @@ public class EdgeControllerTest extends AbstractControllerTest { } private void verifyFetchersMsgs(EdgeImitator edgeImitator, Device savedDevice) { - Assert.assertTrue(popQueueMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Main")); - Assert.assertTrue(popRuleChainMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Edge Root Rule Chain")); - Assert.assertTrue(popRuleChainMetadataMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, getEdgeRootRuleChainId(edgeImitator))); - Assert.assertTrue(popAdminSettingsMsg(edgeImitator.getDownlinkMsgs(), "general")); - Assert.assertTrue(popAdminSettingsMsg(edgeImitator.getDownlinkMsgs(), "mail")); - Assert.assertTrue(popAdminSettingsMsg(edgeImitator.getDownlinkMsgs(), "connectivity")); - Assert.assertTrue(popAdminSettingsMsg(edgeImitator.getDownlinkMsgs(), "jwt")); - Assert.assertTrue(popDeviceProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); - Assert.assertTrue(popDeviceProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); - Assert.assertTrue(popAssetProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); - Assert.assertTrue(popDeviceProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); - Assert.assertTrue(popAssetProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); - Assert.assertTrue(popUserCredentialsMsg(edgeImitator.getDownlinkMsgs(), currentUserId)); - Assert.assertTrue(popUserMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, TENANT_ADMIN_EMAIL, Authority.TENANT_ADMIN)); - Assert.assertTrue(popCustomerMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Public")); - Assert.assertTrue(popDeviceProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); - Assert.assertTrue(popDeviceMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Test Sync Edge Device 1")); - Assert.assertTrue(popDeviceCredentialsMsg(edgeImitator.getDownlinkMsgs(), savedDevice.getId())); - Assert.assertTrue(popAssetProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); - Assert.assertTrue(popAssetMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Test Sync Edge Asset 1")); - Assert.assertTrue(popTenantMsg(edgeImitator.getDownlinkMsgs(), tenantId)); - Assert.assertTrue(popTenantProfileMsg(edgeImitator.getDownlinkMsgs(), tenantProfileId)); - Assert.assertTrue(popSyncCompletedMsg(edgeImitator.getDownlinkMsgs())); + Assert.assertTrue(popQueueMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Main")); + Assert.assertTrue(popRuleChainMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Edge Root Rule Chain")); + Assert.assertTrue(popRuleChainMetadataMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, getEdgeRootRuleChainId(edgeImitator))); + Assert.assertTrue(popAdminSettingsMsg(edgeImitator.getDownlinkMsgsDeque(), "general")); + Assert.assertTrue(popAdminSettingsMsg(edgeImitator.getDownlinkMsgsDeque(), "mail")); + Assert.assertTrue(popAdminSettingsMsg(edgeImitator.getDownlinkMsgsDeque(), "connectivity")); + Assert.assertTrue(popAdminSettingsMsg(edgeImitator.getDownlinkMsgsDeque(), "jwt")); + Assert.assertTrue(popDeviceProfileMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); + Assert.assertTrue(popDeviceProfileMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); + Assert.assertTrue(popAssetProfileMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); + Assert.assertTrue(popDeviceProfileMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); + Assert.assertTrue(popAssetProfileMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); + Assert.assertTrue(popUserCredentialsMsg(edgeImitator.getDownlinkMsgsDeque(), currentUserId)); + Assert.assertTrue(popUserMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, TENANT_ADMIN_EMAIL, Authority.TENANT_ADMIN)); + Assert.assertTrue(popCustomerMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Public")); + Assert.assertTrue(popDeviceProfileMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); + Assert.assertTrue(popDeviceMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Test Sync Edge Device 1")); + Assert.assertTrue(popDeviceCredentialsMsg(edgeImitator.getDownlinkMsgsDeque(), savedDevice.getId())); + Assert.assertTrue(popAssetProfileMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); + Assert.assertTrue(popAssetMsg(edgeImitator.getDownlinkMsgsDeque(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Test Sync Edge Asset 1")); + Assert.assertTrue(popTenantMsg(edgeImitator.getDownlinkMsgsDeque(), tenantId)); + Assert.assertTrue(popTenantProfileMsg(edgeImitator.getDownlinkMsgsDeque(), tenantProfileId)); + Assert.assertTrue(popSyncCompletedMsg(edgeImitator.getDownlinkMsgsDeque())); } - private boolean popQueueMsg(List messages, UpdateMsgType msgType, String name) { + private boolean popQueueMsg(Deque messages, UpdateMsgType msgType, String name) { for (AbstractMessage message : messages) { if (message instanceof QueueUpdateMsg queueUpdateMsg) { Queue queue = JacksonUtil.fromString(queueUpdateMsg.getEntity(), Queue.class, true); @@ -1047,7 +1048,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popRuleChainMsg(List messages, UpdateMsgType msgType, String name) { + private boolean popRuleChainMsg(Deque messages, UpdateMsgType msgType, String name) { for (AbstractMessage message : messages) { if (message instanceof RuleChainUpdateMsg ruleChainUpdateMsg) { RuleChain ruleChain = JacksonUtil.fromString(ruleChainUpdateMsg.getEntity(), RuleChain.class, true); @@ -1063,7 +1064,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popRuleChainMetadataMsg(List messages, UpdateMsgType msgType, RuleChainId ruleChainId) { + private boolean popRuleChainMetadataMsg(Deque messages, UpdateMsgType msgType, RuleChainId ruleChainId) { for (AbstractMessage message : messages) { if (message instanceof RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg) { RuleChainMetaData ruleChainMetaData = JacksonUtil.fromString(ruleChainMetadataUpdateMsg.getEntity(), RuleChainMetaData.class, true); @@ -1078,7 +1079,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popAdminSettingsMsg(List messages, String key) { + private boolean popAdminSettingsMsg(Deque messages, String key) { for (AbstractMessage message : messages) { if (message instanceof AdminSettingsUpdateMsg adminSettingsUpdateMsg) { AdminSettings adminSettings = JacksonUtil.fromString(adminSettingsUpdateMsg.getEntity(), AdminSettings.class, true); @@ -1092,7 +1093,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popDeviceProfileMsg(List messages, UpdateMsgType msgType, String name) { + private boolean popDeviceProfileMsg(Deque messages, UpdateMsgType msgType, String name) { for (AbstractMessage message : messages) { if (message instanceof DeviceProfileUpdateMsg deviceProfileUpdateMsg) { DeviceProfile deviceProfile = JacksonUtil.fromString(deviceProfileUpdateMsg.getEntity(), DeviceProfile.class, true); @@ -1107,7 +1108,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popDeviceMsg(List messages, UpdateMsgType msgType, String name) { + private boolean popDeviceMsg(Deque messages, UpdateMsgType msgType, String name) { for (AbstractMessage message : messages) { if (message instanceof DeviceUpdateMsg deviceUpdateMsg) { Device device = JacksonUtil.fromString(deviceUpdateMsg.getEntity(), Device.class, true); @@ -1122,7 +1123,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popDeviceCredentialsMsg(List messages, DeviceId deviceId) { + private boolean popDeviceCredentialsMsg(Deque messages, DeviceId deviceId) { for (AbstractMessage message : messages) { if (message instanceof DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg) { DeviceCredentials deviceCredentials = JacksonUtil.fromString(deviceCredentialsUpdateMsg.getEntity(), DeviceCredentials.class, true); @@ -1136,7 +1137,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popAssetProfileMsg(List messages, UpdateMsgType msgType, String name) { + private boolean popAssetProfileMsg(Deque messages, UpdateMsgType msgType, String name) { for (AbstractMessage message : messages) { if (message instanceof AssetProfileUpdateMsg assetProfileUpdateMsg) { AssetProfile assetProfile = JacksonUtil.fromString(assetProfileUpdateMsg.getEntity(), AssetProfile.class, true); @@ -1151,7 +1152,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popAssetMsg(List messages, UpdateMsgType msgType, String name) { + private boolean popAssetMsg(Deque messages, UpdateMsgType msgType, String name) { for (AbstractMessage message : messages) { if (message instanceof AssetUpdateMsg assetUpdateMsg) { Asset asset = JacksonUtil.fromString(assetUpdateMsg.getEntity(), Asset.class, true); @@ -1166,7 +1167,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popUserCredentialsMsg(List messages, UserId userId) { + private boolean popUserCredentialsMsg(Deque messages, UserId userId) { for (AbstractMessage message : messages) { if (message instanceof UserCredentialsUpdateMsg userCredentialsUpdateMsg) { UserCredentials userCredentials = JacksonUtil.fromString(userCredentialsUpdateMsg.getEntity(), UserCredentials.class, true); @@ -1180,7 +1181,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popUserMsg(List messages, UpdateMsgType msgType, String email, Authority authority) { + private boolean popUserMsg(Deque messages, UpdateMsgType msgType, String email, Authority authority) { for (AbstractMessage message : messages) { if (message instanceof UserUpdateMsg userUpdateMsg) { User user = JacksonUtil.fromString(userUpdateMsg.getEntity(), User.class, true); @@ -1196,7 +1197,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popCustomerMsg(List messages, UpdateMsgType msgType, String title) { + private boolean popCustomerMsg(Deque messages, UpdateMsgType msgType, String title) { for (AbstractMessage message : messages) { if (message instanceof CustomerUpdateMsg customerUpdateMsg) { Customer customer = JacksonUtil.fromString(customerUpdateMsg.getEntity(), Customer.class, true); @@ -1211,7 +1212,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popTenantMsg(List messages, TenantId tenantId1) { + private boolean popTenantMsg(Deque messages, TenantId tenantId1) { for (AbstractMessage message : messages) { if (message instanceof TenantUpdateMsg tenantUpdateMsg) { Tenant tenant = JacksonUtil.fromString(tenantUpdateMsg.getEntity(), Tenant.class, true); @@ -1226,7 +1227,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popTenantProfileMsg(List messages, TenantProfileId tenantProfileId) { + private boolean popTenantProfileMsg(Deque messages, TenantProfileId tenantProfileId) { for (AbstractMessage message : messages) { if (message instanceof TenantProfileUpdateMsg tenantProfileUpdateMsg) { TenantProfile tenantProfile = JacksonUtil.fromString(tenantProfileUpdateMsg.getEntity(), TenantProfile.class, true); @@ -1241,7 +1242,7 @@ public class EdgeControllerTest extends AbstractControllerTest { return false; } - private boolean popSyncCompletedMsg(List messages) { + private boolean popSyncCompletedMsg(Deque messages) { for (AbstractMessage message : messages) { if (message instanceof SyncCompletedMsg) { messages.remove(message); diff --git a/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java b/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java index d1596b1c59..266a4dbb62 100644 --- a/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java +++ b/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java @@ -68,6 +68,7 @@ import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg; import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.Deque; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -111,6 +112,10 @@ public class EdgeImitator { return downlinkMsgs.stream().toList(); } + public Deque getDownlinkMsgsDeque() { + return downlinkMsgs; + } + @Getter private UplinkResponseMsg latestResponseMsg; From 29812b0c8dae1e5d533d387aa5a861174f17aa08 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Fri, 23 Jan 2026 00:16:33 +0100 Subject: [PATCH 235/579] tests: noted how to run tests in parallel fast --- TEST_FAST.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 TEST_FAST.md diff --git a/TEST_FAST.md b/TEST_FAST.md new file mode 100644 index 0000000000..4219d7470b --- /dev/null +++ b/TEST_FAST.md @@ -0,0 +1,27 @@ + +## Running tests in parallel with a reasonable memory usage + +```bash +mvn clean install -T6 -DskipTests +mvn test -pl='!application,!dao,!ui-ngx,!msa/js-executor,!msa/web-ui' -T4 +mvn test -pl dao -Dparallel=packages -DforkCount=4 + +mvn test -pl application -Dsurefire.excludes='**/nosql/*Test.java' -Dtest='org.thingsboard.server.controller.**' -DforkCount=6 -Dparallel=classes -Dsurefire.rerunFailingTestsCount=2 -Dsurefire.failOnFlakeCount=5 +mvn test -pl application -Dsurefire.excludes='**/nosql/*Test.java' -Dtest='org.thingsboard.server.edge.**' -DforkCount=4 -Dparallel=packages -Dsurefire.rerunFailingTestsCount=2 -Dsurefire.failOnFlakeCount=5 +mvn test -pl application -Dsurefire.excludes='**/nosql/*Test.java' -Dtest='org.thingsboard.server.service.**' -DforkCount=6 -Dparallel=packages -Dsurefire.rerunFailingTestsCount=2 -Dsurefire.failOnFlakeCount=5 +mvn test -pl application -Dsurefire.excludes='**/nosql/*Test.java' -Dtest='org.thingsboard.server.transport.mqtt.**' -DforkCount=6 -Dparallel=classes -Dsurefire.rerunFailingTestsCount=2 -Dsurefire.failOnFlakeCount=5 +mvn test -pl application -Dsurefire.excludes='**/nosql/*Test.java' -Dtest='org.thingsboard.server.transport.coap.**' -DforkCount=6 -Dparallel=classes -Dsurefire.rerunFailingTestsCount=2 -Dsurefire.failOnFlakeCount=5 +mvn test -pl application -Dsurefire.excludes='**/nosql/*Test.java' -Dtest='org.thingsboard.server.transport.lwm2m.**' -DforkCount=6 -Dparallel=packages -Dsurefire.rerunFailingTestsCount=2 -Dsurefire.failOnFlakeCount=5 +mvn test -pl application -Dsurefire.excludes='**/nosql/*Test.java' -Dtest='**/*TestSuite.java' -DforkCount=4 -Dparallel=classes -Dsurefire.rerunFailingTestsCount=2 -Dsurefire.failOnFlakeCount=5 + +#the rest of application tests +mvn test -pl application -Dtest=' +!**/nosql/*Test.java, +!org.thingsboard.server.controller.**, +!org.thingsboard.server.edge.**, +!org.thingsboard.server.service.**, +!org.thingsboard.server.transport.mqtt.**, +!org.thingsboard.server.transport.coap.**, +!org.thingsboard.server.transport.lwm2m.** +' -DforkCount=6 -Dparallel=packages -Dsurefire.rerunFailingTestsCount=2 -Dsurefire.failOnFlakeCount=5 +``` From da608805af3f946e233716ee0e9c4a23c0bcea28 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Fri, 23 Jan 2026 07:59:17 +0100 Subject: [PATCH 236/579] test example for memory management --- TEST_FAST.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/TEST_FAST.md b/TEST_FAST.md index 4219d7470b..c0f1174584 100644 --- a/TEST_FAST.md +++ b/TEST_FAST.md @@ -2,6 +2,10 @@ ## Running tests in parallel with a reasonable memory usage ```bash +export MAVEN_OPTS="-Xmx1024m" +export NODE_OPTIONS="--max_old_space_size=4096" +export SUREFIRE_JAVA_OPTS="-Xmx1200m -Xss256k -XX:+ExitOnOutOfMemoryError" + mvn clean install -T6 -DskipTests mvn test -pl='!application,!dao,!ui-ngx,!msa/js-executor,!msa/web-ui' -T4 mvn test -pl dao -Dparallel=packages -DforkCount=4 From 63301c91ba407eeab1993db867c2431039bbacc8 Mon Sep 17 00:00:00 2001 From: Maksym Tsymbarov Date: Fri, 23 Jan 2026 13:03:34 +0200 Subject: [PATCH 237/579] Fixed image upload component to allow refetch on error --- ui-ngx/src/app/core/http/image.service.ts | 9 ++++----- .../components/image/gallery-image-input.component.ts | 7 ++++--- ui-ngx/src/app/shared/pipe/image.pipe.ts | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ui-ngx/src/app/core/http/image.service.ts b/ui-ngx/src/app/core/http/image.service.ts index c714f728c0..896145b351 100644 --- a/ui-ngx/src/app/core/http/image.service.ts +++ b/ui-ngx/src/app/core/http/image.service.ts @@ -31,7 +31,7 @@ import { removeTbImagePrefix, ResourceSubType } from '@shared/models/resource.models'; -import { catchError, map, switchMap } from 'rxjs/operators'; +import { catchError, finalize, map, switchMap } from 'rxjs/operators'; import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; import { blobToBase64, blobToText } from '@core/utils'; import { ResourcesService } from '@core/services/resources.service'; @@ -116,16 +116,15 @@ export class ImageService { request = new ReplaySubject(1); this.imagesLoading[imageLink] = request; const options = defaultHttpOptionsFromConfig({ignoreLoading: true, ignoreErrors: true}); - this.http.get(imageLink, {...options, ...{ responseType: 'blob' } }).subscribe({ + this.http.get(imageLink, {...options, ...{ responseType: 'blob' } }).pipe( + finalize(()=> delete this.imagesLoading[imageLink]) + ).subscribe({ next: (value) => { request.next(value); request.complete(); }, error: err => { request.error(err); - }, - complete: () => { - delete this.imagesLoading[imageLink]; } }); } diff --git a/ui-ngx/src/app/shared/components/image/gallery-image-input.component.ts b/ui-ngx/src/app/shared/components/image/gallery-image-input.component.ts index 421d0ec559..9c5df854a5 100644 --- a/ui-ngx/src/app/shared/components/image/gallery-image-input.component.ts +++ b/ui-ngx/src/app/shared/components/image/gallery-image-input.component.ts @@ -171,9 +171,9 @@ export class GalleryImageInputComponent extends PageComponent implements OnInit, } } - private updateModel(value: string) { + private updateModel(value: string, forcedToUpdate = false): void { this.cd.markForCheck(); - if (this.imageUrl !== value) { + if (this.imageUrl !== value || forcedToUpdate) { this.imageUrl = value; this.propagateChange(prependTbImagePrefix(this.imageUrl)); } @@ -211,9 +211,10 @@ export class GalleryImageInputComponent extends PageComponent implements OnInit, } }).afterClosed().subscribe((image) => { if (image) { + const forcedToUpdate = this.imageUrl === image.link && this.imageResource?.descriptor?.etag !== image.descriptor.etag; this.linkType = ImageLinkType.resource; this.imageResource = image; - this.updateModel(image.link); + this.updateModel(image.link, forcedToUpdate); } }); } diff --git a/ui-ngx/src/app/shared/pipe/image.pipe.ts b/ui-ngx/src/app/shared/pipe/image.pipe.ts index d17ed0ab76..b570da5f24 100644 --- a/ui-ngx/src/app/shared/pipe/image.pipe.ts +++ b/ui-ngx/src/app/shared/pipe/image.pipe.ts @@ -38,7 +38,7 @@ export class ImagePipe implements PipeTransform { private sanitizer: DomSanitizer, private zone: NgZone) { } - transform(urlData: string | UrlHolder, args?: any): Observable { + transform(urlData: string | UrlHolder, args?: any, triggerUpdate?: number): Observable { const ignoreLoadingImage = !!args?.ignoreLoadingImage; const asString = !!args?.asString; const emptyUrl = args?.emptyUrl || NO_IMAGE_DATA_URI; From efead4abd387fcfdccfc163ebe18d5a45bf0712e Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Fri, 23 Jan 2026 13:24:49 +0100 Subject: [PATCH 238/579] tests: fixed LWM2M clientDestroy with PortFinder.isUDPPortAvailable --- .../transport/lwm2m/AbstractLwM2MIntegrationTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java index a0f3f07883..f3a3212e67 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.gson.JsonArray; import com.google.gson.JsonElement; +import jnr.ffi.annotations.In; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.awaitility.core.ConditionTimeoutException; @@ -672,10 +673,9 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportInte try { if (lwM2MTestClient != null && lwM2MTestClient.getLeshanClient() != null) { boolean serverAlive = false; - for (int port = AbstractLwM2MIntegrationTest.port; port <= securityPortBs; port++) { - try (ServerSocket socket = new ServerSocket(port)) { - log.info("Port {} is free.", port); - } catch (IOException e) { + List ports = List.of(LWM2M_PORT, LWM2MS_PORT, LWM2MS_BOOTSTRAP_PORT, LWM2MS_BOOTSTRAP_PORT); + for (Integer port : ports) { + if (!PortFinder.isUDPPortAvailable(port)) { log.debug("Port {} is busy — CoAP server still active.", port); serverAlive = true; break; From 4b0f776c139708193d3b72db3ad20299462dce2f Mon Sep 17 00:00:00 2001 From: Dmytro Zolotarenko Date: Fri, 23 Jan 2026 15:19:19 +0200 Subject: [PATCH 239/579] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6267cc3a7a..77a758ab73 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ ThingsBoard is a scalable, user-friendly, and device-agnostic IoT platform that [**Fleet tracking**](https://thingsboard.io/use-cases/fleet-tracking/) -[![Fleet tracking](https://github.com/user-attachments/assets/9e8938ba-ee0c-4599-9494-d74b7de8a63d "Fleet tracking")](https://thingsboard.io/use-cases/fleet-tracking/) +[![Fleet tracking](https://github.com/user-attachments/assets/d6ce0766-b138-4a42-86aa-7112a543026c "Fleet tracking")](https://thingsboard.io/use-cases/fleet-tracking/) [**Smart farming**](https://thingsboard.io/use-cases/smart-farming/) From 59056658498f8dfa5f50ae831a3994daa5df6af1 Mon Sep 17 00:00:00 2001 From: Dmytro Zolotarenko Date: Fri, 23 Jan 2026 15:24:44 +0200 Subject: [PATCH 240/579] Update README.md, updated use case name --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 77a758ab73..7776b1a964 100644 --- a/README.md +++ b/README.md @@ -123,9 +123,9 @@ ThingsBoard is a scalable, user-friendly, and device-agnostic IoT platform that [![SCADA Swimming pool](https://github.com/user-attachments/assets/68fd9e29-99f1-4c16-8c4c-476f4ccb20c0 "SCADA Swimming pool")](https://thingsboard.io/use-cases/scada/) -[**Fleet tracking**](https://thingsboard.io/use-cases/fleet-tracking/) +[**Site fleet tracking**](https://thingsboard.io/use-cases/site-fleet-tracking/) -[![Fleet tracking](https://github.com/user-attachments/assets/d6ce0766-b138-4a42-86aa-7112a543026c "Fleet tracking")](https://thingsboard.io/use-cases/fleet-tracking/) +[![Site fleet tracking](https://github.com/user-attachments/assets/d6ce0766-b138-4a42-86aa-7112a543026c "Site fleet tracking")](https://thingsboard.io/use-cases/site-fleet-tracking/) [**Smart farming**](https://thingsboard.io/use-cases/smart-farming/) From 7f427b27fb2f9854cc48d1f14dca3f516295ade0 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Fri, 23 Jan 2026 15:37:23 +0200 Subject: [PATCH 241/579] Version set to 4.3.0.1-SNAPSHOT --- application/pom.xml | 2 +- .../main/data/upgrade/basic/schema_update.sql | 66 ------------------- .../install/ThingsboardInstallService.java | 1 - .../DefaultDatabaseSchemaSettingsService.java | 2 +- common/actor/pom.xml | 2 +- common/cache/pom.xml | 2 +- common/cluster-api/pom.xml | 2 +- common/coap-server/pom.xml | 2 +- common/dao-api/pom.xml | 2 +- common/data/pom.xml | 2 +- common/discovery-api/pom.xml | 2 +- common/edge-api/pom.xml | 2 +- common/edqs/pom.xml | 2 +- common/message/pom.xml | 2 +- common/pom.xml | 2 +- common/proto/pom.xml | 2 +- common/queue/pom.xml | 2 +- common/script/pom.xml | 2 +- common/script/remote-js-client/pom.xml | 2 +- common/script/script-api/pom.xml | 2 +- common/stats/pom.xml | 2 +- common/transport/coap/pom.xml | 2 +- common/transport/http/pom.xml | 2 +- common/transport/lwm2m/pom.xml | 2 +- common/transport/mqtt/pom.xml | 2 +- common/transport/pom.xml | 2 +- common/transport/snmp/pom.xml | 2 +- common/transport/transport-api/pom.xml | 2 +- common/util/pom.xml | 2 +- common/version-control/pom.xml | 2 +- dao/pom.xml | 2 +- edqs/pom.xml | 2 +- monitoring/pom.xml | 2 +- msa/black-box-tests/pom.xml | 2 +- msa/edqs/pom.xml | 2 +- msa/js-executor/package.json | 2 +- msa/js-executor/pom.xml | 2 +- msa/monitoring/pom.xml | 2 +- msa/pom.xml | 2 +- msa/tb-node/pom.xml | 2 +- msa/tb/pom.xml | 2 +- msa/transport/coap/pom.xml | 2 +- msa/transport/http/pom.xml | 2 +- msa/transport/lwm2m/pom.xml | 2 +- msa/transport/mqtt/pom.xml | 2 +- msa/transport/pom.xml | 2 +- msa/transport/snmp/pom.xml | 2 +- msa/vc-executor-docker/pom.xml | 2 +- msa/vc-executor/pom.xml | 2 +- msa/web-ui/package.json | 2 +- msa/web-ui/pom.xml | 2 +- netty-mqtt/pom.xml | 4 +- pom.xml | 2 +- rest-client/pom.xml | 2 +- rule-engine/pom.xml | 2 +- rule-engine/rule-engine-api/pom.xml | 2 +- rule-engine/rule-engine-components/pom.xml | 2 +- tools/pom.xml | 2 +- transport/coap/pom.xml | 2 +- transport/http/pom.xml | 2 +- transport/lwm2m/pom.xml | 2 +- transport/mqtt/pom.xml | 2 +- transport/pom.xml | 2 +- transport/snmp/pom.xml | 2 +- ui-ngx/package.json | 2 +- ui-ngx/pom.xml | 2 +- 66 files changed, 65 insertions(+), 132 deletions(-) diff --git a/application/pom.xml b/application/pom.xml index ab26655052..d2cc11f069 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT thingsboard application diff --git a/application/src/main/data/upgrade/basic/schema_update.sql b/application/src/main/data/upgrade/basic/schema_update.sql index 66243461e2..a2dfeac358 100644 --- a/application/src/main/data/upgrade/basic/schema_update.sql +++ b/application/src/main/data/upgrade/basic/schema_update.sql @@ -14,69 +14,3 @@ -- limitations under the License. -- --- UPDATE TENANT PROFILE CONFIGURATION START - -UPDATE tenant_profile -SET profile_data = jsonb_set( - profile_data, - '{configuration}', - jsonb_build_object( - 'minAllowedScheduledUpdateIntervalInSecForCF', 10, - 'maxRelationLevelPerCfArgument', 2, - 'maxRelatedEntitiesToReturnPerCfArgument', 100, - 'minAllowedDeduplicationIntervalInSecForCF', 10, - 'minAllowedAggregationIntervalInSecForCF', 60, - 'intermediateAggregationIntervalInSecForCF', 300, - 'cfReevaluationCheckInterval', 60, - 'alarmsReevaluationInterval', 60 - ) - || - jsonb_strip_nulls(profile_data -> 'configuration') -) -WHERE NOT ( - jsonb_strip_nulls(profile_data -> 'configuration') ?& ARRAY[ - 'minAllowedScheduledUpdateIntervalInSecForCF', - 'maxRelationLevelPerCfArgument', - 'maxRelatedEntitiesToReturnPerCfArgument', - 'minAllowedDeduplicationIntervalInSecForCF', - 'minAllowedAggregationIntervalInSecForCF', - 'intermediateAggregationIntervalInSecForCF', - 'cfReevaluationCheckInterval', - 'alarmsReevaluationInterval' - ] -); - --- UPDATE TENANT PROFILE CONFIGURATION END - --- CALCULATED FIELD UNIQUE CONSTRAINT UPDATE START - -ALTER TABLE calculated_field DROP CONSTRAINT IF EXISTS calculated_field_unq_key; -ALTER TABLE calculated_field ADD CONSTRAINT calculated_field_unq_key UNIQUE (entity_id, type, name); - --- CALCULATED FIELD UNIQUE CONSTRAINT UPDATE END - --- CALCULATED FIELD OUTPUT STRATEGY UPDATE START - -UPDATE calculated_field -SET configuration = jsonb_set( - configuration::jsonb, - '{output}', - (configuration::jsonb -> 'output') - || jsonb_build_object( - 'strategy', - jsonb_build_object( - 'type', 'RULE_CHAIN' - ) - ), - false - ) -WHERE (configuration::jsonb -> 'output' -> 'strategy') IS NULL; - --- CALCULATED FIELD OUTPUT STRATEGY UPDATE END - --- REMOVAL OF CALCULATED FIELD LINKS PERSISTENCE START - -DROP TABLE IF EXISTS calculated_field_link; -ANALYZE calculated_field; - --- REMOVAL OF CALCULATED FIELD LINKS PERSISTENCE END diff --git a/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java b/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java index 8ea989fc01..66695c396f 100644 --- a/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java +++ b/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java @@ -116,7 +116,6 @@ public class ThingsboardInstallService { entityDatabaseSchemaService.createDatabaseIndexes(); // TODO: cleanup update code after each release - systemDataLoaderService.updateDefaultNotificationConfigs(false); // Runs upgrade scripts that are not possible in plain SQL. dataUpdateService.updateData(); diff --git a/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java b/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java index d8bcf666f7..468aa80e6c 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java @@ -31,7 +31,7 @@ public class DefaultDatabaseSchemaSettingsService implements DatabaseSchemaSetti // This list should include all versions that are compatible for the upgrade in 4 digits format (like 4.2.0.0, etc.). // The compatibility cycle usually breaks when we have some scripts written in Java that may not work after a new release. // TODO: don't check the "patch" number, since upgrade is not required for patch releases - private static final List SUPPORTED_VERSIONS_FOR_UPGRADE = List.of("4.2.1.0", "4.2.1.1", "4.2.1.2"); + private static final List SUPPORTED_VERSIONS_FOR_UPGRADE = List.of("4.3.0.0"); private final ProjectInfo projectInfo; private final JdbcTemplate jdbcTemplate; diff --git a/common/actor/pom.xml b/common/actor/pom.xml index bd441e3a58..64727ab3f7 100644 --- a/common/actor/pom.xml +++ b/common/actor/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/cache/pom.xml b/common/cache/pom.xml index 7d22f5d3dc..163c47356d 100644 --- a/common/cache/pom.xml +++ b/common/cache/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/cluster-api/pom.xml b/common/cluster-api/pom.xml index a7240c8b42..9be12f3b18 100644 --- a/common/cluster-api/pom.xml +++ b/common/cluster-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/coap-server/pom.xml b/common/coap-server/pom.xml index 3fba2211d5..2e8aca2ba4 100644 --- a/common/coap-server/pom.xml +++ b/common/coap-server/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/dao-api/pom.xml b/common/dao-api/pom.xml index bcab0249ef..3468f51be0 100644 --- a/common/dao-api/pom.xml +++ b/common/dao-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/data/pom.xml b/common/data/pom.xml index 43f3a5a38e..ccb0eda1f3 100644 --- a/common/data/pom.xml +++ b/common/data/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/discovery-api/pom.xml b/common/discovery-api/pom.xml index 5aa66562ed..9bcf02dd94 100644 --- a/common/discovery-api/pom.xml +++ b/common/discovery-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/edge-api/pom.xml b/common/edge-api/pom.xml index 507bfc73f8..d52074ace6 100644 --- a/common/edge-api/pom.xml +++ b/common/edge-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/edqs/pom.xml b/common/edqs/pom.xml index 5512d47b79..b953da6d11 100644 --- a/common/edqs/pom.xml +++ b/common/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/message/pom.xml b/common/message/pom.xml index 1f6bfb20e1..615989da81 100644 --- a/common/message/pom.xml +++ b/common/message/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/pom.xml b/common/pom.xml index c0140e733d..211578b1d2 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT thingsboard common diff --git a/common/proto/pom.xml b/common/proto/pom.xml index 27ca58ac0e..f024f41992 100644 --- a/common/proto/pom.xml +++ b/common/proto/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/queue/pom.xml b/common/queue/pom.xml index b4fd04ef55..4cb3f449a3 100644 --- a/common/queue/pom.xml +++ b/common/queue/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/script/pom.xml b/common/script/pom.xml index 2a5856782e..5f352fb70b 100644 --- a/common/script/pom.xml +++ b/common/script/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/script/remote-js-client/pom.xml b/common/script/remote-js-client/pom.xml index 6a50189371..d1c71bbd9d 100644 --- a/common/script/remote-js-client/pom.xml +++ b/common/script/remote-js-client/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.3.0.1-SNAPSHOT script org.thingsboard.common.script diff --git a/common/script/script-api/pom.xml b/common/script/script-api/pom.xml index 38e32661d1..0ba928ebe1 100644 --- a/common/script/script-api/pom.xml +++ b/common/script/script-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.3.0.1-SNAPSHOT script org.thingsboard.common.script diff --git a/common/stats/pom.xml b/common/stats/pom.xml index fe35fedaec..d2942cd813 100644 --- a/common/stats/pom.xml +++ b/common/stats/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/transport/coap/pom.xml b/common/transport/coap/pom.xml index bb8213666f..273e7e2a7d 100644 --- a/common/transport/coap/pom.xml +++ b/common/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/http/pom.xml b/common/transport/http/pom.xml index d341540104..cd64cc36d2 100644 --- a/common/transport/http/pom.xml +++ b/common/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/lwm2m/pom.xml b/common/transport/lwm2m/pom.xml index cd579c9011..6f61468ed7 100644 --- a/common/transport/lwm2m/pom.xml +++ b/common/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/mqtt/pom.xml b/common/transport/mqtt/pom.xml index a1e13b9d37..5521d83c13 100644 --- a/common/transport/mqtt/pom.xml +++ b/common/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/pom.xml b/common/transport/pom.xml index 697874ea7e..b1c85d22e3 100644 --- a/common/transport/pom.xml +++ b/common/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/transport/snmp/pom.xml b/common/transport/snmp/pom.xml index 011c01a453..eb6ddc4c16 100644 --- a/common/transport/snmp/pom.xml +++ b/common/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard.common - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport diff --git a/common/transport/transport-api/pom.xml b/common/transport/transport-api/pom.xml index 50a0a07b03..26c15a8c9f 100644 --- a/common/transport/transport-api/pom.xml +++ b/common/transport/transport-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/util/pom.xml b/common/util/pom.xml index c540f756a7..96e393dc57 100644 --- a/common/util/pom.xml +++ b/common/util/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/common/version-control/pom.xml b/common/version-control/pom.xml index ce7102d3f2..f41fe2b4c0 100644 --- a/common/version-control/pom.xml +++ b/common/version-control/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT common org.thingsboard.common diff --git a/dao/pom.xml b/dao/pom.xml index 4ec8d13fd0..0b1874919b 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT thingsboard dao diff --git a/edqs/pom.xml b/edqs/pom.xml index 25c6125d82..57b843bfb9 100644 --- a/edqs/pom.xml +++ b/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT thingsboard edqs diff --git a/monitoring/pom.xml b/monitoring/pom.xml index a1addced5d..23c857204c 100644 --- a/monitoring/pom.xml +++ b/monitoring/pom.xml @@ -21,7 +21,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT thingsboard diff --git a/msa/black-box-tests/pom.xml b/msa/black-box-tests/pom.xml index 425948ae43..6f59dd3a3d 100644 --- a/msa/black-box-tests/pom.xml +++ b/msa/black-box-tests/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/edqs/pom.xml b/msa/edqs/pom.xml index 8de67e23b3..2082f134b0 100644 --- a/msa/edqs/pom.xml +++ b/msa/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/js-executor/package.json b/msa/js-executor/package.json index df1d327c1b..7d4d858f22 100644 --- a/msa/js-executor/package.json +++ b/msa/js-executor/package.json @@ -1,7 +1,7 @@ { "name": "thingsboard-js-executor", "private": true, - "version": "4.3.0", + "version": "4.3.0.1", "description": "ThingsBoard JavaScript Executor Microservice", "main": "server.ts", "bin": "server.js", diff --git a/msa/js-executor/pom.xml b/msa/js-executor/pom.xml index 6bd15adc43..31ea60943d 100644 --- a/msa/js-executor/pom.xml +++ b/msa/js-executor/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/monitoring/pom.xml b/msa/monitoring/pom.xml index fb10c11ec0..188f1f8bb2 100644 --- a/msa/monitoring/pom.xml +++ b/msa/monitoring/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT msa diff --git a/msa/pom.xml b/msa/pom.xml index b5c40015f7..c03701ca93 100644 --- a/msa/pom.xml +++ b/msa/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT thingsboard msa diff --git a/msa/tb-node/pom.xml b/msa/tb-node/pom.xml index 078f2e1756..d6f08dd6f7 100644 --- a/msa/tb-node/pom.xml +++ b/msa/tb-node/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/tb/pom.xml b/msa/tb/pom.xml index 8825ea7e33..f9449f97ce 100644 --- a/msa/tb/pom.xml +++ b/msa/tb/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/transport/coap/pom.xml b/msa/transport/coap/pom.xml index 9222a95ec2..9809bc2b1e 100644 --- a/msa/transport/coap/pom.xml +++ b/msa/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/http/pom.xml b/msa/transport/http/pom.xml index 4ecf529b2c..9ec5f75cd0 100644 --- a/msa/transport/http/pom.xml +++ b/msa/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/lwm2m/pom.xml b/msa/transport/lwm2m/pom.xml index 9aec571309..a43ef587b9 100644 --- a/msa/transport/lwm2m/pom.xml +++ b/msa/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/mqtt/pom.xml b/msa/transport/mqtt/pom.xml index 2ad9d62c9d..75e8da0d74 100644 --- a/msa/transport/mqtt/pom.xml +++ b/msa/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/pom.xml b/msa/transport/pom.xml index f26c27cb4b..60aa6e123f 100644 --- a/msa/transport/pom.xml +++ b/msa/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/transport/snmp/pom.xml b/msa/transport/snmp/pom.xml index a6bb9ebc8f..fb28fbba16 100644 --- a/msa/transport/snmp/pom.xml +++ b/msa/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard.msa transport - 4.3.0-RC + 4.3.0.1-SNAPSHOT org.thingsboard.msa.transport diff --git a/msa/vc-executor-docker/pom.xml b/msa/vc-executor-docker/pom.xml index a740f99743..285761d35a 100644 --- a/msa/vc-executor-docker/pom.xml +++ b/msa/vc-executor-docker/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/vc-executor/pom.xml b/msa/vc-executor/pom.xml index cb71d86ef4..1fbe33abaf 100644 --- a/msa/vc-executor/pom.xml +++ b/msa/vc-executor/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/web-ui/package.json b/msa/web-ui/package.json index 0c22a38465..13d040b836 100644 --- a/msa/web-ui/package.json +++ b/msa/web-ui/package.json @@ -1,7 +1,7 @@ { "name": "thingsboard-web-ui", "private": true, - "version": "4.3.0", + "version": "4.3.0.1", "description": "ThingsBoard Web UI Microservice", "main": "server.ts", "bin": "server.js", diff --git a/msa/web-ui/pom.xml b/msa/web-ui/pom.xml index 40059304ba..0a84e52620 100644 --- a/msa/web-ui/pom.xml +++ b/msa/web-ui/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT msa org.thingsboard.msa diff --git a/netty-mqtt/pom.xml b/netty-mqtt/pom.xml index 4ea598d363..c7c077ef38 100644 --- a/netty-mqtt/pom.xml +++ b/netty-mqtt/pom.xml @@ -19,11 +19,11 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT thingsboard netty-mqtt - 4.3.0-RC + 4.3.0.1-SNAPSHOT jar Netty MQTT Client diff --git a/pom.xml b/pom.xml index 92a002cde0..353c295038 100755 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT pom Thingsboard diff --git a/rest-client/pom.xml b/rest-client/pom.xml index 1b33aca512..86e2613dcd 100644 --- a/rest-client/pom.xml +++ b/rest-client/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT thingsboard rest-client diff --git a/rule-engine/pom.xml b/rule-engine/pom.xml index feb8cbf8f1..a03695f64f 100644 --- a/rule-engine/pom.xml +++ b/rule-engine/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT thingsboard rule-engine diff --git a/rule-engine/rule-engine-api/pom.xml b/rule-engine/rule-engine-api/pom.xml index 7523afc0b6..07719631be 100644 --- a/rule-engine/rule-engine-api/pom.xml +++ b/rule-engine/rule-engine-api/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT rule-engine org.thingsboard.rule-engine diff --git a/rule-engine/rule-engine-components/pom.xml b/rule-engine/rule-engine-components/pom.xml index f9218b69de..97f2ad65b1 100644 --- a/rule-engine/rule-engine-components/pom.xml +++ b/rule-engine/rule-engine-components/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT rule-engine org.thingsboard.rule-engine diff --git a/tools/pom.xml b/tools/pom.xml index 20c8fc95fc..4d94ff81df 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT thingsboard tools diff --git a/transport/coap/pom.xml b/transport/coap/pom.xml index ded25e8260..d9b28c7a5e 100644 --- a/transport/coap/pom.xml +++ b/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/http/pom.xml b/transport/http/pom.xml index 2c83bebd0a..a5d093e726 100644 --- a/transport/http/pom.xml +++ b/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/lwm2m/pom.xml b/transport/lwm2m/pom.xml index e28fd452cf..5e744d7fca 100644 --- a/transport/lwm2m/pom.xml +++ b/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/mqtt/pom.xml b/transport/mqtt/pom.xml index 2bee6f94e4..c53b606704 100644 --- a/transport/mqtt/pom.xml +++ b/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/pom.xml b/transport/pom.xml index 89c0355407..83c0fccd83 100644 --- a/transport/pom.xml +++ b/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT thingsboard transport diff --git a/transport/snmp/pom.xml b/transport/snmp/pom.xml index 38682ade69..39f72755e5 100644 --- a/transport/snmp/pom.xml +++ b/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT transport diff --git a/ui-ngx/package.json b/ui-ngx/package.json index 3403e7a3aa..329f249912 100644 --- a/ui-ngx/package.json +++ b/ui-ngx/package.json @@ -1,6 +1,6 @@ { "name": "thingsboard", - "version": "4.3.0", + "version": "4.3.0.1", "scripts": { "ng": "ng", "start": "node --max_old_space_size=8048 ./node_modules/@angular/cli/bin/ng serve --configuration development --host 0.0.0.0 --open", diff --git a/ui-ngx/pom.xml b/ui-ngx/pom.xml index bc0f5a4ed8..eaca4ec83c 100644 --- a/ui-ngx/pom.xml +++ b/ui-ngx/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0-RC + 4.3.0.1-SNAPSHOT thingsboard org.thingsboard From 7900c51b9db07339a29893e89fa49823a056a1ec Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Fri, 23 Jan 2026 15:57:21 +0200 Subject: [PATCH 242/579] Version set to 4.4.0-SNAPSHOT --- application/pom.xml | 2 +- .../service/install/DefaultDatabaseSchemaSettingsService.java | 2 +- application/src/main/resources/thingsboard.yml | 2 +- common/actor/pom.xml | 2 +- common/cache/pom.xml | 2 +- common/cluster-api/pom.xml | 2 +- common/coap-server/pom.xml | 2 +- common/dao-api/pom.xml | 2 +- common/data/pom.xml | 2 +- common/discovery-api/pom.xml | 2 +- common/edge-api/pom.xml | 2 +- common/edqs/pom.xml | 2 +- common/message/pom.xml | 2 +- common/pom.xml | 2 +- common/proto/pom.xml | 2 +- common/queue/pom.xml | 2 +- common/script/pom.xml | 2 +- common/script/remote-js-client/pom.xml | 2 +- common/script/script-api/pom.xml | 2 +- common/stats/pom.xml | 2 +- common/transport/coap/pom.xml | 2 +- common/transport/http/pom.xml | 2 +- common/transport/lwm2m/pom.xml | 2 +- common/transport/mqtt/pom.xml | 2 +- common/transport/pom.xml | 2 +- common/transport/snmp/pom.xml | 2 +- common/transport/transport-api/pom.xml | 2 +- common/util/pom.xml | 2 +- common/version-control/pom.xml | 2 +- dao/pom.xml | 2 +- edqs/pom.xml | 2 +- monitoring/pom.xml | 2 +- msa/black-box-tests/pom.xml | 2 +- msa/edqs/pom.xml | 2 +- msa/js-executor/package.json | 2 +- msa/js-executor/pom.xml | 2 +- msa/monitoring/pom.xml | 2 +- msa/pom.xml | 4 ++-- msa/tb-node/pom.xml | 2 +- msa/tb/pom.xml | 2 +- msa/transport/coap/pom.xml | 2 +- msa/transport/http/pom.xml | 2 +- msa/transport/lwm2m/pom.xml | 2 +- msa/transport/mqtt/pom.xml | 2 +- msa/transport/pom.xml | 2 +- msa/transport/snmp/pom.xml | 2 +- msa/vc-executor-docker/pom.xml | 2 +- msa/vc-executor/pom.xml | 2 +- msa/web-ui/package.json | 2 +- msa/web-ui/pom.xml | 2 +- netty-mqtt/pom.xml | 4 ++-- pom.xml | 2 +- rest-client/pom.xml | 2 +- rule-engine/pom.xml | 2 +- rule-engine/rule-engine-api/pom.xml | 2 +- rule-engine/rule-engine-components/pom.xml | 2 +- tools/pom.xml | 2 +- transport/coap/pom.xml | 2 +- transport/http/pom.xml | 2 +- transport/lwm2m/pom.xml | 2 +- transport/mqtt/pom.xml | 2 +- transport/pom.xml | 2 +- transport/snmp/pom.xml | 2 +- ui-ngx/package.json | 2 +- ui-ngx/pom.xml | 2 +- 65 files changed, 67 insertions(+), 67 deletions(-) diff --git a/application/pom.xml b/application/pom.xml index d2cc11f069..0f3c9623f9 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT thingsboard application diff --git a/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java b/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java index 468aa80e6c..b692194382 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java @@ -31,7 +31,7 @@ public class DefaultDatabaseSchemaSettingsService implements DatabaseSchemaSetti // This list should include all versions that are compatible for the upgrade in 4 digits format (like 4.2.0.0, etc.). // The compatibility cycle usually breaks when we have some scripts written in Java that may not work after a new release. // TODO: don't check the "patch" number, since upgrade is not required for patch releases - private static final List SUPPORTED_VERSIONS_FOR_UPGRADE = List.of("4.3.0.0"); + private static final List SUPPORTED_VERSIONS_FOR_UPGRADE = List.of("4.3.0.0", "4.3.0.1"); private final ProjectInfo projectInfo; private final JdbcTemplate jdbcTemplate; diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 072e18af69..ef0d83d564 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -217,7 +217,7 @@ ui: # Help parameters help: # Base URL for UI help assets - base-url: "${UI_HELP_BASE_URL:https://raw.githubusercontent.com/thingsboard/thingsboard-ui-help/release-4.3}" + base-url: "${UI_HELP_BASE_URL:https://raw.githubusercontent.com/thingsboard/thingsboard-ui-help/release-4.4}" # Database telemetry parameters database: diff --git a/common/actor/pom.xml b/common/actor/pom.xml index 64727ab3f7..6326c45685 100644 --- a/common/actor/pom.xml +++ b/common/actor/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/cache/pom.xml b/common/cache/pom.xml index 163c47356d..774015fc33 100644 --- a/common/cache/pom.xml +++ b/common/cache/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/cluster-api/pom.xml b/common/cluster-api/pom.xml index 9be12f3b18..5983b96b95 100644 --- a/common/cluster-api/pom.xml +++ b/common/cluster-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/coap-server/pom.xml b/common/coap-server/pom.xml index 2e8aca2ba4..32824826c3 100644 --- a/common/coap-server/pom.xml +++ b/common/coap-server/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/dao-api/pom.xml b/common/dao-api/pom.xml index 3468f51be0..12533cd813 100644 --- a/common/dao-api/pom.xml +++ b/common/dao-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/data/pom.xml b/common/data/pom.xml index ccb0eda1f3..0647e706eb 100644 --- a/common/data/pom.xml +++ b/common/data/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/discovery-api/pom.xml b/common/discovery-api/pom.xml index 9bcf02dd94..c7658bd738 100644 --- a/common/discovery-api/pom.xml +++ b/common/discovery-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/edge-api/pom.xml b/common/edge-api/pom.xml index d52074ace6..b5d7b777da 100644 --- a/common/edge-api/pom.xml +++ b/common/edge-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/edqs/pom.xml b/common/edqs/pom.xml index b953da6d11..549ee1515f 100644 --- a/common/edqs/pom.xml +++ b/common/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/message/pom.xml b/common/message/pom.xml index 615989da81..478368afdc 100644 --- a/common/message/pom.xml +++ b/common/message/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/pom.xml b/common/pom.xml index 211578b1d2..d241646816 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT thingsboard common diff --git a/common/proto/pom.xml b/common/proto/pom.xml index f024f41992..e24705c25a 100644 --- a/common/proto/pom.xml +++ b/common/proto/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/queue/pom.xml b/common/queue/pom.xml index 4cb3f449a3..1cb159b3af 100644 --- a/common/queue/pom.xml +++ b/common/queue/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/script/pom.xml b/common/script/pom.xml index 5f352fb70b..a11d320416 100644 --- a/common/script/pom.xml +++ b/common/script/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/script/remote-js-client/pom.xml b/common/script/remote-js-client/pom.xml index d1c71bbd9d..202cc20bd3 100644 --- a/common/script/remote-js-client/pom.xml +++ b/common/script/remote-js-client/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT script org.thingsboard.common.script diff --git a/common/script/script-api/pom.xml b/common/script/script-api/pom.xml index 0ba928ebe1..b074db321a 100644 --- a/common/script/script-api/pom.xml +++ b/common/script/script-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT script org.thingsboard.common.script diff --git a/common/stats/pom.xml b/common/stats/pom.xml index d2942cd813..da650623f9 100644 --- a/common/stats/pom.xml +++ b/common/stats/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/transport/coap/pom.xml b/common/transport/coap/pom.xml index 273e7e2a7d..76ac33b450 100644 --- a/common/transport/coap/pom.xml +++ b/common/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/http/pom.xml b/common/transport/http/pom.xml index cd64cc36d2..275a497b6e 100644 --- a/common/transport/http/pom.xml +++ b/common/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/lwm2m/pom.xml b/common/transport/lwm2m/pom.xml index 6f61468ed7..f47255ac7e 100644 --- a/common/transport/lwm2m/pom.xml +++ b/common/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/mqtt/pom.xml b/common/transport/mqtt/pom.xml index 5521d83c13..985c2a82f6 100644 --- a/common/transport/mqtt/pom.xml +++ b/common/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/transport/pom.xml b/common/transport/pom.xml index b1c85d22e3..810b22670a 100644 --- a/common/transport/pom.xml +++ b/common/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/transport/snmp/pom.xml b/common/transport/snmp/pom.xml index eb6ddc4c16..f98b2426dc 100644 --- a/common/transport/snmp/pom.xml +++ b/common/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard.common - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport diff --git a/common/transport/transport-api/pom.xml b/common/transport/transport-api/pom.xml index 26c15a8c9f..73e0bdeec0 100644 --- a/common/transport/transport-api/pom.xml +++ b/common/transport/transport-api/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.common - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.common.transport diff --git a/common/util/pom.xml b/common/util/pom.xml index 96e393dc57..f3077d49c3 100644 --- a/common/util/pom.xml +++ b/common/util/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/common/version-control/pom.xml b/common/version-control/pom.xml index f41fe2b4c0..d9e134128d 100644 --- a/common/version-control/pom.xml +++ b/common/version-control/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT common org.thingsboard.common diff --git a/dao/pom.xml b/dao/pom.xml index 0b1874919b..928a107079 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT thingsboard dao diff --git a/edqs/pom.xml b/edqs/pom.xml index 57b843bfb9..1081b89276 100644 --- a/edqs/pom.xml +++ b/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT thingsboard edqs diff --git a/monitoring/pom.xml b/monitoring/pom.xml index 23c857204c..391347e56b 100644 --- a/monitoring/pom.xml +++ b/monitoring/pom.xml @@ -21,7 +21,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT thingsboard diff --git a/msa/black-box-tests/pom.xml b/msa/black-box-tests/pom.xml index 6f59dd3a3d..b08d05ed35 100644 --- a/msa/black-box-tests/pom.xml +++ b/msa/black-box-tests/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/edqs/pom.xml b/msa/edqs/pom.xml index 2082f134b0..e6adae1f87 100644 --- a/msa/edqs/pom.xml +++ b/msa/edqs/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/js-executor/package.json b/msa/js-executor/package.json index 7d4d858f22..cf7310a084 100644 --- a/msa/js-executor/package.json +++ b/msa/js-executor/package.json @@ -1,7 +1,7 @@ { "name": "thingsboard-js-executor", "private": true, - "version": "4.3.0.1", + "version": "4.4.0", "description": "ThingsBoard JavaScript Executor Microservice", "main": "server.ts", "bin": "server.js", diff --git a/msa/js-executor/pom.xml b/msa/js-executor/pom.xml index 31ea60943d..0e75d24919 100644 --- a/msa/js-executor/pom.xml +++ b/msa/js-executor/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/monitoring/pom.xml b/msa/monitoring/pom.xml index 188f1f8bb2..27b05f525d 100644 --- a/msa/monitoring/pom.xml +++ b/msa/monitoring/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT msa diff --git a/msa/pom.xml b/msa/pom.xml index c03701ca93..04b1814063 100644 --- a/msa/pom.xml +++ b/msa/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT thingsboard msa @@ -133,7 +133,7 @@ - 4.3.0-latest + 4.4.0-latest false diff --git a/msa/tb-node/pom.xml b/msa/tb-node/pom.xml index d6f08dd6f7..2244241347 100644 --- a/msa/tb-node/pom.xml +++ b/msa/tb-node/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/tb/pom.xml b/msa/tb/pom.xml index f9449f97ce..1bf32786e7 100644 --- a/msa/tb/pom.xml +++ b/msa/tb/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/transport/coap/pom.xml b/msa/transport/coap/pom.xml index 9809bc2b1e..e89a10e5a1 100644 --- a/msa/transport/coap/pom.xml +++ b/msa/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/http/pom.xml b/msa/transport/http/pom.xml index 9ec5f75cd0..76b7ff9602 100644 --- a/msa/transport/http/pom.xml +++ b/msa/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/lwm2m/pom.xml b/msa/transport/lwm2m/pom.xml index a43ef587b9..9c10edfbb7 100644 --- a/msa/transport/lwm2m/pom.xml +++ b/msa/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/mqtt/pom.xml b/msa/transport/mqtt/pom.xml index 75e8da0d74..ff759a52ff 100644 --- a/msa/transport/mqtt/pom.xml +++ b/msa/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard.msa - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.msa.transport diff --git a/msa/transport/pom.xml b/msa/transport/pom.xml index 60aa6e123f..92978fcaa7 100644 --- a/msa/transport/pom.xml +++ b/msa/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/transport/snmp/pom.xml b/msa/transport/snmp/pom.xml index fb28fbba16..049cbad4ec 100644 --- a/msa/transport/snmp/pom.xml +++ b/msa/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard.msa transport - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT org.thingsboard.msa.transport diff --git a/msa/vc-executor-docker/pom.xml b/msa/vc-executor-docker/pom.xml index 285761d35a..183a82a170 100644 --- a/msa/vc-executor-docker/pom.xml +++ b/msa/vc-executor-docker/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/vc-executor/pom.xml b/msa/vc-executor/pom.xml index 1fbe33abaf..6b0277c2c6 100644 --- a/msa/vc-executor/pom.xml +++ b/msa/vc-executor/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT msa org.thingsboard.msa diff --git a/msa/web-ui/package.json b/msa/web-ui/package.json index 13d040b836..4544aece37 100644 --- a/msa/web-ui/package.json +++ b/msa/web-ui/package.json @@ -1,7 +1,7 @@ { "name": "thingsboard-web-ui", "private": true, - "version": "4.3.0.1", + "version": "4.4.0", "description": "ThingsBoard Web UI Microservice", "main": "server.ts", "bin": "server.js", diff --git a/msa/web-ui/pom.xml b/msa/web-ui/pom.xml index 0a84e52620..7dfc4c0aee 100644 --- a/msa/web-ui/pom.xml +++ b/msa/web-ui/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT msa org.thingsboard.msa diff --git a/netty-mqtt/pom.xml b/netty-mqtt/pom.xml index c7c077ef38..6856da9233 100644 --- a/netty-mqtt/pom.xml +++ b/netty-mqtt/pom.xml @@ -19,11 +19,11 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT thingsboard netty-mqtt - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT jar Netty MQTT Client diff --git a/pom.xml b/pom.xml index 353c295038..aee23b8090 100755 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT pom Thingsboard diff --git a/rest-client/pom.xml b/rest-client/pom.xml index a63cca91fd..9996b19d00 100644 --- a/rest-client/pom.xml +++ b/rest-client/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT thingsboard rest-client diff --git a/rule-engine/pom.xml b/rule-engine/pom.xml index a03695f64f..bba58e92a8 100644 --- a/rule-engine/pom.xml +++ b/rule-engine/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT thingsboard rule-engine diff --git a/rule-engine/rule-engine-api/pom.xml b/rule-engine/rule-engine-api/pom.xml index 07719631be..a9f58a08b3 100644 --- a/rule-engine/rule-engine-api/pom.xml +++ b/rule-engine/rule-engine-api/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT rule-engine org.thingsboard.rule-engine diff --git a/rule-engine/rule-engine-components/pom.xml b/rule-engine/rule-engine-components/pom.xml index 97f2ad65b1..4e092211b8 100644 --- a/rule-engine/rule-engine-components/pom.xml +++ b/rule-engine/rule-engine-components/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT rule-engine org.thingsboard.rule-engine diff --git a/tools/pom.xml b/tools/pom.xml index 4d94ff81df..ed02dbf836 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT thingsboard tools diff --git a/transport/coap/pom.xml b/transport/coap/pom.xml index d9b28c7a5e..c012e863f9 100644 --- a/transport/coap/pom.xml +++ b/transport/coap/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/http/pom.xml b/transport/http/pom.xml index a5d093e726..87f3ccec21 100644 --- a/transport/http/pom.xml +++ b/transport/http/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/lwm2m/pom.xml b/transport/lwm2m/pom.xml index 5e744d7fca..d92d41388e 100644 --- a/transport/lwm2m/pom.xml +++ b/transport/lwm2m/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/mqtt/pom.xml b/transport/mqtt/pom.xml index c53b606704..f99409c470 100644 --- a/transport/mqtt/pom.xml +++ b/transport/mqtt/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport org.thingsboard.transport diff --git a/transport/pom.xml b/transport/pom.xml index 83c0fccd83..3b6195f9d8 100644 --- a/transport/pom.xml +++ b/transport/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT thingsboard transport diff --git a/transport/snmp/pom.xml b/transport/snmp/pom.xml index 39f72755e5..54a949f320 100644 --- a/transport/snmp/pom.xml +++ b/transport/snmp/pom.xml @@ -21,7 +21,7 @@ org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT transport diff --git a/ui-ngx/package.json b/ui-ngx/package.json index 329f249912..c1385e46d2 100644 --- a/ui-ngx/package.json +++ b/ui-ngx/package.json @@ -1,6 +1,6 @@ { "name": "thingsboard", - "version": "4.3.0.1", + "version": "4.4.0", "scripts": { "ng": "ng", "start": "node --max_old_space_size=8048 ./node_modules/@angular/cli/bin/ng serve --configuration development --host 0.0.0.0 --open", diff --git a/ui-ngx/pom.xml b/ui-ngx/pom.xml index eaca4ec83c..11ce2dcf5f 100644 --- a/ui-ngx/pom.xml +++ b/ui-ngx/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.thingsboard - 4.3.0.1-SNAPSHOT + 4.4.0-SNAPSHOT thingsboard org.thingsboard From 1fcc419dbca09b5af21a587a52618cf169036470 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Fri, 23 Jan 2026 16:19:02 +0200 Subject: [PATCH 243/579] Fix LwM2MTestClient --- .../lwm2m/client/LwM2MTestClient.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MTestClient.java b/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MTestClient.java index fd531e8022..c9c39bc701 100644 --- a/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MTestClient.java +++ b/application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MTestClient.java @@ -33,7 +33,6 @@ import org.eclipse.leshan.client.object.Security; import org.eclipse.leshan.client.object.Server; import org.eclipse.leshan.client.observer.LwM2mClientObserver; import org.eclipse.leshan.client.resource.DummyInstanceEnabler; -import org.eclipse.leshan.client.resource.LwM2mInstanceEnabler; import org.eclipse.leshan.client.resource.LwM2mObjectEnabler; import org.eclipse.leshan.client.resource.ObjectsInitializer; import org.eclipse.leshan.client.resource.listener.ObjectsListenerAdapter; @@ -142,7 +141,7 @@ public class LwM2MTestClient { private Map clientDtlsCid; private LwM2mUplinkMsgHandler defaultLwM2mUplinkMsgHandlerTest; private LwM2mClientContext clientContext; - private LwM2mTemperatureSensor lwM2mTemperatureSensor12; + private LwM2mTemperatureSensor lwM2MTemperatureSensor12; private String deviceIdStr; private int clientPort; @@ -161,7 +160,7 @@ public class LwM2MTestClient { if (securityLwm2m != null && securityLwm2m.getId() != null) { forceNullSecurityId(securityLwm2m); } - if (securityBs!= null && securityBs.getId() != null) { + if (securityBs != null && securityBs.getId() != null) { forceNullSecurityId(securityBs); } if (securityBs != null && securityLwm2m != null) { @@ -170,7 +169,7 @@ public class LwM2MTestClient { } else if (securityBs != null) { log.warn("Security BS only: securityBs: [{}] ", securityBs.getId()); initializer.setInstancesForObject(SECURITY, securityBs); - } else if (securityLwm2m != null){ + } else if (securityLwm2m != null) { // SECURITY log.warn("Security Lwm2m only: security Lwm2m [{}]", securityLwm2m.getId()); initializer.setInstancesForObject(SECURITY, securityLwm2m); @@ -191,8 +190,8 @@ public class LwM2MTestClient { locationParams.getPos(); initializer.setInstancesForObject(LOCATION, new LwM2mLocation(locationParams.getLatitude(), locationParams.getLongitude(), locationParams.getScaleFactor(), executor, OBJECT_INSTANCE_ID_0)); LwM2mTemperatureSensor lwM2mTemperatureSensor0 = new LwM2mTemperatureSensor(executor, OBJECT_INSTANCE_ID_0); - lwM2mTemperatureSensor12 = new LwM2mTemperatureSensor(executor, OBJECT_INSTANCE_ID_12); - initializer.setInstancesForObject(TEMPERATURE_SENSOR, lwM2mTemperatureSensor0, lwM2mTemperatureSensor12); + lwM2MTemperatureSensor12 = new LwM2mTemperatureSensor(executor, OBJECT_INSTANCE_ID_12); + initializer.setInstancesForObject(TEMPERATURE_SENSOR, lwM2mTemperatureSensor0, lwM2MTemperatureSensor12); List enablers = initializer.createAll(); @@ -213,7 +212,9 @@ public class LwM2MTestClient { builder.setSessionListener(new DtlsSessionLogger(clientStates, clientDtlsCid)); return builder; - }; + } + + ; }; } }; @@ -479,7 +480,7 @@ public class LwM2MTestClient { if (isStartLw) { this.awaitClientAfterStartConnectLw(); } - lwM2mTemperatureSensor12.setLeshanClient(leshanClient); + lwM2MTemperatureSensor12.setLeshanClient(leshanClient); fwLwM2MDevice.setLeshanClient(leshanClient); } } @@ -554,5 +555,6 @@ public class LwM2MTestClient { log.error("[forceNullSecurityId] Failed to set id=null for {}", security.getClass(), e); } } + } From d568ee8536d51ceb8fa47ed199b82244b8c5bba3 Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Fri, 23 Jan 2026 16:55:46 +0200 Subject: [PATCH 244/579] fix: process cfs that uses the same key and some of cfs throws error --- ...CalculatedFieldEntityMessageProcessor.java | 27 +++++- .../cf/ctx/state/CalculatedFieldCtx.java | 2 +- .../cf/CalculatedFieldIntegrationTest.java | 93 +++++++++++++++++++ .../server/controller/AbstractWebTest.java | 13 +++ 4 files changed, 131 insertions(+), 4 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java index 752e8a1c11..b95beb81a1 100644 --- a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java @@ -131,11 +131,12 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM if (state.isSizeOk()) { processStateIfReady(ctx, Collections.singletonList(ctx.getCfId()), state, null, null, msg.getCallback()); } else { - throw new RuntimeException(ctx.getSizeExceedsLimitMessage()); + throw CalculatedFieldException.builder().ctx(ctx).eventEntity(entityId).errorMessage(ctx.getSizeExceedsLimitMessage()).build(); } } catch (Exception e) { if (e instanceof CalculatedFieldException cfe) { - throw cfe; + persistDebugErrorIfEnabled(cfe, msg.getCallback()); + return; } throw CalculatedFieldException.builder().ctx(ctx).eventEntity(entityId).cause(e).build(); } @@ -200,6 +201,10 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM } } } catch (Exception e) { + if (e instanceof CalculatedFieldException cfe) { + persistDebugErrorIfEnabled(cfe, callback); + return; + } throw CalculatedFieldException.builder().ctx(ctx).eventEntity(entityId).cause(e).build(); } } @@ -223,7 +228,8 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM } } catch (Exception e) { if (e instanceof CalculatedFieldException cfe) { - throw cfe; + persistDebugErrorIfEnabled(cfe, callback); + return; } throw CalculatedFieldException.builder().ctx(ctx).eventEntity(entityId).cause(e).build(); } @@ -485,4 +491,19 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM return null; } + private void persistDebugErrorIfEnabled(CalculatedFieldException cfe, TbCallback callback) { + if (DebugModeUtil.isDebugFailuresAvailable(cfe.getCtx().getCalculatedField())) { + String message; + if (cfe.getErrorMessage() != null) { + message = cfe.getErrorMessage(); + } else if (cfe.getCause() != null) { + message = cfe.getCause().getMessage(); + } else { + message = "N/A"; + } + systemContext.persistCalculatedFieldDebugEvent(tenantId, cfe.getCtx().getCfId(), cfe.getEventEntity(), cfe.getArguments(), cfe.getMsgId(), cfe.getMsgType(), null, message); + } + callback.onSuccess(); + } + } diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java index 5d0ff5c2ff..373e2f588f 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java @@ -310,7 +310,7 @@ public class CalculatedFieldCtx { } public String getSizeExceedsLimitMessage() { - return "Failed to init CF state. State size exceeds limit of " + (maxStateSize / 1024) + "Kb!"; + return "State size exceeds limit of " + (maxStateSize / 1024) + "Kb!"; } } diff --git a/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java b/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java index a21b081086..7f905ec0ae 100644 --- a/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/cf/CalculatedFieldIntegrationTest.java @@ -23,6 +23,7 @@ import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.AttributeScope; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.Device; +import org.thingsboard.server.common.data.EventInfo; import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.asset.AssetProfile; import org.thingsboard.server.common.data.cf.CalculatedField; @@ -36,7 +37,9 @@ import org.thingsboard.server.common.data.cf.configuration.ScriptCalculatedField import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration; import org.thingsboard.server.common.data.debug.DebugSettings; import org.thingsboard.server.common.data.id.AssetProfileId; +import org.thingsboard.server.common.data.id.CalculatedFieldId; import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.controller.CalculatedFieldControllerTest; import org.thingsboard.server.dao.service.DaoSqlTest; @@ -875,6 +878,96 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes }); } + @Test + public void testCalculatedFieldsWhenOneIsInvalid() throws Exception { + Device testDevice = createDevice("Test device", "1234567890"); + long now = System.currentTimeMillis(); + doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode(String.format("{\"ts\": %s, \"values\": {\"a\":5}}", now - TimeUnit.MINUTES.toMillis(3)))); + + // Script CF - invalid + CalculatedField invalidCF = new CalculatedField(); + invalidCF.setEntityId(testDevice.getId()); + invalidCF.setType(CalculatedFieldType.SCRIPT); + invalidCF.setName("Script CF"); + invalidCF.setDebugSettings(DebugSettings.all()); + + ScriptCalculatedFieldConfiguration scriptConfig = new ScriptCalculatedFieldConfiguration(); + + ReferencedEntityKey refEntityKeyA = new ReferencedEntityKey("a", ArgumentType.TS_LATEST, null); + Argument argumentA = new Argument(); + argumentA.setRefEntityKey(refEntityKeyA); + scriptConfig.setArguments(Map.of("a", argumentA)); + scriptConfig.setExpression(""" + return { + "temperature": temp + }; + """); + + Output scriptOutput = new Output(); + scriptOutput.setType(OutputType.TIME_SERIES); + scriptConfig.setOutput(scriptOutput); + + invalidCF.setConfiguration(scriptConfig); + + invalidCF = doPost("/api/calculatedField", invalidCF, CalculatedField.class); + CalculatedFieldId invalidCfId = invalidCF.getId(); + + await().alias("create invalid CF -> check error").atMost(TIMEOUT, TimeUnit.SECONDS) + .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) + .untilAsserted(() -> { + PageData debugEvents = getDebugEvents(tenantId, invalidCfId, 1); + if (!debugEvents.getData().isEmpty()) { + EventInfo eventInfo = debugEvents.getData().get(0); + assertThat(eventInfo.getBody().has("error")).isTrue(); + } + }); + + // Simple CF - valid + CalculatedField validCF = new CalculatedField(); + validCF.setEntityId(testDevice.getId()); + validCF.setType(CalculatedFieldType.SIMPLE); + validCF.setName("Simple CF"); + validCF.setDebugSettings(DebugSettings.all()); + + SimpleCalculatedFieldConfiguration simpleConfig = new SimpleCalculatedFieldConfiguration(); + simpleConfig.setArguments(Map.of("a", argumentA)); + simpleConfig.setExpression("a+1"); + + Output simpleOutput = new Output(); + simpleOutput.setName("a+1"); + simpleOutput.setType(OutputType.TIME_SERIES); + simpleOutput.setDecimalsByDefault(0); + simpleConfig.setOutput(simpleOutput); + + validCF.setConfiguration(simpleConfig); + + validCF = doPost("/api/calculatedField", validCF, CalculatedField.class); + CalculatedFieldId validCfId = validCF.getId(); + + await().alias("create CF -> check initial calculation").atMost(TIMEOUT, TimeUnit.SECONDS) + .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) + .untilAsserted(() -> { + PageData debugEvents = getDebugEvents(tenantId, validCfId, 1); + if (!debugEvents.getData().isEmpty()) { + EventInfo eventInfo = debugEvents.getData().get(0); + assertThat(eventInfo.getBody().has("error")).isFalse(); + } + ObjectNode result = getLatestTelemetry(testDevice.getId(), "a+1"); + assertThat(result).isNotNull(); + assertThat(result.get("a+1").get(0).get("value").asText()).isEqualTo("6"); + }); + + doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"a\":6}")); + + await().alias("update telemetry -> recalculate state").atMost(TIMEOUT, TimeUnit.SECONDS) + .pollInterval(POLL_INTERVAL, TimeUnit.SECONDS) + .untilAsserted(() -> { + ObjectNode result = getLatestTelemetry(testDevice.getId(), "a+1"); + assertThat(result).isNotNull(); + assertThat(result.get("a+1").get(0).get("value").asText()).isEqualTo("7"); + }); + } + private ObjectNode getLatestTelemetry(EntityId entityId, String... keys) throws Exception { return doGetAsync("/api/plugins/telemetry/" + entityId.getEntityType() + "/" + entityId.getId() + "/values/timeseries?keys=" + String.join(",", keys), ObjectNode.class); } diff --git a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java index 44c383a5f0..3b7286cf01 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java @@ -80,6 +80,7 @@ import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfileType; import org.thingsboard.server.common.data.DeviceTransportType; +import org.thingsboard.server.common.data.EventInfo; import org.thingsboard.server.common.data.SaveDeviceWithCredentialsRequest; import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.TbResourceInfo; @@ -99,6 +100,7 @@ import org.thingsboard.server.common.data.device.profile.MqttTopics; import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadConfiguration; import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration; import org.thingsboard.server.common.data.edge.Edge; +import org.thingsboard.server.common.data.event.EventType; import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DeviceId; @@ -1298,4 +1300,15 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest { doPost("/api/job/" + jobId + "/reprocess").andExpect(status().isOk()); } + protected PageData getDebugEvents(TenantId tenantId, EntityId entityId, int limit) throws Exception { + return getEvents(tenantId, entityId, EventType.DEBUG_RULE_NODE, limit); + } + + protected PageData getEvents(TenantId tenantId, EntityId entityId, EventType eventType, int limit) throws Exception { + TimePageLink pageLink = new TimePageLink(limit); + return doGetTypedWithTimePageLink("/api/events/{entityType}/{entityId}/{eventType}?tenantId={tenantId}&", + new TypeReference>() { + }, pageLink, entityId.getEntityType(), entityId.getId(), eventType, tenantId.getId()); + } + } From 50a94b90f34b21ac013f35d8e3e42ddc799b13a4 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 23 Jan 2026 17:33:15 +0200 Subject: [PATCH 245/579] Angular 20 migration --- ui-ngx/package.json | 36 +- ui-ngx/src/app/app.component.ts | 7 +- .../ai-model/ai-model-dialog.component.ts | 7 +- .../check-connectivity-dialog.component.ts | 7 +- .../alarm/alarm-assignee-panel.component.ts | 7 +- .../alarm-assignee-select-panel.component.ts | 7 +- .../alarm/alarm-assignee-select.component.ts | 21 +- .../alarm/alarm-assignee.component.ts | 7 +- .../alarm/alarm-comment-dialog.component.ts | 7 +- .../alarm/alarm-comment.component.ts | 7 +- .../alarm/alarm-details-dialog.component.ts | 7 +- .../alarm/alarm-filter-config.component.ts | 21 +- .../alarm/alarm-table-header.component.ts | 7 +- .../components/alarm/alarm-table.component.ts | 7 +- .../aliases-entity-autocomplete.component.ts | 17 +- .../aliases-entity-select-panel.component.ts | 7 +- .../alias/aliases-entity-select.component.ts | 7 +- .../alias/entity-alias-dialog.component.ts | 9 +- .../alias/entity-aliases-dialog.component.ts | 9 +- .../add-attribute-dialog.component.ts | 9 +- ...dd-widget-to-dashboard-dialog.component.ts | 9 +- .../attribute/attribute-table.component.ts | 9 +- .../delete-timeseries-panel.component.ts | 7 +- .../edit-attribute-value-panel.component.ts | 9 +- .../audit-log-details-dialog.component.ts | 7 +- .../audit-log/audit-log-table.component.ts | 7 +- .../calculated-fields-table.component.ts | 11 +- ...culated-field-arguments-table.component.ts | 31 +- ...calculated-field-debug-dialog.component.ts | 7 +- .../calculated-field-dialog.component.ts | 9 +- ...lculated-field-argument-panel.component.ts | 7 +- ...lculated-field-test-arguments.component.ts | 31 +- ...ated-field-script-test-dialog.component.ts | 9 +- .../add-widget-dialog.component.ts | 11 +- .../dashboard-image-dialog.component.ts | 7 +- .../dashboard-page.component.ts | 11 +- .../dashboard-settings-dialog.component.ts | 9 +- .../dashboard-state.component.ts | 7 +- .../dashboard-toolbar.component.ts | 9 +- .../dashboard-widget-select.component.ts | 9 +- .../dashboard-page/edit-widget.component.ts | 7 +- .../add-new-breakpoint-dialog.component.ts | 5 +- .../layout/dashboard-layout.component.ts | 7 +- ...nage-dashboard-layouts-dialog.component.ts | 9 +- .../layout/move-widgets-dialog.component.ts | 9 +- .../select-dashboard-breakpoint.component.ts | 7 +- .../dashboard-state-dialog.component.ts | 9 +- .../default-state-controller.component.ts | 7 +- .../entity-state-controller.component.ts | 7 +- ...anage-dashboard-states-dialog.component.ts | 7 +- .../states/states-component.directive.ts | 5 +- .../widget-types-panel.component.ts | 7 +- .../dashboard-view.component.ts | 7 +- .../dashboard/dashboard.component.ts | 9 +- .../select-target-layout-dialog.component.ts | 7 +- .../select-target-state-dialog.component.ts | 9 +- .../components/details-panel.component.ts | 7 +- .../copy-device-credentials.component.ts | 7 +- ...vice-credentials-lwm2m-server.component.ts | 31 +- .../device-credentials-lwm2m.component.ts | 31 +- ...device-credentials-mqtt-basic.component.ts | 30 +- .../device/device-credentials.component.ts | 30 +- .../device/device-info-filter.component.ts | 21 +- .../edge-downlink-table-header.component.ts | 7 +- .../edge/edge-downlink-table.component.ts | 7 +- .../entity/add-entity-dialog.component.ts | 9 +- .../entity-debug-settings-button.component.ts | 33 +- .../entity-debug-settings-panel.component.ts | 17 +- .../entity/entities-table.component.ts | 9 +- .../entity/entity-chips.component.ts | 7 +- .../entity/entity-details-page.component.ts | 9 +- .../entity/entity-details-panel.component.ts | 9 +- .../entity/entity-filter-view.component.ts | 21 +- .../entity/entity-filter.component.ts | 21 +- .../event/event-content-dialog.component.ts | 7 +- .../event/event-filter-panel.component.ts | 7 +- .../event/event-table-header.component.ts | 7 +- .../components/event/event-table.component.ts | 7 +- .../boolean-filter-predicate.component.ts | 31 +- ...mplex-filter-predicate-dialog.component.ts | 9 +- .../complex-filter-predicate.component.ts | 21 +- .../filter/filter-dialog.component.ts | 9 +- .../filter/filter-predicate-list.component.ts | 31 +- .../filter-predicate-value.component.ts | 31 +- .../filter/filter-predicate.component.ts | 31 +- .../filter/filter-text.component.ts | 21 +- .../filter-user-info-dialog.component.ts | 9 +- .../filter/filter-user-info.component.ts | 21 +- .../filter/filters-dialog.component.ts | 9 +- .../filter/filters-edit-panel.component.ts | 7 +- .../filter/filters-edit.component.ts | 7 +- .../filter/key-filter-dialog.component.ts | 9 +- .../filter/key-filter-list.component.ts | 31 +- .../numeric-filter-predicate.component.ts | 31 +- .../string-filter-predicate.component.ts | 31 +- .../filter/user-filter-dialog.component.ts | 9 +- .../github-badge/github-badge.component.ts | 7 +- .../notification-bell.component.ts | 7 +- .../send-notification-button.component.ts | 5 +- .../show-notification-popover.component.ts | 7 +- .../add-device-profile-dialog.component.ts | 9 +- ...larm-duration-predicate-value.component.ts | 21 +- .../alarm/alarm-dynamic-value.component.ts | 15 +- .../alarm-rule-condition-dialog.component.ts | 9 +- .../alarm/alarm-rule-condition.component.ts | 31 +- .../profile/alarm/alarm-rule.component.ts | 31 +- .../alarm/alarm-schedule-dialog.component.ts | 9 +- .../alarm/alarm-schedule-info.component.ts | 17 +- .../profile/alarm/alarm-schedule.component.ts | 25 +- .../alarm/create-alarm-rules.component.ts | 31 +- .../alarm/device-profile-alarm.component.ts | 31 +- .../alarm/device-profile-alarms.component.ts | 31 +- .../edit-alarm-details-dialog.component.ts | 9 +- .../asset-profile-autocomplete.component.ts | 17 +- .../profile/asset-profile-dialog.component.ts | 9 +- .../profile/asset-profile.component.ts | 7 +- .../device-profile-autocomplete.component.ts | 17 +- .../device-profile-dialog.component.ts | 9 +- ...ofile-provision-configuration.component.ts | 31 +- .../profile/device-profile.component.ts | 7 +- ...ofile-transport-configuration.component.ts | 31 +- .../common/power-mode-setting.component.ts | 7 +- .../common/time-unit-select.component.ts | 31 +- ...-device-profile-configuration.component.ts | 17 +- ...ofile-transport-configuration.component.ts | 31 +- .../device-profile-configuration.component.ts | 17 +- ...ofile-transport-configuration.component.ts | 31 +- .../lwm2m-attributes-dialog.component.ts | 9 +- .../lwm2m-attributes-key-list.component.ts | 31 +- .../lwm2m/lwm2m-attributes.component.ts | 17 +- ...trap-add-config-server-dialog.component.ts | 5 +- ...wm2m-bootstrap-config-servers.component.ts | 29 +- .../lwm2m-device-config-server.component.ts | 29 +- ...ofile-transport-configuration.component.ts | 30 +- ...m-object-add-instances-dialog.component.ts | 5 +- ...m2m-object-add-instances-list.component.ts | 28 +- .../lwm2m/lwm2m-object-list.component.ts | 29 +- ...erve-attr-telemetry-instances.component.ts | 31 +- ...erve-attr-telemetry-resources.component.ts | 31 +- .../lwm2m-observe-attr-telemetry.component.ts | 31 +- ...ofile-transport-configuration.component.ts | 31 +- ...-profile-communication-config.component.ts | 30 +- .../snmp-device-profile-mapping.component.ts | 30 +- ...ofile-transport-configuration.component.ts | 30 +- .../queue/tenant-profile-queues.component.ts | 31 +- .../tenant-profile-autocomplete.component.ts | 17 +- .../profile/tenant-profile-data.component.ts | 17 +- .../tenant-profile-dialog.component.ts | 9 +- .../profile/tenant-profile.component.ts | 7 +- ...-tenant-profile-configuration.component.ts | 17 +- .../rate-limits-details-dialog.component.ts | 3 +- .../rate-limits/rate-limits-list.component.ts | 31 +- .../rate-limits/rate-limits-text.component.ts | 7 +- .../rate-limits/rate-limits.component.ts | 31 +- .../tenant-profile-configuration.component.ts | 17 +- .../components/queue/queue-form.component.ts | 31 +- .../relation/relation-dialog.component.ts | 9 +- .../relation/relation-filters.component.ts | 21 +- .../relation/relation-table.component.ts | 9 +- .../resources/resources-dialog.component.ts | 9 +- .../resources/resources-library.component.ts | 5 +- .../home/components/router-tabs.component.ts | 7 +- .../rule-chain-autocomplete.component.ts | 17 +- ...vanced-processing-setting-row.component.ts | 23 +- .../advanced-processing-setting.component.ts | 23 +- .../assign-customer-config.component.ts | 7 +- .../action/attributes-config.component.ts | 7 +- .../action/clear-alarm-config.component.ts | 7 +- .../action/create-alarm-config.component.ts | 7 +- .../create-relation-config.component.ts | 7 +- .../delete-attributes-config.component.ts | 7 +- .../delete-relation-config.component.ts | 7 +- .../action/device-profile-config.component.ts | 7 +- .../action/device-state-config.component.ts | 3 +- .../action/generator-config.component.ts | 7 +- .../action/gps-geo-action-config.component.ts | 7 +- .../rule-node/action/log-config.component.ts | 7 +- .../action/math-function-config.component.ts | 7 +- .../action/msg-count-config.component.ts | 7 +- .../action/msg-delay-config.component.ts | 7 +- .../action/push-to-cloud-config.component.ts | 7 +- .../action/push-to-edge-config.component.ts | 7 +- .../action/rpc-reply-config.component.ts | 7 +- .../action/rpc-request-config.component.ts | 7 +- .../save-to-custom-table-config.component.ts | 7 +- ...nd-rest-api-call-reply-config.component.ts | 7 +- .../action/timeseries-config.component.ts | 7 +- .../unassign-customer-config.component.ts | 7 +- .../common/alarm-status-select.component.ts | 17 +- .../common/arguments-map-config.component.ts | 31 +- .../common/credentials-config.component.ts | 31 +- ...device-relations-query-config.component.ts | 21 +- .../common/example-hint.component.ts | 7 +- .../common/kv-map-config-old.component.ts | 31 +- .../common/kv-map-config.component.ts | 31 +- .../math-function-autocomplete.component.ts | 21 +- .../common/message-types-config.component.ts | 21 +- .../common/msg-metadata-chip.component.ts | 15 +- ...put-message-type-autocomplete.component.ts | 31 +- .../relations-query-config-old.component.ts | 21 +- .../relations-query-config.component.ts | 19 +- .../common/select-attributes.component.ts | 25 +- .../common/sv-map-config.component.ts | 31 +- .../common/time-unit-input.component.ts | 23 +- .../rule-node/empty-config.component.ts | 7 +- .../calculate-delta-config.component.ts | 5 +- .../customer-attributes-config.component.ts | 7 +- .../device-attributes-config.component.ts | 7 +- .../entity-details-config.component.ts | 7 +- ...tch-device-credentials-config.component.ts | 5 +- ...elemetry-from-database-config.component.ts | 7 +- .../originator-attributes-config.component.ts | 7 +- .../originator-fields-config.component.ts | 5 +- .../related-attributes-config.component.ts | 7 +- .../tenant-attributes-config.component.ts | 7 +- .../rule-node/external/ai-config.component.ts | 7 +- .../azure-iot-hub-config.component.ts | 7 +- .../external/kafka-config.component.ts | 7 +- .../external/lambda-config.component.ts | 7 +- .../external/mqtt-config.component.ts | 7 +- .../external/notification-config.component.ts | 7 +- .../external/pubsub-config.component.ts | 7 +- .../external/rabbit-mq-config.component.ts | 7 +- .../rest-api-call-config.component.ts | 7 +- .../external/send-email-config.component.ts | 7 +- .../external/send-sms-config.component.ts | 7 +- .../external/slack-config.component.ts | 7 +- .../external/sns-config.component.ts | 7 +- .../external/sqs-config.component.ts | 7 +- .../filter/check-alarm-status.component.ts | 7 +- .../filter/check-message-config.component.ts | 7 +- .../filter/check-relation-config.component.ts | 7 +- .../filter/gps-geo-filter-config.component.ts | 7 +- .../filter/message-type-config.component.ts | 7 +- .../originator-type-config.component.ts | 7 +- .../filter/script-config.component.ts | 7 +- .../filter/switch-config.component.ts | 7 +- .../flow/rule-chain-input.component.ts | 7 +- .../flow/rule-chain-output.component.ts | 7 +- .../change-originator-config.component.ts | 5 +- .../copy-keys-config.component.ts | 7 +- .../deduplication-config.component.ts | 7 +- .../delete-keys-config.component.ts | 7 +- .../node-json-path-config.component.ts | 7 +- .../rename-keys-config.component.ts | 7 +- .../transformation/script-config.component.ts | 7 +- .../to-email-config.component.ts | 7 +- ...ws-sns-provider-configuration.component.ts | 17 +- ...pp-sms-provider-configuration.component.ts | 17 +- .../sms-provider-configuration.component.ts | 17 +- ...io-sms-provider-configuration.component.ts | 17 +- .../vc/auto-commit-settings.component.ts | 7 +- .../vc/complex-version-create.component.ts | 7 +- .../vc/complex-version-load.component.ts | 7 +- .../entity-types-version-create.component.ts | 31 +- .../vc/entity-types-version-load.component.ts | 31 +- .../vc/entity-version-create.component.ts | 7 +- .../vc/entity-version-diff.component.ts | 9 +- .../vc/entity-version-restore.component.ts | 7 +- .../vc/entity-versions-table.component.ts | 7 +- ...remove-other-entities-confirm.component.ts | 7 +- .../vc/repository-settings.component.ts | 7 +- .../vc/version-control.component.ts | 7 +- .../manage-widget-actions-dialog.component.ts | 9 +- .../action/manage-widget-actions.component.ts | 21 +- .../action/widget-action-dialog.component.ts | 9 +- .../alarm-count-basic-config.component.ts | 7 +- .../alarms-table-basic-config.component.ts | 7 +- .../action-button-basic-config.component.ts | 7 +- .../command-button-basic-config.component.ts | 7 +- .../power-button-basic-config.component.ts | 7 +- ...segmented-button-basic-config.component.ts | 7 +- .../toggle-button-basic-config.component.ts | 7 +- .../aggregated-data-key-row.component.ts | 23 +- .../aggregated-data-keys-panel.component.ts | 23 +- ...gated-value-card-basic-config.component.ts | 7 +- .../label-card-basic-config.component.ts | 7 +- ...label-value-card-basic-config.component.ts | 7 +- ...bile-app-qr-code-basic-config.component.ts | 7 +- .../progress-bar-basic-config.component.ts | 7 +- .../simple-card-basic-config.component.ts | 7 +- ...timeseries-table-basic-config.component.ts | 7 +- ...ead-notification-basic-config.component.ts | 7 +- .../value-card-basic-config.component.ts | 7 +- ...value-chart-card-basic-config.component.ts | 7 +- .../chart/bar-chart-basic-config.component.ts | 7 +- ...hart-with-labels-basic-config.component.ts | 7 +- .../chart/comparison-key-row.component.ts | 23 +- .../chart/comparison-keys-table.component.ts | 23 +- .../chart/doughnut-basic-config.component.ts | 7 +- .../chart/flot-basic-config.component.ts | 7 +- .../chart/pie-chart-basic-config.component.ts | 7 +- ...polar-area-chart-basic-config.component.ts | 7 +- .../radar-chart-basic-config.component.ts | 7 +- .../range-chart-basic-config.component.ts | 7 +- ...ime-series-chart-basic-config.component.ts | 7 +- .../basic/common/data-key-row.component.ts | 23 +- .../basic/common/data-keys-panel.component.ts | 33 +- .../common/widget-actions-panel.component.ts | 21 +- .../entities-table-basic-config.component.ts | 7 +- .../entity-count-basic-config.component.ts | 7 +- .../compass-gauge-basic-config.component.ts | 7 +- ...tal-simple-gauge-basic-config.component.ts | 7 +- .../radial-gauge-basic-config.component.ts | 7 +- ...eter-scale-gauge-basic-config.component.ts | 7 +- .../battery-level-basic-config.component.ts | 7 +- ...iquid-level-card-basic-config.component.ts | 7 +- .../signal-strength-basic-config.component.ts | 7 +- .../status-widget-basic-config.component.ts | 7 +- .../basic/map/map-basic-config.component.ts | 7 +- .../single-switch-basic-config.component.ts | 7 +- .../rpc/slider-basic-config.component.ts | 7 +- .../value-stepper-basic-config.component.ts | 7 +- .../scada-symbol-basic-config.component.ts | 7 +- ...-speed-direction-basic-config.component.ts | 7 +- .../widget/config/datasource.component.ts | 31 +- .../widget/config/datasources.component.ts | 31 +- .../widget/config/target-device.component.ts | 31 +- .../timewindow-config-panel.component.ts | 21 +- .../timewindow-style-panel.component.ts | 11 +- .../config/timewindow-style.component.ts | 21 +- .../custom-dialog-container.component.ts | 5 +- .../embed-dashboard-dialog.component.ts | 7 +- .../alarm/alarms-table-widget.component.ts | 7 +- .../button/action-button-widget.component.ts | 9 +- .../button/command-button-widget.component.ts | 9 +- .../button/toggle-button-widget.component.ts | 9 +- .../two-segment-button-widget.component.ts | 9 +- .../aggregated-value-card-widget.component.ts | 7 +- .../lib/cards/label-card-widget.component.ts | 9 +- .../label-value-card-widget.component.ts | 9 +- ...otification-type-filter-panel.component.ts | 7 +- .../cards/progress-bar-widget.component.ts | 9 +- .../unread-notification-widget.component.ts | 9 +- .../lib/cards/value-card-widget.component.ts | 7 +- .../value-chart-card-widget.component.ts | 9 +- .../lib/chart/bar-chart-widget.component.ts | 9 +- .../bar-chart-with-labels-widget.component.ts | 9 +- .../lib/chart/doughnut-widget.component.ts | 9 +- .../lib/chart/latest-chart.component.ts | 9 +- .../lib/chart/pie-chart-widget.component.ts | 9 +- .../lib/chart/polar-area-widget.component.ts | 9 +- .../lib/chart/radar-chart-widget.component.ts | 9 +- .../lib/chart/range-chart-widget.component.ts | 9 +- .../time-series-chart-widget.component.ts | 9 +- .../lib/count/count-widget.component.ts | 7 +- .../date-range-navigator.component.ts | 16 +- .../lib/display-columns-panel.component.ts | 7 +- .../lib/edges-overview-widget.component.ts | 7 +- .../entities-hierarchy-widget.component.ts | 7 +- .../entity/entities-table-widget.component.ts | 7 +- .../widget/lib/flot-widget.component.ts | 7 +- .../add-doc-link-dialog.component.ts | 7 +- .../add-quick-link-dialog.component.ts | 7 +- .../home-page/cluster-info-table.component.ts | 7 +- .../configured-features.component.ts | 7 +- .../lib/home-page/doc-link.component.ts | 23 +- .../home-page/doc-links-widget.component.ts | 7 +- .../home-page/edit-links-dialog.component.ts | 7 +- ...ting-started-completed-dialog.component.ts | 9 +- .../getting-started-widget.component.ts | 7 +- .../lib/home-page/quick-link.component.ts | 23 +- .../home-page/quick-links-widget.component.ts | 7 +- .../recent-dashboards-widget.component.ts | 7 +- .../home-page/usage-info-widget.component.ts | 7 +- .../lib/home-page/version-info.component.ts | 7 +- .../battery-level-widget.component.ts | 9 +- .../liquid-level-widget.component.ts | 9 +- .../signal-strength-widget.component.ts | 9 +- .../lib/indicator/status-widget.component.ts | 9 +- .../widget/lib/json-input-widget.component.ts | 7 +- .../components/widget/lib/legend.component.ts | 7 +- .../dialogs/select-entity-dialog.component.ts | 7 +- .../widget/lib/maps/map-widget.component.ts | 9 +- .../panels/map-timeline-panel.component.ts | 9 +- .../select-map-entity-panel.component.ts | 11 +- .../widget/lib/markdown-widget.component.ts | 5 +- .../lib/mobile-app-qrcode-widget.component.ts | 7 +- .../lib/multiple-input-widget.component.ts | 7 +- .../lib/navigation-card-widget.component.ts | 7 +- .../lib/navigation-cards-widget.component.ts | 7 +- .../lib/photo-camera-input.component.ts | 9 +- .../widget/lib/qrcode-widget.component.ts | 7 +- .../widget/lib/rpc/knob.component.ts | 7 +- .../widget/lib/rpc/led-indicator.component.ts | 7 +- .../rpc/persistent-add-dialog.component.ts | 7 +- .../persistent-details-dialog.component.ts | 7 +- .../rpc/persistent-filter-panel.component.ts | 7 +- .../lib/rpc/persistent-table.component.ts | 7 +- .../lib/rpc/power-button-widget.component.ts | 9 +- .../widget/lib/rpc/round-switch.component.ts | 7 +- .../lib/rpc/single-switch-widget.component.ts | 9 +- .../widget/lib/rpc/slider-widget.component.ts | 9 +- .../widget/lib/rpc/switch.component.ts | 7 +- .../lib/rpc/value-stepper-widget.component.ts | 9 +- .../scada/scada-symbol-widget.component.ts | 9 +- .../alarm-count-widget-settings.component.ts | 7 +- .../alarms-table-key-settings.component.ts | 7 +- .../alarms-table-widget-settings.component.ts | 7 +- ...action-button-widget-settings.component.ts | 7 +- ...ommand-button-widget-settings.component.ts | 7 +- .../power-button-widget-settings.component.ts | 7 +- ...mented-button-widget-settings.component.ts | 7 +- ...toggle-button-widget-settings.component.ts | 7 +- ...gated-value-card-key-settings.component.ts | 7 +- ...ed-value-card-widget-settings.component.ts | 7 +- ...shboard-state-widget-settings.component.ts | 7 +- ...uick-overview-widget-settings.component.ts | 7 +- .../html-card-widget-settings.component.ts | 7 +- .../label-card-widget-settings.component.ts | 7 +- ...el-value-card-widget-settings.component.ts | 7 +- .../cards/label-widget-label.component.ts | 21 +- .../cards/label-widget-settings.component.ts | 7 +- .../markdown-widget-settings.component.ts | 7 +- ...e-app-qr-code-widget-settings.component.ts | 7 +- .../progress-bar-widget-settings.component.ts | 7 +- .../cards/qrcode-widget-settings.component.ts | 7 +- .../simple-card-widget-settings.component.ts | 7 +- ...timeseries-table-key-settings.component.ts | 7 +- ...ies-table-latest-key-settings.component.ts | 7 +- ...eseries-table-widget-settings.component.ts | 7 +- ...-notification-widget-settings.component.ts | 7 +- .../value-card-widget-settings.component.ts | 7 +- ...ue-chart-card-widget-settings.component.ts | 7 +- .../bar-chart-widget-settings.component.ts | 7 +- ...t-with-labels-widget-settings.component.ts | 7 +- .../chart/chart-widget-settings.component.ts | 7 +- ...oughnut-chart-widget-settings.component.ts | 7 +- .../doughnut-widget-settings.component.ts | 7 +- .../chart/flot-bar-key-settings.component.ts | 7 +- .../flot-bar-widget-settings.component.ts | 7 +- .../chart/flot-key-settings.component.ts | 31 +- .../flot-latest-key-settings.component.ts | 7 +- .../chart/flot-line-key-settings.component.ts | 7 +- .../flot-line-widget-settings.component.ts | 7 +- .../chart/flot-pie-key-settings.component.ts | 7 +- .../flot-pie-widget-settings.component.ts | 7 +- .../chart/flot-threshold.component.ts | 23 +- .../chart/flot-widget-settings.component.ts | 31 +- .../chart/label-data-key.component.ts | 21 +- .../pie-chart-widget-settings.component.ts | 7 +- ...ar-area-chart-widget-settings.component.ts | 7 +- .../radar-chart-widget-settings.component.ts | 7 +- .../range-chart-widget-settings.component.ts | 7 +- ...ime-series-chart-key-settings.component.ts | 7 +- ...me-series-chart-line-settings.component.ts | 21 +- ...-series-chart-widget-settings.component.ts | 7 +- .../custom-action-pretty-editor.component.ts | 23 +- ...-action-pretty-resources-tabs.component.ts | 9 +- ...t-value-action-settings-panel.component.ts | 11 +- .../get-value-action-settings.component.ts | 23 +- .../action/map-item-tooltips.component.ts | 19 +- .../action/mobile-action-editor.component.ts | 17 +- ...t-value-action-settings-panel.component.ts | 11 +- .../set-value-action-settings.component.ts | 23 +- .../widget-action-settings-panel.component.ts | 11 +- .../widget-action-settings.component.ts | 23 +- .../common/action/widget-action.component.ts | 31 +- .../common/advanced-range.component.ts | 21 +- .../alias/entity-alias-select.component.ts | 17 +- ...to-date-format-settings-panel.component.ts | 11 +- .../auto-date-format-settings.component.ts | 21 +- .../background-settings-panel.component.ts | 11 +- .../common/background-settings.component.ts | 23 +- .../widget-button-appearance.component.ts | 23 +- ...get-button-custom-style-panel.component.ts | 11 +- .../widget-button-custom-style.component.ts | 23 +- ...ton-toggle-custom-style-panel.component.ts | 11 +- ...et-button-toggle-custom-style.component.ts | 23 +- .../chart-animation-settings.component.ts | 21 +- .../chart/chart-bar-settings.component.ts | 21 +- .../chart/chart-fill-settings.component.ts | 21 +- ...es-chart-axis-settings-button.component.ts | 21 +- ...ies-chart-axis-settings-panel.component.ts | 11 +- ...me-series-chart-axis-settings.component.ts | 21 +- ...me-series-chart-grid-settings.component.ts | 21 +- .../time-series-chart-state-row.component.ts | 23 +- ...ime-series-chart-states-panel.component.ts | 33 +- ...me-series-chart-threshold-row.component.ts | 23 +- ...hart-threshold-settings-panel.component.ts | 11 +- ...ries-chart-threshold-settings.component.ts | 21 +- ...series-chart-thresholds-panel.component.ts | 33 +- ...ime-series-chart-y-axes-panel.component.ts | 33 +- .../time-series-chart-y-axis-row.component.ts | 23 +- ...ggregation-bar-width-settings.component.ts | 21 +- .../common/color-range-list.component.ts | 23 +- .../common/color-range-panel.component.ts | 11 +- .../common/color-range-settings.component.ts | 21 +- .../common/color-settings-panel.component.ts | 11 +- .../common/color-settings.component.ts | 21 +- .../common/count-widget-settings.component.ts | 21 +- .../common/css-size-input.component.ts | 31 +- .../common/css-unit-select.component.ts | 21 +- .../common/date-format-select.component.ts | 21 +- .../date-format-settings-panel.component.ts | 11 +- .../dynamic-form-array.component.ts | 33 +- .../dynamic-form-properties.component.ts | 33 +- .../dynamic-form-property-panel.component.ts | 9 +- .../dynamic-form-property-row.component.ts | 33 +- .../dynamic-form-select-item-row.component.ts | 33 +- .../dynamic-form-select-items.component.ts | 33 +- .../dynamic-form/dynamic-form.component.ts | 31 +- .../common/entity-alias-input.component.ts | 23 +- .../common/filter/filter-select.component.ts | 25 +- .../common/font-settings-panel.component.ts | 11 +- .../common/font-settings.component.ts | 21 +- .../lib/settings/common/gradient.component.ts | 21 +- .../common/image-cards-select.component.ts | 26 +- .../status-widget-state-settings.component.ts | 21 +- .../key/data-key-config-dialog.component.ts | 9 +- .../common/key/data-key-config.component.ts | 31 +- .../common/key/data-key-input.component.ts | 23 +- .../common/key/data-keys.component.ts | 41 +- .../common/legend-config.component.ts | 21 +- ...dditional-map-data-source-row.component.ts | 23 +- .../additional-map-data-sources.component.ts | 33 +- ...ta-layer-color-settings-panel.component.ts | 11 +- .../data-layer-color-settings.component.ts | 21 +- .../data-layer-pattern-settings.component.ts | 31 +- .../image-map-source-settings.component.ts | 31 +- .../map/map-action-button-row.component.ts | 25 +- .../map-action-buttons-settings.component.ts | 25 +- .../map/map-data-layer-dialog.component.ts | 9 +- .../map/map-data-layer-row.component.ts | 23 +- .../common/map/map-data-layers.component.ts | 33 +- .../map/map-data-source-row.component.ts | 23 +- .../common/map/map-data-sources.component.ts | 33 +- .../common/map/map-layer-row.component.ts | 23 +- .../map/map-layer-settings-panel.component.ts | 11 +- .../common/map/map-layers.component.ts | 33 +- .../common/map/map-settings.component.ts | 31 +- .../map/map-tooltip-tag-actions.component.ts | 23 +- .../marker-clustering-settings.component.ts | 31 +- .../map/marker-icon-shapes.component.ts | 11 +- .../marker-image-settings-panel.component.ts | 11 +- .../map/marker-image-settings.component.ts | 21 +- .../map/marker-shape-settings.component.ts | 21 +- .../common/map/marker-shapes.component.ts | 11 +- ...ape-fill-image-settings-panel.component.ts | 11 +- .../shape-fill-image-settings.component.ts | 21 +- ...pe-fill-stripe-settings-panel.component.ts | 11 +- .../shape-fill-stripe-settings.component.ts | 21 +- .../map/trip-timeline-settings.component.ts | 31 +- .../scada-symbol-object-settings.component.ts | 31 +- .../common/value-source-data-key.component.ts | 21 +- .../settings/common/value-source.component.ts | 21 +- .../settings/common/widget-font.component.ts | 21 +- .../widget/widget-settings.component.ts | 27 +- .../device-key-autocomplete.component.ts | 21 +- .../knob-control-widget-settings.component.ts | 7 +- ...led-indicator-widget-settings.component.ts | 7 +- ...sistent-table-widget-settings.component.ts | 7 +- .../round-switch-widget-settings.component.ts | 7 +- .../control/rpc-button-style.component.ts | 21 +- .../rpc-shell-widget-settings.component.ts | 7 +- .../rpc-terminal-widget-settings.component.ts | 7 +- .../send-rpc-widget-settings.component.ts | 7 +- ...single-switch-widget-settings.component.ts | 7 +- .../slide-toggle-widget-settings.component.ts | 7 +- .../slider-widget-settings.component.ts | 7 +- ...witch-control-widget-settings.component.ts | 7 +- .../control/switch-rpc-settings.component.ts | 31 +- ...ice-attribute-widget-settings.component.ts | 7 +- ...value-stepper-widget-settings.component.ts | 7 +- ...nge-navigator-widget-settings.component.ts | 7 +- ...ies-hierarchy-widget-settings.component.ts | 7 +- .../entities-table-key-settings.component.ts | 7 +- ...ntities-table-widget-settings.component.ts | 7 +- .../entity-count-widget-settings.component.ts | 7 +- ...single-device-widget-settings.component.ts | 7 +- ...ateway-config-widget-settings.component.ts | 7 +- ...ateway-events-widget-settings.component.ts | 7 +- .../gateway-logs-settings.component.ts | 7 +- .../gateway-service-rpc-settings.component.ts | 7 +- ...logue-compass-widget-settings.component.ts | 7 +- ...-linear-gauge-widget-settings.component.ts | 7 +- ...-radial-gauge-widget-settings.component.ts | 7 +- ...digital-gauge-widget-settings.component.ts | 7 +- .../settings/gauge/tick-value.component.ts | 21 +- .../gpio-control-widget-settings.component.ts | 7 +- .../lib/settings/gpio/gpio-item.component.ts | 21 +- .../gpio-panel-widget-settings.component.ts | 7 +- .../doc-links-widget-settings.component.ts | 7 +- .../quick-links-widget-settings.component.ts | 7 +- ...battery-level-widget-settings.component.ts | 7 +- ...id-level-card-widget-settings.component.ts | 7 +- ...gnal-strength-widget-settings.component.ts | 7 +- .../status-widget-settings.component.ts | 7 +- .../input/datakey-select-option.component.ts | 21 +- ...vice-claiming-widget-settings.component.ts | 7 +- ...-camera-input-widget-settings.component.ts | 7 +- ...te-attribute-general-settings.component.ts | 31 +- ...ean-attribute-widget-settings.component.ts | 7 +- ...ate-attribute-widget-settings.component.ts | 7 +- ...ble-attribute-widget-settings.component.ts | 7 +- ...age-attribute-widget-settings.component.ts | 7 +- ...ger-attribute-widget-settings.component.ts | 7 +- ...son-attribute-widget-settings.component.ts | 7 +- ...ion-attribute-widget-settings.component.ts | 7 +- ...tiple-attributes-key-settings.component.ts | 7 +- ...le-attributes-widget-settings.component.ts | 7 +- ...ing-attribute-widget-settings.component.ts | 7 +- .../map/legacy/circle-settings.component.ts | 31 +- .../legacy/common-map-settings.component.ts | 31 +- .../datasources-key-autocomplete.component.ts | 21 +- .../google-map-provider-settings.component.ts | 31 +- .../here-map-provider-settings.component.ts | 31 +- .../image-map-provider-settings.component.ts | 31 +- .../legacy/map-editor-settings.component.ts | 31 +- .../legacy/map-provider-settings.component.ts | 31 +- .../legacy/map-settings-legacy.component.ts | 31 +- .../map-widget-settings-legacy.component.ts | 7 +- .../marker-clustering-settings.component.ts | 31 +- .../map/legacy/markers-settings.component.ts | 31 +- ...nstreet-map-provider-settings.component.ts | 31 +- .../map/legacy/polygon-settings.component.ts | 31 +- .../legacy/route-map-settings.component.ts | 31 +- .../route-map-widget-settings.component.ts | 7 +- ...tencent-map-provider-settings.component.ts | 31 +- ...rip-animation-common-settings.component.ts | 31 +- ...rip-animation-marker-settings.component.ts | 31 +- .../trip-animation-path-settings.component.ts | 31 +- ...trip-animation-point-settings.component.ts | 31 +- ...rip-animation-widget-settings.component.ts | 7 +- .../map/map-widget-settings.component.ts | 7 +- ...vigation-card-widget-settings.component.ts | 7 +- ...igation-cards-widget-settings.component.ts | 7 +- .../scada-symbol-widget-settings.component.ts | 7 +- ...eed-direction-widget-settings.component.ts | 7 +- .../lib/timeseries-table-widget.component.ts | 7 +- .../trip-animation.component.ts | 9 +- .../wind-speed-direction-widget.component.ts | 9 +- .../widget/widget-config.component.ts | 31 +- .../widget/widget-container.component.ts | 18 +- .../widget/widget-preview.component.ts | 7 +- .../components/widget/widget.component.ts | 11 +- .../wizard/device-wizard-dialog.component.ts | 7 +- ...d-entities-to-customer-dialog.component.ts | 9 +- .../add-entities-to-edge-dialog.component.ts | 9 +- .../assign-to-customer-dialog.component.ts | 9 +- ui-ngx/src/app/modules/home/home.component.ts | 7 +- .../modules/home/menu/menu-link.component.ts | 9 +- .../home/menu/menu-toggle.component.ts | 9 +- .../modules/home/menu/side-menu.component.ts | 9 +- .../auto-commit-admin-settings.component.ts | 7 +- .../pages/admin/general-settings.component.ts | 7 +- .../pages/admin/home-settings.component.ts | 7 +- .../home/pages/admin/mail-server.component.ts | 7 +- .../oauth2/clients/client-dialog.component.ts | 9 +- .../clients/client-table-header.component.ts | 7 +- .../admin/oauth2/clients/client.component.ts | 7 +- .../domains/domain-table-header.component.ts | 7 +- .../admin/oauth2/domains/domain.component.ts | 7 +- .../home/pages/admin/queue/queue.component.ts | 7 +- .../repository-admin-settings.component.ts | 7 +- .../js-library-table-header.component.ts | 7 +- .../admin/resource/js-resource.component.ts | 5 +- .../resource-library-tabs.component.ts | 7 +- .../admin/resource/resource-tabs.component.ts | 7 +- .../resources-table-header.component.ts | 7 +- .../admin/security-settings.component.ts | 7 +- .../admin/send-test-sms-dialog.component.ts | 7 +- .../pages/admin/sms-provider.component.ts | 7 +- .../pages/admin/trendz-settings.component.ts | 7 +- .../two-factor-auth-settings.component.ts | 7 +- .../ai-model-table-header.component.ts | 9 +- .../asset-profile-tabs.component.ts | 7 +- .../asset/asset-table-header.component.ts | 7 +- .../home/pages/asset/asset-tabs.component.ts | 7 +- .../home/pages/asset/asset.component.ts | 7 +- .../pages/customer/customer-tabs.component.ts | 7 +- .../home/pages/customer/customer.component.ts | 7 +- .../dashboard/dashboard-form.component.ts | 7 +- .../dashboard/dashboard-tabs.component.ts | 7 +- .../make-dashboard-public-dialog.component.ts | 7 +- ...ge-dashboard-customers-dialog.component.ts | 9 +- .../device-profile-tabs.component.ts | 7 +- ...evice-transport-configuration.component.ts | 17 +- .../default-device-configuration.component.ts | 17 +- ...evice-transport-configuration.component.ts | 17 +- .../data/device-configuration.component.ts | 17 +- .../device/data/device-data.component.ts | 31 +- ...evice-transport-configuration.component.ts | 30 +- ...evice-transport-configuration.component.ts | 17 +- ...evice-transport-configuration.component.ts | 17 +- ...evice-transport-configuration.component.ts | 28 +- ...ice-check-connectivity-dialog.component.ts | 7 +- .../device-credentials-dialog.component.ts | 9 +- .../device/device-table-header.component.ts | 7 +- .../pages/device/device-tabs.component.ts | 7 +- .../home/pages/device/device.component.ts | 7 +- .../edge-instructions-dialog.component.ts | 7 +- .../pages/edge/edge-table-header.component.ts | 7 +- .../home/pages/edge/edge-tabs.component.ts | 7 +- .../modules/home/pages/edge/edge.component.ts | 7 +- .../entity-view-table-header.component.ts | 7 +- .../entity-view/entity-view-tabs.component.ts | 7 +- .../entity-view/entity-view.component.ts | 7 +- .../pages/home-links/home-links.component.ts | 9 +- .../mobile-app-dialog.component.ts | 9 +- .../mobile-app-table-header.component.ts | 7 +- .../applications/mobile-app.component.ts | 7 +- .../remove-app-dialog.component.ts | 7 +- .../add-mobile-page-dialog.component.ts | 7 +- .../custom-mobile-page-panel.component.ts | 9 +- .../layout/custom-mobile-page.component.ts | 31 +- .../default-mobile-page-panel.component.ts | 9 +- .../bundes/layout/mobile-layout.component.ts | 31 +- .../layout/mobile-page-item-row.component.ts | 33 +- ...bile-app-configuration-dialog.component.ts | 7 +- .../bundes/mobile-bundle-dialog.component.ts | 7 +- .../mobile-bundle-table-header.component.ts | 7 +- .../mobile/common/editor-panel.component.ts | 9 +- ...obile-qr-code-widget-settings.component.ts | 7 +- .../inbox-notification-dialog.component.ts | 7 +- .../inbox/inbox-table-header.component.ts | 7 +- ...recipient-notification-dialog.component.ts | 7 +- .../rule/escalation-form.component.ts | 31 +- .../rule/escalations.component.ts | 31 +- .../rule-notification-dialog.component.ts | 7 +- .../sent/sent-error-dialog.component.ts | 7 +- .../sent/sent-notification-dialog.componet.ts | 7 +- .../notification-setting-form.component.ts | 21 +- .../notification-settings.component.ts | 7 +- ...n-action-button-configuration.component.ts | 29 +- ...cation-template-configuration.component.ts | 31 +- .../template-notification-dialog.component.ts | 7 +- .../ota-update/ota-update-tabs.component.ts | 7 +- .../pages/ota-update/ota-update.component.ts | 5 +- .../home/pages/profile/profile.component.ts | 7 +- .../pages/rulechain/link-labels.component.ts | 17 +- .../rulechain/rule-node-config.component.ts | 19 +- .../rulechain/rule-node-details.component.ts | 7 +- .../rulechain/rule-node-link.component.ts | 17 +- .../rulechain/rulechain-page.component.ts | 36 +- .../rulechain/rulechain-tabs.component.ts | 7 +- .../pages/rulechain/rulechain.component.ts | 7 +- .../pages/rulechain/rulenode.component.ts | 9 +- .../scada-symbol-behavior-panel.component.ts | 9 +- .../scada-symbol-behavior-row.component.ts | 33 +- .../scada-symbol-behaviors.component.ts | 33 +- ...l-metadata-tag-function-panel.component.ts | 9 +- .../scada-symbol-metadata-tag.component.ts | 33 +- .../scada-symbol-metadata-tags.component.ts | 33 +- .../scada-symbol-metadata.component.ts | 33 +- .../scada-symbol-editor.component.ts | 9 +- .../scada-symbol-tooltip.components.ts | 35 +- .../scada-symbol/scada-symbol.component.ts | 9 +- .../backup-code-auth-dialog.component.ts | 7 +- .../email-auth-dialog.component.ts | 7 +- .../sms-auth-dialog.component.ts | 7 +- .../totp-auth-dialog.component.ts | 7 +- .../home/pages/security/security.component.ts | 7 +- .../tenant-profile-tabs.component.ts | 7 +- .../pages/tenant/tenant-tabs.component.ts | 7 +- .../home/pages/tenant/tenant.component.ts | 7 +- .../user/activation-link-dialog.component.ts | 5 +- .../pages/user/add-user-dialog.component.ts | 7 +- .../home/pages/user/user-tabs.component.ts | 7 +- .../modules/home/pages/user/user.component.ts | 7 +- .../save-widget-type-as-dialog.component.ts | 7 +- .../select-widget-type-dialog.component.ts | 7 +- .../pages/widget/widget-editor.component.ts | 9 +- .../widget-type-autocomplete.component.ts | 19 +- .../widget/widget-type-tabs.component.ts | 7 +- .../pages/widget/widget-type.component.ts | 7 +- .../widget/widgets-bundle-dialog.component.ts | 9 +- .../widget/widgets-bundle-tabs.component.ts | 7 +- .../widgets-bundle-widgets.component.ts | 7 +- .../pages/widget/widgets-bundle.component.ts | 7 +- .../pages/login/create-password.component.ts | 7 +- .../pages/login/link-expired.component.ts | 7 +- .../login/pages/login/login.component.ts | 7 +- .../login/reset-password-request.component.ts | 7 +- .../pages/login/reset-password.component.ts | 7 +- .../login/two-factor-auth-login.component.ts | 7 +- .../shared/components/breadcrumb.component.ts | 9 +- .../button/copy-button.component.ts | 7 +- .../button/toggle-password.component.ts | 7 +- .../button/widget-button-toggle.component.ts | 7 +- .../button/widget-button.component.ts | 9 +- .../shared/components/cheatsheet.component.ts | 7 +- .../components/circular-progress.directive.ts | 5 +- .../components/color-input.component.ts | 21 +- .../color-picker-panel.component.ts | 11 +- .../color-picker/color-picker.component.ts | 21 +- .../color-picker/hex-input.component.ts | 9 +- .../shared/components/contact.component.ts | 5 +- .../country-autocomplete.component.ts | 33 +- .../app/shared/components/css.component.ts | 33 +- .../dashboard-autocomplete.component.ts | 17 +- .../dashboard-select-panel.component.ts | 7 +- .../components/dashboard-select.component.ts | 17 +- .../dashboard-state-autocomplete.component.ts | 17 +- .../dialog/alert-dialog.component.ts | 7 +- .../dialog/color-picker-dialog.component.ts | 7 +- .../dialog/confirm-dialog.component.ts | 7 +- .../entity-conflict-dialog.component.ts | 15 +- .../dialog/error-alert-dialog.component.ts | 7 +- .../json-object-edit-dialog.component.ts | 7 +- .../dialog/material-icons-dialog.component.ts | 9 +- .../node-script-test-dialog.component.ts | 11 +- .../dialog/todo-dialog.component.ts | 7 +- .../directives/component-outlet.directive.ts | 7 +- .../sring-template-outlet.directive.ts | 7 +- .../directives/tb-json-to-string.directive.ts | 39 +- .../entity/entity-autocomplete.component.ts | 17 +- .../entity/entity-gateway-select.component.ts | 17 +- .../entity-key-autocomplete.component.ts | 29 +- .../entity/entity-keys-list.component.ts | 21 +- .../entity/entity-list-select.component.ts | 17 +- .../entity/entity-list.component.ts | 31 +- .../entity/entity-select.component.ts | 17 +- .../entity-subtype-autocomplete.component.ts | 17 +- .../entity/entity-subtype-list.component.ts | 21 +- .../entity/entity-subtype-select.component.ts | 17 +- .../entity/entity-type-list.component.ts | 21 +- .../entity/entity-type-select.component.ts | 17 +- .../components/fab-toolbar.component.ts | 21 +- .../shared/components/file-input.component.ts | 21 +- .../footer-fab-buttons.component.ts | 9 +- .../app/shared/components/footer.component.ts | 7 +- .../shared/components/fullscreen.directive.ts | 5 +- .../components/grid/scroll-grid.component.ts | 9 +- .../components/help-markdown.component.ts | 7 +- .../shared/components/help-popup.component.ts | 9 +- .../app/shared/components/help.component.ts | 5 +- .../components/hint-tooltip-icon.component.ts | 7 +- .../shared/components/hotkeys.directive.ts | 5 +- .../app/shared/components/html.component.ts | 33 +- .../app/shared/components/icon.component.ts | 35 +- .../components/image-input.component.ts | 21 +- .../image/embed-image-dialog.component.ts | 7 +- .../image/gallery-image-input.component.ts | 21 +- .../image/image-dialog.component.ts | 7 +- .../image/image-gallery-dialog.component.ts | 7 +- .../image/image-gallery.component.ts | 9 +- .../image/image-references.component.ts | 7 +- .../multiple-gallery-image-input.component.ts | 21 +- .../image/scada-symbol-input.component.ts | 21 +- .../image/upload-image-dialog.component.ts | 9 +- .../js-func-module-row.component.ts | 33 +- .../components/js-func-modules.component.ts | 9 +- .../shared/components/js-func.component.ts | 33 +- .../components/json-content.component.ts | 33 +- .../components/json-object-edit.component.ts | 33 +- .../components/json-object-view.component.ts | 21 +- .../app/shared/components/kv-map.component.ts | 31 +- .../shared/components/led-light.component.ts | 7 +- .../app/shared/components/logo.component.ts | 7 +- .../components/markdown-editor.component.ts | 23 +- .../shared/components/markdown.component.ts | 7 +- .../material-icon-select.component.ts | 21 +- .../components/material-icons.component.ts | 11 +- .../message-type-autocomplete.component.ts | 17 +- .../mqtt-version-select.component.ts | 17 +- .../multiple-image-input.component.ts | 21 +- .../shared/components/nav-tree.component.ts | 9 +- .../notification/notification.component.ts | 7 +- .../template-autocomplete.component.ts | 19 +- .../ota-package-autocomplete.component.ts | 17 +- .../components/phone-input.component.ts | 33 +- .../shared/components/popover.component.ts | 32 +- .../components/protobuf-content.component.ts | 21 +- .../queue/queue-autocomplete.component.ts | 17 +- .../relation-type-autocomplete.component.ts | 17 +- .../resource-autocomplete.component.ts | 17 +- .../resources-in-use-dialog.component.ts | 7 +- .../rule-chain-select-panel.component.ts | 7 +- .../rule-chain/rule-chain-select.component.ts | 17 +- .../components/script-lang.component.ts | 23 +- ...ack-conversation-autocomplete.component.ts | 17 +- .../components/socialshare-panel.component.ts | 7 +- .../string-autocomplete.component.ts | 21 +- .../components/string-items-list.component.ts | 23 +- .../shared/components/svg-xml.component.ts | 33 +- .../shared/components/tb-anchor.component.ts | 5 +- .../components/tb-checkbox.component.ts | 19 +- .../shared/components/tb-error.component.ts | 33 +- ...regation-options-config-panel.component.ts | 7 +- .../aggregation-type-select.component.ts | 17 +- .../grouping-interval-options.component.ts | 21 +- .../time/datapoints-limit.component.ts | 31 +- .../time/datetime-period.component.ts | 21 +- .../components/time/datetime.component.ts | 21 +- .../history-selector.component.ts | 7 +- ...interval-options-config-panel.component.ts | 7 +- .../time/quick-time-interval.component.ts | 21 +- .../components/time/timeinterval.component.ts | 21 +- .../timewindow-config-dialog.component.ts | 7 +- .../time/timewindow-panel.component.ts | 7 +- .../components/time/timewindow.component.ts | 21 +- .../time/timezone-panel.component.ts | 7 +- .../time/timezone-select.component.ts | 17 +- .../components/time/timezone.component.ts | 21 +- .../app/shared/components/toast.directive.ts | 12 +- .../components/toggle-header.component.ts | 10 +- .../components/toggle-select.component.ts | 21 +- .../shared/components/unit-input.component.ts | 23 +- .../unit-settings-panel.component.ts | 11 +- .../shared/components/user-menu.component.ts | 9 +- .../components/value-input.component.ts | 21 +- .../vc/branch-autocomplete.component.ts | 19 +- .../widgets-bundle-search.component.ts | 19 +- .../widgets-bundle-select.component.ts | 19 +- .../directives/context-menu.directive.ts | 3 +- .../truncate-with-tooltip.directive.ts | 11 +- .../export-resource-dialog.component.ts | 7 +- .../import-dialog-csv.component.ts | 9 +- .../import-export/import-dialog.component.ts | 9 +- .../table-columns-assignment.component.ts | 31 +- .../app/shared/pipe/custom-translate.pipe.ts | 3 +- ui-ngx/src/app/shared/pipe/date-ago.pipe.ts | 3 +- .../src/app/shared/pipe/enum-to-array.pipe.ts | 3 +- ui-ngx/src/app/shared/pipe/file-size.pipe.ts | 5 +- ui-ngx/src/app/shared/pipe/highlight.pipe.ts | 5 +- ui-ngx/src/app/shared/pipe/image.pipe.ts | 3 +- .../app/shared/pipe/keyboard-shortcut.pipe.ts | 3 +- .../pipe/milliseconds-to-time-string.pipe.ts | 3 +- ui-ngx/src/app/shared/pipe/nospace.pipe.ts | 3 +- ui-ngx/src/app/shared/pipe/safe.pipe.ts | 3 +- .../shared/pipe/selectable-columns.pipe.ts | 5 +- .../src/app/shared/pipe/short-number.pipe.ts | 3 +- ui-ngx/src/app/shared/pipe/tbJson.pipe.ts | 5 +- ui-ngx/src/app/shared/pipe/truncate.pipe.ts | 5 +- ui-ngx/yarn.lock | 3149 ++++++++++++++--- 926 files changed, 9352 insertions(+), 6269 deletions(-) diff --git a/ui-ngx/package.json b/ui-ngx/package.json index b17c3e1d35..d11f3c4909 100644 --- a/ui-ngx/package.json +++ b/ui-ngx/package.json @@ -13,16 +13,16 @@ }, "private": true, "dependencies": { - "@angular/animations": "18.2.13", + "@angular/animations": "19.2.18", "@angular/cdk": "18.2.14", - "@angular/common": "18.2.13", - "@angular/compiler": "18.2.13", - "@angular/core": "18.2.13", - "@angular/forms": "18.2.13", + "@angular/common": "19.2.18", + "@angular/compiler": "19.2.18", + "@angular/core": "19.2.18", + "@angular/forms": "19.2.18", "@angular/material": "18.2.14", - "@angular/platform-browser": "18.2.13", - "@angular/platform-browser-dynamic": "18.2.13", - "@angular/router": "18.2.13", + "@angular/platform-browser": "19.2.18", + "@angular/platform-browser-dynamic": "19.2.18", + "@angular/router": "19.2.18", "@auth0/angular-jwt": "^5.2.0", "@flowjs/flow.js": "^2.14.1", "@flowjs/ngx-flow": "18.0.1", @@ -65,7 +65,7 @@ "leaflet.markercluster": "1.5.3", "libphonenumber-js": "^1.11.15", "maplibre-gl": "^5.2.0", - "marked": "~12.0.2", + "marked": "~15.0.12", "moment": "^2.30.1", "moment-timezone": "^0.5.45", "ngx-clipboard": "^16.0.0", @@ -73,7 +73,7 @@ "ngx-drag-drop": "^18.0.2", "ngx-flowchart": "https://github.com/thingsboard/ngx-flowchart.git#release/3.0.0", "ngx-hm-carousel": "^18.0.0", - "ngx-markdown": "^18.1.0", + "ngx-markdown": "^19.1.1", "ngx-sharebuttons": "^15.0.6", "ngx-translate-messageformat-compiler": "^7.0.0", "objectpath": "^2.0.0", @@ -90,17 +90,17 @@ "tooltipster": "^4.2.8", "tslib": "^2.7.0", "typeface-roboto": "^1.1.13", - "zone.js": "~0.14.10" + "zone.js": "~0.15.1" }, "devDependencies": { "@angular-builders/custom-esbuild": "18.0.0", - "@angular-devkit/build-angular": "18.2.12", - "@angular-devkit/core": "18.2.12", - "@angular-devkit/schematics": "18.2.12", - "@angular/build": "18.2.12", - "@angular/cli": "18.2.12", - "@angular/compiler-cli": "18.2.13", - "@angular/language-service": "18.2.13", + "@angular-devkit/build-angular": "19.2.19", + "@angular-devkit/core": "19.2.19", + "@angular-devkit/schematics": "19.2.19", + "@angular/build": "19.2.19", + "@angular/cli": "19.2.19", + "@angular/compiler-cli": "19.2.18", + "@angular/language-service": "19.2.18", "@types/ace-diff": "^2.1.4", "@types/canvas-gauges": "^2.1.8", "@types/flot": "^0.0.36", diff --git a/ui-ngx/src/app/app.component.ts b/ui-ngx/src/app/app.component.ts index 5bc70240a5..90e01c4c17 100644 --- a/ui-ngx/src/app/app.component.ts +++ b/ui-ngx/src/app/app.component.ts @@ -35,9 +35,10 @@ import { SETTINGS_KEY } from '@core/settings/settings.effects'; import { initCustomJQueryEvents } from '@shared/models/jquery-event.models'; @Component({ - selector: 'tb-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] + selector: 'tb-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'], + standalone: false }) export class AppComponent { diff --git a/ui-ngx/src/app/modules/home/components/ai-model/ai-model-dialog.component.ts b/ui-ngx/src/app/modules/home/components/ai-model/ai-model-dialog.component.ts index 570e1e7cb4..d5d5f20ed8 100644 --- a/ui-ngx/src/app/modules/home/components/ai-model/ai-model-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/ai-model/ai-model-dialog.component.ts @@ -46,9 +46,10 @@ export interface AIModelDialogData { } @Component({ - selector: 'tb-ai-model-dialog', - templateUrl: './ai-model-dialog.component.html', - styleUrls: ['./ai-model-dialog.component.scss'] + selector: 'tb-ai-model-dialog', + templateUrl: './ai-model-dialog.component.html', + styleUrls: ['./ai-model-dialog.component.scss'], + standalone: false }) export class AIModelDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/ai-model/check-connectivity-dialog.component.ts b/ui-ngx/src/app/modules/home/components/ai-model/check-connectivity-dialog.component.ts index f16e85983f..3c48890c2f 100644 --- a/ui-ngx/src/app/modules/home/components/ai-model/check-connectivity-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/ai-model/check-connectivity-dialog.component.ts @@ -28,9 +28,10 @@ export interface AIModelDialogData { } @Component({ - selector: 'tb-check-connectivity-dialog', - templateUrl: './check-connectivity-dialog.component.html', - styleUrls: ['./check-connectivity-dialog.component.scss'] + selector: 'tb-check-connectivity-dialog', + templateUrl: './check-connectivity-dialog.component.html', + styleUrls: ['./check-connectivity-dialog.component.scss'], + standalone: false }) export class CheckConnectivityDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-panel.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-panel.component.ts index 4dedace9cc..ddc46edcb8 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-panel.component.ts @@ -54,9 +54,10 @@ export interface AlarmAssigneePanelData { } @Component({ - selector: 'tb-alarm-assignee-panel', - templateUrl: './alarm-assignee-panel.component.html', - styleUrls: ['./alarm-assignee-panel.component.scss'] + selector: 'tb-alarm-assignee-panel', + templateUrl: './alarm-assignee-panel.component.html', + styleUrls: ['./alarm-assignee-panel.component.scss'], + standalone: false }) export class AlarmAssigneePanelComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-select-panel.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-select-panel.component.ts index 7cba10aa2f..845d3a8089 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-select-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-select-panel.component.ts @@ -47,9 +47,10 @@ export interface AlarmAssigneeSelectPanelData { } @Component({ - selector: 'tb-alarm-assignee-select-panel', - templateUrl: './alarm-assignee-panel.component.html', - styleUrls: ['./alarm-assignee-panel.component.scss'] + selector: 'tb-alarm-assignee-select-panel', + templateUrl: './alarm-assignee-panel.component.html', + styleUrls: ['./alarm-assignee-panel.component.scss'], + standalone: false }) export class AlarmAssigneeSelectPanelComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-select.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-select.component.ts index dd0ebce70b..a97a4a04ac 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-select.component.ts @@ -34,16 +34,17 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { AlarmAssigneeOption } from '@shared/models/alarm.models'; @Component({ - selector: 'tb-alarm-assignee-select', - templateUrl: './alarm-assignee-select.component.html', - styleUrls: ['./alarm-assignee.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AlarmAssigneeSelectComponent), - multi: true - } - ] + selector: 'tb-alarm-assignee-select', + templateUrl: './alarm-assignee-select.component.html', + styleUrls: ['./alarm-assignee.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AlarmAssigneeSelectComponent), + multi: true + } + ], + standalone: false }) export class AlarmAssigneeSelectComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee.component.ts index 604685d76e..55127e68c5 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-assignee.component.ts @@ -28,9 +28,10 @@ import { TranslateService } from '@ngx-translate/core'; import { isNotEmptyStr } from '@core/utils'; @Component({ - selector: 'tb-alarm-assignee', - templateUrl: './alarm-assignee.component.html', - styleUrls: ['./alarm-assignee.component.scss'] + selector: 'tb-alarm-assignee', + templateUrl: './alarm-assignee.component.html', + styleUrls: ['./alarm-assignee.component.scss'], + standalone: false }) export class AlarmAssigneeComponent { @Input() diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-comment-dialog.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-comment-dialog.component.ts index 0584c4d4e4..8c9b751348 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-comment-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-comment-dialog.component.ts @@ -28,9 +28,10 @@ export interface AlarmCommentDialogData { } @Component({ - selector: 'tb-alarm-comment-dialog', - templateUrl: './alarm-comment-dialog.component.html', - styleUrls: [] + selector: 'tb-alarm-comment-dialog', + templateUrl: './alarm-comment-dialog.component.html', + styleUrls: [], + standalone: false }) export class AlarmCommentDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts index 3020d73831..1121b53d3d 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts @@ -51,9 +51,10 @@ interface AlarmCommentsDisplayData { } @Component({ - selector: 'tb-alarm-comment', - templateUrl: './alarm-comment.component.html', - styleUrls: ['./alarm-comment.component.scss'] + selector: 'tb-alarm-comment', + templateUrl: './alarm-comment.component.html', + styleUrls: ['./alarm-comment.component.scss'], + standalone: false }) export class AlarmCommentComponent implements OnInit { @Input() diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-details-dialog.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-details-dialog.component.ts index b68d1d983a..67d2b71245 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-details-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-details-dialog.component.ts @@ -47,9 +47,10 @@ export interface AlarmDetailsDialogData { } @Component({ - selector: 'tb-alarm-details-dialog', - templateUrl: './alarm-details-dialog.component.html', - styleUrls: ['./alarm-details-dialog.component.scss'] + selector: 'tb-alarm-details-dialog', + templateUrl: './alarm-details-dialog.component.html', + styleUrls: ['./alarm-details-dialog.component.scss'], + standalone: false }) export class AlarmDetailsDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts index 0c4344e257..c296f70455 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts @@ -60,16 +60,17 @@ export interface AlarmFilterConfigData { // @dynamic @Component({ - selector: 'tb-alarm-filter-config', - templateUrl: './alarm-filter-config.component.html', - styleUrls: ['./alarm-filter-config.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AlarmFilterConfigComponent), - multi: true - } - ] + selector: 'tb-alarm-filter-config', + templateUrl: './alarm-filter-config.component.html', + styleUrls: ['./alarm-filter-config.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AlarmFilterConfigComponent), + multi: true + } + ], + standalone: false }) export class AlarmFilterConfigComponent implements OnInit, OnDestroy, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-table-header.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-table-header.component.ts index c069169e4a..7805498f1c 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-table-header.component.ts @@ -23,9 +23,10 @@ import { AlarmTableConfig } from './alarm-table-config'; import { AlarmFilterConfig } from '@shared/models/query/query.models'; @Component({ - selector: 'tb-alarm-table-header', - templateUrl: './alarm-table-header.component.html', - styleUrls: ['./alarm-table-header.component.scss'] + selector: 'tb-alarm-table-header', + templateUrl: './alarm-table-header.component.html', + styleUrls: ['./alarm-table-header.component.scss'], + standalone: false }) export class AlarmTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-table.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-table.component.ts index daa28d0fd9..c0754b3a94 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-table.component.ts @@ -42,9 +42,10 @@ interface AlarmPageQueryParams extends PageQueryParam { } @Component({ - selector: 'tb-alarm-table', - templateUrl: './alarm-table.component.html', - styleUrls: ['./alarm-table.component.scss'] + selector: 'tb-alarm-table', + templateUrl: './alarm-table.component.html', + styleUrls: ['./alarm-table.component.scss'], + standalone: false }) export class AlarmTableComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/alias/aliases-entity-autocomplete.component.ts b/ui-ngx/src/app/modules/home/components/alias/aliases-entity-autocomplete.component.ts index c1f3938853..89bdc9c8cc 100644 --- a/ui-ngx/src/app/modules/home/components/alias/aliases-entity-autocomplete.component.ts +++ b/ui-ngx/src/app/modules/home/components/alias/aliases-entity-autocomplete.component.ts @@ -29,14 +29,15 @@ import { EntityService } from '@core/http/entity.service'; import { isDefinedAndNotNull } from '@core/utils'; @Component({ - selector: 'tb-aliases-entity-autocomplete', - templateUrl: './aliases-entity-autocomplete.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AliasesEntityAutocompleteComponent), - multi: true - }] + selector: 'tb-aliases-entity-autocomplete', + templateUrl: './aliases-entity-autocomplete.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AliasesEntityAutocompleteComponent), + multi: true + }], + standalone: false }) export class AliasesEntityAutocompleteComponent implements ControlValueAccessor, OnInit, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/alias/aliases-entity-select-panel.component.ts b/ui-ngx/src/app/modules/home/components/alias/aliases-entity-select-panel.component.ts index 9d6c84b3ff..89df2ee017 100644 --- a/ui-ngx/src/app/modules/home/components/alias/aliases-entity-select-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/alias/aliases-entity-select-panel.component.ts @@ -26,9 +26,10 @@ export interface AliasesEntitySelectPanelData { } @Component({ - selector: 'tb-aliases-entity-select-panel', - templateUrl: './aliases-entity-select-panel.component.html', - styleUrls: ['./aliases-entity-select-panel.component.scss'] + selector: 'tb-aliases-entity-select-panel', + templateUrl: './aliases-entity-select-panel.component.html', + styleUrls: ['./aliases-entity-select-panel.component.scss'], + standalone: false }) export class AliasesEntitySelectPanelComponent { diff --git a/ui-ngx/src/app/modules/home/components/alias/aliases-entity-select.component.ts b/ui-ngx/src/app/modules/home/components/alias/aliases-entity-select.component.ts index 74f4a8c866..a8e1ddf762 100644 --- a/ui-ngx/src/app/modules/home/components/alias/aliases-entity-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/alias/aliases-entity-select.component.ts @@ -41,9 +41,10 @@ import { deepClone } from '@core/utils'; import { AliasFilterType } from '@shared/models/alias.models'; @Component({ - selector: 'tb-aliases-entity-select', - templateUrl: './aliases-entity-select.component.html', - styleUrls: ['./aliases-entity-select.component.scss'] + selector: 'tb-aliases-entity-select', + templateUrl: './aliases-entity-select.component.html', + styleUrls: ['./aliases-entity-select.component.scss'], + standalone: false }) export class AliasesEntitySelectComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/alias/entity-alias-dialog.component.ts b/ui-ngx/src/app/modules/home/components/alias/entity-alias-dialog.component.ts index 5fc1e4baa1..208aabab3c 100644 --- a/ui-ngx/src/app/modules/home/components/alias/entity-alias-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/alias/entity-alias-dialog.component.ts @@ -46,10 +46,11 @@ export interface EntityAliasDialogData { } @Component({ - selector: 'tb-entity-alias-dialog', - templateUrl: './entity-alias-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: EntityAliasDialogComponent}], - styleUrls: ['./entity-alias-dialog.component.scss'] + selector: 'tb-entity-alias-dialog', + templateUrl: './entity-alias-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: EntityAliasDialogComponent }], + styleUrls: ['./entity-alias-dialog.component.scss'], + standalone: false }) export class EntityAliasDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/alias/entity-aliases-dialog.component.ts b/ui-ngx/src/app/modules/home/components/alias/entity-aliases-dialog.component.ts index a1a430670e..62f325d8ae 100644 --- a/ui-ngx/src/app/modules/home/components/alias/entity-aliases-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/alias/entity-aliases-dialog.component.ts @@ -54,10 +54,11 @@ export interface EntityAliasesDialogData { } @Component({ - selector: 'tb-entity-aliases-dialog', - templateUrl: './entity-aliases-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: EntityAliasesDialogComponent}], - styleUrls: ['./entity-aliases-dialog.component.scss'] + selector: 'tb-entity-aliases-dialog', + templateUrl: './entity-aliases-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: EntityAliasesDialogComponent }], + styleUrls: ['./entity-aliases-dialog.component.scss'], + standalone: false }) export class EntityAliasesDialogComponent extends DialogComponent implements ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/attribute/add-attribute-dialog.component.ts b/ui-ngx/src/app/modules/home/components/attribute/add-attribute-dialog.component.ts index c80f1cacd7..8300e0696c 100644 --- a/ui-ngx/src/app/modules/home/components/attribute/add-attribute-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/attribute/add-attribute-dialog.component.ts @@ -33,10 +33,11 @@ export interface AddAttributeDialogData { } @Component({ - selector: 'tb-add-attribute-dialog', - templateUrl: './add-attribute-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: AddAttributeDialogComponent}], - styleUrls: [] + selector: 'tb-add-attribute-dialog', + templateUrl: './add-attribute-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: AddAttributeDialogComponent }], + styleUrls: [], + standalone: false }) export class AddAttributeDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/attribute/add-widget-to-dashboard-dialog.component.ts b/ui-ngx/src/app/modules/home/components/attribute/add-widget-to-dashboard-dialog.component.ts index 95e51ac915..c03b7a71f2 100644 --- a/ui-ngx/src/app/modules/home/components/attribute/add-widget-to-dashboard-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/attribute/add-widget-to-dashboard-dialog.component.ts @@ -49,10 +49,11 @@ export interface AddWidgetToDashboardDialogData { } @Component({ - selector: 'tb-add-widget-to-dashboard-dialog', - templateUrl: './add-widget-to-dashboard-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: AddWidgetToDashboardDialogComponent}], - styleUrls: ['./add-widget-to-dashboard-dialog.component.scss'] + selector: 'tb-add-widget-to-dashboard-dialog', + templateUrl: './add-widget-to-dashboard-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: AddWidgetToDashboardDialogComponent }], + styleUrls: ['./add-widget-to-dashboard-dialog.component.scss'], + standalone: false }) export class AddWidgetToDashboardDialogComponent extends DialogComponent diff --git a/ui-ngx/src/app/modules/home/components/attribute/attribute-table.component.ts b/ui-ngx/src/app/modules/home/components/attribute/attribute-table.component.ts index a1b954b8ab..55acece392 100644 --- a/ui-ngx/src/app/modules/home/components/attribute/attribute-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/attribute/attribute-table.component.ts @@ -92,10 +92,11 @@ import { FormBuilder } from '@angular/forms'; @Component({ - selector: 'tb-attribute-table', - templateUrl: './attribute-table.component.html', - styleUrls: ['./attribute-table.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-attribute-table', + templateUrl: './attribute-table.component.html', + styleUrls: ['./attribute-table.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class AttributeTableComponent extends PageComponent implements AfterViewInit, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/attribute/delete-timeseries-panel.component.ts b/ui-ngx/src/app/modules/home/components/attribute/delete-timeseries-panel.component.ts index 5b24eea5a9..c7d68f04e0 100644 --- a/ui-ngx/src/app/modules/home/components/attribute/delete-timeseries-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/attribute/delete-timeseries-panel.component.ts @@ -36,9 +36,10 @@ export interface DeleteTimeseriesPanelResult { } @Component({ - selector: 'tb-delete-timeseries-panel', - templateUrl: './delete-timeseries-panel.component.html', - styleUrls: ['./delete-timeseries-panel.component.scss'] + selector: 'tb-delete-timeseries-panel', + templateUrl: './delete-timeseries-panel.component.html', + styleUrls: ['./delete-timeseries-panel.component.scss'], + standalone: false }) export class DeleteTimeseriesPanelComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/attribute/edit-attribute-value-panel.component.ts b/ui-ngx/src/app/modules/home/components/attribute/edit-attribute-value-panel.component.ts index 0eca716bb9..dbe63cb2b3 100644 --- a/ui-ngx/src/app/modules/home/components/attribute/edit-attribute-value-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/attribute/edit-attribute-value-panel.component.ts @@ -29,10 +29,11 @@ export interface EditAttributeValuePanelData { } @Component({ - selector: 'tb-edit-attribute-value-panel', - templateUrl: './edit-attribute-value-panel.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: EditAttributeValuePanelComponent}], - styleUrls: ['./edit-attribute-value-panel.component.scss'] + selector: 'tb-edit-attribute-value-panel', + templateUrl: './edit-attribute-value-panel.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: EditAttributeValuePanelComponent }], + styleUrls: ['./edit-attribute-value-panel.component.scss'], + standalone: false }) export class EditAttributeValuePanelComponent extends PageComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.ts b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.ts index 12305365e0..d430e97e1b 100644 --- a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.ts @@ -29,9 +29,10 @@ export interface AuditLogDetailsDialogData { } @Component({ - selector: 'tb-audit-log-details-dialog', - templateUrl: './audit-log-details-dialog.component.html', - styleUrls: ['./audit-log-details-dialog.component.scss'] + selector: 'tb-audit-log-details-dialog', + templateUrl: './audit-log-details-dialog.component.html', + styleUrls: ['./audit-log-details-dialog.component.scss'], + standalone: false }) export class AuditLogDetailsDialogComponent extends DialogComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-table.component.ts b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-table.component.ts index 71e845502a..8a912348be 100644 --- a/ui-ngx/src/app/modules/home/components/audit-log/audit-log-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/audit-log/audit-log-table.component.ts @@ -32,9 +32,10 @@ import { getCurrentAuthUser } from '@core/auth/auth.selectors'; import { ActivatedRoute } from '@angular/router'; @Component({ - selector: 'tb-audit-log-table', - templateUrl: './audit-log-table.component.html', - styleUrls: ['./audit-log-table.component.scss'] + selector: 'tb-audit-log-table', + templateUrl: './audit-log-table.component.html', + styleUrls: ['./audit-log-table.component.scss'], + standalone: false }) export class AuditLogTableComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table.component.ts index 666a347564..741e9851e1 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table.component.ts @@ -37,11 +37,12 @@ import { EntityDebugSettingsService } from '@home/components/entity/debug/entity import { DatePipe } from '@angular/common'; @Component({ - selector: 'tb-calculated-fields-table', - templateUrl: './calculated-fields-table.component.html', - styleUrls: ['./calculated-fields-table.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [EntityDebugSettingsService] + selector: 'tb-calculated-fields-table', + templateUrl: './calculated-fields-table.component.html', + styleUrls: ['./calculated-fields-table.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [EntityDebugSettingsService], + standalone: false }) export class CalculatedFieldsTableComponent { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/arguments-table/calculated-field-arguments-table.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/arguments-table/calculated-field-arguments-table.component.ts index 5446aaf14e..4b89028fb4 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/arguments-table/calculated-field-arguments-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/arguments-table/calculated-field-arguments-table.component.ts @@ -62,21 +62,22 @@ import { NULL_UUID } from '@shared/models/id/has-uuid'; import { BaseData } from '@shared/models/base-data'; @Component({ - selector: 'tb-calculated-field-arguments-table', - templateUrl: './calculated-field-arguments-table.component.html', - styleUrls: [`calculated-field-arguments-table.component.scss`], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CalculatedFieldArgumentsTableComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => CalculatedFieldArgumentsTableComponent), - multi: true - } - ], + selector: 'tb-calculated-field-arguments-table', + templateUrl: './calculated-field-arguments-table.component.html', + styleUrls: [`calculated-field-arguments-table.component.scss`], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CalculatedFieldArgumentsTableComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => CalculatedFieldArgumentsTableComponent), + multi: true + } + ], + standalone: false }) export class CalculatedFieldArgumentsTableComponent implements ControlValueAccessor, Validator, OnChanges, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/debug-dialog/calculated-field-debug-dialog.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/debug-dialog/calculated-field-debug-dialog.component.ts index e0f67a87cd..579433b5ca 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/debug-dialog/calculated-field-debug-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/debug-dialog/calculated-field-debug-dialog.component.ts @@ -35,9 +35,10 @@ export interface CalculatedFieldDebugDialogData { } @Component({ - selector: 'tb-calculated-field-debug-dialog', - styleUrls: ['calculated-field-debug-dialog.component.scss'], - templateUrl: './calculated-field-debug-dialog.component.html', + selector: 'tb-calculated-field-debug-dialog', + styleUrls: ['calculated-field-debug-dialog.component.scss'], + templateUrl: './calculated-field-debug-dialog.component.html', + standalone: false }) export class CalculatedFieldDebugDialogComponent extends DialogComponent implements AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts index 1dbdf59f13..5a4cc6cedb 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts @@ -56,10 +56,11 @@ export interface CalculatedFieldDialogData { } @Component({ - selector: 'tb-calculated-field-dialog', - templateUrl: './calculated-field-dialog.component.html', - styleUrls: ['./calculated-field-dialog.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-calculated-field-dialog', + templateUrl: './calculated-field-dialog.component.html', + styleUrls: ['./calculated-field-dialog.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class CalculatedFieldDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/panel/calculated-field-argument-panel.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/panel/calculated-field-argument-panel.component.ts index cd32d96076..494d083b66 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/panel/calculated-field-argument-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/panel/calculated-field-argument-panel.component.ts @@ -45,9 +45,10 @@ import { EntityAutocompleteComponent } from '@shared/components/entity/entity-au import { NULL_UUID } from '@shared/models/id/has-uuid'; @Component({ - selector: 'tb-calculated-field-argument-panel', - templateUrl: './calculated-field-argument-panel.component.html', - styleUrls: ['./calculated-field-argument-panel.component.scss'] + selector: 'tb-calculated-field-argument-panel', + templateUrl: './calculated-field-argument-panel.component.html', + styleUrls: ['./calculated-field-argument-panel.component.scss'], + standalone: false }) export class CalculatedFieldArgumentPanelComponent implements OnInit, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/test-arguments/calculated-field-test-arguments.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/test-arguments/calculated-field-test-arguments.component.ts index 09b8b5e2cf..9f67906ce7 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/test-arguments/calculated-field-test-arguments.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/test-arguments/calculated-field-test-arguments.component.ts @@ -44,21 +44,22 @@ import { filter } from 'rxjs/operators'; import { MatDialog } from '@angular/material/dialog'; @Component({ - selector: 'tb-calculated-field-test-arguments', - templateUrl: './calculated-field-test-arguments.component.html', - styleUrls: ['./calculated-field-test-arguments.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CalculatedFieldTestArgumentsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => CalculatedFieldTestArgumentsComponent), - multi: true, - } - ] + selector: 'tb-calculated-field-test-arguments', + templateUrl: './calculated-field-test-arguments.component.html', + styleUrls: ['./calculated-field-test-arguments.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CalculatedFieldTestArgumentsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => CalculatedFieldTestArgumentsComponent), + multi: true, + } + ], + standalone: false }) export class CalculatedFieldTestArgumentsComponent extends PageComponent implements ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/calculated-fields/components/test-dialog/calculated-field-script-test-dialog.component.ts b/ui-ngx/src/app/modules/home/components/calculated-fields/components/test-dialog/calculated-field-script-test-dialog.component.ts index 8cf7515e3c..2593ab503b 100644 --- a/ui-ngx/src/app/modules/home/components/calculated-fields/components/test-dialog/calculated-field-script-test-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/calculated-fields/components/test-dialog/calculated-field-script-test-dialog.component.ts @@ -55,10 +55,11 @@ export interface CalculatedFieldTestScriptDialogData extends CalculatedFieldTest } @Component({ - selector: 'tb-calculated-field-script-test-dialog', - templateUrl: './calculated-field-script-test-dialog.component.html', - styleUrls: ['./calculated-field-script-test-dialog.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-calculated-field-script-test-dialog', + templateUrl: './calculated-field-script-test-dialog.component.html', + styleUrls: ['./calculated-field-script-test-dialog.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class CalculatedFieldScriptTestDialogComponent extends DialogComponent implements AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/add-widget-dialog.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/add-widget-dialog.component.ts index 0a4f527064..cc1ef8aed1 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/add-widget-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/add-widget-dialog.component.ts @@ -42,11 +42,12 @@ export interface AddWidgetDialogData { } @Component({ - selector: 'tb-add-widget-dialog', - templateUrl: './add-widget-dialog.component.html', - providers: [/*{provide: ErrorStateMatcher, useExisting: AddWidgetDialogComponent}*/], - styleUrls: ['./add-widget-dialog.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-add-widget-dialog', + templateUrl: './add-widget-dialog.component.html', + providers: [ /*{provide: ErrorStateMatcher, useExisting: AddWidgetDialogComponent}*/], + styleUrls: ['./add-widget-dialog.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class AddWidgetDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-image-dialog.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-image-dialog.component.ts index ed17125e0e..571629789b 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-image-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-image-dialog.component.ts @@ -41,9 +41,10 @@ export interface DashboardImageDialogResult { } @Component({ - selector: 'tb-dashboard-image-dialog', - templateUrl: './dashboard-image-dialog.component.html', - styleUrls: ['./dashboard-image-dialog.component.scss'] + selector: 'tb-dashboard-image-dialog', + templateUrl: './dashboard-image-dialog.component.html', + styleUrls: ['./dashboard-image-dialog.component.scss'], + standalone: false }) export class DashboardImageDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.ts index dfeae2b227..6f8488a249 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.ts @@ -160,11 +160,12 @@ import { HttpStatusCode } from '@angular/common/http'; // @dynamic @Component({ - selector: 'tb-dashboard-page', - templateUrl: './dashboard-page.component.html', - styleUrls: ['./dashboard-page.component.scss'], - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-dashboard-page', + templateUrl: './dashboard-page.component.html', + styleUrls: ['./dashboard-page.component.scss'], + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class DashboardPageComponent extends PageComponent implements IDashboardController, HasDirtyFlag, OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-settings-dialog.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-settings-dialog.component.ts index 1dc3b4e462..52df3ca144 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-settings-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-settings-dialog.component.ts @@ -47,10 +47,11 @@ export interface DashboardSettingsDialogData { } @Component({ - selector: 'tb-dashboard-settings-dialog', - templateUrl: './dashboard-settings-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: DashboardSettingsDialogComponent}], - styleUrls: ['./dashboard-settings-dialog.component.scss'] + selector: 'tb-dashboard-settings-dialog', + templateUrl: './dashboard-settings-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: DashboardSettingsDialogComponent }], + styleUrls: ['./dashboard-settings-dialog.component.scss'], + standalone: false }) export class DashboardSettingsDialogComponent extends DialogComponent implements OnDestroy, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-state.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-state.component.ts index e83ef81e26..7e10544ffa 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-state.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-state.component.ts @@ -27,9 +27,10 @@ import { EntityId } from '@shared/models/id/entity-id'; import { Subscription } from 'rxjs'; @Component({ - selector: 'tb-dashboard-state', - templateUrl: './dashboard-state.component.html', - styleUrls: ['./dashboard-state.component.scss'] + selector: 'tb-dashboard-state', + templateUrl: './dashboard-state.component.html', + styleUrls: ['./dashboard-state.component.scss'], + standalone: false }) export class DashboardStateComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-toolbar.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-toolbar.component.ts index 13961e4c54..fa02811fdb 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-toolbar.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-toolbar.component.ts @@ -17,10 +17,11 @@ import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core'; @Component({ - selector: 'tb-dashboard-toolbar', - templateUrl: './dashboard-toolbar.component.html', - styleUrls: ['./dashboard-toolbar.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-dashboard-toolbar', + templateUrl: './dashboard-toolbar.component.html', + styleUrls: ['./dashboard-toolbar.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DashboardToolbarComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.ts index 5ae629a003..bf4a7b78eb 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.ts @@ -48,10 +48,11 @@ interface BundleWidgetsFilter extends WidgetsFilter { } @Component({ - selector: 'tb-dashboard-widget-select', - templateUrl: './dashboard-widget-select.component.html', - styleUrls: ['./dashboard-widget-select.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-dashboard-widget-select', + templateUrl: './dashboard-widget-select.component.html', + styleUrls: ['./dashboard-widget-select.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DashboardWidgetSelectComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/edit-widget.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/edit-widget.component.ts index 1bb15be0e3..e7d0491efd 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/edit-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/edit-widget.component.ts @@ -31,9 +31,10 @@ import { DataKeySettingsFunction } from '@home/components/widget/lib/settings/co import { coerceBoolean } from '@shared/decorators/coercion'; @Component({ - selector: 'tb-edit-widget', - templateUrl: './edit-widget.component.html', - styleUrls: ['./edit-widget.component.scss'] + selector: 'tb-edit-widget', + templateUrl: './edit-widget.component.html', + styleUrls: ['./edit-widget.component.scss'], + standalone: false }) export class EditWidgetComponent extends PageComponent implements OnInit, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/layout/add-new-breakpoint-dialog.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/layout/add-new-breakpoint-dialog.component.ts index 08f577a045..94c068da8e 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/layout/add-new-breakpoint-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/layout/add-new-breakpoint-dialog.component.ts @@ -35,8 +35,9 @@ export interface AddNewBreakpointDialogResult { } @Component({ - selector: 'add-new-breakpoint-dialog', - templateUrl: './add-new-breakpoint-dialog.component.html', + selector: 'add-new-breakpoint-dialog', + templateUrl: './add-new-breakpoint-dialog.component.html', + standalone: false }) export class AddNewBreakpointDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/layout/dashboard-layout.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/layout/dashboard-layout.component.ts index 36ec78e3a7..1699fe6c54 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/layout/dashboard-layout.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/layout/dashboard-layout.component.ts @@ -42,9 +42,10 @@ import { isNotEmptyStr } from '@core/utils'; import { TbContextMenuEvent } from '@shared/models/jquery-event.models'; @Component({ - selector: 'tb-dashboard-layout', - templateUrl: './dashboard-layout.component.html', - styleUrls: ['./dashboard-layout.component.scss'] + selector: 'tb-dashboard-layout', + templateUrl: './dashboard-layout.component.html', + styleUrls: ['./dashboard-layout.component.scss'], + standalone: false }) export class DashboardLayoutComponent extends PageComponent implements ILayoutController, DashboardCallbacks, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/layout/manage-dashboard-layouts-dialog.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/layout/manage-dashboard-layouts-dialog.component.ts index fe7d68eba6..20bded3dd0 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/layout/manage-dashboard-layouts-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/layout/manage-dashboard-layouts-dialog.component.ts @@ -75,10 +75,11 @@ export interface DashboardLayoutSettings { } @Component({ - selector: 'tb-manage-dashboard-layouts-dialog', - templateUrl: './manage-dashboard-layouts-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: ManageDashboardLayoutsDialogComponent}], - styleUrls: ['./manage-dashboard-layouts-dialog.component.scss', '../../../components/dashboard/layout-button.scss'] + selector: 'tb-manage-dashboard-layouts-dialog', + templateUrl: './manage-dashboard-layouts-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: ManageDashboardLayoutsDialogComponent }], + styleUrls: ['./manage-dashboard-layouts-dialog.component.scss', '../../../components/dashboard/layout-button.scss'], + standalone: false }) export class ManageDashboardLayoutsDialogComponent extends DialogComponent implements ErrorStateMatcher, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/layout/move-widgets-dialog.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/layout/move-widgets-dialog.component.ts index 2b9a430e3b..d377983169 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/layout/move-widgets-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/layout/move-widgets-dialog.component.ts @@ -28,10 +28,11 @@ export interface MoveWidgetsDialogResult { } @Component({ - selector: 'tb-move-widgets-dialog', - templateUrl: './move-widgets-dialog.component.html', - providers: [], - styleUrls: [] + selector: 'tb-move-widgets-dialog', + templateUrl: './move-widgets-dialog.component.html', + providers: [], + styleUrls: [], + standalone: false }) export class MoveWidgetsDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/layout/select-dashboard-breakpoint.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/layout/select-dashboard-breakpoint.component.ts index c9ad66d233..25e2a23a5d 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/layout/select-dashboard-breakpoint.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/layout/select-dashboard-breakpoint.component.ts @@ -21,9 +21,10 @@ import { BreakpointId } from '@shared/models/dashboard.models'; import { DashboardUtilsService } from '@core/services/dashboard-utils.service'; @Component({ - selector: 'tb-select-dashboard-breakpoint', - templateUrl: './select-dashboard-breakpoint.component.html', - styleUrls: ['./select-dashboard-breakpoint.component.scss'] + selector: 'tb-select-dashboard-breakpoint', + templateUrl: './select-dashboard-breakpoint.component.html', + styleUrls: ['./select-dashboard-breakpoint.component.scss'], + standalone: false }) export class SelectDashboardBreakpointComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/states/dashboard-state-dialog.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/states/dashboard-state-dialog.component.ts index 64f9153546..b90164e6c0 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/states/dashboard-state-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/states/dashboard-state-dialog.component.ts @@ -43,10 +43,11 @@ export interface DashboardStateDialogData { } @Component({ - selector: 'tb-dashboard-state-dialog', - templateUrl: './dashboard-state-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: DashboardStateDialogComponent}], - styleUrls: [] + selector: 'tb-dashboard-state-dialog', + templateUrl: './dashboard-state-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: DashboardStateDialogComponent }], + styleUrls: [], + standalone: false }) export class DashboardStateDialogComponent extends DialogComponent diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/states/default-state-controller.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/states/default-state-controller.component.ts index 92be4229b6..c0b3668e2e 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/states/default-state-controller.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/states/default-state-controller.component.ts @@ -29,9 +29,10 @@ import { EntityService } from '@core/http/entity.service'; import { MobileService } from '@core/services/mobile.service'; @Component({ - selector: 'tb-default-state-controller', - templateUrl: './default-state-controller.component.html', - styleUrls: ['./default-state-controller.component.scss'] + selector: 'tb-default-state-controller', + templateUrl: './default-state-controller.component.html', + styleUrls: ['./default-state-controller.component.scss'], + standalone: false }) export class DefaultStateControllerComponent extends StateControllerComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/states/entity-state-controller.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/states/entity-state-controller.component.ts index 15e18573f2..f8dfff6c97 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/states/entity-state-controller.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/states/entity-state-controller.component.ts @@ -31,9 +31,10 @@ import { map, tap } from 'rxjs/operators'; import { MobileService } from '@core/services/mobile.service'; @Component({ - selector: 'tb-entity-state-controller', - templateUrl: './entity-state-controller.component.html', - styleUrls: ['./entity-state-controller.component.scss'] + selector: 'tb-entity-state-controller', + templateUrl: './entity-state-controller.component.html', + styleUrls: ['./entity-state-controller.component.scss'], + standalone: false }) export class EntityStateControllerComponent extends StateControllerComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/states/manage-dashboard-states-dialog.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/states/manage-dashboard-states-dialog.component.ts index c570783684..7e0971aa4b 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/states/manage-dashboard-states-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/states/manage-dashboard-states-dialog.component.ts @@ -53,9 +53,10 @@ export interface ManageDashboardStatesDialogResult { } @Component({ - selector: 'tb-manage-dashboard-states-dialog', - templateUrl: './manage-dashboard-states-dialog.component.html', - styleUrls: ['./manage-dashboard-states-dialog.component.scss'] + selector: 'tb-manage-dashboard-states-dialog', + templateUrl: './manage-dashboard-states-dialog.component.html', + styleUrls: ['./manage-dashboard-states-dialog.component.scss'], + standalone: false }) export class ManageDashboardStatesDialogComponent extends DialogComponent diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/states/states-component.directive.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/states/states-component.directive.ts index 3588b22158..2229e6c24b 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/states/states-component.directive.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/states/states-component.directive.ts @@ -31,8 +31,9 @@ import { IStateControllerComponent } from '@home/components/dashboard-page/state import { BehaviorSubject, Subject } from 'rxjs'; @Directive({ - // eslint-disable-next-line @angular-eslint/directive-selector - selector: 'tb-states-component' + // eslint-disable-next-line @angular-eslint/directive-selector + selector: 'tb-states-component', + standalone: false }) export class StatesComponentDirective implements OnInit, OnDestroy, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/widget-types-panel.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/widget-types-panel.component.ts index 4aec56771c..cb43dce650 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/widget-types-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/widget-types-panel.component.ts @@ -30,9 +30,10 @@ export interface DisplayWidgetTypesPanelData { } @Component({ - selector: 'tb-widget-types-panel', - templateUrl: './widget-types-panel.component.html', - styleUrls: ['./widget-types-panel.component.scss'] + selector: 'tb-widget-types-panel', + templateUrl: './widget-types-panel.component.html', + styleUrls: ['./widget-types-panel.component.scss'], + standalone: false }) export class DisplayWidgetTypesPanelComponent { diff --git a/ui-ngx/src/app/modules/home/components/dashboard-view/dashboard-view.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-view/dashboard-view.component.ts index 3e22d0719e..14bbd20688 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-view/dashboard-view.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-view/dashboard-view.component.ts @@ -22,9 +22,10 @@ import { Dashboard } from '@shared/models/dashboard.models'; import { ActivatedRoute } from '@angular/router'; @Component({ - selector: 'tb-dashboard-view', - templateUrl: './dashboard-view.component.html', - styleUrls: ['./dashboard-view.component.scss'] + selector: 'tb-dashboard-view', + templateUrl: './dashboard-view.component.html', + styleUrls: ['./dashboard-view.component.scss'], + standalone: false }) export class DashboardViewComponent extends PageComponent { diff --git a/ui-ngx/src/app/modules/home/components/dashboard/dashboard.component.ts b/ui-ngx/src/app/modules/home/components/dashboard/dashboard.component.ts index dedbecd8fd..a7df545332 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard/dashboard.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard/dashboard.component.ts @@ -63,10 +63,11 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { TbContextMenuEvent } from '@shared/models/jquery-event.models'; @Component({ - selector: 'tb-dashboard', - templateUrl: './dashboard.component.html', - styleUrls: ['./dashboard.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class DashboardComponent extends PageComponent implements IDashboardComponent, DoCheck, OnInit, OnDestroy, AfterViewInit, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/dashboard/select-target-layout-dialog.component.ts b/ui-ngx/src/app/modules/home/components/dashboard/select-target-layout-dialog.component.ts index 0ef839365f..a8e4e1c88e 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard/select-target-layout-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard/select-target-layout-dialog.component.ts @@ -23,9 +23,10 @@ import { DialogComponent } from '@app/shared/components/dialog.component'; import { DashboardLayoutId } from '@app/shared/models/dashboard.models'; @Component({ - selector: 'tb-select-target-layout-dialog', - templateUrl: './select-target-layout-dialog.component.html', - styleUrls: ['./layout-button.scss'] + selector: 'tb-select-target-layout-dialog', + templateUrl: './select-target-layout-dialog.component.html', + styleUrls: ['./layout-button.scss'], + standalone: false }) export class SelectTargetLayoutDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/dashboard/select-target-state-dialog.component.ts b/ui-ngx/src/app/modules/home/components/dashboard/select-target-state-dialog.component.ts index 7c10619b08..20f81fe724 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard/select-target-state-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard/select-target-state-dialog.component.ts @@ -30,10 +30,11 @@ export interface SelectTargetStateDialogData { } @Component({ - selector: 'tb-select-target-state-dialog', - templateUrl: './select-target-state-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: SelectTargetStateDialogComponent}], - styleUrls: [] + selector: 'tb-select-target-state-dialog', + templateUrl: './select-target-state-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: SelectTargetStateDialogComponent }], + styleUrls: [], + standalone: false }) export class SelectTargetStateDialogComponent extends DialogComponent diff --git a/ui-ngx/src/app/modules/home/components/details-panel.component.ts b/ui-ngx/src/app/modules/home/components/details-panel.component.ts index dd82bf9879..1ab62c3081 100644 --- a/ui-ngx/src/app/modules/home/components/details-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/details-panel.component.ts @@ -31,9 +31,10 @@ import { Subscription } from 'rxjs'; import { coerceBoolean } from '@shared/decorators/coercion'; @Component({ - selector: 'tb-details-panel', - templateUrl: './details-panel.component.html', - styleUrls: ['./details-panel.component.scss'] + selector: 'tb-details-panel', + templateUrl: './details-panel.component.html', + styleUrls: ['./details-panel.component.scss'], + standalone: false }) export class DetailsPanelComponent extends PageComponent implements OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/device/copy-device-credentials.component.ts b/ui-ngx/src/app/modules/home/components/device/copy-device-credentials.component.ts index 038c83b643..4d668d3255 100644 --- a/ui-ngx/src/app/modules/home/components/device/copy-device-credentials.component.ts +++ b/ui-ngx/src/app/modules/home/components/device/copy-device-credentials.component.ts @@ -28,9 +28,10 @@ import { AppState } from '@core/core.state'; import { TranslateService } from '@ngx-translate/core'; @Component({ - selector: 'tb-copy-device-credentials', - templateUrl: './copy-device-credentials.component.html', - styleUrls: [] + selector: 'tb-copy-device-credentials', + templateUrl: './copy-device-credentials.component.html', + styleUrls: [], + standalone: false }) export class CopyDeviceCredentialsComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/device/device-credentials-lwm2m-server.component.ts b/ui-ngx/src/app/modules/home/components/device/device-credentials-lwm2m-server.component.ts index 7d7a3c2c6b..810993d6f5 100644 --- a/ui-ngx/src/app/modules/home/components/device/device-credentials-lwm2m-server.component.ts +++ b/ui-ngx/src/app/modules/home/components/device/device-credentials-lwm2m-server.component.ts @@ -36,21 +36,22 @@ import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; @Component({ - selector: 'tb-device-credentials-lwm2m-server', - templateUrl: './device-credentials-lwm2m-server.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceCredentialsLwm2mServerComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DeviceCredentialsLwm2mServerComponent), - multi: true - } - ] + selector: 'tb-device-credentials-lwm2m-server', + templateUrl: './device-credentials-lwm2m-server.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceCredentialsLwm2mServerComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DeviceCredentialsLwm2mServerComponent), + multi: true + } + ], + standalone: false }) export class DeviceCredentialsLwm2mServerComponent implements OnDestroy, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/device/device-credentials-lwm2m.component.ts b/ui-ngx/src/app/modules/home/components/device/device-credentials-lwm2m.component.ts index a73ac37795..3daa094f8f 100644 --- a/ui-ngx/src/app/modules/home/components/device/device-credentials-lwm2m.component.ts +++ b/ui-ngx/src/app/modules/home/components/device/device-credentials-lwm2m.component.ts @@ -37,21 +37,22 @@ import { takeUntil } from 'rxjs/operators'; import { isDefinedAndNotNull } from '@core/utils'; @Component({ - selector: 'tb-device-credentials-lwm2m', - templateUrl: './device-credentials-lwm2m.component.html', - styleUrls: ['./device-credentials-lwm2m.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceCredentialsLwm2mComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DeviceCredentialsLwm2mComponent), - multi: true - } - ] + selector: 'tb-device-credentials-lwm2m', + templateUrl: './device-credentials-lwm2m.component.html', + styleUrls: ['./device-credentials-lwm2m.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceCredentialsLwm2mComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DeviceCredentialsLwm2mComponent), + multi: true + } + ], + standalone: false }) export class DeviceCredentialsLwm2mComponent implements ControlValueAccessor, Validator, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/device/device-credentials-mqtt-basic.component.ts b/ui-ngx/src/app/modules/home/components/device/device-credentials-mqtt-basic.component.ts index 8c55b3bd6b..5ad1a1ac21 100644 --- a/ui-ngx/src/app/modules/home/components/device/device-credentials-mqtt-basic.component.ts +++ b/ui-ngx/src/app/modules/home/components/device/device-credentials-mqtt-basic.component.ts @@ -32,20 +32,22 @@ import { takeUntil } from 'rxjs/operators'; import { generateSecret, isDefinedAndNotNull, isEmptyStr } from '@core/utils'; @Component({ - selector: 'tb-device-credentials-mqtt-basic', - templateUrl: './device-credentials-mqtt-basic.component.html', - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceCredentialsMqttBasicComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DeviceCredentialsMqttBasicComponent), - multi: true, - }], - styleUrls: [] + selector: 'tb-device-credentials-mqtt-basic', + templateUrl: './device-credentials-mqtt-basic.component.html', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceCredentialsMqttBasicComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DeviceCredentialsMqttBasicComponent), + multi: true, + } + ], + styleUrls: [], + standalone: false }) export class DeviceCredentialsMqttBasicComponent implements ControlValueAccessor, Validator, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/device/device-credentials.component.ts b/ui-ngx/src/app/modules/home/components/device/device-credentials.component.ts index 9e394b613d..6a663b5d93 100644 --- a/ui-ngx/src/app/modules/home/components/device/device-credentials.component.ts +++ b/ui-ngx/src/app/modules/home/components/device/device-credentials.component.ts @@ -38,20 +38,22 @@ import { generateSecret, isDefinedAndNotNull } from '@core/utils'; import { coerceBoolean } from '@shared/decorators/coercion'; @Component({ - selector: 'tb-device-credentials', - templateUrl: './device-credentials.component.html', - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceCredentialsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DeviceCredentialsComponent), - multi: true, - }], - styleUrls: ['./device-credentials.component.scss'] + selector: 'tb-device-credentials', + templateUrl: './device-credentials.component.html', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceCredentialsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DeviceCredentialsComponent), + multi: true, + } + ], + styleUrls: ['./device-credentials.component.scss'], + standalone: false }) export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, Validator, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/device/device-info-filter.component.ts b/ui-ngx/src/app/modules/home/components/device/device-info-filter.component.ts index ad583ad1df..f25712d105 100644 --- a/ui-ngx/src/app/modules/home/components/device/device-info-filter.component.ts +++ b/ui-ngx/src/app/modules/home/components/device/device-info-filter.component.ts @@ -50,16 +50,17 @@ export interface DeviceFilterConfigData { // @dynamic @Component({ - selector: 'tb-device-info-filter', - templateUrl: './device-info-filter.component.html', - styleUrls: ['./device-info-filter.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceInfoFilterComponent), - multi: true - } - ] + selector: 'tb-device-info-filter', + templateUrl: './device-info-filter.component.html', + styleUrls: ['./device-info-filter.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceInfoFilterComponent), + multi: true + } + ], + standalone: false }) export class DeviceInfoFilterComponent implements OnInit, OnDestroy, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/edge/edge-downlink-table-header.component.ts b/ui-ngx/src/app/modules/home/components/edge/edge-downlink-table-header.component.ts index d6e9c29c37..e1366d474c 100644 --- a/ui-ngx/src/app/modules/home/components/edge/edge-downlink-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/components/edge/edge-downlink-table-header.component.ts @@ -22,9 +22,10 @@ import { EdgeEvent } from '@shared/models/edge.models'; import { EdgeDownlinkTableConfig } from '@home/components/edge/edge-downlink-table-config'; @Component({ - selector: 'tb-edge-downlink-table-header', - templateUrl: './edge-downlink-table-header.component.html', - styleUrls: ['./edge-downlink-table-header.component.scss'] + selector: 'tb-edge-downlink-table-header', + templateUrl: './edge-downlink-table-header.component.html', + styleUrls: ['./edge-downlink-table-header.component.scss'], + standalone: false }) export class EdgeDownlinkTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/components/edge/edge-downlink-table.component.ts b/ui-ngx/src/app/modules/home/components/edge/edge-downlink-table.component.ts index 279381b110..8bb83eda19 100644 --- a/ui-ngx/src/app/modules/home/components/edge/edge-downlink-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/edge/edge-downlink-table.component.ts @@ -29,9 +29,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-edge-downlink-table', - templateUrl: './edge-downlink-table.component.html', - styleUrls: ['./edge-downlink-table.component.scss'] + selector: 'tb-edge-downlink-table', + templateUrl: './edge-downlink-table.component.html', + styleUrls: ['./edge-downlink-table.component.scss'], + standalone: false }) export class EdgeDownlinkTableComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/entity/add-entity-dialog.component.ts b/ui-ngx/src/app/modules/home/components/entity/add-entity-dialog.component.ts index f117fd2a44..5894921d1a 100644 --- a/ui-ngx/src/app/modules/home/components/entity/add-entity-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/entity/add-entity-dialog.component.ts @@ -31,10 +31,11 @@ import { DialogComponent } from '@shared/components/dialog.component'; import { Router } from '@angular/router'; @Component({ - selector: 'tb-add-entity-dialog', - templateUrl: './add-entity-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: AddEntityDialogComponent}], - styleUrls: ['./add-entity-dialog.component.scss'] + selector: 'tb-add-entity-dialog', + templateUrl: './add-entity-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: AddEntityDialogComponent }], + styleUrls: ['./add-entity-dialog.component.scss'], + standalone: false }) export class AddEntityDialogComponent extends DialogComponent> implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/entity/debug/entity-debug-settings-button.component.ts b/ui-ngx/src/app/modules/home/components/entity/debug/entity-debug-settings-button.component.ts index f0e3cdb2d0..e0dd1360e5 100644 --- a/ui-ngx/src/app/modules/home/components/entity/debug/entity-debug-settings-button.component.ts +++ b/ui-ngx/src/app/modules/home/components/entity/debug/entity-debug-settings-button.component.ts @@ -39,23 +39,22 @@ import { AdditionalDebugActionConfig } from '@home/components/entity/debug/entit import { EntityType } from '@shared/models/entity-type.models'; @Component({ - selector: 'tb-entity-debug-settings-button', - templateUrl: './entity-debug-settings-button.component.html', - standalone: true, - imports: [ - CommonModule, - SharedModule, - DurationLeftPipe, - ], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => EntityDebugSettingsButtonComponent), - multi: true - }, - EntityDebugSettingsService - ], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-entity-debug-settings-button', + templateUrl: './entity-debug-settings-button.component.html', + imports: [ + CommonModule, + SharedModule, + DurationLeftPipe, + ], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => EntityDebugSettingsButtonComponent), + multi: true + }, + EntityDebugSettingsService + ], + changeDetection: ChangeDetectionStrategy.OnPush }) export class EntityDebugSettingsButtonComponent implements ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/entity/debug/entity-debug-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/entity/debug/entity-debug-settings-panel.component.ts index 458c5e9765..6baefe0627 100644 --- a/ui-ngx/src/app/modules/home/components/entity/debug/entity-debug-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/entity/debug/entity-debug-settings-panel.component.ts @@ -39,15 +39,14 @@ import { EntityType, entityTypeTranslations } from '@shared/models/entity-type.m import { getCurrentAuthState } from '@core/auth/auth.selectors'; @Component({ - selector: 'tb-entity-debug-settings-panel', - templateUrl: './entity-debug-settings-panel.component.html', - standalone: true, - imports: [ - SharedModule, - CommonModule, - DurationLeftPipe - ], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-entity-debug-settings-panel', + templateUrl: './entity-debug-settings-panel.component.html', + imports: [ + SharedModule, + CommonModule, + DurationLeftPipe + ], + changeDetection: ChangeDetectionStrategy.OnPush }) export class EntityDebugSettingsPanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/entity/entities-table.component.ts b/ui-ngx/src/app/modules/home/components/entity/entities-table.component.ts index ec04a7eed8..6999c76180 100644 --- a/ui-ngx/src/app/modules/home/components/entity/entities-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/entity/entities-table.component.ts @@ -71,10 +71,11 @@ import { EntityDetailsPanelComponent } from '@home/components/entity/entity-deta import { FormBuilder } from '@angular/forms'; @Component({ - selector: 'tb-entities-table', - templateUrl: './entities-table.component.html', - styleUrls: ['./entities-table.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-entities-table', + templateUrl: './entities-table.component.html', + styleUrls: ['./entities-table.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class EntitiesTableComponent extends PageComponent implements IEntitiesTableComponent, AfterViewInit, OnInit, OnChanges, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/entity/entity-chips.component.ts b/ui-ngx/src/app/modules/home/components/entity/entity-chips.component.ts index eed41e2820..7dbe3d2949 100644 --- a/ui-ngx/src/app/modules/home/components/entity/entity-chips.component.ts +++ b/ui-ngx/src/app/modules/home/components/entity/entity-chips.component.ts @@ -21,9 +21,10 @@ import { baseDetailsPageByEntityType, EntityType } from '@app/shared/public-api' import { isEqual, isNotEmptyStr, isObject } from '@core/utils'; @Component({ - selector: 'tb-entity-chips', - templateUrl: './entity-chips.component.html', - styleUrls: ['./entity-chips.component.scss'] + selector: 'tb-entity-chips', + templateUrl: './entity-chips.component.html', + styleUrls: ['./entity-chips.component.scss'], + standalone: false }) export class EntityChipsComponent implements OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/entity/entity-details-page.component.ts b/ui-ngx/src/app/modules/home/components/entity/entity-details-page.component.ts index a66e04f23f..8988a02380 100644 --- a/ui-ngx/src/app/modules/home/components/entity/entity-details-page.component.ts +++ b/ui-ngx/src/app/modules/home/components/entity/entity-details-page.component.ts @@ -37,10 +37,11 @@ import { DialogService } from '@core/services/dialog.service'; import { IEntityDetailsPageComponent } from '@home/models/entity/entity-details-page-component.models'; @Component({ - selector: 'tb-entity-details-page', - templateUrl: './entity-details-page.component.html', - styleUrls: ['./entity-details-page.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-entity-details-page', + templateUrl: './entity-details-page.component.html', + styleUrls: ['./entity-details-page.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class EntityDetailsPageComponent extends EntityDetailsPanelComponent implements IEntityDetailsPageComponent, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/entity/entity-details-panel.component.ts b/ui-ngx/src/app/modules/home/components/entity/entity-details-panel.component.ts index 88b981d9db..8c6fc004d8 100644 --- a/ui-ngx/src/app/modules/home/components/entity/entity-details-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/entity/entity-details-panel.component.ts @@ -47,10 +47,11 @@ import { catchError } from 'rxjs/operators'; import { HttpStatusCode } from '@angular/common/http'; @Component({ - selector: 'tb-entity-details-panel', - templateUrl: './entity-details-panel.component.html', - styleUrls: ['./entity-details-panel.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-entity-details-panel', + templateUrl: './entity-details-panel.component.html', + styleUrls: ['./entity-details-panel.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class EntityDetailsPanelComponent extends PageComponent implements AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/entity/entity-filter-view.component.ts b/ui-ngx/src/app/modules/home/components/entity/entity-filter-view.component.ts index 7fb4768be4..ce5d78804d 100644 --- a/ui-ngx/src/app/modules/home/components/entity/entity-filter-view.component.ts +++ b/ui-ngx/src/app/modules/home/components/entity/entity-filter-view.component.ts @@ -21,16 +21,17 @@ import { AliasEntityType, EntityType, entityTypeTranslations } from '@shared/mod import { TranslateService } from '@ngx-translate/core'; @Component({ - selector: 'tb-entity-filter-view', - templateUrl: './entity-filter-view.component.html', - styleUrls: ['./entity-filter-view.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => EntityFilterViewComponent), - multi: true - } - ] + selector: 'tb-entity-filter-view', + templateUrl: './entity-filter-view.component.html', + styleUrls: ['./entity-filter-view.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => EntityFilterViewComponent), + multi: true + } + ], + standalone: false }) export class EntityFilterViewComponent implements ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/entity/entity-filter.component.ts b/ui-ngx/src/app/modules/home/components/entity/entity-filter.component.ts index 88c0035902..dcd127c4a3 100644 --- a/ui-ngx/src/app/modules/home/components/entity/entity-filter.component.ts +++ b/ui-ngx/src/app/modules/home/components/entity/entity-filter.component.ts @@ -24,16 +24,17 @@ import { Subject, Subscription } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-entity-filter', - templateUrl: './entity-filter.component.html', - styleUrls: ['./entity-filter.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => EntityFilterComponent), - multi: true - } - ] + selector: 'tb-entity-filter', + templateUrl: './entity-filter.component.html', + styleUrls: ['./entity-filter.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => EntityFilterComponent), + multi: true + } + ], + standalone: false }) export class EntityFilterComponent implements ControlValueAccessor, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.ts b/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.ts index 770ebb9c9b..5eb15642bb 100644 --- a/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/event/event-content-dialog.component.ts @@ -36,9 +36,10 @@ export interface EventContentDialogData { } @Component({ - selector: 'tb-event-content-dialog', - templateUrl: './event-content-dialog.component.html', - styleUrls: ['./event-content-dialog.component.scss'] + selector: 'tb-event-content-dialog', + templateUrl: './event-content-dialog.component.html', + styleUrls: ['./event-content-dialog.component.scss'], + standalone: false }) export class EventContentDialogComponent extends DialogComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/event/event-filter-panel.component.ts b/ui-ngx/src/app/modules/home/components/event/event-filter-panel.component.ts index efc24adb8d..6b50c95d76 100644 --- a/ui-ngx/src/app/modules/home/components/event/event-filter-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/event/event-filter-panel.component.ts @@ -35,9 +35,10 @@ export interface FilterEntityColumn { @Component({ - selector: 'tb-event-filter-panel', - templateUrl: './event-filter-panel.component.html', - styleUrls: ['./event-filter-panel.component.scss'] + selector: 'tb-event-filter-panel', + templateUrl: './event-filter-panel.component.html', + styleUrls: ['./event-filter-panel.component.scss'], + standalone: false }) export class EventFilterPanelComponent { diff --git a/ui-ngx/src/app/modules/home/components/event/event-table-header.component.ts b/ui-ngx/src/app/modules/home/components/event/event-table-header.component.ts index d4cd493e73..867df4d6d2 100644 --- a/ui-ngx/src/app/modules/home/components/event/event-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/components/event/event-table-header.component.ts @@ -22,9 +22,10 @@ import { DebugEventType, Event, EventType, eventTypeTranslations } from '@app/sh import { EventTableConfig } from '@home/components/event/event-table-config'; @Component({ - selector: 'tb-event-table-header', - templateUrl: './event-table-header.component.html', - styleUrls: ['./event-table-header.component.scss'] + selector: 'tb-event-table-header', + templateUrl: './event-table-header.component.html', + styleUrls: ['./event-table-header.component.scss'], + standalone: false }) export class EventTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/components/event/event-table.component.ts b/ui-ngx/src/app/modules/home/components/event/event-table.component.ts index 77fbb7d0bc..76f6747099 100644 --- a/ui-ngx/src/app/modules/home/components/event/event-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/event/event-table.component.ts @@ -40,9 +40,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-event-table', - templateUrl: './event-table.component.html', - styleUrls: ['./event-table.component.scss'] + selector: 'tb-event-table', + templateUrl: './event-table.component.html', + styleUrls: ['./event-table.component.scss'], + standalone: false }) export class EventTableComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/filter/boolean-filter-predicate.component.ts b/ui-ngx/src/app/modules/home/components/filter/boolean-filter-predicate.component.ts index 3f152e79fa..c3a445d4a3 100644 --- a/ui-ngx/src/app/modules/home/components/filter/boolean-filter-predicate.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/boolean-filter-predicate.component.ts @@ -35,21 +35,22 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-boolean-filter-predicate', - templateUrl: './boolean-filter-predicate.component.html', - styleUrls: ['./filter-predicate.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => BooleanFilterPredicateComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => BooleanFilterPredicateComponent), - multi: true - } - ] + selector: 'tb-boolean-filter-predicate', + templateUrl: './boolean-filter-predicate.component.html', + styleUrls: ['./filter-predicate.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => BooleanFilterPredicateComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => BooleanFilterPredicateComponent), + multi: true + } + ], + standalone: false }) export class BooleanFilterPredicateComponent implements ControlValueAccessor, Validator, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/filter/complex-filter-predicate-dialog.component.ts b/ui-ngx/src/app/modules/home/components/filter/complex-filter-predicate-dialog.component.ts index f2770affb5..ceb5b63ce7 100644 --- a/ui-ngx/src/app/modules/home/components/filter/complex-filter-predicate-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/complex-filter-predicate-dialog.component.ts @@ -31,10 +31,11 @@ import { import { ComplexFilterPredicateDialogData } from '@home/components/filter/filter-component.models'; @Component({ - selector: 'tb-complex-filter-predicate-dialog', - templateUrl: './complex-filter-predicate-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: ComplexFilterPredicateDialogComponent}], - styleUrls: [] + selector: 'tb-complex-filter-predicate-dialog', + templateUrl: './complex-filter-predicate-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: ComplexFilterPredicateDialogComponent }], + styleUrls: [], + standalone: false }) export class ComplexFilterPredicateDialogComponent extends DialogComponent diff --git a/ui-ngx/src/app/modules/home/components/filter/complex-filter-predicate.component.ts b/ui-ngx/src/app/modules/home/components/filter/complex-filter-predicate.component.ts index 0df6a9d69b..88a2971b87 100644 --- a/ui-ngx/src/app/modules/home/components/filter/complex-filter-predicate.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/complex-filter-predicate.component.ts @@ -24,16 +24,17 @@ import { COMPLEX_FILTER_PREDICATE_DIALOG_COMPONENT_TOKEN } from '@home/component import { ComponentType } from '@angular/cdk/portal'; @Component({ - selector: 'tb-complex-filter-predicate', - templateUrl: './complex-filter-predicate.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ComplexFilterPredicateComponent), - multi: true - } - ] + selector: 'tb-complex-filter-predicate', + templateUrl: './complex-filter-predicate.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ComplexFilterPredicateComponent), + multi: true + } + ], + standalone: false }) export class ComplexFilterPredicateComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/filter/filter-dialog.component.ts b/ui-ngx/src/app/modules/home/components/filter/filter-dialog.component.ts index 75b56e15a5..ec3c9b79f0 100644 --- a/ui-ngx/src/app/modules/home/components/filter/filter-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/filter-dialog.component.ts @@ -41,10 +41,11 @@ export interface FilterDialogData { } @Component({ - selector: 'tb-filter-dialog', - templateUrl: './filter-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: FilterDialogComponent}], - styleUrls: ['./filter-dialog.component.scss'] + selector: 'tb-filter-dialog', + templateUrl: './filter-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: FilterDialogComponent }], + styleUrls: ['./filter-dialog.component.scss'], + standalone: false }) export class FilterDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/filter/filter-predicate-list.component.ts b/ui-ngx/src/app/modules/home/components/filter/filter-predicate-list.component.ts index 1fb3a00360..8ab2bd6e35 100644 --- a/ui-ngx/src/app/modules/home/components/filter/filter-predicate-list.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/filter-predicate-list.component.ts @@ -43,21 +43,22 @@ import { COMPLEX_FILTER_PREDICATE_DIALOG_COMPONENT_TOKEN } from '@home/component import { ComplexFilterPredicateDialogData } from '@home/components/filter/filter-component.models'; @Component({ - selector: 'tb-filter-predicate-list', - templateUrl: './filter-predicate-list.component.html', - styleUrls: ['./filter-predicate-list.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => FilterPredicateListComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => FilterPredicateListComponent), - multi: true - } - ] + selector: 'tb-filter-predicate-list', + templateUrl: './filter-predicate-list.component.html', + styleUrls: ['./filter-predicate-list.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FilterPredicateListComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => FilterPredicateListComponent), + multi: true + } + ], + standalone: false }) export class FilterPredicateListComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/filter/filter-predicate-value.component.ts b/ui-ngx/src/app/modules/home/components/filter/filter-predicate-value.component.ts index 01154c8930..14c334b72c 100644 --- a/ui-ngx/src/app/modules/home/components/filter/filter-predicate-value.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/filter-predicate-value.component.ts @@ -38,21 +38,22 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-filter-predicate-value', - templateUrl: './filter-predicate-value.component.html', - styleUrls: ['./filter-predicate.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => FilterPredicateValueComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => FilterPredicateValueComponent), - multi: true - } - ] + selector: 'tb-filter-predicate-value', + templateUrl: './filter-predicate-value.component.html', + styleUrls: ['./filter-predicate.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FilterPredicateValueComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => FilterPredicateValueComponent), + multi: true + } + ], + standalone: false }) export class FilterPredicateValueComponent implements ControlValueAccessor, Validator, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/filter/filter-predicate.component.ts b/ui-ngx/src/app/modules/home/components/filter/filter-predicate.component.ts index 170945e4ce..e4e327bf0a 100644 --- a/ui-ngx/src/app/modules/home/components/filter/filter-predicate.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/filter-predicate.component.ts @@ -29,21 +29,22 @@ import { EntityKeyValueType, FilterPredicateType, KeyFilterPredicateInfo } from import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-filter-predicate', - templateUrl: './filter-predicate.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => FilterPredicateComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => FilterPredicateComponent), - multi: true - } - ] + selector: 'tb-filter-predicate', + templateUrl: './filter-predicate.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FilterPredicateComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => FilterPredicateComponent), + multi: true + } + ], + standalone: false }) export class FilterPredicateComponent implements ControlValueAccessor, Validator, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/filter/filter-text.component.ts b/ui-ngx/src/app/modules/home/components/filter/filter-text.component.ts index 2dce9164db..d2d53c0918 100644 --- a/ui-ngx/src/app/modules/home/components/filter/filter-text.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/filter-text.component.ts @@ -23,16 +23,17 @@ import { DatePipe } from '@angular/common'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; @Component({ - selector: 'tb-filter-text', - templateUrl: './filter-text.component.html', - styleUrls: ['./filter-text.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => FilterTextComponent), - multi: true - } - ] + selector: 'tb-filter-text', + templateUrl: './filter-text.component.html', + styleUrls: ['./filter-text.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FilterTextComponent), + multi: true + } + ], + standalone: false }) export class FilterTextComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/filter/filter-user-info-dialog.component.ts b/ui-ngx/src/app/modules/home/components/filter/filter-user-info-dialog.component.ts index 0c4509f133..6eb7da12b2 100644 --- a/ui-ngx/src/app/modules/home/components/filter/filter-user-info-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/filter-user-info-dialog.component.ts @@ -43,10 +43,11 @@ export interface FilterUserInfoDialogData { } @Component({ - selector: 'tb-filter-user-info-dialog', - templateUrl: './filter-user-info-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: FilterUserInfoDialogComponent}], - styleUrls: [] + selector: 'tb-filter-user-info-dialog', + templateUrl: './filter-user-info-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: FilterUserInfoDialogComponent }], + styleUrls: [], + standalone: false }) export class FilterUserInfoDialogComponent extends DialogComponent diff --git a/ui-ngx/src/app/modules/home/components/filter/filter-user-info.component.ts b/ui-ngx/src/app/modules/home/components/filter/filter-user-info.component.ts index 006bbf81f6..952e0ac9d6 100644 --- a/ui-ngx/src/app/modules/home/components/filter/filter-user-info.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/filter-user-info.component.ts @@ -30,16 +30,17 @@ import { import { deepClone } from '@core/utils'; @Component({ - selector: 'tb-filter-user-info', - templateUrl: './filter-user-info.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => FilterUserInfoComponent), - multi: true - } - ] + selector: 'tb-filter-user-info', + templateUrl: './filter-user-info.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FilterUserInfoComponent), + multi: true + } + ], + standalone: false }) export class FilterUserInfoComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/filter/filters-dialog.component.ts b/ui-ngx/src/app/modules/home/components/filter/filters-dialog.component.ts index 545c97bffd..8282c2cd21 100644 --- a/ui-ngx/src/app/modules/home/components/filter/filters-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/filters-dialog.component.ts @@ -52,10 +52,11 @@ export interface FiltersDialogData { } @Component({ - selector: 'tb-filters-dialog', - templateUrl: './filters-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: FiltersDialogComponent}], - styleUrls: ['./filters-dialog.component.scss'] + selector: 'tb-filters-dialog', + templateUrl: './filters-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: FiltersDialogComponent }], + styleUrls: ['./filters-dialog.component.scss'], + standalone: false }) export class FiltersDialogComponent extends DialogComponent implements ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/filter/filters-edit-panel.component.ts b/ui-ngx/src/app/modules/home/components/filter/filters-edit-panel.component.ts index ccb05c7f0c..06a218394c 100644 --- a/ui-ngx/src/app/modules/home/components/filter/filters-edit-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/filters-edit-panel.component.ts @@ -29,9 +29,10 @@ export interface FiltersEditPanelData { } @Component({ - selector: 'tb-filters-edit-panel', - templateUrl: './filters-edit-panel.component.html', - styleUrls: ['./filters-edit-panel.component.scss'] + selector: 'tb-filters-edit-panel', + templateUrl: './filters-edit-panel.component.html', + styleUrls: ['./filters-edit-panel.component.scss'], + standalone: false }) export class FiltersEditPanelComponent { diff --git a/ui-ngx/src/app/modules/home/components/filter/filters-edit.component.ts b/ui-ngx/src/app/modules/home/components/filter/filters-edit.component.ts index 48a33a8765..5bbd4ac034 100644 --- a/ui-ngx/src/app/modules/home/components/filter/filters-edit.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/filters-edit.component.ts @@ -42,9 +42,10 @@ import { UserFilterDialogComponent, UserFilterDialogData } from '@home/component import { MatDialog } from '@angular/material/dialog'; @Component({ - selector: 'tb-filters-edit', - templateUrl: './filters-edit.component.html', - styleUrls: ['./filters-edit.component.scss'] + selector: 'tb-filters-edit', + templateUrl: './filters-edit.component.html', + styleUrls: ['./filters-edit.component.scss'], + standalone: false }) export class FiltersEditComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/filter/key-filter-dialog.component.ts b/ui-ngx/src/app/modules/home/components/filter/key-filter-dialog.component.ts index e6e58c33cb..ffaa10570d 100644 --- a/ui-ngx/src/app/modules/home/components/filter/key-filter-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/key-filter-dialog.component.ts @@ -50,10 +50,11 @@ export interface KeyFilterDialogData { } @Component({ - selector: 'tb-key-filter-dialog', - templateUrl: './key-filter-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: KeyFilterDialogComponent}], - styleUrls: ['./key-filter-dialog.component.scss'] + selector: 'tb-key-filter-dialog', + templateUrl: './key-filter-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: KeyFilterDialogComponent }], + styleUrls: ['./key-filter-dialog.component.scss'], + standalone: false }) export class KeyFilterDialogComponent extends DialogComponent diff --git a/ui-ngx/src/app/modules/home/components/filter/key-filter-list.component.ts b/ui-ngx/src/app/modules/home/components/filter/key-filter-list.component.ts index ec3075f9f8..aad686707d 100644 --- a/ui-ngx/src/app/modules/home/components/filter/key-filter-list.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/key-filter-list.component.ts @@ -42,21 +42,22 @@ import { EntityId } from '@shared/models/id/entity-id'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-key-filter-list', - templateUrl: './key-filter-list.component.html', - styleUrls: ['./key-filter-list.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => KeyFilterListComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => KeyFilterListComponent), - multi: true - } - ] + selector: 'tb-key-filter-list', + templateUrl: './key-filter-list.component.html', + styleUrls: ['./key-filter-list.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => KeyFilterListComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => KeyFilterListComponent), + multi: true + } + ], + standalone: false }) export class KeyFilterListComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/filter/numeric-filter-predicate.component.ts b/ui-ngx/src/app/modules/home/components/filter/numeric-filter-predicate.component.ts index 6d5952c1ee..3fb257f55f 100644 --- a/ui-ngx/src/app/modules/home/components/filter/numeric-filter-predicate.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/numeric-filter-predicate.component.ts @@ -35,21 +35,22 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-numeric-filter-predicate', - templateUrl: './numeric-filter-predicate.component.html', - styleUrls: ['./filter-predicate.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => NumericFilterPredicateComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => NumericFilterPredicateComponent), - multi: true - } - ] + selector: 'tb-numeric-filter-predicate', + templateUrl: './numeric-filter-predicate.component.html', + styleUrls: ['./filter-predicate.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => NumericFilterPredicateComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => NumericFilterPredicateComponent), + multi: true + } + ], + standalone: false }) export class NumericFilterPredicateComponent implements ControlValueAccessor, Validator, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/filter/string-filter-predicate.component.ts b/ui-ngx/src/app/modules/home/components/filter/string-filter-predicate.component.ts index c2fac83db0..d4e3be6b5f 100644 --- a/ui-ngx/src/app/modules/home/components/filter/string-filter-predicate.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/string-filter-predicate.component.ts @@ -35,21 +35,22 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-string-filter-predicate', - templateUrl: './string-filter-predicate.component.html', - styleUrls: ['./filter-predicate.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => StringFilterPredicateComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => StringFilterPredicateComponent), - multi: true - } - ] + selector: 'tb-string-filter-predicate', + templateUrl: './string-filter-predicate.component.html', + styleUrls: ['./filter-predicate.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => StringFilterPredicateComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => StringFilterPredicateComponent), + multi: true + } + ], + standalone: false }) export class StringFilterPredicateComponent implements ControlValueAccessor, Validator, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/filter/user-filter-dialog.component.ts b/ui-ngx/src/app/modules/home/components/filter/user-filter-dialog.component.ts index 279b257178..6e068fdcf3 100644 --- a/ui-ngx/src/app/modules/home/components/filter/user-filter-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/filter/user-filter-dialog.component.ts @@ -40,10 +40,11 @@ export interface UserFilterDialogData { } @Component({ - selector: 'tb-user-filter-dialog', - templateUrl: './user-filter-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: UserFilterDialogComponent}], - styleUrls: ['./user-filter-dialog.component.scss'], + selector: 'tb-user-filter-dialog', + templateUrl: './user-filter-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: UserFilterDialogComponent }], + styleUrls: ['./user-filter-dialog.component.scss'], + standalone: false }) export class UserFilterDialogComponent extends DialogComponent implements ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/github-badge/github-badge.component.ts b/ui-ngx/src/app/modules/home/components/github-badge/github-badge.component.ts index a1ec8318d3..7b12265e66 100644 --- a/ui-ngx/src/app/modules/home/components/github-badge/github-badge.component.ts +++ b/ui-ngx/src/app/modules/home/components/github-badge/github-badge.component.ts @@ -27,9 +27,10 @@ import { Subject } from 'rxjs'; const SETTINGS_KEY = 'HIDE_GITHUB_STAR_BUTTON'; @Component({ - selector: 'tb-github-badge', - templateUrl: './github-badge.component.html', - styleUrl: './github-badge.component.scss' + selector: 'tb-github-badge', + templateUrl: './github-badge.component.html', + styleUrl: './github-badge.component.scss', + standalone: false }) export class GithubBadgeComponent implements OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/notification/notification-bell.component.ts b/ui-ngx/src/app/modules/home/components/notification/notification-bell.component.ts index 4060e4c54f..40df0ed280 100644 --- a/ui-ngx/src/app/modules/home/components/notification/notification-bell.component.ts +++ b/ui-ngx/src/app/modules/home/components/notification/notification-bell.component.ts @@ -35,9 +35,10 @@ import { selectIsAuthenticated } from '@core/auth/auth.selectors'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-notification-bell', - templateUrl: './notification-bell.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-notification-bell', + templateUrl: './notification-bell.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class NotificationBellComponent implements OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/notification/send-notification-button.component.ts b/ui-ngx/src/app/modules/home/components/notification/send-notification-button.component.ts index 8bb603d023..d159baecd4 100644 --- a/ui-ngx/src/app/modules/home/components/notification/send-notification-button.component.ts +++ b/ui-ngx/src/app/modules/home/components/notification/send-notification-button.component.ts @@ -30,8 +30,9 @@ import { getCurrentAuthUser } from '@core/auth/auth.selectors'; import { Authority } from '@shared/models/authority.enum'; @Component({ - selector: 'tb-send-notification-button', - templateUrl: './send-notification-button.component.html', + selector: 'tb-send-notification-button', + templateUrl: './send-notification-button.component.html', + standalone: false }) export class SendNotificationButtonComponent { diff --git a/ui-ngx/src/app/modules/home/components/notification/show-notification-popover.component.ts b/ui-ngx/src/app/modules/home/components/notification/show-notification-popover.component.ts index 65891d77c3..f9e4969788 100644 --- a/ui-ngx/src/app/modules/home/components/notification/show-notification-popover.component.ts +++ b/ui-ngx/src/app/modules/home/components/notification/show-notification-popover.component.ts @@ -28,9 +28,10 @@ import { NotificationSubscriber } from '@shared/models/telemetry/telemetry.model import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-show-notification-popover', - templateUrl: './show-notification-popover.component.html', - styleUrls: ['show-notification-popover.component.scss'] + selector: 'tb-show-notification-popover', + templateUrl: './show-notification-popover.component.html', + styleUrls: ['show-notification-popover.component.scss'], + standalone: false }) export class ShowNotificationPopoverComponent extends PageComponent implements OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/profile/add-device-profile-dialog.component.ts b/ui-ngx/src/app/modules/home/components/profile/add-device-profile-dialog.component.ts index 480e4b74eb..a8ee087ad7 100644 --- a/ui-ngx/src/app/modules/home/components/profile/add-device-profile-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/add-device-profile-dialog.component.ts @@ -54,10 +54,11 @@ export interface AddDeviceProfileDialogData { } @Component({ - selector: 'tb-add-device-profile-dialog', - templateUrl: './add-device-profile-dialog.component.html', - providers: [], - styleUrls: ['./add-device-profile-dialog.component.scss'] + selector: 'tb-add-device-profile-dialog', + templateUrl: './add-device-profile-dialog.component.html', + providers: [], + styleUrls: ['./add-device-profile-dialog.component.scss'], + standalone: false }) export class AddDeviceProfileDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-duration-predicate-value.component.ts b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-duration-predicate-value.component.ts index d0a08dce25..fe8945fd83 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-duration-predicate-value.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-duration-predicate-value.component.ts @@ -27,16 +27,17 @@ import { AlarmConditionType } from '@shared/models/device.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-alarm-duration-predicate-value', - templateUrl: './alarm-duration-predicate-value.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AlarmDurationPredicateValueComponent), - multi: true - } - ] + selector: 'tb-alarm-duration-predicate-value', + templateUrl: './alarm-duration-predicate-value.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AlarmDurationPredicateValueComponent), + multi: true + } + ], + standalone: false }) export class AlarmDurationPredicateValueComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-dynamic-value.component.ts b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-dynamic-value.component.ts index af7e4b07be..da5022571a 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-dynamic-value.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-dynamic-value.component.ts @@ -29,13 +29,14 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-alarm-dynamic-value', - templateUrl: './alarm-dynamic-value.component.html', - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AlarmDynamicValue), - multi: true - }] + selector: 'tb-alarm-dynamic-value', + templateUrl: './alarm-dynamic-value.component.html', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AlarmDynamicValue), + multi: true + }], + standalone: false }) export class AlarmDynamicValue implements ControlValueAccessor, OnInit{ diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-rule-condition-dialog.component.ts b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-rule-condition-dialog.component.ts index 0f3f183341..ba16a910db 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-rule-condition-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-rule-condition-dialog.component.ts @@ -36,10 +36,11 @@ export interface AlarmRuleConditionDialogData { } @Component({ - selector: 'tb-alarm-rule-condition-dialog', - templateUrl: './alarm-rule-condition-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: AlarmRuleConditionDialogComponent}], - styleUrls: ['./alarm-rule-condition-dialog.component.scss'] + selector: 'tb-alarm-rule-condition-dialog', + templateUrl: './alarm-rule-condition-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: AlarmRuleConditionDialogComponent }], + styleUrls: ['./alarm-rule-condition-dialog.component.scss'], + standalone: false }) export class AlarmRuleConditionDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-rule-condition.component.ts b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-rule-condition.component.ts index df98b4906a..944e73b508 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-rule-condition.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-rule-condition.component.ts @@ -38,21 +38,22 @@ import { EntityId } from '@shared/models/id/entity-id'; import { dynamicValueSourceTypeTranslationMap } from '@shared/models/query/query.models'; @Component({ - selector: 'tb-alarm-rule-condition', - templateUrl: './alarm-rule-condition.component.html', - styleUrls: ['./alarm-rule-condition.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AlarmRuleConditionComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => AlarmRuleConditionComponent), - multi: true, - } - ] + selector: 'tb-alarm-rule-condition', + templateUrl: './alarm-rule-condition.component.html', + styleUrls: ['./alarm-rule-condition.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AlarmRuleConditionComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => AlarmRuleConditionComponent), + multi: true, + } + ], + standalone: false }) export class AlarmRuleConditionComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-rule.component.ts b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-rule.component.ts index a3238e4385..a6506aa33d 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-rule.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-rule.component.ts @@ -39,21 +39,22 @@ import { UtilsService } from '@core/services/utils.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-alarm-rule', - templateUrl: './alarm-rule.component.html', - styleUrls: ['./alarm-rule.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AlarmRuleComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => AlarmRuleComponent), - multi: true, - } - ] + selector: 'tb-alarm-rule', + templateUrl: './alarm-rule.component.html', + styleUrls: ['./alarm-rule.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AlarmRuleComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => AlarmRuleComponent), + multi: true, + } + ], + standalone: false }) export class AlarmRuleComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-schedule-dialog.component.ts b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-schedule-dialog.component.ts index 24424f5048..f9224cdccc 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-schedule-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-schedule-dialog.component.ts @@ -32,10 +32,11 @@ export interface AlarmScheduleDialogData { } @Component({ - selector: 'tb-alarm-schedule-dialog', - templateUrl: './alarm-schedule-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: AlarmScheduleDialogComponent}], - styleUrls: [] + selector: 'tb-alarm-schedule-dialog', + templateUrl: './alarm-schedule-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: AlarmScheduleDialogComponent }], + styleUrls: [], + standalone: false }) export class AlarmScheduleDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-schedule-info.component.ts b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-schedule-info.component.ts index a0257da8ad..30209a2f7c 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-schedule-info.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-schedule-info.component.ts @@ -31,14 +31,15 @@ import { deepClone, isDefinedAndNotNull } from '@core/utils'; import { TranslateService } from '@ngx-translate/core'; @Component({ - selector: 'tb-alarm-schedule-info', - templateUrl: './alarm-schedule-info.component.html', - styleUrls: ['./alarm-schedule-info.component.scss'], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AlarmScheduleInfoComponent), - multi: true - }] + selector: 'tb-alarm-schedule-info', + templateUrl: './alarm-schedule-info.component.html', + styleUrls: ['./alarm-schedule-info.component.scss'], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AlarmScheduleInfoComponent), + multi: true + }], + standalone: false }) export class AlarmScheduleInfoComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-schedule.component.ts b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-schedule.component.ts index 384a266a08..90caf04b70 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-schedule.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/alarm-schedule.component.ts @@ -43,18 +43,19 @@ import { getDefaultTimezone } from '@shared/models/time/time.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-alarm-schedule', - templateUrl: './alarm-schedule.component.html', - styleUrls: ['./alarm-schedule.component.scss'], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AlarmScheduleComponent), - multi: true - }, { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => AlarmScheduleComponent), - multi: true - }] + selector: 'tb-alarm-schedule', + templateUrl: './alarm-schedule.component.html', + styleUrls: ['./alarm-schedule.component.scss'], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AlarmScheduleComponent), + multi: true + }, { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => AlarmScheduleComponent), + multi: true + }], + standalone: false }) export class AlarmScheduleComponent implements ControlValueAccessor, Validator, OnInit { @Input() diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/create-alarm-rules.component.ts b/ui-ngx/src/app/modules/home/components/profile/alarm/create-alarm-rules.component.ts index b81c65dbcf..4445f45ca8 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/create-alarm-rules.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/create-alarm-rules.component.ts @@ -35,21 +35,22 @@ import { EntityId } from '@shared/models/id/entity-id'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-create-alarm-rules', - templateUrl: './create-alarm-rules.component.html', - styleUrls: ['./create-alarm-rules.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CreateAlarmRulesComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => CreateAlarmRulesComponent), - multi: true, - } - ] + selector: 'tb-create-alarm-rules', + templateUrl: './create-alarm-rules.component.html', + styleUrls: ['./create-alarm-rules.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CreateAlarmRulesComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => CreateAlarmRulesComponent), + multi: true, + } + ], + standalone: false }) export class CreateAlarmRulesComponent implements ControlValueAccessor, OnInit, Validator, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/device-profile-alarm.component.ts b/ui-ngx/src/app/modules/home/components/profile/alarm/device-profile-alarm.component.ts index cf42c444d2..a282f1ee0b 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/device-profile-alarm.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/device-profile-alarm.component.ts @@ -34,21 +34,22 @@ import { UtilsService } from '@core/services/utils.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-device-profile-alarm', - templateUrl: './device-profile-alarm.component.html', - styleUrls: ['./device-profile-alarm.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceProfileAlarmComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DeviceProfileAlarmComponent), - multi: true, - } - ] + selector: 'tb-device-profile-alarm', + templateUrl: './device-profile-alarm.component.html', + styleUrls: ['./device-profile-alarm.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceProfileAlarmComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DeviceProfileAlarmComponent), + multi: true, + } + ], + standalone: false }) export class DeviceProfileAlarmComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/device-profile-alarms.component.ts b/ui-ngx/src/app/modules/home/components/profile/alarm/device-profile-alarms.component.ts index ff0f824cf1..14e8d0d32d 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/device-profile-alarms.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/device-profile-alarms.component.ts @@ -37,21 +37,22 @@ import { EntityId } from '@shared/models/id/entity-id'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-device-profile-alarms', - templateUrl: './device-profile-alarms.component.html', - styleUrls: ['./device-profile-alarms.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceProfileAlarmsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DeviceProfileAlarmsComponent), - multi: true, - } - ] + selector: 'tb-device-profile-alarms', + templateUrl: './device-profile-alarms.component.html', + styleUrls: ['./device-profile-alarms.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceProfileAlarmsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DeviceProfileAlarmsComponent), + multi: true, + } + ], + standalone: false }) export class DeviceProfileAlarmsComponent implements ControlValueAccessor, OnInit, Validator, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/edit-alarm-details-dialog.component.ts b/ui-ngx/src/app/modules/home/components/profile/alarm/edit-alarm-details-dialog.component.ts index 4078930902..45f13a4487 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/edit-alarm-details-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/edit-alarm-details-dialog.component.ts @@ -31,10 +31,11 @@ export interface EditAlarmDetailsDialogData { } @Component({ - selector: 'tb-edit-alarm-details-dialog', - templateUrl: './edit-alarm-details-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: EditAlarmDetailsDialogComponent}], - styleUrls: [] + selector: 'tb-edit-alarm-details-dialog', + templateUrl: './edit-alarm-details-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: EditAlarmDetailsDialogComponent }], + styleUrls: [], + standalone: false }) export class EditAlarmDetailsDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/profile/asset-profile-autocomplete.component.ts b/ui-ngx/src/app/modules/home/components/profile/asset-profile-autocomplete.component.ts index 0c2a7bbd9f..79b4c6ed4d 100644 --- a/ui-ngx/src/app/modules/home/components/profile/asset-profile-autocomplete.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/asset-profile-autocomplete.component.ts @@ -51,14 +51,15 @@ import { getCurrentAuthUser } from '@core/auth/auth.selectors'; import { Authority } from '@shared/models/authority.enum'; @Component({ - selector: 'tb-asset-profile-autocomplete', - templateUrl: './asset-profile-autocomplete.component.html', - styleUrls: ['./asset-profile-autocomplete.component.scss'], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AssetProfileAutocompleteComponent), - multi: true - }] + selector: 'tb-asset-profile-autocomplete', + templateUrl: './asset-profile-autocomplete.component.html', + styleUrls: ['./asset-profile-autocomplete.component.scss'], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AssetProfileAutocompleteComponent), + multi: true + }], + standalone: false }) export class AssetProfileAutocompleteComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/profile/asset-profile-dialog.component.ts b/ui-ngx/src/app/modules/home/components/profile/asset-profile-dialog.component.ts index 1b196536f1..11ba3aabf4 100644 --- a/ui-ngx/src/app/modules/home/components/profile/asset-profile-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/asset-profile-dialog.component.ts @@ -32,10 +32,11 @@ export interface AssetProfileDialogData { } @Component({ - selector: 'tb-asset-profile-dialog', - templateUrl: './asset-profile-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: AssetProfileDialogComponent}], - styleUrls: [] + selector: 'tb-asset-profile-dialog', + templateUrl: './asset-profile-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: AssetProfileDialogComponent }], + styleUrls: [], + standalone: false }) export class AssetProfileDialogComponent extends DialogComponent implements ErrorStateMatcher, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/profile/asset-profile.component.ts b/ui-ngx/src/app/modules/home/components/profile/asset-profile.component.ts index 7c78ea881f..18374dc7df 100644 --- a/ui-ngx/src/app/modules/home/components/profile/asset-profile.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/asset-profile.component.ts @@ -31,9 +31,10 @@ import { AssetProfile } from '@shared/models/asset.models'; import { RuleChainType } from '@shared/models/rule-chain.models'; @Component({ - selector: 'tb-asset-profile', - templateUrl: './asset-profile.component.html', - styleUrls: [] + selector: 'tb-asset-profile', + templateUrl: './asset-profile.component.html', + styleUrls: [], + standalone: false }) export class AssetProfileComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/home/components/profile/device-profile-autocomplete.component.ts b/ui-ngx/src/app/modules/home/components/profile/device-profile-autocomplete.component.ts index a24219bb41..9989eee7ca 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device-profile-autocomplete.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device-profile-autocomplete.component.ts @@ -54,14 +54,15 @@ import { getCurrentAuthUser } from '@core/auth/auth.selectors'; import { Authority } from '@shared/models/authority.enum'; @Component({ - selector: 'tb-device-profile-autocomplete', - templateUrl: './device-profile-autocomplete.component.html', - styleUrls: ['./device-profile-autocomplete.component.scss'], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceProfileAutocompleteComponent), - multi: true - }] + selector: 'tb-device-profile-autocomplete', + templateUrl: './device-profile-autocomplete.component.html', + styleUrls: ['./device-profile-autocomplete.component.scss'], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceProfileAutocompleteComponent), + multi: true + }], + standalone: false }) export class DeviceProfileAutocompleteComponent implements ControlValueAccessor, OnInit, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/profile/device-profile-dialog.component.ts b/ui-ngx/src/app/modules/home/components/profile/device-profile-dialog.component.ts index 2f791f6cda..eacc40e4d8 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device-profile-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device-profile-dialog.component.ts @@ -32,10 +32,11 @@ export interface DeviceProfileDialogData { } @Component({ - selector: 'tb-device-profile-dialog', - templateUrl: './device-profile-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: DeviceProfileDialogComponent}], - styleUrls: [] + selector: 'tb-device-profile-dialog', + templateUrl: './device-profile-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: DeviceProfileDialogComponent }], + styleUrls: [], + standalone: false }) export class DeviceProfileDialogComponent extends DialogComponent implements ErrorStateMatcher, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/profile/device-profile-provision-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/device-profile-provision-configuration.component.ts index 6ba2a62f0e..1da59bbc5c 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device-profile-provision-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device-profile-provision-configuration.component.ts @@ -40,21 +40,22 @@ import { TranslateService } from '@ngx-translate/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-device-profile-provision-configuration', - templateUrl: './device-profile-provision-configuration.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceProfileProvisionConfigurationComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DeviceProfileProvisionConfigurationComponent), - multi: true, - } - ] + selector: 'tb-device-profile-provision-configuration', + templateUrl: './device-profile-provision-configuration.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceProfileProvisionConfigurationComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DeviceProfileProvisionConfigurationComponent), + multi: true, + } + ], + standalone: false }) export class DeviceProfileProvisionConfigurationComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device-profile.component.ts b/ui-ngx/src/app/modules/home/components/profile/device-profile.component.ts index c7533cd09f..1c7c52ec32 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device-profile.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device-profile.component.ts @@ -46,9 +46,10 @@ import { RuleChainType } from '@shared/models/rule-chain.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-device-profile', - templateUrl: './device-profile.component.html', - styleUrls: [] + selector: 'tb-device-profile', + templateUrl: './device-profile.component.html', + styleUrls: [], + standalone: false }) export class DeviceProfileComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/coap-device-profile-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/coap-device-profile-transport-configuration.component.ts index d264626399..72c1552978 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/coap-device-profile-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/coap-device-profile-transport-configuration.component.ts @@ -46,21 +46,22 @@ import { takeUntil } from 'rxjs/operators'; import { PowerMode } from '@home/components/profile/device/lwm2m/lwm2m-profile-config.models'; @Component({ - selector: 'tb-coap-device-profile-transport-configuration', - templateUrl: './coap-device-profile-transport-configuration.component.html', - styleUrls: ['./coap-device-profile-transport-configuration.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CoapDeviceProfileTransportConfigurationComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => CoapDeviceProfileTransportConfigurationComponent), - multi: true - } - ] + selector: 'tb-coap-device-profile-transport-configuration', + templateUrl: './coap-device-profile-transport-configuration.component.html', + styleUrls: ['./coap-device-profile-transport-configuration.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CoapDeviceProfileTransportConfigurationComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => CoapDeviceProfileTransportConfigurationComponent), + multi: true + } + ], + standalone: false }) export class CoapDeviceProfileTransportConfigurationComponent implements ControlValueAccessor, OnInit, OnDestroy, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/common/power-mode-setting.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/common/power-mode-setting.component.ts index 7b653f43e0..ec4576a162 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/common/power-mode-setting.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/common/power-mode-setting.component.ts @@ -26,9 +26,10 @@ import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; @Component({ - selector: 'tb-power-mode-settings', - templateUrl: './power-mode-setting.component.html', - styleUrls: [] + selector: 'tb-power-mode-settings', + templateUrl: './power-mode-setting.component.html', + styleUrls: [], + standalone: false }) export class PowerModeSettingComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/common/time-unit-select.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/common/time-unit-select.component.ts index 49f84c14fa..709d4ececa 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/common/time-unit-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/common/time-unit-select.component.ts @@ -44,21 +44,22 @@ interface FormGroupModel { } @Component({ - selector: 'tb-time-unit-select', - templateUrl: './time-unit-select.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeUnitSelectComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TimeUnitSelectComponent), - multi: true - } - ] + selector: 'tb-time-unit-select', + templateUrl: './time-unit-select.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeUnitSelectComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TimeUnitSelectComponent), + multi: true + } + ], + standalone: false }) export class TimeUnitSelectComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/default-device-profile-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/default-device-profile-configuration.component.ts index 0f082fd97a..e9c5ef36dc 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/default-device-profile-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/default-device-profile-configuration.component.ts @@ -26,14 +26,15 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-default-device-profile-configuration', - templateUrl: './default-device-profile-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DefaultDeviceProfileConfigurationComponent), - multi: true - }] + selector: 'tb-default-device-profile-configuration', + templateUrl: './default-device-profile-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DefaultDeviceProfileConfigurationComponent), + multi: true + }], + standalone: false }) export class DefaultDeviceProfileConfigurationComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/default-device-profile-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/default-device-profile-transport-configuration.component.ts index 1b7db15d7c..dcb8abc4a3 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/default-device-profile-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/default-device-profile-transport-configuration.component.ts @@ -32,21 +32,22 @@ import { DefaultDeviceProfileTransportConfiguration, DeviceTransportType } from import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-default-device-profile-transport-configuration', - templateUrl: './default-device-profile-transport-configuration.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DefaultDeviceProfileTransportConfigurationComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DefaultDeviceProfileTransportConfigurationComponent), - multi: true - } - ] + selector: 'tb-default-device-profile-transport-configuration', + templateUrl: './default-device-profile-transport-configuration.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DefaultDeviceProfileTransportConfigurationComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DefaultDeviceProfileTransportConfigurationComponent), + multi: true + } + ], + standalone: false }) export class DefaultDeviceProfileTransportConfigurationComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/device-profile-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/device-profile-configuration.component.ts index 80d2a8e0d7..5e6cc15409 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/device-profile-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/device-profile-configuration.component.ts @@ -24,14 +24,15 @@ import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-device-profile-configuration', - templateUrl: './device-profile-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceProfileConfigurationComponent), - multi: true - }] + selector: 'tb-device-profile-configuration', + templateUrl: './device-profile-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceProfileConfigurationComponent), + multi: true + }], + standalone: false }) export class DeviceProfileConfigurationComponent implements ControlValueAccessor, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/device-profile-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/device-profile-transport-configuration.component.ts index 8ef5804433..574e14ac7e 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/device-profile-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/device-profile-transport-configuration.component.ts @@ -32,21 +32,22 @@ import { deepClone } from '@core/utils'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-device-profile-transport-configuration', - templateUrl: './device-profile-transport-configuration.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceProfileTransportConfigurationComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DeviceProfileTransportConfigurationComponent), - multi: true, - } - ] + selector: 'tb-device-profile-transport-configuration', + templateUrl: './device-profile-transport-configuration.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceProfileTransportConfigurationComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DeviceProfileTransportConfigurationComponent), + multi: true, + } + ], + standalone: false }) export class DeviceProfileTransportConfigurationComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-attributes-dialog.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-attributes-dialog.component.ts index 595b62ffde..c61622963f 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-attributes-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-attributes-dialog.component.ts @@ -32,10 +32,11 @@ export interface Lwm2mAttributesDialogData { } @Component({ - selector: 'tb-lwm2m-attributes-dialog', - templateUrl: './lwm2m-attributes-dialog.component.html', - styleUrls: [], - providers: [{provide: ErrorStateMatcher, useExisting: Lwm2mAttributesDialogComponent}], + selector: 'tb-lwm2m-attributes-dialog', + templateUrl: './lwm2m-attributes-dialog.component.html', + styleUrls: [], + providers: [{ provide: ErrorStateMatcher, useExisting: Lwm2mAttributesDialogComponent }], + standalone: false }) export class Lwm2mAttributesDialogComponent extends DialogComponent implements ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-attributes-key-list.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-attributes-key-list.component.ts index d17b37b5fa..0d6cf4df1d 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-attributes-key-list.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-attributes-key-list.component.ts @@ -41,21 +41,22 @@ import { PageComponent } from '@shared/components/page.component'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-lwm2m-attributes-key-list', - templateUrl: './lwm2m-attributes-key-list.component.html', - styleUrls: ['./lwm2m-attributes-key-list.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => Lwm2mAttributesKeyListComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => Lwm2mAttributesKeyListComponent), - multi: true, - } - ] + selector: 'tb-lwm2m-attributes-key-list', + templateUrl: './lwm2m-attributes-key-list.component.html', + styleUrls: ['./lwm2m-attributes-key-list.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => Lwm2mAttributesKeyListComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => Lwm2mAttributesKeyListComponent), + multi: true, + } + ], + standalone: false }) export class Lwm2mAttributesKeyListComponent extends PageComponent implements ControlValueAccessor, OnDestroy, OnDestroy, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-attributes.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-attributes.component.ts index af12a85389..a3a29e6961 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-attributes.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-attributes.component.ts @@ -25,14 +25,15 @@ import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-profile-lwm2m-attributes', - templateUrl: './lwm2m-attributes.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => Lwm2mAttributesComponent), - multi: true - }] + selector: 'tb-profile-lwm2m-attributes', + templateUrl: './lwm2m-attributes.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => Lwm2mAttributesComponent), + multi: true + }], + standalone: false }) export class Lwm2mAttributesComponent implements ControlValueAccessor, OnDestroy { attributesFormGroup: UntypedFormGroup; diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-add-config-server-dialog.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-add-config-server-dialog.component.ts index d9ca2426a6..e50fe79cda 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-add-config-server-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-add-config-server-dialog.component.ts @@ -27,8 +27,9 @@ import { } from '@home/components/profile/device/lwm2m/lwm2m-profile-config.models'; @Component({ - selector: 'tb-profile-lwm2m-bootstrap-add-config-server-dialog', - templateUrl: './lwm2m-bootstrap-add-config-server-dialog.component.html' + selector: 'tb-profile-lwm2m-bootstrap-add-config-server-dialog', + templateUrl: './lwm2m-bootstrap-add-config-server-dialog.component.html', + standalone: false }) export class Lwm2mBootstrapAddConfigServerDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-config-servers.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-config-servers.component.ts index a64e262213..2f0fd69102 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-config-servers.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-config-servers.component.ts @@ -35,20 +35,21 @@ import { DeviceProfileService } from '@core/http/device-profile.service'; import { Lwm2mSecurityType } from '@shared/models/lwm2m-security-config.models'; @Component({ - selector: 'tb-profile-lwm2m-bootstrap-config-servers', - templateUrl: './lwm2m-bootstrap-config-servers.component.html', - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => Lwm2mBootstrapConfigServersComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => Lwm2mBootstrapConfigServersComponent), - multi: true, - } - ] + selector: 'tb-profile-lwm2m-bootstrap-config-servers', + templateUrl: './lwm2m-bootstrap-config-servers.component.html', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => Lwm2mBootstrapConfigServersComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => Lwm2mBootstrapConfigServersComponent), + multi: true, + } + ], + standalone: false }) export class Lwm2mBootstrapConfigServersComponent implements OnInit, ControlValueAccessor, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-config-server.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-config-server.component.ts index dc523e1b87..4464880588 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-config-server.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-config-server.component.ts @@ -41,20 +41,21 @@ import { import { coerceBoolean } from '@shared/decorators/coercion'; @Component({ - selector: 'tb-profile-lwm2m-device-config-server', - templateUrl: './lwm2m-device-config-server.component.html', - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => Lwm2mDeviceConfigServerComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => Lwm2mDeviceConfigServerComponent), - multi: true - }, - ] + selector: 'tb-profile-lwm2m-device-config-server', + templateUrl: './lwm2m-device-config-server.component.html', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => Lwm2mDeviceConfigServerComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => Lwm2mDeviceConfigServerComponent), + multi: true + }, + ], + standalone: false }) export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAccessor, Validator, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.ts index 18eb3581bd..010b3d528b 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.ts @@ -58,20 +58,22 @@ import { DialogService } from '@core/services/dialog.service'; import { TranslateService } from '@ngx-translate/core'; @Component({ - selector: 'tb-profile-lwm2m-device-transport-configuration', - templateUrl: './lwm2m-device-profile-transport-configuration.component.html', - styleUrls: ['./lwm2m-device-profile-transport-configuration.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => Lwm2mDeviceProfileTransportConfigurationComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => Lwm2mDeviceProfileTransportConfigurationComponent), - multi: true - }] + selector: 'tb-profile-lwm2m-device-transport-configuration', + templateUrl: './lwm2m-device-profile-transport-configuration.component.html', + styleUrls: ['./lwm2m-device-profile-transport-configuration.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => Lwm2mDeviceProfileTransportConfigurationComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => Lwm2mDeviceProfileTransportConfigurationComponent), + multi: true + } + ], + standalone: false }) export class Lwm2mDeviceProfileTransportConfigurationComponent implements ControlValueAccessor, Validator, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-add-instances-dialog.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-add-instances-dialog.component.ts index 2a2db7551b..0b8c23bbe4 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-add-instances-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-add-instances-dialog.component.ts @@ -29,8 +29,9 @@ export interface Lwm2mObjectAddInstancesData { } @Component({ - selector: 'tb-lwm2m-object-add-instances', - templateUrl: './lwm2m-object-add-instances-dialog.component.html' + selector: 'tb-lwm2m-object-add-instances', + templateUrl: './lwm2m-object-add-instances-dialog.component.html', + standalone: false }) export class Lwm2mObjectAddInstancesDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-add-instances-list.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-add-instances-list.component.ts index f139d40d2f..9c9d25e2f0 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-add-instances-list.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-add-instances-list.component.ts @@ -29,19 +29,21 @@ import { COMMA, ENTER, SEMICOLON } from '@angular/cdk/keycodes'; import { MatChipInputEvent } from '@angular/material/chips'; @Component({ - selector: 'tb-profile-lwm2m-object-add-instances-list', - templateUrl: './lwm2m-object-add-instances-list.component.html', - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => Lwm2mObjectAddInstancesListComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => Lwm2mObjectAddInstancesListComponent), - multi: true - }] + selector: 'tb-profile-lwm2m-object-add-instances-list', + templateUrl: './lwm2m-object-add-instances-list.component.html', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => Lwm2mObjectAddInstancesListComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => Lwm2mObjectAddInstancesListComponent), + multi: true + } + ], + standalone: false }) export class Lwm2mObjectAddInstancesListComponent implements ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-list.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-list.component.ts index 2db720da8c..3aafd2d56f 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-list.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-list.component.ts @@ -37,20 +37,21 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { MatAutocompleteTrigger } from '@angular/material/autocomplete'; @Component({ - selector: 'tb-profile-lwm2m-object-list', - templateUrl: './lwm2m-object-list.component.html', - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => Lwm2mObjectListComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => Lwm2mObjectListComponent), - multi: true - } - ] + selector: 'tb-profile-lwm2m-object-list', + templateUrl: './lwm2m-object-list.component.html', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => Lwm2mObjectListComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => Lwm2mObjectListComponent), + multi: true + } + ], + standalone: false }) export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry-instances.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry-instances.component.ts index ecfeb9cf55..1bdd5cba82 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry-instances.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry-instances.component.ts @@ -34,21 +34,22 @@ import { TranslateService } from '@ngx-translate/core'; import { Subscription } from 'rxjs'; @Component({ - selector: 'tb-profile-lwm2m-observe-attr-telemetry-instances', - templateUrl: './lwm2m-observe-attr-telemetry-instances.component.html', - styleUrls: [ './lwm2m-observe-attr-telemetry-instances.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => Lwm2mObserveAttrTelemetryInstancesComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => Lwm2mObserveAttrTelemetryInstancesComponent), - multi: true - } - ] + selector: 'tb-profile-lwm2m-observe-attr-telemetry-instances', + templateUrl: './lwm2m-observe-attr-telemetry-instances.component.html', + styleUrls: ['./lwm2m-observe-attr-telemetry-instances.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => Lwm2mObserveAttrTelemetryInstancesComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => Lwm2mObserveAttrTelemetryInstancesComponent), + multi: true + } + ], + standalone: false }) export class Lwm2mObserveAttrTelemetryInstancesComponent implements ControlValueAccessor, Validator, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry-resources.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry-resources.component.ts index d3686b002f..0e107d43bf 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry-resources.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry-resources.component.ts @@ -33,21 +33,22 @@ import { combineLatest, Subject } from 'rxjs'; import { startWith, takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-profile-lwm2m-observe-attr-telemetry-resource', - templateUrl: './lwm2m-observe-attr-telemetry-resources.component.html', - styleUrls: ['./lwm2m-observe-attr-telemetry-resources.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => Lwm2mObserveAttrTelemetryResourcesComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => Lwm2mObserveAttrTelemetryResourcesComponent), - multi: true - } - ] + selector: 'tb-profile-lwm2m-observe-attr-telemetry-resource', + templateUrl: './lwm2m-observe-attr-telemetry-resources.component.html', + styleUrls: ['./lwm2m-observe-attr-telemetry-resources.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => Lwm2mObserveAttrTelemetryResourcesComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => Lwm2mObserveAttrTelemetryResourcesComponent), + multi: true + } + ], + standalone: false }) export class Lwm2mObserveAttrTelemetryResourcesComponent implements ControlValueAccessor, OnDestroy, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry.component.ts index 2de0b0f0a7..c2d5a21537 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry.component.ts @@ -39,21 +39,22 @@ import _ from 'lodash'; import { Subscription } from 'rxjs'; @Component({ - selector: 'tb-profile-lwm2m-observe-attr-telemetry', - templateUrl: './lwm2m-observe-attr-telemetry.component.html', - styleUrls: [ './lwm2m-observe-attr-telemetry.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => Lwm2mObserveAttrTelemetryComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => Lwm2mObserveAttrTelemetryComponent), - multi: true - } - ] + selector: 'tb-profile-lwm2m-observe-attr-telemetry', + templateUrl: './lwm2m-observe-attr-telemetry.component.html', + styleUrls: ['./lwm2m-observe-attr-telemetry.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => Lwm2mObserveAttrTelemetryComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => Lwm2mObserveAttrTelemetryComponent), + multi: true + } + ], + standalone: false }) export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor, OnDestroy, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/mqtt-device-profile-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/mqtt-device-profile-transport-configuration.component.ts index 9ade4171bf..bc997d6960 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/mqtt-device-profile-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/mqtt-device-profile-transport-configuration.component.ts @@ -44,21 +44,22 @@ import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-mqtt-device-profile-transport-configuration', - templateUrl: './mqtt-device-profile-transport-configuration.component.html', - styleUrls: ['./mqtt-device-profile-transport-configuration.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MqttDeviceProfileTransportConfigurationComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MqttDeviceProfileTransportConfigurationComponent), - multi: true - } - ] + selector: 'tb-mqtt-device-profile-transport-configuration', + templateUrl: './mqtt-device-profile-transport-configuration.component.html', + styleUrls: ['./mqtt-device-profile-transport-configuration.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MqttDeviceProfileTransportConfigurationComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MqttDeviceProfileTransportConfigurationComponent), + multi: true + } + ], + standalone: false }) export class MqttDeviceProfileTransportConfigurationComponent implements ControlValueAccessor, OnInit, OnDestroy, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/snmp/snmp-device-profile-communication-config.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/snmp/snmp-device-profile-communication-config.component.ts index 6811f636dd..544fcfdac6 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/snmp/snmp-device-profile-communication-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/snmp/snmp-device-profile-communication-config.component.ts @@ -32,20 +32,22 @@ import { isUndefinedOrNull } from '@core/utils'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-snmp-device-profile-communication-config', - templateUrl: './snmp-device-profile-communication-config.component.html', - styleUrls: ['./snmp-device-profile-communication-config.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => SnmpDeviceProfileCommunicationConfigComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => SnmpDeviceProfileCommunicationConfigComponent), - multi: true - }] + selector: 'tb-snmp-device-profile-communication-config', + templateUrl: './snmp-device-profile-communication-config.component.html', + styleUrls: ['./snmp-device-profile-communication-config.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SnmpDeviceProfileCommunicationConfigComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => SnmpDeviceProfileCommunicationConfigComponent), + multi: true + } + ], + standalone: false }) export class SnmpDeviceProfileCommunicationConfigComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/snmp/snmp-device-profile-mapping.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/snmp/snmp-device-profile-mapping.component.ts index b18a1c37f0..66f8c0737e 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/snmp/snmp-device-profile-mapping.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/snmp/snmp-device-profile-mapping.component.ts @@ -34,20 +34,22 @@ import { isUndefinedOrNull } from '@core/utils'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-snmp-device-profile-mapping', - templateUrl: './snmp-device-profile-mapping.component.html', - styleUrls: ['./snmp-device-profile-mapping.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => SnmpDeviceProfileMappingComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => SnmpDeviceProfileMappingComponent), - multi: true - }] + selector: 'tb-snmp-device-profile-mapping', + templateUrl: './snmp-device-profile-mapping.component.html', + styleUrls: ['./snmp-device-profile-mapping.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SnmpDeviceProfileMappingComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => SnmpDeviceProfileMappingComponent), + multi: true + } + ], + standalone: false }) export class SnmpDeviceProfileMappingComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/device/snmp/snmp-device-profile-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/snmp/snmp-device-profile-transport-configuration.component.ts index e2681319c2..15338a385d 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/snmp/snmp-device-profile-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/snmp/snmp-device-profile-transport-configuration.component.ts @@ -42,20 +42,22 @@ export interface OidMappingConfiguration { } @Component({ - selector: 'tb-snmp-device-profile-transport-configuration', - templateUrl: './snmp-device-profile-transport-configuration.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => SnmpDeviceProfileTransportConfigurationComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => SnmpDeviceProfileTransportConfigurationComponent), - multi: true - }] + selector: 'tb-snmp-device-profile-transport-configuration', + templateUrl: './snmp-device-profile-transport-configuration.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SnmpDeviceProfileTransportConfigurationComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => SnmpDeviceProfileTransportConfigurationComponent), + multi: true + } + ], + standalone: false }) export class SnmpDeviceProfileTransportConfigurationComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/queue/tenant-profile-queues.component.ts b/ui-ngx/src/app/modules/home/components/profile/queue/tenant-profile-queues.component.ts index c2166ae859..aa7bebaba8 100644 --- a/ui-ngx/src/app/modules/home/components/profile/queue/tenant-profile-queues.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/queue/tenant-profile-queues.component.ts @@ -37,21 +37,22 @@ import { guid } from '@core/utils'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-tenant-profile-queues', - templateUrl: './tenant-profile-queues.component.html', - styleUrls: ['./tenant-profile-queues.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TenantProfileQueuesComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TenantProfileQueuesComponent), - multi: true, - } - ] + selector: 'tb-tenant-profile-queues', + templateUrl: './tenant-profile-queues.component.html', + styleUrls: ['./tenant-profile-queues.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TenantProfileQueuesComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TenantProfileQueuesComponent), + multi: true, + } + ], + standalone: false }) export class TenantProfileQueuesComponent implements ControlValueAccessor, Validator, OnDestroy, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/profile/tenant-profile-autocomplete.component.ts b/ui-ngx/src/app/modules/home/components/profile/tenant-profile-autocomplete.component.ts index 207eb19253..1bd785cf7a 100644 --- a/ui-ngx/src/app/modules/home/components/profile/tenant-profile-autocomplete.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/tenant-profile-autocomplete.component.ts @@ -37,14 +37,15 @@ import { emptyPageData } from '@shared/models/page/page-data'; import { getEntityDetailsPageURL } from '@core/utils'; @Component({ - selector: 'tb-tenant-profile-autocomplete', - templateUrl: './tenant-profile-autocomplete.component.html', - styleUrls: ['./tenant-profile-autocomplete.component.scss'], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TenantProfileAutocompleteComponent), - multi: true - }] + selector: 'tb-tenant-profile-autocomplete', + templateUrl: './tenant-profile-autocomplete.component.html', + styleUrls: ['./tenant-profile-autocomplete.component.scss'], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TenantProfileAutocompleteComponent), + multi: true + }], + standalone: false }) export class TenantProfileAutocompleteComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/profile/tenant-profile-data.component.ts b/ui-ngx/src/app/modules/home/components/profile/tenant-profile-data.component.ts index 543fdf9e1a..695fa2ceca 100644 --- a/ui-ngx/src/app/modules/home/components/profile/tenant-profile-data.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/tenant-profile-data.component.ts @@ -23,14 +23,15 @@ import { TenantProfileData } from '@shared/models/tenant.model'; import { Subscription } from 'rxjs'; @Component({ - selector: 'tb-tenant-profile-data', - templateUrl: './tenant-profile-data.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TenantProfileDataComponent), - multi: true - }] + selector: 'tb-tenant-profile-data', + templateUrl: './tenant-profile-data.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TenantProfileDataComponent), + multi: true + }], + standalone: false }) export class TenantProfileDataComponent implements ControlValueAccessor, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/profile/tenant-profile-dialog.component.ts b/ui-ngx/src/app/modules/home/components/profile/tenant-profile-dialog.component.ts index 4f10376eaa..67ca86a215 100644 --- a/ui-ngx/src/app/modules/home/components/profile/tenant-profile-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/tenant-profile-dialog.component.ts @@ -32,10 +32,11 @@ export interface TenantProfileDialogData { } @Component({ - selector: 'tb-tenant-profile-dialog', - templateUrl: './tenant-profile-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: TenantProfileDialogComponent}], - styleUrls: ['tenant-profile-dialog.component.scss'] + selector: 'tb-tenant-profile-dialog', + templateUrl: './tenant-profile-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: TenantProfileDialogComponent }], + styleUrls: ['tenant-profile-dialog.component.scss'], + standalone: false }) export class TenantProfileDialogComponent extends DialogComponent implements ErrorStateMatcher, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/profile/tenant-profile.component.ts b/ui-ngx/src/app/modules/home/components/profile/tenant-profile.component.ts index 5025ce556a..4ae02c8ac8 100644 --- a/ui-ngx/src/app/modules/home/components/profile/tenant-profile.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/tenant-profile.component.ts @@ -27,9 +27,10 @@ import { guid } from '@core/utils'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-tenant-profile', - templateUrl: './tenant-profile.component.html', - styleUrls: ['./tenant-profile.component.scss'] + selector: 'tb-tenant-profile', + templateUrl: './tenant-profile.component.html', + styleUrls: ['./tenant-profile.component.scss'], + standalone: false }) export class TenantProfileComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/home/components/profile/tenant/default-tenant-profile-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/tenant/default-tenant-profile-configuration.component.ts index 4f1efa32d2..90f38ba13d 100644 --- a/ui-ngx/src/app/modules/home/components/profile/tenant/default-tenant-profile-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/tenant/default-tenant-profile-configuration.component.ts @@ -26,14 +26,15 @@ import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; @Component({ - selector: 'tb-default-tenant-profile-configuration', - templateUrl: './default-tenant-profile-configuration.component.html', - styleUrls: ['./default-tenant-profile-configuration.component.scss'], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DefaultTenantProfileConfigurationComponent), - multi: true - }] + selector: 'tb-default-tenant-profile-configuration', + templateUrl: './default-tenant-profile-configuration.component.html', + styleUrls: ['./default-tenant-profile-configuration.component.scss'], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DefaultTenantProfileConfigurationComponent), + multi: true + }], + standalone: false }) export class DefaultTenantProfileConfigurationComponent implements ControlValueAccessor, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits-details-dialog.component.ts b/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits-details-dialog.component.ts index abca908623..a7ada0090b 100644 --- a/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits-details-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits-details-dialog.component.ts @@ -29,7 +29,8 @@ export interface RateLimitsDetailsDialogData { } @Component({ - templateUrl: './rate-limits-details-dialog.component.html' + templateUrl: './rate-limits-details-dialog.component.html', + standalone: false }) export class RateLimitsDetailsDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits-list.component.ts b/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits-list.component.ts index 4434259bb4..7b58242e4d 100644 --- a/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits-list.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits-list.component.ts @@ -33,21 +33,22 @@ import { isDefinedAndNotNull } from '@core/utils'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-rate-limits-list', - templateUrl: './rate-limits-list.component.html', - styleUrls: ['./rate-limits-list.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => RateLimitsListComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => RateLimitsListComponent), - multi: true - } - ] + selector: 'tb-rate-limits-list', + templateUrl: './rate-limits-list.component.html', + styleUrls: ['./rate-limits-list.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => RateLimitsListComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => RateLimitsListComponent), + multi: true + } + ], + standalone: false }) export class RateLimitsListComponent implements ControlValueAccessor, Validator, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits-text.component.ts b/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits-text.component.ts index 16b00f0d6e..d5195cbad9 100644 --- a/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits-text.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits-text.component.ts @@ -19,9 +19,10 @@ import { TranslateService } from '@ngx-translate/core'; import { RateLimits, rateLimitsArrayToHtml } from './rate-limits.models'; @Component({ - selector: 'tb-rate-limits-text', - templateUrl: './rate-limits-text.component.html', - styleUrls: ['./rate-limits-text.component.scss'] + selector: 'tb-rate-limits-text', + templateUrl: './rate-limits-text.component.html', + styleUrls: ['./rate-limits-text.component.scss'], + standalone: false }) export class RateLimitsTextComponent implements OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits.component.ts b/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits.component.ts index 6e03646bba..397253b753 100644 --- a/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/tenant/rate-limits/rate-limits.component.ts @@ -39,21 +39,22 @@ import { import { isDefined } from '@core/utils'; @Component({ - selector: 'tb-rate-limits', - templateUrl: './rate-limits.component.html', - styleUrls: ['./rate-limits.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => RateLimitsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => RateLimitsComponent), - multi: true, - } - ] + selector: 'tb-rate-limits', + templateUrl: './rate-limits.component.html', + styleUrls: ['./rate-limits.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => RateLimitsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => RateLimitsComponent), + multi: true, + } + ], + standalone: false }) export class RateLimitsComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/profile/tenant/tenant-profile-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/tenant/tenant-profile-configuration.component.ts index 0117706d12..a140a7053d 100644 --- a/ui-ngx/src/app/modules/home/components/profile/tenant/tenant-profile-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/tenant/tenant-profile-configuration.component.ts @@ -24,14 +24,15 @@ import { TenantProfileConfiguration, TenantProfileType } from '@shared/models/te import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-tenant-profile-configuration', - templateUrl: './tenant-profile-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TenantProfileConfigurationComponent), - multi: true - }] + selector: 'tb-tenant-profile-configuration', + templateUrl: './tenant-profile-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TenantProfileConfigurationComponent), + multi: true + }], + standalone: false }) export class TenantProfileConfigurationComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/queue/queue-form.component.ts b/ui-ngx/src/app/modules/home/components/queue/queue-form.component.ts index 2760226998..e3b22095c4 100644 --- a/ui-ngx/src/app/modules/home/components/queue/queue-form.component.ts +++ b/ui-ngx/src/app/modules/home/components/queue/queue-form.component.ts @@ -38,21 +38,22 @@ import { Subscription } from 'rxjs'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-queue-form', - templateUrl: './queue-form.component.html', - styleUrls: ['./queue-form.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => QueueFormComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => QueueFormComponent), - multi: true, - } - ] + selector: 'tb-queue-form', + templateUrl: './queue-form.component.html', + styleUrls: ['./queue-form.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => QueueFormComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => QueueFormComponent), + multi: true, + } + ], + standalone: false }) export class QueueFormComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/relation/relation-dialog.component.ts b/ui-ngx/src/app/modules/home/components/relation/relation-dialog.component.ts index c9a4fedb69..362bb73dab 100644 --- a/ui-ngx/src/app/modules/home/components/relation/relation-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/relation/relation-dialog.component.ts @@ -44,10 +44,11 @@ export interface RelationDialogData { } @Component({ - selector: 'tb-relation-dialog', - templateUrl: './relation-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: RelationDialogComponent}], - styleUrls: ['./relation-dialog.component.scss'] + selector: 'tb-relation-dialog', + templateUrl: './relation-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: RelationDialogComponent }], + styleUrls: ['./relation-dialog.component.scss'], + standalone: false }) export class RelationDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/relation/relation-filters.component.ts b/ui-ngx/src/app/modules/home/components/relation/relation-filters.component.ts index 76ca033183..f8e1e796a5 100644 --- a/ui-ngx/src/app/modules/home/components/relation/relation-filters.component.ts +++ b/ui-ngx/src/app/modules/home/components/relation/relation-filters.component.ts @@ -33,16 +33,17 @@ import { takeUntil } from 'rxjs/operators'; import { coerceBoolean } from '@shared/decorators/coercion'; @Component({ - selector: 'tb-relation-filters', - templateUrl: './relation-filters.component.html', - styleUrls: ['./relation-filters.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => RelationFiltersComponent), - multi: true - } - ] + selector: 'tb-relation-filters', + templateUrl: './relation-filters.component.html', + styleUrls: ['./relation-filters.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => RelationFiltersComponent), + multi: true + } + ], + standalone: false }) export class RelationFiltersComponent extends PageComponent implements ControlValueAccessor, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/relation/relation-table.component.ts b/ui-ngx/src/app/modules/home/components/relation/relation-table.component.ts index f5dcd97032..00b10e401a 100644 --- a/ui-ngx/src/app/modules/home/components/relation/relation-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/relation/relation-table.component.ts @@ -52,10 +52,11 @@ import { hidePageSizePixelValue } from '@shared/models/constants'; import { FormBuilder } from '@angular/forms'; @Component({ - selector: 'tb-relation-table', - templateUrl: './relation-table.component.html', - styleUrls: ['./relation-table.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-relation-table', + templateUrl: './relation-table.component.html', + styleUrls: ['./relation-table.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class RelationTableComponent extends PageComponent implements AfterViewInit, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/resources/resources-dialog.component.ts b/ui-ngx/src/app/modules/home/components/resources/resources-dialog.component.ts index fb20a0fe26..3cd2a7f790 100644 --- a/ui-ngx/src/app/modules/home/components/resources/resources-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/resources/resources-dialog.component.ts @@ -34,10 +34,11 @@ export interface ResourcesDialogData { } @Component({ - selector: 'tb-resources-dialog', - templateUrl: './resources-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: ResourcesDialogComponent}], - styleUrls: ['./resources-dialog.component.scss'] + selector: 'tb-resources-dialog', + templateUrl: './resources-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: ResourcesDialogComponent }], + styleUrls: ['./resources-dialog.component.scss'], + standalone: false }) export class ResourcesDialogComponent extends DialogComponent implements ErrorStateMatcher, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/resources/resources-library.component.ts b/ui-ngx/src/app/modules/home/components/resources/resources-library.component.ts index cd2998af82..8bb8f05359 100644 --- a/ui-ngx/src/app/modules/home/components/resources/resources-library.component.ts +++ b/ui-ngx/src/app/modules/home/components/resources/resources-library.component.ts @@ -35,8 +35,9 @@ import { isDefinedAndNotNull } from '@core/utils'; import { getCurrentAuthState } from '@core/auth/auth.selectors'; @Component({ - selector: 'tb-resources-library', - templateUrl: './resources-library.component.html' + selector: 'tb-resources-library', + templateUrl: './resources-library.component.html', + standalone: false }) export class ResourcesLibraryComponent extends EntityComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/router-tabs.component.ts b/ui-ngx/src/app/modules/home/components/router-tabs.component.ts index a4e6a883b6..b75b90e373 100644 --- a/ui-ngx/src/app/modules/home/components/router-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/components/router-tabs.component.ts @@ -28,9 +28,10 @@ import { TbAnchorComponent } from '@shared/components/tb-anchor.component'; import { getCurrentAuthUser } from '@core/auth/auth.selectors'; @Component({ - selector: 'tb-router-tabs', - templateUrl: './router-tabs.component.html', - styleUrls: ['./router-tabs.component.scss'] + selector: 'tb-router-tabs', + templateUrl: './router-tabs.component.html', + styleUrls: ['./router-tabs.component.scss'], + standalone: false }) export class RouterTabsComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/rule-chain/rule-chain-autocomplete.component.ts b/ui-ngx/src/app/modules/home/components/rule-chain/rule-chain-autocomplete.component.ts index e6176603c3..b0d83cac46 100644 --- a/ui-ngx/src/app/modules/home/components/rule-chain/rule-chain-autocomplete.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-chain/rule-chain-autocomplete.component.ts @@ -33,14 +33,15 @@ import { RuleChainType } from '@app/shared/models/rule-chain.models'; import { getEntityDetailsPageURL } from '@core/utils'; @Component({ - selector: 'tb-rule-chain-autocomplete', - templateUrl: './rule-chain-autocomplete.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => RuleChainAutocompleteComponent), - multi: true - }] + selector: 'tb-rule-chain-autocomplete', + templateUrl: './rule-chain-autocomplete.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => RuleChainAutocompleteComponent), + multi: true + }], + standalone: false }) export class RuleChainAutocompleteComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/advanced-processing-setting-row.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/advanced-processing-setting-row.component.ts index 7e73655529..22cdec0c82 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/advanced-processing-setting-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/advanced-processing-setting-row.component.ts @@ -34,17 +34,18 @@ import { isDefinedAndNotNull } from '@core/utils'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-advanced-processing-setting-row', - templateUrl: './advanced-processing-setting-row.component.html', - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AdvancedProcessingSettingRowComponent), - multi: true - },{ - provide: NG_VALIDATORS, - useExisting: forwardRef(() => AdvancedProcessingSettingRowComponent), - multi: true - }] + selector: 'tb-advanced-processing-setting-row', + templateUrl: './advanced-processing-setting-row.component.html', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AdvancedProcessingSettingRowComponent), + multi: true + }, { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => AdvancedProcessingSettingRowComponent), + multi: true + }], + standalone: false }) export class AdvancedProcessingSettingRowComponent implements ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/advanced-processing-setting.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/advanced-processing-setting.component.ts index 3cd880cedd..6a8ef33a56 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/advanced-processing-setting.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/advanced-processing-setting.component.ts @@ -30,17 +30,18 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { AttributeAdvancedProcessingStrategy } from '@home/components/rule-node/action/attributes-config.model'; @Component({ - selector: 'tb-advanced-processing-settings', - templateUrl: './advanced-processing-setting.component.html', - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AdvancedProcessingSettingComponent), - multi: true - },{ - provide: NG_VALIDATORS, - useExisting: forwardRef(() => AdvancedProcessingSettingComponent), - multi: true - }] + selector: 'tb-advanced-processing-settings', + templateUrl: './advanced-processing-setting.component.html', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AdvancedProcessingSettingComponent), + multi: true + }, { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => AdvancedProcessingSettingComponent), + multi: true + }], + standalone: false }) export class AdvancedProcessingSettingComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/assign-customer-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/assign-customer-config.component.ts index 0a67f7ba56..c844cd114b 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/assign-customer-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/assign-customer-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-action-node-assign-to-customer-config', - templateUrl: './assign-customer-config.component.html', - styleUrls: [] + selector: 'tb-action-node-assign-to-customer-config', + templateUrl: './assign-customer-config.component.html', + styleUrls: [], + standalone: false }) export class AssignCustomerConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/attributes-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/attributes-config.component.ts index 13deb3afda..ab43627104 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/attributes-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/attributes-config.component.ts @@ -33,9 +33,10 @@ import { } from '@home/components/rule-node/action/attributes-config.model'; @Component({ - selector: 'tb-action-node-attributes-config', - templateUrl: './attributes-config.component.html', - styleUrls: [] + selector: 'tb-action-node-attributes-config', + templateUrl: './attributes-config.component.html', + styleUrls: [], + standalone: false }) export class AttributesConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/clear-alarm-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/clear-alarm-config.component.ts index fdc7883fec..812f50955a 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/clear-alarm-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/clear-alarm-config.component.ts @@ -28,9 +28,10 @@ import type { JsFuncComponent } from '@app/shared/components/js-func.component'; import { DebugRuleNodeEventBody } from '@shared/models/event.models'; @Component({ - selector: 'tb-action-node-clear-alarm-config', - templateUrl: './clear-alarm-config.component.html', - styleUrls: [] + selector: 'tb-action-node-clear-alarm-config', + templateUrl: './clear-alarm-config.component.html', + styleUrls: [], + standalone: false }) export class ClearAlarmConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/create-alarm-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/create-alarm-config.component.ts index f4ec7424aa..cd2122a8dd 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/create-alarm-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/create-alarm-config.component.ts @@ -32,9 +32,10 @@ import { DebugRuleNodeEventBody } from '@shared/models/event.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-action-node-create-alarm-config', - templateUrl: './create-alarm-config.component.html', - styleUrls: [] + selector: 'tb-action-node-create-alarm-config', + templateUrl: './create-alarm-config.component.html', + styleUrls: [], + standalone: false }) export class CreateAlarmConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/create-relation-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/create-relation-config.component.ts index 40fce452a9..5d3e85e565 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/create-relation-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/create-relation-config.component.ts @@ -21,9 +21,10 @@ import { EntitySearchDirection } from '@app/shared/models/relation.models'; import { EntityType } from '@app/shared/models/entity-type.models'; @Component({ - selector: 'tb-action-node-create-relation-config', - templateUrl: './create-relation-config.component.html', - styleUrls: [] + selector: 'tb-action-node-create-relation-config', + templateUrl: './create-relation-config.component.html', + styleUrls: [], + standalone: false }) export class CreateRelationConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/delete-attributes-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/delete-attributes-config.component.ts index 79e27e594f..565b5e9dea 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/delete-attributes-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/delete-attributes-config.component.ts @@ -23,9 +23,10 @@ import { AttributeScope, telemetryTypeTranslations } from '@shared/models/teleme import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-action-node-delete-attributes-config', - templateUrl: './delete-attributes-config.component.html', - styleUrls: [] + selector: 'tb-action-node-delete-attributes-config', + templateUrl: './delete-attributes-config.component.html', + styleUrls: [], + standalone: false }) export class DeleteAttributesConfigComponent extends RuleNodeConfigurationComponent { @ViewChild('attributeChipList') attributeChipList: MatChipGrid; diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/delete-relation-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/delete-relation-config.component.ts index d7839e1f23..606035bd08 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/delete-relation-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/delete-relation-config.component.ts @@ -21,9 +21,10 @@ import { EntitySearchDirection } from '@app/shared/models/relation.models'; import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shared/models/rule-node.models'; @Component({ - selector: 'tb-action-node-delete-relation-config', - templateUrl: './delete-relation-config.component.html', - styleUrls: [] + selector: 'tb-action-node-delete-relation-config', + templateUrl: './delete-relation-config.component.html', + styleUrls: [], + standalone: false }) export class DeleteRelationConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/device-profile-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/device-profile-config.component.ts index 3bd49c65f2..e7397f431c 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/device-profile-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/device-profile-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-action-node-device-profile-config', - templateUrl: './device-profile-config.component.html', - styleUrls: [] + selector: 'tb-action-node-device-profile-config', + templateUrl: './device-profile-config.component.html', + styleUrls: [], + standalone: false }) export class DeviceProfileConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/device-state-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/device-state-config.component.ts index f3176849f1..08a81b8bbb 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/device-state-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/device-state-config.component.ts @@ -27,7 +27,8 @@ import { @Component({ selector: 'tb-action-node-device-state-config', templateUrl: './device-state-config.component.html', - styleUrls: [] + styleUrls: [], + standalone: false }) export class DeviceStateConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/generator-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/generator-config.component.ts index 2632a080a6..a421400791 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/generator-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/generator-config.component.ts @@ -28,9 +28,10 @@ import { EntityType } from '@app/shared/models/entity-type.models'; import { DebugRuleNodeEventBody } from '@shared/models/event.models'; @Component({ - selector: 'tb-action-node-generator-config', - templateUrl: './generator-config.component.html', - styleUrls: ['generator-config.component.scss'] + selector: 'tb-action-node-generator-config', + templateUrl: './generator-config.component.html', + styleUrls: ['generator-config.component.scss'], + standalone: false }) export class GeneratorConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/gps-geo-action-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/gps-geo-action-config.component.ts index c16a13c5d8..b74efbe677 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/gps-geo-action-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/gps-geo-action-config.component.ts @@ -28,9 +28,10 @@ import { } from '../rule-node-config.models'; @Component({ - selector: 'tb-action-node-gps-geofencing-config', - templateUrl: './gps-geo-action-config.component.html', - styleUrls: ['./gps-geo-action-config.component.scss'] + selector: 'tb-action-node-gps-geofencing-config', + templateUrl: './gps-geo-action-config.component.html', + styleUrls: ['./gps-geo-action-config.component.scss'], + standalone: false }) export class GpsGeoActionConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/log-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/log-config.component.ts index 4be9783e6a..7d62fdb7d4 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/log-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/log-config.component.ts @@ -27,9 +27,10 @@ import type { JsFuncComponent } from '@app/shared/components/js-func.component'; import { DebugRuleNodeEventBody } from '@shared/models/event.models'; @Component({ - selector: 'tb-action-node-log-config', - templateUrl: './log-config.component.html', - styleUrls: [] + selector: 'tb-action-node-log-config', + templateUrl: './log-config.component.html', + styleUrls: [], + standalone: false }) export class LogConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/math-function-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/math-function-config.component.ts index b7579e52a6..66c962a4e7 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/math-function-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/math-function-config.component.ts @@ -27,9 +27,10 @@ import { @Component({ - selector: 'tb-action-node-math-function-config', - templateUrl: './math-function-config.component.html', - styleUrls: ['./math-function-config.component.scss'] + selector: 'tb-action-node-math-function-config', + templateUrl: './math-function-config.component.html', + styleUrls: ['./math-function-config.component.scss'], + standalone: false }) export class MathFunctionConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/msg-count-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/msg-count-config.component.ts index 1cdff79ff6..ab9f1186f6 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/msg-count-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/msg-count-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-action-node-msg-count-config', - templateUrl: './msg-count-config.component.html', - styleUrls: [] + selector: 'tb-action-node-msg-count-config', + templateUrl: './msg-count-config.component.html', + styleUrls: [], + standalone: false }) export class MsgCountConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/msg-delay-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/msg-delay-config.component.ts index 09ce257e94..c36ad95a58 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/msg-delay-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/msg-delay-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-action-node-msg-delay-config', - templateUrl: './msg-delay-config.component.html', - styleUrls: [] + selector: 'tb-action-node-msg-delay-config', + templateUrl: './msg-delay-config.component.html', + styleUrls: [], + standalone: false }) export class MsgDelayConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/push-to-cloud-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/push-to-cloud-config.component.ts index 451caa2301..a7a5542b98 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/push-to-cloud-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/push-to-cloud-config.component.ts @@ -20,9 +20,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/m import { AttributeScope, telemetryTypeTranslations } from '@shared/models/telemetry/telemetry.models'; @Component({ - selector: 'tb-action-node-push-to-cloud-config', - templateUrl: './push-to-cloud-config.component.html', - styleUrls: [] + selector: 'tb-action-node-push-to-cloud-config', + templateUrl: './push-to-cloud-config.component.html', + styleUrls: [], + standalone: false }) export class PushToCloudConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/push-to-edge-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/push-to-edge-config.component.ts index 59a9f539cb..5192161cc8 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/push-to-edge-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/push-to-edge-config.component.ts @@ -20,9 +20,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/m import { AttributeScope, telemetryTypeTranslations } from '@shared/models/telemetry/telemetry.models'; @Component({ - selector: 'tb-action-node-push-to-edge-config', - templateUrl: './push-to-edge-config.component.html', - styleUrls: [] + selector: 'tb-action-node-push-to-edge-config', + templateUrl: './push-to-edge-config.component.html', + styleUrls: [], + standalone: false }) export class PushToEdgeConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/rpc-reply-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/rpc-reply-config.component.ts index 016373c78b..53b1268189 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/rpc-reply-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/rpc-reply-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-action-node-rpc-reply-config', - templateUrl: './rpc-reply-config.component.html', - styleUrls: [] + selector: 'tb-action-node-rpc-reply-config', + templateUrl: './rpc-reply-config.component.html', + styleUrls: [], + standalone: false }) export class RpcReplyConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/rpc-request-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/rpc-request-config.component.ts index f1dbc1db86..546f344863 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/rpc-request-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/rpc-request-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-action-node-rpc-request-config', - templateUrl: './rpc-request-config.component.html', - styleUrls: [] + selector: 'tb-action-node-rpc-request-config', + templateUrl: './rpc-request-config.component.html', + styleUrls: [], + standalone: false }) export class RpcRequestConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/save-to-custom-table-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/save-to-custom-table-config.component.ts index 03f9dd7382..ac7cda0abc 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/save-to-custom-table-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/save-to-custom-table-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-action-node-custom-table-config', - templateUrl: './save-to-custom-table-config.component.html', - styleUrls: [] + selector: 'tb-action-node-custom-table-config', + templateUrl: './save-to-custom-table-config.component.html', + styleUrls: [], + standalone: false }) export class SaveToCustomTableConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/send-rest-api-call-reply-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/send-rest-api-call-reply-config.component.ts index 1c825aba3c..b3d2887be5 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/send-rest-api-call-reply-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/send-rest-api-call-reply-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-action-node-send-rest-api-call-reply-config', - templateUrl: './send-rest-api-call-reply-config.component.html', - styleUrls: [] + selector: 'tb-action-node-send-rest-api-call-reply-config', + templateUrl: './send-rest-api-call-reply-config.component.html', + styleUrls: [], + standalone: false }) export class SendRestApiCallReplyConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/timeseries-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/timeseries-config.component.ts index 1349eeb963..93427afeda 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/timeseries-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/timeseries-config.component.ts @@ -29,9 +29,10 @@ import { } from '@home/components/rule-node/action/timeseries-config.models'; @Component({ - selector: 'tb-action-node-timeseries-config', - templateUrl: './timeseries-config.component.html', - styleUrls: [] + selector: 'tb-action-node-timeseries-config', + templateUrl: './timeseries-config.component.html', + styleUrls: [], + standalone: false }) export class TimeseriesConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/action/unassign-customer-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/action/unassign-customer-config.component.ts index 5fe0c5c1df..ee5c1a5031 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/action/unassign-customer-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/action/unassign-customer-config.component.ts @@ -20,9 +20,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shared/models/rule-node.models'; @Component({ - selector: 'tb-action-node-un-assign-to-customer-config', - templateUrl: './unassign-customer-config.component.html', - styleUrls: [] + selector: 'tb-action-node-un-assign-to-customer-config', + templateUrl: './unassign-customer-config.component.html', + styleUrls: [], + standalone: false }) export class UnassignCustomerConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/alarm-status-select.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/alarm-status-select.component.ts index bc9de1be09..2ccceb8877 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/alarm-status-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/alarm-status-select.component.ts @@ -20,14 +20,15 @@ import { ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR } from import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-alarm-status-select', - templateUrl: './alarm-status-select.component.html', - styleUrls: ['./alarm-status-select.component.scss'], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AlarmStatusSelectComponent), - multi: true - }] + selector: 'tb-alarm-status-select', + templateUrl: './alarm-status-select.component.html', + styleUrls: ['./alarm-status-select.component.scss'], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AlarmStatusSelectComponent), + multi: true + }], + standalone: false }) export class AlarmStatusSelectComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/arguments-map-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/arguments-map-config.component.ts index 60bf03607d..dd46d40b5e 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/arguments-map-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/arguments-map-config.component.ts @@ -39,21 +39,22 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-arguments-map-config', - templateUrl: './arguments-map-config.component.html', - styleUrls: ['./arguments-map-config.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ArgumentsMapConfigComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => ArgumentsMapConfigComponent), - multi: true, - } - ] + selector: 'tb-arguments-map-config', + templateUrl: './arguments-map-config.component.html', + styleUrls: ['./arguments-map-config.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ArgumentsMapConfigComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => ArgumentsMapConfigComponent), + multi: true, + } + ], + standalone: false }) export class ArgumentsMapConfigComponent extends PageComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/credentials-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/credentials-config.component.ts index 1a8556930c..941ccb2706 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/credentials-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/credentials-config.component.ts @@ -45,21 +45,22 @@ interface CredentialsConfig { } @Component({ - selector: 'tb-credentials-config', - templateUrl: './credentials-config.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CredentialsConfigComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => CredentialsConfigComponent), - multi: true, - } - ] + selector: 'tb-credentials-config', + templateUrl: './credentials-config.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CredentialsConfigComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => CredentialsConfigComponent), + multi: true, + } + ], + standalone: false }) export class CredentialsConfigComponent extends PageComponent implements ControlValueAccessor, OnInit, Validator, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/device-relations-query-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/device-relations-query-config.component.ts index c99f9d7848..2b55bf2342 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/device-relations-query-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/device-relations-query-config.component.ts @@ -31,16 +31,17 @@ interface DeviceRelationsQuery { } @Component({ - selector: 'tb-device-relations-query-config', - templateUrl: './device-relations-query-config.component.html', - styleUrls: ['./device-relations-query-config.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceRelationsQueryConfigComponent), - multi: true - } - ] + selector: 'tb-device-relations-query-config', + templateUrl: './device-relations-query-config.component.html', + styleUrls: ['./device-relations-query-config.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceRelationsQueryConfigComponent), + multi: true + } + ], + standalone: false }) export class DeviceRelationsQueryConfigComponent extends PageComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/example-hint.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/example-hint.component.ts index c40ab0ff92..1159d1ca9b 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/example-hint.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/example-hint.component.ts @@ -17,9 +17,10 @@ import { Component, Input } from '@angular/core'; @Component({ - selector: 'tb-example-hint', - templateUrl: './example-hint.component.html', - styleUrls: [] + selector: 'tb-example-hint', + templateUrl: './example-hint.component.html', + styleUrls: [], + standalone: false }) export class ExampleHintComponent { @Input() hintText: string; diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/kv-map-config-old.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/kv-map-config-old.component.ts index 30d96016bc..33e4a203a7 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/kv-map-config-old.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/kv-map-config-old.component.ts @@ -33,21 +33,22 @@ import { TranslateService } from '@ngx-translate/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-kv-map-config-old', - templateUrl: './kv-map-config-old.component.html', - styleUrls: ['./kv-map-config-old.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => KvMapConfigOldComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => KvMapConfigOldComponent), - multi: true, - } - ] + selector: 'tb-kv-map-config-old', + templateUrl: './kv-map-config-old.component.html', + styleUrls: ['./kv-map-config-old.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => KvMapConfigOldComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => KvMapConfigOldComponent), + multi: true, + } + ], + standalone: false }) export class KvMapConfigOldComponent extends PageComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/kv-map-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/kv-map-config.component.ts index 9cfb50961f..e98f145724 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/kv-map-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/kv-map-config.component.ts @@ -34,21 +34,22 @@ import { isEqual } from '@core/public-api'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-kv-map-config', - templateUrl: './kv-map-config.component.html', - styleUrls: ['./kv-map-config.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => KvMapConfigComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => KvMapConfigComponent), - multi: true, - } - ] + selector: 'tb-kv-map-config', + templateUrl: './kv-map-config.component.html', + styleUrls: ['./kv-map-config.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => KvMapConfigComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => KvMapConfigComponent), + multi: true, + } + ], + standalone: false }) export class KvMapConfigComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/math-function-autocomplete.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/math-function-autocomplete.component.ts index 917c4c7a68..6f540b6181 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/math-function-autocomplete.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/math-function-autocomplete.component.ts @@ -23,16 +23,17 @@ import { map, tap } from 'rxjs/operators'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; @Component({ - selector: 'tb-math-function-autocomplete', - templateUrl: './math-function-autocomplete.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MathFunctionAutocompleteComponent), - multi: true - } - ] + selector: 'tb-math-function-autocomplete', + templateUrl: './math-function-autocomplete.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MathFunctionAutocompleteComponent), + multi: true + } + ], + standalone: false }) export class MathFunctionAutocompleteComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/message-types-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/message-types-config.component.ts index 6ff08c5f7e..b41af5c78b 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/message-types-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/message-types-config.component.ts @@ -26,16 +26,17 @@ import { TranslateService } from '@ngx-translate/core'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; @Component({ - selector: 'tb-message-types-config', - templateUrl: './message-types-config.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MessageTypesConfigComponent), - multi: true - } - ] + selector: 'tb-message-types-config', + templateUrl: './message-types-config.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MessageTypesConfigComponent), + multi: true + } + ], + standalone: false }) export class MessageTypesConfigComponent extends PageComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/msg-metadata-chip.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/msg-metadata-chip.component.ts index 2d31d016ac..1aca581efc 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/msg-metadata-chip.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/msg-metadata-chip.component.ts @@ -21,13 +21,14 @@ import { TranslateService } from '@ngx-translate/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-msg-metadata-chip', - templateUrl: './msg-metadata-chip.component.html', - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MsgMetadataChipComponent), - multi: true - }] + selector: 'tb-msg-metadata-chip', + templateUrl: './msg-metadata-chip.component.html', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MsgMetadataChipComponent), + multi: true + }], + standalone: false }) export class MsgMetadataChipComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/output-message-type-autocomplete.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/output-message-type-autocomplete.component.ts index cf9f54a35a..5cb9922fcb 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/output-message-type-autocomplete.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/output-message-type-autocomplete.component.ts @@ -34,21 +34,22 @@ interface MessageType { } @Component({ - selector: 'tb-output-message-type-autocomplete', - templateUrl: './output-message-type-autocomplete.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => OutputMessageTypeAutocompleteComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => OutputMessageTypeAutocompleteComponent), - multi: true - } - ] + selector: 'tb-output-message-type-autocomplete', + templateUrl: './output-message-type-autocomplete.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => OutputMessageTypeAutocompleteComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => OutputMessageTypeAutocompleteComponent), + multi: true + } + ], + standalone: false }) export class OutputMessageTypeAutocompleteComponent implements ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/relations-query-config-old.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/relations-query-config-old.component.ts index c209df227a..83ed4a435f 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/relations-query-config-old.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/relations-query-config-old.component.ts @@ -22,16 +22,17 @@ import { RelationsQuery } from '../rule-node-config.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-relations-query-config-old', - templateUrl: './relations-query-config-old.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => RelationsQueryConfigOldComponent), - multi: true - } - ] + selector: 'tb-relations-query-config-old', + templateUrl: './relations-query-config-old.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => RelationsQueryConfigOldComponent), + multi: true + } + ], + standalone: false }) export class RelationsQueryConfigOldComponent extends PageComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/relations-query-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/relations-query-config.component.ts index a06aeec2c3..cc283afe27 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/relations-query-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/relations-query-config.component.ts @@ -22,15 +22,16 @@ import { RelationsQuery } from '../rule-node-config.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-relations-query-config', - templateUrl: './relations-query-config.component.html', - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => RelationsQueryConfigComponent), - multi: true - } - ] + selector: 'tb-relations-query-config', + templateUrl: './relations-query-config.component.html', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => RelationsQueryConfigComponent), + multi: true + } + ], + standalone: false }) export class RelationsQueryConfigComponent extends PageComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/select-attributes.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/select-attributes.component.ts index 10a8658490..bc7bc01a55 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/select-attributes.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/select-attributes.component.ts @@ -31,18 +31,19 @@ import { isDefinedAndNotNull } from '@core/public-api'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-select-attributes', - templateUrl: './select-attributes.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => SelectAttributesComponent), - multi: true - }, { - provide: NG_VALIDATORS, - useExisting: SelectAttributesComponent, - multi: true - }] + selector: 'tb-select-attributes', + templateUrl: './select-attributes.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SelectAttributesComponent), + multi: true + }, { + provide: NG_VALIDATORS, + useExisting: SelectAttributesComponent, + multi: true + }], + standalone: false }) export class SelectAttributesComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/sv-map-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/sv-map-config.component.ts index 61807afa1e..558aabe9ba 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/sv-map-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/sv-map-config.component.ts @@ -36,21 +36,22 @@ import { OriginatorFieldsMappingValues, SvMapOption } from '../rule-node-config. import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-sv-map-config', - templateUrl: './sv-map-config.component.html', - styleUrls: ['./sv-map-config.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => SvMapConfigComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => SvMapConfigComponent), - multi: true, - } - ] + selector: 'tb-sv-map-config', + templateUrl: './sv-map-config.component.html', + styleUrls: ['./sv-map-config.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SvMapConfigComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => SvMapConfigComponent), + multi: true, + } + ], + standalone: false }) export class SvMapConfigComponent extends PageComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/common/time-unit-input.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/common/time-unit-input.component.ts index 484c2da12f..e863d957b6 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/common/time-unit-input.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/common/time-unit-input.component.ts @@ -38,17 +38,18 @@ interface TimeUnitInputModel { } @Component({ - selector: 'tb-time-unit-input', - templateUrl: './time-unit-input.component.html', - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeUnitInputComponent), - multi: true - },{ - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TimeUnitInputComponent), - multi: true - }] + selector: 'tb-time-unit-input', + templateUrl: './time-unit-input.component.html', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeUnitInputComponent), + multi: true + }, { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TimeUnitInputComponent), + multi: true + }], + standalone: false }) export class TimeUnitInputComponent implements ControlValueAccessor, Validator, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/empty-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/empty-config.component.ts index 06747e23cf..554fbf0c7b 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/empty-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/empty-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-node-empty-config', - template: '
', - styleUrls: [] + selector: 'tb-node-empty-config', + template: '
', + styleUrls: [], + standalone: false }) export class EmptyConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/calculate-delta-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/calculate-delta-config.component.ts index a5fdc62b1a..c7df00c008 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/calculate-delta-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/calculate-delta-config.component.ts @@ -22,8 +22,9 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/m import { deepTrim, isDefinedAndNotNull } from '@app/core/utils'; @Component({ - selector: 'tb-enrichment-node-calculate-delta-config', - templateUrl: './calculate-delta-config.component.html' + selector: 'tb-enrichment-node-calculate-delta-config', + templateUrl: './calculate-delta-config.component.html', + standalone: false }) export class CalculateDeltaConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/customer-attributes-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/customer-attributes-config.component.ts index ae8fb3b1b9..757b9d5add 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/customer-attributes-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/customer-attributes-config.component.ts @@ -22,9 +22,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shar import { DataToFetch, dataToFetchTranslations, FetchTo } from '@home/components/rule-node/rule-node-config.models'; @Component({ - selector: 'tb-enrichment-node-customer-attributes-config', - templateUrl: './customer-attributes-config.component.html', - styleUrls: ['./customer-attributes-config.component.scss'] + selector: 'tb-enrichment-node-customer-attributes-config', + templateUrl: './customer-attributes-config.component.html', + styleUrls: ['./customer-attributes-config.component.scss'], + standalone: false }) export class CustomerAttributesConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/device-attributes-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/device-attributes-config.component.ts index c05119c0f5..0520ed1d48 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/device-attributes-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/device-attributes-config.component.ts @@ -22,9 +22,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shar import { FetchTo } from '@home/components/rule-node/rule-node-config.models'; @Component({ - selector: 'tb-enrichment-node-device-attributes-config', - templateUrl: './device-attributes-config.component.html', - styleUrls: [] + selector: 'tb-enrichment-node-device-attributes-config', + templateUrl: './device-attributes-config.component.html', + styleUrls: [], + standalone: false }) export class DeviceAttributesConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/entity-details-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/entity-details-config.component.ts index 02cd9192b8..2f558dbc45 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/entity-details-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/entity-details-config.component.ts @@ -26,9 +26,10 @@ import { } from '@home/components/rule-node/rule-node-config.models'; @Component({ - selector: 'tb-enrichment-node-entity-details-config', - templateUrl: './entity-details-config.component.html', - styleUrls: [] + selector: 'tb-enrichment-node-entity-details-config', + templateUrl: './entity-details-config.component.html', + styleUrls: [], + standalone: false }) export class EntityDetailsConfigComponent extends RuleNodeConfigurationComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/fetch-device-credentials-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/fetch-device-credentials-config.component.ts index 25e6a209ed..2ca92eb72c 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/fetch-device-credentials-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/fetch-device-credentials-config.component.ts @@ -21,8 +21,9 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/m import { FetchTo } from '@home/components/rule-node/rule-node-config.models'; @Component({ - selector: 'tb-enrichment-node-fetch-device-credentials-config', - templateUrl: './fetch-device-credentials-config.component.html' + selector: 'tb-enrichment-node-fetch-device-credentials-config', + templateUrl: './fetch-device-credentials-config.component.html', + standalone: false }) export class FetchDeviceCredentialsConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/get-telemetry-from-database-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/get-telemetry-from-database-config.component.ts index 148cc1b758..cea4771021 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/get-telemetry-from-database-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/get-telemetry-from-database-config.component.ts @@ -31,9 +31,10 @@ import { } from '../rule-node-config.models'; @Component({ - selector: 'tb-enrichment-node-get-telemetry-from-database', - templateUrl: './get-telemetry-from-database-config.component.html', - styleUrls: ['./get-telemetry-from-database-config.component.scss'] + selector: 'tb-enrichment-node-get-telemetry-from-database', + templateUrl: './get-telemetry-from-database-config.component.html', + styleUrls: ['./get-telemetry-from-database-config.component.scss'], + standalone: false }) export class GetTelemetryFromDatabaseConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/originator-attributes-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/originator-attributes-config.component.ts index 2d6f5bd663..57fa20dc21 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/originator-attributes-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/originator-attributes-config.component.ts @@ -22,9 +22,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shar import { FetchTo } from '@home/components/rule-node/rule-node-config.models'; @Component({ - selector: 'tb-enrichment-node-originator-attributes-config', - templateUrl: './originator-attributes-config.component.html', - styleUrls: [] + selector: 'tb-enrichment-node-originator-attributes-config', + templateUrl: './originator-attributes-config.component.html', + styleUrls: [], + standalone: false }) export class OriginatorAttributesConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/originator-fields-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/originator-fields-config.component.ts index 9173ada5ee..102d61fddf 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/originator-fields-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/originator-fields-config.component.ts @@ -22,8 +22,9 @@ import { allowedOriginatorFields, FetchTo, SvMapOption } from '@home/components/ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shared/models/rule-node.models'; @Component({ - selector: 'tb-enrichment-node-originator-fields-config', - templateUrl: './originator-fields-config.component.html' + selector: 'tb-enrichment-node-originator-fields-config', + templateUrl: './originator-fields-config.component.html', + standalone: false }) export class OriginatorFieldsConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/related-attributes-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/related-attributes-config.component.ts index 0927645a47..f5c6acd5a4 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/related-attributes-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/related-attributes-config.component.ts @@ -30,9 +30,10 @@ import { import { entityFields } from '@shared/models/entity.models'; @Component({ - selector: 'tb-enrichment-node-related-attributes-config', - templateUrl: './related-attributes-config.component.html', - styleUrls: [] + selector: 'tb-enrichment-node-related-attributes-config', + templateUrl: './related-attributes-config.component.html', + styleUrls: [], + standalone: false }) export class RelatedAttributesConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/tenant-attributes-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/tenant-attributes-config.component.ts index 2d29081184..9635d2d45f 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/enrichment/tenant-attributes-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/enrichment/tenant-attributes-config.component.ts @@ -22,9 +22,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shar import { DataToFetch, dataToFetchTranslations, FetchTo } from '../rule-node-config.models'; @Component({ - selector: 'tb-enrichment-node-tenant-attributes-config', - templateUrl: './tenant-attributes-config.component.html', - styleUrls: ['./tenant-attributes-config.component.scss'] + selector: 'tb-enrichment-node-tenant-attributes-config', + templateUrl: './tenant-attributes-config.component.html', + styleUrls: ['./tenant-attributes-config.component.scss'], + standalone: false }) export class TenantAttributesConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/ai-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/ai-config.component.ts index de1a1085f8..c83f69ae27 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/ai-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/ai-config.component.ts @@ -28,9 +28,10 @@ import { Resource, ResourceType } from "@shared/models/resource.models"; import { ResourcesDialogComponent, ResourcesDialogData } from "@home/components/resources/resources-dialog.component"; @Component({ - selector: 'tb-external-node-ai-config', - templateUrl: './ai-config.component.html', - styleUrls: [] + selector: 'tb-external-node-ai-config', + templateUrl: './ai-config.component.html', + styleUrls: [], + standalone: false }) export class AiConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/azure-iot-hub-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/azure-iot-hub-config.component.ts index 772f411c44..ac7ecd58cb 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/azure-iot-hub-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/azure-iot-hub-config.component.ts @@ -25,9 +25,10 @@ import { import { MqttVersion } from '@shared/models/mqtt.models'; @Component({ - selector: 'tb-external-node-azure-iot-hub-config', - templateUrl: './azure-iot-hub-config.component.html', - styleUrls: ['./mqtt-config.component.scss'] + selector: 'tb-external-node-azure-iot-hub-config', + templateUrl: './azure-iot-hub-config.component.html', + styleUrls: ['./mqtt-config.component.scss'], + standalone: false }) export class AzureIotHubConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/kafka-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/kafka-config.component.ts index 41fd064314..3b8b07b108 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/kafka-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/kafka-config.component.ts @@ -23,9 +23,10 @@ import { } from '@home/components/rule-node/rule-node-config.models'; @Component({ - selector: 'tb-external-node-kafka-config', - templateUrl: './kafka-config.component.html', - styleUrls: [] + selector: 'tb-external-node-kafka-config', + templateUrl: './kafka-config.component.html', + styleUrls: [], + standalone: false }) export class KafkaConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/lambda-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/lambda-config.component.ts index eccbad5295..914ed3522c 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/lambda-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/lambda-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-external-node-lambda-config', - templateUrl: './lambda-config.component.html', - styleUrls: [] + selector: 'tb-external-node-lambda-config', + templateUrl: './lambda-config.component.html', + styleUrls: [], + standalone: false }) export class LambdaConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/mqtt-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/mqtt-config.component.ts index bf0f5d174a..1fe03704dd 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/mqtt-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/mqtt-config.component.ts @@ -20,9 +20,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-external-node-mqtt-config', - templateUrl: './mqtt-config.component.html', - styleUrls: ['./mqtt-config.component.scss'] + selector: 'tb-external-node-mqtt-config', + templateUrl: './mqtt-config.component.html', + styleUrls: ['./mqtt-config.component.scss'], + standalone: false }) export class MqttConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/notification-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/notification-config.component.ts index 6ee6c0525f..386d85ac1a 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/notification-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/notification-config.component.ts @@ -21,9 +21,10 @@ import { NotificationType } from '@shared/models/notification.models'; import { EntityType } from '@shared/models/entity-type.models'; @Component({ - selector: 'tb-external-node-notification-config', - templateUrl: './notification-config.component.html', - styleUrls: [] + selector: 'tb-external-node-notification-config', + templateUrl: './notification-config.component.html', + styleUrls: [], + standalone: false }) export class NotificationConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/pubsub-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/pubsub-config.component.ts index 652b8dca5b..4a7d9f972f 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/pubsub-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/pubsub-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-external-node-pub-sub-config', - templateUrl: './pubsub-config.component.html', - styleUrls: [] + selector: 'tb-external-node-pub-sub-config', + templateUrl: './pubsub-config.component.html', + styleUrls: [], + standalone: false }) export class PubSubConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/rabbit-mq-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/rabbit-mq-config.component.ts index d4fdc4601a..2f44901d52 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/rabbit-mq-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/rabbit-mq-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-external-node-rabbit-mq-config', - templateUrl: './rabbit-mq-config.component.html', - styleUrls: [] + selector: 'tb-external-node-rabbit-mq-config', + templateUrl: './rabbit-mq-config.component.html', + styleUrls: [], + standalone: false }) export class RabbitMqConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/rest-api-call-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/rest-api-call-config.component.ts index 3be6a6499b..4723a0c510 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/rest-api-call-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/rest-api-call-config.component.ts @@ -20,9 +20,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shar import { HttpRequestType, IntLimit } from '../rule-node-config.models'; @Component({ - selector: 'tb-external-node-rest-api-call-config', - templateUrl: './rest-api-call-config.component.html', - styleUrls: [] + selector: 'tb-external-node-rest-api-call-config', + templateUrl: './rest-api-call-config.component.html', + styleUrls: [], + standalone: false }) export class RestApiCallConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/send-email-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/send-email-config.component.ts index fd2b587446..98bbdc0ff5 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/send-email-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/send-email-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-external-node-send-email-config', - templateUrl: './send-email-config.component.html', - styleUrls: [] + selector: 'tb-external-node-send-email-config', + templateUrl: './send-email-config.component.html', + styleUrls: [], + standalone: false }) export class SendEmailConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/send-sms-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/send-sms-config.component.ts index dbf8afb6c6..38c1cee016 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/send-sms-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/send-sms-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-external-node-send-sms-config', - templateUrl: './send-sms-config.component.html', - styleUrls: [] + selector: 'tb-external-node-send-sms-config', + templateUrl: './send-sms-config.component.html', + styleUrls: [], + standalone: false }) export class SendSmsConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/slack-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/slack-config.component.ts index 3d719577a7..a0e584e672 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/slack-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/slack-config.component.ts @@ -20,9 +20,10 @@ import { RuleNodeConfiguration, SlackChanelType, SlackChanelTypesTranslateMap } import { RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-external-node-slack-config', - templateUrl: './slack-config.component.html', - styleUrls: ['./slack-config.component.scss'] + selector: 'tb-external-node-slack-config', + templateUrl: './slack-config.component.html', + styleUrls: ['./slack-config.component.scss'], + standalone: false }) export class SlackConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/sns-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/sns-config.component.ts index 352fda3d70..cc9f18c181 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/sns-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/sns-config.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-external-node-sns-config', - templateUrl: './sns-config.component.html', - styleUrls: [] + selector: 'tb-external-node-sns-config', + templateUrl: './sns-config.component.html', + styleUrls: [], + standalone: false }) export class SnsConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/sqs-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/sqs-config.component.ts index 7170db813e..ee6cfac5da 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/sqs-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/sqs-config.component.ts @@ -20,9 +20,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shar import { SqsQueueType, sqsQueueTypeTranslations } from '@home/components/rule-node/rule-node-config.models'; @Component({ - selector: 'tb-external-node-sqs-config', - templateUrl: './sqs-config.component.html', - styleUrls: [] + selector: 'tb-external-node-sqs-config', + templateUrl: './sqs-config.component.html', + styleUrls: [], + standalone: false }) export class SqsConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/filter/check-alarm-status.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/filter/check-alarm-status.component.ts index 082b6c0585..b64f9374fc 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/filter/check-alarm-status.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/filter/check-alarm-status.component.ts @@ -20,9 +20,10 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shared/models/rule-node.models'; @Component({ - selector: 'tb-filter-node-check-alarm-status-config', - templateUrl: './check-alarm-status.component.html', - styleUrls: [] + selector: 'tb-filter-node-check-alarm-status-config', + templateUrl: './check-alarm-status.component.html', + styleUrls: [], + standalone: false }) export class CheckAlarmStatusComponent extends RuleNodeConfigurationComponent { alarmStatusConfigForm: FormGroup; diff --git a/ui-ngx/src/app/modules/home/components/rule-node/filter/check-message-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/filter/check-message-config.component.ts index 8bad5ac4ca..9f44bf83c1 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/filter/check-message-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/filter/check-message-config.component.ts @@ -20,9 +20,10 @@ import { FormBuilder, FormGroup, ValidationErrors, ValidatorFn, Validators } fro import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shared/models/rule-node.models'; @Component({ - selector: 'tb-filter-node-check-message-config', - templateUrl: './check-message-config.component.html', - styleUrls: [] + selector: 'tb-filter-node-check-message-config', + templateUrl: './check-message-config.component.html', + styleUrls: [], + standalone: false }) export class CheckMessageConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/filter/check-relation-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/filter/check-relation-config.component.ts index 09196196bf..a4678eef0e 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/filter/check-relation-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/filter/check-relation-config.component.ts @@ -21,9 +21,10 @@ import { EntitySearchDirection, entitySearchDirectionTranslations } from '@app/s import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shared/models/rule-node.models'; @Component({ - selector: 'tb-filter-node-check-relation-config', - templateUrl: './check-relation-config.component.html', - styleUrls: ['./check-relation-config.component.scss'] + selector: 'tb-filter-node-check-relation-config', + templateUrl: './check-relation-config.component.html', + styleUrls: ['./check-relation-config.component.scss'], + standalone: false }) export class CheckRelationConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/filter/gps-geo-filter-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/filter/gps-geo-filter-config.component.ts index e92af96ee6..17aaf675f3 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/filter/gps-geo-filter-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/filter/gps-geo-filter-config.component.ts @@ -21,9 +21,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shar import { PerimeterType, perimeterTypeTranslations, RangeUnit, rangeUnitTranslations } from '../rule-node-config.models'; @Component({ - selector: 'tb-filter-node-gps-geofencing-config', - templateUrl: './gps-geo-filter-config.component.html', - styleUrls: ['./gps-geo-filter-config.component.scss'] + selector: 'tb-filter-node-gps-geofencing-config', + templateUrl: './gps-geo-filter-config.component.html', + styleUrls: ['./gps-geo-filter-config.component.scss'], + standalone: false }) export class GpsGeoFilterConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/filter/message-type-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/filter/message-type-config.component.ts index 9145719950..34596c141c 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/filter/message-type-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/filter/message-type-config.component.ts @@ -20,9 +20,10 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-filter-node-message-type-config', - templateUrl: './message-type-config.component.html', - styleUrls: [] + selector: 'tb-filter-node-message-type-config', + templateUrl: './message-type-config.component.html', + styleUrls: [], + standalone: false }) export class MessageTypeConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/filter/originator-type-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/filter/originator-type-config.component.ts index d72cc3231f..66d381075b 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/filter/originator-type-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/filter/originator-type-config.component.ts @@ -21,9 +21,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shar import { EntityType } from '@app/shared/models/entity-type.models'; @Component({ - selector: 'tb-filter-node-originator-type-config', - templateUrl: './originator-type-config.component.html', - styleUrls: [] + selector: 'tb-filter-node-originator-type-config', + templateUrl: './originator-type-config.component.html', + styleUrls: [], + standalone: false }) export class OriginatorTypeConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/filter/script-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/filter/script-config.component.ts index 9bbc9601e7..9d1a7d511f 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/filter/script-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/filter/script-config.component.ts @@ -24,9 +24,10 @@ import type { JsFuncComponent } from '@app/shared/components/js-func.component'; import { DebugRuleNodeEventBody } from '@app/shared/models/event.models'; @Component({ - selector: 'tb-filter-node-script-config', - templateUrl: './script-config.component.html', - styleUrls: [] + selector: 'tb-filter-node-script-config', + templateUrl: './script-config.component.html', + styleUrls: [], + standalone: false }) export class ScriptConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/filter/switch-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/filter/switch-config.component.ts index 26e6d0a21e..8a00fe94e8 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/filter/switch-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/filter/switch-config.component.ts @@ -27,9 +27,10 @@ import type { JsFuncComponent } from '@app/shared/components/js-func.component'; import { DebugRuleNodeEventBody } from '@shared/models/event.models'; @Component({ - selector: 'tb-filter-node-switch-config', - templateUrl: './switch-config.component.html', - styleUrls: [] + selector: 'tb-filter-node-switch-config', + templateUrl: './switch-config.component.html', + styleUrls: [], + standalone: false }) export class SwitchConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/flow/rule-chain-input.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/flow/rule-chain-input.component.ts index 87cf38bd7c..0403a37563 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/flow/rule-chain-input.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/flow/rule-chain-input.component.ts @@ -20,9 +20,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/m import { EntityType } from '@shared/models/entity-type.models'; @Component({ - selector: 'tb-flow-node-rule-chain-input-config', - templateUrl: './rule-chain-input.component.html', - styleUrls: [] + selector: 'tb-flow-node-rule-chain-input-config', + templateUrl: './rule-chain-input.component.html', + styleUrls: [], + standalone: false }) export class RuleChainInputComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/flow/rule-chain-output.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/flow/rule-chain-output.component.ts index f4b2760f04..0505a2be7f 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/flow/rule-chain-output.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/flow/rule-chain-output.component.ts @@ -19,9 +19,10 @@ import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-flow-node-rule-chain-output-config', - templateUrl: './rule-chain-output.component.html', - styleUrls: [] + selector: 'tb-flow-node-rule-chain-output-config', + templateUrl: './rule-chain-output.component.html', + styleUrls: [], + standalone: false }) export class RuleChainOutputComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/transformation/change-originator-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/transformation/change-originator-config.component.ts index b5c63de344..3aeb18a453 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/transformation/change-originator-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/transformation/change-originator-config.component.ts @@ -25,8 +25,9 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shar import { EntityType } from '@app/shared/models/entity-type.models'; @Component({ - selector: 'tb-transformation-node-change-originator-config', - templateUrl: './change-originator-config.component.html' + selector: 'tb-transformation-node-change-originator-config', + templateUrl: './change-originator-config.component.html', + standalone: false }) export class ChangeOriginatorConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/transformation/copy-keys-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/transformation/copy-keys-config.component.ts index 2f4bd029dc..e059a7de97 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/transformation/copy-keys-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/transformation/copy-keys-config.component.ts @@ -22,9 +22,10 @@ import { FetchFromToTranslation, FetchTo } from '../rule-node-config.models'; import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shared/models/rule-node.models'; @Component({ - selector: 'tb-transformation-node-copy-keys-config', - templateUrl: './copy-keys-config.component.html', - styleUrls: [] + selector: 'tb-transformation-node-copy-keys-config', + templateUrl: './copy-keys-config.component.html', + styleUrls: [], + standalone: false }) export class CopyKeysConfigComponent extends RuleNodeConfigurationComponent{ diff --git a/ui-ngx/src/app/modules/home/components/rule-node/transformation/deduplication-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/transformation/deduplication-config.component.ts index 4661084ef3..77c95515d3 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/transformation/deduplication-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/transformation/deduplication-config.component.ts @@ -21,9 +21,10 @@ import { deduplicationStrategiesTranslations, FetchMode } from '@home/components import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-transformation-node-deduplication-config', - templateUrl: './deduplication-config.component.html', - styleUrls: [] + selector: 'tb-transformation-node-deduplication-config', + templateUrl: './deduplication-config.component.html', + styleUrls: [], + standalone: false }) export class DeduplicationConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/transformation/delete-keys-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/transformation/delete-keys-config.component.ts index bac37fb4f5..6d04408b75 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/transformation/delete-keys-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/transformation/delete-keys-config.component.ts @@ -22,9 +22,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shar import { FetchTo, FetchToTranslation } from '@home/components/rule-node/rule-node-config.models'; @Component({ - selector: 'tb-transformation-node-delete-keys-config', - templateUrl: './delete-keys-config.component.html', - styleUrls: [] + selector: 'tb-transformation-node-delete-keys-config', + templateUrl: './delete-keys-config.component.html', + styleUrls: [], + standalone: false }) export class DeleteKeysConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/transformation/node-json-path-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/transformation/node-json-path-config.component.ts index e6e5d65d85..27719ccbb9 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/transformation/node-json-path-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/transformation/node-json-path-config.component.ts @@ -19,9 +19,10 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/models/rule-node.models'; @Component({ - selector: 'tb-transformation-node-json-path-config', - templateUrl: './node-json-path-config.component.html', - styleUrls: [] + selector: 'tb-transformation-node-json-path-config', + templateUrl: './node-json-path-config.component.html', + styleUrls: [], + standalone: false }) export class NodeJsonPathConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/transformation/rename-keys-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/transformation/rename-keys-config.component.ts index c99e6029a5..fc6a677878 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/transformation/rename-keys-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/transformation/rename-keys-config.component.ts @@ -23,9 +23,10 @@ import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@shared/m @Component({ - selector: 'tb-transformation-node-rename-keys-config', - templateUrl: './rename-keys-config.component.html', - styleUrls: ['./rename-keys-config.component.scss'] + selector: 'tb-transformation-node-rename-keys-config', + templateUrl: './rename-keys-config.component.html', + styleUrls: ['./rename-keys-config.component.scss'], + standalone: false }) export class RenameKeysConfigComponent extends RuleNodeConfigurationComponent { renameKeysConfigForm: FormGroup; diff --git a/ui-ngx/src/app/modules/home/components/rule-node/transformation/script-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/transformation/script-config.component.ts index 021bb21cb1..2007e06180 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/transformation/script-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/transformation/script-config.component.ts @@ -27,9 +27,10 @@ import { import { DebugRuleNodeEventBody } from '@shared/models/event.models'; @Component({ - selector: 'tb-transformation-node-script-config', - templateUrl: './script-config.component.html', - styleUrls: [] + selector: 'tb-transformation-node-script-config', + templateUrl: './script-config.component.html', + styleUrls: [], + standalone: false }) export class TransformScriptConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/rule-node/transformation/to-email-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/transformation/to-email-config.component.ts index e2c7117ae0..21a1748085 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/transformation/to-email-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/transformation/to-email-config.component.ts @@ -20,9 +20,10 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { RuleNodeConfiguration, RuleNodeConfigurationComponent } from '@app/shared/models/rule-node.models'; @Component({ - selector: 'tb-transformation-node-to-email-config', - templateUrl: './to-email-config.component.html', - styleUrls: ['./to-email-config.component.scss'] + selector: 'tb-transformation-node-to-email-config', + templateUrl: './to-email-config.component.html', + styleUrls: ['./to-email-config.component.scss'], + standalone: false }) export class ToEmailConfigComponent extends RuleNodeConfigurationComponent { diff --git a/ui-ngx/src/app/modules/home/components/sms/aws-sns-provider-configuration.component.ts b/ui-ngx/src/app/modules/home/components/sms/aws-sns-provider-configuration.component.ts index 772ae7366a..d864c3ccfd 100644 --- a/ui-ngx/src/app/modules/home/components/sms/aws-sns-provider-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/sms/aws-sns-provider-configuration.component.ts @@ -28,14 +28,15 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-aws-sns-provider-configuration', - templateUrl: './aws-sns-provider-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AwsSnsProviderConfigurationComponent), - multi: true - }] + selector: 'tb-aws-sns-provider-configuration', + templateUrl: './aws-sns-provider-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AwsSnsProviderConfigurationComponent), + multi: true + }], + standalone: false }) export class AwsSnsProviderConfigurationComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/sms/smpp-sms-provider-configuration.component.ts b/ui-ngx/src/app/modules/home/components/sms/smpp-sms-provider-configuration.component.ts index 04ea006af4..35111be91b 100644 --- a/ui-ngx/src/app/modules/home/components/sms/smpp-sms-provider-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/sms/smpp-sms-provider-configuration.component.ts @@ -36,14 +36,15 @@ import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-smpp-sms-provider-configuration', - templateUrl: './smpp-sms-provider-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => SmppSmsProviderConfigurationComponent), - multi: true - }] + selector: 'tb-smpp-sms-provider-configuration', + templateUrl: './smpp-sms-provider-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SmppSmsProviderConfigurationComponent), + multi: true + }], + standalone: false }) export class SmppSmsProviderConfigurationComponent implements ControlValueAccessor, OnInit{ diff --git a/ui-ngx/src/app/modules/home/components/sms/sms-provider-configuration.component.ts b/ui-ngx/src/app/modules/home/components/sms/sms-provider-configuration.component.ts index 807b39f93f..adb477d8fb 100644 --- a/ui-ngx/src/app/modules/home/components/sms/sms-provider-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/sms/sms-provider-configuration.component.ts @@ -34,14 +34,15 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-sms-provider-configuration', - templateUrl: './sms-provider-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => SmsProviderConfigurationComponent), - multi: true - }] + selector: 'tb-sms-provider-configuration', + templateUrl: './sms-provider-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SmsProviderConfigurationComponent), + multi: true + }], + standalone: false }) export class SmsProviderConfigurationComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/sms/twilio-sms-provider-configuration.component.ts b/ui-ngx/src/app/modules/home/components/sms/twilio-sms-provider-configuration.component.ts index 550a2d8112..1041672c50 100644 --- a/ui-ngx/src/app/modules/home/components/sms/twilio-sms-provider-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/sms/twilio-sms-provider-configuration.component.ts @@ -29,14 +29,15 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-twilio-sms-provider-configuration', - templateUrl: './twilio-sms-provider-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TwilioSmsProviderConfigurationComponent), - multi: true - }] + selector: 'tb-twilio-sms-provider-configuration', + templateUrl: './twilio-sms-provider-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TwilioSmsProviderConfigurationComponent), + multi: true + }], + standalone: false }) export class TwilioSmsProviderConfigurationComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/vc/auto-commit-settings.component.ts b/ui-ngx/src/app/modules/home/components/vc/auto-commit-settings.component.ts index 2f07e2b55c..a2a87edde0 100644 --- a/ui-ngx/src/app/modules/home/components/vc/auto-commit-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/auto-commit-settings.component.ts @@ -34,9 +34,10 @@ import { EntityType, entityTypeTranslations } from '@shared/models/entity-type.m import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; @Component({ - selector: 'tb-auto-commit-settings', - templateUrl: './auto-commit-settings.component.html', - styleUrls: ['./auto-commit-settings.component.scss', './../../pages/admin/settings-card.scss'] + selector: 'tb-auto-commit-settings', + templateUrl: './auto-commit-settings.component.html', + styleUrls: ['./auto-commit-settings.component.scss', './../../pages/admin/settings-card.scss'], + standalone: false }) export class AutoCommitSettingsComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/vc/complex-version-create.component.ts b/ui-ngx/src/app/modules/home/components/vc/complex-version-create.component.ts index 21ac0825c9..af80a5be3a 100644 --- a/ui-ngx/src/app/modules/home/components/vc/complex-version-create.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/complex-version-create.component.ts @@ -37,9 +37,10 @@ import { share } from 'rxjs/operators'; import { parseHttpErrorMessage } from '@core/utils'; @Component({ - selector: 'tb-complex-version-create', - templateUrl: './complex-version-create.component.html', - styleUrls: ['./version-control.scss'] + selector: 'tb-complex-version-create', + templateUrl: './complex-version-create.component.html', + styleUrls: ['./version-control.scss'], + standalone: false }) export class ComplexVersionCreateComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/vc/complex-version-load.component.ts b/ui-ngx/src/app/modules/home/components/vc/complex-version-load.component.ts index 4bf029404b..8eab024032 100644 --- a/ui-ngx/src/app/modules/home/components/vc/complex-version-load.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/complex-version-load.component.ts @@ -35,9 +35,10 @@ import { share } from 'rxjs/operators'; import { parseHttpErrorMessage } from '@core/utils'; @Component({ - selector: 'tb-complex-version-load', - templateUrl: './complex-version-load.component.html', - styleUrls: ['./version-control.scss'] + selector: 'tb-complex-version-load', + templateUrl: './complex-version-load.component.html', + styleUrls: ['./version-control.scss'], + standalone: false }) export class ComplexVersionLoadComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/vc/entity-types-version-create.component.ts b/ui-ngx/src/app/modules/home/components/vc/entity-types-version-create.component.ts index bc5b2c8883..45712eab00 100644 --- a/ui-ngx/src/app/modules/home/components/vc/entity-types-version-create.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/entity-types-version-create.component.ts @@ -44,21 +44,22 @@ import { isDefinedAndNotNull } from '@core/utils'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-entity-types-version-create', - templateUrl: './entity-types-version-create.component.html', - styleUrls: ['./entity-types-version.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => EntityTypesVersionCreateComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => EntityTypesVersionCreateComponent), - multi: true - } - ] + selector: 'tb-entity-types-version-create', + templateUrl: './entity-types-version-create.component.html', + styleUrls: ['./entity-types-version.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => EntityTypesVersionCreateComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => EntityTypesVersionCreateComponent), + multi: true + } + ], + standalone: false }) export class EntityTypesVersionCreateComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/vc/entity-types-version-load.component.ts b/ui-ngx/src/app/modules/home/components/vc/entity-types-version-load.component.ts index 254a178091..bdcad871de 100644 --- a/ui-ngx/src/app/modules/home/components/vc/entity-types-version-load.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/entity-types-version-load.component.ts @@ -44,21 +44,22 @@ import { RemoveOtherEntitiesConfirmComponent } from '@home/components/vc/remove- import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-entity-types-version-load', - templateUrl: './entity-types-version-load.component.html', - styleUrls: ['./entity-types-version.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => EntityTypesVersionLoadComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => EntityTypesVersionLoadComponent), - multi: true - } - ] + selector: 'tb-entity-types-version-load', + templateUrl: './entity-types-version-load.component.html', + styleUrls: ['./entity-types-version.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => EntityTypesVersionLoadComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => EntityTypesVersionLoadComponent), + multi: true + } + ], + standalone: false }) export class EntityTypesVersionLoadComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/vc/entity-version-create.component.ts b/ui-ngx/src/app/modules/home/components/vc/entity-version-create.component.ts index b01134f85c..7dfafba9a2 100644 --- a/ui-ngx/src/app/modules/home/components/vc/entity-version-create.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/entity-version-create.component.ts @@ -36,9 +36,10 @@ import { share } from 'rxjs/operators'; import { parseHttpErrorMessage } from '@core/utils'; @Component({ - selector: 'tb-entity-version-create', - templateUrl: './entity-version-create.component.html', - styleUrls: ['./version-control.scss'] + selector: 'tb-entity-version-create', + templateUrl: './entity-version-create.component.html', + styleUrls: ['./version-control.scss'], + standalone: false }) export class EntityVersionCreateComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/vc/entity-version-diff.component.ts b/ui-ngx/src/app/modules/home/components/vc/entity-version-diff.component.ts index 84480efb35..d7a6cd8003 100644 --- a/ui-ngx/src/app/modules/home/components/vc/entity-version-diff.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/entity-version-diff.component.ts @@ -49,10 +49,11 @@ interface DiffInfo { } @Component({ - selector: 'tb-entity-version-diff', - templateUrl: './entity-version-diff.component.html', - styleUrls: ['./entity-version-diff.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-entity-version-diff', + templateUrl: './entity-version-diff.component.html', + styleUrls: ['./entity-version-diff.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class EntityVersionDiffComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.ts b/ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.ts index 89915593a8..7b1eaf1621 100644 --- a/ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.ts @@ -35,9 +35,10 @@ import { Observable, Subscription } from 'rxjs'; import { parseHttpErrorMessage } from '@core/utils'; @Component({ - selector: 'tb-entity-version-restore', - templateUrl: './entity-version-restore.component.html', - styleUrls: ['./version-control.scss'] + selector: 'tb-entity-version-restore', + templateUrl: './entity-version-restore.component.html', + styleUrls: ['./version-control.scss'], + standalone: false }) export class EntityVersionRestoreComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/vc/entity-versions-table.component.ts b/ui-ngx/src/app/modules/home/components/vc/entity-versions-table.component.ts index 96f28e2b4a..c50b7d6c36 100644 --- a/ui-ngx/src/app/modules/home/components/vc/entity-versions-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/entity-versions-table.component.ts @@ -57,9 +57,10 @@ import { AdminService } from '@core/http/admin.service'; import { FormBuilder } from '@angular/forms'; @Component({ - selector: 'tb-entity-versions-table', - templateUrl: './entity-versions-table.component.html', - styleUrls: ['./entity-versions-table.component.scss'] + selector: 'tb-entity-versions-table', + templateUrl: './entity-versions-table.component.html', + styleUrls: ['./entity-versions-table.component.scss'], + standalone: false }) export class EntityVersionsTableComponent extends PageComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/vc/remove-other-entities-confirm.component.ts b/ui-ngx/src/app/modules/home/components/vc/remove-other-entities-confirm.component.ts index b5590cd841..dd9baf20e4 100644 --- a/ui-ngx/src/app/modules/home/components/vc/remove-other-entities-confirm.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/remove-other-entities-confirm.component.ts @@ -23,9 +23,10 @@ import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; @Component({ - selector: 'tb-remove-other-entities-confirm', - templateUrl: './remove-other-entities-confirm.component.html', - styleUrls: [] + selector: 'tb-remove-other-entities-confirm', + templateUrl: './remove-other-entities-confirm.component.html', + styleUrls: [], + standalone: false }) export class RemoveOtherEntitiesConfirmComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/vc/repository-settings.component.ts b/ui-ngx/src/app/modules/home/components/vc/repository-settings.component.ts index f4959fa761..88ffbd9171 100644 --- a/ui-ngx/src/app/modules/home/components/vc/repository-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/repository-settings.component.ts @@ -38,9 +38,10 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-repository-settings', - templateUrl: './repository-settings.component.html', - styleUrls: ['./repository-settings.component.scss', './../../pages/admin/settings-card.scss'] + selector: 'tb-repository-settings', + templateUrl: './repository-settings.component.html', + styleUrls: ['./repository-settings.component.scss', './../../pages/admin/settings-card.scss'], + standalone: false }) export class RepositorySettingsComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/vc/version-control.component.ts b/ui-ngx/src/app/modules/home/components/vc/version-control.component.ts index 4a2c944e2c..f3f4863653 100644 --- a/ui-ngx/src/app/modules/home/components/vc/version-control.component.ts +++ b/ui-ngx/src/app/modules/home/components/vc/version-control.component.ts @@ -26,9 +26,10 @@ import { Observable } from 'rxjs'; import { TbPopoverComponent } from '@shared/components/popover.component'; @Component({ - selector: 'tb-version-control', - templateUrl: './version-control.component.html', - styleUrls: ['./version-control.component.scss'] + selector: 'tb-version-control', + templateUrl: './version-control.component.html', + styleUrls: ['./version-control.component.scss'], + standalone: false }) export class VersionControlComponent implements OnInit, HasConfirmForm { diff --git a/ui-ngx/src/app/modules/home/components/widget/action/manage-widget-actions-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/action/manage-widget-actions-dialog.component.ts index 367f9c8a6e..8c2def215e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/action/manage-widget-actions-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/action/manage-widget-actions-dialog.component.ts @@ -37,10 +37,11 @@ export interface ManageWidgetActionsDialogData { } @Component({ - selector: 'tb-manage-widget-actions-dialog', - templateUrl: './manage-widget-actions-dialog.component.html', - providers: [], - styleUrls: [] + selector: 'tb-manage-widget-actions-dialog', + templateUrl: './manage-widget-actions-dialog.component.html', + providers: [], + styleUrls: [], + standalone: false }) export class ManageWidgetActionsDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/action/manage-widget-actions.component.ts b/ui-ngx/src/app/modules/home/components/widget/action/manage-widget-actions.component.ts index 8779085003..2da5066816 100644 --- a/ui-ngx/src/app/modules/home/components/widget/action/manage-widget-actions.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/action/manage-widget-actions.component.ts @@ -57,16 +57,17 @@ import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { DomSanitizer } from '@angular/platform-browser'; @Component({ - selector: 'tb-manage-widget-actions', - templateUrl: './manage-widget-actions.component.html', - styleUrls: ['./manage-widget-actions.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ManageWidgetActionsComponent), - multi: true - } - ] + selector: 'tb-manage-widget-actions', + templateUrl: './manage-widget-actions.component.html', + styleUrls: ['./manage-widget-actions.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ManageWidgetActionsComponent), + multi: true + } + ], + standalone: false }) export class ManageWidgetActionsComponent extends PageComponent implements OnInit, AfterViewInit, OnDestroy, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/action/widget-action-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/action/widget-action-dialog.component.ts index 5549531100..b652f76e06 100644 --- a/ui-ngx/src/app/modules/home/components/widget/action/widget-action-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/action/widget-action-dialog.component.ts @@ -66,10 +66,11 @@ export interface WidgetActionDialogData { } @Component({ - selector: 'tb-widget-action-dialog', - templateUrl: './widget-action-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: WidgetActionDialogComponent}], - styleUrls: [] + selector: 'tb-widget-action-dialog', + templateUrl: './widget-action-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: WidgetActionDialogComponent }], + styleUrls: [], + standalone: false }) export class WidgetActionDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/alarm/alarm-count-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/alarm/alarm-count-basic-config.component.ts index 73edce98ee..6d049826d7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/alarm/alarm-count-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/alarm/alarm-count-basic-config.component.ts @@ -33,9 +33,10 @@ import { } from '@home/components/widget/lib/count/count-widget.models'; @Component({ - selector: 'tb-alarm-count-basic-config', - templateUrl: './alarm-count-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-alarm-count-basic-config', + templateUrl: './alarm-count-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class AlarmCountBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/alarm/alarms-table-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/alarm/alarms-table-basic-config.component.ts index a2f25da117..802c1bb0bc 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/alarm/alarms-table-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/alarm/alarms-table-basic-config.component.ts @@ -29,9 +29,10 @@ import { } from '@home/components/widget/config/timewindow-config-panel.component'; @Component({ - selector: 'tb-alarms-table-basic-config', - templateUrl: './alarms-table-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-alarms-table-basic-config', + templateUrl: './alarms-table-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class AlarmsTableBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/action-button-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/action-button-basic-config.component.ts index b7edac8efb..93b9d03d73 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/action-button-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/action-button-basic-config.component.ts @@ -38,9 +38,10 @@ import { } from '@home/components/widget/lib/button/action-button-widget.models'; @Component({ - selector: 'tb-action-button-basic-config', - templateUrl: './action-button-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-action-button-basic-config', + templateUrl: './action-button-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class ActionButtonBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/command-button-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/command-button-basic-config.component.ts index ab5ef0df91..b909cd0e57 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/command-button-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/command-button-basic-config.component.ts @@ -29,9 +29,10 @@ import { } from '@home/components/widget/lib/button/command-button-widget.models'; @Component({ - selector: 'tb-command-button-basic-config', - templateUrl: './command-button-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-command-button-basic-config', + templateUrl: './command-button-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class CommandButtonBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/power-button-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/power-button-basic-config.component.ts index a1c0549931..ce40d50626 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/power-button-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/power-button-basic-config.component.ts @@ -34,9 +34,10 @@ import { import { cssSizeToStrSize, resolveCssSize } from '@shared/models/widget-settings.models'; @Component({ - selector: 'tb-power-button-basic-config', - templateUrl: './power-button-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-power-button-basic-config', + templateUrl: './power-button-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class PowerButtonBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/segmented-button-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/segmented-button-basic-config.component.ts index 12542ac5be..296959a4b4 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/segmented-button-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/segmented-button-basic-config.component.ts @@ -38,9 +38,10 @@ import { } from '@home/components/widget/lib/button/segmented-button-widget.models'; @Component({ - selector: 'tb-segmented-button-basic-config', - templateUrl: './segmented-button-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-segmented-button-basic-config', + templateUrl: './segmented-button-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class SegmentedButtonBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/toggle-button-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/toggle-button-basic-config.component.ts index 7a487664c7..7641946666 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/button/toggle-button-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/button/toggle-button-basic-config.component.ts @@ -33,9 +33,10 @@ import { type ButtonAppearanceType = 'checked' | 'unchecked'; @Component({ - selector: 'tb-toggle-button-basic-config', - templateUrl: './toggle-button-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-toggle-button-basic-config', + templateUrl: './toggle-button-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class ToggleButtonBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-data-key-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-data-key-row.component.ts index aba164f60e..8751ced932 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-data-key-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-data-key-row.component.ts @@ -56,17 +56,18 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { getSourceTbUnitSymbol, TbUnit } from '@shared/models/unit.models'; @Component({ - selector: 'tb-aggregated-data-key-row', - templateUrl: './aggregated-data-key-row.component.html', - styleUrls: ['./aggregated-data-key-row.component.scss', '../../../lib/settings/common/key/data-keys.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AggregatedDataKeyRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-aggregated-data-key-row', + templateUrl: './aggregated-data-key-row.component.html', + styleUrls: ['./aggregated-data-key-row.component.scss', '../../../lib/settings/common/key/data-keys.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AggregatedDataKeyRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class AggregatedDataKeyRowComponent implements ControlValueAccessor, OnInit, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-data-keys-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-data-keys-panel.component.ts index 2931c6eeee..d2cba50bb8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-data-keys-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-data-keys-panel.component.ts @@ -40,17 +40,18 @@ import { aggregatedValueCardDefaultKeySettings } from '@home/components/widget/l import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-aggregated-data-keys-panel', - templateUrl: './aggregated-data-keys-panel.component.html', - styleUrls: ['./aggregated-data-keys-panel.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AggregatedDataKeysPanelComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-aggregated-data-keys-panel', + templateUrl: './aggregated-data-keys-panel.component.html', + styleUrls: ['./aggregated-data-keys-panel.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AggregatedDataKeysPanelComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class AggregatedDataKeysPanelComponent implements ControlValueAccessor, OnInit, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-value-card-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-value-card-basic-config.component.ts index e31ea66342..4be3bc7eae 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-value-card-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-value-card-basic-config.component.ts @@ -52,9 +52,10 @@ import { } from '@shared/models/time/time.models'; @Component({ - selector: 'tb-aggregated-value-card-basic-config', - templateUrl: './aggregated-value-card-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-aggregated-value-card-basic-config', + templateUrl: './aggregated-value-card-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class AggregatedValueCardBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/label-card-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/label-card-basic-config.component.ts index 7c782da2be..59a8f07307 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/label-card-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/label-card-basic-config.component.ts @@ -29,9 +29,10 @@ import { } from '@home/components/widget/lib/cards/label-card-widget.models'; @Component({ - selector: 'tb-label-card-basic-config', - templateUrl: './label-card-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-label-card-basic-config', + templateUrl: './label-card-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class LabelCardBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/label-value-card-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/label-value-card-basic-config.component.ts index 5fdc60083d..d57add2d5b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/label-value-card-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/label-value-card-basic-config.component.ts @@ -40,9 +40,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-label-value-card-basic-config', - templateUrl: './label-value-card-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-label-value-card-basic-config', + templateUrl: './label-value-card-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class LabelValueCardBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/mobile-app-qr-code-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/mobile-app-qr-code-basic-config.component.ts index cb7331721d..6aa3f4196a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/mobile-app-qr-code-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/mobile-app-qr-code-basic-config.component.ts @@ -31,9 +31,10 @@ import { import { badgePositionTranslationsMap } from '@app/shared/models/mobile-app.models'; @Component({ - selector: 'tb-mobile-app-qr-code-basic-config', - templateUrl: './mobile-app-qr-code-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-mobile-app-qr-code-basic-config', + templateUrl: './mobile-app-qr-code-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class MobileAppQrCodeBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/progress-bar-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/progress-bar-basic-config.component.ts index f822801058..426c3ee8f7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/progress-bar-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/progress-bar-basic-config.component.ts @@ -45,9 +45,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-progress-bar-basic-config', - templateUrl: './progress-bar-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-progress-bar-basic-config', + templateUrl: './progress-bar-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class ProgressBarBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/simple-card-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/simple-card-basic-config.component.ts index de7d66d9d9..104787dd0f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/simple-card-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/simple-card-basic-config.component.ts @@ -36,9 +36,10 @@ import { isUndefined } from '@core/utils'; import { getLabel, setLabel } from '@shared/models/widget-settings.models'; @Component({ - selector: 'tb-simple-card-basic-config', - templateUrl: './simple-card-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-simple-card-basic-config', + templateUrl: './simple-card-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class SimpleCardBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/timeseries-table-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/timeseries-table-basic-config.component.ts index 8acd390b42..01eb67c638 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/timeseries-table-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/timeseries-table-basic-config.component.ts @@ -30,9 +30,10 @@ import { } from '@home/components/widget/config/timewindow-config-panel.component'; @Component({ - selector: 'tb-timeseries-table-basic-config', - templateUrl: './timeseries-table-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-timeseries-table-basic-config', + templateUrl: './timeseries-table-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class TimeseriesTableBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/unread-notification-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/unread-notification-basic-config.component.ts index 7b6347c9a5..a75a84fcca 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/unread-notification-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/unread-notification-basic-config.component.ts @@ -30,9 +30,10 @@ import { } from '@home/components/widget/lib/cards/unread-notification-widget.models'; @Component({ - selector: 'tb-unread-notification-basic-config', - templateUrl: './unread-notification-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-unread-notification-basic-config', + templateUrl: './unread-notification-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class UnreadNotificationBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/value-card-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/value-card-basic-config.component.ts index 975f8a9655..04905fd657 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/value-card-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/value-card-basic-config.component.ts @@ -45,9 +45,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-value-card-basic-config', - templateUrl: './value-card-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-value-card-basic-config', + templateUrl: './value-card-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class ValueCardBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/value-chart-card-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/value-chart-card-basic-config.component.ts index ecf0e8b24e..8d572888c9 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/value-chart-card-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/value-chart-card-basic-config.component.ts @@ -39,9 +39,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-value-chart-card-basic-config', - templateUrl: './value-chart-card-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-value-chart-card-basic-config', + templateUrl: './value-chart-card-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class ValueChartCardBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/bar-chart-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/bar-chart-basic-config.component.ts index db6afe3404..6a940a7a75 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/bar-chart-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/bar-chart-basic-config.component.ts @@ -31,9 +31,10 @@ import { } from '@home/components/widget/config/basic/chart/latest-chart-basic-config.component'; @Component({ - selector: 'tb-bar-chart-basic-config', - templateUrl: './latest-chart-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-bar-chart-basic-config', + templateUrl: './latest-chart-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class BarChartBasicConfigComponent extends LatestChartBasicConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/bar-chart-with-labels-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/bar-chart-with-labels-basic-config.component.ts index d7603fe76f..07cd236fb5 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/bar-chart-with-labels-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/bar-chart-with-labels-basic-config.component.ts @@ -48,9 +48,10 @@ import { TimeSeriesChartType } from '@home/components/widget/lib/chart/time-seri import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-bar-chart-with-labels-basic-config', - templateUrl: './bar-chart-with-labels-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-bar-chart-with-labels-basic-config', + templateUrl: './bar-chart-with-labels-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class BarChartWithLabelsBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/comparison-key-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/comparison-key-row.component.ts index e7ff98eed8..add7085af1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/comparison-key-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/comparison-key-row.component.ts @@ -32,17 +32,18 @@ import { deepClone } from '@core/utils'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-comparison-key-row', - templateUrl: './comparison-key-row.component.html', - styleUrls: ['./comparison-key-row.component.scss', '../../../lib/settings/common/key/data-keys.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ComparisonKeyRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-comparison-key-row', + templateUrl: './comparison-key-row.component.html', + styleUrls: ['./comparison-key-row.component.scss', '../../../lib/settings/common/key/data-keys.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ComparisonKeyRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ComparisonKeyRowComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/comparison-keys-table.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/comparison-keys-table.component.ts index 162f55ae9e..2409c9af57 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/comparison-keys-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/comparison-keys-table.component.ts @@ -27,17 +27,18 @@ import { DataKey, DatasourceType } from '@shared/models/widget.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-comparison-keys-table', - templateUrl: './comparison-keys-table.component.html', - styleUrls: ['./comparison-keys-table.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ComparisonKeysTableComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-comparison-keys-table', + templateUrl: './comparison-keys-table.component.html', + styleUrls: ['./comparison-keys-table.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ComparisonKeysTableComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ComparisonKeysTableComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/doughnut-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/doughnut-basic-config.component.ts index f1e5501343..af411c4bb7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/doughnut-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/doughnut-basic-config.component.ts @@ -32,9 +32,10 @@ import { } from '@home/components/widget/config/basic/chart/latest-chart-basic-config.component'; @Component({ - selector: 'tb-doughnut-basic-config', - templateUrl: './latest-chart-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-doughnut-basic-config', + templateUrl: './latest-chart-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class DoughnutBasicConfigComponent extends LatestChartBasicConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/flot-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/flot-basic-config.component.ts index d03d2f4c5f..9e2673a9ca 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/flot-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/flot-basic-config.component.ts @@ -30,9 +30,10 @@ import { } from '@home/components/widget/config/timewindow-config-panel.component'; @Component({ - selector: 'tb-flot-basic-config', - templateUrl: './flot-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-flot-basic-config', + templateUrl: './flot-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class FlotBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/pie-chart-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/pie-chart-basic-config.component.ts index d71338e45b..6dea17141b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/pie-chart-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/pie-chart-basic-config.component.ts @@ -31,9 +31,10 @@ import { } from '@home/components/widget/config/basic/chart/latest-chart-basic-config.component'; @Component({ - selector: 'tb-pie-chart-basic-config', - templateUrl: './latest-chart-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-pie-chart-basic-config', + templateUrl: './latest-chart-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class PieChartBasicConfigComponent extends LatestChartBasicConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/polar-area-chart-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/polar-area-chart-basic-config.component.ts index 0e5abe194d..578a4957e2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/polar-area-chart-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/polar-area-chart-basic-config.component.ts @@ -31,9 +31,10 @@ import { } from '@home/components/widget/config/basic/chart/latest-chart-basic-config.component'; @Component({ - selector: 'tb-polar-area-chart-basic-config', - templateUrl: './latest-chart-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-polar-area-chart-basic-config', + templateUrl: './latest-chart-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class PolarAreaChartBasicConfigComponent extends LatestChartBasicConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/radar-chart-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/radar-chart-basic-config.component.ts index 56cdf66fb6..52f3094da6 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/radar-chart-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/radar-chart-basic-config.component.ts @@ -31,9 +31,10 @@ import { } from '@home/components/widget/config/basic/chart/latest-chart-basic-config.component'; @Component({ - selector: 'tb-radar-chart-basic-config', - templateUrl: './latest-chart-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-radar-chart-basic-config', + templateUrl: './latest-chart-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class RadarChartBasicConfigComponent extends LatestChartBasicConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/range-chart-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/range-chart-basic-config.component.ts index 6681ad09a6..3b24d1b98e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/range-chart-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/range-chart-basic-config.component.ts @@ -59,9 +59,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-range-chart-basic-config', - templateUrl: './range-chart-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-range-chart-basic-config', + templateUrl: './range-chart-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class RangeChartBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/time-series-chart-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/time-series-chart-basic-config.component.ts index a945aa34ef..008e1fda57 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/time-series-chart-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/chart/time-series-chart-basic-config.component.ts @@ -55,9 +55,10 @@ import { TimeSeriesChartTooltipTrigger } from '@home/components/widget/lib/chart import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-time-series-chart-basic-config', - templateUrl: './time-series-chart-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-time-series-chart-basic-config', + templateUrl: './time-series-chart-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class TimeSeriesChartBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/common/data-key-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/common/data-key-row.component.ts index bca32ef235..e84587c758 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/common/data-key-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/common/data-key-row.component.ts @@ -76,17 +76,18 @@ export const dataKeyRowValidator = (control: AbstractControl): ValidationErrors }; @Component({ - selector: 'tb-data-key-row', - templateUrl: './data-key-row.component.html', - styleUrls: ['./data-key-row.component.scss', '../../../lib/settings/common/key/data-keys.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DataKeyRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-data-key-row', + templateUrl: './data-key-row.component.html', + styleUrls: ['./data-key-row.component.scss', '../../../lib/settings/common/key/data-keys.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DataKeyRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DataKeyRowComponent implements ControlValueAccessor, OnInit, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/common/data-keys-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/common/data-keys-panel.component.ts index d0b6ca68d9..a42b046bb8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/common/data-keys-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/common/data-keys-panel.component.ts @@ -50,22 +50,23 @@ import { FormProperty } from '@shared/models/dynamic-form.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-data-keys-panel', - templateUrl: './data-keys-panel.component.html', - styleUrls: ['./data-keys-panel.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DataKeysPanelComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DataKeysPanelComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-data-keys-panel', + templateUrl: './data-keys-panel.component.html', + styleUrls: ['./data-keys-panel.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DataKeysPanelComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DataKeysPanelComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DataKeysPanelComponent implements ControlValueAccessor, OnInit, OnChanges, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/common/widget-actions-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/common/widget-actions-panel.component.ts index f63825a285..0320dc7fd1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/common/widget-actions-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/common/widget-actions-panel.component.ts @@ -28,16 +28,17 @@ import { MatDialog } from '@angular/material/dialog'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-widget-actions-panel', - templateUrl: './widget-actions-panel.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => WidgetActionsPanelComponent), - multi: true - } - ] + selector: 'tb-widget-actions-panel', + templateUrl: './widget-actions-panel.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => WidgetActionsPanelComponent), + multi: true + } + ], + standalone: false }) export class WidgetActionsPanelComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/entity/entities-table-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/entity/entities-table-basic-config.component.ts index b9d0efe45d..ea49d88c8d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/entity/entities-table-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/entity/entities-table-basic-config.component.ts @@ -35,9 +35,10 @@ import { } from '@home/components/widget/config/timewindow-config-panel.component'; @Component({ - selector: 'tb-entities-table-basic-config', - templateUrl: './entities-table-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-entities-table-basic-config', + templateUrl: './entities-table-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class EntitiesTableBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/entity/entity-count-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/entity/entity-count-basic-config.component.ts index 53712619a1..7928be4ba2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/entity/entity-count-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/entity/entity-count-basic-config.component.ts @@ -28,9 +28,10 @@ import { UtilsService } from '@core/services/utils.service'; import { countDefaultSettings, CountWidgetSettings } from '@home/components/widget/lib/count/count-widget.models'; @Component({ - selector: 'tb-entity-count-basic-config', - templateUrl: './entity-count-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-entity-count-basic-config', + templateUrl: './entity-count-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class EntityCountBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/compass-gauge-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/compass-gauge-basic-config.component.ts index f0b8188075..04c3141aef 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/compass-gauge-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/compass-gauge-basic-config.component.ts @@ -33,9 +33,10 @@ import { import { isUndefined } from '@core/utils'; @Component({ - selector: 'tb-compass-gauge-basic-config', - templateUrl: './compass-gauge-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-compass-gauge-basic-config', + templateUrl: './compass-gauge-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class CompassGaugeBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/digital-simple-gauge-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/digital-simple-gauge-basic-config.component.ts index c90c19aca8..e0ca65cdea 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/digital-simple-gauge-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/digital-simple-gauge-basic-config.component.ts @@ -45,9 +45,10 @@ import { ColorSettings, ColorType } from '@shared/models/widget-settings.models' import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-digital-simple-gauge-basic-config', - templateUrl: './digital-simple-gauge-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-digital-simple-gauge-basic-config', + templateUrl: './digital-simple-gauge-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class DigitalSimpleGaugeBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/radial-gauge-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/radial-gauge-basic-config.component.ts index 4b832956e6..e156c0bbfc 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/radial-gauge-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/radial-gauge-basic-config.component.ts @@ -25,9 +25,10 @@ import { WidgetConfigComponent } from '@home/components/widget/widget-config.com import { WidgetConfigComponentData } from '@home/models/widget-component.models'; @Component({ - selector: 'tb-radial-gauge-basic-config', - templateUrl: './analog-gauge-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-radial-gauge-basic-config', + templateUrl: './analog-gauge-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class RadialGaugeBasicConfigComponent extends GaugeBasicConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/thermometer-scale-gauge-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/thermometer-scale-gauge-basic-config.component.ts index c8d560370e..d173b9bce9 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/thermometer-scale-gauge-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/thermometer-scale-gauge-basic-config.component.ts @@ -25,9 +25,10 @@ import { WidgetConfigComponent } from '@home/components/widget/widget-config.com import { WidgetConfigComponentData } from '@home/models/widget-component.models'; @Component({ - selector: 'tb-thermometer-scale-gauge-basic-config', - templateUrl: './analog-gauge-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-thermometer-scale-gauge-basic-config', + templateUrl: './analog-gauge-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class ThermometerScaleGaugeBasicConfigComponent extends GaugeBasicConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/battery-level-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/battery-level-basic-config.component.ts index ac8bf4891d..af236c54cd 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/battery-level-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/battery-level-basic-config.component.ts @@ -46,9 +46,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-battery-level-basic-config', - templateUrl: './battery-level-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-battery-level-basic-config', + templateUrl: './battery-level-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class BatteryLevelBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/liquid-level-card-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/liquid-level-card-basic-config.component.ts index af11303c46..72820c9564 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/liquid-level-card-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/liquid-level-card-basic-config.component.ts @@ -66,9 +66,10 @@ import { UtilsService } from '@core/services/utils.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-liquid-level-card-basic-config', - templateUrl: './liquid-level-card-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-liquid-level-card-basic-config', + templateUrl: './liquid-level-card-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class LiquidLevelCardBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/signal-strength-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/signal-strength-basic-config.component.ts index 0e2fce08be..db6ebaeaa0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/signal-strength-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/signal-strength-basic-config.component.ts @@ -49,9 +49,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-signal-strength-basic-config', - templateUrl: './signal-strength-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-signal-strength-basic-config', + templateUrl: './signal-strength-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class SignalStrengthBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/status-widget-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/status-widget-basic-config.component.ts index 8abefc479f..3048f509ff 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/status-widget-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/status-widget-basic-config.component.ts @@ -33,9 +33,10 @@ import { } from '@home/components/widget/lib/indicator/status-widget.models'; @Component({ - selector: 'tb-status-widget-basic-config', - templateUrl: './status-widget-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-status-widget-basic-config', + templateUrl: './status-widget-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class StatusWidgetBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.ts index 1a1543218e..67e88597b2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.ts @@ -31,9 +31,10 @@ import { } from '@home/components/widget/config/timewindow-config-panel.component'; @Component({ - selector: 'tb-map-basic-config', - templateUrl: './map-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-map-basic-config', + templateUrl: './map-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class MapBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/rpc/single-switch-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/rpc/single-switch-basic-config.component.ts index 1d8a741c91..cdf8a72fe7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/rpc/single-switch-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/rpc/single-switch-basic-config.component.ts @@ -33,9 +33,10 @@ import { import { ValueType } from '@shared/models/constants'; @Component({ - selector: 'tb-single-switch-basic-config', - templateUrl: './single-switch-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-single-switch-basic-config', + templateUrl: './single-switch-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class SingleSwitchBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/rpc/slider-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/rpc/slider-basic-config.component.ts index bb24654704..1946db01f8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/rpc/slider-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/rpc/slider-basic-config.component.ts @@ -36,9 +36,10 @@ import { cssSizeToStrSize, resolveCssSize } from '@shared/models/widget-settings import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-slider-basic-config', - templateUrl: './slider-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-slider-basic-config', + templateUrl: './slider-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class SliderBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/rpc/value-stepper-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/rpc/value-stepper-basic-config.component.ts index a149118743..d9806967d3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/rpc/value-stepper-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/rpc/value-stepper-basic-config.component.ts @@ -36,9 +36,10 @@ import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; type ButtonAppearanceType = 'left' | 'right'; @Component({ - selector: 'tb-value-stepper-basic-config', - templateUrl: './value-stepper-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-value-stepper-basic-config', + templateUrl: './value-stepper-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class ValueStepperBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/scada/scada-symbol-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/scada/scada-symbol-basic-config.component.ts index 46a87c89e3..e118e2a4b8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/scada/scada-symbol-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/scada/scada-symbol-basic-config.component.ts @@ -30,9 +30,10 @@ import { isUndefined } from '@core/utils'; import { cssSizeToStrSize, resolveCssSize } from '@shared/models/widget-settings.models'; @Component({ - selector: 'tb-scada-symbol-basic-config', - templateUrl: './scada-symbol-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-scada-symbol-basic-config', + templateUrl: './scada-symbol-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class ScadaSymbolBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/weather/wind-speed-direction-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/weather/wind-speed-direction-basic-config.component.ts index ba45cfe3b3..b48d44de6d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/weather/wind-speed-direction-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/weather/wind-speed-direction-basic-config.component.ts @@ -46,9 +46,10 @@ import { import { getSourceTbUnitSymbol, TbUnit } from '@shared/models/unit.models'; @Component({ - selector: 'tb-wind-speed-direction-basic-config', - templateUrl: './wind-speed-direction-basic-config.component.html', - styleUrls: ['../basic-config.scss'] + selector: 'tb-wind-speed-direction-basic-config', + templateUrl: './wind-speed-direction-basic-config.component.html', + styleUrls: ['../basic-config.scss'], + standalone: false }) export class WindSpeedDirectionBasicConfigComponent extends BasicWidgetConfigComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/datasource.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/datasource.component.ts index dcec6497da..6dcfee5146 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/datasource.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/datasource.component.ts @@ -47,21 +47,22 @@ import { FormProperty } from '@shared/models/dynamic-form.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-datasource', - templateUrl: './datasource.component.html', - styleUrls: ['./datasource.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DatasourceComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DatasourceComponent), - multi: true, - } - ] + selector: 'tb-datasource', + templateUrl: './datasource.component.html', + styleUrls: ['./datasource.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DatasourceComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DatasourceComponent), + multi: true, + } + ], + standalone: false }) export class DatasourceComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/datasources.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/datasources.component.ts index dd518177d0..36dcbbd9f8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/datasources.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/datasources.component.ts @@ -46,21 +46,22 @@ import { FormProperty } from '@shared/models/dynamic-form.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-datasources', - templateUrl: './datasources.component.html', - styleUrls: ['./datasources.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DatasourcesComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DatasourcesComponent), - multi: true, - } - ] + selector: 'tb-datasources', + templateUrl: './datasources.component.html', + styleUrls: ['./datasources.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DatasourcesComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DatasourcesComponent), + multi: true, + } + ], + standalone: false }) export class DatasourcesComponent implements ControlValueAccessor, OnInit, Validator, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/target-device.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/target-device.component.ts index 3b68b52668..bcabcf9099 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/target-device.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/target-device.component.ts @@ -35,21 +35,22 @@ import { EntityAliasSelectCallbacks } from '@home/components/widget/lib/settings import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-target-device', - templateUrl: './target-device.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TargetDeviceComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TargetDeviceComponent), - multi: true, - } - ] + selector: 'tb-target-device', + templateUrl: './target-device.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TargetDeviceComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TargetDeviceComponent), + multi: true, + } + ], + standalone: false }) export class TargetDeviceComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/timewindow-config-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-config-panel.component.ts index 1c1ecf9e2f..03a7804658 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/timewindow-config-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-config-panel.component.ts @@ -49,16 +49,17 @@ export const setTimewindowConfig = (config: WidgetConfig, data: TimewindowConfig }; @Component({ - selector: 'tb-timewindow-config-panel', - templateUrl: './timewindow-config-panel.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimewindowConfigPanelComponent), - multi: true - } - ] + selector: 'tb-timewindow-config-panel', + templateUrl: './timewindow-config-panel.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimewindowConfigPanelComponent), + multi: true + } + ], + standalone: false }) export class TimewindowConfigPanelComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style-panel.component.ts index 0a3dc78902..4370dfc358 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style-panel.component.ts @@ -26,11 +26,12 @@ import { deepClone } from '@core/utils'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-timewindow-style-panel', - templateUrl: './timewindow-style-panel.component.html', - providers: [], - styleUrls: ['./timewindow-style-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-timewindow-style-panel', + templateUrl: './timewindow-style-panel.component.html', + providers: [], + styleUrls: ['./timewindow-style-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class TimewindowStylePanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style.component.ts index 03abbf7c2a..d0e0eef7e2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style.component.ts @@ -23,16 +23,17 @@ import { Timewindow } from '@shared/models/time/time.models'; import { TimewindowStylePanelComponent } from '@home/components/widget/config/timewindow-style-panel.component'; @Component({ - selector: 'tb-timewindow-style', - templateUrl: './timewindow-style.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimewindowStyleComponent), - multi: true - } - ] + selector: 'tb-timewindow-style', + templateUrl: './timewindow-style.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimewindowStyleComponent), + multi: true + } + ], + standalone: false }) export class TimewindowStyleComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/dialog/custom-dialog-container.component.ts b/ui-ngx/src/app/modules/home/components/widget/dialog/custom-dialog-container.component.ts index 3c05469d04..31c63187ae 100644 --- a/ui-ngx/src/app/modules/home/components/widget/dialog/custom-dialog-container.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/dialog/custom-dialog-container.component.ts @@ -44,8 +44,9 @@ export interface CustomDialogContainerData { } @Component({ - selector: 'tb-custom-dialog-container-component', - template: '' + selector: 'tb-custom-dialog-container-component', + template: '', + standalone: false }) export class CustomDialogContainerComponent extends DialogComponent implements OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/dialog/embed-dashboard-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/dialog/embed-dashboard-dialog.component.ts index 667316f76b..5b791ada3f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/dialog/embed-dashboard-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/dialog/embed-dashboard-dialog.component.ts @@ -34,9 +34,10 @@ export interface EmbedDashboardDialogData { } @Component({ - selector: 'tb-embed-dashboard-dialog', - templateUrl: './embed-dashboard-dialog.component.html', - styleUrls: ['./embed-dashboard-dialog.component.scss'] + selector: 'tb-embed-dashboard-dialog', + templateUrl: './embed-dashboard-dialog.component.html', + styleUrls: ['./embed-dashboard-dialog.component.scss'], + standalone: false }) export class EmbedDashboardDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/alarm/alarms-table-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/alarm/alarms-table-widget.component.ts index 1a5f6a018f..31927e0cb3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/alarm/alarms-table-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/alarm/alarms-table-widget.component.ts @@ -166,9 +166,10 @@ interface AlarmWidgetActionDescriptor extends TableCellButtonActionDescriptor { } @Component({ - selector: 'tb-alarms-table-widget', - templateUrl: './alarms-table-widget.component.html', - styleUrls: ['./alarms-table-widget.component.scss', './../table-widget.scss'] + selector: 'tb-alarms-table-widget', + templateUrl: './alarms-table-widget.component.html', + styleUrls: ['./alarms-table-widget.component.scss', './../table-widget.scss'], + standalone: false }) export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, OnDestroy, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/button/action-button-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/button/action-button-widget.component.ts index 9a397eaf9b..eaa723acd3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/button/action-button-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/button/action-button-widget.component.ts @@ -26,10 +26,11 @@ import { import { WidgetButtonAppearance } from '@shared/components/button/widget-button.models'; @Component({ - selector: 'tb-action-button-widget', - templateUrl: './action-button-widget.component.html', - styleUrls: ['../action/action-widget.scss', './action-button-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-action-button-widget', + templateUrl: './action-button-widget.component.html', + styleUrls: ['../action/action-widget.scss', './action-button-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ActionButtonWidgetComponent extends BasicActionWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/button/command-button-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/button/command-button-widget.component.ts index ca863f9108..70298808da 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/button/command-button-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/button/command-button-widget.component.ts @@ -26,10 +26,11 @@ import { } from '@home/components/widget/lib/button/command-button-widget.models'; @Component({ - selector: 'tb-command-button-widget', - templateUrl: './command-button-widget.component.html', - styleUrls: ['../action/action-widget.scss', './command-button-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-command-button-widget', + templateUrl: './command-button-widget.component.html', + styleUrls: ['../action/action-widget.scss', './command-button-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class CommandButtonWidgetComponent extends BasicActionWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/button/toggle-button-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/button/toggle-button-widget.component.ts index 9c20a279ed..a1601a6fb8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/button/toggle-button-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/button/toggle-button-widget.component.ts @@ -28,10 +28,11 @@ import { Observable } from 'rxjs'; import { backgroundStyle, ComponentStyle, overlayStyle } from '@shared/models/widget-settings.models'; @Component({ - selector: 'tb-toggle-button-widget', - templateUrl: './toggle-button-widget.component.html', - styleUrls: ['../action/action-widget.scss', './toggle-button-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-toggle-button-widget', + templateUrl: './toggle-button-widget.component.html', + styleUrls: ['../action/action-widget.scss', './toggle-button-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ToggleButtonWidgetComponent extends BasicActionWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/button/two-segment-button-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/button/two-segment-button-widget.component.ts index efff97c29c..46382dab77 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/button/two-segment-button-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/button/two-segment-button-widget.component.ts @@ -28,10 +28,11 @@ import { ComponentStyle } from '@shared/models/widget-settings.models'; import { MatButtonToggleChange } from '@angular/material/button-toggle'; @Component({ - selector: 'tb-two-segment-button-widget', - templateUrl: './two-segment-button-widget.component.html', - styleUrls: ['../action/action-widget.scss', './two-segment-button-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-two-segment-button-widget', + templateUrl: './two-segment-button-widget.component.html', + styleUrls: ['../action/action-widget.scss', './two-segment-button-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class TwoSegmentButtonWidgetComponent extends BasicActionWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/cards/aggregated-value-card-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/cards/aggregated-value-card-widget.component.ts index 3a4a836c5e..c4b07619e7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/cards/aggregated-value-card-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/cards/aggregated-value-card-widget.component.ts @@ -63,9 +63,10 @@ const valuesLayoutHeight = 66; const valuesLayoutVerticalPadding = 16; @Component({ - selector: 'tb-aggregated-value-card-widget', - templateUrl: './aggregated-value-card-widget.component.html', - styleUrls: ['./aggregated-value-card-widget.component.scss'] + selector: 'tb-aggregated-value-card-widget', + templateUrl: './aggregated-value-card-widget.component.html', + styleUrls: ['./aggregated-value-card-widget.component.scss'], + standalone: false }) export class AggregatedValueCardWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/cards/label-card-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/cards/label-card-widget.component.ts index 195e683c57..52905a0469 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/cards/label-card-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/cards/label-card-widget.component.ts @@ -45,10 +45,11 @@ import { ImagePipe } from '@shared/pipe/image.pipe'; import { DomSanitizer } from '@angular/platform-browser'; @Component({ - selector: 'tb-label-card-widget', - templateUrl: './label-card-widget.component.html', - styleUrls: ['./label-card-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-label-card-widget', + templateUrl: './label-card-widget.component.html', + styleUrls: ['./label-card-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class LabelCardWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/cards/label-value-card-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/cards/label-value-card-widget.component.ts index 978d52d854..04e2c03679 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/cards/label-value-card-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/cards/label-value-card-widget.component.ts @@ -50,10 +50,11 @@ import { import { isDefinedAndNotNull } from '@core/utils'; @Component({ - selector: 'tb-label-value-card-widget', - templateUrl: './label-value-card-widget.component.html', - styleUrls: ['./label-value-card-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-label-value-card-widget', + templateUrl: './label-value-card-widget.component.html', + styleUrls: ['./label-value-card-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class LabelValueCardWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/cards/notification-type-filter-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/cards/notification-type-filter-panel.component.ts index 30976c8442..a39044c759 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/cards/notification-type-filter-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/cards/notification-type-filter-panel.component.ts @@ -32,9 +32,10 @@ export interface NotificationTypeFilterPanelData { } @Component({ - selector: 'tb-notification-type-filter-panel', - templateUrl: './notification-type-filter-panel.component.html', - styleUrls: ['notification-type-filter-panel.component.scss'] + selector: 'tb-notification-type-filter-panel', + templateUrl: './notification-type-filter-panel.component.html', + styleUrls: ['notification-type-filter-panel.component.scss'], + standalone: false }) export class NotificationTypeFilterPanelComponent implements OnInit{ diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/cards/progress-bar-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/cards/progress-bar-widget.component.ts index 66f5d90254..bc4180b0e7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/cards/progress-bar-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/cards/progress-bar-widget.component.ts @@ -52,10 +52,11 @@ const defaultAspect = defaultLayoutHeight / 150; const simplifiedAspect = simplifiedLayoutHeight / 150; @Component({ - selector: 'tb-progress-bar-widget', - templateUrl: './progress-bar-widget.component.html', - styleUrls: ['./progress-bar-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-progress-bar-widget', + templateUrl: './progress-bar-widget.component.html', + styleUrls: ['./progress-bar-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ProgressBarWidgetComponent implements OnInit, OnDestroy, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/cards/unread-notification-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/cards/unread-notification-widget.component.ts index 450d59e22e..e68cddacf0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/cards/unread-notification-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/cards/unread-notification-widget.component.ts @@ -54,10 +54,11 @@ import { select, Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-unread-notification-widget', - templateUrl: './unread-notification-widget.component.html', - styleUrls: ['unread-notification-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-unread-notification-widget', + templateUrl: './unread-notification-widget.component.html', + styleUrls: ['unread-notification-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class UnreadNotificationWidgetComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.ts index 4db8f11ba2..b994ff8b23 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.ts @@ -52,9 +52,10 @@ const squareLayoutSize = 160; const horizontalLayoutHeight = 80; @Component({ - selector: 'tb-value-card-widget', - templateUrl: './value-card-widget.component.html', - styleUrls: ['./value-card-widget.component.scss'] + selector: 'tb-value-card-widget', + templateUrl: './value-card-widget.component.html', + styleUrls: ['./value-card-widget.component.scss'], + standalone: false }) export class ValueCardWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-chart-card-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-chart-card-widget.component.ts index 0198fdf6e3..5da48a00d3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-chart-card-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-chart-card-widget.component.ts @@ -62,10 +62,11 @@ const layoutHeight = 56; const valueRelativeWidth = 0.35; @Component({ - selector: 'tb-value-chart-card-widget', - templateUrl: './value-chart-card-widget.component.html', - styleUrls: ['./value-chart-card-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-value-chart-card-widget', + templateUrl: './value-chart-card-widget.component.html', + styleUrls: ['./value-chart-card-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ValueChartCardWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/chart/bar-chart-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/chart/bar-chart-widget.component.ts index b6c88a7d3a..3fb90f4f21 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/chart/bar-chart-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/chart/bar-chart-widget.component.ts @@ -30,10 +30,11 @@ import { import { TbBarsChart } from '@home/components/widget/lib/chart/bars-chart'; @Component({ - selector: 'tb-bar-chart-widget', - templateUrl: './latest-chart-widget.component.html', - styleUrls: [], - encapsulation: ViewEncapsulation.None + selector: 'tb-bar-chart-widget', + templateUrl: './latest-chart-widget.component.html', + styleUrls: [], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class BarChartWidgetComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/chart/bar-chart-with-labels-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/chart/bar-chart-with-labels-widget.component.ts index f9bd213fdb..1f63cd8638 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/chart/bar-chart-with-labels-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/chart/bar-chart-with-labels-widget.component.ts @@ -43,10 +43,11 @@ import { DataKey } from '@shared/models/widget.models'; import { WidgetComponent } from '@home/components/widget/widget.component'; @Component({ - selector: 'tb-bar-chart-with-labels-widget', - templateUrl: './bar-chart-with-labels-widget.component.html', - styleUrls: ['./bar-chart-with-labels-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-bar-chart-with-labels-widget', + templateUrl: './bar-chart-with-labels-widget.component.html', + styleUrls: ['./bar-chart-with-labels-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class BarChartWithLabelsWidgetComponent implements OnInit, OnDestroy, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/chart/doughnut-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/chart/doughnut-widget.component.ts index 00cc814246..64b4f2caf2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/chart/doughnut-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/chart/doughnut-widget.component.ts @@ -31,10 +31,11 @@ import { } from '@home/components/widget/lib/chart/latest-chart.component'; @Component({ - selector: 'tb-doughnut-widget', - templateUrl: './latest-chart-widget.component.html', - styleUrls: [], - encapsulation: ViewEncapsulation.None + selector: 'tb-doughnut-widget', + templateUrl: './latest-chart-widget.component.html', + styleUrls: [], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DoughnutWidgetComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/chart/latest-chart.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/chart/latest-chart.component.ts index facd9f0cad..7dd9c060c7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/chart/latest-chart.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/chart/latest-chart.component.ts @@ -49,10 +49,11 @@ export interface LatestChartComponentCallbacks { } @Component({ - selector: 'tb-latest-chart', - templateUrl: './latest-chart.component.html', - styleUrls: ['./latest-chart.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-latest-chart', + templateUrl: './latest-chart.component.html', + styleUrls: ['./latest-chart.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class LatestChartComponent implements OnInit, OnDestroy, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/chart/pie-chart-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/chart/pie-chart-widget.component.ts index 2ea605739c..3da64540e3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/chart/pie-chart-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/chart/pie-chart-widget.component.ts @@ -30,10 +30,11 @@ import { } from '@home/components/widget/lib/chart/pie-chart-widget.models'; @Component({ - selector: 'tb-pie-chart-widget', - templateUrl: './latest-chart-widget.component.html', - styleUrls: [], - encapsulation: ViewEncapsulation.None + selector: 'tb-pie-chart-widget', + templateUrl: './latest-chart-widget.component.html', + styleUrls: [], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class PieChartWidgetComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/chart/polar-area-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/chart/polar-area-widget.component.ts index adc74628c5..d54ced555b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/chart/polar-area-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/chart/polar-area-widget.component.ts @@ -30,10 +30,11 @@ import { } from '@home/components/widget/lib/chart/polar-area-widget.models'; @Component({ - selector: 'tb-polar-area-chart-widget', - templateUrl: './latest-chart-widget.component.html', - styleUrls: [], - encapsulation: ViewEncapsulation.None + selector: 'tb-polar-area-chart-widget', + templateUrl: './latest-chart-widget.component.html', + styleUrls: [], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class PolarAreaWidgetComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/chart/radar-chart-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/chart/radar-chart-widget.component.ts index 305ae940ca..7bf770e3ff 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/chart/radar-chart-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/chart/radar-chart-widget.component.ts @@ -30,10 +30,11 @@ import { import { TbRadarChart } from '@home/components/widget/lib/chart/radar-chart'; @Component({ - selector: 'tb-radar-chart-widget', - templateUrl: './latest-chart-widget.component.html', - styleUrls: [], - encapsulation: ViewEncapsulation.None + selector: 'tb-radar-chart-widget', + templateUrl: './latest-chart-widget.component.html', + styleUrls: [], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class RadarChartWidgetComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/chart/range-chart-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/chart/range-chart-widget.component.ts index 27fe86a393..2412d51a83 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/chart/range-chart-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/chart/range-chart-widget.component.ts @@ -54,10 +54,11 @@ import { TbUnit } from '@shared/models/unit.models'; import { UnitService } from '@core/services/unit.service'; @Component({ - selector: 'tb-range-chart-widget', - templateUrl: './range-chart-widget.component.html', - styleUrls: ['./range-chart-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-range-chart-widget', + templateUrl: './range-chart-widget.component.html', + styleUrls: ['./range-chart-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class RangeChartWidgetComponent implements OnInit, OnDestroy, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/chart/time-series-chart-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/chart/time-series-chart-widget.component.ts index b96ff3996f..aa94ee717c 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/chart/time-series-chart-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/chart/time-series-chart-widget.component.ts @@ -46,10 +46,11 @@ import { mergeDeep } from '@core/utils'; import { WidgetComponent } from '@home/components/widget/widget.component'; @Component({ - selector: 'tb-time-series-chart-widget', - templateUrl: './time-series-chart-widget.component.html', - styleUrls: ['./time-series-chart-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-time-series-chart-widget', + templateUrl: './time-series-chart-widget.component.html', + styleUrls: ['./time-series-chart-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class TimeSeriesChartWidgetComponent implements OnInit, OnDestroy, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/count/count-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/count/count-widget.component.ts index 611223c5df..01a652b03f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/count/count-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/count/count-widget.component.ts @@ -48,9 +48,10 @@ const layoutHeightWithTitle = 60; const layoutPadding = 24; @Component({ - selector: 'tb-count-widget', - templateUrl: './count-widget.component.html', - styleUrls: ['./count-widget.component.scss'] + selector: 'tb-count-widget', + templateUrl: './count-widget.component.html', + styleUrls: ['./count-widget.component.scss'], + standalone: false }) export class CountWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/date-range-navigator/date-range-navigator.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/date-range-navigator/date-range-navigator.component.ts index 2870287548..2dc78059e9 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/date-range-navigator/date-range-navigator.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/date-range-navigator/date-range-navigator.component.ts @@ -50,9 +50,10 @@ import { HistoryWindowType, TimewindowType } from '@shared/models/time/time.mode import { isDefined } from '@core/utils'; @Component({ - selector: 'tb-date-range-navigator-widget', - templateUrl: './date-range-navigator.component.html', - styleUrls: ['./date-range-navigator.component.scss'] + selector: 'tb-date-range-navigator-widget', + templateUrl: './date-range-navigator.component.html', + styleUrls: ['./date-range-navigator.component.scss'], + standalone: false }) export class DateRangeNavigatorWidgetComponent extends PageComponent implements OnInit, OnDestroy { @@ -276,10 +277,11 @@ export interface DateRangeNavigatorPanelData { } @Component({ - selector: 'tb-date-range-navigator-panel', - templateUrl: './date-range-navigator-panel.component.html', - styleUrls: ['./date-range-navigator-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-date-range-navigator-panel', + templateUrl: './date-range-navigator-panel.component.html', + styleUrls: ['./date-range-navigator-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DateRangeNavigatorPanelComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/display-columns-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/display-columns-panel.component.ts index e868919b92..54af0a4916 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/display-columns-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/display-columns-panel.component.ts @@ -25,9 +25,10 @@ export interface DisplayColumnsPanelData { } @Component({ - selector: 'tb-display-columns-panel', - templateUrl: './display-columns-panel.component.html', - styleUrls: ['./display-columns-panel.component.scss'] + selector: 'tb-display-columns-panel', + templateUrl: './display-columns-panel.component.html', + styleUrls: ['./display-columns-panel.component.scss'], + standalone: false }) export class DisplayColumnsPanelComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/edges-overview-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/edges-overview-widget.component.ts index 797ea4a03d..5f11d57cc4 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/edges-overview-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/edges-overview-widget.component.ts @@ -48,9 +48,10 @@ interface EdgesOverviewWidgetSettings { } @Component({ - selector: 'tb-edges-overview-widget', - templateUrl: './edges-overview-widget.component.html', - styleUrls: ['./edges-overview-widget.component.scss'] + selector: 'tb-edges-overview-widget', + templateUrl: './edges-overview-widget.component.html', + styleUrls: ['./edges-overview-widget.component.scss'], + standalone: false }) export class EdgesOverviewWidgetComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/entity/entities-hierarchy-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/entity/entities-hierarchy-widget.component.ts index 5820625076..12cd55f5b1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/entity/entities-hierarchy-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/entity/entities-hierarchy-widget.component.ts @@ -72,9 +72,10 @@ import { FormBuilder } from '@angular/forms'; import { Subject } from 'rxjs'; @Component({ - selector: 'tb-entities-hierarchy-widget', - templateUrl: './entities-hierarchy-widget.component.html', - styleUrls: ['./entities-hierarchy-widget.component.scss'] + selector: 'tb-entities-hierarchy-widget', + templateUrl: './entities-hierarchy-widget.component.html', + styleUrls: ['./entities-hierarchy-widget.component.scss'], + standalone: false }) export class EntitiesHierarchyWidgetComponent extends PageComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/entity/entities-table-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/entity/entities-table-widget.component.ts index 8d89e6cd6d..b99ba01212 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/entity/entities-table-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/entity/entities-table-widget.component.ts @@ -123,9 +123,10 @@ interface EntitiesTableWidgetSettings extends TableWidgetSettings { } @Component({ - selector: 'tb-entities-table-widget', - templateUrl: './entities-table-widget.component.html', - styleUrls: ['./entities-table-widget.component.scss', './../table-widget.scss'] + selector: 'tb-entities-table-widget', + templateUrl: './entities-table-widget.component.html', + styleUrls: ['./entities-table-widget.component.scss', './../table-widget.scss'], + standalone: false }) export class EntitiesTableWidgetComponent extends PageComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.component.ts index 0b670879ac..93c93f9004 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.component.ts @@ -28,9 +28,10 @@ import { import { isDefinedAndNotNull } from '@core/utils'; @Component({ - selector: 'tb-flot-widget', - templateUrl: './flot-widget.component.html', - styleUrls: [] + selector: 'tb-flot-widget', + templateUrl: './flot-widget.component.html', + styleUrls: [], + standalone: false }) export class FlotWidgetComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.ts index 447508e808..cef15ed649 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-doc-link-dialog.component.ts @@ -25,9 +25,10 @@ import { Router } from '@angular/router'; import { DocumentationLink } from '@shared/models/user-settings.models'; @Component({ - selector: 'tb-add-doc-link-dialog', - templateUrl: './add-doc-link-dialog.component.html', - styleUrls: ['./add-doc-link-dialog.component.scss'] + selector: 'tb-add-doc-link-dialog', + templateUrl: './add-doc-link-dialog.component.html', + styleUrls: ['./add-doc-link-dialog.component.scss'], + standalone: false }) export class AddDocLinkDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-quick-link-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-quick-link-dialog.component.ts index f7cac6cdf9..69087d21ee 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-quick-link-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/add-quick-link-dialog.component.ts @@ -24,9 +24,10 @@ import { DialogComponent } from '@shared/components/dialog.component'; import { Router } from '@angular/router'; @Component({ - selector: 'tb-add-quick-link-dialog', - templateUrl: './add-quick-link-dialog.component.html', - styleUrls: ['./add-quick-link-dialog.component.scss'] + selector: 'tb-add-quick-link-dialog', + templateUrl: './add-quick-link-dialog.component.html', + styleUrls: ['./add-quick-link-dialog.component.scss'], + standalone: false }) export class AddQuickLinkDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/cluster-info-table.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/cluster-info-table.component.ts index 927c80da30..625ddca093 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/cluster-info-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/cluster-info-table.component.ts @@ -43,9 +43,10 @@ export interface SystemInfoData { } @Component({ - selector: 'tb-cluster-info-table', - templateUrl: './cluster-info-table.component.html', - styleUrls: ['./cluster-info-table.component.scss'] + selector: 'tb-cluster-info-table', + templateUrl: './cluster-info-table.component.html', + styleUrls: ['./cluster-info-table.component.scss'], + standalone: false }) export class ClusterInfoTableComponent extends PageComponent implements OnInit, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/configured-features.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/configured-features.component.ts index 835df2f99d..06808d75ba 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/configured-features.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/configured-features.component.ts @@ -28,9 +28,10 @@ import { TranslateService } from '@ngx-translate/core'; import { MediaBreakpoints } from '@shared/models/constants'; @Component({ - selector: 'tb-configured-features', - templateUrl: './configured-features.component.html', - styleUrls: ['./home-page-widget.scss', './configured-features.component.scss'] + selector: 'tb-configured-features', + templateUrl: './configured-features.component.html', + styleUrls: ['./home-page-widget.scss', './configured-features.component.scss'], + standalone: false }) export class ConfiguredFeaturesComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.ts index 73c91d64b4..17f96f3b74 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-link.component.ts @@ -29,17 +29,18 @@ import { DocumentationLink } from '@shared/models/user-settings.models'; import { ErrorStateMatcher } from '@angular/material/core'; @Component({ - selector: 'tb-doc-link', - templateUrl: './doc-link.component.html', - styleUrls: ['./link.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DocLinkComponent), - multi: true - }, - {provide: ErrorStateMatcher, useExisting: DocLinkComponent} - ] + selector: 'tb-doc-link', + templateUrl: './doc-link.component.html', + styleUrls: ['./link.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DocLinkComponent), + multi: true + }, + { provide: ErrorStateMatcher, useExisting: DocLinkComponent } + ], + standalone: false }) export class DocLinkComponent extends PageComponent implements OnInit, ControlValueAccessor, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-links-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-links-widget.component.ts index 56b2418a81..74159f184c 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-links-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/doc-links-widget.component.ts @@ -100,9 +100,10 @@ interface DocLinksWidgetSettings { } @Component({ - selector: 'tb-doc-links-widget', - templateUrl: './doc-links-widget.component.html', - styleUrls: ['./home-page-widget.scss', './links-widget.component.scss'] + selector: 'tb-doc-links-widget', + templateUrl: './doc-links-widget.component.html', + styleUrls: ['./home-page-widget.scss', './links-widget.component.scss'], + standalone: false }) export class DocLinksWidgetComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-links-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-links-dialog.component.ts index 224d963a23..6e33e8e645 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-links-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/edit-links-dialog.component.ts @@ -32,9 +32,10 @@ export interface EditLinksDialogData { } @Component({ - selector: 'tb-edit-links-dialog', - templateUrl: './edit-links-dialog.component.html', - styleUrls: ['./edit-links-dialog.component.scss'] + selector: 'tb-edit-links-dialog', + templateUrl: './edit-links-dialog.component.html', + styleUrls: ['./edit-links-dialog.component.scss'], + standalone: false }) export class EditLinksDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/getting-started-completed-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/getting-started-completed-dialog.component.ts index 13356e6a1c..9d21b73dd3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/getting-started-completed-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/getting-started-completed-dialog.component.ts @@ -23,10 +23,11 @@ import { DialogComponent } from '@shared/components/dialog.component'; import { Router } from '@angular/router'; @Component({ - selector: 'tb-getting-started-completed-dialog', - templateUrl: './getting-started-completed-dialog.component.html', - styleUrls: ['./getting-started-completed-dialog.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-getting-started-completed-dialog', + templateUrl: './getting-started-completed-dialog.component.html', + styleUrls: ['./getting-started-completed-dialog.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class GettingStartedCompletedDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/getting-started-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/getting-started-widget.component.ts index a6d901c2af..6c13054b67 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/getting-started-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/getting-started-widget.component.ts @@ -33,9 +33,10 @@ import { first } from 'rxjs/operators'; import { Authority } from '@shared/models/authority.enum'; @Component({ - selector: 'tb-getting-started-widget', - templateUrl: './getting-started-widget.component.html', - styleUrls: ['./getting-started-widget.component.scss'] + selector: 'tb-getting-started-widget', + templateUrl: './getting-started-widget.component.html', + styleUrls: ['./getting-started-widget.component.scss'], + standalone: false }) export class GettingStartedWidgetComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/quick-link.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/quick-link.component.ts index c7d9a640d2..f9221dfb5f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/quick-link.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/quick-link.component.ts @@ -52,17 +52,18 @@ import { deepClone } from '@core/utils'; import { CustomTranslatePipe } from '@shared/pipe/custom-translate.pipe'; @Component({ - selector: 'tb-quick-link', - templateUrl: './quick-link.component.html', - styleUrls: ['./link.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => QuickLinkComponent), - multi: true - }, - {provide: ErrorStateMatcher, useExisting: QuickLinkComponent} - ] + selector: 'tb-quick-link', + templateUrl: './quick-link.component.html', + styleUrls: ['./link.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => QuickLinkComponent), + multi: true + }, + { provide: ErrorStateMatcher, useExisting: QuickLinkComponent } + ], + standalone: false }) export class QuickLinkComponent extends PageComponent implements OnInit, ControlValueAccessor, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/quick-links-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/quick-links-widget.component.ts index 3c1452decd..7d4783a3fe 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/quick-links-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/quick-links-widget.component.ts @@ -54,9 +54,10 @@ interface QuickLinksWidgetSettings { } @Component({ - selector: 'tb-quick-links-widget', - templateUrl: './quick-links-widget.component.html', - styleUrls: ['./home-page-widget.scss', './links-widget.component.scss'] + selector: 'tb-quick-links-widget', + templateUrl: './quick-links-widget.component.html', + styleUrls: ['./home-page-widget.scss', './links-widget.component.scss'], + standalone: false }) export class QuickLinksWidgetComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/recent-dashboards-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/recent-dashboards-widget.component.ts index f66c226379..899ffa5aea 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/recent-dashboards-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/recent-dashboards-widget.component.ts @@ -50,9 +50,10 @@ import { DashboardInfo } from '@shared/models/dashboard.models'; import { DashboardAutocompleteComponent } from '@shared/components/dashboard-autocomplete.component'; @Component({ - selector: 'tb-recent-dashboards-widget', - templateUrl: './recent-dashboards-widget.component.html', - styleUrls: ['./home-page-widget.scss', './recent-dashboards-widget.component.scss'] + selector: 'tb-recent-dashboards-widget', + templateUrl: './recent-dashboards-widget.component.html', + styleUrls: ['./home-page-widget.scss', './recent-dashboards-widget.component.scss'], + standalone: false }) export class RecentDashboardsWidgetComponent extends PageComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/usage-info-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/usage-info-widget.component.ts index aa7319f495..230d7842c2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/usage-info-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/usage-info-widget.component.ts @@ -27,9 +27,10 @@ import { UsageInfoService } from '@core/http/usage-info.service'; import { ShortNumberPipe } from '@shared/pipe/short-number.pipe'; @Component({ - selector: 'tb-usage-info-widget', - templateUrl: './usage-info-widget.component.html', - styleUrls: ['./home-page-widget.scss', './usage-info-widget.component.scss'] + selector: 'tb-usage-info-widget', + templateUrl: './usage-info-widget.component.html', + styleUrls: ['./home-page-widget.scss', './usage-info-widget.component.scss'], + standalone: false }) export class UsageInfoWidgetComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/version-info.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/version-info.component.ts index 5d9fc59c6e..f3cf60d3e1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/home-page/version-info.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/home-page/version-info.component.ts @@ -25,9 +25,10 @@ import { Authority } from '@shared/models/authority.enum'; import { of } from 'rxjs'; @Component({ - selector: 'tb-version-info', - templateUrl: './version-info.component.html', - styleUrls: ['./home-page-widget.scss', './version-info.component.scss'] + selector: 'tb-version-info', + templateUrl: './version-info.component.html', + styleUrls: ['./home-page-widget.scss', './version-info.component.scss'], + standalone: false }) export class VersionInfoComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/battery-level-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/battery-level-widget.component.ts index ff95a4882f..47550763d4 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/battery-level-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/battery-level-widget.component.ts @@ -74,10 +74,11 @@ const horizontalBatteryDimensions = { }; @Component({ - selector: 'tb-battery-level-widget', - templateUrl: './battery-level-widget.component.html', - styleUrls: ['./battery-level-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-battery-level-widget', + templateUrl: './battery-level-widget.component.html', + styleUrls: ['./battery-level-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class BatteryLevelWidgetComponent implements OnInit, OnDestroy, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.ts index aeecc94050..f3d02a096a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.ts @@ -71,10 +71,11 @@ import { UnitService } from '@core/services/unit.service'; import ITooltipsterInstance = JQueryTooltipster.ITooltipsterInstance; @Component({ - selector: 'tb-liquid-level-widget', - templateUrl: './liquid-level-widget.component.html', - styleUrls: ['./liquid-level-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-liquid-level-widget', + templateUrl: './liquid-level-widget.component.html', + styleUrls: ['./liquid-level-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class LiquidLevelWidgetComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/signal-strength-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/signal-strength-widget.component.ts index 9baa7e5e10..be4d992330 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/signal-strength-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/signal-strength-widget.component.ts @@ -76,10 +76,11 @@ const shapeHeight = 113; const shapeAspect = shapeWidth / shapeHeight; @Component({ - selector: 'tb-signal-strength-widget', - templateUrl: './signal-strength-widget.component.html', - styleUrls: ['./signal-strength-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-signal-strength-widget', + templateUrl: './signal-strength-widget.component.html', + styleUrls: ['./signal-strength-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class SignalStrengthWidgetComponent implements OnInit, OnDestroy, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/status-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/status-widget.component.ts index dd0a776939..e59570d44a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/status-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/status-widget.component.ts @@ -48,10 +48,11 @@ import { ValueType } from '@shared/models/constants'; const initialStatusWidgetSize = 147; @Component({ - selector: 'tb-status-widget', - templateUrl: './status-widget.component.html', - styleUrls: ['../action/action-widget.scss', './status-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-status-widget', + templateUrl: './status-widget.component.html', + styleUrls: ['../action/action-widget.scss', './status-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class StatusWidgetComponent extends BasicActionWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/json-input-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/json-input-widget.component.ts index 3aa5f0cd71..f6a6bb0ad3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/json-input-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/json-input-widget.component.ts @@ -49,9 +49,10 @@ interface JsonInputWidgetSettings { } @Component({ - selector: 'tb-json-input-widget ', - templateUrl: './json-input-widget.component.html', - styleUrls: ['./json-input-widget.component.scss'] + selector: 'tb-json-input-widget ', + templateUrl: './json-input-widget.component.html', + styleUrls: ['./json-input-widget.component.scss'], + standalone: false }) export class JsonInputWidgetComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/legend.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/legend.component.ts index 41551b98f3..b570910fb7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/legend.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/legend.component.ts @@ -18,9 +18,10 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { LegendConfig, LegendData, LegendDirection, LegendKey, LegendPosition } from '@shared/models/widget.models'; @Component({ - selector: 'tb-legend', - templateUrl: './legend.component.html', - styleUrls: ['./legend.component.scss'] + selector: 'tb-legend', + templateUrl: './legend.component.html', + styleUrls: ['./legend.component.scss'], + standalone: false }) export class LegendComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/maps-legacy/dialogs/select-entity-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/maps-legacy/dialogs/select-entity-dialog.component.ts index d79a6d4dbd..71cfb95ebe 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/maps-legacy/dialogs/select-entity-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/maps-legacy/dialogs/select-entity-dialog.component.ts @@ -28,9 +28,10 @@ export interface SelectEntityDialogData { } @Component({ - selector: 'tb-select-entity-dialog', - templateUrl: './select-entity-dialog.component.html', - styleUrls: ['./select-entity-dialog.component.scss'] + selector: 'tb-select-entity-dialog', + templateUrl: './select-entity-dialog.component.html', + styleUrls: ['./select-entity-dialog.component.scss'], + standalone: false }) export class SelectEntityDialogComponent extends DialogComponent { selectEntityFormGroup: FormGroup; diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/maps/map-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/maps/map-widget.component.ts index ac55e9e5ab..e9b0e761f9 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/maps/map-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/maps/map-widget.component.ts @@ -40,10 +40,11 @@ import { ImagePipe } from '@shared/pipe/image.pipe'; import { DomSanitizer } from '@angular/platform-browser'; @Component({ - selector: 'tb-map-widget', - templateUrl: './map-widget.component.html', - styleUrls: ['./map-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-map-widget', + templateUrl: './map-widget.component.html', + styleUrls: ['./map-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MapWidgetComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/maps/panels/map-timeline-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/maps/panels/map-timeline-panel.component.ts index fceec947af..30ba8f0f40 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/maps/panels/map-timeline-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/maps/panels/map-timeline-panel.component.ts @@ -34,10 +34,11 @@ import { filter } from 'rxjs/operators'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-map-timeline-panel', - templateUrl: './map-timeline-panel.component.html', - styleUrls: ['./map-timeline-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-map-timeline-panel', + templateUrl: './map-timeline-panel.component.html', + styleUrls: ['./map-timeline-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MapTimelinePanelComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/maps/panels/select-map-entity-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/maps/panels/select-map-entity-panel.component.ts index 6165a2da91..ffeca2728b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/maps/panels/select-map-entity-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/maps/panels/select-map-entity-panel.component.ts @@ -20,11 +20,12 @@ import { TbPopoverComponent } from '@shared/components/popover.component'; import { UnplacedMapDataItem } from '@home/components/widget/lib/maps/data-layer/latest-map-data-layer'; @Component({ - selector: 'tb-select-map-entity-panel', - templateUrl: './select-map-entity-panel.component.html', - providers: [], - styleUrls: ['./select-map-entity-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-select-map-entity-panel', + templateUrl: './select-map-entity-panel.component.html', + providers: [], + styleUrls: ['./select-map-entity-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class SelectMapEntityPanelComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/markdown-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/markdown-widget.component.ts index faeeb0bbf2..5f653c38d9 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/markdown-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/markdown-widget.component.ts @@ -50,8 +50,9 @@ interface MarkdownWidgetSettings { type MarkdownTextFunction = (data: FormattedData[], ctx: WidgetContext) => string; @Component({ - selector: 'tb-markdown-widget', - templateUrl: './markdown-widget.component.html' + selector: 'tb-markdown-widget', + templateUrl: './markdown-widget.component.html', + standalone: false }) export class MarkdownWidgetComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/mobile-app-qrcode-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/mobile-app-qrcode-widget.component.ts index f0a843688c..7324d16672 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/mobile-app-qrcode-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/mobile-app-qrcode-widget.component.ts @@ -30,9 +30,10 @@ import { ImagePipe } from '@shared/pipe/image.pipe'; import { DomSanitizer } from '@angular/platform-browser'; @Component({ - selector: 'tb-mobile-app-qrcode-widget', - templateUrl: './mobile-app-qrcode-widget.component.html', - styleUrls: ['./mobile-app-qrcode-widget.component.scss'] + selector: 'tb-mobile-app-qrcode-widget', + templateUrl: './mobile-app-qrcode-widget.component.html', + styleUrls: ['./mobile-app-qrcode-widget.component.scss'], + standalone: false }) export class MobileAppQrcodeWidgetComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/multiple-input-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/multiple-input-widget.component.ts index b09d5f9972..5abdbc495e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/multiple-input-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/multiple-input-widget.component.ts @@ -134,9 +134,10 @@ interface MultipleInputWidgetSource { } @Component({ - selector: 'tb-multiple-input-widget ', - templateUrl: './multiple-input-widget.component.html', - styleUrls: ['./multiple-input-widget.component.scss'] + selector: 'tb-multiple-input-widget ', + templateUrl: './multiple-input-widget.component.html', + styleUrls: ['./multiple-input-widget.component.scss'], + standalone: false }) export class MultipleInputWidgetComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/navigation-card-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/navigation-card-widget.component.ts index 6dc1dfe292..089c5e11d7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/navigation-card-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/navigation-card-widget.component.ts @@ -29,9 +29,10 @@ interface NavigationCardWidgetSettings { } @Component({ - selector: 'tb-navigation-card-widget', - templateUrl: './navigation-card-widget.component.html', - styleUrls: ['./navigation-card-widget.component.scss'] + selector: 'tb-navigation-card-widget', + templateUrl: './navigation-card-widget.component.html', + styleUrls: ['./navigation-card-widget.component.scss'], + standalone: false }) export class NavigationCardWidgetComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/navigation-cards-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/navigation-cards-widget.component.ts index f2953630e5..fc1b60f096 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/navigation-cards-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/navigation-cards-widget.component.ts @@ -30,9 +30,10 @@ interface NavigationCardsWidgetSettings { } @Component({ - selector: 'tb-navigation-cards-widget', - templateUrl: './navigation-cards-widget.component.html', - styleUrls: ['./navigation-cards-widget.component.scss'] + selector: 'tb-navigation-cards-widget', + templateUrl: './navigation-cards-widget.component.html', + styleUrls: ['./navigation-cards-widget.component.scss'], + standalone: false }) export class NavigationCardsWidgetComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/photo-camera-input.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/photo-camera-input.component.ts index 98f75da94d..ae3dff1d97 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/photo-camera-input.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/photo-camera-input.component.ts @@ -50,10 +50,11 @@ interface PhotoCameraInputWidgetSettings { // @dynamic @Component({ - selector: 'tb-photo-camera-widget', - templateUrl: './photo-camera-input.component.html', - styleUrls: ['./photo-camera-input.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-photo-camera-widget', + templateUrl: './photo-camera-input.component.html', + styleUrls: ['./photo-camera-input.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class PhotoCameraInputWidgetComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/qrcode-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/qrcode-widget.component.ts index e253485b1b..5426266e35 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/qrcode-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/qrcode-widget.component.ts @@ -44,9 +44,10 @@ interface QrCodeWidgetSettings { type QrCodeTextFunction = (data: FormattedData[]) => string; @Component({ - selector: 'tb-qrcode-widget', - templateUrl: './qrcode-widget.component.html', - styleUrls: [] + selector: 'tb-qrcode-widget', + templateUrl: './qrcode-widget.component.html', + styleUrls: [], + standalone: false }) export class QrCodeWidgetComponent extends PageComponent implements OnInit, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/knob.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/knob.component.ts index 127306db01..cdaff8fd15 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/knob.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/knob.component.ts @@ -30,9 +30,10 @@ import { BasicActionWidgetComponent, ValueSetter } from '@home/components/widget import GenericOptions = CanvasGauges.GenericOptions; @Component({ - selector: 'tb-knob', - templateUrl: './knob.component.html', - styleUrls: ['./knob.component.scss'] + selector: 'tb-knob', + templateUrl: './knob.component.html', + styleUrls: ['./knob.component.scss'], + standalone: false }) export class KnobComponent extends BasicActionWidgetComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/led-indicator.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/led-indicator.component.ts index 8c480e70ef..6230020aa0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/led-indicator.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/led-indicator.component.ts @@ -46,9 +46,10 @@ interface LedIndicatorSettings { } @Component({ - selector: 'tb-led-indicator', - templateUrl: './led-indicator.component.html', - styleUrls: ['./led-indicator.component.scss'] + selector: 'tb-led-indicator', + templateUrl: './led-indicator.component.html', + styleUrls: ['./led-indicator.component.scss'], + standalone: false }) export class LedIndicatorComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-add-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-add-dialog.component.ts index 2f759f7c25..ef00b39a65 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-add-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-add-dialog.component.ts @@ -26,9 +26,10 @@ import { TranslateService } from '@ngx-translate/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-persistent-add-dialog', - templateUrl: './persistent-add-dialog.component.html', - styleUrls: ['./persistent-add-dialog.component.scss'] + selector: 'tb-persistent-add-dialog', + templateUrl: './persistent-add-dialog.component.html', + styleUrls: ['./persistent-add-dialog.component.scss'], + standalone: false }) export class PersistentAddDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-details-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-details-dialog.component.ts index 9eec2c9a37..0cb7e874c4 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-details-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-details-dialog.component.ts @@ -34,9 +34,10 @@ export interface PersistentDetailsDialogData { } @Component({ - selector: 'tb-persistent-details-dialog', - templateUrl: './persistent-details-dialog.component.html', - styleUrls: ['./persistent-details-dialog.component.scss'] + selector: 'tb-persistent-details-dialog', + templateUrl: './persistent-details-dialog.component.html', + styleUrls: ['./persistent-details-dialog.component.scss'], + standalone: false }) export class PersistentDetailsDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-filter-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-filter-panel.component.ts index 1215a60f8c..50eb4dddc9 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-filter-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-filter-panel.component.ts @@ -27,9 +27,10 @@ export interface PersistentFilterPanelData { } @Component({ - selector: 'tb-persistent-filter-panel', - templateUrl: './persistent-filter-panel.component.html', - styleUrls: ['./persistent-filter-panel.component.scss'] + selector: 'tb-persistent-filter-panel', + templateUrl: './persistent-filter-panel.component.html', + styleUrls: ['./persistent-filter-panel.component.scss'], + standalone: false }) export class PersistentFilterPanelComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-table.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-table.component.ts index 0452a07422..225cfe6a4e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-table.component.ts @@ -98,9 +98,10 @@ interface PersistentTableWidgetActionDescriptor extends TableCellButtonActionDes } @Component({ - selector: 'tb-persistent-table-widget', - templateUrl: './persistent-table.component.html', - styleUrls: ['./persistent-table.component.scss' , '../table-widget.scss'] + selector: 'tb-persistent-table-widget', + templateUrl: './persistent-table.component.html', + styleUrls: ['./persistent-table.component.scss', '../table-widget.scss'], + standalone: false }) export class PersistentTableComponent extends PageComponent implements OnInit, OnDestroy, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/power-button-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/power-button-widget.component.ts index 4b7bb9922b..acfb9b209e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/power-button-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/power-button-widget.component.ts @@ -42,10 +42,11 @@ import { SVG, Svg } from '@svgdotjs/svg.js'; import { MatIconRegistry } from '@angular/material/icon'; @Component({ - selector: 'tb-power-button-widget', - templateUrl: './power-button-widget.component.html', - styleUrls: ['../action/action-widget.scss', './power-button-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-power-button-widget', + templateUrl: './power-button-widget.component.html', + styleUrls: ['../action/action-widget.scss', './power-button-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class PowerButtonWidgetComponent extends BasicActionWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/round-switch.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/round-switch.component.ts index 2d9b7b3d19..d397b47e1c 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/round-switch.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/round-switch.component.ts @@ -42,9 +42,10 @@ interface RoundSwitchSettings { } @Component({ - selector: 'tb-round-switch', - templateUrl: './round-switch.component.html', - styleUrls: ['./round-switch.component.scss'] + selector: 'tb-round-switch', + templateUrl: './round-switch.component.html', + styleUrls: ['./round-switch.component.scss'], + standalone: false }) export class RoundSwitchComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/single-switch-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/single-switch-widget.component.ts index 1026d1f73e..ef9c1ff826 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/single-switch-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/single-switch-widget.component.ts @@ -50,10 +50,11 @@ const horizontalLayoutPadding = 48; const verticalLayoutPadding = 36; @Component({ - selector: 'tb-single-switch-widget', - templateUrl: './single-switch-widget.component.html', - styleUrls: ['../action/action-widget.scss', './single-switch-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-single-switch-widget', + templateUrl: './single-switch-widget.component.html', + styleUrls: ['../action/action-widget.scss', './single-switch-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class SingleSwitchWidgetComponent extends BasicActionWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/slider-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/slider-widget.component.ts index 14278c98e4..a1c25cbd39 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/slider-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/slider-widget.component.ts @@ -50,10 +50,11 @@ import tinycolor from 'tinycolor2'; import { UnitService } from '@core/services/unit.service'; @Component({ - selector: 'tb-slider-widget', - templateUrl: './slider-widget.component.html', - styleUrls: ['../action/action-widget.scss', './slider-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-slider-widget', + templateUrl: './slider-widget.component.html', + styleUrls: ['../action/action-widget.scss', './slider-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class SliderWidgetComponent extends BasicActionWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/switch.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/switch.component.ts index 52c1149808..d7056558a3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/switch.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/switch.component.ts @@ -51,9 +51,10 @@ interface SwitchSettings { } @Component({ - selector: 'tb-switch', - templateUrl: './switch.component.html', - styleUrls: ['./switch.component.scss'] + selector: 'tb-switch', + templateUrl: './switch.component.html', + styleUrls: ['./switch.component.scss'], + standalone: false }) export class SwitchComponent extends PageComponent implements AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/value-stepper-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/value-stepper-widget.component.ts index 4c462a5e56..8ccda39a54 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/value-stepper-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/value-stepper-widget.component.ts @@ -57,10 +57,11 @@ import { UtilsService } from '@core/services/utils.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-value-stepper-widget', - templateUrl: './value-stepper-widget.component.html', - styleUrls: ['../action/action-widget.scss', './value-stepper-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-value-stepper-widget', + templateUrl: './value-stepper-widget.component.html', + styleUrls: ['../action/action-widget.scss', './value-stepper-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ValueStepperWidgetComponent extends BasicActionWidgetComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/scada/scada-symbol-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/scada/scada-symbol-widget.component.ts index 2edf94b94f..5e13120800 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/scada/scada-symbol-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/scada/scada-symbol-widget.component.ts @@ -44,10 +44,11 @@ import { MatIconRegistry } from '@angular/material/icon'; import { RafService } from '@core/services/raf.service'; @Component({ - selector: 'tb-scada-symbol-widget', - templateUrl: './scada-symbol-widget.component.html', - styleUrls: ['../action/action-widget.scss', './scada-symbol-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-scada-symbol-widget', + templateUrl: './scada-symbol-widget.component.html', + styleUrls: ['../action/action-widget.scss', './scada-symbol-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ScadaSymbolWidgetComponent implements OnInit, AfterViewInit, OnDestroy, ScadaSymbolObjectCallbacks { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/alarm/alarm-count-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/alarm/alarm-count-widget-settings.component.ts index 449319df59..4c7d90bf77 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/alarm/alarm-count-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/alarm/alarm-count-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { countDefaultSettings } from '@home/components/widget/lib/count/count-widget.models'; @Component({ - selector: 'tb-alarm-count-widget-settings', - templateUrl: './alarm-count-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-alarm-count-widget-settings', + templateUrl: './alarm-count-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class AlarmCountWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/alarm/alarms-table-key-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/alarm/alarms-table-key-settings.component.ts index 3e183bcba6..08cc62b33f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/alarm/alarms-table-key-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/alarm/alarms-table-key-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-alarms-table-key-settings', - templateUrl: './alarms-table-key-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-alarms-table-key-settings', + templateUrl: './alarms-table-key-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class AlarmsTableKeySettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/alarm/alarms-table-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/alarm/alarms-table-widget-settings.component.ts index 7dabd06ea1..79fc3d1f59 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/alarm/alarms-table-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/alarm/alarms-table-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { buildPageStepSizeValues } from '@home/components/widget/lib/table-widget.models'; @Component({ - selector: 'tb-alarms-table-widget-settings', - templateUrl: './alarms-table-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-alarms-table-widget-settings', + templateUrl: './alarms-table-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class AlarmsTableWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/action-button-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/action-button-widget-settings.component.ts index cc7a73294a..6c85eb8e22 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/action-button-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/action-button-widget-settings.component.ts @@ -24,9 +24,10 @@ import { getTargetDeviceFromDatasources } from '@shared/models/widget-settings.m import { actionButtonDefaultSettings } from '@home/components/widget/lib/button/action-button-widget.models'; @Component({ - selector: 'tb-action-button-widget-settings', - templateUrl: './action-button-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-action-button-widget-settings', + templateUrl: './action-button-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class ActionButtonWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/command-button-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/command-button-widget-settings.component.ts index 304d4b91a0..9f82a93285 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/command-button-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/command-button-widget-settings.component.ts @@ -23,9 +23,10 @@ import { ValueType } from '@shared/models/constants'; import { commandButtonDefaultSettings } from '@home/components/widget/lib/button/command-button-widget.models'; @Component({ - selector: 'tb-command-button-widget-settings', - templateUrl: './command-button-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-command-button-widget-settings', + templateUrl: './command-button-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class CommandButtonWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/power-button-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/power-button-widget-settings.component.ts index df83f077d9..4c95654fdb 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/power-button-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/power-button-widget-settings.component.ts @@ -28,9 +28,10 @@ import { } from '@home/components/widget/lib/rpc/power-button-widget.models'; @Component({ - selector: 'tb-power-button-widget-settings', - templateUrl: './power-button-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-power-button-widget-settings', + templateUrl: './power-button-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class PowerButtonWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/segmented-button-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/segmented-button-widget-settings.component.ts index 758be4b07f..a87b9d1917 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/segmented-button-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/segmented-button-widget-settings.component.ts @@ -34,9 +34,10 @@ import { } from '@home/components/widget/lib/button/segmented-button-widget.models'; @Component({ - selector: 'tb-segmented-button-widget-settings', - templateUrl: './segmented-button-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-segmented-button-widget-settings', + templateUrl: './segmented-button-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class SegmentedButtonWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/toggle-button-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/toggle-button-widget-settings.component.ts index c14616ee7f..e8bb057b70 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/toggle-button-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/button/toggle-button-widget-settings.component.ts @@ -25,9 +25,10 @@ import { toggleButtonDefaultSettings } from '@home/components/widget/lib/button/ type ButtonAppearanceType = 'checked' | 'unchecked'; @Component({ - selector: 'tb-toggle-button-widget-settings', - templateUrl: './toggle-button-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-toggle-button-widget-settings', + templateUrl: './toggle-button-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class ToggleButtonWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/aggregated-value-card-key-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/aggregated-value-card-key-settings.component.ts index c1088cecab..0744461c2d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/aggregated-value-card-key-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/aggregated-value-card-key-settings.component.ts @@ -26,9 +26,10 @@ import { } from '@home/components/widget/lib/cards/aggregated-value-card.models'; @Component({ - selector: 'tb-aggregated-value-card-key-settings', - templateUrl: './aggregated-value-card-key-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-aggregated-value-card-key-settings', + templateUrl: './aggregated-value-card-key-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class AggregatedValueCardKeySettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/aggregated-value-card-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/aggregated-value-card-widget-settings.component.ts index 66fdcd0918..e64f47b3b0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/aggregated-value-card-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/aggregated-value-card-widget-settings.component.ts @@ -23,9 +23,10 @@ import { DateFormatProcessor, DateFormatSettings } from '@shared/models/widget-s import { aggregatedValueCardDefaultSettings } from '@home/components/widget/lib/cards/aggregated-value-card.models'; @Component({ - selector: 'tb-aggregated-value-card-widget-settings', - templateUrl: './aggregated-value-card-widget-settings.component.html', - styleUrls: [] + selector: 'tb-aggregated-value-card-widget-settings', + templateUrl: './aggregated-value-card-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class AggregatedValueCardWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/dashboard-state-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/dashboard-state-widget-settings.component.ts index 5fa4a4b5fa..181ef7ddaf 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/dashboard-state-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/dashboard-state-widget-settings.component.ts @@ -23,9 +23,10 @@ import { Observable, of } from 'rxjs'; import { map, mergeMap, startWith } from 'rxjs/operators'; @Component({ - selector: 'tb-dashboard-state-widget-settings', - templateUrl: './dashboard-state-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-dashboard-state-widget-settings', + templateUrl: './dashboard-state-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class DashboardStateWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/edge-quick-overview-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/edge-quick-overview-widget-settings.component.ts index 448476f707..6c6691d65c 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/edge-quick-overview-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/edge-quick-overview-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-edge-quick-overview-widget-settings', - templateUrl: './edge-quick-overview-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-edge-quick-overview-widget-settings', + templateUrl: './edge-quick-overview-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class EdgeQuickOverviewWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/html-card-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/html-card-widget-settings.component.ts index 0fa63f4cd1..4cdb47b1dd 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/html-card-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/html-card-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-html-card-widget-settings', - templateUrl: './html-card-widget-settings.component.html', - styleUrls: [] + selector: 'tb-html-card-widget-settings', + templateUrl: './html-card-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class HtmlCardWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-card-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-card-widget-settings.component.ts index 51342a4944..1472a58ab1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-card-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-card-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { labelCardWidgetDefaultSettings } from '@home/components/widget/lib/cards/label-card-widget.models'; @Component({ - selector: 'tb-label-card-widget-settings', - templateUrl: './label-card-widget-settings.component.html', - styleUrls: [] + selector: 'tb-label-card-widget-settings', + templateUrl: './label-card-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class LabelCardWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-value-card-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-value-card-widget-settings.component.ts index b0aa8139dc..c9177cb78b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-value-card-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-value-card-widget-settings.component.ts @@ -24,9 +24,10 @@ import { formatValue } from '@core/utils'; import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-label-value-card-widget-settings', - templateUrl: './label-value-card-widget-settings.component.html', - styleUrls: [] + selector: 'tb-label-value-card-widget-settings', + templateUrl: './label-value-card-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class LabelValueCardWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-widget-label.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-widget-label.component.ts index 26b995c7a2..f0a6bd1ce4 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-widget-label.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-widget-label.component.ts @@ -32,16 +32,17 @@ export interface LabelWidgetLabel { } @Component({ - selector: 'tb-label-widget-label', - templateUrl: './label-widget-label.component.html', - styleUrls: ['./label-widget-label.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => LabelWidgetLabelComponent), - multi: true - } - ] + selector: 'tb-label-widget-label', + templateUrl: './label-widget-label.component.html', + styleUrls: ['./label-widget-label.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => LabelWidgetLabelComponent), + multi: true + } + ], + standalone: false }) export class LabelWidgetLabelComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-widget-settings.component.ts index 01a8862307..88e3e23cf2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/label-widget-settings.component.ts @@ -23,9 +23,10 @@ import { LabelWidgetLabel } from '@home/components/widget/lib/settings/cards/lab import { CdkDragDrop } from '@angular/cdk/drag-drop'; @Component({ - selector: 'tb-label-widget-settings', - templateUrl: './label-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-label-widget-settings', + templateUrl: './label-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class LabelWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/markdown-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/markdown-widget-settings.component.ts index 997db94c2c..0fed9263e8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/markdown-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/markdown-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-markdown-widget-settings', - templateUrl: './markdown-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-markdown-widget-settings', + templateUrl: './markdown-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class MarkdownWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/mobile-app-qr-code-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/mobile-app-qr-code-widget-settings.component.ts index a4ad7933f3..82aea1e4a1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/mobile-app-qr-code-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/mobile-app-qr-code-widget-settings.component.ts @@ -23,9 +23,10 @@ import { badgePositionTranslationsMap } from '@shared/models/mobile-app.models'; import { mobileAppQrCodeWidgetDefaultSettings } from '@home/components/widget/lib/cards/mobile-app-qr-code-widget.models'; @Component({ - selector: 'tb-mobile-app-qr-code-widget-settings', - templateUrl: './mobile-app-qr-code-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-mobile-app-qr-code-widget-settings', + templateUrl: './mobile-app-qr-code-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class MobileAppQrCodeWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/progress-bar-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/progress-bar-widget-settings.component.ts index e425d17893..80d8c79141 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/progress-bar-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/progress-bar-widget-settings.component.ts @@ -30,9 +30,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-progress-bar-widget-settings', - templateUrl: './progress-bar-widget-settings.component.html', - styleUrls: [] + selector: 'tb-progress-bar-widget-settings', + templateUrl: './progress-bar-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class ProgressBarWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/qrcode-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/qrcode-widget-settings.component.ts index 62fdc7a487..b93a95b75e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/qrcode-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/qrcode-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-qrcode-widget-settings', - templateUrl: './qrcode-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-qrcode-widget-settings', + templateUrl: './qrcode-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class QrCodeWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/simple-card-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/simple-card-widget-settings.component.ts index e6e796e863..54722150f2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/simple-card-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/simple-card-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-simple-card-widget-settings', - templateUrl: './simple-card-widget-settings.component.html', - styleUrls: [] + selector: 'tb-simple-card-widget-settings', + templateUrl: './simple-card-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class SimpleCardWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-key-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-key-settings.component.ts index e8ab4f73fa..e49cb5b4e4 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-key-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-key-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-timeseries-table-key-settings', - templateUrl: './timeseries-table-key-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-timeseries-table-key-settings', + templateUrl: './timeseries-table-key-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class TimeseriesTableKeySettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-latest-key-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-latest-key-settings.component.ts index 842cf779e6..918ff9a7b8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-latest-key-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-latest-key-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-timeseries-table-latest-key-settings', - templateUrl: './timeseries-table-latest-key-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-timeseries-table-latest-key-settings', + templateUrl: './timeseries-table-latest-key-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class TimeseriesTableLatestKeySettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-widget-settings.component.ts index 0ed98e1758..494963fa53 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { buildPageStepSizeValues } from '@home/components/widget/lib/table-widget.models'; @Component({ - selector: 'tb-timeseries-table-widget-settings', - templateUrl: './timeseries-table-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-timeseries-table-widget-settings', + templateUrl: './timeseries-table-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class TimeseriesTableWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/unread-notification-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/unread-notification-widget-settings.component.ts index 6a4482012e..c0baba8794 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/unread-notification-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/unread-notification-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { unreadNotificationDefaultSettings } from '@home/components/widget/lib/cards/unread-notification-widget.models'; @Component({ - selector: 'tb-unread-notification-widget-settings', - templateUrl: './unread-notification-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-unread-notification-widget-settings', + templateUrl: './unread-notification-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class UnreadNotificationWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/value-card-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/value-card-widget-settings.component.ts index 18ba0bdca9..00614b7f40 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/value-card-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/value-card-widget-settings.component.ts @@ -32,9 +32,10 @@ import { DateFormatProcessor, DateFormatSettings, getLabel } from '@shared/model import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-value-card-widget-settings', - templateUrl: './value-card-widget-settings.component.html', - styleUrls: [] + selector: 'tb-value-card-widget-settings', + templateUrl: './value-card-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class ValueCardWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/value-chart-card-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/value-chart-card-widget-settings.component.ts index 46878d0fcd..d218757030 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/value-chart-card-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/value-chart-card-widget-settings.component.ts @@ -29,9 +29,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-value-chart-card-widget-settings', - templateUrl: './value-chart-card-widget-settings.component.html', - styleUrls: [] + selector: 'tb-value-chart-card-widget-settings', + templateUrl: './value-chart-card-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class ValueChartCardWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/bar-chart-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/bar-chart-widget-settings.component.ts index ace61904cc..432007de53 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/bar-chart-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/bar-chart-widget-settings.component.ts @@ -28,9 +28,10 @@ import { } from '@home/components/widget/lib/settings/chart/latest-chart-widget-settings.component'; @Component({ - selector: 'tb-bar-chart-widget-settings', - templateUrl: './latest-chart-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-bar-chart-widget-settings', + templateUrl: './latest-chart-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class BarChartWidgetSettingsComponent extends LatestChartWidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/bar-chart-with-labels-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/bar-chart-with-labels-widget-settings.component.ts index cc0c5c03cd..6290572770 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/bar-chart-with-labels-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/bar-chart-with-labels-widget-settings.component.ts @@ -33,9 +33,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-bar-chart-with-labels-widget-settings', - templateUrl: './bar-chart-with-labels-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-bar-chart-with-labels-widget-settings', + templateUrl: './bar-chart-with-labels-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class BarChartWithLabelsWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/chart-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/chart-widget-settings.component.ts index 7152a6a39e..50d407948b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/chart-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/chart-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-chart-widget-settings', - templateUrl: './chart-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-chart-widget-settings', + templateUrl: './chart-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class ChartWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/doughnut-chart-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/doughnut-chart-widget-settings.component.ts index 12e39a52d7..88226f4c28 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/doughnut-chart-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/doughnut-chart-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-doughnut-chart-widget-settings', - templateUrl: './doughnut-chart-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-doughnut-chart-widget-settings', + templateUrl: './doughnut-chart-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class DoughnutChartWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/doughnut-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/doughnut-widget-settings.component.ts index 6ba0508c95..17a0d60aab 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/doughnut-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/doughnut-widget-settings.component.ts @@ -29,9 +29,10 @@ import { } from '@home/components/widget/lib/settings/chart/latest-chart-widget-settings.component'; @Component({ - selector: 'tb-doughnut-widget-settings', - templateUrl: './latest-chart-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-doughnut-widget-settings', + templateUrl: './latest-chart-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class DoughnutWidgetSettingsComponent extends LatestChartWidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-bar-key-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-bar-key-settings.component.ts index bc2e7c22db..b2c0a34596 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-bar-key-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-bar-key-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { flotDataKeyDefaultSettings } from '@home/components/widget/lib/settings/chart/flot-key-settings.component'; @Component({ - selector: 'tb-flot-bar-key-settings', - templateUrl: './flot-bar-key-settings.component.html', - styleUrls: [] + selector: 'tb-flot-bar-key-settings', + templateUrl: './flot-bar-key-settings.component.html', + styleUrls: [], + standalone: false }) export class FlotBarKeySettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-bar-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-bar-widget-settings.component.ts index c6720ecd13..c74fad3cda 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-bar-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-bar-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { flotDefaultSettings } from '@home/components/widget/lib/settings/chart/flot-widget-settings.component'; @Component({ - selector: 'tb-flot-bar-widget-settings', - templateUrl: './flot-bar-widget-settings.component.html', - styleUrls: [] + selector: 'tb-flot-bar-widget-settings', + templateUrl: './flot-bar-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class FlotBarWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-key-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-key-settings.component.ts index e5711e4af3..cd46662ae5 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-key-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-key-settings.component.ts @@ -91,21 +91,22 @@ export function flotDataKeyDefaultSettings(chartType: ChartType): TbFlotKeySetti } @Component({ - selector: 'tb-flot-key-settings', - templateUrl: './flot-key-settings.component.html', - styleUrls: ['./../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => FlotKeySettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => FlotKeySettingsComponent), - multi: true, - } - ] + selector: 'tb-flot-key-settings', + templateUrl: './flot-key-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FlotKeySettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => FlotKeySettingsComponent), + multi: true, + } + ], + standalone: false }) export class FlotKeySettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-latest-key-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-latest-key-settings.component.ts index cc7842386e..78897b5db0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-latest-key-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-latest-key-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-flot-latest-key-settings', - templateUrl: './flot-latest-key-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-flot-latest-key-settings', + templateUrl: './flot-latest-key-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class FlotLatestKeySettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-line-key-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-line-key-settings.component.ts index 74b6ae9839..2b972a0d89 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-line-key-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-line-key-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { flotDataKeyDefaultSettings } from '@home/components/widget/lib/settings/chart/flot-key-settings.component'; @Component({ - selector: 'tb-flot-line-key-settings', - templateUrl: './flot-line-key-settings.component.html', - styleUrls: [] + selector: 'tb-flot-line-key-settings', + templateUrl: './flot-line-key-settings.component.html', + styleUrls: [], + standalone: false }) export class FlotLineKeySettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-line-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-line-widget-settings.component.ts index ca01b3cbc5..3c4882a3c8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-line-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-line-widget-settings.component.ts @@ -23,9 +23,10 @@ import { flotDefaultSettings } from '@home/components/widget/lib/settings/chart/ import { deepClone } from '@core/utils'; @Component({ - selector: 'tb-flot-line-widget-settings', - templateUrl: './flot-line-widget-settings.component.html', - styleUrls: [] + selector: 'tb-flot-line-widget-settings', + templateUrl: './flot-line-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class FlotLineWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-pie-key-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-pie-key-settings.component.ts index 9d8674dddf..39f6b3333a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-pie-key-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-pie-key-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-flot-pie-key-settings', - templateUrl: './flot-pie-key-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-flot-pie-key-settings', + templateUrl: './flot-pie-key-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class FlotPieKeySettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-pie-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-pie-widget-settings.component.ts index 78147a4d52..98ac711499 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-pie-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-pie-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-flot-pie-widget-settings', - templateUrl: './flot-pie-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-flot-pie-widget-settings', + templateUrl: './flot-pie-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class FlotPieWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-threshold.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-threshold.component.ts index 0ebe86668b..b8accc637b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-threshold.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-threshold.component.ts @@ -40,17 +40,18 @@ import { TbFlotKeyThreshold } from '@home/components/widget/lib/flot-widget.mode import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-flot-threshold', - templateUrl: './flot-threshold.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => FlotThresholdComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-flot-threshold', + templateUrl: './flot-threshold.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FlotThresholdComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class FlotThresholdComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-widget-settings.component.ts index 73b5248f04..65fc17df26 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/flot-widget-settings.component.ts @@ -106,21 +106,22 @@ export const flotDefaultSettings = (chartType: ChartType): Partial FlotWidgetSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => FlotWidgetSettingsComponent), - multi: true, - } - ] + selector: 'tb-flot-widget-settings', + templateUrl: './flot-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FlotWidgetSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => FlotWidgetSettingsComponent), + multi: true, + } + ], + standalone: false }) export class FlotWidgetSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/label-data-key.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/label-data-key.component.ts index 6d2b50824b..71e1163d16 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/label-data-key.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/label-data-key.component.ts @@ -46,16 +46,17 @@ export function labelDataKeyValidator(control: AbstractControl): ValidationError } @Component({ - selector: 'tb-label-data-key', - templateUrl: './label-data-key.component.html', - styleUrls: ['./label-data-key.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => LabelDataKeyComponent), - multi: true - } - ] + selector: 'tb-label-data-key', + templateUrl: './label-data-key.component.html', + styleUrls: ['./label-data-key.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => LabelDataKeyComponent), + multi: true + } + ], + standalone: false }) export class LabelDataKeyComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/pie-chart-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/pie-chart-widget-settings.component.ts index 85db032513..9a7c2318bf 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/pie-chart-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/pie-chart-widget-settings.component.ts @@ -28,9 +28,10 @@ import { } from '@home/components/widget/lib/settings/chart/latest-chart-widget-settings.component'; @Component({ - selector: 'tb-pie-chart-widget-settings', - templateUrl: './latest-chart-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-pie-chart-widget-settings', + templateUrl: './latest-chart-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class PieChartWidgetSettingsComponent extends LatestChartWidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/polar-area-chart-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/polar-area-chart-widget-settings.component.ts index f452fee0bf..e941e27f13 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/polar-area-chart-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/polar-area-chart-widget-settings.component.ts @@ -28,9 +28,10 @@ import { } from '@home/components/widget/lib/settings/chart/latest-chart-widget-settings.component'; @Component({ - selector: 'tb-polar-area-chart-widget-settings', - templateUrl: './latest-chart-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-polar-area-chart-widget-settings', + templateUrl: './latest-chart-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class PolarAreaChartWidgetSettingsComponent extends LatestChartWidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/radar-chart-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/radar-chart-widget-settings.component.ts index 6e15a4c2bc..f9d3128027 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/radar-chart-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/radar-chart-widget-settings.component.ts @@ -28,9 +28,10 @@ import { } from '@home/components/widget/lib/settings/chart/latest-chart-widget-settings.component'; @Component({ - selector: 'tb-radar-chart-widget-settings', - templateUrl: './latest-chart-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-radar-chart-widget-settings', + templateUrl: './latest-chart-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class RadarChartWidgetSettingsComponent extends LatestChartWidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/range-chart-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/range-chart-widget-settings.component.ts index 5b1b20c2fd..703c621d62 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/range-chart-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/range-chart-widget-settings.component.ts @@ -43,9 +43,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-range-chart-widget-settings', - templateUrl: './range-chart-widget-settings.component.html', - styleUrls: [] + selector: 'tb-range-chart-widget-settings', + templateUrl: './range-chart-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class RangeChartWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/time-series-chart-key-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/time-series-chart-key-settings.component.ts index 3c99b96c07..34b0edb6ae 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/time-series-chart-key-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/time-series-chart-key-settings.component.ts @@ -35,9 +35,10 @@ import { TimeSeriesChartWidgetSettings } from '@home/components/widget/lib/chart import { WidgetService } from '@core/http/widget.service'; @Component({ - selector: 'tb-time-series-chart-key-settings', - templateUrl: './time-series-chart-key-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-time-series-chart-key-settings', + templateUrl: './time-series-chart-key-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class TimeSeriesChartKeySettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/time-series-chart-line-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/time-series-chart-line-settings.component.ts index 05afef0af8..c2e024bb55 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/time-series-chart-line-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/time-series-chart-line-settings.component.ts @@ -45,16 +45,17 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { getSourceTbUnitSymbol, isNotEmptyTbUnits } from '@shared/models/unit.models'; @Component({ - selector: 'tb-time-series-chart-line-settings', - templateUrl: './time-series-chart-line-settings.component.html', - styleUrls: ['./../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeSeriesChartLineSettingsComponent), - multi: true - } - ] + selector: 'tb-time-series-chart-line-settings', + templateUrl: './time-series-chart-line-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeSeriesChartLineSettingsComponent), + multi: true + } + ], + standalone: false }) export class TimeSeriesChartLineSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/time-series-chart-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/time-series-chart-widget-settings.component.ts index 4abc0bf437..8a96f31445 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/time-series-chart-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/chart/time-series-chart-widget-settings.component.ts @@ -42,9 +42,10 @@ import { WidgetService } from '@core/http/widget.service'; import { TimeSeriesChartTooltipTrigger } from '@home/components/widget/lib/chart/time-series-chart-tooltip.models'; @Component({ - selector: 'tb-time-series-chart-widget-settings', - templateUrl: './time-series-chart-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-time-series-chart-widget-settings', + templateUrl: './time-series-chart-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class TimeSeriesChartWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/custom-action-pretty-editor.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/custom-action-pretty-editor.component.ts index 97d7bfed25..2537cbe310 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/custom-action-pretty-editor.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/custom-action-pretty-editor.component.ts @@ -32,17 +32,18 @@ import { } from '@home/components/widget/lib/settings/common/action/custom-action.models'; @Component({ - selector: 'tb-custom-action-pretty-editor', - templateUrl: './custom-action-pretty-editor.component.html', - styleUrls: ['./custom-action-pretty-editor.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CustomActionPrettyEditorComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-custom-action-pretty-editor', + templateUrl: './custom-action-pretty-editor.component.html', + styleUrls: ['./custom-action-pretty-editor.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CustomActionPrettyEditorComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class CustomActionPrettyEditorComponent implements AfterViewInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/custom-action-pretty-resources-tabs.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/custom-action-pretty-resources-tabs.component.ts index 7cc295e94e..dfd03e406b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/custom-action-pretty-resources-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/custom-action-pretty-resources-tabs.component.ts @@ -41,10 +41,11 @@ import { getAce } from '@shared/models/ace/ace.models'; import { beautifyCss, beautifyHtml } from '@shared/models/beautify.models'; @Component({ - selector: 'tb-custom-action-pretty-resources-tabs', - templateUrl: './custom-action-pretty-resources-tabs.component.html', - styleUrls: ['./custom-action-pretty-resources-tabs.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-custom-action-pretty-resources-tabs', + templateUrl: './custom-action-pretty-resources-tabs.component.html', + styleUrls: ['./custom-action-pretty-resources-tabs.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class CustomActionPrettyResourcesTabsComponent extends PageComponent implements OnInit, OnChanges, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/get-value-action-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/get-value-action-settings-panel.component.ts index 96915e5712..cb384248c5 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/get-value-action-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/get-value-action-settings-panel.component.ts @@ -38,11 +38,12 @@ import { EntityType } from '@shared/models/entity-type.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-get-value-action-settings-panel', - templateUrl: './get-value-action-settings-panel.component.html', - providers: [], - styleUrls: ['./action-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-get-value-action-settings-panel', + templateUrl: './get-value-action-settings-panel.component.html', + providers: [], + styleUrls: ['./action-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class GetValueActionSettingsPanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/get-value-action-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/get-value-action-settings.component.ts index d27efc1081..8b1e18a917 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/get-value-action-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/get-value-action-settings.component.ts @@ -38,17 +38,18 @@ import { IAliasController } from '@core/api/widget-api.models'; import { TargetDevice, widgetType } from '@shared/models/widget.models'; @Component({ - selector: 'tb-get-value-action-settings', - templateUrl: './action-settings-button.component.html', - styleUrls: ['./action-settings-button.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => GetValueActionSettingsComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-get-value-action-settings', + templateUrl: './action-settings-button.component.html', + styleUrls: ['./action-settings-button.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => GetValueActionSettingsComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class GetValueActionSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/map-item-tooltips.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/map-item-tooltips.component.ts index c6f60c1892..9a4ba9b2aa 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/map-item-tooltips.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/map-item-tooltips.component.ts @@ -21,15 +21,16 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { deepTrim, isEqual } from '@core/utils'; @Component({ - selector: 'tb-map-item-tooltips', - templateUrl: './map-item-tooltips.component.html', - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapItemTooltipsComponent), - multi: true - } - ] + selector: 'tb-map-item-tooltips', + templateUrl: './map-item-tooltips.component.html', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapItemTooltipsComponent), + multi: true + } + ], + standalone: false }) export class MapItemTooltipsComponent implements ControlValueAccessor, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/mobile-action-editor.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/mobile-action-editor.component.ts index a30e7a8adc..469bbf95c7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/mobile-action-editor.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/mobile-action-editor.component.ts @@ -46,14 +46,15 @@ import { TbFunction } from '@shared/models/js-function.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-mobile-action-editor', - templateUrl: './mobile-action-editor.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MobileActionEditorComponent), - multi: true - }] + selector: 'tb-mobile-action-editor', + templateUrl: './mobile-action-editor.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MobileActionEditorComponent), + multi: true + }], + standalone: false }) export class MobileActionEditorComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/set-value-action-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/set-value-action-settings-panel.component.ts index 17a3ae5b6c..a778b9a509 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/set-value-action-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/set-value-action-settings-panel.component.ts @@ -36,11 +36,12 @@ import { ValueType } from '@shared/models/constants'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-set-value-action-settings-panel', - templateUrl: './set-value-action-settings-panel.component.html', - providers: [], - styleUrls: ['./action-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-set-value-action-settings-panel', + templateUrl: './set-value-action-settings-panel.component.html', + providers: [], + styleUrls: ['./action-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class SetValueActionSettingsPanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/set-value-action-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/set-value-action-settings.component.ts index 30202ed551..6e9950033b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/set-value-action-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/set-value-action-settings.component.ts @@ -39,17 +39,18 @@ import { import { ValueType } from '@shared/models/constants'; @Component({ - selector: 'tb-set-value-action-settings', - templateUrl: './action-settings-button.component.html', - styleUrls: ['./action-settings-button.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => SetValueActionSettingsComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-set-value-action-settings', + templateUrl: './action-settings-button.component.html', + styleUrls: ['./action-settings-button.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SetValueActionSettingsComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class SetValueActionSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action-settings-panel.component.ts index c43b36e014..f0ba6f05ce 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action-settings-panel.component.ts @@ -23,11 +23,12 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { TranslateService } from '@ngx-translate/core'; @Component({ - selector: 'tb-widget-action-settings-panel', - templateUrl: './widget-action-settings-panel.component.html', - providers: [], - styleUrls: ['./action-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-widget-action-settings-panel', + templateUrl: './widget-action-settings-panel.component.html', + providers: [], + styleUrls: ['./action-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class WidgetActionSettingsPanelComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action-settings.component.ts index f60a7f1d3c..737fafd75a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action-settings.component.ts @@ -41,17 +41,18 @@ import { } from '@home/components/widget/lib/settings/common/action/widget-action-settings-panel.component'; @Component({ - selector: 'tb-widget-action-settings', - templateUrl: './action-settings-button.component.html', - styleUrls: ['./action-settings-button.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => WidgetActionSettingsComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-widget-action-settings', + templateUrl: './action-settings-button.component.html', + styleUrls: ['./action-settings-button.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => WidgetActionSettingsComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class WidgetActionSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action.component.ts index 09bddd26dd..9efb80081e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action.component.ts @@ -66,21 +66,22 @@ const stateDisplayTypesTranslations = new Map( ); @Component({ - selector: 'tb-widget-action', - templateUrl: './widget-action.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => WidgetActionComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => WidgetActionComponent), - multi: true, - } - ] + selector: 'tb-widget-action', + templateUrl: './widget-action.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => WidgetActionComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => WidgetActionComponent), + multi: true, + } + ], + standalone: false }) export class WidgetActionComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/advanced-range.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/advanced-range.component.ts index c1e5114eb6..d2f1544014 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/advanced-range.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/advanced-range.component.ts @@ -32,16 +32,17 @@ import { Datasource } from '@shared/models/widget.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-advanced-range', - templateUrl: './advanced-range.component.html', - styleUrls: ['./advanced-range.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AdvancedRangeComponent), - multi: true - } - ] + selector: 'tb-advanced-range', + templateUrl: './advanced-range.component.html', + styleUrls: ['./advanced-range.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AdvancedRangeComponent), + multi: true + } + ], + standalone: false }) export class AdvancedRangeComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/alias/entity-alias-select.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/alias/entity-alias-select.component.ts index 7c374e9654..0b2cacd6da 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/alias/entity-alias-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/alias/entity-alias-select.component.ts @@ -39,14 +39,15 @@ import { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form- import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-entity-alias-select', - templateUrl: './entity-alias-select.component.html', - styleUrls: ['./entity-alias-select.component.scss'], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => EntityAliasSelectComponent), - multi: true - }] + selector: 'tb-entity-alias-select', + templateUrl: './entity-alias-select.component.html', + styleUrls: ['./entity-alias-select.component.scss'], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => EntityAliasSelectComponent), + multi: true + }], + standalone: false }) export class EntityAliasSelectComponent implements ControlValueAccessor, OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/auto-date-format-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/auto-date-format-settings-panel.component.ts index 01f16eccc1..ab0ab9fa4b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/auto-date-format-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/auto-date-format-settings-panel.component.ts @@ -30,11 +30,12 @@ import { DatePipe } from '@angular/common'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-auto-date-format-settings-panel', - templateUrl: './auto-date-format-settings-panel.component.html', - providers: [], - styleUrls: ['./auto-date-format-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-auto-date-format-settings-panel', + templateUrl: './auto-date-format-settings-panel.component.html', + providers: [], + styleUrls: ['./auto-date-format-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class AutoDateFormatSettingsPanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/auto-date-format-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/auto-date-format-settings.component.ts index 8d3dadb56d..59a145c66f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/auto-date-format-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/auto-date-format-settings.component.ts @@ -25,16 +25,17 @@ import { } from '@home/components/widget/lib/settings/common/auto-date-format-settings-panel.component'; @Component({ - selector: 'tb-auto-date-format-settings', - templateUrl: './auto-date-format-settings.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AutoDateFormatSettingsComponent), - multi: true - } - ] + selector: 'tb-auto-date-format-settings', + templateUrl: './auto-date-format-settings.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AutoDateFormatSettingsComponent), + multi: true + } + ], + standalone: false }) export class AutoDateFormatSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings-panel.component.ts index b1ee8ff332..323241e0f2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings-panel.component.ts @@ -42,11 +42,12 @@ import { DomSanitizer } from '@angular/platform-browser'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-background-settings-panel', - templateUrl: './background-settings-panel.component.html', - providers: [], - styleUrls: ['./background-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-background-settings-panel', + templateUrl: './background-settings-panel.component.html', + providers: [], + styleUrls: ['./background-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class BackgroundSettingsPanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings.component.ts index 94737fa3b1..fd15e6da1a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings.component.ts @@ -43,17 +43,18 @@ import { DomSanitizer } from '@angular/platform-browser'; import { tap } from 'rxjs/operators'; @Component({ - selector: 'tb-background-settings', - templateUrl: './background-settings.component.html', - styleUrls: ['./background-settings.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => BackgroundSettingsComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-background-settings', + templateUrl: './background-settings.component.html', + styleUrls: ['./background-settings.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => BackgroundSettingsComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class BackgroundSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-appearance.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-appearance.component.ts index 61f84d8029..41cfbcc3d2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-appearance.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-appearance.component.ts @@ -28,17 +28,18 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-widget-button-appearance', - templateUrl: './widget-button-appearance.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => WidgetButtonAppearanceComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-widget-button-appearance', + templateUrl: './widget-button-appearance.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => WidgetButtonAppearanceComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class WidgetButtonAppearanceComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-custom-style-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-custom-style-panel.component.ts index f4d11a9d2f..1fc3c4f20c 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-custom-style-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-custom-style-panel.component.ts @@ -46,11 +46,12 @@ import { WidgetButtonComponent } from '@shared/components/button/widget-button.c import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-widget-button-custom-style-panel', - templateUrl: './widget-button-custom-style-panel.component.html', - providers: [], - styleUrls: ['./widget-button-custom-style-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-widget-button-custom-style-panel', + templateUrl: './widget-button-custom-style-panel.component.html', + providers: [], + styleUrls: ['./widget-button-custom-style-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class WidgetButtonCustomStylePanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-custom-style.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-custom-style.component.ts index 9f54623698..72d3d5e5fd 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-custom-style.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-custom-style.component.ts @@ -40,17 +40,18 @@ import { import { deepClone } from '@core/utils'; @Component({ - selector: 'tb-widget-button-custom-style', - templateUrl: './widget-button-custom-style.component.html', - styleUrls: ['./widget-button-custom-style.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => WidgetButtonCustomStyleComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-widget-button-custom-style', + templateUrl: './widget-button-custom-style.component.html', + styleUrls: ['./widget-button-custom-style.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => WidgetButtonCustomStyleComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class WidgetButtonCustomStyleComponent implements OnInit, OnChanges, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-toggle-custom-style-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-toggle-custom-style-panel.component.ts index 6ba1021b5c..6502548bf2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-toggle-custom-style-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-toggle-custom-style-panel.component.ts @@ -48,11 +48,12 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-widget-button-toggle-custom-style-panel', - templateUrl: './widget-button-toggle-custom-style-panel.component.html', - providers: [], - styleUrls: ['./widget-button-toggle-custom-style-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-widget-button-toggle-custom-style-panel', + templateUrl: './widget-button-toggle-custom-style-panel.component.html', + providers: [], + styleUrls: ['./widget-button-toggle-custom-style-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class WidgetButtonToggleCustomStylePanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-toggle-custom-style.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-toggle-custom-style.component.ts index 4d7767f04a..af93d58722 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-toggle-custom-style.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-toggle-custom-style.component.ts @@ -40,17 +40,18 @@ import { } from '@home/components/widget/lib/settings/common/button/widget-button-toggle-custom-style-panel.component'; @Component({ - selector: 'tb-widget-button-toggle-custom-style', - templateUrl: './widget-button-toggle-custom-style.component.html', - styleUrls: ['./widget-button-toggle-custom-style.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => WidgetButtonToggleCustomStyleComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-widget-button-toggle-custom-style', + templateUrl: './widget-button-toggle-custom-style.component.html', + styleUrls: ['./widget-button-toggle-custom-style.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => WidgetButtonToggleCustomStyleComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class WidgetButtonToggleCustomStyleComponent implements OnInit, OnChanges, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/chart-animation-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/chart-animation-settings.component.ts index d5cab573ed..61374113bf 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/chart-animation-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/chart-animation-settings.component.ts @@ -26,16 +26,17 @@ import { chartAnimationEasings, ChartAnimationSettings } from '@home/components/ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-chart-animation-settings', - templateUrl: './chart-animation-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ChartAnimationSettingsComponent), - multi: true - } - ] + selector: 'tb-chart-animation-settings', + templateUrl: './chart-animation-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ChartAnimationSettingsComponent), + multi: true + } + ], + standalone: false }) export class ChartAnimationSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/chart-bar-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/chart-bar-settings.component.ts index ca60fe0db2..4a652e84b5 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/chart-bar-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/chart-bar-settings.component.ts @@ -41,16 +41,17 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { getSourceTbUnitSymbol, isNotEmptyTbUnits } from '@shared/models/unit.models'; @Component({ - selector: 'tb-chart-bar-settings', - templateUrl: './chart-bar-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ChartBarSettingsComponent), - multi: true - } - ] + selector: 'tb-chart-bar-settings', + templateUrl: './chart-bar-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ChartBarSettingsComponent), + multi: true + } + ], + standalone: false }) export class ChartBarSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/chart-fill-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/chart-fill-settings.component.ts index e85c8bb226..f980264f4a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/chart-fill-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/chart-fill-settings.component.ts @@ -33,16 +33,17 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-chart-fill-settings', - templateUrl: './chart-fill-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ChartFillSettingsComponent), - multi: true - } - ] + selector: 'tb-chart-fill-settings', + templateUrl: './chart-fill-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ChartFillSettingsComponent), + multi: true + } + ], + standalone: false }) export class ChartFillSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings-button.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings-button.component.ts index de1ef16a43..5aad0ab4f1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings-button.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings-button.component.ts @@ -25,16 +25,17 @@ import { } from '@home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings-panel.component'; @Component({ - selector: 'tb-time-series-chart-axis-settings-button', - templateUrl: './time-series-chart-axis-settings-button.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeSeriesChartAxisSettingsButtonComponent), - multi: true - } - ] + selector: 'tb-time-series-chart-axis-settings-button', + templateUrl: './time-series-chart-axis-settings-button.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeSeriesChartAxisSettingsButtonComponent), + multi: true + } + ], + standalone: false }) export class TimeSeriesChartAxisSettingsButtonComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings-panel.component.ts index 53bed97847..6d55817b1a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings-panel.component.ts @@ -24,11 +24,12 @@ import { import { coerceBoolean } from '@shared/decorators/coercion'; @Component({ - selector: 'tb-time-series-chart-axis-settings-panel', - templateUrl: './time-series-chart-axis-settings-panel.component.html', - providers: [], - styleUrls: ['./time-series-chart-axis-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-time-series-chart-axis-settings-panel', + templateUrl: './time-series-chart-axis-settings-panel.component.html', + providers: [], + styleUrls: ['./time-series-chart-axis-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class TimeSeriesChartAxisSettingsPanelComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings.component.ts index b713a6335f..1d7a4a2c37 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-axis-settings.component.ts @@ -34,16 +34,17 @@ import { WidgetService } from '@core/http/widget.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-time-series-chart-axis-settings', - templateUrl: './time-series-chart-axis-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeSeriesChartAxisSettingsComponent), - multi: true - } - ] + selector: 'tb-time-series-chart-axis-settings', + templateUrl: './time-series-chart-axis-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeSeriesChartAxisSettingsComponent), + multi: true + } + ], + standalone: false }) export class TimeSeriesChartAxisSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-grid-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-grid-settings.component.ts index 1ad240f8b0..7dd1354cd0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-grid-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-grid-settings.component.ts @@ -27,16 +27,17 @@ import { WidgetService } from '@core/http/widget.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-time-series-chart-grid-settings', - templateUrl: './time-series-chart-grid-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeSeriesChartGridSettingsComponent), - multi: true - } - ] + selector: 'tb-time-series-chart-grid-settings', + templateUrl: './time-series-chart-grid-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeSeriesChartGridSettingsComponent), + multi: true + } + ], + standalone: false }) export class TimeSeriesChartGridSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-state-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-state-row.component.ts index 1e48cb6def..b3997331f8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-state-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-state-row.component.ts @@ -41,17 +41,18 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-time-series-chart-state-row', - templateUrl: './time-series-chart-state-row.component.html', - styleUrls: ['./time-series-chart-state-row.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeSeriesChartStateRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-time-series-chart-state-row', + templateUrl: './time-series-chart-state-row.component.html', + styleUrls: ['./time-series-chart-state-row.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeSeriesChartStateRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class TimeSeriesChartStateRowComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-states-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-states-panel.component.ts index 1de5e8019f..aaa9d6d9f0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-states-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-states-panel.component.ts @@ -35,22 +35,23 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-time-series-chart-states-panel', - templateUrl: './time-series-chart-states-panel.component.html', - styleUrls: ['./time-series-chart-states-panel.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeSeriesChartStatesPanelComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TimeSeriesChartStatesPanelComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-time-series-chart-states-panel', + templateUrl: './time-series-chart-states-panel.component.html', + styleUrls: ['./time-series-chart-states-panel.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeSeriesChartStatesPanelComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TimeSeriesChartStatesPanelComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class TimeSeriesChartStatesPanelComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-threshold-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-threshold-row.component.ts index 37ae10c330..136ad2c728 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-threshold-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-threshold-row.component.ts @@ -56,17 +56,18 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-time-series-chart-threshold-row', - templateUrl: './time-series-chart-threshold-row.component.html', - styleUrls: ['./time-series-chart-threshold-row.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeSeriesChartThresholdRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-time-series-chart-threshold-row', + templateUrl: './time-series-chart-threshold-row.component.html', + styleUrls: ['./time-series-chart-threshold-row.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeSeriesChartThresholdRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class TimeSeriesChartThresholdRowComponent implements ControlValueAccessor, OnInit, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-threshold-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-threshold-settings-panel.component.ts index 916ba3dd53..57001605a6 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-threshold-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-threshold-settings-panel.component.ts @@ -38,11 +38,12 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { getSourceTbUnitSymbol, isNotEmptyTbUnits, TbUnit } from '@shared/models/unit.models'; @Component({ - selector: 'tb-time-series-chart-threshold-settings-panel', - templateUrl: './time-series-chart-threshold-settings-panel.component.html', - providers: [], - styleUrls: ['./time-series-chart-threshold-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-time-series-chart-threshold-settings-panel', + templateUrl: './time-series-chart-threshold-settings-panel.component.html', + providers: [], + styleUrls: ['./time-series-chart-threshold-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class TimeSeriesChartThresholdSettingsPanelComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-threshold-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-threshold-settings.component.ts index 1757b14b77..3195c3a944 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-threshold-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-threshold-settings.component.ts @@ -30,16 +30,17 @@ import { } from '@home/components/widget/lib/settings/common/chart/time-series-chart-threshold-settings-panel.component'; @Component({ - selector: 'tb-time-series-chart-threshold-settings', - templateUrl: './time-series-chart-threshold-settings.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeSeriesChartThresholdSettingsComponent), - multi: true - } - ] + selector: 'tb-time-series-chart-threshold-settings', + templateUrl: './time-series-chart-threshold-settings.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeSeriesChartThresholdSettingsComponent), + multi: true + } + ], + standalone: false }) export class TimeSeriesChartThresholdSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-thresholds-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-thresholds-panel.component.ts index f7b9e157e1..944c28b4d8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-thresholds-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-thresholds-panel.component.ts @@ -43,22 +43,23 @@ import { ValueSourceType } from '@shared/models/widget-settings.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-time-series-chart-thresholds-panel', - templateUrl: './time-series-chart-thresholds-panel.component.html', - styleUrls: ['./time-series-chart-thresholds-panel.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeSeriesChartThresholdsPanelComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TimeSeriesChartThresholdsPanelComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-time-series-chart-thresholds-panel', + templateUrl: './time-series-chart-thresholds-panel.component.html', + styleUrls: ['./time-series-chart-thresholds-panel.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeSeriesChartThresholdsPanelComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TimeSeriesChartThresholdsPanelComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class TimeSeriesChartThresholdsPanelComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-y-axes-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-y-axes-panel.component.ts index 8a229d0a7b..de7b19deba 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-y-axes-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-y-axes-panel.component.ts @@ -49,22 +49,23 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-time-series-chart-y-axes-panel', - templateUrl: './time-series-chart-y-axes-panel.component.html', - styleUrls: ['./time-series-chart-y-axes-panel.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeSeriesChartYAxesPanelComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TimeSeriesChartYAxesPanelComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-time-series-chart-y-axes-panel', + templateUrl: './time-series-chart-y-axes-panel.component.html', + styleUrls: ['./time-series-chart-y-axes-panel.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeSeriesChartYAxesPanelComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TimeSeriesChartYAxesPanelComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class TimeSeriesChartYAxesPanelComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-y-axis-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-y-axis-row.component.ts index 7c7daea095..67ec499ab1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-y-axis-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-chart-y-axis-row.component.ts @@ -44,17 +44,18 @@ import { TranslateService } from '@ngx-translate/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-time-series-chart-y-axis-row', - templateUrl: './time-series-chart-y-axis-row.component.html', - styleUrls: ['./time-series-chart-y-axis-row.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeSeriesChartYAxisRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-time-series-chart-y-axis-row', + templateUrl: './time-series-chart-y-axis-row.component.html', + styleUrls: ['./time-series-chart-y-axis-row.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeSeriesChartYAxisRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class TimeSeriesChartYAxisRowComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-no-aggregation-bar-width-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-no-aggregation-bar-width-settings.component.ts index 320b239c22..1e078d995f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-no-aggregation-bar-width-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/chart/time-series-no-aggregation-bar-width-settings.component.ts @@ -33,16 +33,17 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-time-series-no-aggregation-bar-width-settings', - templateUrl: './time-series-no-aggregation-bar-width-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeSeriesNoAggregationBarWidthSettingsComponent), - multi: true - } - ] + selector: 'tb-time-series-no-aggregation-bar-width-settings', + templateUrl: './time-series-no-aggregation-bar-width-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimeSeriesNoAggregationBarWidthSettingsComponent), + multi: true + } + ], + standalone: false }) export class TimeSeriesNoAggregationBarWidthSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.ts index 45acb33b31..b781107fde 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.ts @@ -53,17 +53,18 @@ export function advancedRangeValidator(control: AbstractControl): ValidationErro } @Component({ - selector: 'tb-color-range-list', - templateUrl: './color-range-list.component.html', - styleUrls: ['color-settings-panel.component.scss', 'color-range-list.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ColorRangeListComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-color-range-list', + templateUrl: './color-range-list.component.html', + styleUrls: ['color-settings-panel.component.scss', 'color-range-list.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ColorRangeListComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ColorRangeListComponent implements OnInit, ControlValueAccessor, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-panel.component.ts index 68485e8572..b6f1c02bfb 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-panel.component.ts @@ -27,11 +27,12 @@ import { } from '@home/components/widget/lib/settings/common/color-range-settings.component'; @Component({ - selector: 'tb-color-range-panel', - templateUrl: './color-range-panel.component.html', - providers: [], - styleUrls: ['./color-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-color-range-panel', + templateUrl: './color-range-panel.component.html', + providers: [], + styleUrls: ['./color-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ColorRangePanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-settings.component.ts index 85e248e811..0c0022b252 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-settings.component.ts @@ -58,16 +58,17 @@ export class ColorRangeSettingsComponentService { } @Component({ - selector: 'tb-color-range-settings', - templateUrl: './color-range-settings.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ColorRangeSettingsComponent), - multi: true - } - ] + selector: 'tb-color-range-settings', + templateUrl: './color-range-settings.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ColorRangeSettingsComponent), + multi: true + } + ], + standalone: false }) export class ColorRangeSettingsComponent implements OnInit, ControlValueAccessor, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings-panel.component.ts index 5fc7ebb698..0c0e504d74 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings-panel.component.ts @@ -37,11 +37,12 @@ import { Datasource } from '@shared/models/widget.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-color-settings-panel', - templateUrl: './color-settings-panel.component.html', - providers: [], - styleUrls: ['./color-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-color-settings-panel', + templateUrl: './color-settings-panel.component.html', + providers: [], + styleUrls: ['./color-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ColorSettingsPanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings.component.ts index f67b647c48..9a9ba27ce0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings.component.ts @@ -65,16 +65,17 @@ export class ColorSettingsComponentService { } @Component({ - selector: 'tb-color-settings', - templateUrl: './color-settings.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ColorSettingsComponent), - multi: true - } - ] + selector: 'tb-color-settings', + templateUrl: './color-settings.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ColorSettingsComponent), + multi: true + } + ], + standalone: false }) export class ColorSettingsComponent implements OnInit, ControlValueAccessor, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/count-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/count-widget-settings.component.ts index 7221c54061..79689174c0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/count-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/count-widget-settings.component.ts @@ -41,16 +41,17 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-count-widget-settings', - templateUrl: './count-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CountWidgetSettingsComponent), - multi: true - } - ] + selector: 'tb-count-widget-settings', + templateUrl: './count-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CountWidgetSettingsComponent), + multi: true + } + ], + standalone: false }) export class CountWidgetSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/css-size-input.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/css-size-input.component.ts index 41361112f5..5dc81ff163 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/css-size-input.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/css-size-input.component.ts @@ -31,21 +31,22 @@ import { isDefinedAndNotNull } from '@core/utils'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-css-size-input', - templateUrl: './css-size-input.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CssSizeInputComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => CssSizeInputComponent), - multi: true, - } - ] + selector: 'tb-css-size-input', + templateUrl: './css-size-input.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CssSizeInputComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => CssSizeInputComponent), + multi: true, + } + ], + standalone: false }) export class CssSizeInputComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/css-unit-select.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/css-unit-select.component.ts index 1d5ab7f12e..861bf64044 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/css-unit-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/css-unit-select.component.ts @@ -21,16 +21,17 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-css-unit-select', - templateUrl: './css-unit-select.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CssUnitSelectComponent), - multi: true - } - ] + selector: 'tb-css-unit-select', + templateUrl: './css-unit-select.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CssUnitSelectComponent), + multi: true + } + ], + standalone: false }) export class CssUnitSelectComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/date-format-select.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/date-format-select.component.ts index 9545e6cb37..746cc6c90b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/date-format-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/date-format-select.component.ts @@ -48,16 +48,17 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-date-format-select', - templateUrl: './date-format-select.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DateFormatSelectComponent), - multi: true - } - ] + selector: 'tb-date-format-select', + templateUrl: './date-format-select.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DateFormatSelectComponent), + multi: true + } + ], + standalone: false }) export class DateFormatSelectComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/date-format-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/date-format-settings-panel.component.ts index 45ffdcc580..b66d49c711 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/date-format-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/date-format-settings-panel.component.ts @@ -25,11 +25,12 @@ import { DatePipe } from '@angular/common'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-date-format-settings-panel', - templateUrl: './date-format-settings-panel.component.html', - providers: [], - styleUrls: ['./date-format-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-date-format-settings-panel', + templateUrl: './date-format-settings-panel.component.html', + providers: [], + styleUrls: ['./date-format-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DateFormatSettingsPanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-array.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-array.component.ts index f5b71fb52c..f0b085dbae 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-array.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-array.component.ts @@ -31,22 +31,23 @@ import { defaultFormPropertyValue, FormProperty } from '@shared/models/dynamic-f import { CdkDragDrop } from '@angular/cdk/drag-drop'; @Component({ - selector: 'tb-dynamic-form-array', - templateUrl: './dynamic-form-array.component.html', - styleUrls: ['./dynamic-form-array.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DynamicFormArrayComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DynamicFormArrayComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-dynamic-form-array', + templateUrl: './dynamic-form-array.component.html', + styleUrls: ['./dynamic-form-array.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DynamicFormArrayComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DynamicFormArrayComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DynamicFormArrayComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-properties.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-properties.component.ts index bddbda4401..d994a65901 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-properties.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-properties.component.ts @@ -53,22 +53,23 @@ import { DialogService } from '@core/services/dialog.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-dynamic-form-properties', - templateUrl: './dynamic-form-properties.component.html', - styleUrls: ['./dynamic-form-properties.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DynamicFormPropertiesComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DynamicFormPropertiesComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-dynamic-form-properties', + templateUrl: './dynamic-form-properties.component.html', + styleUrls: ['./dynamic-form-properties.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DynamicFormPropertiesComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DynamicFormPropertiesComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DynamicFormPropertiesComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-property-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-property-panel.component.ts index dfcdf49192..e59a08037f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-property-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-property-panel.component.ts @@ -34,10 +34,11 @@ import { isUndefinedOrNull } from '@core/utils'; import { StringItemsOption } from '@shared/components/string-items-list.component'; @Component({ - selector: 'tb-dynamic-form-property-panel', - templateUrl: './dynamic-form-property-panel.component.html', - styleUrls: ['./dynamic-form-property-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-dynamic-form-property-panel', + templateUrl: './dynamic-form-property-panel.component.html', + styleUrls: ['./dynamic-form-property-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DynamicFormPropertyPanelComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-property-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-property-row.component.ts index 7692be80e0..4f1dd8b23d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-property-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-property-row.component.ts @@ -59,22 +59,23 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-dynamic-form-property-row', - templateUrl: './dynamic-form-property-row.component.html', - styleUrls: ['./dynamic-form-property-row.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DynamicFormPropertyRowComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DynamicFormPropertyRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-dynamic-form-property-row', + templateUrl: './dynamic-form-property-row.component.html', + styleUrls: ['./dynamic-form-property-row.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DynamicFormPropertyRowComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DynamicFormPropertyRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DynamicFormPropertyRowComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-select-item-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-select-item-row.component.ts index 6d414a18f9..d92cc58489 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-select-item-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-select-item-row.component.ts @@ -46,22 +46,23 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; export const selectItemValid = (item: FormSelectItem): boolean => isDefinedAndNotNull(item.value) && !!item.label; @Component({ - selector: 'tb-dynamic-form-select-item-row', - templateUrl: './dynamic-form-select-item-row.component.html', - styleUrls: ['./dynamic-form-select-item-row.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DynamicFormSelectItemRowComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DynamicFormSelectItemRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-dynamic-form-select-item-row', + templateUrl: './dynamic-form-select-item-row.component.html', + styleUrls: ['./dynamic-form-select-item-row.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DynamicFormSelectItemRowComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DynamicFormSelectItemRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DynamicFormSelectItemRowComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-select-items.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-select-items.component.ts index 9d664d5796..8970569cf3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-select-items.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form-select-items.component.ts @@ -45,22 +45,23 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-dynamic-form-select-items', - templateUrl: './dynamic-form-select-items.component.html', - styleUrls: ['./dynamic-form-select-items.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DynamicFormSelectItemsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DynamicFormSelectItemsComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-dynamic-form-select-items', + templateUrl: './dynamic-form-select-items.component.html', + styleUrls: ['./dynamic-form-select-items.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DynamicFormSelectItemsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DynamicFormSelectItemsComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DynamicFormSelectItemsComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form.component.ts index 7441bf470f..5fa33a422b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/dynamic-form/dynamic-form.component.ts @@ -55,21 +55,22 @@ import { ContentType } from '@shared/models/constants'; import { DomSanitizer } from '@angular/platform-browser'; @Component({ - selector: 'tb-dynamic-form', - templateUrl: './dynamic-form.component.html', - styleUrls: ['./dynamic-form.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DynamicFormComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DynamicFormComponent), - multi: true - } - ] + selector: 'tb-dynamic-form', + templateUrl: './dynamic-form.component.html', + styleUrls: ['./dynamic-form.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DynamicFormComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DynamicFormComponent), + multi: true + } + ], + standalone: false }) export class DynamicFormComponent implements OnInit, OnChanges, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/entity-alias-input.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/entity-alias-input.component.ts index f774a32657..95f137ce39 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/entity-alias-input.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/entity-alias-input.component.ts @@ -39,17 +39,18 @@ import { Observable, of } from 'rxjs'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-entity-alias-input', - templateUrl: './entity-alias-input.component.html', - styleUrls: ['./entity-alias-input.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => EntityAliasInputComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-entity-alias-input', + templateUrl: './entity-alias-input.component.html', + styleUrls: ['./entity-alias-input.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => EntityAliasInputComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class EntityAliasInputComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/filter/filter-select.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/filter/filter-select.component.ts index 80e1ce105b..c57ce2a231 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/filter/filter-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/filter/filter-select.component.ts @@ -37,18 +37,19 @@ import { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form- import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-filter-select', - templateUrl: './filter-select.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => FilterSelectComponent), - multi: true - }, - { - provide: ErrorStateMatcher, - useExisting: FilterSelectComponent - }] + selector: 'tb-filter-select', + templateUrl: './filter-select.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FilterSelectComponent), + multi: true + }, + { + provide: ErrorStateMatcher, + useExisting: FilterSelectComponent + }], + standalone: false }) export class FilterSelectComponent implements ControlValueAccessor, OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.ts index 07d9173fd8..7428439921 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.ts @@ -46,11 +46,12 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-font-settings-panel', - templateUrl: './font-settings-panel.component.html', - providers: [], - styleUrls: ['./font-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-font-settings-panel', + templateUrl: './font-settings-panel.component.html', + providers: [], + styleUrls: ['./font-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class FontSettingsPanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings.component.ts index 203b9080bf..52e2169311 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings.component.ts @@ -24,16 +24,17 @@ import { isDefinedAndNotNull } from '@core/utils'; import { coerceBoolean } from '@shared/decorators/coercion'; @Component({ - selector: 'tb-font-settings', - templateUrl: './font-settings.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => FontSettingsComponent), - multi: true - } - ] + selector: 'tb-font-settings', + templateUrl: './font-settings.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FontSettingsComponent), + multi: true + } + ], + standalone: false }) export class FontSettingsComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/gradient.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/gradient.component.ts index ba778cf607..c908c86eea 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/gradient.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/gradient.component.ts @@ -37,16 +37,17 @@ import { DataKeysCallbacks } from '@home/components/widget/lib/settings/common/k import { Datasource } from '@shared/models/widget.models'; @Component({ - selector: 'tb-gradient', - templateUrl: './gradient.component.html', - styleUrls: ['color-settings-panel.component.scss', 'gradient.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => GradientComponent), - multi: true - } - ] + selector: 'tb-gradient', + templateUrl: './gradient.component.html', + styleUrls: ['color-settings-panel.component.scss', 'gradient.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => GradientComponent), + multi: true + } + ], + standalone: false }) export class GradientComponent implements OnInit, ControlValueAccessor, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.ts index dca656ac46..8021f9d2dd 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.ts @@ -52,7 +52,8 @@ export interface ImageCardsColumns { { // eslint-disable-next-line @angular-eslint/directive-selector selector: 'tb-image-cards-select-option', - } + standalone: false +} ) export class ImageCardsSelectOptionDirective { @@ -70,17 +71,18 @@ export class ImageCardsSelectOptionDirective { } @Component({ - selector: 'tb-image-cards-select', - templateUrl: './image-cards-select.component.html', - styleUrls: ['./image-cards-select.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ImageCardsSelectComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-image-cards-select', + templateUrl: './image-cards-select.component.html', + styleUrls: ['./image-cards-select.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ImageCardsSelectComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ImageCardsSelectComponent implements ControlValueAccessor, OnInit, OnChanges, AfterContentInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/indicator/status-widget-state-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/indicator/status-widget-state-settings.component.ts index a810896685..ed80795ca0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/indicator/status-widget-state-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/indicator/status-widget-state-settings.component.ts @@ -24,16 +24,17 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-status-widget-state-settings', - templateUrl: './status-widget-state-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => StatusWidgetStateSettingsComponent), - multi: true - } - ] + selector: 'tb-status-widget-state-settings', + templateUrl: './status-widget-state-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => StatusWidgetStateSettingsComponent), + multi: true + } + ], + standalone: false }) export class StatusWidgetStateSettingsComponent implements OnInit, OnChanges, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-key-config-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-key-config-dialog.component.ts index 6ed15ce4f5..131a332f04 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-key-config-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-key-config-dialog.component.ts @@ -60,10 +60,11 @@ export interface DataKeyConfigDialogData { } @Component({ - selector: 'tb-data-key-config-dialog', - templateUrl: './data-key-config-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: DataKeyConfigDialogComponent}], - styleUrls: ['./data-key-config-dialog.component.scss'] + selector: 'tb-data-key-config-dialog', + templateUrl: './data-key-config-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: DataKeyConfigDialogComponent }], + styleUrls: ['./data-key-config-dialog.component.scss'], + standalone: false }) export class DataKeyConfigDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-key-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-key-config.component.ts index dafcce57b6..4311a06ddd 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-key-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-key-config.component.ts @@ -62,21 +62,22 @@ import { FormProperty } from '@shared/models/dynamic-form.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-data-key-config', - templateUrl: './data-key-config.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DataKeyConfigComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DataKeyConfigComponent), - multi: true, - } - ] + selector: 'tb-data-key-config', + templateUrl: './data-key-config.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DataKeyConfigComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DataKeyConfigComponent), + multi: true, + } + ], + standalone: false }) export class DataKeyConfigComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-key-input.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-key-input.component.ts index 1c1fa01956..28a6714d23 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-key-input.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-key-input.component.ts @@ -55,17 +55,18 @@ import { IAliasController } from '@core/api/widget-api.models'; import { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field'; @Component({ - selector: 'tb-data-key-input', - templateUrl: './data-key-input.component.html', - styleUrls: ['./data-key-input.component.scss', './data-keys.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DataKeyInputComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-data-key-input', + templateUrl: './data-key-input.component.html', + styleUrls: ['./data-key-input.component.scss', './data-keys.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DataKeyInputComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DataKeyInputComponent implements ControlValueAccessor, OnInit, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-keys.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-keys.component.ts index 44fb225c96..02aa5b7548 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-keys.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/key/data-keys.component.ts @@ -75,26 +75,27 @@ import { FormProperty } from '@shared/models/dynamic-form.models'; import { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field'; @Component({ - selector: 'tb-data-keys', - templateUrl: './data-keys.component.html', - styleUrls: ['./data-keys.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DataKeysComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DataKeysComponent), - multi: true, - }, - { - provide: ErrorStateMatcher, - useExisting: DataKeysComponent - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-data-keys', + templateUrl: './data-keys.component.html', + styleUrls: ['./data-keys.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DataKeysComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DataKeysComponent), + multi: true, + }, + { + provide: ErrorStateMatcher, + useExisting: DataKeysComponent + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DataKeysComponent implements ControlValueAccessor, OnInit, OnChanges, ErrorStateMatcher, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/legend-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/legend-config.component.ts index 0f946cd479..99e7f21e19 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/legend-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/legend-config.component.ts @@ -29,16 +29,17 @@ import { coerceBoolean } from '@shared/decorators/coercion'; // @dynamic @Component({ - selector: 'tb-legend-config', - templateUrl: './legend-config.component.html', - styleUrls: ['./../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => LegendConfigComponent), - multi: true - } - ] + selector: 'tb-legend-config', + templateUrl: './legend-config.component.html', + styleUrls: ['./../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => LegendConfigComponent), + multi: true + } + ], + standalone: false }) export class LegendConfigComponent implements OnInit, OnDestroy, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/additional-map-data-source-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/additional-map-data-source-row.component.ts index 57646cb304..7976a3773a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/additional-map-data-source-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/additional-map-data-source-row.component.ts @@ -41,17 +41,18 @@ import { genNextLabelForDataKeys } from '@core/utils'; import { MapSettingsContext } from '@home/components/widget/lib/settings/common/map/map-settings.component.models'; @Component({ - selector: 'tb-additional-map-data-source-row', - templateUrl: './additional-map-data-source-row.component.html', - styleUrls: ['./additional-map-data-source-row.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AdditionalMapDataSourceRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-additional-map-data-source-row', + templateUrl: './additional-map-data-source-row.component.html', + styleUrls: ['./additional-map-data-source-row.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AdditionalMapDataSourceRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class AdditionalMapDataSourceRowComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/additional-map-data-sources.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/additional-map-data-sources.component.ts index 7e96dcf847..eb8fef90d0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/additional-map-data-sources.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/additional-map-data-sources.component.ts @@ -37,22 +37,23 @@ import { import { MapSettingsContext } from '@home/components/widget/lib/settings/common/map/map-settings.component.models'; @Component({ - selector: 'tb-additional-map-data-sources', - templateUrl: './additional-map-data-sources.component.html', - styleUrls: ['./additional-map-data-sources.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AdditionalMapDataSourcesComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => AdditionalMapDataSourcesComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-additional-map-data-sources', + templateUrl: './additional-map-data-sources.component.html', + styleUrls: ['./additional-map-data-sources.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AdditionalMapDataSourcesComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => AdditionalMapDataSourcesComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class AdditionalMapDataSourcesComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/data-layer-color-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/data-layer-color-settings-panel.component.ts index 7f8fe16279..102cfe97b8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/data-layer-color-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/data-layer-color-settings-panel.component.ts @@ -28,11 +28,12 @@ import { DataKeyType } from '@shared/models/telemetry/telemetry.models'; import { MapSettingsContext } from '@home/components/widget/lib/settings/common/map/map-settings.component.models'; @Component({ - selector: 'tb-data-layer-color-settings-panel', - templateUrl: './data-layer-color-settings-panel.component.html', - providers: [], - styleUrls: ['./data-layer-color-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-data-layer-color-settings-panel', + templateUrl: './data-layer-color-settings-panel.component.html', + providers: [], + styleUrls: ['./data-layer-color-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DataLayerColorSettingsPanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/data-layer-color-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/data-layer-color-settings.component.ts index 17e3a15177..f3c095ba4e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/data-layer-color-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/data-layer-color-settings.component.ts @@ -27,16 +27,17 @@ import { MapSettingsContext } from '@home/components/widget/lib/settings/common/ import { DatasourceType } from '@shared/models/widget.models'; @Component({ - selector: 'tb-data-layer-color-settings', - templateUrl: './data-layer-color-settings.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DataLayerColorSettingsComponent), - multi: true - } - ] + selector: 'tb-data-layer-color-settings', + templateUrl: './data-layer-color-settings.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DataLayerColorSettingsComponent), + multi: true + } + ], + standalone: false }) export class DataLayerColorSettingsComponent implements ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/data-layer-pattern-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/data-layer-pattern-settings.component.ts index 5a7c1afa0b..6bc2fb7489 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/data-layer-pattern-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/data-layer-pattern-settings.component.ts @@ -37,21 +37,22 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { MapSettingsContext } from '@home/components/widget/lib/settings/common/map/map-settings.component.models'; @Component({ - selector: 'tb-data-layer-pattern-settings', - templateUrl: './data-layer-pattern-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DataLayerPatternSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DataLayerPatternSettingsComponent), - multi: true - } - ] + selector: 'tb-data-layer-pattern-settings', + templateUrl: './data-layer-pattern-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DataLayerPatternSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DataLayerPatternSettingsComponent), + multi: true + } + ], + standalone: false }) export class DataLayerPatternSettingsComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/image-map-source-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/image-map-source-settings.component.ts index ddd3b1842d..ed02417950 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/image-map-source-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/image-map-source-settings.component.ts @@ -32,21 +32,22 @@ import { MapSettingsContext } from '@home/components/widget/lib/settings/common/ import { DataKeyType } from '@shared/models/telemetry/telemetry.models'; @Component({ - selector: 'tb-image-map-source-settings', - templateUrl: './image-map-source-settings.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ImageMapSourceSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => ImageMapSourceSettingsComponent), - multi: true - } - ] + selector: 'tb-image-map-source-settings', + templateUrl: './image-map-source-settings.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ImageMapSourceSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => ImageMapSourceSettingsComponent), + multi: true + } + ], + standalone: false }) export class ImageMapSourceSettingsComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-action-button-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-action-button-row.component.ts index b58999a406..3d474c79e1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-action-button-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-action-button-row.component.ts @@ -30,18 +30,19 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { isEmptyStr } from '@core/utils'; @Component({ - selector: 'tb-map-action-button-row', - templateUrl: 'map-action-button-row.component.html', - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapActionButtonRowComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MapActionButtonRowComponent), - multi: true - }] + selector: 'tb-map-action-button-row', + templateUrl: 'map-action-button-row.component.html', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapActionButtonRowComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MapActionButtonRowComponent), + multi: true + }], + standalone: false }) export class MapActionButtonRowComponent implements ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-action-buttons-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-action-buttons-settings.component.ts index 76968e3e4d..2494d4b30a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-action-buttons-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-action-buttons-settings.component.ts @@ -31,18 +31,19 @@ import { CdkDragDrop } from '@angular/cdk/drag-drop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-map-action-button-settings', - templateUrl: './map-action-buttons-settings.component.html', - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapActionButtonsSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MapActionButtonsSettingsComponent), - multi: true - }] + selector: 'tb-map-action-button-settings', + templateUrl: './map-action-buttons-settings.component.html', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapActionButtonsSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MapActionButtonsSettingsComponent), + multi: true + }], + standalone: false }) export class MapActionButtonsSettingsComponent implements ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-dialog.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-dialog.component.ts index 8c5e37d148..43f9616809 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-dialog.component.ts @@ -56,10 +56,11 @@ export interface MapDataLayerDialogData { } @Component({ - selector: 'tb-map-data-layer-dialog', - templateUrl: './map-data-layer-dialog.component.html', - styleUrls: ['./map-data-layer-dialog.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-map-data-layer-dialog', + templateUrl: './map-data-layer-dialog.component.html', + styleUrls: ['./map-data-layer-dialog.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MapDataLayerDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-row.component.ts index 25ede1cea3..707d8f983f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layer-row.component.ts @@ -57,17 +57,18 @@ import { import { MapSettingsContext } from '@home/components/widget/lib/settings/common/map/map-settings.component.models'; @Component({ - selector: 'tb-map-data-layer-row', - templateUrl: './map-data-layer-row.component.html', - styleUrls: ['./map-data-layer-row.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapDataLayerRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-map-data-layer-row', + templateUrl: './map-data-layer-row.component.html', + styleUrls: ['./map-data-layer-row.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapDataLayerRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MapDataLayerRowComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layers.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layers.component.ts index 9bf34b08f8..63fe3dc31a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layers.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-layers.component.ts @@ -41,22 +41,23 @@ import { MapSettingsContext } from '@home/components/widget/lib/settings/common/ import { CdkDragDrop } from '@angular/cdk/drag-drop'; @Component({ - selector: 'tb-map-data-layers', - templateUrl: './map-data-layers.component.html', - styleUrls: ['./map-data-layers.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapDataLayersComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MapDataLayersComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-map-data-layers', + templateUrl: './map-data-layers.component.html', + styleUrls: ['./map-data-layers.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapDataLayersComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MapDataLayersComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MapDataLayersComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-source-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-source-row.component.ts index 7737c3a4b6..114e22b5a9 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-source-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-source-row.component.ts @@ -39,17 +39,18 @@ import { EntityType } from '@shared/models/entity-type.models'; import { MapSettingsContext } from '@home/components/widget/lib/settings/common/map/map-settings.component.models'; @Component({ - selector: 'tb-map-data-source-row', - templateUrl: './map-data-source-row.component.html', - styleUrls: ['./map-data-source-row.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapDataSourceRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-map-data-source-row', + templateUrl: './map-data-source-row.component.html', + styleUrls: ['./map-data-source-row.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapDataSourceRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MapDataSourceRowComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-sources.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-sources.component.ts index 4b62112cc1..71afc02dec 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-sources.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-data-sources.component.ts @@ -37,22 +37,23 @@ import { import { MapSettingsContext } from '@home/components/widget/lib/settings/common/map/map-settings.component.models'; @Component({ - selector: 'tb-map-data-sources', - templateUrl: './map-data-sources.component.html', - styleUrls: ['./map-data-sources.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapDataSourcesComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MapDataSourcesComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-map-data-sources', + templateUrl: './map-data-sources.component.html', + styleUrls: ['./map-data-sources.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapDataSourcesComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MapDataSourcesComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MapDataSourcesComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-layer-row.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-layer-row.component.ts index 14136f018e..1604ff8683 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-layer-row.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-layer-row.component.ts @@ -60,17 +60,18 @@ import { } from '@home/components/widget/lib/settings/common/map/map-layer-settings-panel.component'; @Component({ - selector: 'tb-map-layer-row', - templateUrl: './map-layer-row.component.html', - styleUrls: ['./map-layer-row.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapLayerRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-map-layer-row', + templateUrl: './map-layer-row.component.html', + styleUrls: ['./map-layer-row.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapLayerRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MapLayerRowComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-layer-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-layer-settings-panel.component.ts index 536c953bb7..bedb92a6af 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-layer-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-layer-settings-panel.component.ts @@ -37,11 +37,12 @@ import { import { TranslateService } from '@ngx-translate/core'; @Component({ - selector: 'tb-map-layer-settings-panel', - templateUrl: './map-layer-settings-panel.component.html', - providers: [], - styleUrls: ['./map-layer-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-map-layer-settings-panel', + templateUrl: './map-layer-settings-panel.component.html', + providers: [], + styleUrls: ['./map-layer-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MapLayerSettingsPanelComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-layers.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-layers.component.ts index feaa633b34..35dc5ff04a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-layers.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-layers.component.ts @@ -38,22 +38,23 @@ import { } from '@shared/models/widget/maps/map.models'; @Component({ - selector: 'tb-map-layers', - templateUrl: './map-layers.component.html', - styleUrls: ['./map-layers.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapLayersComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MapLayersComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-map-layers', + templateUrl: './map-layers.component.html', + styleUrls: ['./map-layers.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapLayersComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MapLayersComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MapLayersComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-settings.component.ts index 985e5df1f9..0e33f9d83e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-settings.component.ts @@ -54,21 +54,22 @@ import { deepClone, mergeDeep } from '@core/utils'; import { MatDialog } from '@angular/material/dialog'; @Component({ - selector: 'tb-map-settings', - templateUrl: './map-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MapSettingsComponent), - multi: true - } - ] + selector: 'tb-map-settings', + templateUrl: './map-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MapSettingsComponent), + multi: true + } + ], + standalone: false }) export class MapSettingsComponent implements OnInit, ControlValueAccessor, Validator, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-tooltip-tag-actions.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-tooltip-tag-actions.component.ts index 5c751ac950..8c9864c456 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-tooltip-tag-actions.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-tooltip-tag-actions.component.ts @@ -37,17 +37,18 @@ import { TranslateService } from '@ngx-translate/core'; import { deepClone } from '@core/utils'; @Component({ - selector: 'tb-map-tooltip-tag-actions-panel', - templateUrl: './map-tooltip-tag-actions.component.html', - styleUrls: ['./map-tooltip-tag-actions.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapTooltipTagActionsComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-map-tooltip-tag-actions-panel', + templateUrl: './map-tooltip-tag-actions.component.html', + styleUrls: ['./map-tooltip-tag-actions.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapTooltipTagActionsComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MapTooltipTagActionsComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-clustering-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-clustering-settings.component.ts index 8c7ff9371e..eac6b9e410 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-clustering-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-clustering-settings.component.ts @@ -31,21 +31,22 @@ import { MarkerClusteringSettings } from '@shared/models/widget/maps/map.models' import { merge } from 'rxjs'; @Component({ - selector: 'tb-marker-clustering-settings', - templateUrl: './marker-clustering-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MarkerClusteringSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MarkerClusteringSettingsComponent), - multi: true - } - ] + selector: 'tb-marker-clustering-settings', + templateUrl: './marker-clustering-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MarkerClusteringSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MarkerClusteringSettingsComponent), + multi: true + } + ], + standalone: false }) export class MarkerClusteringSettingsComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-icon-shapes.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-icon-shapes.component.ts index f1671807d8..8094bc0a68 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-icon-shapes.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-icon-shapes.component.ts @@ -42,11 +42,12 @@ interface MarkerIconContainerInfo { } @Component({ - selector: 'tb-marker-icon-shapes', - templateUrl: './marker-icon-shapes.component.html', - providers: [], - styleUrls: ['./marker-icon-shapes.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-marker-icon-shapes', + templateUrl: './marker-icon-shapes.component.html', + providers: [], + styleUrls: ['./marker-icon-shapes.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MarkerIconShapesComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-image-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-image-settings-panel.component.ts index eea2bc6700..67539b82f2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-image-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-image-settings-panel.component.ts @@ -25,11 +25,12 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { MarkerImageSettings, MarkerImageType } from '@shared/models/widget/maps/map.models'; @Component({ - selector: 'tb-marker-image-settings-panel', - templateUrl: './marker-image-settings-panel.component.html', - providers: [], - styleUrls: ['./marker-image-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-marker-image-settings-panel', + templateUrl: './marker-image-settings-panel.component.html', + providers: [], + styleUrls: ['./marker-image-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MarkerImageSettingsPanelComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-image-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-image-settings.component.ts index 0d84469410..6da6c809e0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-image-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-image-settings.component.ts @@ -24,16 +24,17 @@ import { } from '@home/components/widget/lib/settings/common/map/marker-image-settings-panel.component'; @Component({ - selector: 'tb-marker-image-settings', - templateUrl: './marker-image-settings.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MarkerImageSettingsComponent), - multi: true - } - ] + selector: 'tb-marker-image-settings', + templateUrl: './marker-image-settings.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MarkerImageSettingsComponent), + multi: true + } + ], + standalone: false }) export class MarkerImageSettingsComponent implements ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-shape-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-shape-settings.component.ts index 319b423b2d..e251f6f9a8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-shape-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-shape-settings.component.ts @@ -53,16 +53,17 @@ import { MapSettingsContext } from '@home/components/widget/lib/settings/common/ import { DatasourceType } from '@shared/models/widget.models'; @Component({ - selector: 'tb-marker-shape-settings', - templateUrl: './marker-shape-settings.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MarkerShapeSettingsComponent), - multi: true - } - ] + selector: 'tb-marker-shape-settings', + templateUrl: './marker-shape-settings.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MarkerShapeSettingsComponent), + multi: true + } + ], + standalone: false }) export class MarkerShapeSettingsComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-shapes.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-shapes.component.ts index 5499c6e39c..23fadbf093 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-shapes.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/marker-shapes.component.ts @@ -37,11 +37,12 @@ interface MarkerShapeInfo { } @Component({ - selector: 'tb-marker-shapes', - templateUrl: './marker-shapes.component.html', - providers: [], - styleUrls: ['./marker-shapes.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-marker-shapes', + templateUrl: './marker-shapes.component.html', + providers: [], + styleUrls: ['./marker-shapes.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MarkerShapesComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-image-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-image-settings-panel.component.ts index 8988365644..dcea878241 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-image-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-image-settings-panel.component.ts @@ -22,11 +22,12 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { ShapeFillImageSettings, ShapeFillImageType } from '@shared/models/widget/maps/map.models'; @Component({ - selector: 'tb-shape-fill-image-settings-panel', - templateUrl: './shape-fill-image-settings-panel.component.html', - providers: [], - styleUrls: ['./shape-fill-image-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-shape-fill-image-settings-panel', + templateUrl: './shape-fill-image-settings-panel.component.html', + providers: [], + styleUrls: ['./shape-fill-image-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ShapeFillImageSettingsPanelComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-image-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-image-settings.component.ts index 466525f46f..5c9bbb260f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-image-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-image-settings.component.ts @@ -24,16 +24,17 @@ import { } from '@home/components/widget/lib/settings/common/map/shape-fill-image-settings-panel.component'; @Component({ - selector: 'tb-shape-fill-image-settings', - templateUrl: './shape-fill-image-settings.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ShapeFillImageSettingsComponent), - multi: true - } - ] + selector: 'tb-shape-fill-image-settings', + templateUrl: './shape-fill-image-settings.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ShapeFillImageSettingsComponent), + multi: true + } + ], + standalone: false }) export class ShapeFillImageSettingsComponent implements ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-stripe-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-stripe-settings-panel.component.ts index 60fab91c82..52ab290e6f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-stripe-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-stripe-settings-panel.component.ts @@ -28,11 +28,12 @@ import { MapSettingsContext } from '@home/components/widget/lib/settings/common/ import { DatasourceType } from '@shared/models/widget.models'; @Component({ - selector: 'tb-shape-fill-stripe-settings-panel', - templateUrl: './shape-fill-stripe-settings-panel.component.html', - providers: [], - styleUrls: ['./shape-fill-stripe-settings-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-shape-fill-stripe-settings-panel', + templateUrl: './shape-fill-stripe-settings-panel.component.html', + providers: [], + styleUrls: ['./shape-fill-stripe-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ShapeFillStripeSettingsPanelComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-stripe-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-stripe-settings.component.ts index 0b8d19b4a7..b1f65c541c 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-stripe-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/shape-fill-stripe-settings.component.ts @@ -28,16 +28,17 @@ import { } from '@home/components/widget/lib/settings/common/map/shape-fill-stripe-settings-panel.component'; @Component({ - selector: 'tb-shape-fill-stripe-settings', - templateUrl: './shape-fill-stripe-settings.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ShapeFillStripeSettingsComponent), - multi: true - } - ] + selector: 'tb-shape-fill-stripe-settings', + templateUrl: './shape-fill-stripe-settings.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ShapeFillStripeSettingsComponent), + multi: true + } + ], + standalone: false }) export class ShapeFillStripeSettingsComponent implements ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/trip-timeline-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/trip-timeline-settings.component.ts index 1a041cd584..b3064b0dd3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/trip-timeline-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/trip-timeline-settings.component.ts @@ -33,21 +33,22 @@ import { } from '@shared/models/widget/maps/map.models'; @Component({ - selector: 'tb-trip-timeline-settings', - templateUrl: './trip-timeline-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TripTimelineSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TripTimelineSettingsComponent), - multi: true - } - ] + selector: 'tb-trip-timeline-settings', + templateUrl: './trip-timeline-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TripTimelineSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TripTimelineSettingsComponent), + multi: true + } + ], + standalone: false }) export class TripTimelineSettingsComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/scada/scada-symbol-object-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/scada/scada-symbol-object-settings.component.ts index 80d31cf678..90616286f5 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/scada/scada-symbol-object-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/scada/scada-symbol-object-settings.component.ts @@ -56,21 +56,22 @@ import { map } from 'rxjs/operators'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-scada-symbol-object-settings', - templateUrl: './scada-symbol-object-settings.component.html', - styleUrls: ['./scada-symbol-object-settings.component.scss', './../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ScadaSymbolObjectSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => ScadaSymbolObjectSettingsComponent), - multi: true - } - ] + selector: 'tb-scada-symbol-object-settings', + templateUrl: './scada-symbol-object-settings.component.html', + styleUrls: ['./scada-symbol-object-settings.component.scss', './../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ScadaSymbolObjectSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => ScadaSymbolObjectSettingsComponent), + multi: true + } + ], + standalone: false }) export class ScadaSymbolObjectSettingsComponent implements OnInit, OnChanges, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/value-source-data-key.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/value-source-data-key.component.ts index 2bc5f55597..cabeb765c8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/value-source-data-key.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/value-source-data-key.component.ts @@ -39,16 +39,17 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-value-source-data-key', - templateUrl: './value-source-data-key.component.html', - styleUrls: ['value-source-data-key.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ValueSourceDataKeyComponent), - multi: true - } - ] + selector: 'tb-value-source-data-key', + templateUrl: './value-source-data-key.component.html', + styleUrls: ['value-source-data-key.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ValueSourceDataKeyComponent), + multi: true + } + ], + standalone: false }) export class ValueSourceDataKeyComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/value-source.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/value-source.component.ts index e006e54208..2b91efa474 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/value-source.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/value-source.component.ts @@ -37,16 +37,17 @@ export interface ValueSourceProperty { } @Component({ - selector: 'tb-value-source', - templateUrl: './value-source.component.html', - styleUrls: ['./../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ValueSourceComponent), - multi: true - } - ] + selector: 'tb-value-source', + templateUrl: './value-source.component.html', + styleUrls: ['./../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ValueSourceComponent), + multi: true + } + ], + standalone: false }) export class ValueSourceComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/widget-font.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/widget-font.component.ts index 980cfe5780..79633ac7f2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/widget-font.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/widget-font.component.ts @@ -32,16 +32,17 @@ export interface WidgetFont { } @Component({ - selector: 'tb-widget-font', - templateUrl: './widget-font.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => WidgetFontComponent), - multi: true - } - ] + selector: 'tb-widget-font', + templateUrl: './widget-font.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => WidgetFontComponent), + multi: true + } + ], + standalone: false }) export class WidgetFontComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/widget/widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/widget/widget-settings.component.ts index 7b07fe47e0..d779a634ac 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/widget/widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/widget/widget-settings.component.ts @@ -47,19 +47,20 @@ import { WidgetConfigCallbacks } from '@home/components/widget/config/widget-con import { FormProperty } from '@shared/models/dynamic-form.models'; @Component({ - selector: 'tb-widget-settings', - templateUrl: './widget-settings.component.html', - styleUrls: ['./widget-settings.component.scss'], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => WidgetSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => WidgetSettingsComponent), - multi: true - }] + selector: 'tb-widget-settings', + templateUrl: './widget-settings.component.html', + styleUrls: ['./widget-settings.component.scss'], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => WidgetSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => WidgetSettingsComponent), + multi: true + }], + standalone: false }) export class WidgetSettingsComponent implements ControlValueAccessor, OnDestroy, OnChanges, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/device-key-autocomplete.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/device-key-autocomplete.component.ts index 52110ad50a..f02de5fa8d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/device-key-autocomplete.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/device-key-autocomplete.component.ts @@ -49,16 +49,17 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-device-key-autocomplete', - templateUrl: './device-key-autocomplete.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceKeyAutocompleteComponent), - multi: true - } - ] + selector: 'tb-device-key-autocomplete', + templateUrl: './device-key-autocomplete.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceKeyAutocompleteComponent), + multi: true + } + ], + standalone: false }) export class DeviceKeyAutocompleteComponent extends PageComponent implements OnInit, ControlValueAccessor, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/knob-control-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/knob-control-widget-settings.component.ts index 481097cf94..9c115025d7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/knob-control-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/knob-control-widget-settings.component.ts @@ -24,9 +24,10 @@ import { ValueType } from '@shared/models/constants'; import { deepClone } from '@core/utils'; @Component({ - selector: 'tb-knob-control-widget-settings', - templateUrl: './knob-control-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-knob-control-widget-settings', + templateUrl: './knob-control-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class KnobControlWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/led-indicator-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/led-indicator-widget-settings.component.ts index 45cfbcf7ec..faaa56db65 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/led-indicator-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/led-indicator-widget-settings.component.ts @@ -23,9 +23,10 @@ import { WidgetService } from '@core/http/widget.service'; import { DataKeyType } from '@shared/models/telemetry/telemetry.models'; @Component({ - selector: 'tb-led-indicator-widget-settings', - templateUrl: './led-indicator-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-led-indicator-widget-settings', + templateUrl: './led-indicator-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class LedIndicatorWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/persistent-table-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/persistent-table-widget-settings.component.ts index d89e46e7b1..170947af25 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/persistent-table-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/persistent-table-widget-settings.component.ts @@ -35,9 +35,10 @@ interface DisplayColumn { } @Component({ - selector: 'tb-persistent-table-widget-settings', - templateUrl: './persistent-table-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-persistent-table-widget-settings', + templateUrl: './persistent-table-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class PersistentTableWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/round-switch-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/round-switch-widget-settings.component.ts index 6f008e5a82..8c443e1462 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/round-switch-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/round-switch-widget-settings.component.ts @@ -23,9 +23,10 @@ import { switchRpcDefaultSettings } from '@home/components/widget/lib/settings/c import { deepClone } from '@core/utils'; @Component({ - selector: 'tb-round-switch-widget-settings', - templateUrl: './round-switch-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-round-switch-widget-settings', + templateUrl: './round-switch-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class RoundSwitchWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/rpc-button-style.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/rpc-button-style.component.ts index 6edd8f191b..730bf1a0b5 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/rpc-button-style.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/rpc-button-style.component.ts @@ -29,16 +29,17 @@ export interface RpcButtonStyle { } @Component({ - selector: 'tb-rpc-button-style', - templateUrl: './rpc-button-style.component.html', - styleUrls: ['./../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => RpcButtonStyleComponent), - multi: true - } - ] + selector: 'tb-rpc-button-style', + templateUrl: './rpc-button-style.component.html', + styleUrls: ['./../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => RpcButtonStyleComponent), + multi: true + } + ], + standalone: false }) export class RpcButtonStyleComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/rpc-shell-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/rpc-shell-widget-settings.component.ts index 157689a4ad..141ac5a6de 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/rpc-shell-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/rpc-shell-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-rpc-shell-widget-settings', - templateUrl: './rpc-shell-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-rpc-shell-widget-settings', + templateUrl: './rpc-shell-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class RpcShellWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/rpc-terminal-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/rpc-terminal-widget-settings.component.ts index 77e60522fe..31a5a0d81b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/rpc-terminal-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/rpc-terminal-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-rpc-terminal-widget-settings', - templateUrl: './rpc-terminal-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-rpc-terminal-widget-settings', + templateUrl: './rpc-terminal-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class RpcTerminalWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/send-rpc-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/send-rpc-widget-settings.component.ts index b8af3eaf0d..4319b823c2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/send-rpc-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/send-rpc-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { ContentType } from '@shared/models/constants'; @Component({ - selector: 'tb-send-rpc-widget-settings', - templateUrl: './send-rpc-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-send-rpc-widget-settings', + templateUrl: './send-rpc-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class SendRpcWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/single-switch-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/single-switch-widget-settings.component.ts index c3e768ae5b..d2c022bdf4 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/single-switch-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/single-switch-widget-settings.component.ts @@ -28,9 +28,10 @@ import { import { ValueType } from '@shared/models/constants'; @Component({ - selector: 'tb-single-switch-widget-settings', - templateUrl: './single-switch-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-single-switch-widget-settings', + templateUrl: './single-switch-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class SingleSwitchWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/slide-toggle-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/slide-toggle-widget-settings.component.ts index 888a016d91..3c9bf7fff8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/slide-toggle-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/slide-toggle-widget-settings.component.ts @@ -23,9 +23,10 @@ import { switchRpcDefaultSettings } from '@home/components/widget/lib/settings/c import { deepClone } from '@core/utils'; @Component({ - selector: 'tb-slide-toggle-widget-settings', - templateUrl: './slide-toggle-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-slide-toggle-widget-settings', + templateUrl: './slide-toggle-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class SlideToggleWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/slider-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/slider-widget-settings.component.ts index 53a9d483a7..f3899d7c66 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/slider-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/slider-widget-settings.component.ts @@ -31,9 +31,10 @@ import { formatValue } from '@core/utils'; import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-slider-widget-settings', - templateUrl: './slider-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-slider-widget-settings', + templateUrl: './slider-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class SliderWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/switch-control-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/switch-control-widget-settings.component.ts index d51c9f8d8e..c9ea433d93 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/switch-control-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/switch-control-widget-settings.component.ts @@ -23,9 +23,10 @@ import { switchRpcDefaultSettings } from '@home/components/widget/lib/settings/c import { deepClone } from '@core/utils'; @Component({ - selector: 'tb-switch-control-widget-settings', - templateUrl: './switch-control-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-switch-control-widget-settings', + templateUrl: './switch-control-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class SwitchControlWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/switch-rpc-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/switch-rpc-settings.component.ts index e58006d1cf..29f436c61d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/switch-rpc-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/switch-rpc-settings.component.ts @@ -65,21 +65,22 @@ export const switchRpcDefaultSettings = (): SwitchRpcSettings => ({ }); @Component({ - selector: 'tb-switch-rpc-settings', - templateUrl: './switch-rpc-settings.component.html', - styleUrls: ['./../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => SwitchRpcSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => SwitchRpcSettingsComponent), - multi: true - } - ] + selector: 'tb-switch-rpc-settings', + templateUrl: './switch-rpc-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SwitchRpcSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => SwitchRpcSettingsComponent), + multi: true + } + ], + standalone: false }) export class SwitchRpcSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/update-device-attribute-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/update-device-attribute-widget-settings.component.ts index a9fedf335c..4871e3db37 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/update-device-attribute-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/update-device-attribute-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { ContentType } from '@shared/models/constants'; @Component({ - selector: 'tb-update-device-attribute-widget-settings', - templateUrl: './update-device-attribute-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-update-device-attribute-widget-settings', + templateUrl: './update-device-attribute-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class UpdateDeviceAttributeWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/value-stepper-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/value-stepper-widget-settings.component.ts index 72377dddbc..ac3921f3ab 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/value-stepper-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/control/value-stepper-widget-settings.component.ts @@ -33,9 +33,10 @@ import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; type ButtonAppearanceType = 'left' | 'right'; @Component({ - selector: 'tb-value-stepper-widget-settings', - templateUrl: './value-stepper-widget-settings.component.html', - styleUrls: ['../widget-settings.scss'] + selector: 'tb-value-stepper-widget-settings', + templateUrl: './value-stepper-widget-settings.component.html', + styleUrls: ['../widget-settings.scss'], + standalone: false }) export class ValueStepperWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/date/date-range-navigator-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/date/date-range-navigator-widget-settings.component.ts index ece9e5f9dc..183009aef7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/date/date-range-navigator-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/date/date-range-navigator-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-date-range-navigator-widget-settings', - templateUrl: './date-range-navigator-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-date-range-navigator-widget-settings', + templateUrl: './date-range-navigator-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class DateRangeNavigatorWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entities-hierarchy-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entities-hierarchy-widget-settings.component.ts index a990e234bb..3acf41af24 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entities-hierarchy-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entities-hierarchy-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-entities-hierarchy-widget-settings', - templateUrl: './entities-hierarchy-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-entities-hierarchy-widget-settings', + templateUrl: './entities-hierarchy-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class EntitiesHierarchyWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entities-table-key-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entities-table-key-settings.component.ts index 22483166f0..c1c4a5eab3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entities-table-key-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entities-table-key-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-entities-table-key-settings', - templateUrl: './entities-table-key-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-entities-table-key-settings', + templateUrl: './entities-table-key-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class EntitiesTableKeySettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entities-table-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entities-table-widget-settings.component.ts index 5c19810eb4..3b31cf5645 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entities-table-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entities-table-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { buildPageStepSizeValues } from '@home/components/widget/lib/table-widget.models'; @Component({ - selector: 'tb-entities-table-widget-settings', - templateUrl: './entities-table-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-entities-table-widget-settings', + templateUrl: './entities-table-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class EntitiesTableWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entity-count-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entity-count-widget-settings.component.ts index 956158aafc..6b2ef15a65 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entity-count-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/entity/entity-count-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { countDefaultSettings } from '@home/components/widget/lib/count/count-widget.models'; @Component({ - selector: 'tb-entity-count-widget-settings', - templateUrl: './entity-count-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-entity-count-widget-settings', + templateUrl: './entity-count-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class EntityCountWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-config-single-device-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-config-single-device-widget-settings.component.ts index dcc8f15d2b..404a731df9 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-config-single-device-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-config-single-device-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-gateway-config-single-device-widget-settings', - templateUrl: './gateway-config-single-device-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-gateway-config-single-device-widget-settings', + templateUrl: './gateway-config-single-device-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class GatewayConfigSingleDeviceWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-config-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-config-widget-settings.component.ts index c63e19d4ec..6992b416ab 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-config-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-config-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-gateway-config-widget-settings', - templateUrl: './gateway-config-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-gateway-config-widget-settings', + templateUrl: './gateway-config-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class GatewayConfigWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-events-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-events-widget-settings.component.ts index b0f335726b..82551fa327 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-events-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-events-widget-settings.component.ts @@ -23,9 +23,10 @@ import { MatChipInputEvent } from '@angular/material/chips'; import { COMMA, ENTER, SEMICOLON } from '@angular/cdk/keycodes'; @Component({ - selector: 'tb-gateway-events-widget-settings', - templateUrl: './gateway-events-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-gateway-events-widget-settings', + templateUrl: './gateway-events-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class GatewayEventsWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-logs-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-logs-settings.component.ts index 9af2f702da..95d7b437da 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-logs-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-logs-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-gateway-logs-settings', - templateUrl: './gateway-logs-settings.component.html', - styleUrls: ['../widget-settings.scss'] + selector: 'tb-gateway-logs-settings', + templateUrl: './gateway-logs-settings.component.html', + styleUrls: ['../widget-settings.scss'], + standalone: false }) export class GatewayLogsSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-service-rpc-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-service-rpc-settings.component.ts index 720b2538a2..9e30608b3e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-service-rpc-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gateway/gateway-service-rpc-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-gateway-service-rpc-settings', - templateUrl: './gateway-service-rpc-settings.component.html', - styleUrls: ['../widget-settings.scss'] + selector: 'tb-gateway-service-rpc-settings', + templateUrl: './gateway-service-rpc-settings.component.html', + styleUrls: ['../widget-settings.scss'], + standalone: false }) export class GatewayServiceRPCSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-compass-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-compass-widget-settings.component.ts index 625f205507..40331412b6 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-compass-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-compass-widget-settings.component.ts @@ -22,9 +22,10 @@ import { Component } from '@angular/core'; import { COMMA, ENTER, SEMICOLON } from '@angular/cdk/keycodes'; @Component({ - selector: 'tb-analogue-compass-widget-settings', - templateUrl: './analogue-compass-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-analogue-compass-widget-settings', + templateUrl: './analogue-compass-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class AnalogueCompassWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-linear-gauge-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-linear-gauge-widget-settings.component.ts index ef7589de8c..58741c3350 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-linear-gauge-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-linear-gauge-widget-settings.component.ts @@ -24,9 +24,10 @@ import { } from '@home/components/widget/lib/settings/gauge/analogue-gauge-widget-settings.component'; @Component({ - selector: 'tb-analogue-linear-gauge-widget-settings', - templateUrl: './analogue-gauge-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-analogue-linear-gauge-widget-settings', + templateUrl: './analogue-gauge-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class AnalogueLinearGaugeWidgetSettingsComponent extends AnalogueGaugeWidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-radial-gauge-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-radial-gauge-widget-settings.component.ts index 891e248d67..6b60cf8ac0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-radial-gauge-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-radial-gauge-widget-settings.component.ts @@ -24,9 +24,10 @@ import { } from '@home/components/widget/lib/settings/gauge/analogue-gauge-widget-settings.component'; @Component({ - selector: 'tb-analogue-radial-gauge-widget-settings', - templateUrl: './analogue-gauge-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-analogue-radial-gauge-widget-settings', + templateUrl: './analogue-gauge-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class AnalogueRadialGaugeWidgetSettingsComponent extends AnalogueGaugeWidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/digital-gauge-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/digital-gauge-widget-settings.component.ts index e55bbeef66..ff22abd28a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/digital-gauge-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/digital-gauge-widget-settings.component.ts @@ -49,9 +49,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-digital-gauge-widget-settings', - templateUrl: './digital-gauge-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-digital-gauge-widget-settings', + templateUrl: './digital-gauge-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class DigitalGaugeWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/tick-value.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/tick-value.component.ts index dbc093a11f..82e8aacd1f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/tick-value.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/tick-value.component.ts @@ -27,16 +27,17 @@ import { Datasource } from '@shared/models/widget.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-tick-value', - templateUrl: './tick-value.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TickValueComponent), - multi: true - } - ] + selector: 'tb-tick-value', + templateUrl: './tick-value.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TickValueComponent), + multi: true + } + ], + standalone: false }) export class TickValueComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gpio/gpio-control-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gpio/gpio-control-widget-settings.component.ts index a65f85e500..059c027310 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gpio/gpio-control-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gpio/gpio-control-widget-settings.component.ts @@ -23,9 +23,10 @@ import { GpioItem, gpioItemValidator } from '@home/components/widget/lib/setting import { ContentType } from '@shared/models/constants'; @Component({ - selector: 'tb-gpio-control-widget-settings', - templateUrl: './gpio-control-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-gpio-control-widget-settings', + templateUrl: './gpio-control-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class GpioControlWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gpio/gpio-item.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gpio/gpio-item.component.ts index cae8737c3b..229fc61c6f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gpio/gpio-item.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gpio/gpio-item.component.ts @@ -55,16 +55,17 @@ export const gpioItemValidator = (hasColor: boolean): ValidatorFn => (control: A }; @Component({ - selector: 'tb-gpio-item', - templateUrl: './gpio-item.component.html', - styleUrls: ['./gpio-item.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => GpioItemComponent), - multi: true - } - ] + selector: 'tb-gpio-item', + templateUrl: './gpio-item.component.html', + styleUrls: ['./gpio-item.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => GpioItemComponent), + multi: true + } + ], + standalone: false }) export class GpioItemComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gpio/gpio-panel-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gpio/gpio-panel-widget-settings.component.ts index 0a2c20f0bf..dff3f9c3cb 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gpio/gpio-panel-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gpio/gpio-panel-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { GpioItem, gpioItemValidator } from '@home/components/widget/lib/settings/gpio/gpio-item.component'; @Component({ - selector: 'tb-gpio-panel-widget-settings', - templateUrl: './gpio-panel-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-gpio-panel-widget-settings', + templateUrl: './gpio-panel-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class GpioPanelWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/home-page/doc-links-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/home-page/doc-links-widget-settings.component.ts index 7fdb10dc99..b57de685f6 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/home-page/doc-links-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/home-page/doc-links-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-doc-links-widget-settings', - templateUrl: './doc-links-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-doc-links-widget-settings', + templateUrl: './doc-links-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class DocLinksWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/home-page/quick-links-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/home-page/quick-links-widget-settings.component.ts index 7e90c21767..48806e14ae 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/home-page/quick-links-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/home-page/quick-links-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-quick-links-widget-settings', - templateUrl: './quick-links-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-quick-links-widget-settings', + templateUrl: './quick-links-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class QuickLinksWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/battery-level-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/battery-level-widget-settings.component.ts index 41b28a3b4c..abd51b35d5 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/battery-level-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/battery-level-widget-settings.component.ts @@ -30,9 +30,10 @@ import { import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-battery-level-widget-settings', - templateUrl: './battery-level-widget-settings.component.html', - styleUrls: [] + selector: 'tb-battery-level-widget-settings', + templateUrl: './battery-level-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class BatteryLevelWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/liquid-level-card-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/liquid-level-card-widget-settings.component.ts index a0d0afc14d..f3086291d6 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/liquid-level-card-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/liquid-level-card-widget-settings.component.ts @@ -56,9 +56,10 @@ import { EntityService } from '@core/http/entity.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-liquid-level-card-widget-settings', - templateUrl: './liquid-level-card-widget-settings.component.html', - styleUrls: [] + selector: 'tb-liquid-level-card-widget-settings', + templateUrl: './liquid-level-card-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class LiquidLevelCardWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/signal-strength-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/signal-strength-widget-settings.component.ts index a676a8279b..6ce541273a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/signal-strength-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/signal-strength-widget-settings.component.ts @@ -30,9 +30,10 @@ import { DateFormatProcessor, DateFormatSettings } from '@shared/models/widget-s import { getSourceTbUnitSymbol } from '@shared/models/unit.models'; @Component({ - selector: 'tb-signal-strength-widget-settings', - templateUrl: './signal-strength-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'], + selector: 'tb-signal-strength-widget-settings', + templateUrl: './signal-strength-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class SignalStrengthWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/status-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/status-widget-settings.component.ts index b2327a94fa..942d2cf3c8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/status-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/status-widget-settings.component.ts @@ -28,9 +28,10 @@ import { import { ValueType } from '@shared/models/constants'; @Component({ - selector: 'tb-status-widget-settings', - templateUrl: './status-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'], + selector: 'tb-status-widget-settings', + templateUrl: './status-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class StatusWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/datakey-select-option.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/datakey-select-option.component.ts index 63689be5c5..1734b25c46 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/datakey-select-option.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/datakey-select-option.component.ts @@ -45,16 +45,17 @@ export const dataKeySelectOptionValidator = (control: AbstractControl) => { }; @Component({ - selector: 'tb-datakey-select-option', - templateUrl: './datakey-select-option.component.html', - styleUrls: ['./datakey-select-option.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DataKeySelectOptionComponent), - multi: true - } - ] + selector: 'tb-datakey-select-option', + templateUrl: './datakey-select-option.component.html', + styleUrls: ['./datakey-select-option.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DataKeySelectOptionComponent), + multi: true + } + ], + standalone: false }) export class DataKeySelectOptionComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/device-claiming-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/device-claiming-widget-settings.component.ts index a74152df79..00993a3b27 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/device-claiming-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/device-claiming-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-device-claiming-widget-settings', - templateUrl: './device-claiming-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-device-claiming-widget-settings', + templateUrl: './device-claiming-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class DeviceClaimingWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/photo-camera-input-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/photo-camera-input-widget-settings.component.ts index 7cd51b5722..8350ababa2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/photo-camera-input-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/photo-camera-input-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-photo-camera-input-widget-settings', - templateUrl: './photo-camera-input-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-photo-camera-input-widget-settings', + templateUrl: './photo-camera-input-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class PhotoCameraInputWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-attribute-general-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-attribute-general-settings.component.ts index 5d9703e95b..56dbc014c3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-attribute-general-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-attribute-general-settings.component.ts @@ -54,21 +54,22 @@ export function updateAttributeGeneralDefaultSettings(hasLabelValue = true): Upd } @Component({ - selector: 'tb-update-attribute-general-settings', - templateUrl: './update-attribute-general-settings.component.html', - styleUrls: ['./../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => UpdateAttributeGeneralSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => UpdateAttributeGeneralSettingsComponent), - multi: true - } - ] + selector: 'tb-update-attribute-general-settings', + templateUrl: './update-attribute-general-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => UpdateAttributeGeneralSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => UpdateAttributeGeneralSettingsComponent), + multi: true + } + ], + standalone: false }) export class UpdateAttributeGeneralSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-boolean-attribute-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-boolean-attribute-widget-settings.component.ts index fc212f5ae3..8e9e739543 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-boolean-attribute-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-boolean-attribute-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-update-boolean-attribute-widget-settings', - templateUrl: './update-boolean-attribute-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-update-boolean-attribute-widget-settings', + templateUrl: './update-boolean-attribute-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class UpdateBooleanAttributeWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-date-attribute-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-date-attribute-widget-settings.component.ts index 0e18de2ee0..895e0affc0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-date-attribute-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-date-attribute-widget-settings.component.ts @@ -25,9 +25,10 @@ import { } from '@home/components/widget/lib/settings/input/update-attribute-general-settings.component'; @Component({ - selector: 'tb-update-date-attribute-widget-settings', - templateUrl: './update-date-attribute-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-update-date-attribute-widget-settings', + templateUrl: './update-date-attribute-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class UpdateDateAttributeWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-double-attribute-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-double-attribute-widget-settings.component.ts index 305db7e982..1323f552aa 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-double-attribute-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-double-attribute-widget-settings.component.ts @@ -25,9 +25,10 @@ import { } from '@home/components/widget/lib/settings/input/update-attribute-general-settings.component'; @Component({ - selector: 'tb-update-double-attribute-widget-settings', - templateUrl: './update-double-attribute-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-update-double-attribute-widget-settings', + templateUrl: './update-double-attribute-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class UpdateDoubleAttributeWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-image-attribute-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-image-attribute-widget-settings.component.ts index 7839e48cfc..506fe0b69e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-image-attribute-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-image-attribute-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-update-image-attribute-widget-settings', - templateUrl: './update-image-attribute-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-update-image-attribute-widget-settings', + templateUrl: './update-image-attribute-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class UpdateImageAttributeWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-integer-attribute-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-integer-attribute-widget-settings.component.ts index 997b9d1805..3d6ad3fc8f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-integer-attribute-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-integer-attribute-widget-settings.component.ts @@ -25,9 +25,10 @@ import { } from '@home/components/widget/lib/settings/input/update-attribute-general-settings.component'; @Component({ - selector: 'tb-update-integer-attribute-widget-settings', - templateUrl: './update-integer-attribute-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-update-integer-attribute-widget-settings', + templateUrl: './update-integer-attribute-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class UpdateIntegerAttributeWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-json-attribute-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-json-attribute-widget-settings.component.ts index 84be46e289..2154c40f3a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-json-attribute-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-json-attribute-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-update-json-attribute-widget-settings', - templateUrl: './update-json-attribute-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-update-json-attribute-widget-settings', + templateUrl: './update-json-attribute-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class UpdateJsonAttributeWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-location-attribute-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-location-attribute-widget-settings.component.ts index 7756a465c8..18ecb43711 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-location-attribute-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-location-attribute-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-update-location-attribute-widget-settings', - templateUrl: './update-location-attribute-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-update-location-attribute-widget-settings', + templateUrl: './update-location-attribute-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class UpdateLocationAttributeWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-multiple-attributes-key-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-multiple-attributes-key-settings.component.ts index d29decfc04..c007c51ef8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-multiple-attributes-key-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-multiple-attributes-key-settings.component.ts @@ -30,9 +30,10 @@ import { } from '@home/components/widget/lib/multiple-input-widget.component'; @Component({ - selector: 'tb-update-multiple-attributes-key-settings', - templateUrl: './update-multiple-attributes-key-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-update-multiple-attributes-key-settings', + templateUrl: './update-multiple-attributes-key-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class UpdateMultipleAttributesKeySettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-multiple-attributes-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-multiple-attributes-widget-settings.component.ts index 880bce24c8..5fbfad3486 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-multiple-attributes-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-multiple-attributes-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-update-multiple-attributes-widget-settings', - templateUrl: './update-multiple-attributes-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-update-multiple-attributes-widget-settings', + templateUrl: './update-multiple-attributes-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class UpdateMultipleAttributesWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-string-attribute-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-string-attribute-widget-settings.component.ts index ca134d8c73..0eb561a5f3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-string-attribute-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/input/update-string-attribute-widget-settings.component.ts @@ -25,9 +25,10 @@ import { } from '@home/components/widget/lib/settings/input/update-attribute-general-settings.component'; @Component({ - selector: 'tb-update-string-attribute-widget-settings', - templateUrl: './update-string-attribute-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-update-string-attribute-widget-settings', + templateUrl: './update-string-attribute-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class UpdateStringAttributeWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/circle-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/circle-settings.component.ts index 173901aa16..f229998584 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/circle-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/circle-settings.component.ts @@ -39,21 +39,22 @@ import { Widget } from '@shared/models/widget.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-circle-settings', - templateUrl: './circle-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CircleSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => CircleSettingsComponent), - multi: true - } - ] + selector: 'tb-circle-settings', + templateUrl: './circle-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CircleSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => CircleSettingsComponent), + multi: true + } + ], + standalone: false }) export class CircleSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/common-map-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/common-map-settings.component.ts index 8c49152772..8702cf28f3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/common-map-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/common-map-settings.component.ts @@ -34,21 +34,22 @@ import { Widget } from '@shared/models/widget.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-common-map-settings', - templateUrl: './common-map-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CommonMapSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => CommonMapSettingsComponent), - multi: true - } - ] + selector: 'tb-common-map-settings', + templateUrl: './common-map-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CommonMapSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => CommonMapSettingsComponent), + multi: true + } + ], + standalone: false }) export class CommonMapSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/datasources-key-autocomplete.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/datasources-key-autocomplete.component.ts index c0c1ef98d4..7f085e920f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/datasources-key-autocomplete.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/datasources-key-autocomplete.component.ts @@ -28,16 +28,17 @@ import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-datasources-key-autocomplete', - templateUrl: './datasources-key-autocomplete.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DatasourcesKeyAutocompleteComponent), - multi: true - } - ] + selector: 'tb-datasources-key-autocomplete', + templateUrl: './datasources-key-autocomplete.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DatasourcesKeyAutocompleteComponent), + multi: true + } + ], + standalone: false }) export class DatasourcesKeyAutocompleteComponent extends PageComponent implements OnInit, ControlValueAccessor { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/google-map-provider-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/google-map-provider-settings.component.ts index b9d54db5a6..673f7fc573 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/google-map-provider-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/google-map-provider-settings.component.ts @@ -37,21 +37,22 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-google-map-provider-settings', - templateUrl: './google-map-provider-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => GoogleMapProviderSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => GoogleMapProviderSettingsComponent), - multi: true - } - ] + selector: 'tb-google-map-provider-settings', + templateUrl: './google-map-provider-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => GoogleMapProviderSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => GoogleMapProviderSettingsComponent), + multi: true + } + ], + standalone: false }) export class GoogleMapProviderSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/here-map-provider-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/here-map-provider-settings.component.ts index e201586a63..40140fb1ff 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/here-map-provider-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/here-map-provider-settings.component.ts @@ -38,21 +38,22 @@ import { isDefinedAndNotNull } from '@core/utils'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-here-map-provider-settings', - templateUrl: './here-map-provider-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => HereMapProviderSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => HereMapProviderSettingsComponent), - multi: true - } - ] + selector: 'tb-here-map-provider-settings', + templateUrl: './here-map-provider-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => HereMapProviderSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => HereMapProviderSettingsComponent), + multi: true + } + ], + standalone: false }) export class HereMapProviderSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/image-map-provider-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/image-map-provider-settings.component.ts index a5493468a0..338db7c24f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/image-map-provider-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/image-map-provider-settings.component.ts @@ -38,21 +38,22 @@ import { EntityService } from '@core/http/entity.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-image-map-provider-settings', - templateUrl: './image-map-provider-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ImageMapProviderSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => ImageMapProviderSettingsComponent), - multi: true - } - ] + selector: 'tb-image-map-provider-settings', + templateUrl: './image-map-provider-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ImageMapProviderSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => ImageMapProviderSettingsComponent), + multi: true + } + ], + standalone: false }) export class ImageMapProviderSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-editor-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-editor-settings.component.ts index 398376f71a..9d127af2d8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-editor-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-editor-settings.component.ts @@ -33,21 +33,22 @@ import { WidgetService } from '@core/http/widget.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-map-editor-settings', - templateUrl: './map-editor-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapEditorSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MapEditorSettingsComponent), - multi: true - } - ] + selector: 'tb-map-editor-settings', + templateUrl: './map-editor-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapEditorSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MapEditorSettingsComponent), + multi: true + } + ], + standalone: false }) export class MapEditorSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-provider-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-provider-settings.component.ts index 08b2a99e31..ea3b143db2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-provider-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-provider-settings.component.ts @@ -47,21 +47,22 @@ import { IAliasController } from '@core/api/widget-api.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-map-provider-settings', - templateUrl: './map-provider-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapProviderSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MapProviderSettingsComponent), - multi: true - } - ] + selector: 'tb-map-provider-settings', + templateUrl: './map-provider-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapProviderSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MapProviderSettingsComponent), + multi: true + } + ], + standalone: false }) export class MapProviderSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-settings-legacy.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-settings-legacy.component.ts index eb31c33075..5e98827469 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-settings-legacy.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-settings-legacy.component.ts @@ -53,21 +53,22 @@ import { Widget } from '@shared/models/widget.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-map-settings-legacy', - templateUrl: './map-settings-legacy.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MapSettingsLegacyComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MapSettingsLegacyComponent), - multi: true - } - ] + selector: 'tb-map-settings-legacy', + templateUrl: './map-settings-legacy.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MapSettingsLegacyComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MapSettingsLegacyComponent), + multi: true + } + ], + standalone: false }) export class MapSettingsLegacyComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-widget-settings-legacy.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-widget-settings-legacy.component.ts index 3262e6b1cb..4a804c8e78 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-widget-settings-legacy.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/map-widget-settings-legacy.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { defaultMapSettings } from 'src/app/modules/home/components/widget/lib/maps-legacy/map-models'; @Component({ - selector: 'tb-map-widget-settings-legacy', - templateUrl: './map-widget-settings-legacy.component.html', - styleUrls: ['./../../widget-settings.scss'] + selector: 'tb-map-widget-settings-legacy', + templateUrl: './map-widget-settings-legacy.component.html', + styleUrls: ['./../../widget-settings.scss'], + standalone: false }) export class MapWidgetSettingsLegacyComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/marker-clustering-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/marker-clustering-settings.component.ts index c757d7805a..6615302230 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/marker-clustering-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/marker-clustering-settings.component.ts @@ -34,21 +34,22 @@ import { WidgetService } from '@core/http/widget.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-marker-clustering-settings', - templateUrl: './marker-clustering-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MarkerClusteringSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MarkerClusteringSettingsComponent), - multi: true - } - ] + selector: 'tb-marker-clustering-settings', + templateUrl: './marker-clustering-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MarkerClusteringSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MarkerClusteringSettingsComponent), + multi: true + } + ], + standalone: false }) export class MarkerClusteringSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/markers-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/markers-settings.component.ts index d890494f54..65421d0f53 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/markers-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/markers-settings.component.ts @@ -36,21 +36,22 @@ import { WidgetService } from '@core/http/widget.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-markers-settings', - templateUrl: './markers-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MarkersSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MarkersSettingsComponent), - multi: true - } - ] + selector: 'tb-markers-settings', + templateUrl: './markers-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MarkersSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MarkersSettingsComponent), + multi: true + } + ], + standalone: false }) export class MarkersSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/openstreet-map-provider-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/openstreet-map-provider-settings.component.ts index ef650fc877..6a795edd84 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/openstreet-map-provider-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/openstreet-map-provider-settings.component.ts @@ -37,21 +37,22 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-openstreet-map-provider-settings', - templateUrl: './openstreet-map-provider-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => OpenStreetMapProviderSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => OpenStreetMapProviderSettingsComponent), - multi: true - } - ] + selector: 'tb-openstreet-map-provider-settings', + templateUrl: './openstreet-map-provider-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => OpenStreetMapProviderSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => OpenStreetMapProviderSettingsComponent), + multi: true + } + ], + standalone: false }) export class OpenStreetMapProviderSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/polygon-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/polygon-settings.component.ts index 129d268908..9b0b6e0110 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/polygon-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/polygon-settings.component.ts @@ -39,21 +39,22 @@ import { Widget } from '@shared/models/widget.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-polygon-settings', - templateUrl: './polygon-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => PolygonSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => PolygonSettingsComponent), - multi: true - } - ] + selector: 'tb-polygon-settings', + templateUrl: './polygon-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => PolygonSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => PolygonSettingsComponent), + multi: true + } + ], + standalone: false }) export class PolygonSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/route-map-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/route-map-settings.component.ts index 4a3cd9a3f8..cfba6811f2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/route-map-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/route-map-settings.component.ts @@ -33,21 +33,22 @@ import { WidgetService } from '@core/http/widget.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-route-map-settings', - templateUrl: './route-map-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => RouteMapSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => RouteMapSettingsComponent), - multi: true - } - ] + selector: 'tb-route-map-settings', + templateUrl: './route-map-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => RouteMapSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => RouteMapSettingsComponent), + multi: true + } + ], + standalone: false }) export class RouteMapSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/route-map-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/route-map-widget-settings.component.ts index 23bf193892..67e88aa7b5 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/route-map-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/route-map-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { defaultMapSettings } from 'src/app/modules/home/components/widget/lib/maps-legacy/map-models'; @Component({ - selector: 'tb-route-map-widget-settings', - templateUrl: './route-map-widget-settings.component.html', - styleUrls: ['./../../widget-settings.scss'] + selector: 'tb-route-map-widget-settings', + templateUrl: './route-map-widget-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + standalone: false }) export class RouteMapWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/tencent-map-provider-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/tencent-map-provider-settings.component.ts index d3f81a7ff3..4e6e8284d1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/tencent-map-provider-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/tencent-map-provider-settings.component.ts @@ -37,21 +37,22 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-tencent-map-provider-settings', - templateUrl: './tencent-map-provider-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TencentMapProviderSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TencentMapProviderSettingsComponent), - multi: true - } - ] + selector: 'tb-tencent-map-provider-settings', + templateUrl: './tencent-map-provider-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TencentMapProviderSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TencentMapProviderSettingsComponent), + multi: true + } + ], + standalone: false }) export class TencentMapProviderSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-common-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-common-settings.component.ts index 074cba4a5c..861188a6b9 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-common-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-common-settings.component.ts @@ -35,21 +35,22 @@ import { WidgetService } from '@core/http/widget.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-trip-animation-common-settings', - templateUrl: './trip-animation-common-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TripAnimationCommonSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TripAnimationCommonSettingsComponent), - multi: true - } - ] + selector: 'tb-trip-animation-common-settings', + templateUrl: './trip-animation-common-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TripAnimationCommonSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TripAnimationCommonSettingsComponent), + multi: true + } + ], + standalone: false }) export class TripAnimationCommonSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-marker-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-marker-settings.component.ts index f7ecd02f03..8f31d24f2f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-marker-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-marker-settings.component.ts @@ -34,21 +34,22 @@ import { WidgetService } from '@core/http/widget.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-trip-animation-marker-settings', - templateUrl: './trip-animation-marker-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TripAnimationMarkerSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TripAnimationMarkerSettingsComponent), - multi: true - } - ] + selector: 'tb-trip-animation-marker-settings', + templateUrl: './trip-animation-marker-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TripAnimationMarkerSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TripAnimationMarkerSettingsComponent), + multi: true + } + ], + standalone: false }) export class TripAnimationMarkerSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-path-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-path-settings.component.ts index 16c75cee56..9674ac2820 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-path-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-path-settings.component.ts @@ -37,21 +37,22 @@ import { WidgetService } from '@core/http/widget.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-trip-animation-path-settings', - templateUrl: './trip-animation-path-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TripAnimationPathSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TripAnimationPathSettingsComponent), - multi: true - } - ] + selector: 'tb-trip-animation-path-settings', + templateUrl: './trip-animation-path-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TripAnimationPathSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TripAnimationPathSettingsComponent), + multi: true + } + ], + standalone: false }) export class TripAnimationPathSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-point-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-point-settings.component.ts index 5e372051ad..8aae459e18 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-point-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-point-settings.component.ts @@ -38,21 +38,22 @@ import { WidgetService } from '@core/http/widget.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-trip-animation-point-settings', - templateUrl: './trip-animation-point-settings.component.html', - styleUrls: ['./../../widget-settings.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TripAnimationPointSettingsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => TripAnimationPointSettingsComponent), - multi: true - } - ] + selector: 'tb-trip-animation-point-settings', + templateUrl: './trip-animation-point-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TripAnimationPointSettingsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => TripAnimationPointSettingsComponent), + multi: true + } + ], + standalone: false }) export class TripAnimationPointSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-widget-settings.component.ts index 440fd5df2c..5d4e28d7bb 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/legacy/trip-animation-widget-settings.component.ts @@ -39,9 +39,10 @@ import { import { extractType } from '@core/utils'; @Component({ - selector: 'tb-trip-animation-widget-settings', - templateUrl: './trip-animation-widget-settings.component.html', - styleUrls: ['./../../widget-settings.scss'] + selector: 'tb-trip-animation-widget-settings', + templateUrl: './trip-animation-widget-settings.component.html', + styleUrls: ['./../../widget-settings.scss'], + standalone: false }) export class TripAnimationWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/map-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/map-widget-settings.component.ts index 296086b22f..3963f144fa 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/map-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/map/map-widget-settings.component.ts @@ -24,9 +24,10 @@ import { mapWidgetDefaultSettings } from '@home/components/widget/lib/maps/map-w import { WidgetConfigComponentData } from '@home/models/widget-component.models'; @Component({ - selector: 'tb-map-widget-settings', - templateUrl: './map-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-map-widget-settings', + templateUrl: './map-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class MapWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/navigation/navigation-card-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/navigation/navigation-card-widget-settings.component.ts index 08ee515099..b3f6c2838f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/navigation/navigation-card-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/navigation/navigation-card-widget-settings.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-navigation-card-widget-settings', - templateUrl: './navigation-card-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-navigation-card-widget-settings', + templateUrl: './navigation-card-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class NavigationCardWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/navigation/navigation-cards-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/navigation/navigation-cards-widget-settings.component.ts index 3ffe4d6c22..fc17f555d4 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/navigation/navigation-cards-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/navigation/navigation-cards-widget-settings.component.ts @@ -26,9 +26,10 @@ import { Observable, of, Subject } from 'rxjs'; import { map, mergeMap, share, startWith } from 'rxjs/operators'; @Component({ - selector: 'tb-navigation-cards-widget-settings', - templateUrl: './navigation-cards-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-navigation-cards-widget-settings', + templateUrl: './navigation-cards-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class NavigationCardsWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/scada/scada-symbol-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/scada/scada-symbol-widget-settings.component.ts index 361a305421..cc04e67f2f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/scada/scada-symbol-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/scada/scada-symbol-widget-settings.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { scadaSymbolWidgetDefaultSettings } from '@home/components/widget/lib/scada/scada-symbol-widget.models'; @Component({ - selector: 'tb-scada-symbol-widget-settings', - templateUrl: './scada-symbol-widget-settings.component.html', - styleUrls: ['./../widget-settings.scss'] + selector: 'tb-scada-symbol-widget-settings', + templateUrl: './scada-symbol-widget-settings.component.html', + styleUrls: ['./../widget-settings.scss'], + standalone: false }) export class ScadaSymbolWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/weather/wind-speed-direction-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/weather/wind-speed-direction-widget-settings.component.ts index 96ea317109..102dc7ade6 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/weather/wind-speed-direction-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/weather/wind-speed-direction-widget-settings.component.ts @@ -31,9 +31,10 @@ import { getDataKey } from '@shared/models/widget-settings.models'; import { getSourceTbUnitSymbol, TbUnit } from '@shared/models/unit.models'; @Component({ - selector: 'tb-wind-speed-direction-widget-settings', - templateUrl: './wind-speed-direction-widget-settings.component.html', - styleUrls: [] + selector: 'tb-wind-speed-direction-widget-settings', + templateUrl: './wind-speed-direction-widget-settings.component.html', + styleUrls: [], + standalone: false }) export class WindSpeedDirectionWidgetSettingsComponent extends WidgetSettingsComponent { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/timeseries-table-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/timeseries-table-widget.component.ts index 9235453e93..a7fcfee6d3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/timeseries-table-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/timeseries-table-widget.component.ts @@ -155,9 +155,10 @@ interface TimeseriesTableSource { } @Component({ - selector: 'tb-timeseries-table-widget', - templateUrl: './timeseries-table-widget.component.html', - styleUrls: ['./timeseries-table-widget.component.scss', './table-widget.scss'] + selector: 'tb-timeseries-table-widget', + templateUrl: './timeseries-table-widget.component.html', + styleUrls: ['./timeseries-table-widget.component.scss', './table-widget.scss'], + standalone: false }) export class TimeseriesTableWidgetComponent extends PageComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/trip-animation/trip-animation.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/trip-animation/trip-animation.component.ts index b69456ee30..9a7ea52d17 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/trip-animation/trip-animation.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/trip-animation/trip-animation.component.ts @@ -59,10 +59,11 @@ interface DataMap { } @Component({ - // eslint-disable-next-line @angular-eslint/component-selector - selector: 'trip-animation', - templateUrl: './trip-animation.component.html', - styleUrls: ['./trip-animation.component.scss'] + // eslint-disable-next-line @angular-eslint/component-selector + selector: 'trip-animation', + templateUrl: './trip-animation.component.html', + styleUrls: ['./trip-animation.component.scss'], + standalone: false }) export class TripAnimationComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/weather/wind-speed-direction-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/weather/wind-speed-direction-widget.component.ts index 1c3570ad0f..dbc7bf889d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/weather/wind-speed-direction-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/weather/wind-speed-direction-widget.component.ts @@ -68,10 +68,11 @@ const ticksTextMap: {[angle: number]: string} = { }; @Component({ - selector: 'tb-wind-speed-direction-widget', - templateUrl: './wind-speed-direction-widget.component.html', - styleUrls: ['./wind-speed-direction-widget.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-wind-speed-direction-widget', + templateUrl: './wind-speed-direction-widget.component.html', + styleUrls: ['./wind-speed-direction-widget.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class WindSpeedDirectionWidgetComponent implements OnInit, OnDestroy, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts index e30ee2e93d..a8fa966bd7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts @@ -87,21 +87,22 @@ import { WidgetService } from '@core/http/widget.service'; import Timeout = NodeJS.Timeout; @Component({ - selector: 'tb-widget-config', - templateUrl: './widget-config.component.html', - styleUrls: ['./widget-config.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => WidgetConfigComponent), - multi: true - }, - { - provide: NG_ASYNC_VALIDATORS, - useExisting: forwardRef(() => WidgetConfigComponent), - multi: true, - } - ] + selector: 'tb-widget-config', + templateUrl: './widget-config.component.html', + styleUrls: ['./widget-config.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => WidgetConfigComponent), + multi: true + }, + { + provide: NG_ASYNC_VALIDATORS, + useExisting: forwardRef(() => WidgetConfigComponent), + multi: true, + } + ], + standalone: false }) export class WidgetConfigComponent extends PageComponent implements OnInit, OnDestroy, ControlValueAccessor, AsyncValidator { diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-container.component.ts b/ui-ngx/src/app/modules/home/components/widget/widget-container.component.ts index 3a60c46f02..1fedcbec13 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-container.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget-container.component.ts @@ -67,11 +67,12 @@ export class WidgetComponentAction { // @dynamic @Component({ - selector: 'tb-widget-container', - templateUrl: './widget-container.component.html', - styleUrls: ['./widget-container.component.scss'], - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-widget-container', + templateUrl: './widget-container.component.html', + styleUrls: ['./widget-container.component.scss'], + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class WidgetContainerComponent extends PageComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy { @@ -394,7 +395,7 @@ export class WidgetContainerComponent extends PageComponent implements OnInit, O } @Component({ - template: ` + template: `
{{ 'widget.reference' | translate }} @@ -431,8 +432,9 @@ export class WidgetContainerComponent extends PageComponent implements OnInit, O
`, - styles: [], - encapsulation: ViewEncapsulation.None + styles: [], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class EditWidgetActionsTooltipComponent implements AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-preview.component.ts b/ui-ngx/src/app/modules/home/components/widget/widget-preview.component.ts index ea2770d0e5..d940696078 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-preview.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget-preview.component.ts @@ -24,9 +24,10 @@ import { deepClone } from '@core/utils'; import { Timewindow } from '@shared/models/time/time.models'; @Component({ - selector: 'tb-widget-preview', - templateUrl: './widget-preview.component.html', - styleUrls: ['./widget-preview.component.scss'] + selector: 'tb-widget-preview', + templateUrl: './widget-preview.component.html', + styleUrls: ['./widget-preview.component.scss'], + standalone: false }) export class WidgetPreviewComponent extends PageComponent implements OnInit, OnChanges { diff --git a/ui-ngx/src/app/modules/home/components/widget/widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/widget.component.ts index 26421012d4..d3a7bb5b83 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget.component.ts @@ -128,11 +128,12 @@ import { CompiledTbFunction, compileTbFunction, isNotEmptyTbFunction } from '@sh import { HttpClient } from '@angular/common/http'; @Component({ - selector: 'tb-widget', - templateUrl: './widget.component.html', - styleUrls: ['./widget.component.scss'], - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-widget', + templateUrl: './widget.component.html', + styleUrls: ['./widget.component.scss'], + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class WidgetComponent extends PageComponent implements OnInit, OnChanges, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/components/wizard/device-wizard-dialog.component.ts b/ui-ngx/src/app/modules/home/components/wizard/device-wizard-dialog.component.ts index 6c991d492a..c88be6b550 100644 --- a/ui-ngx/src/app/modules/home/components/wizard/device-wizard-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/wizard/device-wizard-dialog.component.ts @@ -35,9 +35,10 @@ import { CustomerId } from '@shared/models/id/customer-id'; import { HttpErrorResponse } from '@angular/common/http'; @Component({ - selector: 'tb-device-wizard', - templateUrl: './device-wizard-dialog.component.html', - styleUrls: ['./device-wizard-dialog.component.scss'] + selector: 'tb-device-wizard', + templateUrl: './device-wizard-dialog.component.html', + styleUrls: ['./device-wizard-dialog.component.scss'], + standalone: false }) export class DeviceWizardDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/dialogs/add-entities-to-customer-dialog.component.ts b/ui-ngx/src/app/modules/home/dialogs/add-entities-to-customer-dialog.component.ts index 31020d49a4..dd11ea16c8 100644 --- a/ui-ngx/src/app/modules/home/dialogs/add-entities-to-customer-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/dialogs/add-entities-to-customer-dialog.component.ts @@ -36,10 +36,11 @@ export interface AddEntitiesToCustomerDialogData { } @Component({ - selector: 'tb-add-entities-to-customer-dialog', - templateUrl: './add-entities-to-customer-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: AddEntitiesToCustomerDialogComponent}], - styleUrls: [] + selector: 'tb-add-entities-to-customer-dialog', + templateUrl: './add-entities-to-customer-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: AddEntitiesToCustomerDialogComponent }], + styleUrls: [], + standalone: false }) export class AddEntitiesToCustomerDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/dialogs/add-entities-to-edge-dialog.component.ts b/ui-ngx/src/app/modules/home/dialogs/add-entities-to-edge-dialog.component.ts index 18abe0c30e..e2c4568c8e 100644 --- a/ui-ngx/src/app/modules/home/dialogs/add-entities-to-edge-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/dialogs/add-entities-to-edge-dialog.component.ts @@ -38,10 +38,11 @@ export interface AddEntitiesToEdgeDialogData { } @Component({ - selector: 'tb-add-entities-to-edge-dialog', - templateUrl: './add-entities-to-edge-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: AddEntitiesToEdgeDialogComponent}], - styleUrls: [] + selector: 'tb-add-entities-to-edge-dialog', + templateUrl: './add-entities-to-edge-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: AddEntitiesToEdgeDialogComponent }], + styleUrls: [], + standalone: false }) export class AddEntitiesToEdgeDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/dialogs/assign-to-customer-dialog.component.ts b/ui-ngx/src/app/modules/home/dialogs/assign-to-customer-dialog.component.ts index 7bc7ad92a2..541312bf1a 100644 --- a/ui-ngx/src/app/modules/home/dialogs/assign-to-customer-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/dialogs/assign-to-customer-dialog.component.ts @@ -36,10 +36,11 @@ export interface AssignToCustomerDialogData { } @Component({ - selector: 'tb-assign-to-customer-dialog', - templateUrl: './assign-to-customer-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: AssignToCustomerDialogComponent}], - styleUrls: [] + selector: 'tb-assign-to-customer-dialog', + templateUrl: './assign-to-customer-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: AssignToCustomerDialogComponent }], + styleUrls: [], + standalone: false }) export class AssignToCustomerDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/home.component.ts b/ui-ngx/src/app/modules/home/home.component.ts index 25edc77b33..6191280933 100644 --- a/ui-ngx/src/app/modules/home/home.component.ts +++ b/ui-ngx/src/app/modules/home/home.component.ts @@ -36,9 +36,10 @@ import { ActivatedRoute } from '@angular/router'; import { isDefined, isDefinedAndNotNull } from '@core/utils'; @Component({ - selector: 'tb-home', - templateUrl: './home.component.html', - styleUrls: ['./home.component.scss'] + selector: 'tb-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.scss'], + standalone: false }) export class HomeComponent extends PageComponent implements AfterViewInit, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/menu/menu-link.component.ts b/ui-ngx/src/app/modules/home/menu/menu-link.component.ts index 20b8957b15..95abc6623b 100644 --- a/ui-ngx/src/app/modules/home/menu/menu-link.component.ts +++ b/ui-ngx/src/app/modules/home/menu/menu-link.component.ts @@ -18,10 +18,11 @@ import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core import { MenuSection } from '@core/services/menu.models'; @Component({ - selector: 'tb-menu-link', - templateUrl: './menu-link.component.html', - styleUrls: ['./menu-link.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-menu-link', + templateUrl: './menu-link.component.html', + styleUrls: ['./menu-link.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class MenuLinkComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/menu/menu-toggle.component.ts b/ui-ngx/src/app/modules/home/menu/menu-toggle.component.ts index cd00627433..4415e9f580 100644 --- a/ui-ngx/src/app/modules/home/menu/menu-toggle.component.ts +++ b/ui-ngx/src/app/modules/home/menu/menu-toggle.component.ts @@ -22,10 +22,11 @@ import { AppState } from '@core/core.state'; import { ActionPreferencesUpdateOpenedMenuSection } from '@core/auth/auth.actions'; @Component({ - selector: 'tb-menu-toggle', - templateUrl: './menu-toggle.component.html', - styleUrls: ['./menu-toggle.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-menu-toggle', + templateUrl: './menu-toggle.component.html', + styleUrls: ['./menu-toggle.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class MenuToggleComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/menu/side-menu.component.ts b/ui-ngx/src/app/modules/home/menu/side-menu.component.ts index 6194146781..f266cee1a8 100644 --- a/ui-ngx/src/app/modules/home/menu/side-menu.component.ts +++ b/ui-ngx/src/app/modules/home/menu/side-menu.component.ts @@ -19,10 +19,11 @@ import { MenuService } from '@core/services/menu.service'; import { MenuSection } from '@core/services/menu.models'; @Component({ - selector: 'tb-side-menu', - templateUrl: './side-menu.component.html', - styleUrls: ['./side-menu.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-side-menu', + templateUrl: './side-menu.component.html', + styleUrls: ['./side-menu.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class SideMenuComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/admin/auto-commit-admin-settings.component.ts b/ui-ngx/src/app/modules/home/pages/admin/auto-commit-admin-settings.component.ts index 950f1606c2..94134bb100 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/auto-commit-admin-settings.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/auto-commit-admin-settings.component.ts @@ -25,9 +25,10 @@ import { selectHasRepository } from '@core/auth/auth.selectors'; import { RepositorySettingsComponent } from '@home/components/vc/repository-settings.component'; @Component({ - selector: 'tb-auto-commit-admin-settings', - templateUrl: './auto-commit-admin-settings.component.html', - styleUrls: [] + selector: 'tb-auto-commit-admin-settings', + templateUrl: './auto-commit-admin-settings.component.html', + styleUrls: [], + standalone: false }) export class AutoCommitAdminSettingsComponent extends PageComponent implements OnInit, HasConfirmForm { diff --git a/ui-ngx/src/app/modules/home/pages/admin/general-settings.component.ts b/ui-ngx/src/app/modules/home/pages/admin/general-settings.component.ts index e4634370d3..72543b5e6b 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/general-settings.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/general-settings.component.ts @@ -31,9 +31,10 @@ import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-general-settings', - templateUrl: './general-settings.component.html', - styleUrls: ['./general-settings.component.scss', './settings-card.scss'] + selector: 'tb-general-settings', + templateUrl: './general-settings.component.html', + styleUrls: ['./general-settings.component.scss', './settings-card.scss'], + standalone: false }) export class GeneralSettingsComponent extends PageComponent implements HasConfirmForm, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/admin/home-settings.component.ts b/ui-ngx/src/app/modules/home/pages/admin/home-settings.component.ts index a02d27f1bb..b518c4138d 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/home-settings.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/home-settings.component.ts @@ -27,9 +27,10 @@ import { isDefinedAndNotNull } from '@core/utils'; import { DashboardId } from '@shared/models/id/dashboard-id'; @Component({ - selector: 'tb-home-settings', - templateUrl: './home-settings.component.html', - styleUrls: ['./home-settings.component.scss', './settings-card.scss'] + selector: 'tb-home-settings', + templateUrl: './home-settings.component.html', + styleUrls: ['./home-settings.component.scss', './settings-card.scss'], + standalone: false }) export class HomeSettingsComponent extends PageComponent implements OnInit, HasConfirmForm { diff --git a/ui-ngx/src/app/modules/home/pages/admin/mail-server.component.ts b/ui-ngx/src/app/modules/home/pages/admin/mail-server.component.ts index c5126d5d10..bc226933b4 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/mail-server.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/mail-server.component.ts @@ -38,9 +38,10 @@ import { DomainSchema, domainSchemaTranslations, } from '@shared/models/oauth2.m import { WINDOW } from '@core/services/window.service'; @Component({ - selector: 'tb-mail-server', - templateUrl: './mail-server.component.html', - styleUrls: ['./mail-server.component.scss', './settings-card.scss'] + selector: 'tb-mail-server', + templateUrl: './mail-server.component.html', + styleUrls: ['./mail-server.component.scss', './settings-card.scss'], + standalone: false }) export class MailServerComponent extends PageComponent implements OnInit, OnDestroy, HasConfirmForm { adminSettings: AdminSettings; diff --git a/ui-ngx/src/app/modules/home/pages/admin/oauth2/clients/client-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/admin/oauth2/clients/client-dialog.component.ts index 26cbc1002d..ef2c44e8de 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/oauth2/clients/client-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/oauth2/clients/client-dialog.component.ts @@ -27,10 +27,11 @@ import { ClientComponent } from '@home/pages/admin/oauth2/clients/client.compone import { ErrorStateMatcher } from '@angular/material/core'; @Component({ - selector: 'tb-client-dialog', - templateUrl: './client-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: ClientDialogComponent}], - styleUrls: [] + selector: 'tb-client-dialog', + templateUrl: './client-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: ClientDialogComponent }], + styleUrls: [], + standalone: false }) export class ClientDialogComponent extends DialogComponent implements OnDestroy, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/pages/admin/oauth2/clients/client-table-header.component.ts b/ui-ngx/src/app/modules/home/pages/admin/oauth2/clients/client-table-header.component.ts index 3ec2eed2f0..b0d28a8a1e 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/oauth2/clients/client-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/oauth2/clients/client-table-header.component.ts @@ -22,9 +22,10 @@ import { OAuth2Client, OAuth2ClientInfo } from '@shared/models/oauth2.models'; import { PageLink } from '@shared/models/page/page-link'; @Component({ - selector: 'tb-client-table-header', - templateUrl: './client-table-header.component.html', - styleUrls: [] + selector: 'tb-client-table-header', + templateUrl: './client-table-header.component.html', + styleUrls: [], + standalone: false }) export class ClientTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/pages/admin/oauth2/clients/client.component.ts b/ui-ngx/src/app/modules/home/pages/admin/oauth2/clients/client.component.ts index 7298f339f2..151b56df6c 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/oauth2/clients/client.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/oauth2/clients/client.component.ts @@ -44,9 +44,10 @@ import { getCurrentAuthUser } from '@core/auth/auth.selectors'; import { Authority } from '@shared/models/authority.enum'; @Component({ - selector: 'tb-client', - templateUrl: './client.component.html', - styleUrls: ['./client.component.scss'] + selector: 'tb-client', + templateUrl: './client.component.html', + styleUrls: ['./client.component.scss'], + standalone: false }) export class ClientComponent extends EntityComponent implements OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/admin/oauth2/domains/domain-table-header.component.ts b/ui-ngx/src/app/modules/home/pages/admin/oauth2/domains/domain-table-header.component.ts index 91e18ec8b3..ff94740791 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/oauth2/domains/domain-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/oauth2/domains/domain-table-header.component.ts @@ -21,9 +21,10 @@ import { AppState } from '@core/core.state'; import { DomainInfo } from '@shared/models/oauth2.models'; @Component({ - selector: 'tb-domain-table-header', - templateUrl: './domain-table-header.component.html', - styleUrls: [] + selector: 'tb-domain-table-header', + templateUrl: './domain-table-header.component.html', + styleUrls: [], + standalone: false }) export class DomainTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/pages/admin/oauth2/domains/domain.component.ts b/ui-ngx/src/app/modules/home/pages/admin/oauth2/domains/domain.component.ts index ffa4934480..f01c14b19f 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/oauth2/domains/domain.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/oauth2/domains/domain.component.ts @@ -31,9 +31,10 @@ import { ClientDialogComponent } from '@home/pages/admin/oauth2/clients/client-d import { EntityType } from '@shared/models/entity-type.models'; @Component({ - selector: 'tb-domain', - templateUrl: './domain.component.html', - styleUrls: [] + selector: 'tb-domain', + templateUrl: './domain.component.html', + styleUrls: [], + standalone: false }) export class DomainComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/home/pages/admin/queue/queue.component.ts b/ui-ngx/src/app/modules/home/pages/admin/queue/queue.component.ts index 371fab4a69..082243c6ac 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/queue/queue.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/queue/queue.component.ts @@ -26,9 +26,10 @@ import { EntityTableConfig } from '@home/models/entity/entities-table-config.mod import { ActionNotificationShow } from '@core/notification/notification.actions'; @Component({ - selector: 'tb-queue', - templateUrl: './queue.component.html', - styleUrls: [] + selector: 'tb-queue', + templateUrl: './queue.component.html', + styleUrls: [], + standalone: false }) export class QueueComponent extends EntityComponent { entityForm: UntypedFormGroup; diff --git a/ui-ngx/src/app/modules/home/pages/admin/repository-admin-settings.component.ts b/ui-ngx/src/app/modules/home/pages/admin/repository-admin-settings.component.ts index 46927f4671..4390484467 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/repository-admin-settings.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/repository-admin-settings.component.ts @@ -23,9 +23,10 @@ import { UntypedFormGroup } from '@angular/forms'; import { RepositorySettingsComponent } from '@home/components/vc/repository-settings.component'; @Component({ - selector: 'tb-repository-admin-settings', - templateUrl: './repository-admin-settings.component.html', - styleUrls: [] + selector: 'tb-repository-admin-settings', + templateUrl: './repository-admin-settings.component.html', + styleUrls: [], + standalone: false }) export class RepositoryAdminSettingsComponent extends PageComponent implements OnInit, HasConfirmForm { diff --git a/ui-ngx/src/app/modules/home/pages/admin/resource/js-library-table-header.component.ts b/ui-ngx/src/app/modules/home/pages/admin/resource/js-library-table-header.component.ts index 814ae7cf34..83d6248c92 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/resource/js-library-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/resource/js-library-table-header.component.ts @@ -22,9 +22,10 @@ import { Resource, ResourceInfo, ResourceSubType, ResourceSubTypeTranslationMap import { PageLink } from '@shared/models/page/page-link'; @Component({ - selector: 'tb-js-library-table-header', - templateUrl: './js-library-table-header.component.html', - styleUrls: [] + selector: 'tb-js-library-table-header', + templateUrl: './js-library-table-header.component.html', + styleUrls: [], + standalone: false }) export class JsLibraryTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/pages/admin/resource/js-resource.component.ts b/ui-ngx/src/app/modules/home/pages/admin/resource/js-resource.component.ts index 06e6381595..bc25e87dab 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/resource/js-resource.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/resource/js-resource.component.ts @@ -36,8 +36,9 @@ import { base64toString, isDefinedAndNotNull, stringToBase64 } from '@core/utils import { getCurrentAuthState } from '@core/auth/auth.selectors'; @Component({ - selector: 'tb-js-resource', - templateUrl: './js-resource.component.html' + selector: 'tb-js-resource', + templateUrl: './js-resource.component.html', + standalone: false }) export class JsResourceComponent extends EntityComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/admin/resource/resource-library-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/admin/resource/resource-library-tabs.component.ts index 22599d7d73..4ed898bcc2 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/resource/resource-library-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/resource/resource-library-tabs.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { NULL_UUID } from '@shared/models/id/has-uuid'; @Component({ - selector: 'tb-resource-library-tabs', - templateUrl: './resource-library-tabs.component.html', - styleUrls: [] + selector: 'tb-resource-library-tabs', + templateUrl: './resource-library-tabs.component.html', + styleUrls: [], + standalone: false }) export class ResourceLibraryTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/admin/resource/resource-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/admin/resource/resource-tabs.component.ts index bd831acdc6..ff12763bfc 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/resource/resource-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/resource/resource-tabs.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { NULL_UUID } from '@shared/models/id/has-uuid'; @Component({ - selector: 'tb-resource-tabs', - templateUrl: './resource-tabs.component.html', - styleUrls: [] + selector: 'tb-resource-tabs', + templateUrl: './resource-tabs.component.html', + styleUrls: [], + standalone: false }) export class ResourceTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/admin/resource/resources-table-header.component.ts b/ui-ngx/src/app/modules/home/pages/admin/resource/resources-table-header.component.ts index 8b7ff4babc..33ed389a29 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/resource/resources-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/resource/resources-table-header.component.ts @@ -22,9 +22,10 @@ import { Resource, ResourceInfo, ResourceType, ResourceTypeTranslationMap } from import { PageLink } from '@shared/models/page/page-link'; @Component({ - selector: 'tb-resources-table-header', - templateUrl: './resources-table-header.component.html', - styleUrls: [] + selector: 'tb-resources-table-header', + templateUrl: './resources-table-header.component.html', + styleUrls: [], + standalone: false }) export class ResourcesTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/pages/admin/security-settings.component.ts b/ui-ngx/src/app/modules/home/pages/admin/security-settings.component.ts index 74c28f05ad..12375a68ac 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/security-settings.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/security-settings.component.ts @@ -40,9 +40,10 @@ import { Observable, of } from 'rxjs'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-security-settings', - templateUrl: './security-settings.component.html', - styleUrls: ['./security-settings.component.scss', './settings-card.scss'] + selector: 'tb-security-settings', + templateUrl: './security-settings.component.html', + styleUrls: ['./security-settings.component.scss', './settings-card.scss'], + standalone: false }) export class SecuritySettingsComponent extends PageComponent implements HasConfirmForm { diff --git a/ui-ngx/src/app/modules/home/pages/admin/send-test-sms-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/admin/send-test-sms-dialog.component.ts index 73687aabb3..f13dd74daa 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/send-test-sms-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/send-test-sms-dialog.component.ts @@ -31,9 +31,10 @@ export interface SendTestSmsDialogData { } @Component({ - selector: 'tb-send-test-sms-dialog', - templateUrl: './send-test-sms-dialog.component.html', - styleUrls: [] + selector: 'tb-send-test-sms-dialog', + templateUrl: './send-test-sms-dialog.component.html', + styleUrls: [], + standalone: false }) export class SendTestSmsDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/admin/sms-provider.component.ts b/ui-ngx/src/app/modules/home/pages/admin/sms-provider.component.ts index fa8bca245e..ed259cecee 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/sms-provider.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/sms-provider.component.ts @@ -33,9 +33,10 @@ import { AuthUser } from '@shared/models/user.model'; import { getCurrentAuthUser } from '@core/auth/auth.selectors'; @Component({ - selector: 'tb-sms-provider', - templateUrl: './sms-provider.component.html', - styleUrls: ['./sms-provider.component.scss', './settings-card.scss'] + selector: 'tb-sms-provider', + templateUrl: './sms-provider.component.html', + styleUrls: ['./sms-provider.component.scss', './settings-card.scss'], + standalone: false }) export class SmsProviderComponent extends PageComponent implements HasConfirmForm { diff --git a/ui-ngx/src/app/modules/home/pages/admin/trendz-settings.component.ts b/ui-ngx/src/app/modules/home/pages/admin/trendz-settings.component.ts index 8b9d73c73f..44b5dd3b6e 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/trendz-settings.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/trendz-settings.component.ts @@ -26,9 +26,10 @@ import { AppState } from "@core/core.state"; import { ActionAuthUpdateTrendzSettings } from "@core/auth/auth.actions"; @Component({ - selector: 'tb-trendz-settings', - templateUrl: './trendz-settings.component.html', - styleUrls: ['./trendz-settings.component.scss', './settings-card.scss'] + selector: 'tb-trendz-settings', + templateUrl: './trendz-settings.component.html', + styleUrls: ['./trendz-settings.component.scss', './settings-card.scss'], + standalone: false }) export class TrendzSettingsComponent extends PageComponent implements OnInit, HasConfirmForm { diff --git a/ui-ngx/src/app/modules/home/pages/admin/two-factor-auth-settings.component.ts b/ui-ngx/src/app/modules/home/pages/admin/two-factor-auth-settings.component.ts index 3d8cc5efde..a70996291d 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/two-factor-auth-settings.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/two-factor-auth-settings.component.ts @@ -34,9 +34,10 @@ import { takeUntil } from 'rxjs/operators'; import { MatExpansionPanel } from '@angular/material/expansion'; @Component({ - selector: 'tb-2fa-settings', - templateUrl: './two-factor-auth-settings.component.html', - styleUrls: [ './settings-card.scss', './two-factor-auth-settings.component.scss'] + selector: 'tb-2fa-settings', + templateUrl: './two-factor-auth-settings.component.html', + styleUrls: ['./settings-card.scss', './two-factor-auth-settings.component.scss'], + standalone: false }) export class TwoFactorAuthSettingsComponent extends PageComponent implements OnInit, HasConfirmForm, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/ai-model/ai-model-table-header.component.ts b/ui-ngx/src/app/modules/home/pages/ai-model/ai-model-table-header.component.ts index f416e75033..fb9d1e814e 100644 --- a/ui-ngx/src/app/modules/home/pages/ai-model/ai-model-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/pages/ai-model/ai-model-table-header.component.ts @@ -21,14 +21,15 @@ import { AppState } from '@core/core.state'; import { AiModel } from '@shared/models/ai-model.models'; @Component({ - selector: 'tb-ai-model-table-header', - templateUrl: './ai-model-table-header.component.html', - styles: [` + selector: 'tb-ai-model-table-header', + templateUrl: './ai-model-table-header.component.html', + styles: [` :host { width: 100%; } `], - styleUrls: [] + styleUrls: [], + standalone: false }) export class AiModelTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/pages/asset-profile/asset-profile-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/asset-profile/asset-profile-tabs.component.ts index 836e46d2fe..a7ce0082cd 100644 --- a/ui-ngx/src/app/modules/home/pages/asset-profile/asset-profile-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/asset-profile/asset-profile-tabs.component.ts @@ -21,9 +21,10 @@ import { EntityTabsComponent } from '../../components/entity/entity-tabs.compone import { AssetProfile } from '@shared/models/asset.models'; @Component({ - selector: 'tb-asset-profile-tabs', - templateUrl: './asset-profile-tabs.component.html', - styleUrls: [] + selector: 'tb-asset-profile-tabs', + templateUrl: './asset-profile-tabs.component.html', + styleUrls: [], + standalone: false }) export class AssetProfileTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/asset/asset-table-header.component.ts b/ui-ngx/src/app/modules/home/pages/asset/asset-table-header.component.ts index 8be127163e..d65362733e 100644 --- a/ui-ngx/src/app/modules/home/pages/asset/asset-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/pages/asset/asset-table-header.component.ts @@ -23,9 +23,10 @@ import { AssetInfo } from '@shared/models/asset.models'; import { AssetProfileId } from '@shared/models/id/asset-profile-id'; @Component({ - selector: 'tb-asset-table-header', - templateUrl: './asset-table-header.component.html', - styleUrls: [] + selector: 'tb-asset-table-header', + templateUrl: './asset-table-header.component.html', + styleUrls: [], + standalone: false }) export class AssetTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/pages/asset/asset-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/asset/asset-tabs.component.ts index 47509bf309..10ef434755 100644 --- a/ui-ngx/src/app/modules/home/pages/asset/asset-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/asset/asset-tabs.component.ts @@ -21,9 +21,10 @@ import { EntityTabsComponent } from '../../components/entity/entity-tabs.compone import { AssetInfo } from '@app/shared/models/asset.models'; @Component({ - selector: 'tb-asset-tabs', - templateUrl: './asset-tabs.component.html', - styleUrls: [] + selector: 'tb-asset-tabs', + templateUrl: './asset-tabs.component.html', + styleUrls: [], + standalone: false }) export class AssetTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/asset/asset.component.ts b/ui-ngx/src/app/modules/home/pages/asset/asset.component.ts index bd6d94b1e0..4f8e3b7c63 100644 --- a/ui-ngx/src/app/modules/home/pages/asset/asset.component.ts +++ b/ui-ngx/src/app/modules/home/pages/asset/asset.component.ts @@ -27,9 +27,10 @@ import { AssetInfo } from '@app/shared/models/asset.models'; import { EntityTableConfig } from '@home/models/entity/entities-table-config.models'; @Component({ - selector: 'tb-asset', - templateUrl: './asset.component.html', - styleUrls: ['./asset.component.scss'] + selector: 'tb-asset', + templateUrl: './asset.component.html', + styleUrls: ['./asset.component.scss'], + standalone: false }) export class AssetComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/home/pages/customer/customer-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/customer/customer-tabs.component.ts index 13afac05ac..0bf2f691a0 100644 --- a/ui-ngx/src/app/modules/home/pages/customer/customer-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/customer/customer-tabs.component.ts @@ -21,9 +21,10 @@ import { EntityTabsComponent } from '../../components/entity/entity-tabs.compone import { Customer } from '@shared/models/customer.model'; @Component({ - selector: 'tb-customer-tabs', - templateUrl: './customer-tabs.component.html', - styleUrls: [] + selector: 'tb-customer-tabs', + templateUrl: './customer-tabs.component.html', + styleUrls: [], + standalone: false }) export class CustomerTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/customer/customer.component.ts b/ui-ngx/src/app/modules/home/pages/customer/customer.component.ts index 6a90ac0b03..0eb5681cc2 100644 --- a/ui-ngx/src/app/modules/home/pages/customer/customer.component.ts +++ b/ui-ngx/src/app/modules/home/pages/customer/customer.component.ts @@ -29,9 +29,10 @@ import { AuthState } from '@core/auth/auth.models'; import { CountryData } from '@shared/models/country.models'; @Component({ - selector: 'tb-customer', - templateUrl: './customer.component.html', - styleUrls: ['./customer.component.scss'] + selector: 'tb-customer', + templateUrl: './customer.component.html', + styleUrls: ['./customer.component.scss'], + standalone: false }) export class CustomerComponent extends ContactBasedComponent { diff --git a/ui-ngx/src/app/modules/home/pages/dashboard/dashboard-form.component.ts b/ui-ngx/src/app/modules/home/pages/dashboard/dashboard-form.component.ts index fffcce8380..c3eb9f1b00 100644 --- a/ui-ngx/src/app/modules/home/pages/dashboard/dashboard-form.component.ts +++ b/ui-ngx/src/app/modules/home/pages/dashboard/dashboard-form.component.ts @@ -33,9 +33,10 @@ import { isEqual } from '@core/utils'; import { EntityType } from '@shared/models/entity-type.models'; @Component({ - selector: 'tb-dashboard-form', - templateUrl: './dashboard-form.component.html', - styleUrls: ['./dashboard-form.component.scss'] + selector: 'tb-dashboard-form', + templateUrl: './dashboard-form.component.html', + styleUrls: ['./dashboard-form.component.scss'], + standalone: false }) export class DashboardFormComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/home/pages/dashboard/dashboard-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/dashboard/dashboard-tabs.component.ts index 88610d212c..52e4c180a8 100644 --- a/ui-ngx/src/app/modules/home/pages/dashboard/dashboard-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/dashboard/dashboard-tabs.component.ts @@ -21,9 +21,10 @@ import { EntityTabsComponent } from '../../components/entity/entity-tabs.compone import { Dashboard } from '@shared/models/dashboard.models'; @Component({ - selector: 'tb-dashboard-tabs', - templateUrl: './dashboard-tabs.component.html', - styleUrls: [] + selector: 'tb-dashboard-tabs', + templateUrl: './dashboard-tabs.component.html', + styleUrls: [], + standalone: false }) export class DashboardTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/dashboard/make-dashboard-public-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/dashboard/make-dashboard-public-dialog.component.ts index 0af06fd787..ede15ab957 100644 --- a/ui-ngx/src/app/modules/home/pages/dashboard/make-dashboard-public-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/dashboard/make-dashboard-public-dialog.component.ts @@ -31,9 +31,10 @@ export interface MakeDashboardPublicDialogData { } @Component({ - selector: 'tb-make-dashboard-public-dialog', - templateUrl: './make-dashboard-public-dialog.component.html', - styleUrls: [] + selector: 'tb-make-dashboard-public-dialog', + templateUrl: './make-dashboard-public-dialog.component.html', + styleUrls: [], + standalone: false }) export class MakeDashboardPublicDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/dashboard/manage-dashboard-customers-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/dashboard/manage-dashboard-customers-dialog.component.ts index eb25e7cba1..ab1da02eef 100644 --- a/ui-ngx/src/app/modules/home/pages/dashboard/manage-dashboard-customers-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/dashboard/manage-dashboard-customers-dialog.component.ts @@ -35,10 +35,11 @@ export interface ManageDashboardCustomersDialogData { } @Component({ - selector: 'tb-manage-dashboard-customers-dialog', - templateUrl: './manage-dashboard-customers-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: ManageDashboardCustomersDialogComponent}], - styleUrls: [] + selector: 'tb-manage-dashboard-customers-dialog', + templateUrl: './manage-dashboard-customers-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: ManageDashboardCustomersDialogComponent }], + styleUrls: [], + standalone: false }) export class ManageDashboardCustomersDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/pages/device-profile/device-profile-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/device-profile/device-profile-tabs.component.ts index e7984ee009..1a762ac881 100644 --- a/ui-ngx/src/app/modules/home/pages/device-profile/device-profile-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device-profile/device-profile-tabs.component.ts @@ -27,9 +27,10 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-device-profile-tabs', - templateUrl: './device-profile-tabs.component.html', - styleUrls: [] + selector: 'tb-device-profile-tabs', + templateUrl: './device-profile-tabs.component.html', + styleUrls: [], + standalone: false }) export class DeviceProfileTabsComponent extends EntityTabsComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/device/data/coap-device-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/pages/device/data/coap-device-transport-configuration.component.ts index 0dce317071..15c5a7eaa6 100644 --- a/ui-ngx/src/app/modules/home/pages/device/data/coap-device-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/data/coap-device-transport-configuration.component.ts @@ -29,14 +29,15 @@ import { takeUntil } from 'rxjs/operators'; import { isDefinedAndNotNull } from '@core/utils'; @Component({ - selector: 'tb-coap-device-transport-configuration', - templateUrl: './coap-device-transport-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CoapDeviceTransportConfigurationComponent), - multi: true - }] + selector: 'tb-coap-device-transport-configuration', + templateUrl: './coap-device-transport-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CoapDeviceTransportConfigurationComponent), + multi: true + }], + standalone: false }) export class CoapDeviceTransportConfigurationComponent implements ControlValueAccessor, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/device/data/default-device-configuration.component.ts b/ui-ngx/src/app/modules/home/pages/device/data/default-device-configuration.component.ts index 4e4c4b51a1..ff39e03bb0 100644 --- a/ui-ngx/src/app/modules/home/pages/device/data/default-device-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/data/default-device-configuration.component.ts @@ -27,14 +27,15 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-default-device-configuration', - templateUrl: './default-device-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DefaultDeviceConfigurationComponent), - multi: true - }] + selector: 'tb-default-device-configuration', + templateUrl: './default-device-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DefaultDeviceConfigurationComponent), + multi: true + }], + standalone: false }) export class DefaultDeviceConfigurationComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/device/data/default-device-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/pages/device/data/default-device-transport-configuration.component.ts index 1e196210fc..fe6238ab90 100644 --- a/ui-ngx/src/app/modules/home/pages/device/data/default-device-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/data/default-device-transport-configuration.component.ts @@ -27,14 +27,15 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-default-device-transport-configuration', - templateUrl: './default-device-transport-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DefaultDeviceTransportConfigurationComponent), - multi: true - }] + selector: 'tb-default-device-transport-configuration', + templateUrl: './default-device-transport-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DefaultDeviceTransportConfigurationComponent), + multi: true + }], + standalone: false }) export class DefaultDeviceTransportConfigurationComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/device/data/device-configuration.component.ts b/ui-ngx/src/app/modules/home/pages/device/data/device-configuration.component.ts index 54432ccf11..aab6c76339 100644 --- a/ui-ngx/src/app/modules/home/pages/device/data/device-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/data/device-configuration.component.ts @@ -24,14 +24,15 @@ import { deepClone } from '@core/utils'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-device-configuration', - templateUrl: './device-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceConfigurationComponent), - multi: true - }] + selector: 'tb-device-configuration', + templateUrl: './device-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceConfigurationComponent), + multi: true + }], + standalone: false }) export class DeviceConfigurationComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/device/data/device-data.component.ts b/ui-ngx/src/app/modules/home/pages/device/data/device-data.component.ts index 9acf174e4b..c6f03a84f1 100644 --- a/ui-ngx/src/app/modules/home/pages/device/data/device-data.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/data/device-data.component.ts @@ -36,21 +36,22 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-device-data', - templateUrl: './device-data.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceDataComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DeviceDataComponent), - multi: true - }, - ] + selector: 'tb-device-data', + templateUrl: './device-data.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceDataComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DeviceDataComponent), + multi: true + }, + ], + standalone: false }) export class DeviceDataComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/device/data/device-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/pages/device/data/device-transport-configuration.component.ts index ccc7f20c5e..96456ebe14 100644 --- a/ui-ngx/src/app/modules/home/pages/device/data/device-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/data/device-transport-configuration.component.ts @@ -33,20 +33,22 @@ import { deepClone } from '@core/utils'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-device-transport-configuration', - templateUrl: './device-transport-configuration.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => DeviceTransportConfigurationComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => DeviceTransportConfigurationComponent), - multi: true - }] + selector: 'tb-device-transport-configuration', + templateUrl: './device-transport-configuration.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeviceTransportConfigurationComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => DeviceTransportConfigurationComponent), + multi: true + } + ], + standalone: false }) export class DeviceTransportConfigurationComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/device/data/lwm2m-device-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/pages/device/data/lwm2m-device-transport-configuration.component.ts index 930b62b9f8..aa11e891d8 100644 --- a/ui-ngx/src/app/modules/home/pages/device/data/lwm2m-device-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/data/lwm2m-device-transport-configuration.component.ts @@ -29,14 +29,15 @@ import { Subject } from 'rxjs'; import { isDefinedAndNotNull } from '@core/utils'; @Component({ - selector: 'tb-lwm2m-device-transport-configuration', - templateUrl: './lwm2m-device-transport-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => Lwm2mDeviceTransportConfigurationComponent), - multi: true - }] + selector: 'tb-lwm2m-device-transport-configuration', + templateUrl: './lwm2m-device-transport-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => Lwm2mDeviceTransportConfigurationComponent), + multi: true + }], + standalone: false }) export class Lwm2mDeviceTransportConfigurationComponent implements ControlValueAccessor, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/device/data/mqtt-device-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/pages/device/data/mqtt-device-transport-configuration.component.ts index f409713ed3..414fe213bc 100644 --- a/ui-ngx/src/app/modules/home/pages/device/data/mqtt-device-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/data/mqtt-device-transport-configuration.component.ts @@ -26,14 +26,15 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-mqtt-device-transport-configuration', - templateUrl: './mqtt-device-transport-configuration.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MqttDeviceTransportConfigurationComponent), - multi: true - }] + selector: 'tb-mqtt-device-transport-configuration', + templateUrl: './mqtt-device-transport-configuration.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MqttDeviceTransportConfigurationComponent), + multi: true + }], + standalone: false }) export class MqttDeviceTransportConfigurationComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/device/data/snmp-device-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/pages/device/data/snmp-device-transport-configuration.component.ts index 1c87b0d95d..c27b4eed9f 100644 --- a/ui-ngx/src/app/modules/home/pages/device/data/snmp-device-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/data/snmp-device-transport-configuration.component.ts @@ -42,19 +42,21 @@ import { isDefinedAndNotNull } from '@core/utils'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-snmp-device-transport-configuration', - templateUrl: './snmp-device-transport-configuration.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => SnmpDeviceTransportConfigurationComponent), - multi: true - }, { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => SnmpDeviceTransportConfigurationComponent), - multi: true - }] + selector: 'tb-snmp-device-transport-configuration', + templateUrl: './snmp-device-transport-configuration.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SnmpDeviceTransportConfigurationComponent), + multi: true + }, { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => SnmpDeviceTransportConfigurationComponent), + multi: true + } + ], + standalone: false }) export class SnmpDeviceTransportConfigurationComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/device/device-check-connectivity-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/device/device-check-connectivity-dialog.component.ts index 77bd019133..2385d1a933 100644 --- a/ui-ngx/src/app/modules/home/pages/device/device-check-connectivity-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/device-check-connectivity-dialog.component.ts @@ -50,9 +50,10 @@ export interface DeviceCheckConnectivityDialogData { } @Component({ - selector: 'tb-device-check-connectivity-dialog', - templateUrl: './device-check-connectivity-dialog.component.html', - styleUrls: ['./device-check-connectivity-dialog.component.scss'] + selector: 'tb-device-check-connectivity-dialog', + templateUrl: './device-check-connectivity-dialog.component.html', + styleUrls: ['./device-check-connectivity-dialog.component.scss'], + standalone: false }) export class DeviceCheckConnectivityDialogComponent extends DialogComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/device/device-credentials-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/device/device-credentials-dialog.component.ts index 470604499c..4eda9c96d8 100644 --- a/ui-ngx/src/app/modules/home/pages/device/device-credentials-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/device-credentials-dialog.component.ts @@ -36,10 +36,11 @@ export interface DeviceCredentialsDialogData { } @Component({ - selector: 'tb-device-credentials-dialog', - templateUrl: './device-credentials-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: DeviceCredentialsDialogComponent}], - styleUrls: ['./device-credentials-dialog.component.scss'] + selector: 'tb-device-credentials-dialog', + templateUrl: './device-credentials-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: DeviceCredentialsDialogComponent }], + styleUrls: ['./device-credentials-dialog.component.scss'], + standalone: false }) export class DeviceCredentialsDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/pages/device/device-table-header.component.ts b/ui-ngx/src/app/modules/home/pages/device/device-table-header.component.ts index a51d21f9b2..d65f21d312 100644 --- a/ui-ngx/src/app/modules/home/pages/device/device-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/device-table-header.component.ts @@ -23,9 +23,10 @@ import { EntityType } from '@shared/models/entity-type.models'; import { DeviceProfileId } from '../../../../shared/models/id/device-profile-id'; @Component({ - selector: 'tb-device-table-header', - templateUrl: './device-table-header.component.html', - styleUrls: [] + selector: 'tb-device-table-header', + templateUrl: './device-table-header.component.html', + styleUrls: [], + standalone: false }) export class DeviceTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/pages/device/device-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/device/device-tabs.component.ts index 8416be4d96..d1729e5fb4 100644 --- a/ui-ngx/src/app/modules/home/pages/device/device-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/device-tabs.component.ts @@ -21,9 +21,10 @@ import { DeviceInfo } from '@shared/models/device.models'; import { EntityTabsComponent } from '../../components/entity/entity-tabs.component'; @Component({ - selector: 'tb-device-tabs', - templateUrl: './device-tabs.component.html', - styleUrls: [] + selector: 'tb-device-tabs', + templateUrl: './device-tabs.component.html', + styleUrls: [], + standalone: false }) export class DeviceTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/device/device.component.ts b/ui-ngx/src/app/modules/home/pages/device/device.component.ts index c5e798c0ff..de4ec0ae27 100644 --- a/ui-ngx/src/app/modules/home/pages/device/device.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/device.component.ts @@ -39,9 +39,10 @@ import { distinctUntilChanged } from 'rxjs/operators'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-device', - templateUrl: './device.component.html', - styleUrls: ['./device.component.scss'] + selector: 'tb-device', + templateUrl: './device.component.html', + styleUrls: ['./device.component.scss'], + standalone: false }) export class DeviceComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/home/pages/edge/edge-instructions-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/edge/edge-instructions-dialog.component.ts index 41ed81b1f4..f907f11238 100644 --- a/ui-ngx/src/app/modules/home/pages/edge/edge-instructions-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/edge/edge-instructions-dialog.component.ts @@ -39,9 +39,10 @@ export interface EdgeInstructionsDialogData { } @Component({ - selector: 'tb-edge-installation-dialog', - templateUrl: './edge-instructions-dialog.component.html', - styleUrls: ['./edge-instructions-dialog.component.scss'] + selector: 'tb-edge-installation-dialog', + templateUrl: './edge-instructions-dialog.component.html', + styleUrls: ['./edge-instructions-dialog.component.scss'], + standalone: false }) export class EdgeInstructionsDialogComponent extends DialogComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/edge/edge-table-header.component.ts b/ui-ngx/src/app/modules/home/pages/edge/edge-table-header.component.ts index 054b6626b4..c1111fa449 100644 --- a/ui-ngx/src/app/modules/home/pages/edge/edge-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/pages/edge/edge-table-header.component.ts @@ -22,9 +22,10 @@ import { AppState } from '@core/core.state'; import { EdgeInfo } from '@shared/models/edge.models'; @Component({ - selector: 'tb-edge-table-header', - templateUrl: './edge-table-header.component.html', - styleUrls: [] + selector: 'tb-edge-table-header', + templateUrl: './edge-table-header.component.html', + styleUrls: [], + standalone: false }) export class EdgeTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/pages/edge/edge-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/edge/edge-tabs.component.ts index 48a19840c2..58bc88a8db 100644 --- a/ui-ngx/src/app/modules/home/pages/edge/edge-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/edge/edge-tabs.component.ts @@ -21,9 +21,10 @@ import { EdgeInfo } from '@shared/models/edge.models'; import { EntityTabsComponent } from '@home/components/entity/entity-tabs.component'; @Component({ - selector: 'tb-edge-tabs', - templateUrl: './edge-tabs.component.html', - styleUrls: [] + selector: 'tb-edge-tabs', + templateUrl: './edge-tabs.component.html', + styleUrls: [], + standalone: false }) export class EdgeTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/edge/edge.component.ts b/ui-ngx/src/app/modules/home/pages/edge/edge.component.ts index 396ba8b9b5..7a0d82798c 100644 --- a/ui-ngx/src/app/modules/home/pages/edge/edge.component.ts +++ b/ui-ngx/src/app/modules/home/pages/edge/edge.component.ts @@ -29,9 +29,10 @@ import { EntityTableConfig } from '@home/models/entity/entities-table-config.mod import {EdgeService} from "@core/http/edge.service"; @Component({ - selector: 'tb-edge', - templateUrl: './edge.component.html', - styleUrls: ['./edge.component.scss'] + selector: 'tb-edge', + templateUrl: './edge.component.html', + styleUrls: ['./edge.component.scss'], + standalone: false }) export class EdgeComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/home/pages/entity-view/entity-view-table-header.component.ts b/ui-ngx/src/app/modules/home/pages/entity-view/entity-view-table-header.component.ts index 782d1d2c83..da2a867c56 100644 --- a/ui-ngx/src/app/modules/home/pages/entity-view/entity-view-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/pages/entity-view/entity-view-table-header.component.ts @@ -22,9 +22,10 @@ import { EntityType } from '@shared/models/entity-type.models'; import { EntityViewInfo } from '@app/shared/models/entity-view.models'; @Component({ - selector: 'tb-entity-view-table-header', - templateUrl: './entity-view-table-header.component.html', - styleUrls: [] + selector: 'tb-entity-view-table-header', + templateUrl: './entity-view-table-header.component.html', + styleUrls: [], + standalone: false }) export class EntityViewTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/pages/entity-view/entity-view-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/entity-view/entity-view-tabs.component.ts index 26d678c45b..577b4eb147 100644 --- a/ui-ngx/src/app/modules/home/pages/entity-view/entity-view-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/entity-view/entity-view-tabs.component.ts @@ -21,9 +21,10 @@ import { EntityTabsComponent } from '../../components/entity/entity-tabs.compone import { EntityViewInfo } from '@app/shared/models/entity-view.models'; @Component({ - selector: 'tb-entity-view-tabs', - templateUrl: './entity-view-tabs.component.html', - styleUrls: [] + selector: 'tb-entity-view-tabs', + templateUrl: './entity-view-tabs.component.html', + styleUrls: [], + standalone: false }) export class EntityViewTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/entity-view/entity-view.component.ts b/ui-ngx/src/app/modules/home/pages/entity-view/entity-view.component.ts index 98e1a55695..65485f340c 100644 --- a/ui-ngx/src/app/modules/home/pages/entity-view/entity-view.component.ts +++ b/ui-ngx/src/app/modules/home/pages/entity-view/entity-view.component.ts @@ -30,9 +30,10 @@ import { EntityId } from '@app/shared/models/id/entity-id'; import { EntityTableConfig } from '@home/models/entity/entities-table-config.models'; @Component({ - selector: 'tb-entity-view', - templateUrl: './entity-view.component.html', - styleUrls: ['./entity-view.component.scss'] + selector: 'tb-entity-view', + templateUrl: './entity-view.component.html', + styleUrls: ['./entity-view.component.scss'], + standalone: false }) export class EntityViewComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/home/pages/home-links/home-links.component.ts b/ui-ngx/src/app/modules/home/pages/home-links/home-links.component.ts index 67546086cb..f7b38179ab 100644 --- a/ui-ngx/src/app/modules/home/pages/home-links/home-links.component.ts +++ b/ui-ngx/src/app/modules/home/pages/home-links/home-links.component.ts @@ -23,10 +23,11 @@ import { ActivatedRoute } from '@angular/router'; import { HomeDashboard } from '@shared/models/dashboard.models'; @Component({ - selector: 'tb-home-links', - templateUrl: './home-links.component.html', - styleUrls: ['./home-links.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-home-links', + templateUrl: './home-links.component.html', + styleUrls: ['./home-links.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class HomeLinksComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app-dialog.component.ts index 51f087f13a..2ee6465d33 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app-dialog.component.ts @@ -32,10 +32,11 @@ export interface MobileAppDialogData { } @Component({ - selector: 'tb-mobile-app-dialog', - templateUrl: './mobile-app-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: MobileAppDialogComponent}], - styleUrls: [] + selector: 'tb-mobile-app-dialog', + templateUrl: './mobile-app-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: MobileAppDialogComponent }], + styleUrls: [], + standalone: false }) export class MobileAppDialogComponent extends DialogComponent implements OnDestroy, AfterViewInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app-table-header.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app-table-header.component.ts index 0711aa1116..d0b5f2f416 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app-table-header.component.ts @@ -21,9 +21,10 @@ import { AppState } from '@core/core.state'; import { MobileApp } from '@shared/models/mobile-app.models'; @Component({ - selector: 'tb-mobile-app-table-header', - templateUrl: './mobile-app-table-header.component.html', - styleUrls: ['./mobile-app-table-header.component.scss'] + selector: 'tb-mobile-app-table-header', + templateUrl: './mobile-app-table-header.component.html', + styleUrls: ['./mobile-app-table-header.component.scss'], + standalone: false }) export class MobileAppTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app.component.ts index abcb7beb5d..d2c1fe3dc9 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app.component.ts @@ -31,9 +31,10 @@ import { TbPopoverService } from '@shared/components/popover.service'; import { EditorPanelComponent } from '@home/pages/mobile/common/editor-panel.component'; @Component({ - selector: 'tb-mobile-app', - templateUrl: './mobile-app.component.html', - styleUrls: ['./mobile-app.component.scss'] + selector: 'tb-mobile-app', + templateUrl: './mobile-app.component.html', + styleUrls: ['./mobile-app.component.scss'], + standalone: false }) export class MobileAppComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/applications/remove-app-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/applications/remove-app-dialog.component.ts index 39d0c5e266..1843192844 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/applications/remove-app-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/applications/remove-app-dialog.component.ts @@ -32,9 +32,10 @@ export interface MobileAppDeleteDialogData { } @Component({ - selector: 'tb-remove-app-dialog', - templateUrl: './remove-app-dialog.component.html', - styleUrls: ['./remove-app-dialog.component.scss'] + selector: 'tb-remove-app-dialog', + templateUrl: './remove-app-dialog.component.html', + styleUrls: ['./remove-app-dialog.component.scss'], + standalone: false }) export class RemoveAppDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/add-mobile-page-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/add-mobile-page-dialog.component.ts index e3644c117f..bff9631ce4 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/add-mobile-page-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/add-mobile-page-dialog.component.ts @@ -25,9 +25,10 @@ import { FormBuilder } from '@angular/forms'; import { deepTrim } from '@core/utils'; @Component({ - selector: 'tb-add-mobile-page-dialog', - templateUrl: './add-mobile-page-dialog.component.html', - styleUrls: ['./add-mobile-page-dialog.component.scss'] + selector: 'tb-add-mobile-page-dialog', + templateUrl: './add-mobile-page-dialog.component.html', + styleUrls: ['./add-mobile-page-dialog.component.scss'], + standalone: false }) export class AddMobilePageDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/custom-mobile-page-panel.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/custom-mobile-page-panel.component.ts index 045f1e3298..afbdd00885 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/custom-mobile-page-panel.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/custom-mobile-page-panel.component.ts @@ -20,10 +20,11 @@ import { CustomMobilePage } from '@shared/models/mobile-app.models'; import { TbPopoverComponent } from '@shared/components/popover.component'; @Component({ - selector: 'tb-custom-menu-item-panel', - templateUrl: './custom-mobile-page-panel.component.html', - styleUrls: ['./custom-mobile-page-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-custom-menu-item-panel', + templateUrl: './custom-mobile-page-panel.component.html', + styleUrls: ['./custom-mobile-page-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class CustomMobilePagePanelComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/custom-mobile-page.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/custom-mobile-page.component.ts index 4c97990028..84652c3027 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/custom-mobile-page.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/custom-mobile-page.component.ts @@ -37,21 +37,22 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-mobile-page-item', - templateUrl: './custom-mobile-page.component.html', - styleUrls: ['./custom-mobile-page.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CustomMobilePageComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => CustomMobilePageComponent), - multi: true - } - ] + selector: 'tb-mobile-page-item', + templateUrl: './custom-mobile-page.component.html', + styleUrls: ['./custom-mobile-page.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CustomMobilePageComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => CustomMobilePageComponent), + multi: true + } + ], + standalone: false }) export class CustomMobilePageComponent implements ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/default-mobile-page-panel.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/default-mobile-page-panel.component.ts index de3d7a1a79..e4c1d3b288 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/default-mobile-page-panel.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/default-mobile-page-panel.component.ts @@ -21,10 +21,11 @@ import { FormBuilder, Validators } from '@angular/forms'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-default-mobile-page-panel', - templateUrl: './default-mobile-page-panel.component.html', - styleUrls: ['./default-mobile-page-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-default-mobile-page-panel', + templateUrl: './default-mobile-page-panel.component.html', + styleUrls: ['./default-mobile-page-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class DefaultMobilePagePanelComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/mobile-layout.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/mobile-layout.component.ts index b61263c2d5..9506f68043 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/mobile-layout.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/mobile-layout.component.ts @@ -44,21 +44,22 @@ import { MatDialog } from '@angular/material/dialog'; import { AddMobilePageDialogComponent } from '@home/pages/mobile/bundes/layout/add-mobile-page-dialog.component'; @Component({ - selector: 'tb-mobile-layout', - templateUrl: './mobile-layout.component.html', - styleUrls: ['./mobile-layout.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MobileLayoutComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MobileLayoutComponent), - multi: true - } - ], + selector: 'tb-mobile-layout', + templateUrl: './mobile-layout.component.html', + styleUrls: ['./mobile-layout.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MobileLayoutComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MobileLayoutComponent), + multi: true + } + ], + standalone: false }) export class MobileLayoutComponent implements ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/mobile-page-item-row.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/mobile-page-item-row.component.ts index 516e007761..8772b6ad71 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/mobile-page-item-row.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/mobile-page-item-row.component.ts @@ -58,22 +58,23 @@ import { TranslateService } from '@ngx-translate/core'; import { DisplayPopoverConfig } from '@shared/components/popover.models'; @Component({ - selector: 'tb-mobile-menu-item-row', - templateUrl: './mobile-page-item-row.component.html', - styleUrls: ['./mobile-page-item-row.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MobilePageItemRowComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MobilePageItemRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-mobile-menu-item-row', + templateUrl: './mobile-page-item-row.component.html', + styleUrls: ['./mobile-page-item-row.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MobilePageItemRowComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => MobilePageItemRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class MobilePageItemRowComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-app-configuration-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-app-configuration-dialog.component.ts index 1f120de868..b03faa5b5a 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-app-configuration-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-app-configuration-dialog.component.ts @@ -33,9 +33,10 @@ export interface MobileAppConfigurationDialogData { } @Component({ - selector: 'tb-mobile-app-configuration-dialog', - templateUrl: './mobile-app-configuration-dialog.component.html', - styleUrls: ['./mobile-app-configuration-dialog.component.scss'] + selector: 'tb-mobile-app-configuration-dialog', + templateUrl: './mobile-app-configuration-dialog.component.html', + styleUrls: ['./mobile-app-configuration-dialog.component.scss'], + standalone: false }) export class MobileAppConfigurationDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-bundle-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-bundle-dialog.component.ts index acc1d3785b..18cc3c2688 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-bundle-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-bundle-dialog.component.ts @@ -45,9 +45,10 @@ export interface MobileBundleDialogData { } @Component({ - selector: 'tb-mobile-bundle-dialog', - templateUrl: './mobile-bundle-dialog.component.html', - styleUrls: ['./mobile-bundle-dialog.component.scss'] + selector: 'tb-mobile-bundle-dialog', + templateUrl: './mobile-bundle-dialog.component.html', + styleUrls: ['./mobile-bundle-dialog.component.scss'], + standalone: false }) export class MobileBundleDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-bundle-table-header.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-bundle-table-header.component.ts index 1a0a6aeca9..dc9c6492f8 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-bundle-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-bundle-table-header.component.ts @@ -21,9 +21,10 @@ import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @Component({ - selector: 'tb-mobile-bundle-table-header', - templateUrl: './mobile-bundle-table-header.component.html', - styleUrls: ['./mobile-bundle-table-header.component.scss'] + selector: 'tb-mobile-bundle-table-header', + templateUrl: './mobile-bundle-table-header.component.html', + styleUrls: ['./mobile-bundle-table-header.component.scss'], + standalone: false }) export class MobileBundleTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/common/editor-panel.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/common/editor-panel.component.ts index 49cad3a3ab..9f2e850b53 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/common/editor-panel.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/common/editor-panel.component.ts @@ -20,10 +20,11 @@ import { TbPopoverComponent } from '@shared/components/popover.component'; import { EditorOptions } from 'tinymce'; @Component({ - selector: 'tb-release-notes-panel', - templateUrl: './editor-panel.component.html', - styleUrls: ['./editor-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-release-notes-panel', + templateUrl: './editor-panel.component.html', + styleUrls: ['./editor-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class EditorPanelComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/mobile/qr-code-widget/mobile-qr-code-widget-settings.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/qr-code-widget/mobile-qr-code-widget-settings.component.ts index 9c6b58a967..1745a8a0b1 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/qr-code-widget/mobile-qr-code-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/qr-code-widget/mobile-qr-code-widget-settings.component.ts @@ -27,9 +27,10 @@ import { EntityType } from '@shared/models/entity-type.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-mobile-qr-code-widget', - templateUrl: './mobile-qr-code-widget-settings.component.html', - styleUrls: ['mobile-qr-code-widget-settings.component.scss', '../../admin/settings-card.scss'] + selector: 'tb-mobile-qr-code-widget', + templateUrl: './mobile-qr-code-widget-settings.component.html', + styleUrls: ['mobile-qr-code-widget-settings.component.scss', '../../admin/settings-card.scss'], + standalone: false }) export class MobileQrCodeWidgetSettingsComponent extends PageComponent implements HasConfirmForm { diff --git a/ui-ngx/src/app/modules/home/pages/notification/inbox/inbox-notification-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/notification/inbox/inbox-notification-dialog.component.ts index f1ce8808ef..2ab4382a2c 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/inbox/inbox-notification-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/inbox/inbox-notification-dialog.component.ts @@ -27,9 +27,10 @@ export interface InboxNotificationDialogData { } @Component({ - selector: 'tb-inbox-notification-dialog', - templateUrl: './inbox-notification-dialog.component.html', - styleUrls: ['inbox-notification-dialog.component.scss'] + selector: 'tb-inbox-notification-dialog', + templateUrl: './inbox-notification-dialog.component.html', + styleUrls: ['inbox-notification-dialog.component.scss'], + standalone: false }) export class InboxNotificationDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/pages/notification/inbox/inbox-table-header.component.ts b/ui-ngx/src/app/modules/home/pages/notification/inbox/inbox-table-header.component.ts index f1b9bea7c7..7aade4fbad 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/inbox/inbox-table-header.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/inbox/inbox-table-header.component.ts @@ -21,9 +21,10 @@ import { AppState } from '@core/core.state'; import { Notification } from '@shared/models/notification.models'; @Component({ - selector: 'tb-inbox-table-header', - templateUrl: './inbox-table-header.component.html', - styleUrls: [] + selector: 'tb-inbox-table-header', + templateUrl: './inbox-table-header.component.html', + styleUrls: [], + standalone: false }) export class InboxTableHeaderComponent extends EntityTableHeaderComponent { diff --git a/ui-ngx/src/app/modules/home/pages/notification/recipient/recipient-notification-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/notification/recipient/recipient-notification-dialog.component.ts index 755d9d181d..deb518e93b 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/recipient/recipient-notification-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/recipient/recipient-notification-dialog.component.ts @@ -46,9 +46,10 @@ export interface RecipientNotificationDialogData { } @Component({ - selector: 'tb-target-notification-dialog', - templateUrl: './recipient-notification-dialog.component.html', - styleUrls: ['recipient-notification-dialog.component.scss'] + selector: 'tb-target-notification-dialog', + templateUrl: './recipient-notification-dialog.component.html', + styleUrls: ['recipient-notification-dialog.component.scss'], + standalone: false }) export class RecipientNotificationDialogComponent extends DialogComponent implements OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/notification/rule/escalation-form.component.ts b/ui-ngx/src/app/modules/home/pages/notification/rule/escalation-form.component.ts index 3794d7ab26..faa6a565e3 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/rule/escalation-form.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/rule/escalation-form.component.ts @@ -42,21 +42,22 @@ import { MatDialog } from '@angular/material/dialog'; import { MatButton } from '@angular/material/button'; @Component({ - selector: 'tb-escalation-form', - templateUrl: './escalation-form.component.html', - styleUrls: ['./escalation-form.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => EscalationFormComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => EscalationFormComponent), - multi: true, - } - ] + selector: 'tb-escalation-form', + templateUrl: './escalation-form.component.html', + styleUrls: ['./escalation-form.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => EscalationFormComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => EscalationFormComponent), + multi: true, + } + ], + standalone: false }) export class EscalationFormComponent implements ControlValueAccessor, OnInit, OnDestroy, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/notification/rule/escalations.component.ts b/ui-ngx/src/app/modules/home/pages/notification/rule/escalations.component.ts index 36d2913621..37aa7393f8 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/rule/escalations.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/rule/escalations.component.ts @@ -35,21 +35,22 @@ import { takeUntil } from 'rxjs/operators'; import { coerceBoolean } from '@shared/decorators/coercion'; @Component({ - selector: 'tb-escalations-component', - templateUrl: './escalations.component.html', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => EscalationsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => EscalationsComponent), - multi: true, - } - ] + selector: 'tb-escalations-component', + templateUrl: './escalations.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => EscalationsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => EscalationsComponent), + multi: true, + } + ], + standalone: false }) export class EscalationsComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/notification/rule/rule-notification-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/notification/rule/rule-notification-dialog.component.ts index 629407ace3..5bfa64c99d 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/rule/rule-notification-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/rule/rule-notification-dialog.component.ts @@ -77,9 +77,10 @@ export interface RuleNotificationDialogData { } @Component({ - selector: 'tb-rule-notification-dialog', - templateUrl: './rule-notification-dialog.component.html', - styleUrls: ['rule-notification-dialog.component.scss'] + selector: 'tb-rule-notification-dialog', + templateUrl: './rule-notification-dialog.component.html', + styleUrls: ['rule-notification-dialog.component.scss'], + standalone: false }) export class RuleNotificationDialogComponent extends DialogComponent implements OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/notification/sent/sent-error-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/notification/sent/sent-error-dialog.component.ts index c20b49bc16..ea6e0bed5c 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/sent/sent-error-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/sent/sent-error-dialog.component.ts @@ -31,9 +31,10 @@ export interface NotificationRequestErrorDialogData { } @Component({ - selector: 'tb-notification-send-error-dialog', - templateUrl: './sent-error-dialog.component.html', - styleUrls: ['sent-error-dialog.component.scss'] + selector: 'tb-notification-send-error-dialog', + templateUrl: './sent-error-dialog.component.html', + styleUrls: ['sent-error-dialog.component.scss'], + standalone: false }) export class SentErrorDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.componet.ts b/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.componet.ts index 70a972066f..eec70df210 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.componet.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.componet.ts @@ -54,9 +54,10 @@ export interface RequestNotificationDialogData { } @Component({ - selector: 'tb-sent-notification-dialog', - templateUrl: './sent-notification-dialog.component.html', - styleUrls: ['./sent-notification-dialog.component.scss'] + selector: 'tb-sent-notification-dialog', + templateUrl: './sent-notification-dialog.component.html', + styleUrls: ['./sent-notification-dialog.component.scss'], + standalone: false }) export class SentNotificationDialogComponent extends TemplateConfiguration implements OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/notification/settings/notification-setting-form.component.ts b/ui-ngx/src/app/modules/home/pages/notification/settings/notification-setting-form.component.ts index 187ae39d3d..071ccbeeb5 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/settings/notification-setting-form.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/settings/notification-setting-form.component.ts @@ -25,16 +25,17 @@ import { } from '@shared/models/notification.models'; @Component({ - selector: 'tb-notification-setting-form', - templateUrl: './notification-setting-form.component.html', - styleUrls: ['./notification-setting-form.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => NotificationSettingFormComponent), - multi: true - } - ] + selector: 'tb-notification-setting-form', + templateUrl: './notification-setting-form.component.html', + styleUrls: ['./notification-setting-form.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => NotificationSettingFormComponent), + multi: true + } + ], + standalone: false }) export class NotificationSettingFormComponent implements ControlValueAccessor, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/notification/settings/notification-settings.component.ts b/ui-ngx/src/app/modules/home/pages/notification/settings/notification-settings.component.ts index 3abddf49af..4adc4d4c6c 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/settings/notification-settings.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/settings/notification-settings.component.ts @@ -32,9 +32,10 @@ import { NotificationService } from '@core/http/notification.service'; import { DialogService } from '@core/services/dialog.service'; @Component({ - selector: 'tb-notification-settings', - templateUrl: './notification-settings.component.html', - styleUrls: ['./notification-settings.component.scss'] + selector: 'tb-notification-settings', + templateUrl: './notification-settings.component.html', + styleUrls: ['./notification-settings.component.scss'], + standalone: false }) export class NotificationSettingsComponent extends PageComponent implements OnInit, HasConfirmForm { diff --git a/ui-ngx/src/app/modules/home/pages/notification/template/configuration/notification-action-button-configuration.component.ts b/ui-ngx/src/app/modules/home/pages/notification/template/configuration/notification-action-button-configuration.component.ts index cf828ce68f..5b3975a1a0 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/template/configuration/notification-action-button-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/template/configuration/notification-action-button-configuration.component.ts @@ -32,20 +32,21 @@ import { isDefinedAndNotNull } from '@core/utils'; import { coerceBoolean } from '@shared/decorators/coercion'; @Component({ - selector: 'tb-notification-action-button-configuration', - templateUrl: './notification-action-button-configuration.component.html', - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => NotificationActionButtonConfigurationComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => NotificationActionButtonConfigurationComponent), - multi: true, - } - ] + selector: 'tb-notification-action-button-configuration', + templateUrl: './notification-action-button-configuration.component.html', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => NotificationActionButtonConfigurationComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => NotificationActionButtonConfigurationComponent), + multi: true, + } + ], + standalone: false }) export class NotificationActionButtonConfigurationComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/notification/template/configuration/notification-template-configuration.component.ts b/ui-ngx/src/app/modules/home/pages/notification/template/configuration/notification-template-configuration.component.ts index d3a606b8b9..4a4f11d40b 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/template/configuration/notification-template-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/template/configuration/notification-template-configuration.component.ts @@ -40,21 +40,22 @@ import { TranslateService } from '@ngx-translate/core'; import { EditorOptions } from 'tinymce'; @Component({ - selector: 'tb-template-configuration', - templateUrl: './notification-template-configuration.component.html', - styleUrls: ['./notification-template-configuration.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => NotificationTemplateConfigurationComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => NotificationTemplateConfigurationComponent), - multi: true, - } - ] + selector: 'tb-template-configuration', + templateUrl: './notification-template-configuration.component.html', + styleUrls: ['./notification-template-configuration.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => NotificationTemplateConfigurationComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => NotificationTemplateConfigurationComponent), + multi: true, + } + ], + standalone: false }) export class NotificationTemplateConfigurationComponent implements OnDestroy, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/notification/template/template-notification-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/notification/template/template-notification-dialog.component.ts index 14201b3301..11c759c40f 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/template/template-notification-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/template/template-notification-dialog.component.ts @@ -44,9 +44,10 @@ export interface TemplateNotificationDialogData { } @Component({ - selector: 'tb-template-notification-dialog', - templateUrl: './template-notification-dialog.component.html', - styleUrls: ['./template-notification-dialog.component.scss'] + selector: 'tb-template-notification-dialog', + templateUrl: './template-notification-dialog.component.html', + styleUrls: ['./template-notification-dialog.component.scss'], + standalone: false }) export class TemplateNotificationDialogComponent extends TemplateConfiguration implements OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/ota-update/ota-update-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/ota-update/ota-update-tabs.component.ts index faa54215f7..31b2813d78 100644 --- a/ui-ngx/src/app/modules/home/pages/ota-update/ota-update-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/ota-update/ota-update-tabs.component.ts @@ -23,9 +23,10 @@ import { NULL_UUID } from '@shared/models/id/has-uuid'; import { OtaPackage } from '@shared/models/ota-package.models'; @Component({ - selector: 'tb-ota-update-tabs', - templateUrl: './ota-update-tabs.component.html', - styleUrls: [] + selector: 'tb-ota-update-tabs', + templateUrl: './ota-update-tabs.component.html', + styleUrls: [], + standalone: false }) export class OtaUpdateTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/ota-update/ota-update.component.ts b/ui-ngx/src/app/modules/home/pages/ota-update/ota-update.component.ts index 5ec5ca42e7..8810d46627 100644 --- a/ui-ngx/src/app/modules/home/pages/ota-update/ota-update.component.ts +++ b/ui-ngx/src/app/modules/home/pages/ota-update/ota-update.component.ts @@ -34,8 +34,9 @@ import { filter, startWith, takeUntil } from 'rxjs/operators'; import { isNotEmptyStr } from '@core/utils'; @Component({ - selector: 'tb-ota-update', - templateUrl: './ota-update.component.html' + selector: 'tb-ota-update', + templateUrl: './ota-update.component.html', + standalone: false }) export class OtaUpdateComponent extends EntityComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/profile/profile.component.ts b/ui-ngx/src/app/modules/home/pages/profile/profile.component.ts index fc35321d9a..6de7338d92 100644 --- a/ui-ngx/src/app/modules/home/pages/profile/profile.component.ts +++ b/ui-ngx/src/app/modules/home/pages/profile/profile.component.ts @@ -35,9 +35,10 @@ import { UnitSystem, UnitSystems } from '@shared/models/unit.models'; import { UnitService } from '@core/services/unit.service'; @Component({ - selector: 'tb-profile', - templateUrl: './profile.component.html', - styleUrls: ['./profile.component.scss'] + selector: 'tb-profile', + templateUrl: './profile.component.html', + styleUrls: ['./profile.component.scss'], + standalone: false }) export class ProfileComponent extends PageComponent implements OnInit, HasConfirmForm { 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 0aa2d86e6f..6745796cbb 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 @@ -29,14 +29,15 @@ import { catchError, map, mergeMap, share, startWith } from 'rxjs/operators'; import { RuleChainService } from '@core/http/rule-chain.service'; @Component({ - selector: 'tb-link-labels', - templateUrl: './link-labels.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => LinkLabelsComponent), - multi: true - }] + selector: 'tb-link-labels', + templateUrl: './link-labels.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => LinkLabelsComponent), + multi: true + }], + standalone: false }) export class LinkLabelsComponent implements ControlValueAccessor, OnInit, OnChanges { diff --git a/ui-ngx/src/app/modules/home/pages/rulechain/rule-node-config.component.ts b/ui-ngx/src/app/modules/home/pages/rulechain/rule-node-config.component.ts index e1d8f11bf5..013e4841f3 100644 --- a/ui-ngx/src/app/modules/home/pages/rulechain/rule-node-config.component.ts +++ b/ui-ngx/src/app/modules/home/pages/rulechain/rule-node-config.component.ts @@ -47,15 +47,16 @@ import { deepClone } from '@core/utils'; import { RuleChainType } from '@shared/models/rule-chain.models'; @Component({ - selector: 'tb-rule-node-config', - templateUrl: './rule-node-config.component.html', - styleUrls: ['./rule-node-config.component.scss'], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => RuleNodeConfigComponent), - multi: true - }], - encapsulation: ViewEncapsulation.None + selector: 'tb-rule-node-config', + templateUrl: './rule-node-config.component.html', + styleUrls: ['./rule-node-config.component.scss'], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => RuleNodeConfigComponent), + multi: true + }], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class RuleNodeConfigComponent implements ControlValueAccessor, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/rulechain/rule-node-details.component.ts b/ui-ngx/src/app/modules/home/pages/rulechain/rule-node-details.component.ts index 67f97624c5..bf231b7126 100644 --- a/ui-ngx/src/app/modules/home/pages/rulechain/rule-node-details.component.ts +++ b/ui-ngx/src/app/modules/home/pages/rulechain/rule-node-details.component.ts @@ -39,9 +39,10 @@ import { ServiceType } from '@shared/models/queue.models'; import { takeUntil } from 'rxjs/operators'; @Component({ - selector: 'tb-rule-node', - templateUrl: './rule-node-details.component.html', - styleUrls: ['./rule-node-details.component.scss'] + selector: 'tb-rule-node', + templateUrl: './rule-node-details.component.html', + styleUrls: ['./rule-node-details.component.scss'], + standalone: false }) export class RuleNodeDetailsComponent extends PageComponent implements OnInit, OnChanges, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/rulechain/rule-node-link.component.ts b/ui-ngx/src/app/modules/home/pages/rulechain/rule-node-link.component.ts index 14cd0a8190..e8ac36e3fb 100644 --- a/ui-ngx/src/app/modules/home/pages/rulechain/rule-node-link.component.ts +++ b/ui-ngx/src/app/modules/home/pages/rulechain/rule-node-link.component.ts @@ -23,14 +23,15 @@ import { TranslateService } from '@ngx-translate/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-rule-node-link', - templateUrl: './rule-node-link.component.html', - styleUrls: [], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => RuleNodeLinkComponent), - multi: true - }] + selector: 'tb-rule-node-link', + templateUrl: './rule-node-link.component.html', + styleUrls: [], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => RuleNodeLinkComponent), + multi: true + }], + standalone: false }) export class RuleNodeLinkComponent implements ControlValueAccessor, OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.ts b/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.ts index d4d3655e2f..c6dc3eae9c 100644 --- a/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.ts +++ b/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.ts @@ -101,10 +101,11 @@ import Timeout = NodeJS.Timeout; import { DomSanitizer } from '@angular/platform-browser'; @Component({ - selector: 'tb-rulechain-page', - templateUrl: './rulechain-page.component.html', - styleUrls: ['./rulechain-page.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-rulechain-page', + templateUrl: './rulechain-page.component.html', + styleUrls: ['./rulechain-page.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class RuleChainPageComponent extends PageComponent implements AfterViewInit, OnInit, OnDestroy, HasDirtyFlag, ISearchableComponent, AfterViewChecked { @@ -1753,10 +1754,11 @@ export interface AddRuleNodeLinkDialogData { } @Component({ - selector: 'tb-add-rule-node-link-dialog', - templateUrl: './add-rule-node-link-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: AddRuleNodeLinkDialogComponent}], - styleUrls: ['./add-rule-node-link-dialog.component.scss'] + selector: 'tb-add-rule-node-link-dialog', + templateUrl: './add-rule-node-link-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: AddRuleNodeLinkDialogComponent }], + styleUrls: ['./add-rule-node-link-dialog.component.scss'], + standalone: false }) export class AddRuleNodeLinkDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { @@ -1817,10 +1819,11 @@ export interface AddRuleNodeDialogData { } @Component({ - selector: 'tb-add-rule-node-dialog', - templateUrl: './add-rule-node-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: AddRuleNodeDialogComponent}], - styleUrls: ['./add-rule-node-dialog.component.scss'] + selector: 'tb-add-rule-node-dialog', + templateUrl: './add-rule-node-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: AddRuleNodeDialogComponent }], + styleUrls: ['./add-rule-node-dialog.component.scss'], + standalone: false }) export class AddRuleNodeDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { @@ -1877,10 +1880,11 @@ export interface CreateNestedRuleChainDialogData { } @Component({ - selector: 'tb-create-nested-rulechain-dialog', - templateUrl: './create-nested-rulechain-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: CreateNestedRuleChainDialogComponent}], - styleUrls: [] + selector: 'tb-create-nested-rulechain-dialog', + templateUrl: './create-nested-rulechain-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: CreateNestedRuleChainDialogComponent }], + styleUrls: [], + standalone: false }) export class CreateNestedRuleChainDialogComponent extends DialogComponent implements OnInit, ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-tabs.component.ts index 0ec3c4df52..8e26eed483 100644 --- a/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-tabs.component.ts @@ -21,9 +21,10 @@ import { EntityTabsComponent } from '../../components/entity/entity-tabs.compone import { RuleChain } from '@shared/models/rule-chain.models'; @Component({ - selector: 'tb-rulechain-tabs', - templateUrl: './rulechain-tabs.component.html', - styleUrls: [] + selector: 'tb-rulechain-tabs', + templateUrl: './rulechain-tabs.component.html', + styleUrls: [], + standalone: false }) export class RuleChainTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/rulechain/rulechain.component.ts b/ui-ngx/src/app/modules/home/pages/rulechain/rulechain.component.ts index df55eeff90..5769009066 100644 --- a/ui-ngx/src/app/modules/home/pages/rulechain/rulechain.component.ts +++ b/ui-ngx/src/app/modules/home/pages/rulechain/rulechain.component.ts @@ -25,9 +25,10 @@ import { RuleChain } from '@shared/models/rule-chain.models'; import { EntityTableConfig } from '@home/models/entity/entities-table-config.models'; @Component({ - selector: 'tb-rulechain', - templateUrl: './rulechain.component.html', - styleUrls: ['./rulechain.component.scss'] + selector: 'tb-rulechain', + templateUrl: './rulechain.component.html', + styleUrls: ['./rulechain.component.scss'], + standalone: false }) export class RuleChainComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/home/pages/rulechain/rulenode.component.ts b/ui-ngx/src/app/modules/home/pages/rulechain/rulenode.component.ts index 87e2d0a31b..04c293d241 100644 --- a/ui-ngx/src/app/modules/home/pages/rulechain/rulenode.component.ts +++ b/ui-ngx/src/app/modules/home/pages/rulechain/rulenode.component.ts @@ -23,10 +23,11 @@ import { RuleChainType } from '@app/shared/models/rule-chain.models'; import { TranslateService } from '@ngx-translate/core'; @Component({ - // eslint-disable-next-line @angular-eslint/component-selector - selector: 'rule-node', - templateUrl: './rulenode.component.html', - styleUrls: ['./rulenode.component.scss'] + // eslint-disable-next-line @angular-eslint/component-selector + selector: 'rule-node', + templateUrl: './rulenode.component.html', + styleUrls: ['./rulenode.component.scss'], + standalone: false }) export class RuleNodeComponent extends FcNodeComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-behavior-panel.component.ts b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-behavior-panel.component.ts index c488258b6d..793c1307db 100644 --- a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-behavior-panel.component.ts +++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-behavior-panel.component.ts @@ -35,10 +35,11 @@ import { WidgetActionCallbacks } from '@home/components/widget/action/manage-wid import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-scada-symbol-behavior-panel', - templateUrl: './scada-symbol-behavior-panel.component.html', - styleUrls: ['./scada-symbol-behavior-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-scada-symbol-behavior-panel', + templateUrl: './scada-symbol-behavior-panel.component.html', + styleUrls: ['./scada-symbol-behavior-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ScadaSymbolBehaviorPanelComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-behavior-row.component.ts b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-behavior-row.component.ts index 2d53986923..18b3d3bf4c 100644 --- a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-behavior-row.component.ts +++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-behavior-row.component.ts @@ -91,22 +91,23 @@ export const behaviorValid = (behavior: ScadaSymbolBehavior): boolean => { }; @Component({ - selector: 'tb-scada-symbol-metadata-behavior-row', - templateUrl: './scada-symbol-behavior-row.component.html', - styleUrls: ['./scada-symbol-behavior-row.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ScadaSymbolBehaviorRowComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => ScadaSymbolBehaviorRowComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-scada-symbol-metadata-behavior-row', + templateUrl: './scada-symbol-behavior-row.component.html', + styleUrls: ['./scada-symbol-behavior-row.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ScadaSymbolBehaviorRowComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => ScadaSymbolBehaviorRowComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ScadaSymbolBehaviorRowComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-behaviors.component.ts b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-behaviors.component.ts index 9775ad9a63..bb24f86a19 100644 --- a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-behaviors.component.ts +++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-behaviors.component.ts @@ -55,22 +55,23 @@ import { WidgetActionCallbacks } from '@home/components/widget/action/manage-wid import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-scada-symbol-metadata-behaviors', - templateUrl: './scada-symbol-behaviors.component.html', - styleUrls: ['./scada-symbol-behaviors.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ScadaSymbolBehaviorsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => ScadaSymbolBehaviorsComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-scada-symbol-metadata-behaviors', + templateUrl: './scada-symbol-behaviors.component.html', + styleUrls: ['./scada-symbol-behaviors.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ScadaSymbolBehaviorsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => ScadaSymbolBehaviorsComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ScadaSymbolBehaviorsComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tag-function-panel.component.ts b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tag-function-panel.component.ts index 3f9cdddd7c..2e1a7e4d29 100644 --- a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tag-function-panel.component.ts +++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tag-function-panel.component.ts @@ -36,10 +36,11 @@ import { import { JsFuncComponent } from '@shared/components/js-func.component'; @Component({ - selector: 'tb-scada-symbol-metadata-tag-function-panel', - templateUrl: './scada-symbol-metadata-tag-function-panel.component.html', - styleUrls: ['./scada-symbol-metadata-tag-function-panel.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-scada-symbol-metadata-tag-function-panel', + templateUrl: './scada-symbol-metadata-tag-function-panel.component.html', + styleUrls: ['./scada-symbol-metadata-tag-function-panel.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ScadaSymbolMetadataTagFunctionPanelComponent implements OnInit, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tag.component.ts b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tag.component.ts index 352d3823da..a1237d87dc 100644 --- a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tag.component.ts +++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tag.component.ts @@ -43,22 +43,23 @@ import { } from '@home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tag-function-panel.component'; @Component({ - selector: 'tb-scada-symbol-metadata-tag', - templateUrl: './scada-symbol-metadata-tag.component.html', - styleUrls: ['./scada-symbol-metadata-tag.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ScadaSymbolMetadataTagComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => ScadaSymbolMetadataTagComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-scada-symbol-metadata-tag', + templateUrl: './scada-symbol-metadata-tag.component.html', + styleUrls: ['./scada-symbol-metadata-tag.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ScadaSymbolMetadataTagComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => ScadaSymbolMetadataTagComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ScadaSymbolMetadataTagComponent implements ControlValueAccessor, OnInit, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tags.component.ts b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tags.component.ts index d4286b762c..f2556d3cf0 100644 --- a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tags.component.ts +++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata-tags.component.ts @@ -49,22 +49,23 @@ const tagIsEmpty = (tag: ScadaSymbolTag): boolean => !tag.stateRenderFunction && !tag.actions?.click?.actionFunction; @Component({ - selector: 'tb-scada-symbol-metadata-tags', - templateUrl: './scada-symbol-metadata-tags.component.html', - styleUrls: ['./scada-symbol-metadata-tags.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ScadaSymbolMetadataTagsComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => ScadaSymbolMetadataTagsComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-scada-symbol-metadata-tags', + templateUrl: './scada-symbol-metadata-tags.component.html', + styleUrls: ['./scada-symbol-metadata-tags.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ScadaSymbolMetadataTagsComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => ScadaSymbolMetadataTagsComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ScadaSymbolMetadataTagsComponent implements ControlValueAccessor, OnInit, Validator, OnChanges { diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata.component.ts b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata.component.ts index 9dd2afba52..a893100791 100644 --- a/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata.component.ts +++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/metadata-components/scada-symbol-metadata.component.ts @@ -58,22 +58,23 @@ import { WidgetActionCallbacks } from '@home/components/widget/action/manage-wid import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ - selector: 'tb-scada-symbol-metadata', - templateUrl: './scada-symbol-metadata.component.html', - styleUrls: ['./scada-symbol-metadata.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ScadaSymbolMetadataComponent), - multi: true - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => ScadaSymbolMetadataComponent), - multi: true - } - ], - encapsulation: ViewEncapsulation.None + selector: 'tb-scada-symbol-metadata', + templateUrl: './scada-symbol-metadata.component.html', + styleUrls: ['./scada-symbol-metadata.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ScadaSymbolMetadataComponent), + multi: true + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => ScadaSymbolMetadataComponent), + multi: true + } + ], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ScadaSymbolMetadataComponent extends PageComponent implements OnInit, OnChanges, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-editor.component.ts b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-editor.component.ts index 6ba0866d89..16380ea570 100644 --- a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-editor.component.ts +++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-editor.component.ts @@ -50,10 +50,11 @@ export interface ScadaSymbolEditorData { type editorModeType = 'svg' | 'xml'; @Component({ - selector: 'tb-scada-symbol-editor', - templateUrl: './scada-symbol-editor.component.html', - styleUrls: ['./scada-symbol-editor.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-scada-symbol-editor', + templateUrl: './scada-symbol-editor.component.html', + styleUrls: ['./scada-symbol-editor.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ScadaSymbolEditorComponent implements OnInit, OnDestroy, AfterViewInit, OnChanges { diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-tooltip.components.ts b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-tooltip.components.ts index e8558c5206..60baf0e63b 100644 --- a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-tooltip.components.ts +++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-tooltip.components.ts @@ -57,15 +57,16 @@ abstract class ScadaSymbolPanelComponent implements AfterViewInit { } @Component({ - template: `
+ template: `
{{ symbolElement?.element?.type }}{{ symbolElement?.invisible ? ' (' + ('scada.hidden' | translate) + ')' : '' }}
`, - styleUrls: ['./scada-symbol-tooltip.component.scss'], - encapsulation: ViewEncapsulation.None + styleUrls: ['./scada-symbol-tooltip.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) class ScadaSymbolAddTagPanelComponent extends ScadaSymbolPanelComponent { @@ -83,7 +84,7 @@ class ScadaSymbolAddTagPanelComponent extends ScadaSymbolPanelComponent { } @Component({ - template: `
+ template: `
{{ (isAdd ? 'scada.tag.enter-tag' : 'scada.tag.update-tag' ) | translate }}: close
`, - styleUrls: ['./scada-symbol-tooltip.component.scss'], - encapsulation: ViewEncapsulation.None + styleUrls: ['./scada-symbol-tooltip.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) class ScadaSymbolTagInputPanelComponent extends ScadaSymbolPanelComponent implements AfterViewInit, OnDestroy { @@ -181,7 +183,7 @@ class ScadaSymbolTagInputPanelComponent extends ScadaSymbolPanelComponent implem } @Component({ - template: `
+ template: `
{{ symbolElement?.element?.type }}{{ symbolElement?.invisible ? ' (' + ('scada.hidden' | translate) + ')' : '' }}: {{ symbolElement?.tag }}
`, - styleUrls: ['./scada-symbol-tooltip.component.scss'], - encapsulation: ViewEncapsulation.None + styleUrls: ['./scada-symbol-tooltip.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) class ScadaSymbolTagPanelComponent extends ScadaSymbolPanelComponent implements OnInit, AfterViewInit { @@ -305,7 +308,7 @@ class ScadaSymbolTagPanelComponent extends ScadaSymbolPanelComponent implements } @Component({ - template: `
+ template: `
`, - styleUrls: ['./scada-symbol-tooltip.component.scss'], - encapsulation: ViewEncapsulation.None + styleUrls: ['./scada-symbol-tooltip.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) class ScadaSymbolRemoveTagConfirmComponent extends ScadaSymbolPanelComponent implements OnInit, AfterViewInit { @@ -355,7 +359,7 @@ class ScadaSymbolRemoveTagConfirmComponent extends ScadaSymbolPanelComponent imp } @Component({ - template: `
+ template: `
scada.state-render-function
`, - styleUrls: ['./scada-symbol-tooltip.component.scss'], - encapsulation: ViewEncapsulation.None + styleUrls: ['./scada-symbol-tooltip.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) class ScadaSymbolTagSettingsComponent extends ScadaSymbolPanelComponent implements OnInit, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol.component.ts b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol.component.ts index 2c04591850..f2a358fde7 100644 --- a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol.component.ts +++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol.component.ts @@ -82,10 +82,11 @@ import { WidgetService } from '@core/http/widget.service'; import { ActionNotificationShow } from '@core/notification/notification.actions'; @Component({ - selector: 'tb-scada-symbol', - templateUrl: './scada-symbol.component.html', - styleUrls: ['./scada-symbol.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-scada-symbol', + templateUrl: './scada-symbol.component.html', + styleUrls: ['./scada-symbol.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class ScadaSymbolComponent extends PageComponent implements OnInit, OnDestroy, HasDirtyFlag, ScadaSymbolEditObjectCallbacks { diff --git a/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/backup-code-auth-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/backup-code-auth-dialog.component.ts index 121aac9ee3..e785b6b538 100644 --- a/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/backup-code-auth-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/backup-code-auth-dialog.component.ts @@ -34,9 +34,10 @@ import { deepClone } from '@core/utils'; import printTemplate from './backup-code-print-template.raw'; @Component({ - selector: 'tb-backup-code-auth-dialog', - templateUrl: './backup-code-auth-dialog.component.html', - styleUrls: ['./authentication-dialog.component.scss'] + selector: 'tb-backup-code-auth-dialog', + templateUrl: './backup-code-auth-dialog.component.html', + styleUrls: ['./authentication-dialog.component.scss'], + standalone: false }) export class BackupCodeAuthDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/email-auth-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/email-auth-dialog.component.ts index 055298aa3c..dee27ba294 100644 --- a/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/email-auth-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/email-auth-dialog.component.ts @@ -35,9 +35,10 @@ export interface EmailAuthDialogData { } @Component({ - selector: 'tb-email-auth-dialog', - templateUrl: './email-auth-dialog.component.html', - styleUrls: ['./authentication-dialog.component.scss'] + selector: 'tb-email-auth-dialog', + templateUrl: './email-auth-dialog.component.html', + styleUrls: ['./authentication-dialog.component.scss'], + standalone: false }) export class EmailAuthDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/sms-auth-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/sms-auth-dialog.component.ts index 63b759f79f..952bb21211 100644 --- a/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/sms-auth-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/sms-auth-dialog.component.ts @@ -31,9 +31,10 @@ import { phoneNumberPattern } from '@shared/models/settings.models'; import { MatStepper } from '@angular/material/stepper'; @Component({ - selector: 'tb-sms-auth-dialog', - templateUrl: './sms-auth-dialog.component.html', - styleUrls: ['./authentication-dialog.component.scss'] + selector: 'tb-sms-auth-dialog', + templateUrl: './sms-auth-dialog.component.html', + styleUrls: ['./authentication-dialog.component.scss'], + standalone: false }) export class SMSAuthDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/totp-auth-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/totp-auth-dialog.component.ts index e52b07bc41..e110b1ebaf 100644 --- a/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/totp-auth-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/security/authentication-dialog/totp-auth-dialog.component.ts @@ -31,9 +31,10 @@ import { MatStepper } from '@angular/material/stepper'; import { unwrapModule } from '@core/utils'; @Component({ - selector: 'tb-totp-auth-dialog', - templateUrl: './totp-auth-dialog.component.html', - styleUrls: ['./authentication-dialog.component.scss'] + selector: 'tb-totp-auth-dialog', + templateUrl: './totp-auth-dialog.component.html', + styleUrls: ['./authentication-dialog.component.scss'], + standalone: false }) export class TotpAuthDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/pages/security/security.component.ts b/ui-ngx/src/app/modules/home/pages/security/security.component.ts index d5d671e905..6b66cc7eb6 100644 --- a/ui-ngx/src/app/modules/home/pages/security/security.component.ts +++ b/ui-ngx/src/app/modules/home/pages/security/security.component.ts @@ -54,9 +54,10 @@ import { UserPasswordPolicy } from '@shared/models/settings.models'; import { MatCheckboxChange } from '@angular/material/checkbox'; @Component({ - selector: 'tb-security', - templateUrl: './security.component.html', - styleUrls: ['./security.component.scss'] + selector: 'tb-security', + templateUrl: './security.component.html', + styleUrls: ['./security.component.scss'], + standalone: false }) export class SecurityComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/home/pages/tenant-profile/tenant-profile-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/tenant-profile/tenant-profile-tabs.component.ts index e034ad9b7f..0eb66ec279 100644 --- a/ui-ngx/src/app/modules/home/pages/tenant-profile/tenant-profile-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/tenant-profile/tenant-profile-tabs.component.ts @@ -21,9 +21,10 @@ import { EntityTabsComponent } from '../../components/entity/entity-tabs.compone import { TenantProfile } from '@shared/models/tenant.model'; @Component({ - selector: 'tb-tenant-profile-tabs', - templateUrl: './tenant-profile-tabs.component.html', - styleUrls: [] + selector: 'tb-tenant-profile-tabs', + templateUrl: './tenant-profile-tabs.component.html', + styleUrls: [], + standalone: false }) export class TenantProfileTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/tenant/tenant-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/tenant/tenant-tabs.component.ts index 39d31a5367..8e0738b848 100644 --- a/ui-ngx/src/app/modules/home/pages/tenant/tenant-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/tenant/tenant-tabs.component.ts @@ -21,9 +21,10 @@ import { EntityTabsComponent } from '../../components/entity/entity-tabs.compone import { TenantInfo } from '@shared/models/tenant.model'; @Component({ - selector: 'tb-tenant-tabs', - templateUrl: './tenant-tabs.component.html', - styleUrls: [] + selector: 'tb-tenant-tabs', + templateUrl: './tenant-tabs.component.html', + styleUrls: [], + standalone: false }) export class TenantTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/tenant/tenant.component.ts b/ui-ngx/src/app/modules/home/pages/tenant/tenant.component.ts index 9ce2817e00..bfac5322f4 100644 --- a/ui-ngx/src/app/modules/home/pages/tenant/tenant.component.ts +++ b/ui-ngx/src/app/modules/home/pages/tenant/tenant.component.ts @@ -27,9 +27,10 @@ import { isDefinedAndNotNull } from '@core/utils'; import { CountryData } from '@shared/models/country.models'; @Component({ - selector: 'tb-tenant', - templateUrl: './tenant.component.html', - styleUrls: ['./tenant.component.scss'] + selector: 'tb-tenant', + templateUrl: './tenant.component.html', + styleUrls: ['./tenant.component.scss'], + standalone: false }) export class TenantComponent extends ContactBasedComponent { diff --git a/ui-ngx/src/app/modules/home/pages/user/activation-link-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/user/activation-link-dialog.component.ts index ec869655c7..ead57fc0bf 100644 --- a/ui-ngx/src/app/modules/home/pages/user/activation-link-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/user/activation-link-dialog.component.ts @@ -30,8 +30,9 @@ export interface ActivationLinkDialogData { } @Component({ - selector: 'tb-activation-link-dialog', - templateUrl: './activation-link-dialog.component.html' + selector: 'tb-activation-link-dialog', + templateUrl: './activation-link-dialog.component.html', + standalone: false }) export class ActivationLinkDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/pages/user/add-user-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/user/add-user-dialog.component.ts index dddf388eb1..a58931e2f3 100644 --- a/ui-ngx/src/app/modules/home/pages/user/add-user-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/user/add-user-dialog.component.ts @@ -40,9 +40,10 @@ export interface AddUserDialogData { } @Component({ - selector: 'tb-add-user-dialog', - templateUrl: './add-user-dialog.component.html', - styleUrls: ['./add-user-dialog.component.scss'] + selector: 'tb-add-user-dialog', + templateUrl: './add-user-dialog.component.html', + styleUrls: ['./add-user-dialog.component.scss'], + standalone: false }) export class AddUserDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/user/user-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/user/user-tabs.component.ts index 0180d79f79..298af6f0de 100644 --- a/ui-ngx/src/app/modules/home/pages/user/user-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/user/user-tabs.component.ts @@ -21,9 +21,10 @@ import { EntityTabsComponent } from '../../components/entity/entity-tabs.compone import { User } from '@app/shared/models/user.model'; @Component({ - selector: 'tb-user-tabs', - templateUrl: './user-tabs.component.html', - styleUrls: [] + selector: 'tb-user-tabs', + templateUrl: './user-tabs.component.html', + styleUrls: [], + standalone: false }) export class UserTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/user/user.component.ts b/ui-ngx/src/app/modules/home/pages/user/user.component.ts index 1e1cb9cbea..515e80af71 100644 --- a/ui-ngx/src/app/modules/home/pages/user/user.component.ts +++ b/ui-ngx/src/app/modules/home/pages/user/user.component.ts @@ -29,9 +29,10 @@ import { ActionNotificationShow } from '@app/core/notification/notification.acti import { TranslateService } from '@ngx-translate/core'; @Component({ - selector: 'tb-user', - templateUrl: './user.component.html', - styleUrls: ['./user.component.scss'] + selector: 'tb-user', + templateUrl: './user.component.html', + styleUrls: ['./user.component.scss'], + standalone: false }) export class UserComponent extends EntityComponent{ diff --git a/ui-ngx/src/app/modules/home/pages/widget/save-widget-type-as-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/widget/save-widget-type-as-dialog.component.ts index 8c6e8fe9d4..c0522ba993 100644 --- a/ui-ngx/src/app/modules/home/pages/widget/save-widget-type-as-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/widget/save-widget-type-as-dialog.component.ts @@ -36,9 +36,10 @@ export interface SaveWidgetTypeAsDialogData { } @Component({ - selector: 'tb-save-widget-type-as-dialog', - templateUrl: './save-widget-type-as-dialog.component.html', - styleUrls: [] + selector: 'tb-save-widget-type-as-dialog', + templateUrl: './save-widget-type-as-dialog.component.html', + styleUrls: [], + standalone: false }) export class SaveWidgetTypeAsDialogComponent extends DialogComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/widget/select-widget-type-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/widget/select-widget-type-dialog.component.ts index c2c7195003..aec29b4ecd 100644 --- a/ui-ngx/src/app/modules/home/pages/widget/select-widget-type-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/widget/select-widget-type-dialog.component.ts @@ -23,9 +23,10 @@ import { Router } from '@angular/router'; import { widgetType, widgetTypesData } from '@shared/models/widget.models'; @Component({ - selector: 'tb-select-widget-type-dialog', - templateUrl: './select-widget-type-dialog.component.html', - styleUrls: ['./select-widget-type-dialog.component.scss'] + selector: 'tb-select-widget-type-dialog', + templateUrl: './select-widget-type-dialog.component.html', + styleUrls: ['./select-widget-type-dialog.component.scss'], + standalone: false }) export class SelectWidgetTypeDialogComponent extends DialogComponent { diff --git a/ui-ngx/src/app/modules/home/pages/widget/widget-editor.component.ts b/ui-ngx/src/app/modules/home/pages/widget/widget-editor.component.ts index 098cfce2f6..8504cc01d5 100644 --- a/ui-ngx/src/app/modules/home/pages/widget/widget-editor.component.ts +++ b/ui-ngx/src/app/modules/home/pages/widget/widget-editor.component.ts @@ -78,10 +78,11 @@ import Timeout = NodeJS.Timeout; // @dynamic @Component({ - selector: 'tb-widget-editor', - templateUrl: './widget-editor.component.html', - styleUrls: ['./widget-editor.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-widget-editor', + templateUrl: './widget-editor.component.html', + styleUrls: ['./widget-editor.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class WidgetEditorComponent extends PageComponent implements OnInit, OnDestroy, HasDirtyFlag { diff --git a/ui-ngx/src/app/modules/home/pages/widget/widget-type-autocomplete.component.ts b/ui-ngx/src/app/modules/home/pages/widget/widget-type-autocomplete.component.ts index e309e21d1d..04fd5af1cb 100644 --- a/ui-ngx/src/app/modules/home/pages/widget/widget-type-autocomplete.component.ts +++ b/ui-ngx/src/app/modules/home/pages/widget/widget-type-autocomplete.component.ts @@ -37,15 +37,16 @@ import { coerceBoolean } from '@shared/decorators/coercion'; import { WidgetService } from '@core/http/widget.service'; @Component({ - selector: 'tb-widget-type-autocomplete', - templateUrl: './widget-type-autocomplete.component.html', - styleUrls: ['./widget-type-autocomplete.component.scss'], - providers: [{ - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => WidgetTypeAutocompleteComponent), - multi: true - }], - encapsulation: ViewEncapsulation.None + selector: 'tb-widget-type-autocomplete', + templateUrl: './widget-type-autocomplete.component.html', + styleUrls: ['./widget-type-autocomplete.component.scss'], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => WidgetTypeAutocompleteComponent), + multi: true + }], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class WidgetTypeAutocompleteComponent implements ControlValueAccessor, OnInit, AfterViewInit { diff --git a/ui-ngx/src/app/modules/home/pages/widget/widget-type-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/widget/widget-type-tabs.component.ts index acee3159d2..0168bfb639 100644 --- a/ui-ngx/src/app/modules/home/pages/widget/widget-type-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/widget/widget-type-tabs.component.ts @@ -22,9 +22,10 @@ import { NULL_UUID } from '@shared/models/id/has-uuid'; import { WidgetTypeDetails } from '@shared/models/widget.models'; @Component({ - selector: 'tb-widget-type-tabs', - templateUrl: './widget-type-tabs.component.html', - styleUrls: [] + selector: 'tb-widget-type-tabs', + templateUrl: './widget-type-tabs.component.html', + styleUrls: [], + standalone: false }) export class WidgetTypeTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/widget/widget-type.component.ts b/ui-ngx/src/app/modules/home/pages/widget/widget-type.component.ts index b765fadb1d..c6911e287e 100644 --- a/ui-ngx/src/app/modules/home/pages/widget/widget-type.component.ts +++ b/ui-ngx/src/app/modules/home/pages/widget/widget-type.component.ts @@ -24,9 +24,10 @@ import { EntityTableConfig } from '@home/models/entity/entities-table-config.mod import { WidgetTypeDetails } from '@shared/models/widget.models'; @Component({ - selector: 'tb-widget-type', - templateUrl: './widget-type.component.html', - styleUrls: [] + selector: 'tb-widget-type', + templateUrl: './widget-type.component.html', + styleUrls: [], + standalone: false }) export class WidgetTypeComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-dialog.component.ts index 5e2e4e0c4d..c493ba032d 100644 --- a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-dialog.component.ts @@ -31,10 +31,11 @@ export interface WidgetsBundleDialogData { } @Component({ - selector: 'tb-widgets-bundle-dialog', - templateUrl: './widgets-bundle-dialog.component.html', - providers: [{provide: ErrorStateMatcher, useExisting: WidgetsBundleDialogComponent}], - styleUrls: ['widgets-bundle-dialog.component.scss'] + selector: 'tb-widgets-bundle-dialog', + templateUrl: './widgets-bundle-dialog.component.html', + providers: [{ provide: ErrorStateMatcher, useExisting: WidgetsBundleDialogComponent }], + styleUrls: ['widgets-bundle-dialog.component.scss'], + standalone: false }) export class WidgetsBundleDialogComponent extends DialogComponent implements ErrorStateMatcher { diff --git a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-tabs.component.ts index 5a684bc031..6e569ff701 100644 --- a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-tabs.component.ts +++ b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-tabs.component.ts @@ -22,9 +22,10 @@ import { WidgetsBundle } from '@shared/models/widgets-bundle.model'; import { NULL_UUID } from '@shared/models/id/has-uuid'; @Component({ - selector: 'tb-widgets-bundle-tabs', - templateUrl: './widgets-bundle-tabs.component.html', - styleUrls: [] + selector: 'tb-widgets-bundle-tabs', + templateUrl: './widgets-bundle-tabs.component.html', + styleUrls: [], + standalone: false }) export class WidgetsBundleTabsComponent extends EntityTabsComponent { diff --git a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-widgets.component.ts b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-widgets.component.ts index 7eb3afddc6..50cf6b9ef7 100644 --- a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-widgets.component.ts +++ b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-widgets.component.ts @@ -36,9 +36,10 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; type WidgetTypeBundle = WithOptional; @Component({ - selector: 'tb-widgets-bundle-widget', - templateUrl: './widgets-bundle-widgets.component.html', - styleUrls: ['./widgets-bundle-widgets.component.scss'] + selector: 'tb-widgets-bundle-widget', + templateUrl: './widgets-bundle-widgets.component.html', + styleUrls: ['./widgets-bundle-widgets.component.scss'], + standalone: false }) export class WidgetsBundleWidgetsComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle.component.ts b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle.component.ts index 1ccabc8050..bbfe6cb90e 100644 --- a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle.component.ts +++ b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle.component.ts @@ -23,9 +23,10 @@ import { WidgetsBundle } from '@shared/models/widgets-bundle.model'; import { EntityTableConfig } from '@home/models/entity/entities-table-config.models'; @Component({ - selector: 'tb-widgets-bundle', - templateUrl: './widgets-bundle.component.html', - styleUrls: ['./widgets-bundle.component.scss'] + selector: 'tb-widgets-bundle', + templateUrl: './widgets-bundle.component.html', + styleUrls: ['./widgets-bundle.component.scss'], + standalone: false }) export class WidgetsBundleComponent extends EntityComponent { diff --git a/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts b/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts index 27c72dd6f4..cfc57d3bb6 100644 --- a/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts +++ b/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts @@ -26,9 +26,10 @@ import { ActivatedRoute } from '@angular/router'; import { Subscription } from 'rxjs'; @Component({ - selector: 'tb-create-password', - templateUrl: './create-password.component.html', - styleUrls: ['./create-password.component.scss'] + selector: 'tb-create-password', + templateUrl: './create-password.component.html', + styleUrls: ['./create-password.component.scss'], + standalone: false }) export class CreatePasswordComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/login/pages/login/link-expired.component.ts b/ui-ngx/src/app/modules/login/pages/login/link-expired.component.ts index 0278dbb232..9b927b7c7a 100644 --- a/ui-ngx/src/app/modules/login/pages/login/link-expired.component.ts +++ b/ui-ngx/src/app/modules/login/pages/login/link-expired.component.ts @@ -21,9 +21,10 @@ import { PageComponent } from '@shared/components/page.component'; import { ActivatedRoute, Router } from '@angular/router'; @Component({ - selector: 'tb-link-expired', - templateUrl: './link-expired.component.html', - styleUrls: ['./link-expired.component.scss'] + selector: 'tb-link-expired', + templateUrl: './link-expired.component.html', + styleUrls: ['./link-expired.component.scss'], + standalone: false }) export class LinkExpiredComponent extends PageComponent { diff --git a/ui-ngx/src/app/modules/login/pages/login/login.component.ts b/ui-ngx/src/app/modules/login/pages/login/login.component.ts index 51d85eb69b..afe029791b 100644 --- a/ui-ngx/src/app/modules/login/pages/login/login.component.ts +++ b/ui-ngx/src/app/modules/login/pages/login/login.component.ts @@ -27,9 +27,10 @@ import { OAuth2ClientLoginInfo } from '@shared/models/oauth2.models'; import { validateEmail } from '@app/core/utils'; @Component({ - selector: 'tb-login', - templateUrl: './login.component.html', - styleUrls: ['./login.component.scss'] + selector: 'tb-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'], + standalone: false }) export class LoginComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/login/pages/login/reset-password-request.component.ts b/ui-ngx/src/app/modules/login/pages/login/reset-password-request.component.ts index e96e44cedf..f59b4b3632 100644 --- a/ui-ngx/src/app/modules/login/pages/login/reset-password-request.component.ts +++ b/ui-ngx/src/app/modules/login/pages/login/reset-password-request.component.ts @@ -25,9 +25,10 @@ import { TranslateService } from '@ngx-translate/core'; import { validateEmail } from '@app/core/utils'; @Component({ - selector: 'tb-reset-password-request', - templateUrl: './reset-password-request.component.html', - styleUrls: ['./reset-password-request.component.scss'] + selector: 'tb-reset-password-request', + templateUrl: './reset-password-request.component.html', + styleUrls: ['./reset-password-request.component.scss'], + standalone: false }) export class ResetPasswordRequestComponent extends PageComponent implements OnInit { diff --git a/ui-ngx/src/app/modules/login/pages/login/reset-password.component.ts b/ui-ngx/src/app/modules/login/pages/login/reset-password.component.ts index 225421810a..ce90ec829f 100644 --- a/ui-ngx/src/app/modules/login/pages/login/reset-password.component.ts +++ b/ui-ngx/src/app/modules/login/pages/login/reset-password.component.ts @@ -26,9 +26,10 @@ import { ActivatedRoute, Router } from '@angular/router'; import { Subscription } from 'rxjs'; @Component({ - selector: 'tb-reset-password', - templateUrl: './reset-password.component.html', - styleUrls: ['./reset-password.component.scss'] + selector: 'tb-reset-password', + templateUrl: './reset-password.component.html', + styleUrls: ['./reset-password.component.scss'], + standalone: false }) export class ResetPasswordComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/modules/login/pages/login/two-factor-auth-login.component.ts b/ui-ngx/src/app/modules/login/pages/login/two-factor-auth-login.component.ts index b4b2e896ac..856374fe27 100644 --- a/ui-ngx/src/app/modules/login/pages/login/two-factor-auth-login.component.ts +++ b/ui-ngx/src/app/modules/login/pages/login/two-factor-auth-login.component.ts @@ -32,9 +32,10 @@ import { isEqual } from '@core/utils'; import { ActionNotificationShow } from '@core/notification/notification.actions'; @Component({ - selector: 'tb-two-factor-auth-login', - templateUrl: './two-factor-auth-login.component.html', - styleUrls: ['./two-factor-auth-login.component.scss'] + selector: 'tb-two-factor-auth-login', + templateUrl: './two-factor-auth-login.component.html', + styleUrls: ['./two-factor-auth-login.component.scss'], + standalone: false }) export class TwoFactorAuthLoginComponent extends PageComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/shared/components/breadcrumb.component.ts b/ui-ngx/src/app/shared/components/breadcrumb.component.ts index 858bd20370..75603fc9cb 100644 --- a/ui-ngx/src/app/shared/components/breadcrumb.component.ts +++ b/ui-ngx/src/app/shared/components/breadcrumb.component.ts @@ -28,10 +28,11 @@ import { MenuSection, menuSectionMap } from '@core/services/menu.models'; import { MenuService } from '@core/services/menu.service'; @Component({ - selector: 'tb-breadcrumb', - templateUrl: './breadcrumb.component.html', - styleUrls: ['./breadcrumb.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'tb-breadcrumb', + templateUrl: './breadcrumb.component.html', + styleUrls: ['./breadcrumb.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: false }) export class BreadcrumbComponent implements OnInit, OnDestroy { diff --git a/ui-ngx/src/app/shared/components/button/copy-button.component.ts b/ui-ngx/src/app/shared/components/button/copy-button.component.ts index 6f2573ccbd..9f5617a4da 100644 --- a/ui-ngx/src/app/shared/components/button/copy-button.component.ts +++ b/ui-ngx/src/app/shared/components/button/copy-button.component.ts @@ -22,9 +22,10 @@ import { ThemePalette } from '@angular/material/core'; import { coerceBoolean } from '@shared/decorators/coercion'; @Component({ - selector: 'tb-copy-button', - styleUrls: ['copy-button.component.scss'], - templateUrl: './copy-button.component.html' + selector: 'tb-copy-button', + styleUrls: ['copy-button.component.scss'], + templateUrl: './copy-button.component.html', + standalone: false }) export class CopyButtonComponent { diff --git a/ui-ngx/src/app/shared/components/button/toggle-password.component.ts b/ui-ngx/src/app/shared/components/button/toggle-password.component.ts index 28ba243e1e..b3a1ca1e70 100644 --- a/ui-ngx/src/app/shared/components/button/toggle-password.component.ts +++ b/ui-ngx/src/app/shared/components/button/toggle-password.component.ts @@ -17,9 +17,10 @@ import { AfterViewInit, Component, ElementRef } from '@angular/core'; @Component({ - selector: 'tb-toggle-password', - templateUrl: 'toggle-password.component.html', - styleUrls: [], + selector: 'tb-toggle-password', + templateUrl: 'toggle-password.component.html', + styleUrls: [], + standalone: false }) export class TogglePasswordComponent implements AfterViewInit { showPassword = false; diff --git a/ui-ngx/src/app/shared/components/button/widget-button-toggle.component.ts b/ui-ngx/src/app/shared/components/button/widget-button-toggle.component.ts index 62d3d9ff0c..488afa9a81 100644 --- a/ui-ngx/src/app/shared/components/button/widget-button-toggle.component.ts +++ b/ui-ngx/src/app/shared/components/button/widget-button-toggle.component.ts @@ -46,9 +46,10 @@ const initialButtonHeight = 60; const horizontalLayoutPadding = 10; @Component({ - selector: 'tb-widget-button-toggle', - templateUrl: './widget-button-toggle.component.html', - styleUrls: ['./widget-button-toggle.component.scss'] + selector: 'tb-widget-button-toggle', + templateUrl: './widget-button-toggle.component.html', + styleUrls: ['./widget-button-toggle.component.scss'], + standalone: false }) export class WidgetButtonToggleComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges { diff --git a/ui-ngx/src/app/shared/components/button/widget-button.component.ts b/ui-ngx/src/app/shared/components/button/widget-button.component.ts index 213b5c2a47..7c4ef584d5 100644 --- a/ui-ngx/src/app/shared/components/button/widget-button.component.ts +++ b/ui-ngx/src/app/shared/components/button/widget-button.component.ts @@ -45,10 +45,11 @@ const horizontalLayoutPadding = 24; const verticalLayoutPadding = 16; @Component({ - selector: 'tb-widget-button', - templateUrl: './widget-button.component.html', - styleUrls: ['./widget-button.component.scss'], - encapsulation: ViewEncapsulation.None + selector: 'tb-widget-button', + templateUrl: './widget-button.component.html', + styleUrls: ['./widget-button.component.scss'], + encapsulation: ViewEncapsulation.None, + standalone: false }) export class WidgetButtonComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges { diff --git a/ui-ngx/src/app/shared/components/cheatsheet.component.ts b/ui-ngx/src/app/shared/components/cheatsheet.component.ts index 93ae5c87b1..00fe6e5790 100644 --- a/ui-ngx/src/app/shared/components/cheatsheet.component.ts +++ b/ui-ngx/src/app/shared/components/cheatsheet.component.ts @@ -20,8 +20,8 @@ import { MousetrapInstance } from 'mousetrap'; import Mousetrap from 'mousetrap'; @Component({ - selector : 'tb-hotkeys-cheatsheet', - styles : [` + selector: 'tb-hotkeys-cheatsheet', + styles: [` .tb-hotkeys-container { display: table !important; position: fixed; @@ -114,7 +114,7 @@ import Mousetrap from 'mousetrap'; font-size: 1.2em; } } `], - template : `
diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-config-servers.component.html b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-config-servers.component.html index eda38cfa13..d738e0447a 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-config-servers.component.html +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-bootstrap-config-servers.component.html @@ -34,7 +34,7 @@
diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry-instances.component.html b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry-instances.component.html index b88cd297ce..f432533614 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry-instances.component.html +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-observe-attr-telemetry-instances.component.html @@ -30,7 +30,7 @@
-
+
-
+
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/status-widget.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/status-widget.component.html index ff3d709352..0cc88f5404 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/status-widget.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/status-widget.component.html @@ -20,7 +20,7 @@
-
+
{{ icon }}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-add-dialog.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-add-dialog.component.html index c1caf24348..1b5b3f1992 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-add-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/persistent-add-dialog.component.html @@ -39,10 +39,10 @@ widgets.persistent-table.method - + {{'widgets.persistent-table.method-error' | translate}} - + {{'widgets.persistent-table.white-space-error' | translate}} diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/single-switch-widget.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/single-switch-widget.component.html index 5a8715adf9..b54bc91b6f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/single-switch-widget.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/single-switch-widget.component.html @@ -20,7 +20,7 @@
-
+
{{ icon }} diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-appearance.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-appearance.component.html index 5c2ceca5f1..133e6f3f29 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-appearance.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/button/widget-button-appearance.component.html @@ -90,7 +90,7 @@
{{ widgetButtonStateTranslationMap.get(state) | translate }}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-action-button-row.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-action-button-row.component.html index 63f59f169c..421d518a90 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-action-button-row.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/map/map-action-button-row.component.html @@ -27,7 +27,7 @@ warning - + widgets.maps.data-layer.tooltip-tag-actions
-
diff --git a/ui-ngx/src/app/modules/home/components/wizard/device-wizard-dialog.component.html b/ui-ngx/src/app/modules/home/components/wizard/device-wizard-dialog.component.html index 0ad5814a81..ef80df1e9a 100644 --- a/ui-ngx/src/app/modules/home/components/wizard/device-wizard-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/wizard/device-wizard-dialog.component.html @@ -108,7 +108,7 @@ color="primary" *ngIf="showNext" [disabled]="(isLoading$ | async)" - (click)="nextStep()">{{ 'action.next-with-label' | translate:{label: (getFormLabel(this.selectedIndex+1) | translate)} }} + (click)="nextStep()">{{ 'action.next-with-label' | translate:{label: (getFormLabel(selectedIndex+1) | translate)} }}
diff --git a/ui-ngx/src/app/modules/home/pages/device-profile/device-profile-tabs.component.html b/ui-ngx/src/app/modules/home/pages/device-profile/device-profile-tabs.component.html index ebbab8f20f..27433a3f2f 100644 --- a/ui-ngx/src/app/modules/home/pages/device-profile/device-profile-tabs.component.html +++ b/ui-ngx/src/app/modules/home/pages/device-profile/device-profile-tabs.component.html @@ -45,8 +45,8 @@
diff --git a/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-bundle-dialog.component.html b/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-bundle-dialog.component.html index 9aa4fa60c6..3845e417b0 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-bundle-dialog.component.html +++ b/ui-ngx/src/app/modules/home/pages/mobile/bundes/mobile-bundle-dialog.component.html @@ -89,7 +89,7 @@ labelText="{{ 'admin.oauth2.clients' | translate }}" placeholderText="{{ 'admin.oauth2.add-client' | translate }}"> diff --git a/ui-ngx/src/app/modules/home/pages/ota-update/ota-update.component.html b/ui-ngx/src/app/modules/home/pages/ota-update/ota-update.component.html index 131ea43496..45478969f8 100644 --- a/ui-ngx/src/app/modules/home/pages/ota-update/ota-update.component.html +++ b/ui-ngx/src/app/modules/home/pages/ota-update/ota-update.component.html @@ -130,7 +130,7 @@
+ *ngIf="!(isAdd && entityForm.get('generateChecksum').value)"> ota-update.checksum-algorithm diff --git a/ui-ngx/src/app/modules/login/pages/login/reset-password-request.component.html b/ui-ngx/src/app/modules/login/pages/login/reset-password-request.component.html index e71f67fe7b..0314975b36 100644 --- a/ui-ngx/src/app/modules/login/pages/login/reset-password-request.component.html +++ b/ui-ngx/src/app/modules/login/pages/login/reset-password-request.component.html @@ -40,7 +40,7 @@
-