import React, { Component } from 'react'; import { Unsubscribable } from 'rxjs'; import { dateMath, TimeRange, TimeZone } from '@grafana/data'; import { TimeRangeUpdatedEvent } from '@grafana/runtime'; import { defaultIntervals, RefreshPicker, ToolbarButtonRow } from '@grafana/ui'; import { TimePickerWithHistory } from 'app/core/components/TimePicker/TimePickerWithHistory'; import { appEvents } from 'app/core/core'; import { getTimeSrv } from 'app/features/dashboard/services/TimeSrv'; import { ShiftTimeEvent, ShiftTimeEventDirection, ZoomOutEvent } from '../../../../types/events'; import { DashboardModel } from '../../state'; export interface Props { dashboard: DashboardModel; onChangeTimeZone: (timeZone: TimeZone) => void; } export class DashNavTimeControls extends Component { private sub?: Unsubscribable; componentDidMount() { this.sub = this.props.dashboard.events.subscribe(TimeRangeUpdatedEvent, () => this.forceUpdate()); } componentWillUnmount() { this.sub?.unsubscribe(); } onChangeRefreshInterval = (interval: string) => { getTimeSrv().setAutoRefresh(interval); this.forceUpdate(); }; onRefresh = () => { getTimeSrv().refreshTimeModel(); return Promise.resolve(); }; onMoveBack = () => { appEvents.publish(new ShiftTimeEvent({ direction: ShiftTimeEventDirection.Left })); }; onMoveForward = () => { appEvents.publish(new ShiftTimeEvent({ direction: ShiftTimeEventDirection.Right })); }; 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(); }; onChangeFiscalYearStartMonth = (month: number) => { this.props.dashboard.fiscalYearStartMonth = month; this.onRefresh(); }; onZoom = () => { appEvents.publish(new ZoomOutEvent({ scale: 2 })); }; render() { const { dashboard } = this.props; const { refresh_intervals } = dashboard.timepicker; const intervals = getTimeSrv().getValidIntervals(refresh_intervals || defaultIntervals); const timePickerValue = getTimeSrv().timeRange(); const timeZone = dashboard.getTimezone(); const fiscalYearStartMonth = dashboard.fiscalYearStartMonth; const hideIntervalPicker = dashboard.panelInEdit?.isEditing; return ( ); } }