GaugePanelEditor.tsx 3.5 KB

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