Skip to content

Commit c918da9

Browse files
committed
Reference fixups
- add functions to get parents info above entry node - use computed d.value everywhere - add more jasmine tests to test percentgaes and current path at root and desired level
1 parent 8416883 commit c918da9

File tree

8 files changed

+129
-88
lines changed

8 files changed

+129
-88
lines changed

src/traces/sunburst/fx.js

+20-37
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ module.exports = function attachFxHandlers(sliceTop, entry, gd, cd, opts) {
2424
var cd0 = cd[0];
2525
var trace = cd0.trace;
2626
var hierarchy = cd0.hierarchy;
27+
var rootLabel = hierarchy.data.data.pid;
28+
var readLabel = function(refPt) {
29+
var l = helpers.getPtLabel(refPt);
30+
return l === undefined ? rootLabel : l;
31+
};
2732

2833
var isSunburst = trace.type === 'sunburst';
2934
var isTreemap = trace.type === 'treemap';
@@ -46,24 +51,9 @@ module.exports = function attachFxHandlers(sliceTop, entry, gd, cd, opts) {
4651
var cdi = pt.data.data;
4752
var ptNumber = cdi.i;
4853
var isRoot = helpers.isHierarchyRoot(pt);
49-
var isEntry = helpers.isEntry(pt);
50-
51-
var rootLabel = hierarchy.data.data.pid;
52-
53-
var parent;
54-
var parentLabel;
55-
var parentValue;
56-
if(isEntry) {
57-
parent = pt.data.parent;
58-
parentLabel = parent ? parent.data.label : helpers.getPtLabel(hierarchy);
59-
parentValue = parent ? helpers.getVal(parent.data) : helpers.getVal(hierarchy);
60-
} else {
61-
parent = pt.parent;
62-
parentLabel = helpers.getPtLabel(parent);
63-
parentValue = helpers.getVal(parent);
64-
}
54+
var parent = helpers.getParent(hierarchy, pt);
6555

66-
var val = helpers.getVal(cdi);
56+
var val = helpers.getVal(pt);
6757

6858
var _cast = function(astr) {
6959
return Lib.castOption(traceNow, ptNumber, astr);
@@ -119,34 +109,27 @@ module.exports = function attachFxHandlers(sliceTop, entry, gd, cd, opts) {
119109
}
120110
};
121111

122-
var ref2 = parent;
123-
if(ref2) {
124-
hoverPt.percentParent = pt.percentParent = val / parentValue;
125-
hoverPt.parent = pt.parentString = helpers.replaceVoid(parentLabel, rootLabel);
112+
if(parent) {
113+
hoverPt.percentParent = pt.percentParent = val / helpers.getVal(parent);
114+
hoverPt.parent = pt.parentString = readLabel(parent);
126115
if(hasFlag('percent parent')) {
127116
tx = helpers.formatPercent(hoverPt.percentParent, separators) + ' of ' + hoverPt.parent;
128117
insertPercent();
129118
}
130119
}
131120

132-
var ref1 = entry;
133-
if(ref1) {
134-
hoverPt.percentEntry = pt.percentEntry = val / helpers.getVal(ref1);
135-
hoverPt.entry = pt.entry = helpers.replaceVoid(helpers.getPtLabel(ref1), rootLabel);
136-
if(hasFlag('percent entry') && !isRoot && !pt.onPathbar) {
137-
tx = helpers.formatPercent(hoverPt.percentEntry, separators) + ' of ' + hoverPt.entry;
138-
insertPercent();
139-
}
121+
hoverPt.percentEntry = pt.percentEntry = val / helpers.getVal(entry);
122+
hoverPt.entry = pt.entry = readLabel(entry);
123+
if(hasFlag('percent entry') && !isRoot && !pt.onPathbar) {
124+
tx = helpers.formatPercent(hoverPt.percentEntry, separators) + ' of ' + hoverPt.entry;
125+
insertPercent();
140126
}
141127

142-
var ref0 = hierarchy;
143-
if(ref0) {
144-
hoverPt.percentRoot = pt.percentRoot = val / helpers.getVal(ref0);
145-
hoverPt.root = pt.root = helpers.replaceVoid(helpers.getPtLabel(ref0), rootLabel);
146-
if(hasFlag('percent root') && !isRoot) {
147-
tx = helpers.formatPercent(hoverPt.percentRoot, separators) + ' of ' + hoverPt.root;
148-
insertPercent();
149-
}
128+
hoverPt.percentRoot = pt.percentRoot = val / helpers.getVal(hierarchy);
129+
hoverPt.root = pt.root = readLabel(hierarchy);
130+
if(hasFlag('percent root') && !isRoot) {
131+
tx = helpers.formatPercent(hoverPt.percentRoot, separators) + ' of ' + hoverPt.root;
132+
insertPercent();
150133
}
151134

152135
hoverPt.text = _cast('hovertext') || _cast('text');

src/traces/sunburst/helpers.js

+16-14
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,11 @@ var Color = require('../../components/color');
1313
var setCursor = require('../../lib/setcursor');
1414
var pieHelpers = require('../pie/helpers');
1515

16-
function labelStr(label) {
17-
return (label || label === 0) ? String(label) : '';
18-
}
19-
2016
exports.findEntryWithLevel = function(hierarchy, level) {
2117
var out;
22-
var key = labelStr(level);
23-
if(key) {
18+
if(level) {
2419
hierarchy.eachAfter(function(pt) {
25-
if(exports.getPtId(pt) === key) {
20+
if(exports.getPtId(pt) === level) {
2621
return out = pt.copy();
2722
}
2823
});
@@ -32,12 +27,11 @@ exports.findEntryWithLevel = function(hierarchy, level) {
3227

3328
exports.findEntryWithChild = function(hierarchy, childId) {
3429
var out;
35-
var key = labelStr(childId);
3630
hierarchy.eachAfter(function(pt) {
3731
var children = pt.children || [];
3832
for(var i = 0; i < children.length; i++) {
3933
var child = children[i];
40-
if(exports.getPtId(child) === key) {
34+
if(exports.getPtId(child) === childId) {
4135
return out = pt.copy();
4236
}
4337
}
@@ -61,12 +55,8 @@ exports.getPtLabel = function(pt) {
6155
return pt.data.data.label;
6256
};
6357

64-
exports.replaceVoid = function(label, rootLabel) {
65-
return label === undefined ? rootLabel : label;
66-
};
67-
6858
exports.getVal = function(d) {
69-
return d.hasOwnProperty('v') ? d.v : d.value;
59+
return d.value;
7060
};
7161

7262
exports.isHierarchyRoot = function(pt) {
@@ -157,6 +147,18 @@ exports.isHeader = function(pt, trace) { // it is only used in treemap.
157147
return !(exports.isLeaf(pt) || pt.depth === trace._maxDepth - 1);
158148
};
159149

150+
function getParentId(pt) {
151+
var parent = pt.data.parent;
152+
return parent ? parent.data.id : undefined;
153+
}
154+
155+
exports.getParent = function(hierarchy, pt) {
156+
var parentId = getParentId(pt);
157+
return parentId === undefined ?
158+
undefined :
159+
exports.findEntryWithLevel(hierarchy, parentId);
160+
};
161+
160162
exports.listPath = function(d, keyStr) {
161163
var parent = d.parent;
162164
if(!parent) return [];

src/traces/sunburst/plot.js

+18-26
Original file line numberDiff line numberDiff line change
@@ -488,25 +488,15 @@ exports.formatSliceLabel = function(pt, entry, trace, cd, fullLayout) {
488488
var cd0 = cd[0];
489489
var cdi = pt.data.data;
490490
var hierarchy = cd0.hierarchy;
491-
var isRoot = helpers.isHierarchyRoot(pt);
492-
var isEntry = helpers.isEntry(pt);
493-
494491
var rootLabel = hierarchy.data.data.pid;
492+
var readLabel = function(refPt) {
493+
var l = helpers.getPtLabel(refPt);
494+
return l === undefined ? rootLabel : l;
495+
};
495496

496-
var parent;
497-
var parentLabel;
498-
var parentValue;
499-
if(isEntry) {
500-
parent = pt.data.parent;
501-
parentLabel = parent ? parent.data.label : helpers.getPtLabel(hierarchy);
502-
parentValue = parent ? helpers.getVal(parent.data) : helpers.getVal(hierarchy);
503-
} else {
504-
parent = pt.parent;
505-
parentLabel = helpers.getPtLabel(parent);
506-
parentValue = helpers.getVal(parent);
507-
}
508-
509-
var val = helpers.getVal(cdi);
497+
var isRoot = helpers.isHierarchyRoot(pt);
498+
var parent = helpers.getParent(hierarchy, pt);
499+
var val = helpers.getVal(pt);
510500

511501
if(!texttemplate) {
512502
var parts = textinfo.split('+');
@@ -542,8 +532,8 @@ exports.formatSliceLabel = function(pt, entry, trace, cd, fullLayout) {
542532
thisText.push(tx);
543533
};
544534

545-
if(hasFlag('percent parent')) {
546-
percent = val / parentValue;
535+
if(hasFlag('percent parent') && parent) {
536+
percent = val / helpers.getVal(parent);
547537
addPercent('parent');
548538
}
549539
if(hasFlag('percent entry')) {
@@ -576,23 +566,25 @@ exports.formatSliceLabel = function(pt, entry, trace, cd, fullLayout) {
576566

577567
obj.currentPath = helpers.getPath(pt.data);
578568

579-
obj.percentParent = val / parentValue;
580-
obj.percentParentLabel = helpers.formatPercent(
581-
obj.percentParent, separators
582-
);
583-
obj.parent = helpers.replaceVoid(parentLabel, rootLabel);
569+
if(parent) {
570+
obj.percentParent = val / helpers.getVal(parent);
571+
obj.percentParentLabel = helpers.formatPercent(
572+
obj.percentParent, separators
573+
);
574+
obj.parent = readLabel(parent);
575+
}
584576

585577
obj.percentEntry = val / helpers.getVal(entry);
586578
obj.percentEntryLabel = helpers.formatPercent(
587579
obj.percentEntry, separators
588580
);
589-
obj.entry = helpers.replaceVoid(helpers.getPtLabel(entry), rootLabel);
581+
obj.entry = readLabel(entry);
590582

591583
obj.percentRoot = val / helpers.getVal(hierarchy);
592584
obj.percentRootLabel = helpers.formatPercent(
593585
obj.percentRoot, separators
594586
);
595-
obj.root = helpers.replaceVoid(helpers.getPtLabel(hierarchy), rootLabel);
587+
obj.root = readLabel(hierarchy);
596588

597589
if(cdi.hasOwnProperty('color')) {
598590
obj.color = cdi.color;
67 Bytes
Loading
Loading
Loading

test/jasmine/tests/sunburst_test.js

+70-9
Original file line numberDiff line numberDiff line change
@@ -1332,7 +1332,7 @@ describe('Test sunburst interactions edge cases', function() {
13321332
});
13331333
});
13341334

1335-
describe('Test sunburst texttemplate without `values` should work:', function() {
1335+
describe('Test sunburst texttemplate without `values` should work at root level:', function() {
13361336
checkTextTemplate([{
13371337
type: 'sunburst',
13381338
labels: ['Eve', 'Cain', 'Seth', 'Enos', 'Noam', 'Abel', 'Awan', 'Enoch', 'Azura'],
@@ -1342,9 +1342,10 @@ describe('Test sunburst texttemplate without `values` should work:', function()
13421342
['color: %{color}', ['color: rgba(0,0,0,0)', 'color: #1f77b4', 'color: #ff7f0e', 'color: #2ca02c', 'color: #d62728', 'color: #9467bd', 'color: #ff7f0e', 'color: #ff7f0e', 'color: #d62728']],
13431343
['label: %{label}', ['label: Eve', 'label: Cain', 'label: Seth', 'label: Enos', 'label: Noam', 'label: Abel', 'label: Awan', 'label: Enoch', 'label: Azura']],
13441344
['text: %{text}', ['text: sixty-five', 'text: fourteen', 'text: twelve', 'text: ten', 'text: two', 'text: six', 'text: six', 'text: one', 'text: four']],
1345+
['path: %{currentPath}', ['path: /', 'path: Eve/', 'path: Eve/', 'path: Eve/', 'path: Eve/', 'path: Eve', 'path: Eve/Seth', 'path: Eve/Seth/', 'path: Eve/Awan/']],
13451346
['%{percentRoot} of %{root}', ['100% of Eve', '33% of Eve', '17% of Eve', '17% of Eve', '17% of Eve', '17% of Eve', '17% of Eve', '17% of Eve', '17% of Eve']],
13461347
['%{percentEntry} of %{entry}', ['100% of Eve', '33% of Eve', '17% of Eve', '17% of Eve', '17% of Eve', '17% of Eve', '17% of Eve', '17% of Eve', '17% of Eve']],
1347-
['%{percentParent} of %{parent}', ['100% of Eve', '100% of Seth', '33% of Eve', '17% of Eve', '17% of Eve', '17% of Eve', '17% of Eve', '50% of Seth', '100% of Awan']],
1348+
['%{percentParent} of %{parent}', ['%{percentParent} of %{parent}', '100% of Seth', '33% of Eve', '17% of Eve', '17% of Eve', '17% of Eve', '17% of Eve', '50% of Seth', '100% of Awan']],
13481349
[
13491350
[
13501351
'label: %{label}',
@@ -1372,7 +1373,7 @@ describe('Test sunburst texttemplate without `values` should work:', function()
13721373
]);
13731374
});
13741375

1375-
describe('Test sunburst texttemplate with *total* `values` should work:', function() {
1376+
describe('Test sunburst texttemplate with *total* `values` should work at root level:', function() {
13761377
checkTextTemplate([{
13771378
type: 'sunburst',
13781379
branchvalues: 'total',
@@ -1385,9 +1386,10 @@ describe('Test sunburst texttemplate with *total* `values` should work:', functi
13851386
['label: %{label}', ['label: Eve', 'label: Cain', 'label: Seth', 'label: Enos', 'label: Noam', 'label: Abel', 'label: Awan', 'label: Enoch', 'label: Azura']],
13861387
['value: %{value}', ['value: 65', 'value: 14', 'value: 12', 'value: 10', 'value: 2', 'value: 6', 'value: 6', 'value: 1', 'value: 4']],
13871388
['text: %{text}', ['text: sixty-five', 'text: fourteen', 'text: twelve', 'text: ten', 'text: two', 'text: six', 'text: six', 'text: one', 'text: four']],
1389+
['path: %{currentPath}', ['path: /', 'path: Eve/', 'path: Eve/', 'path: Eve/', 'path: Eve/', 'path: Eve', 'path: Eve/Seth', 'path: Eve/Seth/', 'path: Eve/Awan/']],
13881390
['%{percentRoot} of %{root}', ['100% of Eve', '22% of Eve', '18% of Eve', '9% of Eve', '9% of Eve', '6% of Eve', '15% of Eve', '3% of Eve', '2% of Eve']],
13891391
['%{percentEntry} of %{entry}', ['100% of Eve', '22% of Eve', '18% of Eve', '9% of Eve', '9% of Eve', '6% of Eve', '15% of Eve', '3% of Eve', '2% of Eve']],
1390-
['%{percentParent} of %{parent}', ['100% of Eve', '22% of Eve', '18% of Eve', '9% of Eve', '9% of Eve', '6% of Eve', '83% of Seth', '17% of Seth', '17% of Awan']],
1392+
['%{percentParent} of %{parent}', ['%{percentParent} of %{parent}', '22% of Eve', '18% of Eve', '9% of Eve', '9% of Eve', '6% of Eve', '83% of Seth', '17% of Seth', '17% of Awan']],
13911393
[
13921394
[
13931395
'label: %{label}',
@@ -1415,7 +1417,7 @@ describe('Test sunburst texttemplate with *total* `values` should work:', functi
14151417
]);
14161418
});
14171419

1418-
describe('Test sunburst texttemplate with *remainder* `values` should work:', function() {
1420+
describe('Test sunburst texttemplate with *remainder* `values` should work at root level:', function() {
14191421
checkTextTemplate([{
14201422
type: 'sunburst',
14211423
branchvalues: 'remainder',
@@ -1428,9 +1430,10 @@ describe('Test sunburst texttemplate with *remainder* `values` should work:', fu
14281430
['label: %{label}', ['label: Eve', 'label: Cain', 'label: Seth', 'label: Enos', 'label: Noam', 'label: Abel', 'label: Awan', 'label: Enoch', 'label: Azura']],
14291431
['value: %{value}', ['value: 65', 'value: 14', 'value: 12', 'value: 10', 'value: 2', 'value: 6', 'value: 6', 'value: 1', 'value: 4']],
14301432
['text: %{text}', ['text: sixty-five', 'text: fourteen', 'text: twelve', 'text: ten', 'text: two', 'text: six', 'text: six', 'text: one', 'text: four']],
1431-
['%{percentRoot} of %{root}', ['54% of Eve', '10% of Eve', '12% of Eve', '5% of Eve', '5% of Eve', '3% of Eve', '8% of Eve', '2% of Eve', '1% of Eve']],
1432-
['%{percentEntry} of %{entry}', ['54% of Eve', '10% of Eve', '12% of Eve', '5% of Eve', '5% of Eve', '3% of Eve', '8% of Eve', '2% of Eve', '1% of Eve']],
1433-
['%{percentParent} of %{parent}', ['54% of Eve', '10% of Eve', '12% of Eve', '5% of Eve', '5% of Eve', '3% of Eve', '42% of Seth', '8% of Seth', '14% of Awan']],
1433+
['path: %{currentPath}', ['path: /', 'path: Eve/', 'path: Eve/', 'path: Eve/', 'path: Eve/', 'path: Eve', 'path: Eve/Seth', 'path: Eve/Seth/', 'path: Eve/Awan/']],
1434+
['%{percentRoot} of %{root}', ['100% of Eve', '20% of Eve', '12% of Eve', '6% of Eve', '5% of Eve', '3% of Eve', '8% of Eve', '2% of Eve', '1% of Eve']],
1435+
['%{percentEntry} of %{entry}', ['100% of Eve', '20% of Eve', '12% of Eve', '6% of Eve', '5% of Eve', '3% of Eve', '8% of Eve', '2% of Eve', '1% of Eve']],
1436+
['%{percentParent} of %{parent}', ['%{percentParent} of %{parent}', '20% of Eve', '12% of Eve', '6% of Eve', '5% of Eve', '3% of Eve', '42% of Seth', '8% of Seth', '14% of Awan']],
14341437
[
14351438
[
14361439
'label: %{label}',
@@ -1447,7 +1450,7 @@ describe('Test sunburst texttemplate with *remainder* `values` should work:', fu
14471450
'label: Eve',
14481451
'text: fourteen',
14491452
'value: 12',
1450-
'5% of Eve',
1453+
'6% of Eve',
14511454
'5% of Eve',
14521455
'8% of Eve',
14531456
'2% of Eve',
@@ -1457,3 +1460,61 @@ describe('Test sunburst texttemplate with *remainder* `values` should work:', fu
14571460
]
14581461
]);
14591462
});
1463+
1464+
describe('Test sunburst texttemplate without `values` should work when *level* is set:', function() {
1465+
checkTextTemplate([{
1466+
type: 'sunburst',
1467+
level: 'Seth',
1468+
labels: ['Eve', 'Cain', 'Seth', 'Enos', 'Noam', 'Abel', 'Awan', 'Enoch', 'Azura'],
1469+
parents: ['', 'Eve', 'Eve', 'Seth', 'Seth', 'Eve', 'Eve', 'Awan', 'Eve' ],
1470+
text: ['sixty-five', 'fourteen', 'twelve', 'ten', 'two', 'six', 'six', 'one', 'four']
1471+
}], 'g.slicetext', [
1472+
['color: %{color}', ['color: #1f77b4', 'color: #1f77b4', 'color: #1f77b4']],
1473+
['label: %{label}', ['label: Seth', 'label: Enos', 'label: Noam']],
1474+
['text: %{text}', ['text: twelve', 'text: ten', 'text: two']],
1475+
['path: %{currentPath}', ['path: Eve/', 'path: Eve/Seth', 'path: Eve/Seth/']],
1476+
['%{percentRoot} of %{root}', ['33% of Eve', '17% of Eve', '17% of Eve']],
1477+
['%{percentEntry} of %{entry}', ['100% of Seth', '50% of Seth', '50% of Seth']],
1478+
['%{percentParent} of %{parent}', ['33% of Eve', '50% of Seth', '50% of Seth']],
1479+
], /* skipEtra */ true);
1480+
});
1481+
1482+
describe('Test sunburst texttemplate with *total* `values` should work when *level* is set:', function() {
1483+
checkTextTemplate([{
1484+
type: 'sunburst',
1485+
level: 'Seth',
1486+
branchvalues: 'total',
1487+
labels: ['Eve', 'Cain', 'Seth', 'Enos', 'Noam', 'Abel', 'Awan', 'Enoch', 'Azura'],
1488+
parents: ['', 'Eve', 'Eve', 'Seth', 'Seth', 'Eve', 'Eve', 'Awan', 'Eve' ],
1489+
values: [65, 14, 12, 10, 2, 6, 6, 1, 4],
1490+
text: ['sixty-five', 'fourteen', 'twelve', 'ten', 'two', 'six', 'six', 'one', 'four']
1491+
}], 'g.slicetext', [
1492+
['color: %{color}', ['color: #ff7f0e', 'color: #ff7f0e', 'color: #ff7f0e']],
1493+
['label: %{label}', ['label: Seth', 'label: Enos', 'label: Noam']],
1494+
['text: %{text}', ['text: twelve', 'text: ten', 'text: two']],
1495+
['path: %{currentPath}', ['path: Eve/', 'path: Eve/Seth', 'path: Eve/Seth/']],
1496+
['%{percentRoot} of %{root}', ['18% of Eve', '15% of Eve', '3% of Eve']],
1497+
['%{percentEntry} of %{entry}', ['100% of Seth', '83% of Seth', '17% of Seth']],
1498+
['%{percentParent} of %{parent}', ['18% of Eve', '83% of Seth', '17% of Seth']],
1499+
], /* skipEtra */ true);
1500+
});
1501+
1502+
describe('Test sunburst texttemplate with *remainder* `values` should work when *level* is set:', function() {
1503+
checkTextTemplate([{
1504+
type: 'sunburst',
1505+
level: 'Seth',
1506+
branchvalues: 'remainder',
1507+
labels: ['Eve', 'Cain', 'Seth', 'Enos', 'Noam', 'Abel', 'Awan', 'Enoch', 'Azura'],
1508+
parents: ['', 'Eve', 'Eve', 'Seth', 'Seth', 'Eve', 'Eve', 'Awan', 'Eve' ],
1509+
values: [65, 14, 12, 10, 2, 6, 6, 1, 4],
1510+
text: ['sixty-five', 'fourteen', 'twelve', 'ten', 'two', 'six', 'six', 'one', 'four']
1511+
}], 'g.slicetext', [
1512+
['color: %{color}', ['color: #1f77b4', 'color: #1f77b4', 'color: #1f77b4']],
1513+
['label: %{label}', ['label: Seth', 'label: Enos', 'label: Noam']],
1514+
['text: %{text}', ['text: twelve', 'text: ten', 'text: two']],
1515+
['path: %{currentPath}', ['path: Eve/', 'path: Eve/Seth', 'path: Eve/Seth/']],
1516+
['%{percentRoot} of %{root}', ['20% of Eve', '8% of Eve', '2% of Eve']],
1517+
['%{percentEntry} of %{entry}', ['100% of Seth', '42% of Seth', '8% of Seth']],
1518+
['%{percentParent} of %{parent}', ['20% of Eve', '42% of Seth', '8% of Seth']],
1519+
], /* skipEtra */ true);
1520+
});

0 commit comments

Comments
 (0)