ExploreTimeControls.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Libaries
  2. import React, { Component } from 'react';
  3. // Types
  4. import { ExploreId } from 'app/types';
  5. import { TimeRange, TimeOption, TimeZone, RawTimeRange, dateTimeForTimeZone } from '@grafana/data';
  6. // State
  7. // Components
  8. import { TimePicker, RefreshPicker, SetInterval } from '@grafana/ui';
  9. // Utils & Services
  10. import { defaultSelectOptions } from '@grafana/ui/src/components/TimePicker/TimePicker';
  11. import { getShiftedTimeRange, getZoomedTimeRange } from 'app/core/utils/timePicker';
  12. export interface Props {
  13. exploreId: ExploreId;
  14. hasLiveOption: boolean;
  15. isLive: boolean;
  16. loading: boolean;
  17. range: TimeRange;
  18. refreshInterval: string;
  19. timeZone: TimeZone;
  20. onRunQuery: () => void;
  21. onChangeRefreshInterval: (interval: string) => void;
  22. onChangeTime: (range: RawTimeRange) => void;
  23. }
  24. export class ExploreTimeControls extends Component<Props> {
  25. onMoveTimePicker = (direction: number) => {
  26. const { range, onChangeTime, timeZone } = this.props;
  27. const { from, to } = getShiftedTimeRange(direction, range);
  28. const nextTimeRange = {
  29. from: dateTimeForTimeZone(timeZone, from),
  30. to: dateTimeForTimeZone(timeZone, to),
  31. };
  32. onChangeTime(nextTimeRange);
  33. };
  34. onMoveForward = () => this.onMoveTimePicker(1);
  35. onMoveBack = () => this.onMoveTimePicker(-1);
  36. onChangeTimePicker = (timeRange: TimeRange) => {
  37. this.props.onChangeTime(timeRange.raw);
  38. };
  39. onZoom = () => {
  40. const { range, onChangeTime, timeZone } = this.props;
  41. const { from, to } = getZoomedTimeRange(range, 2);
  42. const nextTimeRange = {
  43. from: dateTimeForTimeZone(timeZone, from),
  44. to: dateTimeForTimeZone(timeZone, to),
  45. };
  46. onChangeTime(nextTimeRange);
  47. };
  48. setActiveTimeOption = (timeOptions: TimeOption[], rawTimeRange: RawTimeRange): TimeOption[] => {
  49. return timeOptions.map(option => {
  50. if (option.to === rawTimeRange.to && option.from === rawTimeRange.from) {
  51. return {
  52. ...option,
  53. active: true,
  54. };
  55. }
  56. return {
  57. ...option,
  58. active: false,
  59. };
  60. });
  61. };
  62. render() {
  63. const {
  64. hasLiveOption,
  65. isLive,
  66. loading,
  67. range,
  68. refreshInterval,
  69. timeZone,
  70. onRunQuery,
  71. onChangeRefreshInterval,
  72. } = this.props;
  73. return (
  74. <>
  75. {!isLive && (
  76. <TimePicker
  77. value={range}
  78. onChange={this.onChangeTimePicker}
  79. timeZone={timeZone}
  80. onMoveBackward={this.onMoveBack}
  81. onMoveForward={this.onMoveForward}
  82. onZoom={this.onZoom}
  83. selectOptions={this.setActiveTimeOption(defaultSelectOptions, range.raw)}
  84. />
  85. )}
  86. <RefreshPicker
  87. onIntervalChanged={onChangeRefreshInterval}
  88. onRefresh={onRunQuery}
  89. value={refreshInterval}
  90. tooltip="Refresh"
  91. hasLiveOption={hasLiveOption}
  92. />
  93. {refreshInterval && <SetInterval func={onRunQuery} interval={refreshInterval} loading={loading} />}
  94. </>
  95. );
  96. }
  97. }