Commit dfcc5ec52e4862bc4ff2a44221e20bf2e0939b6a

Authored by Igor Kulikov
1 parent bb4a51ba

UI: Improve interval timestamp range calculation.

@@ -17,10 +17,9 @@ @@ -17,10 +17,9 @@
17 import { SubscriptionData, SubscriptionDataHolder } from '@app/shared/models/telemetry/telemetry.models'; 17 import { SubscriptionData, SubscriptionDataHolder } from '@app/shared/models/telemetry/telemetry.models';
18 import { 18 import {
19 AggregationType, calculateIntervalComparisonEndTime, 19 AggregationType, calculateIntervalComparisonEndTime,
20 - calculateIntervalEndTime,  
21 - calculateIntervalStartTime, 20 + calculateIntervalEndTime, calculateIntervalStartEndTime,
22 getCurrentTime, 21 getCurrentTime,
23 - getCurrentTimeForComparison, 22 + getCurrentTimeForComparison, getTime,
24 SubscriptionTimewindow 23 SubscriptionTimewindow
25 } from '@shared/models/time/time.models'; 24 } from '@shared/models/time/time.models';
26 import { UtilsService } from '@core/services/utils.service'; 25 import { UtilsService } from '@core/services/utils.service';
@@ -245,11 +244,12 @@ export class DataAggregator { @@ -245,11 +244,12 @@ export class DataAggregator {
245 this.startTs = this.subsTw.startTs + this.subsTw.tsOffset; 244 this.startTs = this.subsTw.startTs + this.subsTw.tsOffset;
246 if (this.subsTw.quickInterval) { 245 if (this.subsTw.quickInterval) {
247 if (this.subsTw.timeForComparison === 'previousInterval') { 246 if (this.subsTw.timeForComparison === 'previousInterval') {
  247 + const startDate = getTime(this.subsTw.startTs, this.subsTw.timezone);
248 const currentDate = getCurrentTime(this.subsTw.timezone); 248 const currentDate = getCurrentTime(this.subsTw.timezone);
249 - this.endTs = calculateIntervalComparisonEndTime(this.subsTw.quickInterval, currentDate) + this.subsTw.tsOffset; 249 + this.endTs = calculateIntervalComparisonEndTime(this.subsTw.quickInterval, startDate, currentDate) + this.subsTw.tsOffset;
250 } else { 250 } else {
251 - const currentDate = this.getCurrentTime();  
252 - this.endTs = calculateIntervalEndTime(this.subsTw.quickInterval, currentDate) + this.subsTw.tsOffset; 251 + const startDate = getTime(this.subsTw.startTs, this.subsTw.timezone);
  252 + this.endTs = calculateIntervalEndTime(this.subsTw.quickInterval, startDate, this.subsTw.timezone) + this.subsTw.tsOffset;
253 } 253 }
254 } else { 254 } else {
255 this.endTs = this.startTs + this.subsTw.aggregation.timeWindow; 255 this.endTs = this.startTs + this.subsTw.aggregation.timeWindow;
@@ -270,9 +270,9 @@ export class DataAggregator { @@ -270,9 +270,9 @@ export class DataAggregator {
270 if (delta || !this.data || rangeChanged) { 270 if (delta || !this.data || rangeChanged) {
271 const tickTs = delta * this.subsTw.aggregation.interval; 271 const tickTs = delta * this.subsTw.aggregation.interval;
272 if (this.subsTw.quickInterval) { 272 if (this.subsTw.quickInterval) {
273 - const currentDate = this.getCurrentTime();  
274 - this.startTs = calculateIntervalStartTime(this.subsTw.quickInterval, currentDate) + this.subsTw.tsOffset;  
275 - this.endTs = calculateIntervalEndTime(this.subsTw.quickInterval, currentDate) + this.subsTw.tsOffset; 273 + const startEndTime = calculateIntervalStartEndTime(this.subsTw.quickInterval, this.subsTw.timezone);
  274 + this.startTs = startEndTime[0] + this.subsTw.tsOffset;
  275 + this.endTs = startEndTime[1] + this.subsTw.tsOffset;
276 } else { 276 } else {
277 this.startTs += tickTs; 277 this.startTs += tickTs;
278 this.endTs += tickTs; 278 this.endTs += tickTs;
@@ -37,12 +37,11 @@ import { @@ -37,12 +37,11 @@ import {
37 } from '@app/shared/models/widget.models'; 37 } from '@app/shared/models/widget.models';
38 import { HttpErrorResponse } from '@angular/common/http'; 38 import { HttpErrorResponse } from '@angular/common/http';
39 import { 39 import {
40 - calculateIntervalEndTime,  
41 - calculateIntervalStartTime, 40 + calculateIntervalStartEndTime,
42 calculateTsOffset, ComparisonDuration, 41 calculateTsOffset, ComparisonDuration,
43 createSubscriptionTimewindow, 42 createSubscriptionTimewindow,
44 createTimewindowForComparison, 43 createTimewindowForComparison,
45 - getCurrentTime, isHistoryTypeTimewindow, 44 + isHistoryTypeTimewindow,
46 SubscriptionTimewindow, 45 SubscriptionTimewindow,
47 Timewindow, timewindowTypeChanged, 46 Timewindow, timewindowTypeChanged,
48 toHistoryTimewindow, 47 toHistoryTimewindow,
@@ -1106,11 +1105,9 @@ export class WidgetSubscription implements IWidgetSubscription { @@ -1106,11 +1105,9 @@ export class WidgetSubscription implements IWidgetSubscription {
1106 this.timeWindow.timezone = this.subscriptionTimewindow.timezone; 1105 this.timeWindow.timezone = this.subscriptionTimewindow.timezone;
1107 if (this.subscriptionTimewindow.realtimeWindowMs) { 1106 if (this.subscriptionTimewindow.realtimeWindowMs) {
1108 if (this.subscriptionTimewindow.quickInterval) { 1107 if (this.subscriptionTimewindow.quickInterval) {
1109 - const currentDate = getCurrentTime(this.subscriptionTimewindow.timezone);  
1110 - this.timeWindow.maxTime = calculateIntervalEndTime(  
1111 - this.subscriptionTimewindow.quickInterval, currentDate) + this.subscriptionTimewindow.tsOffset;  
1112 - this.timeWindow.minTime = calculateIntervalStartTime(  
1113 - this.subscriptionTimewindow.quickInterval, currentDate) + this.subscriptionTimewindow.tsOffset; 1108 + const startEndTime = calculateIntervalStartEndTime(this.subscriptionTimewindow.quickInterval, this.subscriptionTimewindow.timezone);
  1109 + this.timeWindow.maxTime = startEndTime[1] + this.subscriptionTimewindow.tsOffset;
  1110 + this.timeWindow.minTime = startEndTime[0] + this.subscriptionTimewindow.tsOffset;
1114 } else { 1111 } else {
1115 this.timeWindow.maxTime = moment().valueOf() + this.subscriptionTimewindow.tsOffset + this.timeWindow.stDiff; 1112 this.timeWindow.maxTime = moment().valueOf() + this.subscriptionTimewindow.tsOffset + this.timeWindow.stDiff;
1116 this.timeWindow.minTime = this.timeWindow.maxTime - this.subscriptionTimewindow.realtimeWindowMs; 1113 this.timeWindow.minTime = this.timeWindow.maxTime - this.subscriptionTimewindow.realtimeWindowMs;
@@ -56,9 +56,7 @@ import { DialogService } from '@core/services/dialog.service'; @@ -56,9 +56,7 @@ import { DialogService } from '@core/services/dialog.service';
56 import { AddEntityDialogComponent } from './add-entity-dialog.component'; 56 import { AddEntityDialogComponent } from './add-entity-dialog.component';
57 import { AddEntityDialogData, EntityAction } from '@home/models/entity/entity-component.models'; 57 import { AddEntityDialogData, EntityAction } from '@home/models/entity/entity-component.models';
58 import { 58 import {
59 - calculateIntervalEndTime,  
60 - calculateIntervalStartTime,  
61 - getCurrentTime, 59 + calculateIntervalStartEndTime,
62 HistoryWindowType, 60 HistoryWindowType,
63 Timewindow 61 Timewindow
64 } from '@shared/models/time/time.models'; 62 } from '@shared/models/time/time.models';
@@ -303,9 +301,9 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn @@ -303,9 +301,9 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn
303 timePageLink.startTime = currentTime - this.timewindow.history.timewindowMs; 301 timePageLink.startTime = currentTime - this.timewindow.history.timewindowMs;
304 timePageLink.endTime = currentTime; 302 timePageLink.endTime = currentTime;
305 } else if (this.timewindow.history.historyType === HistoryWindowType.INTERVAL) { 303 } else if (this.timewindow.history.historyType === HistoryWindowType.INTERVAL) {
306 - const currentDate = getCurrentTime();  
307 - timePageLink.startTime = calculateIntervalStartTime(this.timewindow.history.quickInterval, currentDate);  
308 - timePageLink.endTime = calculateIntervalEndTime(this.timewindow.history.quickInterval, currentDate); 304 + const startEndTime = calculateIntervalStartEndTime(this.timewindow.history.quickInterval);
  305 + timePageLink.startTime = startEndTime[0];
  306 + timePageLink.endTime = startEndTime[1];
309 } else { 307 } else {
310 timePageLink.startTime = this.timewindow.history.fixedTimewindow.startTimeMs; 308 timePageLink.startTime = this.timewindow.history.fixedTimewindow.startTimeMs;
311 timePageLink.endTime = this.timewindow.history.fixedTimewindow.endTimeMs; 309 timePageLink.endTime = this.timewindow.history.fixedTimewindow.endTimeMs;
@@ -174,19 +174,18 @@ export const QuickTimeIntervalTranslationMap = new Map<QuickTimeInterval, string @@ -174,19 +174,18 @@ export const QuickTimeIntervalTranslationMap = new Map<QuickTimeInterval, string
174 ]); 174 ]);
175 175
176 export function historyInterval(timewindowMs: number): Timewindow { 176 export function historyInterval(timewindowMs: number): Timewindow {
177 - const timewindow: Timewindow = { 177 + return {
178 selectedTab: TimewindowType.HISTORY, 178 selectedTab: TimewindowType.HISTORY,
179 history: { 179 history: {
180 historyType: HistoryWindowType.LAST_INTERVAL, 180 historyType: HistoryWindowType.LAST_INTERVAL,
181 timewindowMs 181 timewindowMs
182 } 182 }
183 }; 183 };
184 - return timewindow;  
185 } 184 }
186 185
187 export function defaultTimewindow(timeService: TimeService): Timewindow { 186 export function defaultTimewindow(timeService: TimeService): Timewindow {
188 const currentTime = moment().valueOf(); 187 const currentTime = moment().valueOf();
189 - const timewindow: Timewindow = { 188 + return {
190 displayValue: '', 189 displayValue: '',
191 hideInterval: false, 190 hideInterval: false,
192 hideAggregation: false, 191 hideAggregation: false,
@@ -214,7 +213,6 @@ export function defaultTimewindow(timeService: TimeService): Timewindow { @@ -214,7 +213,6 @@ export function defaultTimewindow(timeService: TimeService): Timewindow {
214 limit: Math.floor(timeService.getMaxDatapointsLimit() / 2) 213 limit: Math.floor(timeService.getMaxDatapointsLimit() / 2)
215 } 214 }
216 }; 215 };
217 - return timewindow;  
218 } 216 }
219 217
220 function getTimewindowType(timewindow: Timewindow): TimewindowType { 218 function getTimewindowType(timewindow: Timewindow): TimewindowType {
@@ -304,7 +302,7 @@ export function toHistoryTimewindow(timewindow: Timewindow, startTimeMs: number, @@ -304,7 +302,7 @@ export function toHistoryTimewindow(timewindow: Timewindow, startTimeMs: number,
304 aggType = AggregationType.AVG; 302 aggType = AggregationType.AVG;
305 limit = timeService.getMaxDatapointsLimit(); 303 limit = timeService.getMaxDatapointsLimit();
306 } 304 }
307 - const historyTimewindow: Timewindow = { 305 + return {
308 hideInterval: timewindow.hideInterval || false, 306 hideInterval: timewindow.hideInterval || false,
309 hideAggregation: timewindow.hideAggregation || false, 307 hideAggregation: timewindow.hideAggregation || false,
310 hideAggInterval: timewindow.hideAggInterval || false, 308 hideAggInterval: timewindow.hideAggInterval || false,
@@ -324,7 +322,6 @@ export function toHistoryTimewindow(timewindow: Timewindow, startTimeMs: number, @@ -324,7 +322,6 @@ export function toHistoryTimewindow(timewindow: Timewindow, startTimeMs: number,
324 }, 322 },
325 timezone: timewindow.timezone 323 timezone: timewindow.timezone
326 }; 324 };
327 - return historyTimewindow;  
328 } 325 }
329 326
330 export function timewindowTypeChanged(newTimewindow: Timewindow, oldTimewindow: Timewindow): boolean { 327 export function timewindowTypeChanged(newTimewindow: Timewindow, oldTimewindow: Timewindow): boolean {
@@ -363,7 +360,7 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num @@ -363,7 +360,7 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num
363 timezone: timewindow.timezone, 360 timezone: timewindow.timezone,
364 tsOffset: calculateTsOffset(timewindow.timezone) 361 tsOffset: calculateTsOffset(timewindow.timezone)
365 }; 362 };
366 - let aggTimewindow = 0; 363 + let aggTimewindow;
367 if (stateData) { 364 if (stateData) {
368 subscriptionTimewindow.aggregation.type = AggregationType.NONE; 365 subscriptionTimewindow.aggregation.type = AggregationType.NONE;
369 subscriptionTimewindow.aggregation.stateData = true; 366 subscriptionTimewindow.aggregation.stateData = true;
@@ -385,14 +382,15 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num @@ -385,14 +382,15 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num
385 } 382 }
386 } 383 }
387 if (realtimeType === RealtimeWindowType.INTERVAL) { 384 if (realtimeType === RealtimeWindowType.INTERVAL) {
388 - const currentDate = getCurrentTime(timewindow.timezone);  
389 subscriptionTimewindow.realtimeWindowMs = 385 subscriptionTimewindow.realtimeWindowMs =
390 - getSubscriptionRealtimeWindowFromTimeInterval(timewindow.realtime.quickInterval, currentDate); 386 + getSubscriptionRealtimeWindowFromTimeInterval(timewindow.realtime.quickInterval, timewindow.timezone);
391 subscriptionTimewindow.quickInterval = timewindow.realtime.quickInterval; 387 subscriptionTimewindow.quickInterval = timewindow.realtime.quickInterval;
392 - subscriptionTimewindow.startTs = calculateIntervalStartTime(timewindow.realtime.quickInterval, currentDate); 388 + const currentDate = getCurrentTime(timewindow.timezone);
  389 + subscriptionTimewindow.startTs = calculateIntervalStartTime(timewindow.realtime.quickInterval, currentDate).valueOf();
393 } else { 390 } else {
394 subscriptionTimewindow.realtimeWindowMs = timewindow.realtime.timewindowMs; 391 subscriptionTimewindow.realtimeWindowMs = timewindow.realtime.timewindowMs;
395 - subscriptionTimewindow.startTs = Date.now() + stDiff - subscriptionTimewindow.realtimeWindowMs; 392 + const currentDate = getCurrentTime(timewindow.timezone);
  393 + subscriptionTimewindow.startTs = currentDate.valueOf() + stDiff - subscriptionTimewindow.realtimeWindowMs;
396 } 394 }
397 subscriptionTimewindow.aggregation.interval = 395 subscriptionTimewindow.aggregation.interval =
398 timeService.boundIntervalToTimewindow(subscriptionTimewindow.realtimeWindowMs, timewindow.realtime.interval, 396 timeService.boundIntervalToTimewindow(subscriptionTimewindow.realtimeWindowMs, timewindow.realtime.interval,
@@ -425,10 +423,10 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num @@ -425,10 +423,10 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num
425 }; 423 };
426 aggTimewindow = timewindow.history.timewindowMs; 424 aggTimewindow = timewindow.history.timewindowMs;
427 } else if (historyType === HistoryWindowType.INTERVAL) { 425 } else if (historyType === HistoryWindowType.INTERVAL) {
428 - const currentDate = getCurrentTime(timewindow.timezone); 426 + const startEndTime = calculateIntervalStartEndTime(timewindow.history.quickInterval, timewindow.timezone);
429 subscriptionTimewindow.fixedWindow = { 427 subscriptionTimewindow.fixedWindow = {
430 - startTimeMs: calculateIntervalStartTime(timewindow.history.quickInterval, currentDate),  
431 - endTimeMs: calculateIntervalEndTime(timewindow.history.quickInterval, currentDate) 428 + startTimeMs: startEndTime[0],
  429 + endTimeMs: startEndTime[1]
432 }; 430 };
433 aggTimewindow = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs; 431 aggTimewindow = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs;
434 subscriptionTimewindow.quickInterval = timewindow.history.quickInterval; 432 subscriptionTimewindow.quickInterval = timewindow.history.quickInterval;
@@ -451,7 +449,8 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num @@ -451,7 +449,8 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num
451 return subscriptionTimewindow; 449 return subscriptionTimewindow;
452 } 450 }
453 451
454 -function getSubscriptionRealtimeWindowFromTimeInterval(interval: QuickTimeInterval, currentDate: moment_.Moment): number { 452 +function getSubscriptionRealtimeWindowFromTimeInterval(interval: QuickTimeInterval, tz?: string): number {
  453 + let currentDate;
455 switch (interval) { 454 switch (interval) {
456 case QuickTimeInterval.CURRENT_HOUR: 455 case QuickTimeInterval.CURRENT_HOUR:
457 return HOUR; 456 return HOUR;
@@ -465,99 +464,94 @@ function getSubscriptionRealtimeWindowFromTimeInterval(interval: QuickTimeInterv @@ -465,99 +464,94 @@ function getSubscriptionRealtimeWindowFromTimeInterval(interval: QuickTimeInterv
465 return WEEK; 464 return WEEK;
466 case QuickTimeInterval.CURRENT_MONTH: 465 case QuickTimeInterval.CURRENT_MONTH:
467 case QuickTimeInterval.CURRENT_MONTH_SO_FAR: 466 case QuickTimeInterval.CURRENT_MONTH_SO_FAR:
  467 + currentDate = getCurrentTime(tz);
468 return currentDate.endOf('month').diff(currentDate.clone().startOf('month')); 468 return currentDate.endOf('month').diff(currentDate.clone().startOf('month'));
469 case QuickTimeInterval.CURRENT_YEAR: 469 case QuickTimeInterval.CURRENT_YEAR:
470 case QuickTimeInterval.CURRENT_YEAR_SO_FAR: 470 case QuickTimeInterval.CURRENT_YEAR_SO_FAR:
  471 + currentDate = getCurrentTime(tz);
471 return currentDate.endOf('year').diff(currentDate.clone().startOf('year')); 472 return currentDate.endOf('year').diff(currentDate.clone().startOf('year'));
472 } 473 }
473 } 474 }
474 475
475 -export function calculateIntervalEndTime(interval: QuickTimeInterval, currentDate: moment_.Moment = null, tz: string = ''): number {  
476 - currentDate = currentDate ? currentDate.clone() : getCurrentTime(tz);  
477 - switch (interval) {  
478 - case QuickTimeInterval.YESTERDAY:  
479 - currentDate.subtract(1, 'days');  
480 - return currentDate.endOf('day').valueOf();  
481 - case QuickTimeInterval.DAY_BEFORE_YESTERDAY:  
482 - currentDate.subtract(2, 'days');  
483 - return currentDate.endOf('day').valueOf();  
484 - case QuickTimeInterval.THIS_DAY_LAST_WEEK:  
485 - currentDate.subtract(1, 'weeks');  
486 - return currentDate.endOf('day').valueOf();  
487 - case QuickTimeInterval.PREVIOUS_WEEK:  
488 - currentDate.subtract(1, 'weeks');  
489 - return currentDate.endOf('week').valueOf();  
490 - case QuickTimeInterval.PREVIOUS_WEEK_ISO:  
491 - currentDate.subtract(1, 'weeks');  
492 - return currentDate.endOf('isoWeek').valueOf();  
493 - case QuickTimeInterval.PREVIOUS_MONTH:  
494 - currentDate.subtract(1, 'months');  
495 - return currentDate.endOf('month').valueOf();  
496 - case QuickTimeInterval.PREVIOUS_YEAR:  
497 - currentDate.subtract(1, 'years');  
498 - return currentDate.endOf('year').valueOf();  
499 - case QuickTimeInterval.CURRENT_HOUR:  
500 - return currentDate.endOf('hour').valueOf();  
501 - case QuickTimeInterval.CURRENT_DAY:  
502 - return currentDate.endOf('day').valueOf();  
503 - case QuickTimeInterval.CURRENT_WEEK:  
504 - return currentDate.endOf('week').valueOf();  
505 - case QuickTimeInterval.CURRENT_WEEK_ISO:  
506 - return currentDate.endOf('isoWeek').valueOf();  
507 - case QuickTimeInterval.CURRENT_MONTH:  
508 - return currentDate.endOf('month').valueOf();  
509 - case QuickTimeInterval.CURRENT_YEAR:  
510 - return currentDate.endOf('year').valueOf();  
511 - case QuickTimeInterval.CURRENT_DAY_SO_FAR:  
512 - case QuickTimeInterval.CURRENT_WEEK_SO_FAR:  
513 - case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR:  
514 - case QuickTimeInterval.CURRENT_MONTH_SO_FAR:  
515 - case QuickTimeInterval.CURRENT_YEAR_SO_FAR:  
516 - return currentDate.valueOf();  
517 - } 476 +export function calculateIntervalStartEndTime(interval: QuickTimeInterval, tz?: string): [number, number] {
  477 + const startEndTs: [number, number] = [0, 0];
  478 + const currentDate = getCurrentTime(tz);
  479 + const startDate = calculateIntervalStartTime(interval, currentDate);
  480 + startEndTs[0] = startDate.valueOf();
  481 + const endDate = calculateIntervalEndTime(interval, startDate, tz);
  482 + startEndTs[1] = endDate.valueOf();
  483 + return startEndTs;
518 } 484 }
519 485
520 -export function calculateIntervalStartTime(interval: QuickTimeInterval, currentDate: moment_.Moment = null, tz: string = ''): number {  
521 - currentDate = currentDate ? currentDate.clone() : getCurrentTime(tz); 486 +export function calculateIntervalStartTime(interval: QuickTimeInterval, currentDate: moment_.Moment): moment_.Moment {
522 switch (interval) { 487 switch (interval) {
523 case QuickTimeInterval.YESTERDAY: 488 case QuickTimeInterval.YESTERDAY:
524 currentDate.subtract(1, 'days'); 489 currentDate.subtract(1, 'days');
525 - return currentDate.startOf('day').valueOf(); 490 + return currentDate.startOf('day');
526 case QuickTimeInterval.DAY_BEFORE_YESTERDAY: 491 case QuickTimeInterval.DAY_BEFORE_YESTERDAY:
527 currentDate.subtract(2, 'days'); 492 currentDate.subtract(2, 'days');
528 - return currentDate.startOf('day').valueOf(); 493 + return currentDate.startOf('day');
529 case QuickTimeInterval.THIS_DAY_LAST_WEEK: 494 case QuickTimeInterval.THIS_DAY_LAST_WEEK:
530 currentDate.subtract(1, 'weeks'); 495 currentDate.subtract(1, 'weeks');
531 - return currentDate.startOf('day').valueOf(); 496 + return currentDate.startOf('day');
532 case QuickTimeInterval.PREVIOUS_WEEK: 497 case QuickTimeInterval.PREVIOUS_WEEK:
533 currentDate.subtract(1, 'weeks'); 498 currentDate.subtract(1, 'weeks');
534 - return currentDate.startOf('week').valueOf(); 499 + return currentDate.startOf('week');
535 case QuickTimeInterval.PREVIOUS_WEEK_ISO: 500 case QuickTimeInterval.PREVIOUS_WEEK_ISO:
536 currentDate.subtract(1, 'weeks'); 501 currentDate.subtract(1, 'weeks');
537 - return currentDate.startOf('isoWeek').valueOf(); 502 + return currentDate.startOf('isoWeek');
538 case QuickTimeInterval.PREVIOUS_MONTH: 503 case QuickTimeInterval.PREVIOUS_MONTH:
539 currentDate.subtract(1, 'months'); 504 currentDate.subtract(1, 'months');
540 - return currentDate.startOf('month').valueOf(); 505 + return currentDate.startOf('month');
541 case QuickTimeInterval.PREVIOUS_YEAR: 506 case QuickTimeInterval.PREVIOUS_YEAR:
542 currentDate.subtract(1, 'years'); 507 currentDate.subtract(1, 'years');
543 - return currentDate.startOf('year').valueOf(); 508 + return currentDate.startOf('year');
544 case QuickTimeInterval.CURRENT_HOUR: 509 case QuickTimeInterval.CURRENT_HOUR:
545 - return currentDate.startOf('hour').valueOf(); 510 + return currentDate.startOf('hour');
546 case QuickTimeInterval.CURRENT_DAY: 511 case QuickTimeInterval.CURRENT_DAY:
547 case QuickTimeInterval.CURRENT_DAY_SO_FAR: 512 case QuickTimeInterval.CURRENT_DAY_SO_FAR:
548 - return currentDate.startOf('day').valueOf(); 513 + return currentDate.startOf('day');
549 case QuickTimeInterval.CURRENT_WEEK: 514 case QuickTimeInterval.CURRENT_WEEK:
550 case QuickTimeInterval.CURRENT_WEEK_SO_FAR: 515 case QuickTimeInterval.CURRENT_WEEK_SO_FAR:
551 - return currentDate.startOf('week').valueOf(); 516 + return currentDate.startOf('week');
552 case QuickTimeInterval.CURRENT_WEEK_ISO: 517 case QuickTimeInterval.CURRENT_WEEK_ISO:
553 case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR: 518 case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR:
554 - return currentDate.startOf('isoWeek').valueOf(); 519 + return currentDate.startOf('isoWeek');
555 case QuickTimeInterval.CURRENT_MONTH: 520 case QuickTimeInterval.CURRENT_MONTH:
556 case QuickTimeInterval.CURRENT_MONTH_SO_FAR: 521 case QuickTimeInterval.CURRENT_MONTH_SO_FAR:
557 - return currentDate.startOf('month').valueOf(); 522 + return currentDate.startOf('month');
558 case QuickTimeInterval.CURRENT_YEAR: 523 case QuickTimeInterval.CURRENT_YEAR:
559 case QuickTimeInterval.CURRENT_YEAR_SO_FAR: 524 case QuickTimeInterval.CURRENT_YEAR_SO_FAR:
560 - return currentDate.startOf('year').valueOf(); 525 + return currentDate.startOf('year');
  526 + }
  527 +}
  528 +
  529 +export function calculateIntervalEndTime(interval: QuickTimeInterval, startDate: moment_.Moment, tz?: string): number {
  530 + switch (interval) {
  531 + case QuickTimeInterval.YESTERDAY:
  532 + case QuickTimeInterval.DAY_BEFORE_YESTERDAY:
  533 + case QuickTimeInterval.THIS_DAY_LAST_WEEK:
  534 + case QuickTimeInterval.CURRENT_DAY:
  535 + return startDate.add(1, 'day').valueOf();
  536 + case QuickTimeInterval.PREVIOUS_WEEK:
  537 + case QuickTimeInterval.PREVIOUS_WEEK_ISO:
  538 + case QuickTimeInterval.CURRENT_WEEK:
  539 + case QuickTimeInterval.CURRENT_WEEK_ISO:
  540 + return startDate.add(1, 'week').valueOf();
  541 + case QuickTimeInterval.PREVIOUS_MONTH:
  542 + case QuickTimeInterval.CURRENT_MONTH:
  543 + return startDate.add(1, 'month').valueOf();
  544 + case QuickTimeInterval.PREVIOUS_YEAR:
  545 + case QuickTimeInterval.CURRENT_YEAR:
  546 + return startDate.add(1, 'year').valueOf();
  547 + case QuickTimeInterval.CURRENT_HOUR:
  548 + return startDate.add(1, 'hour').valueOf();
  549 + case QuickTimeInterval.CURRENT_DAY_SO_FAR:
  550 + case QuickTimeInterval.CURRENT_WEEK_SO_FAR:
  551 + case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR:
  552 + case QuickTimeInterval.CURRENT_MONTH_SO_FAR:
  553 + case QuickTimeInterval.CURRENT_YEAR_SO_FAR:
  554 + return getCurrentTime(tz).valueOf();
561 } 555 }
562 } 556 }
563 557
@@ -590,82 +584,58 @@ export function quickTimeIntervalPeriod(interval: QuickTimeInterval): number { @@ -590,82 +584,58 @@ export function quickTimeIntervalPeriod(interval: QuickTimeInterval): number {
590 } 584 }
591 585
592 export function calculateIntervalComparisonStartTime(interval: QuickTimeInterval, 586 export function calculateIntervalComparisonStartTime(interval: QuickTimeInterval,
593 - currentDate: moment_.Moment): number { 587 + startDate: moment_.Moment): moment_.Moment {
594 switch (interval) { 588 switch (interval) {
595 case QuickTimeInterval.YESTERDAY: 589 case QuickTimeInterval.YESTERDAY:
596 case QuickTimeInterval.DAY_BEFORE_YESTERDAY: 590 case QuickTimeInterval.DAY_BEFORE_YESTERDAY:
597 case QuickTimeInterval.CURRENT_DAY: 591 case QuickTimeInterval.CURRENT_DAY:
598 case QuickTimeInterval.CURRENT_DAY_SO_FAR: 592 case QuickTimeInterval.CURRENT_DAY_SO_FAR:
599 - currentDate.subtract(1, 'days');  
600 - return currentDate.startOf('day').valueOf(); 593 + startDate.subtract(1, 'days');
  594 + return startDate.startOf('day');
601 case QuickTimeInterval.THIS_DAY_LAST_WEEK: 595 case QuickTimeInterval.THIS_DAY_LAST_WEEK:
602 - currentDate.subtract(1, 'weeks');  
603 - return currentDate.startOf('day').valueOf(); 596 + startDate.subtract(1, 'weeks');
  597 + return startDate.startOf('day');
604 case QuickTimeInterval.PREVIOUS_WEEK: 598 case QuickTimeInterval.PREVIOUS_WEEK:
605 case QuickTimeInterval.CURRENT_WEEK: 599 case QuickTimeInterval.CURRENT_WEEK:
606 case QuickTimeInterval.CURRENT_WEEK_SO_FAR: 600 case QuickTimeInterval.CURRENT_WEEK_SO_FAR:
607 - currentDate.subtract(1, 'weeks');  
608 - return currentDate.startOf('week').valueOf(); 601 + startDate.subtract(1, 'weeks');
  602 + return startDate.startOf('week');
609 case QuickTimeInterval.PREVIOUS_WEEK_ISO: 603 case QuickTimeInterval.PREVIOUS_WEEK_ISO:
610 case QuickTimeInterval.CURRENT_WEEK_ISO: 604 case QuickTimeInterval.CURRENT_WEEK_ISO:
611 case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR: 605 case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR:
612 - currentDate.subtract(1, 'weeks');  
613 - return currentDate.startOf('isoWeek').valueOf(); 606 + startDate.subtract(1, 'weeks');
  607 + return startDate.startOf('isoWeek');
614 case QuickTimeInterval.PREVIOUS_MONTH: 608 case QuickTimeInterval.PREVIOUS_MONTH:
615 case QuickTimeInterval.CURRENT_MONTH: 609 case QuickTimeInterval.CURRENT_MONTH:
616 case QuickTimeInterval.CURRENT_MONTH_SO_FAR: 610 case QuickTimeInterval.CURRENT_MONTH_SO_FAR:
617 - currentDate.subtract(1, 'months');  
618 - return currentDate.startOf('month').valueOf(); 611 + startDate.subtract(1, 'months');
  612 + return startDate.startOf('month');
619 case QuickTimeInterval.PREVIOUS_YEAR: 613 case QuickTimeInterval.PREVIOUS_YEAR:
620 case QuickTimeInterval.CURRENT_YEAR: 614 case QuickTimeInterval.CURRENT_YEAR:
621 case QuickTimeInterval.CURRENT_YEAR_SO_FAR: 615 case QuickTimeInterval.CURRENT_YEAR_SO_FAR:
622 - currentDate.subtract(1, 'years');  
623 - return currentDate.startOf('year').valueOf(); 616 + startDate.subtract(1, 'years');
  617 + return startDate.startOf('year');
624 case QuickTimeInterval.CURRENT_HOUR: 618 case QuickTimeInterval.CURRENT_HOUR:
625 - currentDate.subtract(1, 'hour');  
626 - return currentDate.startOf('hour').valueOf(); 619 + startDate.subtract(1, 'hour');
  620 + return startDate.startOf('hour');
627 } 621 }
628 } 622 }
629 623
630 export function calculateIntervalComparisonEndTime(interval: QuickTimeInterval, 624 export function calculateIntervalComparisonEndTime(interval: QuickTimeInterval,
631 - currentDate: moment_.Moment): number { 625 + comparisonStartDate: moment_.Moment,
  626 + endDate: moment_.Moment): number {
632 switch (interval) { 627 switch (interval) {
633 - case QuickTimeInterval.YESTERDAY:  
634 - case QuickTimeInterval.DAY_BEFORE_YESTERDAY:  
635 - case QuickTimeInterval.CURRENT_DAY:  
636 - currentDate.subtract(1, 'days');  
637 - return currentDate.endOf('day').valueOf();  
638 case QuickTimeInterval.CURRENT_DAY_SO_FAR: 628 case QuickTimeInterval.CURRENT_DAY_SO_FAR:
639 - return currentDate.subtract(1, 'days').valueOf();  
640 - case QuickTimeInterval.THIS_DAY_LAST_WEEK:  
641 - currentDate.subtract(1, 'weeks');  
642 - return currentDate.endOf('day').valueOf();  
643 - case QuickTimeInterval.PREVIOUS_WEEK:  
644 - case QuickTimeInterval.CURRENT_WEEK:  
645 - currentDate.subtract(1, 'weeks');  
646 - return currentDate.endOf('week').valueOf();  
647 - case QuickTimeInterval.PREVIOUS_WEEK_ISO:  
648 - case QuickTimeInterval.CURRENT_WEEK_ISO:  
649 - currentDate.subtract(1, 'weeks');  
650 - return currentDate.endOf('isoWeek').valueOf(); 629 + return endDate.subtract(1, 'days').valueOf();
651 case QuickTimeInterval.CURRENT_WEEK_SO_FAR: 630 case QuickTimeInterval.CURRENT_WEEK_SO_FAR:
652 case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR: 631 case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR:
653 - return currentDate.subtract(1, 'week').valueOf();  
654 - case QuickTimeInterval.PREVIOUS_MONTH:  
655 - case QuickTimeInterval.CURRENT_MONTH:  
656 - currentDate.subtract(1, 'months');  
657 - return currentDate.endOf('month').valueOf(); 632 + return endDate.subtract(1, 'week').valueOf();
658 case QuickTimeInterval.CURRENT_MONTH_SO_FAR: 633 case QuickTimeInterval.CURRENT_MONTH_SO_FAR:
659 - return currentDate.subtract(1, 'month').valueOf();  
660 - case QuickTimeInterval.PREVIOUS_YEAR:  
661 - case QuickTimeInterval.CURRENT_YEAR:  
662 - currentDate.subtract(1, 'years');  
663 - return currentDate.endOf('year').valueOf(); 634 + return endDate.subtract(1, 'month').valueOf();
664 case QuickTimeInterval.CURRENT_YEAR_SO_FAR: 635 case QuickTimeInterval.CURRENT_YEAR_SO_FAR:
665 - return currentDate.subtract(1, 'year').valueOf();  
666 - case QuickTimeInterval.CURRENT_HOUR:  
667 - currentDate.subtract(1, 'hour');  
668 - return currentDate.endOf('hour').valueOf(); 636 + return endDate.subtract(1, 'year').valueOf();
  637 + default:
  638 + return calculateIntervalEndTime(interval, comparisonStartDate);
669 } 639 }
670 } 640 }
671 641
@@ -689,8 +659,9 @@ export function createTimewindowForComparison(subscriptionTimewindow: Subscripti @@ -689,8 +659,9 @@ export function createTimewindowForComparison(subscriptionTimewindow: Subscripti
689 startDate.tz(subscriptionTimewindow.timezone); 659 startDate.tz(subscriptionTimewindow.timezone);
690 endDate.tz(subscriptionTimewindow.timezone); 660 endDate.tz(subscriptionTimewindow.timezone);
691 } 661 }
692 - startTimeMs = calculateIntervalComparisonStartTime(subscriptionTimewindow.quickInterval, startDate);  
693 - endTimeMs = calculateIntervalComparisonEndTime(subscriptionTimewindow.quickInterval, endDate); 662 + const comparisonStartDate = calculateIntervalComparisonStartTime(subscriptionTimewindow.quickInterval, startDate);
  663 + startTimeMs = comparisonStartDate.valueOf();
  664 + endTimeMs = calculateIntervalComparisonEndTime(subscriptionTimewindow.quickInterval, comparisonStartDate, endDate);
694 } else { 665 } else {
695 const timeInterval = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs; 666 const timeInterval = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs;
696 endTimeMs = subscriptionTimewindow.fixedWindow.startTimeMs; 667 endTimeMs = subscriptionTimewindow.fixedWindow.startTimeMs;
@@ -730,22 +701,6 @@ export function cloneSelectedTimewindow(timewindow: Timewindow): Timewindow { @@ -730,22 +701,6 @@ export function cloneSelectedTimewindow(timewindow: Timewindow): Timewindow {
730 return cloned; 701 return cloned;
731 } 702 }
732 703
733 -export function cloneSelectedHistoryTimewindow(historyWindow: HistoryWindow): HistoryWindow {  
734 - const cloned: HistoryWindow = {};  
735 - if (isDefined(historyWindow.historyType)) {  
736 - cloned.historyType = historyWindow.historyType;  
737 - cloned.interval = historyWindow.interval;  
738 - if (historyWindow.historyType === HistoryWindowType.LAST_INTERVAL) {  
739 - cloned.timewindowMs = historyWindow.timewindowMs;  
740 - } else if (historyWindow.historyType === HistoryWindowType.INTERVAL) {  
741 - cloned.quickInterval = historyWindow.quickInterval;  
742 - } else if (historyWindow.historyType === HistoryWindowType.FIXED) {  
743 - cloned.fixedTimewindow = deepClone(historyWindow.fixedTimewindow);  
744 - }  
745 - }  
746 - return cloned;  
747 -}  
748 -  
749 export interface TimeInterval { 704 export interface TimeInterval {
750 name: string; 705 name: string;
751 translateParams: {[key: string]: any}; 706 translateParams: {[key: string]: any};
@@ -927,6 +882,14 @@ export function getCurrentTime(tz?: string): moment_.Moment { @@ -927,6 +882,14 @@ export function getCurrentTime(tz?: string): moment_.Moment {
927 } 882 }
928 } 883 }
929 884
  885 +export function getTime(ts: number, tz?: string): moment_.Moment {
  886 + if (tz) {
  887 + return moment(ts).tz(tz);
  888 + } else {
  889 + return moment(ts);
  890 + }
  891 +}
  892 +
930 export function getTimezone(tz: string): moment_.Moment { 893 export function getTimezone(tz: string): moment_.Moment {
931 return moment.tz(tz); 894 return moment.tz(tz);
932 } 895 }