AnnotationQueryEditor.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import React from 'react';
  2. import _ from 'lodash';
  3. import { Metrics } from './Metrics';
  4. import { Filter } from './Filter';
  5. import { AnnotationTarget } from '../types';
  6. export interface Props {
  7. onQueryChange: (target: AnnotationTarget) => void;
  8. target: AnnotationTarget;
  9. datasource: any;
  10. }
  11. interface State extends AnnotationTarget {
  12. [key: string]: any;
  13. }
  14. const DefaultTarget: State = {
  15. defaultProject: 'loading project...',
  16. metricType: '',
  17. filters: [],
  18. metricKind: '',
  19. valueType: '',
  20. refId: 'annotationQuery',
  21. title: '',
  22. text: '',
  23. };
  24. export class AnnotationQueryEditor extends React.Component<Props, State> {
  25. state: State = DefaultTarget;
  26. componentDidMount() {
  27. this.setState({
  28. ...this.props.target,
  29. });
  30. }
  31. handleMetricTypeChange({ valueType, metricKind, type, unit }) {
  32. const { onQueryChange } = this.props;
  33. this.setState(
  34. {
  35. metricType: type,
  36. unit,
  37. valueType,
  38. metricKind,
  39. },
  40. () => {
  41. onQueryChange(this.state);
  42. }
  43. );
  44. }
  45. handleChange(prop, value) {
  46. this.setState({ [prop]: value }, () => {
  47. this.props.onQueryChange(this.state);
  48. });
  49. }
  50. render() {
  51. const { defaultProject, metricType, filters, refId, title } = this.state;
  52. const { datasource } = this.props;
  53. return (
  54. <React.Fragment>
  55. <Metrics
  56. defaultProject={defaultProject}
  57. metricType={metricType}
  58. templateSrv={datasource.templateSrv}
  59. datasource={datasource}
  60. onChange={value => this.handleMetricTypeChange(value)}
  61. >
  62. {metric => (
  63. <React.Fragment>
  64. <Filter
  65. filtersChanged={value => this.handleChange('filters', value)}
  66. filters={filters}
  67. refId={refId}
  68. hideGroupBys={true}
  69. templateSrv={datasource.templateSrv}
  70. datasource={datasource}
  71. metricType={metric ? metric.type : ''}
  72. />
  73. </React.Fragment>
  74. )}
  75. </Metrics>
  76. <div className="gf-form gf-form-inline">
  77. <div className="gf-form">
  78. <span className="gf-form-label query-keyword width-9">Title</span>
  79. <input
  80. type="text"
  81. className="gf-form-input width-20"
  82. value={title}
  83. onChange={e => this.handleChange('title', e.target.value)}
  84. />
  85. </div>
  86. <div className="gf-form">
  87. <span className="gf-form-label query-keyword width-9">Text</span>
  88. <input type="text" className="gf-form-input width-20" ng-model="ctrl.annotation.target.text" />
  89. </div>
  90. <div className="gf-form gf-form--grow">
  91. <div className="gf-form-label gf-form-label--grow" />
  92. </div>
  93. </div>
  94. {/* <Help datasource={datasource} rawQuery={lastQuery} lastQueryError={lastQueryError} /> */}
  95. </React.Fragment>
  96. );
  97. }
  98. }