TemplateQueryComponent.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import React, { PureComponent } from 'react';
  2. import StackdriverDatasource from '../datasource';
  3. import ServiceSelector from './ServiceSelector';
  4. import MetricTypeSelector from './MetricTypeSelector';
  5. interface Props {
  6. datasource: StackdriverDatasource;
  7. query: any;
  8. onChange: (c: string) => void;
  9. }
  10. export class StackdriverTemplateQueryComponent 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.handleQueryTypeChange = this.handleQueryTypeChange.bind(this);
  19. this.onServiceChange = this.onServiceChange.bind(this);
  20. this.onMetricTypeChange = this.onMetricTypeChange.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. handleQueryTypeChange(event) {
  28. this.setState({ queryType: event.target.value });
  29. }
  30. onServiceChange(event) {
  31. this.setState({ service: event.target.value });
  32. }
  33. onMetricTypeChange(event) {
  34. this.setState({ metricType: event.target.value });
  35. }
  36. renderSwitch(queryType) {
  37. switch (queryType) {
  38. case 'metricTypes':
  39. return (
  40. <ServiceSelector metricDescriptors={this.state.metricDescriptors} onServiceChange={this.onServiceChange} />
  41. );
  42. case 'metricLabels':
  43. return (
  44. <React.Fragment>
  45. <ServiceSelector metricDescriptors={this.state.metricDescriptors} onServiceChange={this.onServiceChange} />
  46. <MetricTypeSelector
  47. selectedService={this.state.service}
  48. metricDescriptors={this.state.metricDescriptors}
  49. onMetricTypeChange={this.onMetricTypeChange}
  50. />
  51. </React.Fragment>
  52. );
  53. default:
  54. return '';
  55. }
  56. }
  57. render() {
  58. return (
  59. <React.Fragment>
  60. <div className="gf-form max-width-21">
  61. <span className="gf-form-label width-7">Query Type</span>
  62. <div className="gf-form-select-wrapper max-width-14">
  63. <select className="gf-form-input" required onChange={this.handleQueryTypeChange}>
  64. {this.queryTypes.map((qt, i) => (
  65. <option key={i} value={qt.value} ng-if="false">
  66. {qt.name}
  67. </option>
  68. ))}
  69. </select>
  70. </div>
  71. </div>
  72. {this.renderSwitch(this.state.queryType)}
  73. </React.Fragment>
  74. );
  75. }
  76. }