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;
import jakarta.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher;
@ -70,7 +69,6 @@ import java.util.stream.Collectors;
@Service
@TbRuleEngineComponent
@Slf4j
public class DefaultTbCalculatedFieldConsumerService extends AbstractPartitionBasedConsumerService<ToCalculatedFieldNotificationMsg> implements TbCalculatedFieldConsumerService {
@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 jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher;
@ -118,7 +117,6 @@ import java.util.stream.Collectors;
@Service
@TbCoreComponent
@Slf4j
public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCoreNotificationMsg> implements TbCoreConsumerService {
@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.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Value;
@ -65,7 +64,6 @@ import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j
@Service
@TbCoreComponent
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;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Scheduled;
@ -65,7 +64,6 @@ import java.util.stream.Collectors;
@Service
@TbRuleEngineComponent
@Slf4j
public class DefaultTbRuleEngineConsumerService extends AbstractPartitionBasedConsumerService<ToRuleEngineNotificationMsg> implements TbRuleEngineConsumerService {
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 lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationEventPublisher;
import org.thingsboard.common.util.ThingsBoardExecutors;
import org.thingsboard.common.util.ThingsBoardThreadFactory;
@ -62,10 +63,11 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j
@RequiredArgsConstructor
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 TbTenantProfileCache tenantProfileCache;
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.security.auth.jwt.settings.JwtSettingsService;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
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 volatile boolean started = false;
private PartitionChangeEvent lastPartitionChangeEvent;
private List<PartitionChangeEvent> pendingEvents = new ArrayList<>();
public AbstractPartitionBasedConsumerService(ActorSystemContext actorContext,
TbTenantProfileCache tenantProfileCache,
@ -61,8 +63,16 @@ public abstract class AbstractPartitionBasedConsumerService<N extends com.google
onStartUp();
startupLock.lock();
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;
pendingEvents = null;
} finally {
startupLock.unlock();
}
@ -70,17 +80,20 @@ public abstract class AbstractPartitionBasedConsumerService<N extends com.google
@Override
protected void onTbApplicationEvent(PartitionChangeEvent event) {
log.debug("Received partition change event: {}", event);
if (!started) {
startupLock.lock();
try {
if (!started) {
lastPartitionChangeEvent = event;
log.debug("App not started yet, storing event for later: {}", event);
pendingEvents.add(event);
return;
}
} finally {
startupLock.unlock();
}
}
log.info("Handling partition change event: {}", 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 _moment from 'moment';
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 TbShared from '@shared/public-api';
@ -405,6 +407,8 @@ class ModulesMap implements IModulesMap {
'@mat-datetimepicker/core': MatDateTimePicker,
moment: _moment,
tslib,
'echarts': Echarts,
'echarts/core': EchartsCore,
'@core/public-api': TbCore,
'@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.isRightLayoutOpened = openRightLayout ? true : false;
this.updateLayouts(layoutsData);
this.cd.markForCheck();
}
setTimeout(() => {
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
isEdit="true"
alwaysDisplayTypePrefix
timezone="true"
[historyOnly]="onlyHistoryTimewindow"
quickIntervalOnly="{{ widgetType === widgetTypes.latest }}"
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 { CompiledTbFunction } from '@shared/models/js-function.models';
import { FormProperty } from '@shared/models/dynamic-form.models';
import { ExportableEntity } from '@shared/models/base-data';
export interface IWidgetAction {
name: string;
@ -573,7 +574,7 @@ export interface IDynamicWidgetComponent {
[key: string]: any;
}
export interface WidgetInfo extends WidgetTypeDescriptor, WidgetControllerDescriptor {
export interface WidgetInfo extends WidgetTypeDescriptor, WidgetControllerDescriptor, ExportableEntity<WidgetTypeId> {
widgetName: string;
fullFqn: string;
deprecated: boolean;
@ -681,6 +682,7 @@ export const toWidgetInfo = (widgetTypeEntity: WidgetType): WidgetInfo => ({
fullFqn: fullWidgetTypeFqn(widgetTypeEntity),
deprecated: widgetTypeEntity.deprecated,
scada: widgetTypeEntity.scada,
externalId: widgetTypeEntity.externalId,
type: widgetTypeEntity.descriptor.type,
sizeX: widgetTypeEntity.descriptor.sizeX,
sizeY: widgetTypeEntity.descriptor.sizeY,
@ -736,6 +738,7 @@ export const toWidgetType = (widgetInfo: WidgetInfo, id: WidgetTypeId, tenantId:
name: widgetInfo.widgetName,
deprecated: widgetInfo.deprecated,
scada: widgetInfo.scada,
externalId: widgetInfo.externalId,
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)">
</tb-file-input>
<tb-js-func *ngIf="entityForm.get('resourceSubType').value === ResourceSubType.MODULE"
[helpPopupStyle]="{ width: '1000px' }"
helpId="resource/js-resource-module_fn"
formControlName="content"
required
@ -91,8 +92,7 @@
<label class="tb-title no-padding tb-required"
[class.tb-error]="entityForm.get('content').invalid && entityForm.get('content').touched"
style="font-size: 16px;">
{{ 'javascript.module-script' | translate }}
</label>
{{ 'javascript.module-script' | translate }}</label>
<tb-file-input *ngIf="(isAdd || isEdit)"
asButton
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;
border-color: #305680;
padding-right: 38px;
overflow: scroll;
padding-bottom: 4px;
min-height: 42px;
scrollbar-width: thin;

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

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

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

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

Loading…
Cancel
Save