grafana/public/app/features/panel/panellinks/fieldDisplayValuesProxy.ts

36 lines
1.1 KiB
TypeScript

import { DisplayValue, DataFrame, formattedValueToString, getDisplayProcessor } from '@grafana/data';
import { config } from '@grafana/runtime';
import toNumber from 'lodash/toNumber';
export function getFieldDisplayValuesProxy(frame: DataFrame, rowIndex: number): Record<string, DisplayValue> {
return new Proxy({} as Record<string, DisplayValue>, {
get: (obj: any, key: string) => {
// 1. Match the name
let field = frame.fields.find(f => key === f.name);
if (!field) {
// 2. Match the array index
const k = toNumber(key);
field = frame.fields[k];
}
if (!field) {
// 3. Match the title
field = frame.fields.find(f => key === f.config.title);
}
if (!field) {
return undefined;
}
if (!field.display) {
// Lazy load the display processor
field.display = getDisplayProcessor({
field,
theme: config.theme,
});
}
const raw = field.values.get(rowIndex);
const disp = field.display(raw);
disp.toString = () => formattedValueToString(disp);
return disp;
},
});
}