Skip to content

Commit 69de548

Browse files
committed
add curveNumber and original event ref to sankey event data
1 parent 2d75e70 commit 69de548

File tree

3 files changed

+124
-13
lines changed

3 files changed

+124
-13
lines changed

src/traces/sankey/plot.js

+16-10
Original file line numberDiff line numberDiff line change
@@ -115,24 +115,26 @@ function castHoverOption(trace, attr) {
115115
}
116116

117117
module.exports = function plot(gd, calcData) {
118-
119118
var fullLayout = gd._fullLayout;
120119
var svg = fullLayout._paper;
121120
var size = fullLayout._size;
122121

123122
var linkSelect = function(element, d) {
124-
gd._hoverdata = [d.link];
125-
gd._hoverdata.trace = calcData.trace;
123+
var evt = d.link;
124+
evt.originalEvent = d3.event;
125+
gd._hoverdata = [evt];
126126
Fx.click(gd, { target: true });
127127
};
128128

129129
var linkHover = function(element, d, sankey) {
130+
var evt = d.link;
131+
evt.originalEvent = d3.event;
130132
d3.select(element).call(linkHoveredStyle.bind(0, d, sankey, true));
131-
Fx.hover(gd, d.link, 'sankey');
133+
Fx.hover(gd, evt, 'sankey');
132134
};
133135

134136
var linkHoverFollow = function(element, d) {
135-
var trace = gd._fullData[d.traceId];
137+
var trace = d.link.trace;
136138
var rootBBox = gd.getBoundingClientRect();
137139
var boundingBox = element.getBoundingClientRect();
138140
var hoverCenterX = boundingBox.left + boundingBox.width / 2;
@@ -166,26 +168,30 @@ module.exports = function plot(gd, calcData) {
166168
var linkUnhover = function(element, d, sankey) {
167169
d3.select(element).call(linkNonHoveredStyle.bind(0, d, sankey, true));
168170
gd.emit('plotly_unhover', {
171+
event: d3.event,
169172
points: [d.link]
170173
});
171174

172175
Fx.loneUnhover(fullLayout._hoverlayer.node());
173176
};
174177

175178
var nodeSelect = function(element, d, sankey) {
176-
gd._hoverdata = [d.node];
177-
gd._hoverdata.trace = calcData.trace;
179+
var evt = d.node;
180+
evt.originalEvent = d3.event;
181+
gd._hoverdata = [evt];
178182
d3.select(element).call(nodeNonHoveredStyle, d, sankey);
179183
Fx.click(gd, { target: true });
180184
};
181185

182186
var nodeHover = function(element, d, sankey) {
187+
var evt = d.node;
188+
evt.originalEvent = d3.event;
183189
d3.select(element).call(nodeHoveredStyle, d, sankey);
184-
Fx.hover(gd, d.node, 'sankey');
190+
Fx.hover(gd, evt, 'sankey');
185191
};
186192

187193
var nodeHoverFollow = function(element, d) {
188-
var trace = gd._fullData[d.traceId];
194+
var trace = d.node.trace;
189195
var nodeRect = d3.select(element).select('.nodeRect');
190196
var rootBBox = gd.getBoundingClientRect();
191197
var boundingBox = nodeRect.node().getBoundingClientRect();
@@ -220,9 +226,9 @@ module.exports = function plot(gd, calcData) {
220226
};
221227

222228
var nodeUnhover = function(element, d, sankey) {
223-
224229
d3.select(element).call(nodeNonHoveredStyle, d, sankey);
225230
gd.emit('plotly_unhover', {
231+
event: d3.event,
226232
points: [d.node]
227233
});
228234

src/traces/sankey/render.js

+11-3
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ function switchToSankeyFormat(nodes) {
6565
// view models
6666

6767
function sankeyModel(layout, d, i) {
68-
6968
var trace = unwrap(d).trace,
7069
domain = trace.domain,
7170
nodeSpec = trace.node,
@@ -121,6 +120,7 @@ function sankeyModel(layout, d, i) {
121120

122121
return {
123122
key: i,
123+
trace: trace,
124124
guid: Math.floor(1e12 * (1 + Math.random())),
125125
horizontal: horizontal,
126126
width: width,
@@ -150,13 +150,17 @@ function sankeyModel(layout, d, i) {
150150
}
151151

152152
function linkModel(uniqueKeys, d, l) {
153-
154153
var tc = tinycolor(l.color);
155154
var basicKey = l.source.label + '|' + l.target.label;
156155
var foundKey = uniqueKeys[basicKey];
157156
uniqueKeys[basicKey] = (foundKey === void(0) ? foundKey : 0) + 1;
158157
var key = basicKey + (foundKey === void(0) ? '' : '__' + foundKey);
159158

159+
// for event data
160+
l.trace = d.trace;
161+
l.curveNumber = d.trace.index;
162+
l.pointNumber = 'TODO';
163+
160164
return {
161165
key: key,
162166
traceId: d.key,
@@ -173,7 +177,6 @@ function linkModel(uniqueKeys, d, l) {
173177
}
174178

175179
function nodeModel(uniqueKeys, d, n) {
176-
177180
var tc = tinycolor(n.color),
178181
zoneThicknessPad = c.nodePadAcross,
179182
zoneLengthPad = d.nodePad / 2,
@@ -185,6 +188,11 @@ function nodeModel(uniqueKeys, d, n) {
185188
uniqueKeys[basicKey] = (foundKey === void(0) ? foundKey : 0) + 1;
186189
var key = basicKey + (foundKey === void(0) ? '' : '__' + foundKey);
187190

191+
// for event data
192+
n.trace = d.trace;
193+
n.curveNumber = d.trace.index;
194+
n.pointNumber = 'TODO';
195+
188196
return {
189197
key: key,
190198
traceId: d.key,

test/jasmine/tests/sankey_test.js

+97
Original file line numberDiff line numberDiff line change
@@ -410,4 +410,101 @@ describe('sankey tests', function() {
410410
.then(done);
411411
});
412412
});
413+
414+
describe('Test hover/click event data:', function() {
415+
var gd;
416+
417+
beforeEach(function() {
418+
gd = createGraphDiv();
419+
});
420+
421+
afterEach(destroyGraphDiv);
422+
423+
function _makeWrapper(eventType, mouseFn) {
424+
var posByElementType = {
425+
node: [400, 300],
426+
link: [450, 300]
427+
};
428+
429+
return function(elType) {
430+
return new Promise(function(resolve, reject) {
431+
gd.once(eventType, function(d) {
432+
delete gd._lastHoverTime;
433+
resolve(d);
434+
});
435+
436+
mouseFn(posByElementType[elType]);
437+
setTimeout(function() {
438+
reject(eventType + ' did not get called!');
439+
}, 100);
440+
});
441+
};
442+
}
443+
444+
var _hover = _makeWrapper('plotly_hover', function(pos) {
445+
mouseEvent('mouseover', pos[0], pos[1]);
446+
});
447+
448+
var _click = _makeWrapper('plotly_click', function(pos) {
449+
mouseEvent('click', pos[0], pos[1]);
450+
});
451+
452+
var _unhover = _makeWrapper('plotly_unhover', function(pos) {
453+
mouseEvent('mouseover', pos[0], pos[1]);
454+
mouseEvent('mouseout', pos[0], pos[1]);
455+
});
456+
457+
it('should output correct hover/click/unhover event data', function(done) {
458+
var fig = Lib.extendDeep({}, mock);
459+
460+
function _assert(d, expectedPtData) {
461+
expect(d.event).toBeDefined('original event reference');
462+
463+
var ptData = d.points[0];
464+
Object.keys(expectedPtData).forEach(function(k) {
465+
expect(ptData[k]).toBe(expectedPtData[k], 'point data for ' + k);
466+
});
467+
}
468+
469+
Plotly.plot(gd, fig)
470+
.then(function() { return _hover('node'); })
471+
.then(function(d) {
472+
_assert(d, {
473+
curveNumber: 0
474+
});
475+
})
476+
.then(function() { return _hover('link'); })
477+
.then(function(d) {
478+
_assert(d, {
479+
curveNumber: 0
480+
});
481+
})
482+
.then(function() { return _click('node'); })
483+
.then(function(d) {
484+
_assert(d, {
485+
curveNumber: 0
486+
});
487+
})
488+
.then(function() { return _click('link'); })
489+
.then(function(d) {
490+
_assert(d, {
491+
curveNumber: 0
492+
});
493+
})
494+
.then(function() { return _unhover('node'); })
495+
.then(function(d) {
496+
_assert(d, {
497+
curveNumber: 0
498+
});
499+
})
500+
.then(function() { return _unhover('link'); })
501+
.then(function(d) {
502+
_assert(d, {
503+
curveNumber: 0
504+
});
505+
})
506+
.catch(fail)
507+
.then(done);
508+
});
509+
});
413510
});

0 commit comments

Comments
 (0)