Aggregations.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import React from 'react';
  2. import _ from 'lodash';
  3. import { MetricSelect } from 'app/core/components/Select/MetricSelect';
  4. import { getAggregationOptionsByMetric } from '../functions';
  5. import { TemplateSrv } from 'app/features/templating/template_srv';
  6. import { ValueTypes, MetricKind } from '../constants';
  7. export interface Props {
  8. onChange: (metricDescriptor) => void;
  9. templateSrv: TemplateSrv;
  10. metricDescriptor: {
  11. valueType: string;
  12. metricKind: string;
  13. };
  14. crossSeriesReducer: string;
  15. groupBys: string[];
  16. children?: (renderProps: any) => JSX.Element;
  17. }
  18. export interface State {
  19. aggOptions: any[];
  20. displayAdvancedOptions: boolean;
  21. }
  22. export class Aggregations extends React.Component<Props, State> {
  23. state: State = {
  24. aggOptions: [],
  25. displayAdvancedOptions: false,
  26. };
  27. componentDidMount() {
  28. this.setAggOptions(this.props);
  29. }
  30. componentWillReceiveProps(nextProps: Props) {
  31. this.setAggOptions(nextProps);
  32. }
  33. setAggOptions({ metricDescriptor }: Props) {
  34. let aggOptions = [];
  35. if (metricDescriptor) {
  36. aggOptions = [
  37. {
  38. label: 'Aggregations',
  39. expanded: true,
  40. options: getAggregationOptionsByMetric(
  41. metricDescriptor.valueType as ValueTypes,
  42. metricDescriptor.metricKind as MetricKind
  43. ).map(a => ({
  44. ...a,
  45. label: a.text,
  46. })),
  47. },
  48. ];
  49. }
  50. this.setState({ aggOptions });
  51. }
  52. onToggleDisplayAdvanced = () => {
  53. this.setState(state => ({
  54. displayAdvancedOptions: !state.displayAdvancedOptions,
  55. }));
  56. };
  57. render() {
  58. const { displayAdvancedOptions, aggOptions } = this.state;
  59. const { templateSrv, onChange, crossSeriesReducer } = this.props;
  60. return (
  61. <>
  62. <div className="gf-form-inline">
  63. <div className="gf-form">
  64. <label className="gf-form-label query-keyword width-9">Aggregation</label>
  65. <MetricSelect
  66. onChange={onChange}
  67. value={crossSeriesReducer}
  68. variables={templateSrv.variables}
  69. options={aggOptions}
  70. placeholder="Select Reducer"
  71. className="width-15"
  72. />
  73. </div>
  74. <div className="gf-form gf-form--grow">
  75. <label className="gf-form-label gf-form-label--grow">
  76. <a onClick={this.onToggleDisplayAdvanced}>
  77. <>
  78. <i className={`fa fa-caret-${displayAdvancedOptions ? 'down' : 'right'}`} /> Advanced Options
  79. </>
  80. </a>
  81. </label>
  82. </div>
  83. </div>
  84. {this.props.children(this.state.displayAdvancedOptions)}
  85. </>
  86. );
  87. }
  88. }