From bfc7e8aa37801816fb2acd7bdd383034b7e45060 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 --- src/traces/heatmap/event_data.js | 16 +++++++++++ src/traces/heatmap/index.js | 1 + test/jasmine/tests/heatmap_test.js | 44 ++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 src/traces/heatmap/event_data.js diff --git a/src/traces/heatmap/event_data.js b/src/traces/heatmap/event_data.js new file mode 100644 index 00000000000..535350c5288 --- /dev/null +++ b/src/traces/heatmap/event_data.js @@ -0,0 +1,16 @@ +'use strict'; + +module.exports = function eventData(out, pt) { + if ('index' in pt) { + out.pointNumber = pt.index; + out.pointIndex = pt.index; + } + + 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); + }); + }); }); +