Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix time range filter dropdown #6223

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ const TYPES = Object.freeze({
CUSTOM_START_END: 'custom_start_end',
CUSTOM_RANGE: 'custom_range',
});
const TABS = Object.freeze({
DEFAULTS: 'defaults',
CUSTOM: 'custom',
});
const RELATIVE_TIME_OPTIONS = Object.freeze({
LAST: 'Last',
NEXT: 'Next',
Expand Down Expand Up @@ -78,12 +82,13 @@ function isValidMoment(s) {

function getStateFromSeparator(value) {
const [since, until] = value.split(SEPARATOR, 2);
return { since, until, type: TYPES.CUSTOM_START_END };
return { since, until, type: TYPES.CUSTOM_START_END, tab: TABS.CUSTOM };
}

function getStateFromCommonTimeFrame(value) {
const units = value.split(' ')[1] + 's';
return {
tab: TABS.DEFAULTS,
type: TYPES.DEFAULTS,
common: value,
since: moment().startOf('day').subtract(1, units).format(MOMENT_FORMAT),
Expand All @@ -109,6 +114,7 @@ function getStateFromCustomRange(value) {
since = moment().startOf('day').format(MOMENT_FORMAT);
}
return {
tab: TABS.CUSTOM,
type: TYPES.CUSTOM_RANGE,
common: null,
rel,
Expand All @@ -124,6 +130,7 @@ export default class DateFilterControl extends React.Component {
super(props);
this.state = {
type: TYPES.DEFAULTS,
tab: TABS.DEFAULTS,

// default time frames, for convenience
common: COMMON_TIME_FRAMES[0],
Expand All @@ -145,6 +152,15 @@ export default class DateFilterControl extends React.Component {
untilViewMode: 'days',
};

const value = props.value;
if (value.indexOf(SEPARATOR) >= 0) {
this.state = { ...this.state, ...getStateFromSeparator(value) };
} else if (COMMON_TIME_FRAMES.indexOf(value) >= 0) {
this.state = { ...this.state, ...getStateFromCommonTimeFrame(value) };
} else {
this.state = { ...this.state, ...getStateFromCustomRange(value) };
}

this.close = this.close.bind(this);
this.handleClick = this.handleClick.bind(this);
this.isValidSince = this.isValidSince.bind(this);
Expand All @@ -156,18 +172,13 @@ export default class DateFilterControl extends React.Component {
this.setTypeCustomRange = this.setTypeCustomRange.bind(this);
this.setTypeCustomStartEnd = this.setTypeCustomStartEnd.bind(this);
this.toggleCalendar = this.toggleCalendar.bind(this);
this.changeTab = this.changeTab.bind(this);
}

componentDidMount() {
const value = this.props.value;
if (value.indexOf(SEPARATOR) >= 0) {
this.state = { ...this.state, ...getStateFromSeparator(value) };
} else if (COMMON_TIME_FRAMES.indexOf(value) >= 0) {
this.state = { ...this.state, ...getStateFromCommonTimeFrame(value) };
} else {
this.state = { ...this.state, ...getStateFromCustomRange(value) };
}
document.addEventListener('click', this.handleClick);
}

componentWillUnmount() {
document.removeEventListener('click', this.handleClick);
}
Expand Down Expand Up @@ -201,6 +212,16 @@ export default class DateFilterControl extends React.Component {
setTypeCustomStartEnd() {
this.setState({ type: TYPES.CUSTOM_START_END });
}

changeTab() {
const { tab } = this.state;
if (tab === TABS.CUSTOM) {
this.setState({ tab: TABS.DEFAULTS });
} else if (tab === TABS.DEFAULTS) {
this.setState({ tab: TABS.CUSTOM });
}
}

handleClick(e) {
// switch to `TYPES.CUSTOM_START_END` when the calendar is clicked
if (this.startEndSectionRef && this.startEndSectionRef.contains(e.target)) {
Expand All @@ -209,7 +230,7 @@ export default class DateFilterControl extends React.Component {
}
close() {
let val;
if (this.state.type === TYPES.DEFAULTS) {
if (this.state.type === TYPES.DEFAULTS || this.state.tab === TABS.DEFAULTS) {
val = this.state.common;
} else if (this.state.type === TYPES.CUSTOM_RANGE) {
val = `${this.state.rel} ${this.state.num} ${this.state.grain}`;
Expand Down Expand Up @@ -285,9 +306,10 @@ export default class DateFilterControl extends React.Component {
<Popover id="filter-popover" placement="top" positionTop={0}>
<div style={{ width: '250px' }}>
<Tabs
defaultActiveKey={this.state.type === TYPES.DEFAULTS ? 1 : 2}
defaultActiveKey={this.state.tab === TABS.DEFAULTS ? 1 : 2}
id="type"
className="time-filter-tabs"
onSelect={this.changeTab}
>
<Tab eventKey={1} title="Defaults">
<FormGroup>{timeFrames}</FormGroup>
Expand Down