diff --git a/msa/tb-node/docker/Dockerfile b/msa/tb-node/docker/Dockerfile
index 21babfdfbf..51618675bb 100644
--- a/msa/tb-node/docker/Dockerfile
+++ b/msa/tb-node/docker/Dockerfile
@@ -16,6 +16,8 @@
FROM thingsboard/openjdk11
+RUN echo 'networkaddress.cache.ttl=60' >> /etc/java-11-openjdk/security/java.security
+
COPY start-tb-node.sh ${pkg.name}.deb /tmp/
RUN chmod a+x /tmp/*.sh \
diff --git a/ui-ngx/src/app/core/api/data-aggregator.ts b/ui-ngx/src/app/core/api/data-aggregator.ts
index 971f037282..300998548c 100644
--- a/ui-ngx/src/app/core/api/data-aggregator.ts
+++ b/ui-ngx/src/app/core/api/data-aggregator.ts
@@ -308,7 +308,7 @@ export class DataAggregator {
}
aggKeyData.delete(aggTimestamp);
this.updatedData = true;
- } else if (aggTimestamp < this.endTs) {
+ } else if (aggTimestamp < this.endTs || this.noAggregation) {
const kvPair: [number, any] = [aggTimestamp, aggData.aggValue];
keyData.push(kvPair);
}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/markdown-widget.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/markdown-widget.component.scss
index bea3ee1509..4ac6bf9095 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/markdown-widget.component.scss
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/markdown-widget.component.scss
@@ -16,6 +16,7 @@
.tb-markdown-view {
display: block;
+ height: 100%;
::ng-deep {
h1 {
font-size: 32px;
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/multiple-input-widget.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/multiple-input-widget.component.html
index 5dc5bc4be2..65db045157 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/multiple-input-widget.component.html
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/multiple-input-widget.component.html
@@ -122,7 +122,7 @@
+ *ngIf="(!entityDetected || !isAllParametersValid) && datasourceDetected">
{{ 'widgets.input-widgets.no-entity-selected' | translate }}
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 5ba5651511..def6404ffc 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
@@ -117,6 +117,7 @@ export class MultipleInputWidgetComponent extends PageComponent implements OnIni
resetButtonLabel: string;
entityDetected = false;
+ datasourceDetected = false;
isAllParametersValid = true;
multipleInputFormGroup: FormGroup;
@@ -203,7 +204,8 @@ export class MultipleInputWidgetComponent extends PageComponent implements OnIni
}
private updateDatasources() {
- if (this.datasources && this.datasources.length) {
+ this.datasourceDetected = this.datasources?.length !== 0;
+ if (this.datasourceDetected) {
this.entityDetected = true;
let keyIndex = 0;
this.datasources.forEach((datasource) => {
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/qrcode-widget.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/qrcode-widget.component.html
index 6423bf33ce..48f888340a 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/qrcode-widget.component.html
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/qrcode-widget.component.html
@@ -17,6 +17,8 @@
-->
-
entity.no-data
-
widgets.invalid-qr-code-text
+
+
entity.no-data
+
widgets.invalid-qr-code-text
+
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 dff51a1378..a7c2c46911 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
@@ -54,6 +54,7 @@ export class QrCodeWidgetComponent extends PageComponent implements OnInit, Afte
qrCodeText: string;
invalidQrCodeText = false;
+ datasourceDetected = false;
private viewInited: boolean;
private scheduleUpdateCanvas: boolean;
@@ -95,6 +96,8 @@ export class QrCodeWidgetComponent extends PageComponent implements OnInit, Afte
data: []
}
];
+ } else {
+ this.datasourceDetected = false;
}
if (initialData) {
const data = parseData(initialData);
@@ -103,6 +106,7 @@ export class QrCodeWidgetComponent extends PageComponent implements OnInit, Afte
safeExecute(this.qrCodeTextFunction, [dataSourceData]) : this.settings.qrCodeTextPattern;
const replaceInfo = processPattern(pattern, dataSourceData);
qrCodeText = fillPattern(pattern, replaceInfo, dataSourceData);
+ this.datasourceDetected = true;
}
this.updateQrCodeText(qrCodeText);
}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/switch.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/switch.component.scss
index d5f5e2be56..293246c79e 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/rpc/switch.component.scss
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/rpc/switch.component.scss
@@ -45,6 +45,7 @@ $error-height: 14px !default;
font-weight: 500;
color: #757575;
white-space: nowrap;
+ z-index: 1;
.off-label {
color: #b7b5b5;
@@ -86,6 +87,8 @@ $error-height: 14px !default;
:host ::ng-deep {
.tb-switch {
.switch {
+ z-index: 1;
+
mat-slide-toggle {
position: absolute;
top: 0;
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 3f36769baf..94efa03663 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
@@ -19,7 +19,6 @@ import {
Component,
ElementRef,
Input,
- NgZone,
OnInit,
QueryList,
ViewChild,
@@ -59,7 +58,8 @@ import {
getCellStyleInfo,
getRowStyleInfo,
RowStyleInfo,
- TableWidgetDataKeySettings, TableWidgetSettings
+ TableWidgetDataKeySettings,
+ TableWidgetSettings
} from '@home/components/widget/lib/table-widget.models';
import { Overlay } from '@angular/cdk/overlay';
import { SubscriptionEntityInfo } from '@core/api/widget-api.models';
@@ -151,7 +151,6 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI
constructor(protected store: Store
,
private elementRef: ElementRef,
- private ngZone: NgZone,
private overlay: Overlay,
private viewContainerRef: ViewContainerRef,
private utils: UtilsService,
@@ -199,6 +198,7 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI
public onDataUpdated() {
this.updateCurrentSourceData();
this.clearCache();
+ this.ctx.detectChanges();
}
private initialize() {
@@ -291,7 +291,7 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI
if (this.actionCellDescriptors.length) {
source.displayedColumns.push('actions');
}
- const tsDatasource = new TimeseriesDatasource(source, this.hideEmptyLines, this.dateFormatFilter, this.datePipe, this.ngZone);
+ const tsDatasource = new TimeseriesDatasource(source, this.hideEmptyLines, this.dateFormatFilter, this.datePipe);
tsDatasource.dataUpdated(this.data);
this.sources.push(source);
}
@@ -574,8 +574,7 @@ class TimeseriesDatasource implements DataSource {
private source: TimeseriesTableSource,
private hideEmptyLines: boolean,
private dateFormatFilter: string,
- private datePipe: DatePipe,
- private ngZone: NgZone
+ private datePipe: DatePipe
) {
this.source.timeseriesDatasource = this;
}
@@ -598,10 +597,8 @@ class TimeseriesDatasource implements DataSource {
catchError(() => of(emptyPageData())),
).subscribe(
(pageData) => {
- this.ngZone.run(() => {
- this.rowsSubject.next(pageData.data);
- this.pageDataSubject.next(pageData);
- });
+ this.rowsSubject.next(pageData.data);
+ this.pageDataSubject.next(pageData);
}
);
}