linkSuppliers.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import { PanelModel } from 'app/features/dashboard/state/PanelModel';
  2. import { FieldDisplay } from '@grafana/ui';
  3. import { LinkModelSupplier, getTimeField, Labels, ScopedVars, ScopedVar } from '@grafana/data';
  4. import { getLinkSrv } from './link_srv';
  5. interface SeriesVars {
  6. name?: string;
  7. labels?: Labels;
  8. refId?: string;
  9. }
  10. interface FieldVars {
  11. name: string;
  12. }
  13. interface ValueVars {
  14. raw: any;
  15. numeric: number;
  16. text: string;
  17. time?: number;
  18. calc?: string;
  19. }
  20. interface DataLinkScopedVars extends ScopedVars {
  21. __series?: ScopedVar<SeriesVars>;
  22. __field?: ScopedVar<FieldVars>;
  23. __value?: ScopedVar<ValueVars>;
  24. }
  25. /**
  26. * Link suppliers creates link models based on a link origin
  27. */
  28. export const getFieldLinksSupplier = (value: FieldDisplay): LinkModelSupplier<FieldDisplay> | undefined => {
  29. const links = value.field.links;
  30. if (!links || links.length === 0) {
  31. return undefined;
  32. }
  33. return {
  34. getLinks: (_scopedVars?: any) => {
  35. const scopedVars: DataLinkScopedVars = {};
  36. if (value.view) {
  37. const { dataFrame } = value.view;
  38. scopedVars['__series'] = {
  39. value: {
  40. name: dataFrame.name,
  41. labels: dataFrame.labels,
  42. refId: dataFrame.refId,
  43. },
  44. text: 'Series',
  45. };
  46. const field = value.colIndex !== undefined ? dataFrame.fields[value.colIndex] : undefined;
  47. if (field) {
  48. console.log('Full Field Info:', field);
  49. scopedVars['__field'] = {
  50. value: {
  51. name: field.name,
  52. },
  53. text: 'Field',
  54. };
  55. }
  56. if (value.rowIndex) {
  57. const { timeField } = getTimeField(dataFrame);
  58. scopedVars['__value'] = {
  59. value: {
  60. raw: field.values.get(value.rowIndex),
  61. numeric: value.display.numeric,
  62. text: value.display.text,
  63. time: timeField ? timeField.values.get(value.rowIndex) : undefined,
  64. },
  65. text: 'Value',
  66. };
  67. } else {
  68. // calculation
  69. scopedVars['__value'] = {
  70. value: {
  71. raw: value.display.numeric,
  72. numeric: value.display.numeric,
  73. text: value.display.text,
  74. calc: value.name,
  75. },
  76. text: 'Value',
  77. };
  78. }
  79. } else {
  80. console.log('VALUE', value);
  81. }
  82. return links.map(link => {
  83. return getLinkSrv().getDataLinkUIModel(link, scopedVars, value);
  84. });
  85. },
  86. };
  87. };
  88. export const getPanelLinksSupplier = (value: PanelModel): LinkModelSupplier<PanelModel> => {
  89. const links = value.links;
  90. if (!links || links.length === 0) {
  91. return undefined;
  92. }
  93. return {
  94. getLinks: () => {
  95. return links.map(link => {
  96. return getLinkSrv().getDataLinkUIModel(link, value.scopedVars, value);
  97. });
  98. },
  99. };
  100. };