TemplateQueryComponent.tsx 2.9 KB

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