ExploreTimeControls.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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 } 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. range: TimeRange;
  15. timeZone: TimeZone;
  16. onChangeTime: (range: RawTimeRange) => void;
  17. }
  18. export class ExploreTimeControls extends Component<Props> {
  19. onMoveTimePicker = (direction: number) => {
  20. const { range, onChangeTime, timeZone } = this.props;
  21. const { from, to } = getShiftedTimeRange(direction, range);
  22. const nextTimeRange = {
  23. from: dateTimeForTimeZone(timeZone, from),
  24. to: dateTimeForTimeZone(timeZone, to),
  25. };
  26. onChangeTime(nextTimeRange);
  27. };
  28. onMoveForward = () => this.onMoveTimePicker(1);
  29. onMoveBack = () => this.onMoveTimePicker(-1);
  30. onChangeTimePicker = (timeRange: TimeRange) => {
  31. this.props.onChangeTime(timeRange.raw);
  32. };
  33. onZoom = () => {
  34. const { range, onChangeTime, timeZone } = this.props;
  35. const { from, to } = getZoomedTimeRange(range, 2);
  36. const nextTimeRange = {
  37. from: dateTimeForTimeZone(timeZone, from),
  38. to: dateTimeForTimeZone(timeZone, to),
  39. };
  40. onChangeTime(nextTimeRange);
  41. };
  42. setActiveTimeOption = (timeOptions: TimeOption[], rawTimeRange: RawTimeRange): TimeOption[] => {
  43. return timeOptions.map(option => {
  44. if (option.to === rawTimeRange.to && option.from === rawTimeRange.from) {
  45. return {
  46. ...option,
  47. active: true,
  48. };
  49. }
  50. return {
  51. ...option,
  52. active: false,
  53. };
  54. });
  55. };
  56. render() {
  57. const { range, timeZone } = this.props;
  58. return (
  59. <TimePicker
  60. value={range}
  61. onChange={this.onChangeTimePicker}
  62. timeZone={timeZone}
  63. onMoveBackward={this.onMoveBack}
  64. onMoveForward={this.onMoveForward}
  65. onZoom={this.onZoom}
  66. selectOptions={this.setActiveTimeOption(defaultSelectOptions, range.raw)}
  67. />
  68. );
  69. }
  70. }