QueryEditor.tsx 3.8 KB

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