From e6d6823a6b2b6d7e5c93ff10a2c6d9556bf5c02d Mon Sep 17 00:00:00 2001 From: Uberti Davide Date: Fri, 24 Jul 2026 19:38:28 +0200 Subject: [PATCH] fix(heatmap): add eventData handler for proper click event data --- draftlogs/7920_fix.md | 1 + src/traces/heatmap/event_data.js | 27 ++++++++++++++++++ src/traces/heatmap/index.js | 1 + test/jasmine/tests/heatmap_test.js | 44 ++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100644 draftlogs/7920_fix.md create mode 100644 src/traces/heatmap/event_data.js diff --git a/draftlogs/7920_fix.md b/draftlogs/7920_fix.md new file mode 100644 index 00000000000..2bb735fc3f7 --- /dev/null +++ b/draftlogs/7920_fix.md @@ -0,0 +1 @@ + - Add `eventData` handler to `heatmap` trace to properly format 2D `pointNumber` and `z` values on click [[#7920](https://github.com/plotly/plotly.js/pull/7920)] diff --git a/src/traces/heatmap/event_data.js b/src/traces/heatmap/event_data.js new file mode 100644 index 00000000000..dc7cab74505 --- /dev/null +++ b/src/traces/heatmap/event_data.js @@ -0,0 +1,27 @@ +'use strict'; + +module.exports = function eventData(out, pt) { + if ('index' in pt) { + out.pointNumber = pt.index; + out.pointIndex = pt.index; + } + + if ('xVal' in pt) out.x = pt.xVal; + else if ('x' in pt) out.x = pt.x; + else if ('xLabelVal' in pt) out.x = pt.xLabelVal; + + if ('yVal' in pt) out.y = pt.yVal; + else if ('y' in pt) out.y = pt.y; + else if ('yLabelVal' in pt) out.y = pt.yLabelVal; + + if (pt.xa) out.xaxis = pt.xa; + if (pt.ya) out.yaxis = pt.ya; + + if ('zLabelVal' in pt) { + out.z = pt.zLabelVal; + } else if ('z' in pt) { + out.z = pt.z; + } + + return out; +}; \ No newline at end of file diff --git a/src/traces/heatmap/index.js b/src/traces/heatmap/index.js index f60bcb39f28..fee2dec6c03 100644 --- a/src/traces/heatmap/index.js +++ b/src/traces/heatmap/index.js @@ -8,6 +8,7 @@ module.exports = { colorbar: require('./colorbar'), style: require('./style'), hoverPoints: require('./hover'), + eventData: require('./event_data'), moduleType: 'trace', name: 'heatmap', diff --git a/test/jasmine/tests/heatmap_test.js b/test/jasmine/tests/heatmap_test.js index ceb527f4132..7766223f733 100644 --- a/test/jasmine/tests/heatmap_test.js +++ b/test/jasmine/tests/heatmap_test.js @@ -1114,4 +1114,48 @@ describe('heatmap hover', function() { expect(pt).toEqual(undefined); }); }); + + describe('heatmap event data', function() { + var gd; + + beforeEach(function() { + gd = createGraphDiv(); + }); + + afterEach(destroyGraphDiv); + + it('should include 2D pointNumber and z value in plotly_click payload', function(done) { + var mockData = [{ + type: 'heatmap', + z: [[1, 2], [3, 4]], + x: ['A', 'B'], + y: ['Row1', 'Row2'] + }]; + + Plotly.newPlot(gd, mockData).then(function() { + var clickData = null; + + gd.on('plotly_click', function(data) { + clickData = data; + }); + + var mockClick = require('../assets/click'); + var bBox = gd.getBoundingClientRect(); + + mockClick(bBox.left + 100, bBox.top + 300); + + expect(clickData).not.toBeNull(); + expect(clickData.points.length).toBe(1); + + var pt = clickData.points[0]; + + expect(Array.isArray(pt.pointNumber)).toBe(true, 'pointNumber should be an array'); + expect(pt.pointNumber).toEqual([0, 0], 'should point to the first row and col'); + expect(pt.z).toBe(1, 'should extract the correct z value'); + + done(); + }).catch(done.fail); + }); + }); }); +