DashNavTimeControls.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // Libaries
  2. import React, { Component } from 'react';
  3. import { toUtc, dateMath } from '@grafana/data';
  4. // Types
  5. import { DashboardModel } from '../../state';
  6. import { LocationState } from 'app/types';
  7. import { TimeRange, TimeOption, RawTimeRange } from '@grafana/data';
  8. // State
  9. import { updateLocation } from 'app/core/actions';
  10. // Components
  11. import { TimePicker, RefreshPicker } from '@grafana/ui';
  12. // Utils & Services
  13. import { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';
  14. import { defaultSelectOptions } from '@grafana/ui/src/components/TimePicker/TimePicker';
  15. import { getShiftedTimeRange } from 'app/core/utils/timePicker';
  16. export interface Props {
  17. $injector: any;
  18. dashboard: DashboardModel;
  19. updateLocation: typeof updateLocation;
  20. location: LocationState;
  21. }
  22. export class DashNavTimeControls extends Component<Props> {
  23. timeSrv: TimeSrv = getTimeSrv();
  24. $rootScope = this.props.$injector.get('$rootScope');
  25. get refreshParamInUrl(): string {
  26. return this.props.location.query.refresh as string;
  27. }
  28. onChangeRefreshInterval = (interval: string) => {
  29. this.timeSrv.setAutoRefresh(interval);
  30. this.forceUpdate();
  31. };
  32. onRefresh = () => {
  33. this.timeSrv.refreshDashboard();
  34. return Promise.resolve();
  35. };
  36. onMoveTimePicker = (direction: number) => {
  37. const range = this.timeSrv.timeRange();
  38. const { from, to } = getShiftedTimeRange(direction, range);
  39. this.timeSrv.setTime({
  40. from: toUtc(from),
  41. to: toUtc(to),
  42. });
  43. };
  44. onMoveForward = () => this.onMoveTimePicker(1);
  45. onMoveBack = () => this.onMoveTimePicker(-1);
  46. onChangeTimePicker = (timeRange: TimeRange) => {
  47. const { dashboard } = this.props;
  48. const panel = dashboard.timepicker;
  49. const hasDelay = panel.nowDelay && timeRange.raw.to === 'now';
  50. const adjustedFrom = dateMath.isMathString(timeRange.raw.from) ? timeRange.raw.from : timeRange.from;
  51. const adjustedTo = dateMath.isMathString(timeRange.raw.to) ? timeRange.raw.to : timeRange.to;
  52. const nextRange = {
  53. from: adjustedFrom,
  54. to: hasDelay ? 'now-' + panel.nowDelay : adjustedTo,
  55. };
  56. this.timeSrv.setTime(nextRange);
  57. };
  58. onZoom = () => {
  59. this.$rootScope.appEvent('zoom-out', 2);
  60. };
  61. setActiveTimeOption = (timeOptions: TimeOption[], rawTimeRange: RawTimeRange): TimeOption[] => {
  62. return timeOptions.map(option => {
  63. if (option.to === rawTimeRange.to && option.from === rawTimeRange.from) {
  64. return {
  65. ...option,
  66. active: true,
  67. };
  68. }
  69. return {
  70. ...option,
  71. active: false,
  72. };
  73. });
  74. };
  75. render() {
  76. const { dashboard } = this.props;
  77. const intervals = dashboard.timepicker.refresh_intervals;
  78. const timePickerValue = this.timeSrv.timeRange();
  79. const timeZone = dashboard.getTimezone();
  80. return (
  81. <div className="dashboard-timepicker-wrapper">
  82. <TimePicker
  83. value={timePickerValue}
  84. onChange={this.onChangeTimePicker}
  85. timeZone={timeZone}
  86. onMoveBackward={this.onMoveBack}
  87. onMoveForward={this.onMoveForward}
  88. onZoom={this.onZoom}
  89. selectOptions={this.setActiveTimeOption(defaultSelectOptions, timePickerValue.raw)}
  90. />
  91. <RefreshPicker
  92. onIntervalChanged={this.onChangeRefreshInterval}
  93. onRefresh={this.onRefresh}
  94. value={dashboard.refresh}
  95. intervals={intervals}
  96. tooltip="Refresh dashboard"
  97. />
  98. </div>
  99. );
  100. }
  101. }