Commit 6e8f6fd7014668f8e327f02b976e203aa37c06c5

Authored by Igor Kulikov
Committed by GitHub
2 parents d8a10ccd 40252c99

Merge pull request #4958 from ChantsovaEkaterina/feature/charts-comparison-custom-interval

[3.3.1] UI: add custom interval option to charts comparison
@@ -243,6 +243,7 @@ export interface WidgetSubscriptionOptions { @@ -243,6 +243,7 @@ export interface WidgetSubscriptionOptions {
243 legendConfig?: LegendConfig; 243 legendConfig?: LegendConfig;
244 comparisonEnabled?: boolean; 244 comparisonEnabled?: boolean;
245 timeForComparison?: moment_.unitOfTime.DurationConstructor; 245 timeForComparison?: moment_.unitOfTime.DurationConstructor;
  246 + comparisonCustomIntervalValue?: number;
246 decimals?: number; 247 decimals?: number;
247 units?: string; 248 units?: string;
248 callbacks?: WidgetSubscriptionCallbacks; 249 callbacks?: WidgetSubscriptionCallbacks;
@@ -110,6 +110,7 @@ export class WidgetSubscription implements IWidgetSubscription { @@ -110,6 +110,7 @@ export class WidgetSubscription implements IWidgetSubscription {
110 units: string; 110 units: string;
111 comparisonEnabled: boolean; 111 comparisonEnabled: boolean;
112 timeForComparison: ComparisonDuration; 112 timeForComparison: ComparisonDuration;
  113 + comparisonCustomIntervalValue: number;
113 comparisonTimeWindow: WidgetTimewindow; 114 comparisonTimeWindow: WidgetTimewindow;
114 timewindowForComparison: SubscriptionTimewindow; 115 timewindowForComparison: SubscriptionTimewindow;
115 116
@@ -234,6 +235,7 @@ export class WidgetSubscription implements IWidgetSubscription { @@ -234,6 +235,7 @@ export class WidgetSubscription implements IWidgetSubscription {
234 this.comparisonEnabled = options.comparisonEnabled && isHistoryTypeTimewindow(this.timeWindowConfig); 235 this.comparisonEnabled = options.comparisonEnabled && isHistoryTypeTimewindow(this.timeWindowConfig);
235 if (this.comparisonEnabled) { 236 if (this.comparisonEnabled) {
236 this.timeForComparison = options.timeForComparison; 237 this.timeForComparison = options.timeForComparison;
  238 + this.comparisonCustomIntervalValue = options.comparisonCustomIntervalValue;
237 239
238 this.comparisonTimeWindow = {}; 240 this.comparisonTimeWindow = {};
239 this.timewindowForComparison = null; 241 this.timewindowForComparison = null;
@@ -1183,7 +1185,8 @@ export class WidgetSubscription implements IWidgetSubscription { @@ -1183,7 +1185,8 @@ export class WidgetSubscription implements IWidgetSubscription {
1183 } 1185 }
1184 1186
1185 private updateSubscriptionForComparison(): SubscriptionTimewindow { 1187 private updateSubscriptionForComparison(): SubscriptionTimewindow {
1186 - this.timewindowForComparison = createTimewindowForComparison(this.subscriptionTimewindow, this.timeForComparison); 1188 + this.timewindowForComparison = createTimewindowForComparison(this.subscriptionTimewindow, this.timeForComparison,
  1189 + this.comparisonCustomIntervalValue);
1187 this.updateComparisonTimewindow(); 1190 this.updateComparisonTimewindow();
1188 return this.timewindowForComparison; 1191 return this.timewindowForComparison;
1189 } 1192 }
@@ -145,6 +145,7 @@ export interface TbFlotComparisonSettings { @@ -145,6 +145,7 @@ export interface TbFlotComparisonSettings {
145 comparisonEnabled: boolean; 145 comparisonEnabled: boolean;
146 timeForComparison: ComparisonDuration; 146 timeForComparison: ComparisonDuration;
147 xaxisSecond: TbFlotSecondXAxisSettings; 147 xaxisSecond: TbFlotSecondXAxisSettings;
  148 + comparisonCustomIntervalValue?: number;
148 } 149 }
149 150
150 export interface TbFlotThresholdsSettings { 151 export interface TbFlotThresholdsSettings {
@@ -546,6 +547,11 @@ const chartSettingsSchemaForComparison: JsonSettingsSchema = { @@ -546,6 +547,11 @@ const chartSettingsSchemaForComparison: JsonSettingsSchema = {
546 type: 'string', 547 type: 'string',
547 default: 'previousInterval' 548 default: 'previousInterval'
548 }, 549 },
  550 + comparisonCustomIntervalValue: {
  551 + title: 'Custom interval value (ms)',
  552 + type: 'number',
  553 + default: 7200000
  554 + },
549 xaxisSecond: { 555 xaxisSecond: {
550 title: 'Second X axis', 556 title: 'Second X axis',
551 type: 'object', 557 type: 'object',
@@ -596,10 +602,18 @@ const chartSettingsSchemaForComparison: JsonSettingsSchema = { @@ -596,10 +602,18 @@ const chartSettingsSchemaForComparison: JsonSettingsSchema = {
596 { 602 {
597 value: 'years', 603 value: 'years',
598 label: 'Year ago' 604 label: 'Year ago'
  605 + },
  606 + {
  607 + value: 'customInterval',
  608 + label: 'Custom interval'
599 } 609 }
600 ] 610 ]
601 }, 611 },
602 { 612 {
  613 + key: 'comparisonCustomIntervalValue',
  614 + condition: 'model.timeForComparison === "customInterval"'
  615 + },
  616 + {
603 key: 'xaxisSecond', 617 key: 'xaxisSecond',
604 items: [ 618 items: [
605 { 619 {
@@ -908,7 +908,8 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI @@ -908,7 +908,8 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI
908 warnOnPageDataOverflow: this.typeParameters.warnOnPageDataOverflow, 908 warnOnPageDataOverflow: this.typeParameters.warnOnPageDataOverflow,
909 ignoreDataUpdateOnIntervalTick: this.typeParameters.ignoreDataUpdateOnIntervalTick, 909 ignoreDataUpdateOnIntervalTick: this.typeParameters.ignoreDataUpdateOnIntervalTick,
910 comparisonEnabled: comparisonSettings.comparisonEnabled, 910 comparisonEnabled: comparisonSettings.comparisonEnabled,
911 - timeForComparison: comparisonSettings.timeForComparison 911 + timeForComparison: comparisonSettings.timeForComparison,
  912 + comparisonCustomIntervalValue: comparisonSettings.comparisonCustomIntervalValue
912 }; 913 };
913 if (this.widget.type === widgetType.alarm) { 914 if (this.widget.type === widgetType.alarm) {
914 options.alarmSource = deepClone(this.widget.config.alarmSource); 915 options.alarmSource = deepClone(this.widget.config.alarmSource);
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 /// 15 ///
16 16
17 import { TimeService } from '@core/services/time.service'; 17 import { TimeService } from '@core/services/time.service';
18 -import { deepClone, isDefined, isUndefined } from '@app/core/utils'; 18 +import { deepClone, isDefined, isNumeric, isUndefined } from '@app/core/utils';
19 import * as moment_ from 'moment'; 19 import * as moment_ from 'moment';
20 import * as momentTz from 'moment-timezone'; 20 import * as momentTz from 'moment-timezone';
21 21
@@ -28,7 +28,7 @@ export const DAY = 24 * HOUR; @@ -28,7 +28,7 @@ export const DAY = 24 * HOUR;
28 export const WEEK = 7 * DAY; 28 export const WEEK = 7 * DAY;
29 export const YEAR = DAY * 365; 29 export const YEAR = DAY * 365;
30 30
31 -export type ComparisonDuration = moment_.unitOfTime.DurationConstructor | 'previousInterval'; 31 +export type ComparisonDuration = moment_.unitOfTime.DurationConstructor | 'previousInterval' | 'customInterval';
32 32
33 export enum TimewindowType { 33 export enum TimewindowType {
34 REALTIME, 34 REALTIME,
@@ -640,7 +640,7 @@ export function calculateIntervalComparisonEndTime(interval: QuickTimeInterval, @@ -640,7 +640,7 @@ export function calculateIntervalComparisonEndTime(interval: QuickTimeInterval,
640 } 640 }
641 641
642 export function createTimewindowForComparison(subscriptionTimewindow: SubscriptionTimewindow, 642 export function createTimewindowForComparison(subscriptionTimewindow: SubscriptionTimewindow,
643 - timeUnit: ComparisonDuration): SubscriptionTimewindow { 643 + timeUnit: ComparisonDuration, customIntervalValue: number): SubscriptionTimewindow {
644 const timewindowForComparison: SubscriptionTimewindow = { 644 const timewindowForComparison: SubscriptionTimewindow = {
645 fixedWindow: null, 645 fixedWindow: null,
646 realtimeWindowMs: null, 646 realtimeWindowMs: null,
@@ -667,6 +667,15 @@ export function createTimewindowForComparison(subscriptionTimewindow: Subscripti @@ -667,6 +667,15 @@ export function createTimewindowForComparison(subscriptionTimewindow: Subscripti
667 endTimeMs = subscriptionTimewindow.fixedWindow.startTimeMs; 667 endTimeMs = subscriptionTimewindow.fixedWindow.startTimeMs;
668 startTimeMs = endTimeMs - timeInterval; 668 startTimeMs = endTimeMs - timeInterval;
669 } 669 }
  670 + } else if (timeUnit === 'customInterval') {
  671 + if (isNumeric(customIntervalValue) && isFinite(customIntervalValue) && customIntervalValue > 0) {
  672 + const timeInterval = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs;
  673 + endTimeMs = subscriptionTimewindow.fixedWindow.endTimeMs - Math.round(customIntervalValue);
  674 + startTimeMs = endTimeMs - timeInterval;
  675 + } else {
  676 + endTimeMs = subscriptionTimewindow.fixedWindow.endTimeMs;
  677 + startTimeMs = subscriptionTimewindow.fixedWindow.startTimeMs;
  678 + }
670 } else { 679 } else {
671 const timeInterval = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs; 680 const timeInterval = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs;
672 endTimeMs = moment(subscriptionTimewindow.fixedWindow.endTimeMs).subtract(1, timeUnit).valueOf(); 681 endTimeMs = moment(subscriptionTimewindow.fixedWindow.endTimeMs).subtract(1, timeUnit).valueOf();
@@ -467,6 +467,7 @@ export interface WidgetActionDescriptor extends CustomActionDescriptor { @@ -467,6 +467,7 @@ export interface WidgetActionDescriptor extends CustomActionDescriptor {
467 export interface WidgetComparisonSettings { 467 export interface WidgetComparisonSettings {
468 comparisonEnabled?: boolean; 468 comparisonEnabled?: boolean;
469 timeForComparison?: moment_.unitOfTime.DurationConstructor; 469 timeForComparison?: moment_.unitOfTime.DurationConstructor;
  470 + comparisonCustomIntervalValue?: number;
470 } 471 }
471 472
472 export interface WidgetConfig { 473 export interface WidgetConfig {
@@ -2263,6 +2263,7 @@ @@ -2263,6 +2263,7 @@
2263 "total": "total", 2263 "total": "total",
2264 "comparison-time-ago": { 2264 "comparison-time-ago": {
2265 "previousInterval": "(previous interval)", 2265 "previousInterval": "(previous interval)",
  2266 + "customInterval": "(custom interval)",
2266 "days": "(day ago)", 2267 "days": "(day ago)",
2267 "weeks": "(week ago)", 2268 "weeks": "(week ago)",
2268 "months": "(month ago)", 2269 "months": "(month ago)",