DashNavTimeControls.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // Libaries
  2. import React, { Component } from 'react';
  3. import { toUtc } from '@grafana/ui/src/utils/moment_wrapper';
  4. // Types
  5. import { DashboardModel } from '../../state';
  6. import { LocationState } from 'app/types';
  7. import { TimeRange, TimeOption } from '@grafana/ui';
  8. // State
  9. import { updateLocation } from 'app/core/actions';
  10. // Components
  11. import { TimePicker, RefreshPicker, RawTimeRange } 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 nextRange = {
  51. from: timeRange.raw.from,
  52. to: hasDelay ? 'now-' + panel.nowDelay : timeRange.raw.to,
  53. };
  54. this.timeSrv.setTime(nextRange);
  55. };
  56. onZoom = () => {
  57. this.$rootScope.appEvent('zoom-out', 2);
  58. };
  59. setActiveTimeOption = (timeOptions: TimeOption[], rawTimeRange: RawTimeRange): TimeOption[] => {
  60. return timeOptions.map(option => {
  61. if (option.to === rawTimeRange.to && option.from === rawTimeRange.from) {
  62. return {
  63. ...option,
  64. active: true,
  65. };
  66. }
  67. return {
  68. ...option,
  69. active: false,
  70. };
  71. });
  72. };
  73. render() {
  74. const { dashboard } = this.props;
  75. const intervals = dashboard.timepicker.refresh_intervals;
  76. const timePickerValue = this.timeSrv.timeRange();
  77. const timeZone = dashboard.getTimezone();
  78. return (
  79. <>
  80. <TimePicker
  81. value={timePickerValue}
  82. onChange={this.onChangeTimePicker}
  83. timeZone={timeZone}
  84. onMoveBackward={this.onMoveBack}
  85. onMoveForward={this.onMoveForward}
  86. onZoom={this.onZoom}
  87. selectOptions={this.setActiveTimeOption(defaultSelectOptions, timePickerValue.raw)}
  88. />
  89. <RefreshPicker
  90. onIntervalChanged={this.onChangeRefreshInterval}
  91. onRefresh={this.onRefresh}
  92. value={dashboard.refresh}
  93. intervals={intervals}
  94. tooltip="Refresh dashboard"
  95. />
  96. </>
  97. );
  98. }
  99. }