|
|
@@ -0,0 +1,108 @@
|
|
|
+import React from 'react';
|
|
|
+import _ from 'lodash';
|
|
|
+
|
|
|
+import { Metrics } from './Metrics';
|
|
|
+import { Filter } from './Filter';
|
|
|
+import { AnnotationTarget } from '../types';
|
|
|
+
|
|
|
+export interface Props {
|
|
|
+ onQueryChange: (target: AnnotationTarget) => void;
|
|
|
+ target: AnnotationTarget;
|
|
|
+ datasource: any;
|
|
|
+}
|
|
|
+
|
|
|
+interface State extends AnnotationTarget {
|
|
|
+ [key: string]: any;
|
|
|
+}
|
|
|
+
|
|
|
+const DefaultTarget: State = {
|
|
|
+ defaultProject: 'loading project...',
|
|
|
+ metricType: '',
|
|
|
+ filters: [],
|
|
|
+ metricKind: '',
|
|
|
+ valueType: '',
|
|
|
+ refId: 'annotationQuery',
|
|
|
+ title: '',
|
|
|
+ text: '',
|
|
|
+};
|
|
|
+
|
|
|
+export class AnnotationQueryEditor extends React.Component<Props, State> {
|
|
|
+ state: State = DefaultTarget;
|
|
|
+
|
|
|
+ componentDidMount() {
|
|
|
+ this.setState({
|
|
|
+ ...this.props.target,
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ handleMetricTypeChange({ valueType, metricKind, type, unit }) {
|
|
|
+ const { onQueryChange } = this.props;
|
|
|
+ this.setState(
|
|
|
+ {
|
|
|
+ metricType: type,
|
|
|
+ unit,
|
|
|
+ valueType,
|
|
|
+ metricKind,
|
|
|
+ },
|
|
|
+ () => {
|
|
|
+ onQueryChange(this.state);
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ handleChange(prop, value) {
|
|
|
+ this.setState({ [prop]: value }, () => {
|
|
|
+ this.props.onQueryChange(this.state);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ render() {
|
|
|
+ const { defaultProject, metricType, filters, refId, title } = this.state;
|
|
|
+ const { datasource } = this.props;
|
|
|
+
|
|
|
+ return (
|
|
|
+ <React.Fragment>
|
|
|
+ <Metrics
|
|
|
+ defaultProject={defaultProject}
|
|
|
+ metricType={metricType}
|
|
|
+ templateSrv={datasource.templateSrv}
|
|
|
+ datasource={datasource}
|
|
|
+ onChange={value => this.handleMetricTypeChange(value)}
|
|
|
+ >
|
|
|
+ {metric => (
|
|
|
+ <React.Fragment>
|
|
|
+ <Filter
|
|
|
+ filtersChanged={value => this.handleChange('filters', value)}
|
|
|
+ filters={filters}
|
|
|
+ refId={refId}
|
|
|
+ hideGroupBys={true}
|
|
|
+ templateSrv={datasource.templateSrv}
|
|
|
+ datasource={datasource}
|
|
|
+ metricType={metric ? metric.type : ''}
|
|
|
+ />
|
|
|
+ </React.Fragment>
|
|
|
+ )}
|
|
|
+ </Metrics>
|
|
|
+ <div className="gf-form gf-form-inline">
|
|
|
+ <div className="gf-form">
|
|
|
+ <span className="gf-form-label query-keyword width-9">Title</span>
|
|
|
+ <input
|
|
|
+ type="text"
|
|
|
+ className="gf-form-input width-20"
|
|
|
+ value={title}
|
|
|
+ onChange={e => this.handleChange('title', e.target.value)}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div className="gf-form">
|
|
|
+ <span className="gf-form-label query-keyword width-9">Text</span>
|
|
|
+ <input type="text" className="gf-form-input width-20" ng-model="ctrl.annotation.target.text" />
|
|
|
+ </div>
|
|
|
+ <div className="gf-form gf-form--grow">
|
|
|
+ <div className="gf-form-label gf-form-label--grow" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ {/* <Help datasource={datasource} rawQuery={lastQuery} lastQueryError={lastQueryError} /> */}
|
|
|
+ </React.Fragment>
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|