blob: 2a989d4b0152489cbd6f85c25fdcad3302639ce2 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
Component,
ViewChild,
ElementRef,
HostListener,
EventEmitter,
Output,
Input,
OnChanges,
SimpleChanges
} from '@angular/core';
import * as moment from 'moment/moment';
import { Filter } from '../../model/filter';
import {
DEFAULT_TIMESTAMP_FORMAT, CUSTOMM_DATE_RANGE_LABEL,
TIMESTAMP_FIELD_NAME, ALL_TIME
} from '../../utils/constants';
import { DateFilterValue } from '../../model/date-filter-value';
@Component({
selector: 'app-time-range',
templateUrl: './time-range.component.html',
styleUrls: ['./time-range.component.scss']
})
export class TimeRangeComponent implements OnChanges {
toDateStr = '';
fromDateStr = '';
datePickerFromDate = '';
datePickerToDate = '';
selectedTimeRangeValue = 'Last 15 minutes';
@Input() disabled = false;
@Input() selectedTimeRange: Filter;
@ViewChild('datePicker') datePicker: ElementRef;
@Output() timeRangeChange = new EventEmitter<Filter>();
readonly timeRangeMappingCol1 = {
'Last 7 days': 'last-7-days',
'Last 30 days': 'last-30-days',
'Last 60 days': 'last-60-days',
'Last 90 days': 'last-90-days',
'Last 6 months': 'last-6-months',
'Last 1 year': 'last-1-year',
'Last 2 years': 'last-2-years',
'Last 5 years': 'last-5-years'
};
readonly timeRangeMappingCol2 = {
'Yesterday': 'yesterday',
'Day before yesterday': 'day-before-yesterday',
'This day last week': 'this-day-last-week',
'Previous week': 'previous-week',
'Previous month': 'previous-month',
'Previous year': 'previous-year',
'All time': ALL_TIME
};
readonly timeRangeMappingCol3 = {
'Today': 'today',
'Today so far': 'today-so-far',
'This week': 'this-week',
'This week so far': 'this-week-so-far',
'This month': 'this-month',
'This year': 'this-year'
};
readonly timeRangeMappingCol4 = {
'Last 5 minutes': 'last-5-minutes',
'Last 15 minutes': 'last-15-minutes',
'Last 30 minutes': 'last-30-minutes',
'Last 1 hour': 'last-1-hour',
'Last 3 hours': 'last-3-hours',
'Last 6 hours': 'last-6-hours',
'Last 12 hours': 'last-12-hours',
'Last 24 hours': 'last-24-hours'
};
constructor() { }
ngOnChanges(changes: SimpleChanges) {
if (changes && changes['selectedTimeRange']) {
this.onSelectedTimeRangeChange();
}
}
onSelectedTimeRangeChange() {
let foundQuickRange = false;
const merged = Object.assign(
{},
this.timeRangeMappingCol1,
this.timeRangeMappingCol2,
this.timeRangeMappingCol3,
this.timeRangeMappingCol4
);
Object.keys(merged).forEach(key => {
if (this.selectedTimeRange.value === merged[key]) {
foundQuickRange = true;
this.selectedTimeRangeValue = key;
if (this.selectedTimeRange.dateFilterValue) {
this.toDateStr = moment(this.selectedTimeRange.dateFilterValue.toDate).format(DEFAULT_TIMESTAMP_FORMAT);
this.fromDateStr = moment(this.selectedTimeRange.dateFilterValue.fromDate).format(DEFAULT_TIMESTAMP_FORMAT);
this.datePickerFromDate = '';
this.datePickerToDate = '';
}
}
});
if (!foundQuickRange) {
this.selectedTimeRangeValue = CUSTOMM_DATE_RANGE_LABEL;
this.toDateStr = this.selectedTimeRange.dateFilterValue.toDate !== null ?
moment(this.selectedTimeRange.dateFilterValue.toDate).format(DEFAULT_TIMESTAMP_FORMAT) :
'now';
this.fromDateStr = moment(this.selectedTimeRange.dateFilterValue.fromDate).format(DEFAULT_TIMESTAMP_FORMAT);
this.datePickerFromDate = this.fromDateStr;
this.datePickerToDate = this.selectedTimeRange.dateFilterValue.toDate !== null ? this.toDateStr : '';
}
}
getTimeRangeStr() {
let mappingVal = this.timeRangeMappingCol1[this.selectedTimeRangeValue];
if (!mappingVal) {
mappingVal = this.timeRangeMappingCol2[this.selectedTimeRangeValue];
}
if (!mappingVal) {
mappingVal = this.timeRangeMappingCol3[this.selectedTimeRangeValue];
}
if (!mappingVal) {
mappingVal = this.timeRangeMappingCol4[this.selectedTimeRangeValue];
}
return mappingVal;
}
selectTimeRange($event, range: string) {
this.hideDatePicker();
this.selectedTimeRangeValue = $event.target.textContent.trim();
this.datePickerFromDate = '';
this.datePickerToDate = '';
this.timeRangeChange.emit(new Filter(TIMESTAMP_FIELD_NAME, range, false));
}
hideDatePicker() {
this.datePicker.nativeElement.classList.remove('show');
}
applyCustomDate() {
this.hideDatePicker();
this.selectedTimeRangeValue = CUSTOMM_DATE_RANGE_LABEL;
this.toDateStr = this.datePickerToDate.length > 0 ? moment(this.datePickerToDate).format(DEFAULT_TIMESTAMP_FORMAT) : 'now';
this.fromDateStr = moment(this.datePickerFromDate).format(DEFAULT_TIMESTAMP_FORMAT);
let toDate = this.datePickerToDate.length > 0 ? new Date(this.toDateStr).getTime() : new Date().getTime();
let fromDate = new Date(this.fromDateStr).getTime();
let toDateExpression = ' TO ' + toDate;
let value = '[' + fromDate + toDateExpression + ']';
let filter = new Filter(TIMESTAMP_FIELD_NAME, value, false);
filter.dateFilterValue = new DateFilterValue(fromDate, toDate);
this.timeRangeChange.emit(filter);
}
isPikaSelectElement(targetElement: HTMLElement): boolean {
while (targetElement) {
if (targetElement.classList.toString().startsWith('pika')){
return true;
}
targetElement = targetElement.parentElement;
}
return false;
}
@HostListener('document:click', ['$event', '$event.target'])
onClick(event: MouseEvent, targetElement: HTMLElement): void {
if (!targetElement) {
return;
}
if (this.isPikaSelectElement(targetElement)) {
return;
}
const clickedInside = this.datePicker.nativeElement.contains(targetElement);
if (!clickedInside) {
this.hideDatePicker();
}
}
}