mirror of
https://github.com/grafana/grafana.git
synced 2025-08-03 04:22:13 +08:00

Co-authored-by: Leon Sorokin <leeoniya@gmail.com> Co-authored-by: nmarrs <nathanielmarrs@gmail.com>
91 lines
2.3 KiB
TypeScript
91 lines
2.3 KiB
TypeScript
import { DataFrame, Field } from '@grafana/data';
|
|
|
|
import { HeatmapData } from '../fields';
|
|
|
|
type BucketsMinMax = {
|
|
xBucketMin: number;
|
|
xBucketMax: number;
|
|
yBucketMin: string;
|
|
yBucketMax: string;
|
|
};
|
|
|
|
export const getHoverCellColor = (data: HeatmapData, index: number) => {
|
|
const colorPalette = data.heatmapColors?.palette!;
|
|
const colorIndex = data.heatmapColors?.values[index];
|
|
|
|
let cellColor: string | undefined = undefined;
|
|
|
|
if (colorIndex != null) {
|
|
cellColor = colorPalette[colorIndex];
|
|
}
|
|
|
|
return { cellColor, colorPalette };
|
|
};
|
|
|
|
const conversions: Record<string, number> = {
|
|
year: 1000 * 60 * 60 * 24 * 365,
|
|
month: 1000 * 60 * 60 * 24 * 30,
|
|
week: 1000 * 60 * 60 * 24 * 7,
|
|
day: 1000 * 60 * 60 * 24,
|
|
hour: 1000 * 60 * 60,
|
|
minute: 1000 * 60,
|
|
second: 1000,
|
|
millisecond: 1,
|
|
};
|
|
|
|
// @TODO: display "~ 1 year/month"?
|
|
export const formatMilliseconds = (milliseconds: number) => {
|
|
let value = 1;
|
|
let unit = 'millisecond';
|
|
|
|
for (unit in conversions) {
|
|
if (milliseconds >= conversions[unit]) {
|
|
value = Math.floor(milliseconds / conversions[unit]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
const unitString = value === 1 ? unit : unit + 's';
|
|
|
|
return `${value} ${unitString}`;
|
|
};
|
|
|
|
export const getFieldFromData = (data: DataFrame, fieldType: string, isSparse: boolean) => {
|
|
let field: Field | undefined;
|
|
|
|
switch (fieldType) {
|
|
case 'x':
|
|
field = isSparse
|
|
? data?.fields.find(({ name }) => name === 'x' || name === 'xMin' || name === 'xMax')
|
|
: data?.fields[0];
|
|
break;
|
|
case 'y':
|
|
field = isSparse
|
|
? data?.fields.find(({ name }) => name === 'y' || name === 'yMin' || name === 'yMax')
|
|
: data?.fields[1];
|
|
break;
|
|
case 'count':
|
|
field = isSparse ? data?.fields.find(({ name }) => name === 'count') : data?.fields[2];
|
|
break;
|
|
}
|
|
|
|
return field;
|
|
};
|
|
|
|
export const getSparseCellMinMax = (data: HeatmapData, index: number): BucketsMinMax => {
|
|
let fields = data.heatmap!.fields;
|
|
|
|
let xMax = fields.find((f) => f.name === 'xMax')!;
|
|
let yMin = fields.find((f) => f.name === 'yMin')!;
|
|
let yMax = fields.find((f) => f.name === 'yMax')!;
|
|
|
|
let interval = xMax.config.interval!;
|
|
|
|
return {
|
|
xBucketMin: xMax.values[index] - interval,
|
|
xBucketMax: xMax.values[index],
|
|
yBucketMin: yMin.values[index],
|
|
yBucketMax: yMax.values[index],
|
|
};
|
|
};
|