diff --git a/ui-ngx/src/app/core/api/data-aggregator.ts b/ui-ngx/src/app/core/api/data-aggregator.ts index a57ad25d93..e0ebb3cbc1 100644 --- a/ui-ngx/src/app/core/api/data-aggregator.ts +++ b/ui-ngx/src/app/core/api/data-aggregator.ts @@ -15,7 +15,12 @@ /// import { SubscriptionData, SubscriptionDataHolder } from '@app/shared/models/telemetry/telemetry.models'; -import { AggregationType } from '@shared/models/time/time.models'; +import { + AggregationType, + calculateIntervalEndTime, + calculateIntervalStartTime, + QuickTimeInterval +} from '@shared/models/time/time.models'; import { UtilsService } from '@core/services/utils.service'; import { deepClone } from '@core/utils'; import Timeout = NodeJS.Timeout; @@ -92,7 +97,8 @@ export class DataAggregator { private interval: number, private stateData: boolean, private utils: UtilsService, - private ignoreDataUpdateOnIntervalTick: boolean) { + private ignoreDataUpdateOnIntervalTick: boolean, + private quickInterval: QuickTimeInterval) { this.tsKeyNames.forEach((key) => { this.dataBuffer[key] = []; }); @@ -138,7 +144,8 @@ export class DataAggregator { this.startTs = startTs; this.timeWindow = timeWindow; this.interval = interval; - this.endTs = this.startTs + this.timeWindow; + const endTs = this.startTs + this.timeWindow; + this.endTs = calculateIntervalEndTime(this.quickInterval, endTs); this.elapsed = 0; this.aggregationTimeout = Math.max(this.interval, 1000); this.resetPending = true; @@ -161,7 +168,8 @@ export class DataAggregator { if (!this.dataReceived) { this.elapsed = 0; this.dataReceived = true; - this.endTs = this.startTs + this.timeWindow; + const endTs = this.startTs + this.timeWindow; + this.endTs = calculateIntervalEndTime(this.quickInterval, endTs); } if (this.resetPending) { this.resetPending = false; @@ -197,8 +205,11 @@ export class DataAggregator { if (!history) { const delta = Math.floor(this.elapsed / this.interval); if (delta || !this.data) { - this.startTs += delta * this.interval; - this.endTs += delta * this.interval; + const tickTs = delta * this.interval; + const startTS = this.startTs + tickTs; + this.startTs = calculateIntervalStartTime(this.quickInterval, startTS); + const endTs = this.endTs + tickTs; + this.endTs = calculateIntervalEndTime(this.quickInterval, endTs); this.data = this.updateData(); this.elapsed = this.elapsed - delta * this.interval; } 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 dbc9bd2adb..6dc8036df6 100644 --- a/ui-ngx/src/app/core/api/entity-data-subscription.ts +++ b/ui-ngx/src/app/core/api/entity-data-subscription.ts @@ -752,7 +752,8 @@ export class EntityDataSubscription { subsTw.aggregation.interval, subsTw.aggregation.stateData, this.utils, - this.entityDataSubscriptionOptions.ignoreDataUpdateOnIntervalTick + this.entityDataSubscriptionOptions.ignoreDataUpdateOnIntervalTick, + subsTw.quickInterval ); } diff --git a/ui-ngx/src/app/core/api/widget-subscription.ts b/ui-ngx/src/app/core/api/widget-subscription.ts index ce36f57e10..d33329f1cc 100644 --- a/ui-ngx/src/app/core/api/widget-subscription.ts +++ b/ui-ngx/src/app/core/api/widget-subscription.ts @@ -37,6 +37,8 @@ import { } from '@app/shared/models/widget.models'; import { HttpErrorResponse } from '@angular/common/http'; import { + calculateIntervalEndTime, + calculateIntervalStartTime, createSubscriptionTimewindow, createTimewindowForComparison, SubscriptionTimewindow, @@ -1081,8 +1083,10 @@ export class WidgetSubscription implements IWidgetSubscription { private updateTimewindow() { this.timeWindow.interval = this.subscriptionTimewindow.aggregation.interval || 1000; if (this.subscriptionTimewindow.realtimeWindowMs) { - this.timeWindow.maxTime = moment().valueOf() + this.timeWindow.stDiff; - this.timeWindow.minTime = this.timeWindow.maxTime - this.subscriptionTimewindow.realtimeWindowMs; + this.timeWindow.maxTime = calculateIntervalEndTime( + this.subscriptionTimewindow.quickInterval, moment().valueOf() + this.timeWindow.stDiff); + this.timeWindow.minTime = calculateIntervalStartTime( + this.subscriptionTimewindow.quickInterval, this.timeWindow.maxTime - this.subscriptionTimewindow.realtimeWindowMs); } else if (this.subscriptionTimewindow.fixedWindow) { this.timeWindow.maxTime = this.subscriptionTimewindow.fixedWindow.endTimeMs; this.timeWindow.minTime = this.subscriptionTimewindow.fixedWindow.startTimeMs; @@ -1105,7 +1109,7 @@ export class WidgetSubscription implements IWidgetSubscription { this.comparisonTimeWindow.interval = this.timewindowForComparison.aggregation.interval || 1000; if (this.timewindowForComparison.realtimeWindowMs) { this.comparisonTimeWindow.maxTime = moment(this.timeWindow.maxTime).subtract(1, this.timeForComparison).valueOf(); - this.comparisonTimeWindow.minTime = this.comparisonTimeWindow.maxTime - this.timewindowForComparison.realtimeWindowMs; + this.comparisonTimeWindow.minTime = moment(this.timeWindow.minTime).subtract(1, this.timeForComparison).valueOf(); } else if (this.timewindowForComparison.fixedWindow) { this.comparisonTimeWindow.maxTime = this.timewindowForComparison.fixedWindow.endTimeMs; this.comparisonTimeWindow.minTime = this.timewindowForComparison.fixedWindow.startTimeMs; diff --git a/ui-ngx/src/app/shared/components/time/quick-time-interval.component.ts b/ui-ngx/src/app/shared/components/time/quick-time-interval.component.ts index 7f0ccb90db..c6e0808d6a 100644 --- a/ui-ngx/src/app/shared/components/time/quick-time-interval.component.ts +++ b/ui-ngx/src/app/shared/components/time/quick-time-interval.component.ts @@ -50,7 +50,7 @@ export class QuickTimeIntervalComponent implements OnInit, ControlValueAccessor get intervals() { if (this.onlyCurrentInterval) { - return this.allIntervals.filter(interval => interval.startsWith('TODAY_') || interval.startsWith('CURRENT_')); + return this.allIntervals.filter(interval => interval.startsWith('TODAY') || interval.startsWith('CURRENT_')); } return this.allIntervals; } @@ -71,7 +71,6 @@ export class QuickTimeIntervalComponent implements OnInit, ControlValueAccessor writeValue(interval: QuickTimeInterval): void { this.modelValue = interval; - this.rendered = true; } onIntervalChange() { diff --git a/ui-ngx/src/app/shared/components/time/timewindow-panel.component.html b/ui-ngx/src/app/shared/components/time/timewindow-panel.component.html index 432b84749a..d8d9681aeb 100644 --- a/ui-ngx/src/app/shared/components/time/timewindow-panel.component.html +++ b/ui-ngx/src/app/shared/components/time/timewindow-panel.component.html @@ -21,16 +21,43 @@ -
- -
+
+
+ + +
+
+
+ + +
+ timewindow.last + +
+
+ +
+ timewindow.interval + +
+
+
+
+
+
diff --git a/ui-ngx/src/app/shared/components/time/timewindow-panel.component.ts b/ui-ngx/src/app/shared/components/time/timewindow-panel.component.ts index b4aefef859..02a7f70b5c 100644 --- a/ui-ngx/src/app/shared/components/time/timewindow-panel.component.ts +++ b/ui-ngx/src/app/shared/components/time/timewindow-panel.component.ts @@ -19,7 +19,9 @@ import { aggregationTranslations, AggregationType, DAY, - HistoryWindowType, quickTimeIntervalPeriod, + HistoryWindowType, + quickTimeIntervalPeriod, + RealtimeWindowType, Timewindow, TimewindowType } from '@shared/models/time/time.models'; @@ -60,6 +62,8 @@ export class TimewindowPanelComponent extends PageComponent implements OnInit { historyTypes = HistoryWindowType; + realtimeTypes = RealtimeWindowType; + timewindowTypes = TimewindowType; aggregationTypes = AggregationType; @@ -89,6 +93,11 @@ export class TimewindowPanelComponent extends PageComponent implements OnInit { this.timewindowForm = this.fb.group({ realtime: this.fb.group( { + realtimeType: this.fb.control({ + value: this.timewindow.realtime && typeof this.timewindow.realtime.realtimeType !== 'undefined' + ? this.timewindow.realtime.realtimeType : RealtimeWindowType.LAST_INTERVAL, + disabled: hideInterval + }), timewindowMs: [ this.timewindow.realtime && typeof this.timewindow.realtime.timewindowMs !== 'undefined' ? this.timewindow.realtime.timewindowMs : null @@ -96,7 +105,12 @@ export class TimewindowPanelComponent extends PageComponent implements OnInit { interval: [ this.timewindow.realtime && typeof this.timewindow.realtime.interval !== 'undefined' ? this.timewindow.realtime.interval : null - ] + ], + quickInterval: this.fb.control({ + value: this.timewindow.realtime && typeof this.timewindow.realtime.quickInterval !== 'undefined' + ? this.timewindow.realtime.quickInterval : null, + disabled: hideInterval + }) } ), history: this.fb.group( @@ -124,7 +138,7 @@ export class TimewindowPanelComponent extends PageComponent implements OnInit { value: this.timewindow.history && typeof this.timewindow.history.quickInterval !== 'undefined' ? this.timewindow.history.quickInterval : null, disabled: hideInterval - }), + }) } ), aggregation: this.fb.group( @@ -147,7 +161,9 @@ export class TimewindowPanelComponent extends PageComponent implements OnInit { update() { const timewindowFormValue = this.timewindowForm.getRawValue(); this.timewindow.realtime = { + realtimeType: timewindowFormValue.realtime.realtimeType, timewindowMs: timewindowFormValue.realtime.timewindowMs, + quickInterval: timewindowFormValue.realtime.quickInterval, interval: timewindowFormValue.realtime.interval }; this.timewindow.history = { @@ -180,11 +196,23 @@ export class TimewindowPanelComponent extends PageComponent implements OnInit { } minRealtimeAggInterval() { - return this.timeService.minIntervalLimit(this.timewindowForm.get('realtime.timewindowMs').value); + return this.timeService.minIntervalLimit(this.currentRealtimeTimewindow()); } maxRealtimeAggInterval() { - return this.timeService.maxIntervalLimit(this.timewindowForm.get('realtime.timewindowMs').value); + return this.timeService.maxIntervalLimit(this.currentRealtimeTimewindow()); + } + + currentRealtimeTimewindow(): number { + const timeWindowFormValue = this.timewindowForm.getRawValue(); + switch (timeWindowFormValue.realtime.realtimeType) { + case RealtimeWindowType.LAST_INTERVAL: + return timeWindowFormValue.realtime.timewindowMs; + case RealtimeWindowType.INTERVAL: + return quickTimeIntervalPeriod(timeWindowFormValue.realtime.quickInterval); + default: + return DAY; + } } minHistoryAggInterval() { @@ -215,11 +243,17 @@ export class TimewindowPanelComponent extends PageComponent implements OnInit { this.timewindowForm.get('history.timewindowMs').disable({emitEvent: false}); this.timewindowForm.get('history.fixedTimewindow').disable({emitEvent: false}); this.timewindowForm.get('history.quickInterval').disable({emitEvent: false}); + this.timewindowForm.get('realtime.realtimeType').disable({emitEvent: false}); + this.timewindowForm.get('realtime.timewindowMs').disable({emitEvent: false}); + this.timewindowForm.get('realtime.quickInterval').disable({emitEvent: false}); } else { this.timewindowForm.get('history.historyType').enable({emitEvent: false}); this.timewindowForm.get('history.timewindowMs').enable({emitEvent: false}); this.timewindowForm.get('history.fixedTimewindow').enable({emitEvent: false}); this.timewindowForm.get('history.quickInterval').enable({emitEvent: false}); + this.timewindowForm.get('realtime.realtimeType').enable({emitEvent: false}); + this.timewindowForm.get('realtime.timewindowMs').enable({emitEvent: false}); + this.timewindowForm.get('realtime.quickInterval').enable({emitEvent: false}); } this.timewindowForm.markAsDirty(); } diff --git a/ui-ngx/src/app/shared/components/time/timewindow.component.ts b/ui-ngx/src/app/shared/components/time/timewindow.component.ts index 59eada88a9..6ba81cdcfc 100644 --- a/ui-ngx/src/app/shared/components/time/timewindow.component.ts +++ b/ui-ngx/src/app/shared/components/time/timewindow.component.ts @@ -34,6 +34,7 @@ import { HistoryWindowType, initModelFromDefaultTimewindow, QuickTimeIntervalTranslationMap, + RealtimeWindowType, Timewindow, TimewindowType } from '@shared/models/time/time.models'; @@ -273,9 +274,13 @@ export class TimewindowComponent implements OnInit, OnDestroy, ControlValueAcces updateDisplayValue() { if (this.innerValue.selectedTab === TimewindowType.REALTIME && !this.historyOnly) { - this.innerValue.displayValue = this.translate.instant('timewindow.realtime') + ' - ' + - this.translate.instant('timewindow.last-prefix') + ' ' + - this.millisecondsToTimeStringPipe.transform(this.innerValue.realtime.timewindowMs); + this.innerValue.displayValue = this.translate.instant('timewindow.realtime') + ' - '; + if (this.innerValue.realtime.realtimeType === RealtimeWindowType.INTERVAL) { + this.innerValue.displayValue += this.translate.instant(QuickTimeIntervalTranslationMap.get(this.innerValue.realtime.quickInterval)); + } else { + this.innerValue.displayValue += this.translate.instant('timewindow.last-prefix') + ' ' + + this.millisecondsToTimeStringPipe.transform(this.innerValue.realtime.timewindowMs); + } } else { this.innerValue.displayValue = !this.historyOnly ? (this.translate.instant('timewindow.history') + ' - ') : ''; if (this.innerValue.history.historyType === HistoryWindowType.LAST_INTERVAL) { diff --git a/ui-ngx/src/app/shared/models/time/time.models.ts b/ui-ngx/src/app/shared/models/time/time.models.ts index ee3748e214..bed6d6238d 100644 --- a/ui-ngx/src/app/shared/models/time/time.models.ts +++ b/ui-ngx/src/app/shared/models/time/time.models.ts @@ -15,7 +15,7 @@ /// import { TimeService } from '@core/services/time.service'; -import { deepClone, isDefined, isUndefined } from '@app/core/utils'; +import { deepClone, isDefined, isDefinedAndNotNull, isUndefined } from '@app/core/utils'; import * as moment_ from 'moment'; import { Observable } from 'rxjs/internal/Observable'; import { from, of } from 'rxjs'; @@ -35,6 +35,11 @@ export enum TimewindowType { HISTORY } +export enum RealtimeWindowType { + LAST_INTERVAL, + INTERVAL +} + export enum HistoryWindowType { LAST_INTERVAL, FIXED, @@ -47,6 +52,10 @@ export interface IntervalWindow { quickInterval?: QuickTimeInterval; } +export interface RealtimeWindow extends IntervalWindow{ + realtimeType?: RealtimeWindowType; +} + export interface FixedWindow { startTimeMs: number; endTimeMs: number; @@ -89,7 +98,7 @@ export interface Timewindow { hideAggregation?: boolean; hideAggInterval?: boolean; selectedTab?: TimewindowType; - realtime?: IntervalWindow; + realtime?: RealtimeWindow; history?: HistoryWindow; aggregation?: Aggregation; } @@ -102,6 +111,7 @@ export interface SubscriptionAggregation extends Aggregation { export interface SubscriptionTimewindow { startTs?: number; + quickInterval?: QuickTimeInterval; realtimeWindowMs?: number; fixedWindow?: FixedWindow; aggregation?: SubscriptionAggregation; @@ -168,8 +178,10 @@ export function defaultTimewindow(timeService: TimeService): Timewindow { hideAggInterval: false, selectedTab: TimewindowType.REALTIME, realtime: { + realtimeType: RealtimeWindowType.LAST_INTERVAL, interval: SECOND, - timewindowMs: MINUTE + timewindowMs: MINUTE, + quickInterval: QuickTimeInterval.TODAY }, history: { historyType: HistoryWindowType.LAST_INTERVAL, @@ -208,7 +220,20 @@ export function initModelFromDefaultTimewindow(value: Timewindow, timeService: T if (isDefined(value.realtime.interval)) { model.realtime.interval = value.realtime.interval; } - model.realtime.timewindowMs = value.realtime.timewindowMs; + if (isUndefined(value.realtime.realtimeType)) { + if (isDefined(value.realtime.quickInterval)) { + model.realtime.realtimeType = RealtimeWindowType.INTERVAL; + } else { + model.realtime.realtimeType = RealtimeWindowType.LAST_INTERVAL; + } + } else { + model.realtime.realtimeType = value.realtime.realtimeType; + } + if (model.realtime.realtimeType === RealtimeWindowType.INTERVAL) { + model.realtime.quickInterval = value.realtime.quickInterval; + } else { + model.realtime.timewindowMs = value.realtime.timewindowMs; + } } else { if (isDefined(value.history.interval)) { model.history.interval = value.history.interval; @@ -309,14 +334,27 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num selectedTab = isDefined(timewindow.realtime) ? TimewindowType.REALTIME : TimewindowType.HISTORY; } if (selectedTab === TimewindowType.REALTIME) { - subscriptionTimewindow.realtimeWindowMs = timewindow.realtime.timewindowMs; + let realtimeType = timewindow.realtime.realtimeType; + if (isUndefined(realtimeType)) { + if (isDefined(timewindow.realtime.quickInterval)) { + realtimeType = RealtimeWindowType.INTERVAL; + } else { + realtimeType = RealtimeWindowType.LAST_INTERVAL; + } + } + if (realtimeType === RealtimeWindowType.INTERVAL) { + subscriptionTimewindow.realtimeWindowMs = getSubscriptionRealtimeWindowFromTimeInterval(timewindow.realtime.quickInterval); + subscriptionTimewindow.quickInterval = timewindow.realtime.quickInterval; + } else { + subscriptionTimewindow.realtimeWindowMs = timewindow.realtime.timewindowMs; + } subscriptionTimewindow.aggregation.interval = timeService.boundIntervalToTimewindow(subscriptionTimewindow.realtimeWindowMs, timewindow.realtime.interval, subscriptionTimewindow.aggregation.type); subscriptionTimewindow.startTs = Date.now() + stDiff - subscriptionTimewindow.realtimeWindowMs; const startDiff = subscriptionTimewindow.startTs % subscriptionTimewindow.aggregation.interval; aggTimewindow = subscriptionTimewindow.realtimeWindowMs; - if (startDiff) { + if (startDiff && realtimeType !== RealtimeWindowType.INTERVAL) { subscriptionTimewindow.startTs -= startDiff; aggTimewindow += subscriptionTimewindow.aggregation.interval; } @@ -339,7 +377,11 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num }; aggTimewindow = timewindow.history.timewindowMs; } else if (historyType === HistoryWindowType.INTERVAL) { - subscriptionTimewindow.fixedWindow = createSubscriptionTimeWindowFromQuickKTimeInterval(timewindow.history.quickInterval); + const currentDate = moment(); + subscriptionTimewindow.fixedWindow = { + startTimeMs: calculateIntervalStartTime(timewindow.history.quickInterval, null, currentDate), + endTimeMs: calculateIntervalEndTime(timewindow.history.quickInterval, null, currentDate) + }; aggTimewindow = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs; } else { subscriptionTimewindow.fixedWindow = { @@ -360,77 +402,99 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num return subscriptionTimewindow; } -export function createSubscriptionTimeWindowFromQuickKTimeInterval(interval: QuickTimeInterval): FixedWindow { +function getSubscriptionRealtimeWindowFromTimeInterval(interval: QuickTimeInterval): number { const currentDate = moment(); - const timeWindow = { - startTimeMs: 0, - endTimeMs: 0 - }; + switch (interval) { + case QuickTimeInterval.TODAY: + case QuickTimeInterval.TODAY_SO_FAR: + return currentDate.diff(currentDate.clone().startOf('day')); + case QuickTimeInterval.CURRENT_WEEK: + case QuickTimeInterval.CURRENT_WEEK_SO_FAR: + return currentDate.diff(currentDate.clone().startOf('week')); + case QuickTimeInterval.CURRENT_MONTH: + case QuickTimeInterval.CURRENT_MONTH_SO_FAR: + return currentDate.diff(currentDate.clone().startOf('month')); + case QuickTimeInterval.CURRENT_YEAR: + case QuickTimeInterval.CURRENT_YEAR_SO_FAR: + return currentDate.diff(currentDate.clone().startOf('year')); + } +} + +export function calculateIntervalEndTime(interval: QuickTimeInterval, endTs = 0, nowDate?: moment_.Moment): number { + const currentDate = isDefinedAndNotNull(nowDate) ? nowDate.clone() : moment(); + switch (interval) { + case QuickTimeInterval.YESTERDAY: + currentDate.subtract(1, 'days'); + return currentDate.endOf('day').valueOf(); + case QuickTimeInterval.DAY_BEFORE_YESTERDAY: + currentDate.subtract(2, 'days'); + return currentDate.endOf('day').valueOf(); + case QuickTimeInterval.THIS_DAY_LAST_WEEK: + currentDate.subtract(1, 'weeks'); + return currentDate.endOf('day').valueOf(); + case QuickTimeInterval.PREVIOUS_WEEK: + currentDate.subtract(1, 'weeks'); + return currentDate.endOf('week').valueOf(); + case QuickTimeInterval.PREVIOUS_MONTH: + currentDate.subtract(1, 'months'); + return currentDate.endOf('month').valueOf(); + case QuickTimeInterval.PREVIOUS_YEAR: + currentDate.subtract(1, 'years'); + return currentDate.endOf('year').valueOf(); + case QuickTimeInterval.TODAY: + return currentDate.endOf('day').valueOf(); + case QuickTimeInterval.CURRENT_WEEK: + return currentDate.endOf('week').valueOf(); + case QuickTimeInterval.CURRENT_MONTH: + return currentDate.endOf('month').valueOf(); + case QuickTimeInterval.CURRENT_YEAR: + return currentDate.endOf('year').valueOf(); + case QuickTimeInterval.TODAY_SO_FAR: + case QuickTimeInterval.CURRENT_WEEK_SO_FAR: + case QuickTimeInterval.CURRENT_MONTH_SO_FAR: + case QuickTimeInterval.CURRENT_YEAR_SO_FAR: + return currentDate.valueOf(); + default: + return endTs; + } +} + +export function calculateIntervalStartTime(interval: QuickTimeInterval, startTS = 0, nowDate?: moment_.Moment): number { + const currentDate = isDefinedAndNotNull(nowDate) ? nowDate.clone() : moment(); switch (interval) { case QuickTimeInterval.YESTERDAY: currentDate.subtract(1, 'days'); - timeWindow.startTimeMs = currentDate.startOf('day').valueOf(); - timeWindow.endTimeMs = currentDate.endOf('day').valueOf(); - break; + return currentDate.startOf('day').valueOf(); case QuickTimeInterval.DAY_BEFORE_YESTERDAY: currentDate.subtract(2, 'days'); - timeWindow.startTimeMs = currentDate.startOf('day').valueOf(); - timeWindow.endTimeMs = currentDate.endOf('day').valueOf(); - break; + return currentDate.startOf('day').valueOf(); case QuickTimeInterval.THIS_DAY_LAST_WEEK: currentDate.subtract(1, 'weeks'); - timeWindow.startTimeMs = currentDate.startOf('day').valueOf(); - timeWindow.endTimeMs = currentDate.endOf('day').valueOf(); - break; + return currentDate.startOf('day').valueOf(); case QuickTimeInterval.PREVIOUS_WEEK: currentDate.subtract(1, 'weeks'); - timeWindow.startTimeMs = currentDate.startOf('week').valueOf(); - timeWindow.endTimeMs = currentDate.endOf('week').valueOf(); - break; + return currentDate.startOf('week').valueOf(); case QuickTimeInterval.PREVIOUS_MONTH: currentDate.subtract(1, 'months'); - timeWindow.startTimeMs = currentDate.startOf('month').valueOf(); - timeWindow.endTimeMs = currentDate.endOf('month').valueOf(); - break; + return currentDate.startOf('month').valueOf(); case QuickTimeInterval.PREVIOUS_YEAR: currentDate.subtract(1, 'years'); - timeWindow.startTimeMs = currentDate.startOf('year').valueOf(); - timeWindow.endTimeMs = currentDate.endOf('year').valueOf(); - break; + return currentDate.startOf('year').valueOf(); case QuickTimeInterval.TODAY: - timeWindow.startTimeMs = currentDate.startOf('day').valueOf(); - timeWindow.endTimeMs = currentDate.endOf('day').valueOf(); - break; case QuickTimeInterval.TODAY_SO_FAR: - timeWindow.endTimeMs = currentDate.valueOf(); - timeWindow.startTimeMs = currentDate.startOf('day').valueOf(); - break; + return currentDate.startOf('day').valueOf(); case QuickTimeInterval.CURRENT_WEEK: - timeWindow.startTimeMs = currentDate.startOf('week').valueOf(); - timeWindow.endTimeMs = currentDate.endOf('week').valueOf(); - break; case QuickTimeInterval.CURRENT_WEEK_SO_FAR: - timeWindow.endTimeMs = currentDate.valueOf(); - timeWindow.startTimeMs = currentDate.startOf('week').valueOf(); - break; + return currentDate.startOf('week').valueOf(); case QuickTimeInterval.CURRENT_MONTH: - timeWindow.startTimeMs = currentDate.startOf('month').valueOf(); - timeWindow.endTimeMs = currentDate.endOf('month').valueOf(); - break; case QuickTimeInterval.CURRENT_MONTH_SO_FAR: - timeWindow.endTimeMs = currentDate.valueOf(); - timeWindow.startTimeMs = currentDate.startOf('month').valueOf(); - break; + return currentDate.startOf('month').valueOf(); case QuickTimeInterval.CURRENT_YEAR: - timeWindow.startTimeMs = currentDate.startOf('year').valueOf(); - timeWindow.endTimeMs = currentDate.endOf('year').valueOf(); - break; case QuickTimeInterval.CURRENT_YEAR_SO_FAR: - timeWindow.endTimeMs = currentDate.valueOf(); - timeWindow.startTimeMs = currentDate.startOf('year').valueOf(); - break; + return currentDate.startOf('year').valueOf(); + default: + return startTS; } - return timeWindow; } export function quickTimeIntervalPeriod(interval: QuickTimeInterval): number {