this.onMouseDown(e.originalEvent));
$(this.gridsterItem.el).on('click', (e) => this.onClicked(e.originalEvent));
@@ -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 {
diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-preview.component.html b/ui-ngx/src/app/modules/home/components/widget/widget-preview.component.html
index 1c56707563..115b13c5e5 100644
--- a/ui-ngx/src/app/modules/home/components/widget/widget-preview.component.html
+++ b/ui-ngx/src/app/modules/home/components/widget/widget-preview.component.html
@@ -1,6 +1,6 @@
+@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..003c1f3b71
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/pages/alarm/alarm-rules-tabs.component.ts
@@ -0,0 +1,49 @@
+///
+/// Copyright © 2016-2026 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import { 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..4e77b8f5ff 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
@@ -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.
@@ -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/app/modules/home/pages/api-usage/api-usage-routing.module.ts b/ui-ngx/src/app/modules/home/pages/api-usage/api-usage-routing.module.ts
index a57ceb480c..05435d6764 100644
--- a/ui-ngx/src/app/modules/home/pages/api-usage/api-usage-routing.module.ts
+++ b/ui-ngx/src/app/modules/home/pages/api-usage/api-usage-routing.module.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/pages/api-usage/api-usage.module.ts b/ui-ngx/src/app/modules/home/pages/api-usage/api-usage.module.ts
index 3199537a96..dfeaf0f8e5 100644
--- a/ui-ngx/src/app/modules/home/pages/api-usage/api-usage.module.ts
+++ b/ui-ngx/src/app/modules/home/pages/api-usage/api-usage.module.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/pages/asset-profile/asset-profile-routing.module.ts b/ui-ngx/src/app/modules/home/pages/asset-profile/asset-profile-routing.module.ts
index 2673d5b523..a606477762 100644
--- a/ui-ngx/src/app/modules/home/pages/asset-profile/asset-profile-routing.module.ts
+++ b/ui-ngx/src/app/modules/home/pages/asset-profile/asset-profile-routing.module.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/pages/asset-profile/asset-profile-tabs.component.html b/ui-ngx/src/app/modules/home/pages/asset-profile/asset-profile-tabs.component.html
index 9db6999179..c14adbf8be 100644
--- a/ui-ngx/src/app/modules/home/pages/asset-profile/asset-profile-tabs.component.html
+++ b/ui-ngx/src/app/modules/home/pages/asset-profile/asset-profile-tabs.component.html
@@ -1,6 +1,6 @@
+@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..acaacef7a7
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/pages/calculated-fields/calculated-fields-tabs.component.ts
@@ -0,0 +1,57 @@
+///
+/// Copyright © 2016-2026 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import { 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), false)
+ .subscribe((expression) => {
+ (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/modules/home/pages/customer/customer-routing.module.ts b/ui-ngx/src/app/modules/home/pages/customer/customer-routing.module.ts
index 8eaa13a9f9..55d33c833b 100644
--- a/ui-ngx/src/app/modules/home/pages/customer/customer-routing.module.ts
+++ b/ui-ngx/src/app/modules/home/pages/customer/customer-routing.module.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/pages/customer/customer-tabs.component.html b/ui-ngx/src/app/modules/home/pages/customer/customer-tabs.component.html
index 0a0e05ffdd..1c0bb7322b 100644
--- a/ui-ngx/src/app/modules/home/pages/customer/customer-tabs.component.html
+++ b/ui-ngx/src/app/modules/home/pages/customer/customer-tabs.component.html
@@ -1,6 +1,6 @@