getGraphSeriesModel.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import { colors, getFlotPairs, getColorFromHexRgbOrName, getDisplayProcessor, PanelData } from '@grafana/ui';
  2. import { NullValueMode, reduceField, FieldCache, 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 fieldCache = new FieldCache(series.fields);
  19. const timeColumn = fieldCache.getFirstFieldOfType(FieldType.time);
  20. if (!timeColumn) {
  21. continue;
  22. }
  23. const numberFields = fieldCache.getFields(FieldType.number);
  24. for (let i = 0; i < numberFields.length; i++) {
  25. const field = numberFields[i];
  26. // Use external calculator just to make sure it works :)
  27. const points = getFlotPairs({
  28. series,
  29. xIndex: timeColumn.index,
  30. yIndex: field.index,
  31. nullValueMode: NullValueMode.Null,
  32. });
  33. if (points.length > 0) {
  34. const seriesStats = reduceField({
  35. series,
  36. reducers: legendOptions.stats,
  37. fieldIndex: field.index,
  38. });
  39. let statsDisplayValues: DisplayValue[];
  40. if (legendOptions.stats) {
  41. statsDisplayValues = legendOptions.stats.map<DisplayValue>(stat => {
  42. const statDisplayValue = displayProcessor(seriesStats[stat]);
  43. return {
  44. ...statDisplayValue,
  45. text: statDisplayValue.text,
  46. title: stat,
  47. };
  48. });
  49. }
  50. const seriesColor =
  51. seriesOptions[field.name] && seriesOptions[field.name].color
  52. ? getColorFromHexRgbOrName(seriesOptions[field.name].color)
  53. : colors[graphs.length % colors.length];
  54. graphs.push({
  55. label: field.name,
  56. data: points,
  57. color: seriesColor,
  58. info: statsDisplayValues,
  59. isVisible: true,
  60. yAxis: (seriesOptions[field.name] && seriesOptions[field.name].yAxis) || 1,
  61. });
  62. }
  63. }
  64. }
  65. return graphs;
  66. };