// Libraries import React, { Component } from 'react'; import { dateMath, GrafanaTheme, TimeZone, TimeRange } from '@grafana/data'; import { css } from 'emotion'; // Types import { DashboardModel } from '../../state'; import { LocationState, CoreEvents } from 'app/types'; // Components import { RefreshPicker, withTheme, stylesFactory, Themeable, defaultIntervals } from '@grafana/ui'; import { TimePickerWithHistory } from 'app/core/components/TimePicker/TimePickerWithHistory'; // Utils & Services import { getTimeSrv } from 'app/features/dashboard/services/TimeSrv'; import { appEvents } from 'app/core/core'; export interface Props extends Themeable { dashboard: DashboardModel; location: LocationState; onChangeTimeZone: (timeZone: TimeZone) => void; } class UnthemedDashNavTimeControls extends Component { componentDidMount() { // Only reason for this is that sometimes time updates can happen via redux location changes // and this happens before timeSrv has had chance to update state (as it listens to angular route-updated) // This can be removed after timeSrv listens redux location this.props.dashboard.on(CoreEvents.timeRangeUpdated, this.triggerForceUpdate); } componentWillUnmount() { this.props.dashboard.off(CoreEvents.timeRangeUpdated, this.triggerForceUpdate); } triggerForceUpdate = () => { this.forceUpdate(); }; get refreshParamInUrl(): string { return this.props.location.query.refresh as string; } onChangeRefreshInterval = (interval: string) => { getTimeSrv().setAutoRefresh(interval); this.forceUpdate(); }; onRefresh = () => { getTimeSrv().refreshDashboard(); return Promise.resolve(); }; onMoveBack = () => { appEvents.emit(CoreEvents.shiftTime, -1); }; onMoveForward = () => { appEvents.emit(CoreEvents.shiftTime, 1); }; onChangeTimePicker = (timeRange: TimeRange) => { const { dashboard } = this.props; const panel = dashboard.timepicker; const hasDelay = panel.nowDelay && timeRange.raw.to === 'now'; const adjustedFrom = dateMath.isMathString(timeRange.raw.from) ? timeRange.raw.from : timeRange.from; const adjustedTo = dateMath.isMathString(timeRange.raw.to) ? timeRange.raw.to : timeRange.to; const nextRange = { from: adjustedFrom, to: hasDelay ? 'now-' + panel.nowDelay : adjustedTo, }; getTimeSrv().setTime(nextRange); }; onChangeTimeZone = (timeZone: TimeZone) => { this.props.dashboard.timezone = timeZone; this.props.onChangeTimeZone(timeZone); this.onRefresh(); }; onZoom = () => { appEvents.emit(CoreEvents.zoomOut, 2); }; render() { const { dashboard, theme } = this.props; const { refresh_intervals } = dashboard.timepicker; const intervals = getTimeSrv().getValidIntervals(refresh_intervals || defaultIntervals); const timePickerValue = getTimeSrv().timeRange(); const timeZone = dashboard.getTimezone(); const styles = getStyles(theme); return (
); } } export const DashNavTimeControls = withTheme(UnthemedDashNavTimeControls); const getStyles = stylesFactory((theme: GrafanaTheme) => { return { container: css` position: relative; display: flex; `, }; });