QueryEditor.tsx 3.5 KB

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