QueryEditor.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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 { AlignmentPeriods } from './AlignmentPeriods';
  8. import { AliasBy } from './AliasBy';
  9. import { Help } from './Help';
  10. import { Target } from '../types';
  11. import { getAlignmentPickerData } from '../functions';
  12. export interface Props {
  13. onQueryChange: (target: Target) => void;
  14. onExecuteQuery?: () => void;
  15. target: Target;
  16. datasource: any;
  17. templateSrv: any;
  18. uiSegmentSrv: any;
  19. }
  20. interface State extends Target {
  21. alignOptions: any[];
  22. }
  23. const DefaultTarget: State = {
  24. defaultProject: 'loading project...',
  25. metricType: '',
  26. metricKind: '',
  27. valueType: '',
  28. refId: '',
  29. service: '',
  30. unit: '',
  31. crossSeriesReducer: 'REDUCE_MEAN',
  32. alignmentPeriod: 'stackdriver-auto',
  33. perSeriesAligner: 'ALIGN_MEAN',
  34. groupBys: [],
  35. filters: [],
  36. aliasBy: '',
  37. alignOptions: [],
  38. };
  39. export class QueryEditor extends React.Component<Props, State> {
  40. state: State = DefaultTarget;
  41. componentDidMount() {
  42. const { perSeriesAligner, alignOptions } = getAlignmentPickerData(this.props.target, this.props.templateSrv);
  43. this.setState({
  44. ...this.props.target,
  45. alignOptions,
  46. perSeriesAligner,
  47. });
  48. }
  49. handleMetricTypeChange({ valueType, metricKind, type, unit }) {
  50. const { perSeriesAligner, alignOptions } = getAlignmentPickerData(
  51. { valueType, metricKind, perSeriesAligner: this.state.perSeriesAligner },
  52. this.props.templateSrv
  53. );
  54. this.setState(
  55. {
  56. alignOptions,
  57. perSeriesAligner,
  58. metricType: type,
  59. unit,
  60. valueType,
  61. metricKind,
  62. },
  63. () => {
  64. this.props.onQueryChange(this.state);
  65. this.props.onExecuteQuery();
  66. }
  67. );
  68. }
  69. handleFilterChange(filters) {
  70. this.setState({ filters }, () => {
  71. this.props.onQueryChange(this.state);
  72. this.props.onExecuteQuery();
  73. });
  74. }
  75. handleGroupBysChange(groupBys) {
  76. this.setState({ groupBys }, () => {
  77. this.props.onQueryChange(this.state);
  78. this.props.onExecuteQuery();
  79. });
  80. }
  81. handleAggregationChange(value) {
  82. this.setState({ crossSeriesReducer: value }, () => {
  83. this.props.onQueryChange(this.state);
  84. this.props.onExecuteQuery();
  85. });
  86. }
  87. handleAlignmentChange(value) {
  88. this.setState({ perSeriesAligner: value }, () => {
  89. this.props.onQueryChange(this.state);
  90. this.props.onExecuteQuery();
  91. });
  92. }
  93. handleAlignmentPeriodChange(value) {
  94. this.setState({ alignmentPeriod: value }, () => {
  95. this.props.onQueryChange(this.state);
  96. this.props.onExecuteQuery();
  97. });
  98. }
  99. handleAliasByChange(value) {
  100. this.setState({ aliasBy: value }, () => {
  101. this.props.onQueryChange(this.state);
  102. this.props.onExecuteQuery();
  103. });
  104. }
  105. render() {
  106. const {
  107. defaultProject,
  108. metricType,
  109. crossSeriesReducer,
  110. groupBys,
  111. perSeriesAligner,
  112. alignOptions,
  113. alignmentPeriod,
  114. aliasBy,
  115. } = this.state;
  116. const { templateSrv, datasource, uiSegmentSrv } = this.props;
  117. return (
  118. <React.Fragment>
  119. <Metrics
  120. defaultProject={defaultProject}
  121. metricType={metricType}
  122. templateSrv={templateSrv}
  123. datasource={datasource}
  124. onChange={value => this.handleMetricTypeChange(value)}
  125. >
  126. {metric => (
  127. <React.Fragment>
  128. <Filter
  129. filtersChanged={value => this.handleFilterChange(value)}
  130. groupBysChanged={value => this.handleGroupBysChange(value)}
  131. target={this.state}
  132. uiSegmentSrv={uiSegmentSrv}
  133. templateSrv={templateSrv}
  134. datasource={datasource}
  135. metricType={metric ? metric.type : ''}
  136. />
  137. <Aggregations
  138. metricDescriptor={metric}
  139. templateSrv={templateSrv}
  140. crossSeriesReducer={crossSeriesReducer}
  141. groupBys={groupBys}
  142. onChange={value => this.handleAggregationChange(value)}
  143. >
  144. {displayAdvancedOptions =>
  145. displayAdvancedOptions && (
  146. <Alignments
  147. alignOptions={alignOptions}
  148. metricDescriptor={metric}
  149. templateSrv={templateSrv}
  150. perSeriesAligner={perSeriesAligner}
  151. onChange={value => this.handleAlignmentChange(value)}
  152. />
  153. )
  154. }
  155. </Aggregations>
  156. <AliasBy value={aliasBy} onChange={value => this.handleAliasByChange(value)} />
  157. </React.Fragment>
  158. )}
  159. </Metrics>
  160. <AlignmentPeriods
  161. templateSrv={templateSrv}
  162. alignmentPeriod={alignmentPeriod}
  163. onChange={value => this.handleAlignmentPeriodChange(value)}
  164. />
  165. <Help datasource={datasource} />
  166. {/* <div className="gf-form-inline">
  167. <Help datasource={datasource} />
  168. <div className="gf-form" ng-show="ctrl.lastQueryMeta">
  169. <label className="gf-form-label query-keyword" ng-click="ctrl.showHelp = !ctrl.showHelp">
  170. Show Help
  171. <i className="fa fa-caret-down" ng-show="ctrl.showHelp" />
  172. <i className="fa fa-caret-right" ng-hide="ctrl.showHelp" />
  173. </label>
  174. </div>
  175. <div className="gf-form" ng-show="ctrl.lastQueryMeta">
  176. <label className="gf-form-label query-keyword" ng-click="ctrl.showLastQuery = !ctrl.showLastQuery">
  177. Raw Query
  178. <i className="fa fa-caret-down" ng-show="ctrl.showLastQuery" />
  179. <i className="fa fa-caret-right" ng-hide="ctrl.showLastQuery" />
  180. </label>
  181. </div>
  182. <div className="gf-form gf-form--grow">
  183. <div className="gf-form-label gf-form-label--grow" />
  184. </div>
  185. </div> */}
  186. </React.Fragment>
  187. );
  188. }
  189. }