From 2e30317f9b8937fa100fe9f2a796239cbf98b419 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Tue, 25 Feb 2020 11:43:35 +0200 Subject: [PATCH] Propagate UI changes --- .../json/system/widget_bundles/cards.json | 2 +- ui-ngx/src/app/core/api/widget-api.models.ts | 5 ++- .../src/app/core/api/widget-subscription.ts | 6 ++- .../widget/dynamic-widget.component.ts | 4 ++ .../lib/entities-table-widget.component.ts | 37 +++++++++++++++++-- .../home/components/widget/lib/flot-widget.ts | 25 +++++++++++++ .../widget/lib/table-widget.models.ts | 1 + .../lib/timeseries-table-widget.component.ts | 11 ++++-- .../components/widget/widget.component.ts | 22 +++++++---- .../home/models/widget-component.models.ts | 3 ++ .../entity-state-controller.component.ts | 37 +++++++++++++------ ui-ngx/src/app/shared/models/base-data.ts | 1 + 12 files changed, 127 insertions(+), 27 deletions(-) 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 bd7f24b661..65c9b6cceb 100644 --- a/application/src/main/data/json/system/widget_bundles/cards.json +++ b/application/src/main/data/json/system/widget_bundles/cards.json @@ -32,7 +32,7 @@ "templateHtml": "\n", "templateCss": "", "controllerScript": "self.onInit = function() {\n}\n\nself.onDataUpdated = function() {\n self.ctx.$scope.entitiesTableWidget.onDataUpdated();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n dataKeysOptional: true\n };\n}\n\nself.actionSources = function() {\n return {\n 'actionCellButton': {\n name: 'widget-action.action-cell-button',\n multiple: true\n },\n 'rowClick': {\n name: 'widget-action.row-click',\n multiple: false\n }\n };\n}\n\nself.onDestroy = function() {\n}\n", - "settingsSchema": "{\n \"schema\": {\n \"type\": \"object\",\n \"title\": \"EntitiesTableSettings\",\n \"properties\": {\n \"entitiesTitle\": {\n \"title\": \"Entities table title\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"enableSearch\": {\n \"title\": \"Enable entities search\",\n \"type\": \"boolean\",\n \"default\": true\n },\n \"enableSelectColumnDisplay\": {\n \"title\": \"Enable select columns to display\",\n \"type\": \"boolean\",\n \"default\": true\n },\n \"displayEntityName\": {\n \"title\": \"Display entity name column\",\n \"type\": \"boolean\",\n \"default\": true\n },\n \"entityNameColumnTitle\": {\n \"title\": \"Entity name column title\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"displayEntityType\": {\n \"title\": \"Display entity type column\",\n \"type\": \"boolean\",\n \"default\": true\n },\n \"displayPagination\": {\n \"title\": \"Display pagination\",\n \"type\": \"boolean\",\n \"default\": true\n },\n \"defaultPageSize\": {\n \"title\": \"Default page size\",\n \"type\": \"number\",\n \"default\": 10\n },\n \"defaultSortOrder\": {\n \"title\": \"Default sort order\",\n \"type\": \"string\",\n \"default\": \"entityName\"\n }\n },\n \"required\": []\n },\n \"form\": [\n \"entitiesTitle\",\n \"enableSearch\",\n \"enableSelectColumnDisplay\",\n \"displayEntityName\",\n \"entityNameColumnTitle\",\n \"displayEntityType\",\n \"displayPagination\",\n \"defaultPageSize\",\n \"defaultSortOrder\"\n ]\n}", + "settingsSchema": "{\n \"schema\": {\n \"type\": \"object\",\n \"title\": \"EntitiesTableSettings\",\n \"properties\": {\n \"entitiesTitle\": {\n \"title\": \"Entities table title\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"enableSearch\": {\n \"title\": \"Enable entities search\",\n \"type\": \"boolean\",\n \"default\": true\n },\n \"enableSelectColumnDisplay\": {\n \"title\": \"Enable select columns to display\",\n \"type\": \"boolean\",\n \"default\": true\n },\n \"displayEntityName\": {\n \"title\": \"Display entity name column\",\n \"type\": \"boolean\",\n \"default\": true\n },\n \"entityNameColumnTitle\": {\n \"title\": \"Entity name column title\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"displayEntityLabel\": {\n \"title\": \"Display entity label column\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"entityLabelColumnTitle\": {\n \"title\": \"Entity label column title\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"displayEntityType\": {\n \"title\": \"Display entity type column\",\n \"type\": \"boolean\",\n \"default\": true\n },\n \"displayPagination\": {\n \"title\": \"Display pagination\",\n \"type\": \"boolean\",\n \"default\": true\n },\n \"defaultPageSize\": {\n \"title\": \"Default page size\",\n \"type\": \"number\",\n \"default\": 10\n },\n \"defaultSortOrder\": {\n \"title\": \"Default sort order\",\n \"type\": \"string\",\n \"default\": \"entityName\"\n }\n },\n \"required\": []\n },\n \"form\": [\n \"entitiesTitle\",\n \"enableSearch\",\n \"enableSelectColumnDisplay\",\n \"displayEntityName\",\n \"entityNameColumnTitle\",\n \"displayEntityLabel\",\n \"entityLabelColumnTitle\",\n \"displayEntityType\",\n \"displayPagination\",\n \"defaultPageSize\",\n \"defaultSortOrder\"\n ]\n}", "dataKeySettingsSchema": "{\n \"schema\": {\n \"type\": \"object\",\n \"title\": \"DataKeySettings\",\n \"properties\": {\n \"columnWidth\": {\n \"title\": \"Column width (px or %)\",\n \"type\": \"string\",\n \"default\": \"0px\"\n },\n \"useCellStyleFunction\": {\n \"title\": \"Use cell style function\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"cellStyleFunction\": {\n \"title\": \"Cell style function: f(value)\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"useCellContentFunction\": {\n \"title\": \"Use cell content function\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"cellContentFunction\": {\n \"title\": \"Cell content function: f(value, entity, ctx)\",\n \"type\": \"string\",\n \"default\": \"\"\n }\n },\n \"required\": []\n },\n \"form\": [\n \"columnWidth\",\n \"useCellStyleFunction\",\n {\n \"key\": \"cellStyleFunction\",\n \"type\": \"javascript\"\n },\n \"useCellContentFunction\",\n {\n \"key\": \"cellContentFunction\",\n \"type\": \"javascript\"\n }\n ]\n}", "defaultConfig": "{\"timewindow\":{\"realtime\":{\"interval\":1000,\"timewindowMs\":86400000},\"aggregation\":{\"type\":\"NONE\",\"limit\":200}},\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"4px\",\"settings\":{\"enableSelection\":true,\"enableSearch\":true,\"displayDetails\":true,\"displayPagination\":true,\"defaultPageSize\":10,\"defaultSortOrder\":\"entityName\",\"displayEntityName\":true,\"displayEntityType\":true},\"title\":\"Entities table\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400,\"padding\":\"5px 10px 5px 10px\"},\"useDashboardTimewindow\":false,\"showLegend\":false,\"datasources\":[{\"type\":\"function\",\"name\":\"Simulated\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Sin\",\"color\":\"#2196f3\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.472295003170325,\"funcBody\":\"return Math.round(1000*Math.sin(time/5000));\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Cos\",\"color\":\"#4caf50\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.8926244886945558,\"funcBody\":\"return Math.round(1000*Math.cos(time/5000));\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#f44336\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.6401141393938932,\"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;\"}]}]}" } diff --git a/ui-ngx/src/app/core/api/widget-api.models.ts b/ui-ngx/src/app/core/api/widget-api.models.ts index db0be6629a..aea0aa985e 100644 --- a/ui-ngx/src/app/core/api/widget-api.models.ts +++ b/ui-ngx/src/app/core/api/widget-api.models.ts @@ -68,8 +68,9 @@ export interface WidgetActionsApi { actionDescriptorsBySourceId: {[sourceId: string]: Array}; getActionDescriptors: (actionSourceId: string) => Array; handleWidgetAction: ($event: Event, descriptor: WidgetActionDescriptor, - entityId?: EntityId, entityName?: string, additionalParams?: any) => void; + entityId?: EntityId, entityName?: string, additionalParams?: any, entityLabel?: string) => void; elementClick: ($event: Event) => void; + getActiveEntityInfo: () => SubscriptionEntityInfo; } export interface AliasInfo { @@ -108,6 +109,7 @@ export interface StateObject { export interface StateParams { entityName?: string; + entityLabel?: string; targetEntityParamName?: string; entityId?: EntityId; [key: string]: any | null; @@ -211,6 +213,7 @@ export interface WidgetSubscriptionOptions { export interface SubscriptionEntityInfo { entityId: EntityId; entityName: string; + entityLabel: string; } export interface IWidgetSubscription { diff --git a/ui-ngx/src/app/core/api/widget-subscription.ts b/ui-ngx/src/app/core/api/widget-subscription.ts index 1db175872e..68a03d53b2 100644 --- a/ui-ngx/src/app/core/api/widget-subscription.ts +++ b/ui-ngx/src/app/core/api/widget-subscription.ts @@ -467,6 +467,7 @@ export class WidgetSubscription implements IWidgetSubscription { getFirstEntityInfo(): SubscriptionEntityInfo { let entityId: EntityId; let entityName: string; + let entityLabel: string; if (this.type === widgetType.rpc) { if (this.targetDeviceId) { entityId = { @@ -482,6 +483,7 @@ export class WidgetSubscription implements IWidgetSubscription { id: this.alarmSource.entityId }; entityName = this.alarmSource.entityName; + entityLabel = this.alarmSource.entityLabel; } } else { for (const datasource of this.datasources) { @@ -491,6 +493,7 @@ export class WidgetSubscription implements IWidgetSubscription { id: datasource.entityId }; entityName = datasource.entityName; + entityLabel = datasource.entityLabel; break; } } @@ -498,7 +501,8 @@ export class WidgetSubscription implements IWidgetSubscription { if (entityId) { return { entityId, - entityName + entityName, + entityLabel }; } else { return null; diff --git a/ui-ngx/src/app/modules/home/components/widget/dynamic-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/dynamic-widget.component.ts index 0d597965ea..6d5c247fb8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/dynamic-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/dynamic-widget.component.ts @@ -102,4 +102,8 @@ export class DynamicWidgetComponent extends PageComponent implements IDynamicWid })); } + widgetForceReInit() { + this.ctx.widgetForceReInit(); + } + } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/entities-table-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/entities-table-widget.component.ts index 5efae9a4c8..feb2eda26f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/entities-table-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/entities-table-widget.component.ts @@ -82,6 +82,8 @@ interface EntitiesTableWidgetSettings extends TableWidgetSettings { entitiesTitle: string; displayEntityName: boolean; entityNameColumnTitle: string; + displayEntityLabel: boolean; + entityLabelColumnTitle: string; displayEntityType: boolean; } @@ -233,12 +235,19 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni private updateDatasources() { const displayEntityName = isDefined(this.settings.displayEntityName) ? this.settings.displayEntityName : true; + const displayEntityLabel = isDefined(this.settings.displayEntityLabel) ? this.settings.displayEntityLabel : false; let entityNameColumnTitle: string; + let entityLabelColumnTitle: string; if (this.settings.entityNameColumnTitle && this.settings.entityNameColumnTitle.length) { entityNameColumnTitle = this.utils.customTranslation(this.settings.entityNameColumnTitle, this.settings.entityNameColumnTitle); } else { entityNameColumnTitle = this.translate.instant('entity.entity-name'); } + if (this.settings.entityLabelColumnTitle && this.settings.entityLabelColumnTitle.length) { + entityLabelColumnTitle = this.utils.customTranslation(this.settings.entityLabelColumnTitle, this.settings.entityLabelColumnTitle); + } else { + entityLabelColumnTitle = this.translate.instant('entity.entity-label'); + } const displayEntityType = isDefined(this.settings.displayEntityType) ? this.settings.displayEntityType : true; if (displayEntityName) { @@ -258,6 +267,23 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni }; this.columnWidth.entityName = '0px'; } + if (displayEntityLabel) { + this.columns.push( + { + name: 'entityLabel', + label: 'entityLabel', + def: 'entityLabel', + title: entityLabelColumnTitle + } as EntityColumn + ); + this.contentsInfo.entityLabel = { + useCellContentFunction: false + }; + this.stylesInfo.entityLabel = { + useCellStyleFunction: false + }; + this.columnWidth.entityLabel = '0px'; + } if (displayEntityType) { this.columns.push( { @@ -458,11 +484,13 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni if (descriptors.length) { let entityId; let entityName; + let entityLabel; if (entity) { entityId = entity.id; entityName = entity.entityName; + entityLabel = entity.entityLabel; } - this.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName); + this.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName, null, entityLabel); } } @@ -472,11 +500,13 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni } let entityId; let entityName; + let entityLabel; if (entity) { entityId = entity.id; entityName = entity.entityName; + entityLabel = entity.entityLabel; } - this.ctx.actionsApi.handleWidgetAction($event, actionDescriptor, entityId, entityName); + this.ctx.actionsApi.handleWidgetAction($event, actionDescriptor, entityId, entityName, null, entityLabel); } private defaultStyle(key: EntityColumn, value: any): any { @@ -510,7 +540,8 @@ class EntityDatasource implements DataSource { } const entity: EntityData = { id: {} as EntityId, - entityName: datasource.entityName + entityName: datasource.entityName, + entityLabel: datasource.entityLabel ? datasource.entityLabel : datasource.entityName }; if (datasource.entityId) { entity.id.id = datasource.entityId; diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts b/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts index 3e7e4c0272..c042a8f5cf 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts @@ -87,6 +87,7 @@ export class TbFlot { private mousedownHandler = this.onFlotMouseDown.bind(this); private mouseupHandler = this.onFlotMouseUp.bind(this); private mouseleaveHandler = this.onFlotMouseLeave.bind(this); + private flotClickHandler = this.onFlotClick.bind(this); private readonly animatedPie: boolean; private pieDataAnimationDuration: number; @@ -309,6 +310,9 @@ export class TbFlot { } } }; + + this.options.grid.clickable = true; + if (this.settings.stroke) { this.options.series.pie.stroke.color = this.settings.stroke.color || '#fff'; this.options.series.pie.stroke.width = this.settings.stroke.width || 0; @@ -925,6 +929,7 @@ export class TbFlot { this.$element.bind('mousedown', this.mousedownHandler); this.$element.bind('mouseup', this.mouseupHandler); this.$element.bind('mouseleave', this.mouseleaveHandler); + this.$element.bind('plotclick', this.flotClickHandler); } private disableMouseEvents() { @@ -937,6 +942,7 @@ export class TbFlot { this.$element.unbind('mousedown', this.mousedownHandler); this.$element.unbind('mouseup', this.mouseupHandler); this.$element.unbind('mouseleave', this.mouseleaveHandler); + this.$element.unbind('plotclick', this.flotClickHandler); } private onFlotHover(e: any, pos: JQueryPlotPoint, item: TbFlotPlotItem) { @@ -1038,6 +1044,13 @@ export class TbFlot { this.isMouseInteraction = false; } + private onFlotClick(e: any, pos: JQueryPlotPoint, item: TbFlotPlotItem) { + if (!this.plot) { + return; + } + this.onPieSliceClick(e, item); + } + private getHoverInfo(seriesList: TbFlotPlotDataSeries[], pos: JQueryPlotPoint): TbFlotHoverInfo[] { let i: number; let series: TbFlotPlotDataSeries; @@ -1218,4 +1231,16 @@ export class TbFlot { this.plot.draw(); } + private onPieSliceClick($event: any, item: TbFlotPlotItem) { + const descriptors = this.ctx.actionsApi.getActionDescriptors('sliceClick'); + if ($event && descriptors.length) { + $event.stopPropagation(); + const entityInfo = this.ctx.actionsApi.getActiveEntityInfo(); + const entityId = entityInfo ? entityInfo.entityId : null; + const entityName = entityInfo ? entityInfo.entityName : null; + const entityLabel = entityInfo ? entityInfo.entityLabel : null; + this.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName, item, entityLabel); + } + } + } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/table-widget.models.ts b/ui-ngx/src/app/modules/home/components/widget/lib/table-widget.models.ts index ffe75261d2..29f9e4265a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/table-widget.models.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/table-widget.models.ts @@ -41,6 +41,7 @@ export interface TableWidgetDataKeySettings { export interface EntityData { id: EntityId; entityName: string; + entityLabel?: string; entityType?: string; [key: string]: any; } 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 51cebe1998..d0bb73e3af 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 @@ -300,7 +300,8 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI entityType: datasource.entityType, id: datasource.entityId }, - entityName: datasource.entityName + entityName: datasource.entityName, + entityLabel: datasource.entityLabel }; } } @@ -421,11 +422,13 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI } let entityId; let entityName; + let entityLabel; if (this.ctx.activeEntityInfo) { entityId = this.ctx.activeEntityInfo.entityId; entityName = this.ctx.activeEntityInfo.entityName; + entityLabel = this.ctx.activeEntityInfo.entityLabel; } - this.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName, row); + this.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName, row, entityLabel); } } @@ -435,11 +438,13 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI } let entityId; let entityName; + let entityLabel; if (this.ctx.activeEntityInfo) { entityId = this.ctx.activeEntityInfo.entityId; entityName = this.ctx.activeEntityInfo.entityName; + entityLabel = this.ctx.activeEntityInfo.entityLabel; } - this.ctx.actionsApi.handleWidgetAction($event, actionDescriptor, entityId, entityName, row); + this.ctx.actionsApi.handleWidgetAction($event, actionDescriptor, entityId, entityName, row, entityLabel); } } diff --git a/ui-ngx/src/app/modules/home/components/widget/widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/widget.component.ts index b889a5bfba..95a77c2029 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget.component.ts @@ -263,6 +263,7 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI this.widgetContext.servicesMap = ServicesMap; this.widgetContext.isEdit = this.isEdit; this.widgetContext.isMobile = this.isMobile; + this.widgetContext.widgetForceReInit = this.reInit.bind(this); this.widgetContext.subscriptionApi = { createSubscription: this.createSubscription.bind(this), @@ -280,7 +281,8 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI actionDescriptorsBySourceId, getActionDescriptors: this.getActionDescriptors.bind(this), handleWidgetAction: this.handleWidgetAction.bind(this), - elementClick: this.elementClick.bind(this) + elementClick: this.elementClick.bind(this), + getActiveEntityInfo: this.getActiveEntityInfo.bind(this) }; this.widgetContext.customHeaderActions = []; @@ -295,7 +297,8 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI const entityInfo = this.getActiveEntityInfo(); const entityId = entityInfo ? entityInfo.entityId : null; const entityName = entityInfo ? entityInfo.entityName : null; - this.handleWidgetAction($event, descriptor, entityId, entityName); + const entityLabel = entityInfo ? entityInfo.entityLabel : null; + this.handleWidgetAction($event, descriptor, entityId, entityName, null, entityLabel); } }; this.widgetContext.customHeaderActions.push(headerAction); @@ -958,7 +961,7 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI } private handleWidgetAction($event: Event, descriptor: WidgetActionDescriptor, - entityId?: EntityId, entityName?: string, additionalParams?: any): void { + entityId?: EntityId, entityName?: string, additionalParams?: any, entityLabel?: string): void { const type = descriptor.type; const targetEntityParamName = descriptor.stateEntityParamName; let targetEntityId: EntityId; @@ -970,7 +973,7 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI case WidgetActionType.updateDashboardState: let targetDashboardStateId = descriptor.targetDashboardStateId; const params = deepClone(this.widgetContext.stateController.getStateParams()); - this.updateEntityParams(params, targetEntityParamName, targetEntityId, entityName); + this.updateEntityParams(params, targetEntityParamName, targetEntityId, entityName, entityLabel); if (type === WidgetActionType.openDashboardState) { this.widgetContext.stateController.openState(targetDashboardStateId, params, descriptor.openRightLayout); } else { @@ -982,7 +985,7 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI targetDashboardStateId = descriptor.targetDashboardStateId; const stateObject: StateObject = {}; stateObject.params = {}; - this.updateEntityParams(stateObject.params, targetEntityParamName, targetEntityId, entityName); + this.updateEntityParams(stateObject.params, targetEntityParamName, targetEntityId, entityName, entityLabel); if (targetDashboardStateId) { stateObject.id = targetDashboardStateId; } @@ -1055,14 +1058,16 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI const entityInfo = this.getActiveEntityInfo(); const entityId = entityInfo ? entityInfo.entityId : null; const entityName = entityInfo ? entityInfo.entityName : null; - this.handleWidgetAction(event, descriptor, entityId, entityName); + const entityLabel = entityInfo && entityInfo.entityLabel ? entityInfo.entityLabel : null; + this.handleWidgetAction(event, descriptor, entityId, entityName, null, entityLabel); } }); } } } - private updateEntityParams(params: StateParams, targetEntityParamName?: string, targetEntityId?: EntityId, entityName?: string) { + private updateEntityParams(params: StateParams, targetEntityParamName?: string, targetEntityId?: EntityId, + entityName?: string, entityLabel?: string) { if (targetEntityId) { let targetEntityParams: StateParams; if (targetEntityParamName && targetEntityParamName.length) { @@ -1079,6 +1084,9 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI if (entityName) { targetEntityParams.entityName = entityName; } + if (entityLabel) { + targetEntityParams.entityLabel = entityLabel; + } } } diff --git a/ui-ngx/src/app/modules/home/models/widget-component.models.ts b/ui-ngx/src/app/modules/home/models/widget-component.models.ts index 4ea7b8e480..f76a6da9dc 100644 --- a/ui-ngx/src/app/modules/home/models/widget-component.models.ts +++ b/ui-ngx/src/app/modules/home/models/widget-component.models.ts @@ -161,6 +161,8 @@ export class WidgetContext { isEdit: boolean; isMobile: boolean; + widgetForceReInit?: () => void; + widgetNamespace?: string; subscriptionApi?: WidgetSubscriptionApi; @@ -225,6 +227,7 @@ export interface IDynamicWidgetComponent { rpcErrorText: string; rpcRejection: HttpErrorResponse; raf: RafService; + widgetForceReInit(): void; [key: string]: any; } diff --git a/ui-ngx/src/app/modules/home/pages/dashboard/states/entity-state-controller.component.ts b/ui-ngx/src/app/modules/home/pages/dashboard/states/entity-state-controller.component.ts index 5bf28a0628..a975371b10 100644 --- a/ui-ngx/src/app/modules/home/pages/dashboard/states/entity-state-controller.component.ts +++ b/ui-ngx/src/app/modules/home/pages/dashboard/states/entity-state-controller.component.ts @@ -27,7 +27,7 @@ import { base64toObj, objToBase64 } from '@app/core/utils'; import { DashboardUtilsService } from '@core/services/dashboard-utils.service'; import { EntityService } from '@core/http/entity.service'; import { EntityType } from '@shared/models/entity-type.models'; -import { map } from 'rxjs/operators'; +import { map, tap } from 'rxjs/operators'; @Component({ selector: 'tb-entity-state-controller', @@ -103,8 +103,7 @@ export class EntityStateControllerComponent extends StateControllerComponent imp public openState(id: string, params?: StateParams, openRightLayout?: boolean): void { if (this.states && this.states[id]) { this.resolveEntity(params).subscribe( - (entityName) => { - params.entityName = entityName; + () => { const newState: StateObject = { id, params @@ -123,8 +122,7 @@ export class EntityStateControllerComponent extends StateControllerComponent imp } if (this.states && this.states[id]) { this.resolveEntity(params).subscribe( - (entityName) => { - params.entityName = entityName; + () => { const newState: StateObject = { id, params @@ -199,12 +197,18 @@ export class EntityStateControllerComponent extends StateControllerComponent imp let stateName = this.states[this.stateObject[index].id].name; stateName = this.utils.customTranslation(stateName, stateName); const params = this.stateObject[index].params; - const entityName = params && params.entityName ? params.entityName : ''; + const targetParams = params && params.targetEntityParamName ? params[params.targetEntityParamName] : params; + const entityName = targetParams && targetParams.entityName ? targetParams.entityName : ''; + const entityLabel = targetParams && targetParams.entityLabel ? targetParams.entityLabel : ''; result = this.utils.insertVariable(stateName, 'entityName', entityName); + result = this.utils.insertVariable(stateName, 'entityLabel', entityLabel); for (const prop of Object.keys(params)) { if (params[prop] && params[prop].entityName) { result = this.utils.insertVariable(result, prop + ':entityName', params[prop].entityName); } + if (params[prop] && params[prop].entityLabel) { + result = this.utils.insertVariable(result, prop + ':entityLabel', params[prop].entityLabel); + } } } return result; @@ -282,24 +286,35 @@ export class EntityStateControllerComponent extends StateControllerComponent imp return true; } - private resolveEntity(params: StateParams): Observable { + private resolveEntity(params: StateParams): Observable { if (params && params.targetEntityParamName) { params = params[params.targetEntityParamName]; } if (params && params.entityId && params.entityId.id && params.entityId.entityType) { - if (params.entityName && params.entityName.length) { - return of(params.entityName); + if (this.isEntityResolved(params)) { + return of(null); } else { return this.entityService.getEntity(params.entityId.entityType as EntityType, params.entityId.id, {ignoreLoading: true, ignoreErrors: true}).pipe( - map((entity) => entity.name) + tap((entity) => { + params.entityName = entity.name; + params.entityLabel = entity.label; + }), + map(() => null) ); } } else { - return of(''); + return of(null); } } + private isEntityResolved(params: StateParams): boolean { + if (!params.entityName || !params.entityName.length) { + return false; + } + return true; + } + private getStateObjById(id: string): StateObject { return this.stateObject.find((stateObj) => stateObj.id === id); } diff --git a/ui-ngx/src/app/shared/models/base-data.ts b/ui-ngx/src/app/shared/models/base-data.ts index e89db8503e..8fb76e1584 100644 --- a/ui-ngx/src/app/shared/models/base-data.ts +++ b/ui-ngx/src/app/shared/models/base-data.ts @@ -23,4 +23,5 @@ export interface BaseData { createdTime?: number; id?: T; name?: string; + label?: string; }