Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | 1x 65x 65x 65x 57x 65x 30x 30x 35x 35x 28x 5x 2x 37x 65x 65x 149x 149x 149x 149x 149x | /**
* Copyright (c) Siemens 2016 - 2025
* SPDX-License-Identifier: MIT
*/
import { Injectable } from '@angular/core';
import { DateRangeFilter, ResolvedDateRange } from './si-date-range-filter.types';
export interface ResolveDateRangeOptions {
/**
* Resolve time? When set to false, hours/minutes/seconds/ms are set to zero
* @defaultValue true
**/
withTime?: boolean;
/**
* Skip normalization? When skipped, `point1` will always be `start`, `point2` will be `end`
*/
skipNormalization?: boolean;
}
/**
* Service to transform and calculate with DateRangeFilter objects.
*/
@Injectable({ providedIn: 'root' })
export class SiDateRangeCalculationService {
/**
* Calculates the start and end dates of a DateRangeFilter.
* @param filter - The date range filter object to be resolved.
* @param options - Options for time handling
* @returns The resolved result in form of a ResolvedDateRange object.
*/
resolveDateRangeFilter(
filter: DateRangeFilter,
options?: ResolveDateRangeOptions
): ResolvedDateRange {
const ref = filter.point1 === 'now' ? new Date() : new Date(filter.point1);
const withTime = options?.withTime ?? true;
if (!withTime) {
this.removeTime(ref);
}
if (filter.point2 instanceof Date) {
const point2 = withTime ? filter.point2 : this.removeTime(new Date(filter.point2));
return this.normalize(ref, point2, options?.skipNormalization);
}
const offset = filter.point2;
switch (filter.range) {
case undefined:
case 'before':
return this.normalize(ref, this.datePlusOffset(ref, -offset), options?.skipNormalization);
case 'after':
return this.normalize(ref, this.datePlusOffset(ref, offset), options?.skipNormalization);
case 'within':
return this.normalize(
this.datePlusOffset(ref, -offset),
this.datePlusOffset(ref, offset),
options?.skipNormalization
);
}
}
private datePlusOffset(date: Date, offset: number): Date {
return new Date(date.getTime() + offset);
}
private normalize(date1: Date, date2: Date, skip?: boolean): ResolvedDateRange {
const valid = !isNaN(date1.getTime()) && !isNaN(date2.getTime());
return skip
? { start: date1, end: date2, valid }
: date1 < date2
? { start: date1, end: date2, valid }
: { start: date2, end: date1, valid };
}
/**
* Utility to reset the time attributes to 0 (hours/minutes/seconds/milliseconds).
*/
removeTime(date: Date): Date {
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0);
return date;
}
}
|