Browse Source

Merge branch 'rc' of github.com:thingsboard/thingsboard into cf-fixes

pull/13040/head
IrynaMatveieva 1 year ago
parent
commit
3afcd18351
  1. 2
      application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCalculatedFieldConsumerService.java
  2. 2
      application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java
  3. 2
      application/src/main/java/org/thingsboard/server/service/queue/DefaultTbEdgeConsumerService.java
  4. 2
      application/src/main/java/org/thingsboard/server/service/queue/DefaultTbRuleEngineConsumerService.java
  5. 6
      application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java
  6. 19
      application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractPartitionBasedConsumerService.java
  7. 4
      ui-ngx/src/app/modules/common/modules-map.ts
  8. 1
      ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.ts
  9. 1
      ui-ngx/src/app/modules/home/components/widget/config/timewindow-config-panel.component.html
  10. 5
      ui-ngx/src/app/modules/home/models/widget-component.models.ts
  11. 4
      ui-ngx/src/app/modules/home/pages/admin/resource/js-resource.component.html
  12. 1
      ui-ngx/src/app/modules/home/pages/device/device-check-connectivity-dialog.component.scss
  13. 4
      ui-ngx/src/app/shared/components/js-func.component.scss
  14. 10
      ui-ngx/src/app/shared/components/markdown.component.scss
  15. 2
      ui-ngx/src/app/shared/models/widget.models.ts

2
application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCalculatedFieldConsumerService.java

