SingleStatEditor.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. PanelOptionsGroup,
  12. DataLinksEditor,
  13. } from '@grafana/ui';
  14. import { Threshold, ValueMapping, FieldConfig, DataLink } from '@grafana/data';
  15. import { SingleStatOptions, SparklineOptions } from './types';
  16. import { ColoringEditor } from './ColoringEditor';
  17. import { FontSizeEditor } from './FontSizeEditor';
  18. import { SparklineEditor } from './SparklineEditor';
  19. import {
  20. getDataLinksVariableSuggestions,
  21. getCalculationValueDataLinksVariableSuggestions,
  22. } from 'app/features/panel/panellinks/link_srv';
  23. export class SingleStatEditor extends PureComponent<PanelEditorProps<SingleStatOptions>> {
  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. onSparklineChanged = (sparkline: SparklineOptions) =>
  44. this.props.onOptionsChange({
  45. ...this.props.options,
  46. sparkline,
  47. });
  48. onDefaultsChange = (field: FieldConfig) => {
  49. this.onDisplayOptionsChanged({
  50. ...this.props.options.fieldOptions,
  51. defaults: field,
  52. });
  53. };
  54. onDataLinksChanged = (links: DataLink[]) => {
  55. this.onDefaultsChange({
  56. ...this.props.options.fieldOptions.defaults,
  57. links,
  58. });
  59. };
  60. render() {
  61. const { options } = this.props;
  62. const { fieldOptions } = options;
  63. const { defaults } = fieldOptions;
  64. const suggestions = fieldOptions.values
  65. ? getDataLinksVariableSuggestions(this.props.data.series)
  66. : getCalculationValueDataLinksVariableSuggestions(this.props.data.series);
  67. return (
  68. <>
  69. <PanelOptionsGrid>
  70. <PanelOptionsGroup title="Display">
  71. <FieldDisplayEditor onChange={this.onDisplayOptionsChanged} value={fieldOptions} />
  72. </PanelOptionsGroup>
  73. <PanelOptionsGroup title="Field (default)">
  74. <FieldPropertiesEditor showMinMax={true} onChange={this.onDefaultsChange} value={defaults} />
  75. </PanelOptionsGroup>
  76. <FontSizeEditor options={options} onChange={this.props.onOptionsChange} />
  77. <ColoringEditor options={options} onChange={this.props.onOptionsChange} />
  78. <SparklineEditor options={options.sparkline} onChange={this.onSparklineChanged} />
  79. <ThresholdsEditor onChange={this.onThresholdsChanged} thresholds={defaults.thresholds} />
  80. </PanelOptionsGrid>
  81. <ValueMappingsEditor onChange={this.onValueMappingsChanged} valueMappings={defaults.mappings} />
  82. <PanelOptionsGroup title="Data links">
  83. <DataLinksEditor
  84. value={defaults.links}
  85. onChange={this.onDataLinksChanged}
  86. suggestions={suggestions}
  87. maxLinks={10}
  88. />
  89. </PanelOptionsGroup>
  90. </>
  91. );
  92. }
  93. }