diff --git a/ui-ngx/src/app/core/api/entity-data-subscription.ts b/ui-ngx/src/app/core/api/entity-data-subscription.ts index a0135fe434..d700672d53 100644 --- a/ui-ngx/src/app/core/api/entity-data-subscription.ts +++ b/ui-ngx/src/app/core/api/entity-data-subscription.ts @@ -136,9 +136,6 @@ export class EntityDataSubscription { public addListener(listener: EntityDataListener) { this.listeners.push(listener); - if (this.history) { - this.start(); - } } public hasListeners(): boolean { @@ -172,6 +169,7 @@ export class EntityDataSubscription { } listener.dataLoaded(this.pageData, data, listener.configDatasourceIndex); } + this.listeners.push(listener); } public unsubscribe() { @@ -195,9 +193,6 @@ export class EntityDataSubscription { } public start() { - if (this.history && !this.hasListeners()) { - return; - } this.subsTw = this.entityDataSubscriptionOptions.subscriptionTimewindow; if (this.datasourceType === DatasourceType.entity) { const entityFields: Array = @@ -350,16 +345,18 @@ export class EntityDataSubscription { this.dataAggregators = []; this.entityIdToDataIndex = {}; let tsKeyNames; - if (this.datasourceType === DatasourceType.function) { - tsKeyNames = []; - for (const key of Object.keys(this.dataKeys)) { - const dataKeysList = this.dataKeys[key] as Array; - dataKeysList.forEach((subscriptionDataKey) => { - tsKeyNames.push(`${subscriptionDataKey.name}_${subscriptionDataKey.index}`); - }); + if (this.entityDataSubscriptionOptions.type === widgetType.timeseries) { + if (this.datasourceType === DatasourceType.function) { + tsKeyNames = []; + for (const key of Object.keys(this.dataKeys)) { + const dataKeysList = this.dataKeys[key] as Array; + dataKeysList.forEach((subscriptionDataKey) => { + tsKeyNames.push(`${subscriptionDataKey.name}_${subscriptionDataKey.index}`); + }); + } + } else { + tsKeyNames = this.tsFields ? this.tsFields.map(field => field.key) : []; } - } else { - tsKeyNames = this.tsFields.map(field => field.key); } for (let dataIndex = 0; dataIndex < pageData.data.length; dataIndex++) { const entityData = pageData.data[dataIndex]; @@ -405,6 +402,8 @@ export class EntityDataSubscription { ); } + this.pageData = pageData; + this.listeners.forEach((listener) => { listener.dataLoaded(pageData, data, listener.configDatasourceIndex); @@ -505,7 +504,7 @@ export class EntityDataSubscription { update = true; } if (update) { - this.datasourceData[datasourceKey].data = data; + this.datasourceData[dataIndex][datasourceKey].data = data; dataUpdatedCb(this.datasourceData[dataIndex][datasourceKey], dataIndex, dataKey.index, detectChanges); } } diff --git a/ui-ngx/src/app/core/api/entity-data.service.ts b/ui-ngx/src/app/core/api/entity-data.service.ts index b562b3f5cf..b17e5f7b82 100644 --- a/ui-ngx/src/app/core/api/entity-data.service.ts +++ b/ui-ngx/src/app/core/api/entity-data.service.ts @@ -86,9 +86,9 @@ export class EntityDataService { subscription = new EntityDataSubscription(entityDataSubscriptionOptions, this.telemetryService, this.utils); this.subscriptions[listener.entityDataSubscriptionKey] = subscription; + subscription.addListener(listener); subscription.start(); } - subscription.addListener(listener); } public unsubscribeFromDatasource(listener: EntityDataListener) { 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 74e0716669..5ab06505b7 100644 --- a/ui-ngx/src/app/core/api/widget-api.models.ts +++ b/ui-ngx/src/app/core/api/widget-api.models.ts @@ -264,7 +264,7 @@ export interface IWidgetSubscription { onAliasesChanged(aliasIds: Array): boolean; - onDashboardTimewindowChanged(dashboardTimewindow: Timewindow): void; + onDashboardTimewindowChanged(dashboardTimewindow: Timewindow): boolean; updateDataVisibility(index: number): void; diff --git a/ui-ngx/src/app/core/api/widget-subscription.ts b/ui-ngx/src/app/core/api/widget-subscription.ts index 1cbafd6483..924f161d8f 100644 --- a/ui-ngx/src/app/core/api/widget-subscription.ts +++ b/ui-ngx/src/app/core/api/widget-subscription.ts @@ -78,6 +78,7 @@ export class WidgetSubscription implements IWidgetSubscription { entityDataListeners: Array; configuredDatasources: Array; + initDataSubscriptionSubject: Subject; data: Array; datasources: Array; // datasourceListeners: Array; @@ -135,6 +136,8 @@ export class WidgetSubscription implements IWidgetSubscription { targetDeviceName: string; executingSubjects: Array>; + subscribed = false; + constructor(subscriptionContext: WidgetSubscriptionContext, public options: WidgetSubscriptionOptions) { const subscriptionSubject = new ReplaySubject(); this.init$ = subscriptionSubject.asObservable(); @@ -345,32 +348,34 @@ export class WidgetSubscription implements IWidgetSubscription { } private initDataSubscription(): Observable { - const initDataSubscriptionSubject = new ReplaySubject(1); + this.initDataSubscriptionSubject = new ReplaySubject(1); this.loadStDiff().subscribe(() => { if (!this.ctx.aliasController) { this.hasResolvedData = true; // this.configureData(); - initDataSubscriptionSubject.next(); - initDataSubscriptionSubject.complete(); + // initDataSubscriptionSubject.next(); + // initDataSubscriptionSubject.complete(); + this.subscribe(); } else { this.ctx.aliasController.resolveDatasources(this.configuredDatasources).subscribe( (datasources) => { this.configuredDatasources = datasources; - if (datasources && datasources.length) { + /* if (datasources && datasources.length) { this.hasResolvedData = true; - } + }*/ + this.subscribe(); // this.configureData(); - initDataSubscriptionSubject.next(); - initDataSubscriptionSubject.complete(); + // initDataSubscriptionSubject.next(); + // initDataSubscriptionSubject.complete(); }, (err) => { this.notifyDataLoaded(); - initDataSubscriptionSubject.error(err); + this.initDataSubscriptionSubject.error(err); } ); } }); - return initDataSubscriptionSubject.asObservable(); + return this.initDataSubscriptionSubject.asObservable(); } /* private initDataSubscriptionOld(): Observable { @@ -587,15 +592,18 @@ export class WidgetSubscription implements IWidgetSubscription { }); } - onDashboardTimewindowChanged(newDashboardTimewindow: Timewindow): void { + onDashboardTimewindowChanged(newDashboardTimewindow: Timewindow): boolean { if (this.type === widgetType.timeseries || this.type === widgetType.alarm) { if (this.useDashboardTimewindow) { if (!isEqual(this.timeWindowConfig, newDashboardTimewindow) && newDashboardTimewindow) { - this.timeWindowConfig = deepClone(newDashboardTimewindow); - this.update(); + // this.timeWindowConfig = deepClone(newDashboardTimewindow); + // this.update(); + // TODO: + return true; } } } + return false; } private onAlarmSearchStatusChanged() { @@ -782,13 +790,16 @@ export class WidgetSubscription implements IWidgetSubscription { } subscribe(): void { - if (this.cafs.subscribe) { - this.cafs.subscribe(); - this.cafs.subscribe = null; + if (!this.subscribed) { + this.subscribed = true; + if (this.cafs.subscribe) { + this.cafs.subscribe(); + this.cafs.subscribe = null; + } + this.cafs.subscribe = this.ctx.raf.raf(() => { + this.doSubscribe(); + }); } - this.cafs.subscribe = this.ctx.raf.raf(() => { - this.doSubscribe(); - }); } private doSubscribe() { @@ -995,6 +1006,7 @@ export class WidgetSubscription implements IWidgetSubscription { this.resetData(); } } + this.subscribed = false; } /* unsubscribeOld() { @@ -1119,6 +1131,7 @@ export class WidgetSubscription implements IWidgetSubscription { private dataLoaded(pageData: PageData, data: Array>, datasourceIndex: number) { const datasource = this.configuredDatasources[datasourceIndex]; + datasource.dataReceived = true; const datasources = pageData.data.map((entityData, index) => this.entityDataToDatasource(datasource, entityData, index) ); @@ -1140,7 +1153,15 @@ export class WidgetSubscription implements IWidgetSubscription { }; this.dataPages[datasourceIndex] = datasourceDataPage; this.configureLoadedData(); - this.notifyDataLoaded(); + const readyCount = this.configuredDatasources.filter(d => d.dataReceived).length; + if (this.configuredDatasources.length === readyCount) { + this.hasResolvedData = true; + this.initDataSubscriptionSubject.next(); + this.initDataSubscriptionSubject.complete(); + this.configureLoadedData(); + this.notifyDataLoaded(); + this.onDataUpdated(true); + } } private configureLoadedData() { @@ -1204,7 +1225,6 @@ export class WidgetSubscription implements IWidgetSubscription { }); this.callbacks.legendDataUpdated(this, true); } - this.onDataUpdated(true); } private entityDataToDatasourceData(datasource: Datasource, data: Array): Array { @@ -1224,7 +1244,6 @@ export class WidgetSubscription implements IWidgetSubscription { private entityDataToDatasource(configDatasource: Datasource, entityData: EntityData, index: number): Datasource { const newDatasource = deepClone(configDatasource); - newDatasource.dataReceived = true; newDatasource.entity = {}; newDatasource.entityId = entityData.entityId.id; newDatasource.entityType = entityData.entityId.entityType as EntityType; 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 6cc72505a5..1091b4c550 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 @@ -87,7 +87,6 @@ import { Timewindow } from '@shared/models/time/time.models'; import { AlarmSearchStatus } from '@shared/models/alarm.models'; import { CancelAnimationFrame, RafService } from '@core/services/raf.service'; import { DashboardService } from '@core/http/dashboard.service'; -import { DatasourceService } from '@core/api/datasource.service'; import { WidgetSubscription } from '@core/api/widget-subscription'; import { EntityService } from '@core/http/entity.service'; import { ServicesMap } from '@home/models/services.map'; @@ -621,9 +620,14 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI this.rxSubscriptions.push(this.widgetContext.dashboard.dashboardTimewindowChanged.subscribe( (dashboardTimewindow) => { + // TODO: + let subscriptionChanged = false; for (const id of Object.keys(this.widgetContext.subscriptions)) { const subscription = this.widgetContext.subscriptions[id]; - subscription.onDashboardTimewindowChanged(dashboardTimewindow); + subscriptionChanged = subscriptionChanged || subscription.onDashboardTimewindowChanged(dashboardTimewindow); + } + if (subscriptionChanged && !this.typeParameters.useCustomDatasources) { + this.reInit(); } } ));