BarGaugePanelEditor.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Libraries
  2. import React, { PureComponent } from 'react';
  3. import {
  4. ThresholdsEditor,
  5. ValueMappingsEditor,
  6. PanelOptionsGrid,
  7. FieldDisplayEditor,
  8. FieldDisplayOptions,
  9. FieldPropertiesEditor,
  10. PanelOptionsGroup,
  11. FormLabel,
  12. PanelEditorProps,
  13. Select,
  14. DataLinksEditor,
  15. } from '@grafana/ui';
  16. import { FieldConfig, DataLink } from '@grafana/data';
  17. import { Threshold, ValueMapping } from '@grafana/data';
  18. import { BarGaugeOptions, orientationOptions, displayModes } from './types';
  19. import {
  20. getDataLinksVariableSuggestions,
  21. getCalculationValueDataLinksVariableSuggestions,
  22. } from 'app/features/panel/panellinks/link_srv';
  23. export class BarGaugePanelEditor extends PureComponent<PanelEditorProps<BarGaugeOptions>> {
  24. onThresholdsChanged = (thresholds: Threshold[]) => {
  25. const current = this.props.options.fieldOptions.defaults;
  26. this.onDefaultsChange({
  27. ...current,
  28. thresholds,
  29. });
  30. };
  31. onValueMappingsChanged = (mappings: ValueMapping[]) => {
  32. const current = this.props.options.fieldOptions.defaults;
  33. this.onDefaultsChange({
  34. ...current,
  35. mappings,
  36. });
  37. };
  38. onDisplayOptionsChanged = (fieldOptions: FieldDisplayOptions) =>
  39. this.props.onOptionsChange({
  40. ...this.props.options,
  41. fieldOptions,
  42. });
  43. onDefaultsChange = (field: FieldConfig) => {
  44. this.onDisplayOptionsChanged({
  45. ...this.props.options.fieldOptions,
  46. defaults: field,
  47. });
  48. };
  49. onOrientationChange = ({ value }: any) => this.props.onOptionsChange({ ...this.props.options, orientation: value });
  50. onDisplayModeChange = ({ value }: any) => this.props.onOptionsChange({ ...this.props.options, displayMode: value });
  51. onDataLinksChanged = (links: DataLink[]) => {
  52. this.onDefaultsChange({
  53. ...this.props.options.fieldOptions.defaults,
  54. links,
  55. });
  56. };
  57. render() {
  58. const { options } = this.props;
  59. const { fieldOptions } = options;
  60. const { defaults } = fieldOptions;
  61. const suggestions = fieldOptions.values
  62. ? getDataLinksVariableSuggestions(this.props.data.series)
  63. : getCalculationValueDataLinksVariableSuggestions(this.props.data.series);
  64. const labelWidth = 6;
  65. return (
  66. <>
  67. <PanelOptionsGrid>
  68. <PanelOptionsGroup title="Display">
  69. <FieldDisplayEditor onChange={this.onDisplayOptionsChanged} value={fieldOptions} labelWidth={labelWidth} />
  70. <div className="form-field">
  71. <FormLabel width={labelWidth}>Orientation</FormLabel>
  72. <Select
  73. width={12}
  74. options={orientationOptions}
  75. defaultValue={orientationOptions[0]}
  76. onChange={this.onOrientationChange}
  77. value={orientationOptions.find(item => item.value === options.orientation)}
  78. />
  79. </div>
  80. <div className="form-field">
  81. <FormLabel width={labelWidth}>Mode</FormLabel>
  82. <Select
  83. width={12}
  84. options={displayModes}
  85. defaultValue={displayModes[0]}
  86. onChange={this.onDisplayModeChange}
  87. value={displayModes.find(item => item.value === options.displayMode)}
  88. />
  89. </div>
  90. </PanelOptionsGroup>
  91. <PanelOptionsGroup title="Field">
  92. <FieldPropertiesEditor showMinMax={true} onChange={this.onDefaultsChange} value={defaults} />
  93. </PanelOptionsGroup>
  94. <ThresholdsEditor onChange={this.onThresholdsChanged} thresholds={defaults.thresholds} />
  95. </PanelOptionsGrid>
  96. <ValueMappingsEditor onChange={this.onValueMappingsChanged} valueMappings={defaults.mappings} />
  97. <PanelOptionsGroup title="Data links">
  98. <DataLinksEditor
  99. value={defaults.links}
  100. onChange={this.onDataLinksChanged}
  101. suggestions={suggestions}
  102. maxLinks={10}
  103. />
  104. </PanelOptionsGroup>
  105. </>
  106. );
  107. }
  108. }