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 e9ef5cb404..120bd4e7f2 100644 --- a/ui-ngx/src/app/core/services/dashboard-utils.service.ts +++ b/ui-ngx/src/app/core/services/dashboard-utils.service.ts @@ -58,7 +58,7 @@ import { WidgetConfigMode, WidgetSize, widgetType, - WidgetTypeDescriptor, widgetTypeHasTimewindow + WidgetTypeDescriptor } from '@app/shared/models/widget.models'; import { EntityType } from '@shared/models/entity-type.models'; import { AliasFilterType, EntityAlias, EntityAliasFilter } from '@app/shared/models/alias.models'; @@ -71,7 +71,11 @@ import { MediaBreakpoints } from '@shared/models/constants'; import { TranslateService } from '@ngx-translate/core'; import { DashboardPageLayout } from '@home/components/dashboard-page/dashboard-page.models'; import { maxGridsterCol, maxGridsterRow } from '@home/models/dashboard-component.models'; -import { findWidgetModelDefinition, widgetHasTimewindow } from '@shared/models/widget/widget-model.definition'; +import { + findWidgetModelDefinition, + widgetHasTimewindow, + WidgetModelDefinition +} from '@shared/models/widget/widget-model.definition'; @Injectable({ providedIn: 'root' @@ -243,7 +247,12 @@ export class DashboardUtilsService { } public validateAndUpdateWidget(widget: Widget): Widget { - widget.config = this.validateAndUpdateWidgetConfig(widget.config, widget.type); + const widgetDefinition = widget.config ? findWidgetModelDefinition(widget) : null; + if (widgetDefinition) { + widget.config = this.validateAndUpdateWidgetConfigWithModelDefinition(widget, widgetDefinition); + } else { + widget.config = this.validateAndUpdateWidgetConfig(widget.config, widget.type); + } widget = this.validateAndUpdateWidgetTypeFqn(widget); this.removeTimewindowConfigIfUnused(widget); if (isDefined((widget as any).title)) { @@ -363,6 +372,15 @@ export class DashboardUtilsService { return deepClean(widgetConfig, {cleanKeys: ['_hash'], cleanOnlyKey: true}); } + public validateAndUpdateWidgetConfigWithModelDefinition(widget: Widget, widgetDefinition: WidgetModelDefinition): WidgetConfig { + const widgetConfig = widget.config; + if (widget.type === widgetType.latest && widgetDefinition.hasTimewindow(widget)) { + widgetConfig.timewindow = initModelFromDefaultTimewindow(widgetConfig.timewindow, true, + widgetDefinition.datasourcesHasOnlyComparisonAggregation(widget), this.timeService, false); + } + return deepClean(widgetConfig, {cleanKeys: ['_hash'], cleanOnlyKey: true}); + } + private removeTimewindowConfigIfUnused(widget: Widget) { const hasTimewindow = widgetHasTimewindow(widget); if (!hasTimewindow || widget.config.useDashboardTimewindow) { diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.ts index a1130b4ae5..aea2f83998 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/map/map-basic-config.component.ts @@ -24,16 +24,12 @@ import { WidgetConfigComponentData } from '@home/models/widget-component.models' import { isDefinedAndNotNull, isUndefined, mergeDeepIgnoreArray } from '@core/utils'; import { mapWidgetDefaultSettings, MapWidgetSettings } from '@home/components/widget/lib/maps/map-widget.models'; import { cssSizeToStrSize, resolveCssSize } from '@shared/models/widget-settings.models'; -import { - datasourcesHasOnlyComparisonAggregation, - WidgetConfig, - widgetTitleAutocompleteValues -} from '@shared/models/widget.models'; +import { WidgetConfig, widgetTitleAutocompleteValues } from '@shared/models/widget.models'; import { getTimewindowConfig, setTimewindowConfig } from '@home/components/widget/config/timewindow-config-panel.component'; -import { findWidgetModelDefinition } from '@shared/models/widget/widget-model.definition'; +import { MapModelDefinition } from '@shared/models/widget/maps/map-model.definition'; @Component({ selector: 'tb-map-basic-config', @@ -92,6 +88,8 @@ export class MapBasicConfigComponent extends BasicWidgetConfigComponent { this.mapWidgetConfigForm = this.fb.group({ mapSettings: [settings, []], + timewindowConfig: [getTimewindowConfig(configData.config), []], + showTitle: [configData.config.showTitle, []], title: [configData.config.title, []], titleFont: [configData.config.titleFont, []], @@ -111,7 +109,6 @@ export class MapBasicConfigComponent extends BasicWidgetConfigComponent { actions: [configData.config.actions || {}, []] }); - this.mapWidgetConfigForm.addControl('timewindowConfig', this.fb.control(getTimewindowConfig(configData.config))); } protected prepareOutputConfig(config: any): WidgetConfigComponentData { @@ -191,12 +188,7 @@ export class MapBasicConfigComponent extends BasicWidgetConfigComponent { if (this.trip) { return true; } else { - const widgetDefinition = findWidgetModelDefinition(this.widget); - if (widgetDefinition) { - return widgetDefinition.hasTimewindow(this.widget); - } else { - return false; - } + return this.widget ? MapModelDefinition.hasTimewindow(this.widget) : false; } } @@ -204,12 +196,7 @@ export class MapBasicConfigComponent extends BasicWidgetConfigComponent { if (this.trip) { return false; } else { - const widgetDefinition = findWidgetModelDefinition(this.widget); - if (widgetDefinition) { - return widgetDefinition.datasourcesHasOnlyComparisonAggregation(this.widget); - } else { - return false; - } + return this.widget ? MapModelDefinition.datasourcesHasOnlyComparisonAggregation(this.widget) : false; } } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/maps/map.ts b/ui-ngx/src/app/modules/home/components/widget/lib/maps/map.ts index 5a37643fe4..3bca0e40a2 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/maps/map.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/maps/map.ts @@ -342,8 +342,7 @@ export abstract class TbMap { const dataLayersSubscriptionOptions: WidgetSubscriptionOptions = { datasources, hasDataPageLink: true, - useDashboardTimewindow: isDefined(this.ctx.widgetConfig.useDashboardTimewindow) - ? this.ctx.widgetConfig.useDashboardTimewindow : true, + useDashboardTimewindow: this.ctx.widgetConfig.useDashboardTimewindow ?? true, type: widgetType.latest, callbacks: { onDataUpdated: (subscription) => {