QueryEditor.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import React from 'react';
  2. import _ from 'lodash';
  3. import { Metrics } from './Metrics';
  4. import { Filter } from './Filter';
  5. import { Aggregations } from './Aggregations';
  6. import { Alignments } from './Alignments';
  7. import { Target } from '../types';
  8. import { getAlignmentPickerData } from '../functions';
  9. export interface Props {
  10. onQueryChange: (target: Target) => void;
  11. onExecuteQuery?: () => void;
  12. target: Target;
  13. datasource: any;
  14. templateSrv: any;
  15. uiSegmentSrv: any;
  16. }
  17. interface State extends Target {
  18. alignOptions: any[];
  19. }
  20. const DefaultTarget: State = {
  21. defaultProject: 'loading project...',
  22. metricType: '',
  23. metricKind: '',
  24. valueType: '',
  25. refId: '',
  26. service: '',
  27. unit: '',
  28. crossSeriesReducer: 'REDUCE_MEAN',
  29. alignmentPeriod: 'stackdriver-auto',
  30. perSeriesAligner: 'ALIGN_MEAN',
  31. groupBys: [],
  32. filters: [],
  33. aliasBy: '',
  34. alignOptions: [],
  35. };
  36. export class QueryEditor extends React.Component<Props, State> {
  37. state: State = DefaultTarget;
  38. componentDidMount() {
  39. const { perSeriesAligner, alignOptions } = getAlignmentPickerData(this.props.target, this.props.templateSrv);
  40. this.setState({
  41. ...this.props.target,
  42. alignOptions,
  43. perSeriesAligner,
  44. });
  45. }
  46. handleMetricTypeChange({ valueType, metricKind, type, unit }) {
  47. const { perSeriesAligner, alignOptions } = getAlignmentPickerData(
  48. { valueType, metricKind, perSeriesAligner: this.state.perSeriesAligner },
  49. this.props.templateSrv
  50. );
  51. this.setState(
  52. {
  53. alignOptions,
  54. perSeriesAligner,
  55. metricType: type,
  56. unit,
  57. valueType,
  58. metricKind,
  59. },
  60. () => {
  61. // this.props.onQueryChange(this.state);
  62. this.props.onExecuteQuery();
  63. }
  64. );
  65. }
  66. handleFilterChange(value) {
  67. this.setState(
  68. {
  69. filters: value,
  70. },
  71. () => {
  72. // this.props.onQueryChange(this.state);
  73. this.props.onExecuteQuery();
  74. }
  75. );
  76. }
  77. handleGroupBysChange(value) {
  78. this.setState(
  79. {
  80. groupBys: value,
  81. },
  82. () => {
  83. // this.props.onQueryChange(this.state);
  84. this.props.onExecuteQuery();
  85. }
  86. );
  87. }
  88. handleAggregationChange(value) {
  89. this.setState({ crossSeriesReducer: value }, () => {
  90. // this.props.onQueryChange(this.state);
  91. this.props.onExecuteQuery();
  92. });
  93. }
  94. handleAlignmentChange(value) {
  95. this.setState({ perSeriesAligner: value }, () => {
  96. // this.props.onQueryChange(this.state);
  97. this.props.onExecuteQuery();
  98. });
  99. }
  100. componentDidUpdate(prevProps: Props, prevState: Target) {
  101. this.props.onQueryChange(this.state);
  102. }
  103. render() {
  104. const { defaultProject, metricType, crossSeriesReducer, groupBys, perSeriesAligner, alignOptions } = this.state;
  105. const { templateSrv, datasource, uiSegmentSrv } = this.props;
  106. return (
  107. <React.Fragment>
  108. <Metrics
  109. defaultProject={defaultProject}
  110. metricType={metricType}
  111. templateSrv={templateSrv}
  112. datasource={datasource}
  113. onChange={value => this.handleMetricTypeChange(value)}
  114. >
  115. {metric => (
  116. <React.Fragment>
  117. <Filter
  118. filtersChanged={value => this.handleFilterChange(value)}
  119. groupBysChanged={value => this.handleGroupBysChange(value)}
  120. target={this.state}
  121. uiSegmentSrv={uiSegmentSrv}
  122. templateSrv={templateSrv}
  123. datasource={datasource}
  124. metricType={metric ? metric.type : ''}
  125. />
  126. <Aggregations
  127. metricDescriptor={metric}
  128. templateSrv={templateSrv}
  129. crossSeriesReducer={crossSeriesReducer}
  130. groupBys={groupBys}
  131. onChange={value => this.handleAggregationChange(value)}
  132. >
  133. {displayAdvancedOptions =>
  134. displayAdvancedOptions && (
  135. <Alignments
  136. alignOptions={alignOptions}
  137. metricDescriptor={metric}
  138. templateSrv={templateSrv}
  139. perSeriesAligner={perSeriesAligner}
  140. onChange={value => this.handleAlignmentChange(value)}
  141. />
  142. )
  143. }
  144. </Aggregations>
  145. </React.Fragment>
  146. )}
  147. </Metrics>
  148. </React.Fragment>
  149. );
  150. }
  151. }