From a55274a72d8bf24a7b127c7020c48d831ec4cee3 Mon Sep 17 00:00:00 2001 From: Dominik Prokop <dominik.prokop@grafana.com> Date: Mon, 4 Apr 2022 11:18:29 +0200 Subject: [PATCH] TimeSeries: Sort tooltip values based on raw values (#46738) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * TimeSeries: Fix tooltip values sorting * Update packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin.tsx Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com> * Review Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com> --- .../components/uPlot/plugins/TooltipPlugin.tsx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin.tsx b/packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin.tsx index 45557b917d4..15032a07a90 100644 --- a/packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin.tsx +++ b/packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin.tsx @@ -214,7 +214,7 @@ export const TooltipPlugin: React.FC<TooltipPluginProps> = ({ let series: SeriesTableRowProps[] = []; const frame = otherProps.data; const fields = frame.fields; - const sortIdx: Array<[number, number]> = []; + const sortIdx: any[] = []; for (let i = 0; i < fields.length; i++) { const field = frame.fields[i]; @@ -232,7 +232,7 @@ export const TooltipPlugin: React.FC<TooltipPluginProps> = ({ const v = otherProps.data.fields[i].values.get(focusedPointIdxs[i]!); const display = field.display!(v); - sortIdx.push([series.length, v]); + sortIdx.push(v); series.push({ color: display.color || FALLBACK_COLOR, label: getFieldDisplayName(field, frame), @@ -242,7 +242,16 @@ export const TooltipPlugin: React.FC<TooltipPluginProps> = ({ } if (sortOrder !== SortOrder.None) { - series.sort((a, b) => arrayUtils.sortValues(sortOrder)(a.value, b.value)); + // create sort reference series array, as Array.sort() mutates the original array + const sortRef = [...series]; + const sortFn = arrayUtils.sortValues(sortOrder); + + series.sort((a, b) => { + // get compared values indices to retrieve raw values from sortIdx + const aIdx = sortRef.indexOf(a); + const bIdx = sortRef.indexOf(b); + return sortFn(sortIdx[aIdx], sortIdx[bIdx]); + }); } tooltip = <SeriesTable series={series} timestamp={xVal} />;