templateQueryCtrl.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import React, { PureComponent } from 'react';
  2. import StackdriverDatasource from './datasource';
  3. import Services from './services';
  4. import MetricTypes from './metricTypes';
  5. interface Props {
  6. datasource: StackdriverDatasource;
  7. query: string;
  8. onChange: (c: string) => void;
  9. }
  10. export class StackdriverTemplateQueryCtrl extends PureComponent<Props, any> {
  11. queryTypes: Array<{ value: string; name: string }> = [
  12. { value: 'services', name: 'Services' },
  13. { value: 'metricTypes', name: 'Metric Types' },
  14. { value: 'metricLabels', name: 'Metric labels For Metric Type' },
  15. ];
  16. constructor(props) {
  17. super(props);
  18. this.handleChange = this.handleChange.bind(this);
  19. this.onServiceChange = this.onServiceChange.bind(this);
  20. this.onMetricTypeChanged = this.onMetricTypeChanged.bind(this);
  21. this.state = { queryType: undefined, metricDescriptors: [], service: undefined, metricType: undefined };
  22. }
  23. async componentDidMount() {
  24. const metricDescriptors = await this.props.datasource.getMetricTypes(this.props.datasource.projectName);
  25. this.setState({ metricDescriptors });
  26. }
  27. handleChange(event) {
  28. this.setState({ queryType: event.target.value });
  29. }
  30. onServiceChange(event) {
  31. this.setState({ service: event.target.value });
  32. }
  33. onMetricTypeChanged(event) {
  34. this.setState({ metricType: event.target.value });
  35. }
  36. renderSwitch(queryType) {
  37. switch (queryType) {
  38. case 'metricTypes':
  39. return <Services metricDescriptors={this.state.metricDescriptors} onServiceChange={this.onServiceChange} />;
  40. case 'metricLabels':
  41. return (
  42. <React.Fragment>
  43. <Services metricDescriptors={this.state.metricDescriptors} onServiceChange={this.onServiceChange} />
  44. <MetricTypes
  45. selectedService={this.state.service}
  46. metricDescriptors={this.state.metricDescriptors}
  47. onMetricTypeChanged={this.onMetricTypeChanged}
  48. />
  49. </React.Fragment>
  50. );
  51. default:
  52. return '';
  53. }
  54. }
  55. render() {
  56. return (
  57. <React.Fragment>
  58. <div className="gf-form max-width-21">
  59. <span className="gf-form-label width-7">Query Type</span>
  60. <div className="gf-form-select-wrapper max-width-14">
  61. <select className="gf-form-input" required onChange={this.handleChange}>
  62. {this.queryTypes.map((qt, i) => (
  63. <option key={i} value={qt.value} ng-if="false">
  64. {qt.name}
  65. </option>
  66. ))}
  67. </select>
  68. </div>
  69. </div>
  70. {this.renderSwitch(this.state.queryType)}
  71. </React.Fragment>
  72. );
  73. }
  74. }