Skip to content

Commit 184c0b0

Browse files
authored
Merge pull request #4211 from plotly/enh_parcats_clickdata
Add constraint info to parcats click/hover events
2 parents 490a1d6 + d394422 commit 184c0b0

File tree

3 files changed

+71
-7
lines changed

3 files changed

+71
-7
lines changed

src/traces/parcats/calc.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,15 @@ module.exports = function calc(gd, trace) {
8686

8787
// Build color generation function
8888
function getMarkerColorInfo(index) {
89-
var value;
89+
var value, rawColor;
9090
if(Lib.isArrayOrTypedArray(line.color)) {
9191
value = line.color[index % line.color.length];
92+
rawColor = value;
9293
} else {
9394
value = line.color;
9495
}
9596

96-
return {color: markerColorscale(value), rawColor: value};
97+
return {color: markerColorscale(value), rawColor: rawColor};
9798
}
9899

99100
// Number of values and counts

src/traces/parcats/parcats.js

+52-5
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,10 @@ function mouseoverPath(d) {
400400

401401
// Emit hover event
402402
var points = buildPointsArrayForPath(d);
403-
d.parcatsViewModel.graphDiv.emit('plotly_hover', {points: points, event: d3.event});
403+
var constraints = buildConstraintsForPath(d);
404+
d.parcatsViewModel.graphDiv.emit('plotly_hover', {
405+
points: points, event: d3.event, constraints: constraints
406+
});
404407

405408
// Handle hover label
406409
if(d.parcatsViewModel.hoverinfoItems.indexOf('none') === -1) {
@@ -503,7 +506,10 @@ function mouseoutPath(d) {
503506
// Emit unhover event
504507
if(d.parcatsViewModel.hoverinfoItems.indexOf('skip') === -1) {
505508
var points = buildPointsArrayForPath(d);
506-
d.parcatsViewModel.graphDiv.emit('plotly_unhover', {points: points, event: d3.event});
509+
var constraints = buildConstraintsForPath(d);
510+
d.parcatsViewModel.graphDiv.emit('plotly_unhover', {
511+
points: points, event: d3.event, constraints: constraints
512+
});
507513
}
508514
}
509515
}
@@ -528,6 +534,30 @@ function buildPointsArrayForPath(d) {
528534
return points;
529535
}
530536

537+
/**
538+
* Build constraints object for a path
539+
*
540+
* For use in click/hover events
541+
* @param {PathViewModel} d
542+
*/
543+
function buildConstraintsForPath(d) {
544+
var constraints = {};
545+
var dimensions = d.parcatsViewModel.model.dimensions;
546+
547+
// dimensions
548+
for(var i = 0; i < dimensions.length; i++) {
549+
var dimension = dimensions[i];
550+
var category = dimension.categories[d.model.categoryInds[i]];
551+
constraints[dimension.containerInd] = category.categoryValue;
552+
}
553+
554+
// color
555+
if(d.model.rawColor !== undefined) {
556+
constraints.color = d.model.rawColor;
557+
}
558+
return constraints;
559+
}
560+
531561
/**
532562
* Handle path click
533563
* @param {PathViewModel} d
@@ -536,7 +566,10 @@ function clickPath(d) {
536566
if(d.parcatsViewModel.hoverinfoItems.indexOf('skip') === -1) {
537567
// hoverinfo it's skip, so interaction events aren't disabled
538568
var points = buildPointsArrayForPath(d);
539-
d.parcatsViewModel.graphDiv.emit('plotly_click', {points: points, event: d3.event});
569+
var constraints = buildConstraintsForPath(d);
570+
d.parcatsViewModel.graphDiv.emit('plotly_click', {
571+
points: points, event: d3.event, constraints: constraints
572+
});
540573
}
541574
}
542575

@@ -672,6 +705,7 @@ function styleForColorHovermode(bandElement) {
672705
function emitPointsEventCategoryHovermode(bandElement, eventName, event) {
673706
// Get all bands in the current category
674707
var bandViewModel = d3.select(bandElement).datum();
708+
var categoryModel = bandViewModel.categoryViewModel.model;
675709
var gd = bandViewModel.parcatsViewModel.graphDiv;
676710
var bandSel = d3.select(bandElement.parentNode).selectAll('rect.bandrect');
677711

@@ -684,7 +718,11 @@ function emitPointsEventCategoryHovermode(bandElement, eventName, event) {
684718
});
685719
});
686720

687-
gd.emit(eventName, {points: points, event: event});
721+
var constraints = {};
722+
constraints[categoryModel.dimensionInd] = categoryModel.categoryValue;
723+
gd.emit(eventName, {
724+
points: points, event: event, constraints: constraints
725+
});
688726
}
689727

690728
/**
@@ -697,6 +735,7 @@ function emitPointsEventCategoryHovermode(bandElement, eventName, event) {
697735
*/
698736
function emitPointsEventColorHovermode(bandElement, eventName, event) {
699737
var bandViewModel = d3.select(bandElement).datum();
738+
var categoryModel = bandViewModel.categoryViewModel.model;
700739
var gd = bandViewModel.parcatsViewModel.graphDiv;
701740
var paths = selectPathsThroughCategoryBandColor(bandViewModel);
702741

@@ -706,7 +745,15 @@ function emitPointsEventColorHovermode(bandElement, eventName, event) {
706745
Array.prototype.push.apply(points, buildPointsArrayForPath(pathViewModel));
707746
});
708747

709-
gd.emit(eventName, {points: points, event: event});
748+
var constraints = {};
749+
constraints[categoryModel.dimensionInd] = categoryModel.categoryValue;
750+
// color
751+
if(bandViewModel.rawColor !== undefined) {
752+
constraints.color = bandViewModel.rawColor;
753+
}
754+
gd.emit(eventName, {
755+
points: points, event: event, constraints: constraints
756+
});
710757
}
711758

712759
/**

test/jasmine/tests/parcats_test.js

+16
Original file line numberDiff line numberDiff line change
@@ -1190,6 +1190,10 @@ describe('Click events', function() {
11901190
{curveNumber: 0, pointNumber: 4},
11911191
{curveNumber: 0, pointNumber: 5},
11921192
{curveNumber: 0, pointNumber: 8}]);
1193+
1194+
// Check constraints
1195+
var constraints = clickData.constraints;
1196+
expect(constraints).toEqual({1: 'C'});
11931197
})
11941198
.catch(failTest)
11951199
.then(done);
@@ -1261,6 +1265,10 @@ describe('Click events', function() {
12611265
expect(pts).toEqual([
12621266
{curveNumber: 0, pointNumber: 5},
12631267
{curveNumber: 0, pointNumber: 8}]);
1268+
1269+
// Check constraints
1270+
var constraints = clickData.constraints;
1271+
expect(constraints).toEqual({0: 1, 1: 'C', 2: 11});
12641272
})
12651273
.catch(failTest)
12661274
.then(done);
@@ -1347,6 +1355,10 @@ describe('Click events with hoveron color', function() {
13471355
// Check points
13481356
expect(pts).toEqual([
13491357
{curveNumber: 0, pointNumber: 5}]);
1358+
1359+
// Check constraints
1360+
var constraints = clickData.constraints;
1361+
expect(constraints).toEqual({1: 'C', color: 1});
13501362
})
13511363
.catch(failTest)
13521364
.then(done);
@@ -1387,6 +1399,10 @@ describe('Click events with hoveron color', function() {
13871399
// Check points
13881400
expect(pts).toEqual([
13891401
{curveNumber: 0, pointNumber: 5}]);
1402+
1403+
// Check constraints
1404+
var constraints = clickData.constraints;
1405+
expect(constraints).toEqual({0: 1, 1: 'C', 2: 11, color: 1});
13901406
})
13911407
.catch(failTest)
13921408
.then(done);

0 commit comments

Comments
 (0)