diff --git a/application/src/main/data/json/system/widget_bundles/cards.json b/application/src/main/data/json/system/widget_bundles/cards.json
index be46aebec1..8e3b597c6b 100644
--- a/application/src/main/data/json/system/widget_bundles/cards.json
+++ b/application/src/main/data/json/system/widget_bundles/cards.json
@@ -271,8 +271,8 @@
{
"alias": "aggregated_value_card",
"name": "Aggregated value card",
- "image": null,
- "description": null,
+ "image": "data:image/png;base64,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",
+ "description": "Displays current and aggregated difference values with a timeseries chart. Widget styles are customizable.",
"descriptor": {
"type": "timeseries",
"sizeX": 4.5,
@@ -284,12 +284,12 @@
"settingsSchema": "{}",
"dataKeySettingsSchema": "{}",
"latestDataKeySettingsSchema": "{}",
- "settingsDirective": "",
+ "settingsDirective": "tb-aggregated-value-card-widget-settings",
"dataKeySettingsDirective": "",
"latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings",
"hasBasicMode": true,
"basicModeDirective": "tb-aggregated-value-card-basic-config",
- "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"watermeter\",\"color\":\"#2196f3\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 10 - 5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 5) {\\n\\tvalue = 5;\\n} else if (value > 80) {\\n\\tvalue = 80;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Avg watermeter\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 10 - 5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 5) {\\n\\tvalue = 5;\\n} else if (value > 80) {\\n\\tvalue = 80;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"m³\",\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent watermeter\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random 2\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"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;\",\"aggregationType\":null,\"units\":\"m³\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":null,\"padding\":\"0\",\"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,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false},\"title\":\"Aggregated value card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"water_drop\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"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}}"
+ "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"watermeter\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 10 - 5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 5) {\\n\\tvalue = 5;\\n} else if (value > 80) {\\n\\tvalue = 80;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 10 - 5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 5) {\\n\\tvalue = 5;\\n} else if (value > 80) {\\n\\tvalue = 80;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"m³\",\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"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;\",\"aggregationType\":null,\"units\":\"m³\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"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,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Aggregated value card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"water_drop\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"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\":null}"
}
}
]
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 a2a33b73a1..22f50e79af 100644
--- a/ui-ngx/src/app/core/services/dashboard-utils.service.ts
+++ b/ui-ngx/src/app/core/services/dashboard-utils.service.ts
@@ -31,7 +31,6 @@ import {
} from '@shared/models/dashboard.models';
import { deepClone, isDefined, isDefinedAndNotNull, isString, isUndefined } from '@core/utils';
import {
- DataKey,
Datasource,
datasourcesHasOnlyComparisonAggregation,
DatasourceType,
@@ -484,6 +483,14 @@ export class DashboardUtilsService {
return widgetsArray;
}
+ public isEmptyDashboard(dashboard: Dashboard): boolean {
+ if (dashboard?.configuration?.widgets) {
+ return Object.keys(dashboard?.configuration?.widgets).length === 0;
+ } else {
+ return true;
+ }
+ }
+
public addWidgetToLayout(dashboard: Dashboard,
targetState: string,
targetLayout: DashboardLayoutId,
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 3996c1abaf..526336f5a3 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
@@ -71,7 +71,6 @@ import { MediaBreakpoints } from '@shared/models/constants';
import { AuthUser } from '@shared/models/user.model';
import { getCurrentAuthState } from '@core/auth/auth.selectors';
import {
- DatasourceType,
Widget,
WidgetConfig,
WidgetInfo,
@@ -415,6 +414,9 @@ export class DashboardPageComponent extends PageComponent implements IDashboardC
this.updateLayoutSizes();
});
this.dashboardResize$.observe(this.dashboardContainer.nativeElement);
+ if (!this.widgetEditMode && !this.readonly && this.dashboardUtils.isEmptyDashboard(this.dashboard)) {
+ this.setEditMode(true, false);
+ }
}
private init(data: DashboardPageInitData) {
diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-data-key-row.component.html b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-data-key-row.component.html
index 6616eb02f9..60e0ab43cc 100644
--- a/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-data-key-row.component.html
+++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/cards/aggregated-data-key-row.component.html
@@ -64,6 +64,9 @@