mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
BarChart: fix crash when checking bar value text overlap (#52061)
This commit is contained in:
parent
28dd413c1d
commit
254159ad69
@ -250,7 +250,7 @@ export function getConfig(opts: BarsOptions, theme: GrafanaTheme2) {
|
|||||||
let barsPctLayout: Array<null | { offs: number[]; size: number[] }> = [];
|
let barsPctLayout: Array<null | { offs: number[]; size: number[] }> = [];
|
||||||
let barsColors: Array<null | { fill: Array<string | null>; stroke: Array<string | null> }> = [];
|
let barsColors: Array<null | { fill: Array<string | null>; stroke: Array<string | null> }> = [];
|
||||||
let scaleFactor = 1;
|
let scaleFactor = 1;
|
||||||
let labels: ValueLabelTable = {};
|
let labels: ValueLabelTable;
|
||||||
let fontSize = opts.text?.valueSize ?? VALUE_MAX_FONT_SIZE;
|
let fontSize = opts.text?.valueSize ?? VALUE_MAX_FONT_SIZE;
|
||||||
let labelOffset = LABEL_OFFSET_MAX;
|
let labelOffset = LABEL_OFFSET_MAX;
|
||||||
|
|
||||||
@ -512,8 +512,12 @@ export function getConfig(opts: BarsOptions, theme: GrafanaTheme2) {
|
|||||||
curBaseline: CanvasTextBaseline | undefined = undefined;
|
curBaseline: CanvasTextBaseline | undefined = undefined;
|
||||||
|
|
||||||
for (const didx in labels) {
|
for (const didx in labels) {
|
||||||
|
// exclude first label from overlap testing
|
||||||
|
let first = true;
|
||||||
|
|
||||||
for (const sidx in labels[didx]) {
|
for (const sidx in labels[didx]) {
|
||||||
const { text, value, x = 0, y = 0, bbox = { x: 0, y: 0, w: 1, h: 1 } } = labels[didx][sidx];
|
const label = labels[didx][sidx];
|
||||||
|
const { text, value, x = 0, y = 0 } = label;
|
||||||
|
|
||||||
let align: CanvasTextAlign = isXHorizontal ? 'center' : value !== null && value < 0 ? 'right' : 'left';
|
let align: CanvasTextAlign = isXHorizontal ? 'center' : value !== null && value < 0 ? 'right' : 'left';
|
||||||
let baseline: CanvasTextBaseline = isXHorizontal
|
let baseline: CanvasTextBaseline = isXHorizontal
|
||||||
@ -533,19 +537,33 @@ export function getConfig(opts: BarsOptions, theme: GrafanaTheme2) {
|
|||||||
if (showValue === VisibilityMode.Always) {
|
if (showValue === VisibilityMode.Always) {
|
||||||
u.ctx.fillText(text, x, y);
|
u.ctx.fillText(text, x, y);
|
||||||
} else if (showValue === VisibilityMode.Auto) {
|
} else if (showValue === VisibilityMode.Auto) {
|
||||||
|
let { bbox } = label;
|
||||||
|
|
||||||
let intersectsLabel = false;
|
let intersectsLabel = false;
|
||||||
|
|
||||||
// Test for any collisions
|
if (bbox == null) {
|
||||||
for (const subsidx in labels[didx]) {
|
intersectsLabel = true;
|
||||||
const r = labels[didx][subsidx].bbox!;
|
label.hidden = true;
|
||||||
|
} else if (!first) {
|
||||||
|
// Test for any collisions
|
||||||
|
for (const subsidx in labels[didx]) {
|
||||||
|
if (subsidx === sidx) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (!labels[didx][subsidx].hidden && sidx !== subsidx && intersects(bbox, r)) {
|
const label2 = labels[didx][subsidx];
|
||||||
intersectsLabel = true;
|
const { bbox: bbox2, hidden } = label2;
|
||||||
labels[didx][sidx].hidden = true;
|
|
||||||
break;
|
if (!hidden && bbox2 && intersects(bbox, bbox2)) {
|
||||||
|
intersectsLabel = true;
|
||||||
|
label.hidden = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
first = false;
|
||||||
|
|
||||||
!intersectsLabel && u.ctx.fillText(text, x, y);
|
!intersectsLabel && u.ctx.fillText(text, x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user