grafana/public/app/features/dashboard/components/DashNav/DashNavTimeControls.tsx
Josh Hunt 5361efc225
I18n: Migrate to I18next (#55845)
* Switch from lingui from i18next

* Change lingui messages to i18next messages

* Change lingui messages to i18next messages (grafana-ui)

* Init i18n for tests
2022-10-06 16:34:04 +01:00

129 lines
4.3 KiB
TypeScript

import React, { Component } from 'react';
import { Unsubscribable } from 'rxjs';
import { dateMath, TimeRange, TimeZone } from '@grafana/data';
import { TimeRangeUpdatedEvent } from '@grafana/runtime';
import { defaultIntervals, RefreshPicker } from '@grafana/ui';
import { TimePickerWithHistory } from 'app/core/components/TimePicker/TimePickerWithHistory';
import { appEvents } from 'app/core/core';
import { t } from 'app/core/internationalization';
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;
isOnCanvas?: boolean;
}
export class DashNavTimeControls extends Component<Props> {
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, isOnCanvas } = 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 (
<>
<TimePickerWithHistory
value={timePickerValue}
onChange={this.onChangeTimePicker}
timeZone={timeZone}
fiscalYearStartMonth={fiscalYearStartMonth}
onMoveBackward={this.onMoveBack}
onMoveForward={this.onMoveForward}
onZoom={this.onZoom}
onChangeTimeZone={this.onChangeTimeZone}
onChangeFiscalYearStartMonth={this.onChangeFiscalYearStartMonth}
isOnCanvas={isOnCanvas}
/>
<RefreshPicker
onIntervalChanged={this.onChangeRefreshInterval}
onRefresh={this.onRefresh}
value={dashboard.refresh}
intervals={intervals}
isOnCanvas={isOnCanvas}
tooltip={t('dashboard.toolbar.refresh', 'Refresh dashboard')}
noIntervalPicker={hideIntervalPicker}
offDescriptionAriaLabelMsg={t(
'dashboard.refresh-picker.off-description',
'Auto refresh turned off. Choose refresh time interval'
)}
onDescriptionAriaLabelMsg={(durationAriaLabel) =>
t(
'dashboard.refresh-picker.on-description',
`Choose refresh time interval with current interval ${durationAriaLabel} selected`
)
}
offOptionLabelMsg={t('dashboard.refresh-picker.off-label', 'Off')}
offOptionAriaLabelMsg={t('dashboard.refresh-picker.off-arialabel', 'Turn off auto refresh')}
/>
</>
);
}
}