@ -16,7 +16,6 @@
package org.thingsboard.server.service.queue; package org.thingsboard.server.service.queue;
import jakarta.annotation.PreDestroy; import jakarta.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
@ -70,7 +69,6 @@ import java.util.stream.Collectors;
@Service @Service
@TbRuleEngineComponent @TbRuleEngineComponent
@Slf4j
public class DefaultTbCalculatedFieldConsumerService extends AbstractPartitionBasedConsumerService<ToCalculatedFieldNotificationMsg> implements TbCalculatedFieldConsumerService { public class DefaultTbCalculatedFieldConsumerService extends AbstractPartitionBasedConsumerService<ToCalculatedFieldNotificationMsg> implements TbCalculatedFieldConsumerService {
@Value("${queue.calculated_fields.poll_interval:25}") @Value("${queue.calculated_fields.poll_interval:25}")

2
application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java

@ -20,7 +20,6 @@ import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy; import jakarta.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
@ -118,7 +117,6 @@ import java.util.stream.Collectors;
@Service @Service
@TbCoreComponent @TbCoreComponent
@Slf4j
public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCoreNotificationMsg> implements TbCoreConsumerService { public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCoreNotificationMsg> implements TbCoreConsumerService {
@Value("${queue.core.poll-interval}") @Value("${queue.core.poll-interval}")

2
application/src/main/java/org/thingsboard/server/service/queue/DefaultTbEdgeConsumerService.java

@ -19,7 +19,6 @@ import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
@ -65,7 +64,6 @@ import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j
@Service @Service
@TbCoreComponent @TbCoreComponent
public class DefaultTbEdgeConsumerService extends AbstractConsumerService<ToEdgeNotificationMsg> implements TbEdgeConsumerService { public class DefaultTbEdgeConsumerService extends AbstractConsumerService<ToEdgeNotificationMsg> implements TbEdgeConsumerService {

2
application/src/main/java/org/thingsboard/server/service/queue/DefaultTbRuleEngineConsumerService.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.service.queue; package org.thingsboard.server.service.queue;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
@ -65,7 +64,6 @@ import java.util.stream.Collectors;
@Service @Service
@TbRuleEngineComponent @TbRuleEngineComponent
@Slf4j
public class DefaultTbRuleEngineConsumerService extends AbstractPartitionBasedConsumerService<ToRuleEngineNotificationMsg> implements TbRuleEngineConsumerService { public class DefaultTbRuleEngineConsumerService extends AbstractPartitionBasedConsumerService<ToRuleEngineNotificationMsg> implements TbRuleEngineConsumerService {
private final TbRuleEngineConsumerContext ctx; private final TbRuleEngineConsumerContext ctx;

6
application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java

@ -17,7 +17,8 @@ package org.thingsboard.server.service.queue.processing;
import jakarta.annotation.PreDestroy; import jakarta.annotation.PreDestroy;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.thingsboard.common.util.ThingsBoardExecutors; import org.thingsboard.common.util.ThingsBoardExecutors;
import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.common.util.ThingsBoardThreadFactory;
@ -62,10 +63,11 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
public abstract class AbstractConsumerService<N extends com.google.protobuf.GeneratedMessageV3> extends TbApplicationEventListener<PartitionChangeEvent> { public abstract class AbstractConsumerService<N extends com.google.protobuf.GeneratedMessageV3> extends TbApplicationEventListener<PartitionChangeEvent> {
protected final Logger log = LoggerFactory.getLogger(getClass());
protected final ActorSystemContext actorContext; protected final ActorSystemContext actorContext;
protected final TbTenantProfileCache tenantProfileCache; protected final TbTenantProfileCache tenantProfileCache;
protected final TbDeviceProfileCache deviceProfileCache; protected final TbDeviceProfileCache deviceProfileCache;

19
application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractPartitionBasedConsumerService.java

@ -28,6 +28,8 @@ import org.thingsboard.server.service.profile.TbAssetProfileCache;
import org.thingsboard.server.service.profile.TbDeviceProfileCache; import org.thingsboard.server.service.profile.TbDeviceProfileCache;
import org.thingsboard.server.service.security.auth.jwt.settings.JwtSettingsService; import org.thingsboard.server.service.security.auth.jwt.settings.JwtSettingsService;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
@ -35,7 +37,7 @@ public abstract class AbstractPartitionBasedConsumerService<N extends com.google
private final Lock startupLock = new ReentrantLock(); private final Lock startupLock = new ReentrantLock();
private volatile boolean started = false; private volatile boolean started = false;
private PartitionChangeEvent lastPartitionChangeEvent; private List<PartitionChangeEvent> pendingEvents = new ArrayList<>();
public AbstractPartitionBasedConsumerService(ActorSystemContext actorContext, public AbstractPartitionBasedConsumerService(ActorSystemContext actorContext,
TbTenantProfileCache tenantProfileCache, TbTenantProfileCache tenantProfileCache,
@ -61,8 +63,16 @@ public abstract class AbstractPartitionBasedConsumerService<N extends com.google
onStartUp(); onStartUp();
startupLock.lock(); startupLock.lock();
try { try {
onPartitionChangeEvent(lastPartitionChangeEvent); for (PartitionChangeEvent partitionChangeEvent : pendingEvents) {
log.info("Handling partition change event: {}", partitionChangeEvent);
try {
onPartitionChangeEvent(partitionChangeEvent);
} catch (Throwable t) {
log.error("Failed to handle partition change event: {}", partitionChangeEvent, t);
}
}
started = true; started = true;
pendingEvents = null;
} finally { } finally {
startupLock.unlock(); startupLock.unlock();
} }
@ -70,17 +80,20 @@ public abstract class AbstractPartitionBasedConsumerService<N extends com.google
@Override @Override
protected void onTbApplicationEvent(PartitionChangeEvent event) { protected void onTbApplicationEvent(PartitionChangeEvent event) {
log.debug("Received partition change event: {}", event);
if (!started) { if (!started) {
startupLock.lock(); startupLock.lock();
try { try {
if (!started) { if (!started) {
lastPartitionChangeEvent = event; log.debug("App not started yet, storing event for later: {}", event);
pendingEvents.add(event);
return; return;
} }
} finally { } finally {
startupLock.unlock(); startupLock.unlock();
} }
} }
log.info("Handling partition change event: {}", event);
onPartitionChangeEvent(event); onPartitionChangeEvent(event);
} }

4
ui-ngx/src/app/modules/common/modules-map.ts

@ -76,6 +76,8 @@ import * as TranslateCore from '@ngx-translate/core';
import * as MatDateTimePicker from '@mat-datetimepicker/core'; import * as MatDateTimePicker from '@mat-datetimepicker/core';
import _moment from 'moment'; import _moment from 'moment';
import * as tslib from 'tslib'; import * as tslib from 'tslib';
import * as Echarts from 'echarts';
import * as EchartsCore from 'echarts/core';
import * as TbCore from '@core/public-api'; import * as TbCore from '@core/public-api';
import * as TbShared from '@shared/public-api'; import * as TbShared from '@shared/public-api';
@ -405,6 +407,8 @@ class ModulesMap implements IModulesMap {
'@mat-datetimepicker/core': MatDateTimePicker, '@mat-datetimepicker/core': MatDateTimePicker,
moment: _moment, moment: _moment,
tslib, tslib,
'echarts': Echarts,
'echarts/core': EchartsCore,
'@core/public-api': TbCore, '@core/public-api': TbCore,
'@shared/public-api': TbShared, '@shared/public-api': TbShared,

1
ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.ts

@ -1118,6 +1118,7 @@ export class DashboardPageComponent extends PageComponent implements IDashboardC
this.dashboardCtx.aliasController.dashboardStateChanged(); this.dashboardCtx.aliasController.dashboardStateChanged();
this.isRightLayoutOpened = openRightLayout ? true : false; this.isRightLayoutOpened = openRightLayout ? true : false;
this.updateLayouts(layoutsData); this.updateLayouts(layoutsData);
this.cd.markForCheck();
} }
setTimeout(() => { setTimeout(() => {
this.mobileService.onDashboardLoaded(this.layouts.right.show, this.isRightLayoutOpened); this.mobileService.onDashboardLoaded(this.layouts.right.show, this.isRightLayoutOpened);

1
ui-ngx/src/app/modules/home/components/widget/config/timewindow-config-panel.component.html

@ -33,6 +33,7 @@
noMargin noMargin
isEdit="true" isEdit="true"
alwaysDisplayTypePrefix alwaysDisplayTypePrefix
timezone="true"
[historyOnly]="onlyHistoryTimewindow" [historyOnly]="onlyHistoryTimewindow"
quickIntervalOnly="{{ widgetType === widgetTypes.latest }}" quickIntervalOnly="{{ widgetType === widgetTypes.latest }}"
aggregation="{{ widgetType === widgetTypes.timeseries }}" aggregation="{{ widgetType === widgetTypes.timeseries }}"

5
ui-ngx/src/app/modules/home/models/widget-component.models.ts

@ -115,6 +115,7 @@ import { DataKeySettingsFunction } from '@home/components/widget/lib/settings/co
import { UtilsService } from '@core/services/utils.service'; import { UtilsService } from '@core/services/utils.service';
import { CompiledTbFunction } from '@shared/models/js-function.models'; import { CompiledTbFunction } from '@shared/models/js-function.models';
import { FormProperty } from '@shared/models/dynamic-form.models'; import { FormProperty } from '@shared/models/dynamic-form.models';
import { ExportableEntity } from '@shared/models/base-data';
export interface IWidgetAction { export interface IWidgetAction {
name: string; name: string;
@ -573,7 +574,7 @@ export interface IDynamicWidgetComponent {
[key: string]: any; [key: string]: any;
} }
export interface WidgetInfo extends WidgetTypeDescriptor, WidgetControllerDescriptor { export interface WidgetInfo extends WidgetTypeDescriptor, WidgetControllerDescriptor, ExportableEntity<WidgetTypeId> {
widgetName: string; widgetName: string;
fullFqn: string; fullFqn: string;
deprecated: boolean; deprecated: boolean;
@ -681,6 +682,7 @@ export const toWidgetInfo = (widgetTypeEntity: WidgetType): WidgetInfo => ({
fullFqn: fullWidgetTypeFqn(widgetTypeEntity), fullFqn: fullWidgetTypeFqn(widgetTypeEntity),
deprecated: widgetTypeEntity.deprecated, deprecated: widgetTypeEntity.deprecated,
scada: widgetTypeEntity.scada, scada: widgetTypeEntity.scada,
externalId: widgetTypeEntity.externalId,
type: widgetTypeEntity.descriptor.type, type: widgetTypeEntity.descriptor.type,
sizeX: widgetTypeEntity.descriptor.sizeX, sizeX: widgetTypeEntity.descriptor.sizeX,
sizeY: widgetTypeEntity.descriptor.sizeY, sizeY: widgetTypeEntity.descriptor.sizeY,
@ -736,6 +738,7 @@ export const toWidgetType = (widgetInfo: WidgetInfo, id: WidgetTypeId, tenantId:
name: widgetInfo.widgetName, name: widgetInfo.widgetName,
deprecated: widgetInfo.deprecated, deprecated: widgetInfo.deprecated,
scada: widgetInfo.scada, scada: widgetInfo.scada,
externalId: widgetInfo.externalId,
descriptor descriptor
}; };
}; };

4
ui-ngx/src/app/modules/home/pages/admin/resource/js-resource.component.html

@ -80,6 +80,7 @@
(fileNameChanged)="entityForm?.get('fileName').patchValue($event)"> (fileNameChanged)="entityForm?.get('fileName').patchValue($event)">
</tb-file-input> </tb-file-input>
<tb-js-func *ngIf="entityForm.get('resourceSubType').value === ResourceSubType.MODULE" <tb-js-func *ngIf="entityForm.get('resourceSubType').value === ResourceSubType.MODULE"
[helpPopupStyle]="{ width: '1000px' }"
helpId="resource/js-resource-module_fn" helpId="resource/js-resource-module_fn"
formControlName="content" formControlName="content"
required required
@ -91,8 +92,7 @@
<label class="tb-title no-padding tb-required" <label class="tb-title no-padding tb-required"
[class.tb-error]="entityForm.get('content').invalid && entityForm.get('content').touched" [class.tb-error]="entityForm.get('content').invalid && entityForm.get('content').touched"
style="font-size: 16px;"> style="font-size: 16px;">
{{ 'javascript.module-script' | translate }} {{ 'javascript.module-script' | translate }}</label>
</label>
<tb-file-input *ngIf="(isAdd || isEdit)" <tb-file-input *ngIf="(isAdd || isEdit)"
asButton asButton
uploadButtonText="{{ 'javascript.upload-from-file' | translate }}" uploadButtonText="{{ 'javascript.upload-from-file' | translate }}"

1
ui-ngx/src/app/modules/home/pages/device/device-check-connectivity-dialog.component.scss

@ -124,7 +124,6 @@
background: #F3F6FA; background: #F3F6FA;
border-color: #305680; border-color: #305680;
padding-right: 38px; padding-right: 38px;
overflow: scroll;
padding-bottom: 4px; padding-bottom: 4px;
min-height: 42px; min-height: 42px;
scrollbar-width: thin; scrollbar-width: thin;

4
ui-ngx/src/app/shared/components/js-func.component.scss

@ -85,4 +85,8 @@
color: rgb(49, 132, 149); color: rgb(49, 132, 149);
} }
} }
label.tb-title.tb-required::after {
content: "*";
}
} }

10
ui-ngx/src/app/shared/components/markdown.component.scss

@ -270,7 +270,7 @@
outline: none; outline: none;
position: absolute; position: absolute;
width: 206px; width: 206px;
height: 42px; height: 32px;
top: 0; top: 0;
right: 32px; right: 32px;
background: 0 0; background: 0 0;
@ -281,11 +281,11 @@
user-select: none; user-select: none;
&.multiline { &.multiline {
right: 44px; right: 38px;
} }
p { p {
padding: 8px; padding: 8px 8px 0;
top: 1px; top: 1px;
transition: .2s; transition: .2s;
color: #2a7dec; color: #2a7dec;
@ -301,10 +301,10 @@
background-color: #fff; background-color: #fff;
position: absolute; position: absolute;
width: 38px; width: 38px;
height: 38px; height: 28px;
top: 3px; top: 3px;
right: 3px; right: 3px;
padding: 10px; padding: 10px 10px 0;
img { img {
position: initial; position: initial;

2
ui-ngx/src/app/shared/models/widget.models.ts

@ -206,7 +206,7 @@ export interface WidgetControllerDescriptor {
actionSources?: {[actionSourceId: string]: WidgetActionSource}; actionSources?: {[actionSourceId: string]: WidgetActionSource};
} }
export interface BaseWidgetType extends BaseData<WidgetTypeId>, HasTenantId, HasVersion { export interface BaseWidgetType extends BaseData<WidgetTypeId>, HasTenantId, HasVersion, ExportableEntity<WidgetTypeId> {
tenantId: TenantId; tenantId: TenantId;
fqn: string; fqn: string;
name: string; name: string;

Loading…
Cancel
Save