getGraphSeriesModel.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { colors, getFlotPairs, getColorFromHexRgbOrName, getDisplayProcessor, PanelData } from '@grafana/ui';
  2. import { NullValueMode, reduceField, DataFrameHelper, FieldType, DisplayValue, GraphSeriesXY } from '@grafana/data';
  3. import { SeriesOptions, GraphOptions } from './types';
  4. import { GraphLegendEditorLegendOptions } from './GraphLegendEditor';
  5. export const getGraphSeriesModel = (
  6. data: PanelData,
  7. seriesOptions: SeriesOptions,
  8. graphOptions: GraphOptions,
  9. legendOptions: GraphLegendEditorLegendOptions
  10. ) => {
  11. const graphs: GraphSeriesXY[] = [];
  12. const displayProcessor = getDisplayProcessor({
  13. field: {
  14. decimals: legendOptions.decimals,
  15. },
  16. });
  17. for (const series of data.series) {
  18. const data = new DataFrameHelper(series);
  19. const timeColumn = data.getFirstFieldOfType(FieldType.time);
  20. if (!timeColumn) {
  21. continue;
  22. }
  23. for (const field of data.getFields(FieldType.number)) {
  24. // Use external calculator just to make sure it works :)
  25. const points = getFlotPairs({
  26. xField: timeColumn,
  27. yField: field,
  28. nullValueMode: NullValueMode.Null,
  29. });
  30. if (points.length > 0) {
  31. const seriesStats = reduceField({ field, reducers: legendOptions.stats });
  32. let statsDisplayValues: DisplayValue[];
  33. if (legendOptions.stats) {
  34. statsDisplayValues = legendOptions.stats.map<DisplayValue>(stat => {
  35. const statDisplayValue = displayProcessor(seriesStats[stat]);
  36. return {
  37. ...statDisplayValue,
  38. text: statDisplayValue.text,
  39. title: stat,
  40. };
  41. });
  42. }
  43. const seriesColor =
  44. seriesOptions[field.name] && seriesOptions[field.name].color
  45. ? getColorFromHexRgbOrName(seriesOptions[field.name].color)
  46. : colors[graphs.length % colors.length];
  47. graphs.push({
  48. label: field.name,
  49. data: points,
  50. color: seriesColor,
  51. info: statsDisplayValues,
  52. isVisible: true,
  53. yAxis: {
  54. index: (seriesOptions[field.name] && seriesOptions[field.name].yAxis) || 1,
  55. },
  56. });
  57. }
  58. }
  59. }
  60. return graphs;
  61. };