Skip to content

Commit 940c83a

Browse files
committed
Merge remote-tracking branch 'origin/master' into treemap-text-transitions-maxdepth
2 parents 6d6f946 + 5673cd1 commit 940c83a

File tree

7 files changed

+171
-44
lines changed

7 files changed

+171
-44
lines changed

src/traces/sunburst/calc.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,8 @@ exports.calc = function(gd, trace) {
128128
cd.unshift({
129129
hasMultipleRoots: true,
130130
id: dummyId,
131-
pid: ''
131+
pid: '',
132+
label: ''
132133
});
133134
}
134135

src/traces/sunburst/fx.js

+11-18
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@ 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-
};
3227

3328
var isSunburst = trace.type === 'sunburst';
3429
var isTreemap = trace.type === 'treemap';
@@ -53,7 +48,7 @@ module.exports = function attachFxHandlers(sliceTop, entry, gd, cd, opts) {
5348
var isRoot = helpers.isHierarchyRoot(pt);
5449
var parent = helpers.getParent(hierarchy, pt);
5550

56-
var val = helpers.getVal(pt);
51+
var val = helpers.getValue(pt);
5752

5853
var _cast = function(astr) {
5954
return Lib.castOption(traceNow, ptNumber, astr);
@@ -109,24 +104,22 @@ module.exports = function attachFxHandlers(sliceTop, entry, gd, cd, opts) {
109104
}
110105
};
111106

112-
if(parent) {
113-
hoverPt.percentParent = pt.percentParent = val / helpers.getVal(parent);
114-
hoverPt.parent = pt.parentString = readLabel(parent);
115-
if(hasFlag('percent parent')) {
116-
tx = helpers.formatPercent(hoverPt.percentParent, separators) + ' of ' + hoverPt.parent;
117-
insertPercent();
118-
}
107+
hoverPt.percentParent = pt.percentParent = val / helpers.getValue(parent);
108+
hoverPt.parent = pt.parentString = helpers.getPtLabel(parent);
109+
if(hasFlag('percent parent')) {
110+
tx = helpers.formatPercent(hoverPt.percentParent, separators) + ' of ' + hoverPt.parent;
111+
insertPercent();
119112
}
120113

121-
hoverPt.percentEntry = pt.percentEntry = val / helpers.getVal(entry);
122-
hoverPt.entry = pt.entry = readLabel(entry);
114+
hoverPt.percentEntry = pt.percentEntry = val / helpers.getValue(entry);
115+
hoverPt.entry = pt.entry = helpers.getPtLabel(entry);
123116
if(hasFlag('percent entry') && !isRoot && !pt.onPathbar) {
124117
tx = helpers.formatPercent(hoverPt.percentEntry, separators) + ' of ' + hoverPt.entry;
125118
insertPercent();
126119
}
127120

128-
hoverPt.percentRoot = pt.percentRoot = val / helpers.getVal(hierarchy);
129-
hoverPt.root = pt.root = readLabel(hierarchy);
121+
hoverPt.percentRoot = pt.percentRoot = val / helpers.getValue(hierarchy);
122+
hoverPt.root = pt.root = helpers.getPtLabel(hierarchy);
130123
if(hasFlag('percent root') && !isRoot) {
131124
tx = helpers.formatPercent(hoverPt.percentRoot, separators) + ' of ' + hoverPt.root;
132125
insertPercent();
@@ -307,7 +300,7 @@ function makeEventData(pt, trace, keys) {
307300
if(key in pt) out[key] = pt[key];
308301
}
309302
// handle special case of parent
310-
if('parentString' in pt) out.parent = pt.parentString;
303+
if('parentString' in pt && !helpers.isHierarchyRoot(pt)) out.parent = pt.parentString;
311304

312305
appendArrayPointValue(out, trace, cdi.i);
313306

src/traces/sunburst/helpers.js

+2-5
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ exports.getPtLabel = function(pt) {
5555
return pt.data.data.label;
5656
};
5757

58-
exports.getVal = function(d) {
58+
exports.getValue = function(d) {
5959
return d.value;
6060
};
6161

@@ -152,10 +152,7 @@ function getParentId(pt) {
152152
}
153153

154154
exports.getParent = function(hierarchy, pt) {
155-
var parentId = getParentId(pt);
156-
return parentId === '' ?
157-
undefined :
158-
exports.findEntryWithLevel(hierarchy, parentId);
155+
return exports.findEntryWithLevel(hierarchy, getParentId(pt));
159156
};
160157

161158
exports.listPath = function(d, keyStr) {

src/traces/sunburst/plot.js

+12-18
Original file line numberDiff line numberDiff line change
@@ -488,15 +488,9 @@ 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 rootLabel = hierarchy.data.data.pid;
492-
var readLabel = function(refPt) {
493-
var l = helpers.getPtLabel(refPt);
494-
return l === undefined ? rootLabel : l;
495-
};
496-
497491
var isRoot = helpers.isHierarchyRoot(pt);
498492
var parent = helpers.getParent(hierarchy, pt);
499-
var val = helpers.getVal(pt);
493+
var val = helpers.getValue(pt);
500494

501495
if(!texttemplate) {
502496
var parts = textinfo.split('+');
@@ -532,16 +526,16 @@ exports.formatSliceLabel = function(pt, entry, trace, cd, fullLayout) {
532526
thisText.push(tx);
533527
};
534528

535-
if(hasFlag('percent parent') && parent) {
536-
percent = val / helpers.getVal(parent);
529+
if(hasFlag('percent parent') && !isRoot) {
530+
percent = val / helpers.getValue(parent);
537531
addPercent('parent');
538532
}
539533
if(hasFlag('percent entry')) {
540-
percent = val / helpers.getVal(entry);
534+
percent = val / helpers.getValue(entry);
541535
addPercent('entry');
542536
}
543537
if(hasFlag('percent root')) {
544-
percent = val / helpers.getVal(hierarchy);
538+
percent = val / helpers.getValue(hierarchy);
545539
addPercent('root');
546540
}
547541
}
@@ -566,25 +560,25 @@ exports.formatSliceLabel = function(pt, entry, trace, cd, fullLayout) {
566560

567561
obj.currentPath = helpers.getPath(pt.data);
568562

569-
if(parent) {
570-
obj.percentParent = val / helpers.getVal(parent);
563+
if(!isRoot) {
564+
obj.percentParent = val / helpers.getValue(parent);
571565
obj.percentParentLabel = helpers.formatPercent(
572566
obj.percentParent, separators
573567
);
574-
obj.parent = readLabel(parent);
568+
obj.parent = helpers.getPtLabel(parent);
575569
}
576570

577-
obj.percentEntry = val / helpers.getVal(entry);
571+
obj.percentEntry = val / helpers.getValue(entry);
578572
obj.percentEntryLabel = helpers.formatPercent(
579573
obj.percentEntry, separators
580574
);
581-
obj.entry = readLabel(entry);
575+
obj.entry = helpers.getPtLabel(entry);
582576

583-
obj.percentRoot = val / helpers.getVal(hierarchy);
577+
obj.percentRoot = val / helpers.getValue(hierarchy);
584578
obj.percentRootLabel = helpers.formatPercent(
585579
obj.percentRoot, separators
586580
);
587-
obj.root = readLabel(hierarchy);
581+
obj.root = helpers.getPtLabel(hierarchy);
588582

589583
if(cdi.hasOwnProperty('color')) {
590584
obj.color = cdi.color;
-93 Bytes
Loading

test/jasmine/tests/sunburst_test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ describe('Test sunburst calc:', function() {
235235

236236
expect(extract('id')).toEqual(['dummy', 'A', 'B', 'b']);
237237
expect(extract('pid')).toEqual(['', 'dummy', 'dummy', 'B']);
238-
expect(extract('label')).toEqual([undefined, 'A', 'B', 'b']);
238+
expect(extract('label')).toEqual(['', 'A', 'B', 'b']);
239239
});
240240

241241
it('should compute hierarchy values', function() {

test/jasmine/tests/treemap_test.js

+143-1
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ describe('Test treemap calc:', function() {
346346

347347
expect(extract('id')).toEqual(['dummy', 'A', 'B', 'b']);
348348
expect(extract('pid')).toEqual(['', 'dummy', 'dummy', 'B']);
349-
expect(extract('label')).toEqual([undefined, 'A', 'B', 'b']);
349+
expect(extract('label')).toEqual(['', 'A', 'B', 'b']);
350350
});
351351

352352
it('should compute hierarchy values', function() {
@@ -629,6 +629,148 @@ describe('Test treemap hover:', function() {
629629
});
630630
});
631631

632+
describe('Test treemap hover with and without levels', function() {
633+
var gd;
634+
635+
var labels0 = ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel', 'India', 'Juliet', 'Kilo', 'Lima', 'Mike', 'November', 'Oscar', 'Papa', 'Quebec', 'Romeo', 'Sierra', 'Tango', 'Uniform', 'Victor', 'Whiskey', 'X ray', 'Yankee', 'Zulu'];
636+
var parents0 = ['', 'Alpha', 'Alpha', 'Charlie', 'Charlie', 'Charlie', 'Foxtrot', 'Foxtrot', 'Foxtrot', 'Foxtrot', 'Juliet', 'Juliet', 'Juliet', 'Juliet', 'Juliet', 'Oscar', 'Oscar', 'Oscar', 'Oscar', 'Oscar', 'Oscar', 'Uniform', 'Uniform', 'Uniform', 'Uniform', 'Uniform', 'Uniform'];
637+
var values0 = [40, 2, 38, 1.5, 2.5, 34, 1, 2, 3, 28, 1.25, 1.75, 2.25, 2.75, 20, 1, 1.5, 2, 2.5, 3, 10, 1, 1.5, 2, 2.5, 3];
638+
var text0 = ['forty', 'two', 'thirty-eight', 'one and a half', 'two and a half', 'thirty-four', 'one', 'two', 'three', 'twenty-eight', 'one and twenty-five hundredths', 'one and seventy-five hundredths', 'two and twenty-five hundredths', 'two and seventy-five hundredths', 'twenty', 'one', 'one and a half', 'two', 'two and a half', 'three', 'ten', 'one', 'one and a half', 'two', 'two and a half', 'three'];
639+
640+
afterEach(destroyGraphDiv);
641+
642+
function run(spec) {
643+
gd = createGraphDiv();
644+
645+
var data = (spec.traces || [{}]).map(function(t) {
646+
t.type = 'treemap';
647+
t.text = text0;
648+
t.values = values0;
649+
t.level = spec.level;
650+
t.branchvalues = 'total';
651+
t.hovertemplate = 'path = %{currentPath}<br>label = %{label}<br>text = %{text}<br>value = %{value}<br>ratio to %{parent} = %{percentParent}<br>ratio to %{entry} = %{percentEntry}<br>ratio to %{root} = %{percentRoot}';
652+
653+
if(!t.labels) t.labels = labels0.slice();
654+
if(!t.parents) t.parents = parents0.slice();
655+
return t;
656+
});
657+
658+
var layout = Lib.extendFlat({
659+
width: 500,
660+
height: 500,
661+
margin: {t: 0, b: 0, l: 0, r: 0, pad: 0}
662+
}, spec.layout || {});
663+
664+
var exp = spec.exp || {};
665+
var ptData = null;
666+
667+
return Plotly.plot(gd, data, layout)
668+
.then(function() {
669+
gd.once('plotly_hover', function(d) { ptData = d.points[0]; });
670+
})
671+
.then(hover(gd, spec.pos))
672+
.then(function() {
673+
assertHoverLabelContent(exp.label);
674+
675+
for(var k in exp.ptData) {
676+
expect(ptData[k]).toBe(exp.ptData[k], 'pt event data key ' + k);
677+
}
678+
679+
if(exp.style) {
680+
var gd3 = d3.select(gd);
681+
assertHoverLabelStyle(gd3.select('.hovertext'), exp.style);
682+
}
683+
});
684+
}
685+
686+
[{
687+
desc: 'entry',
688+
level: 'X ray',
689+
pos: 0,
690+
exp: {
691+
label: {
692+
name: 'trace 0',
693+
nums: 'path = Alpha/Charlie/Foxtrot/Juliet/Oscar/Uniform/\nlabel = X ray\ntext = two\nvalue = 2\nratio to Uniform = 0.2\nratio to X ray = 1\nratio to Alpha = 0.05',
694+
},
695+
ptData: {
696+
curveNumber: 0,
697+
pointNumber: 23,
698+
label: 'X ray',
699+
parent: 'Uniform'
700+
}
701+
}
702+
}, {
703+
desc: 'entry',
704+
level: 'Oscar',
705+
pos: 0,
706+
exp: {
707+
label: {
708+
name: 'trace 0',
709+
nums: 'path = Alpha/Charlie/Foxtrot/Juliet/\nlabel = Oscar\ntext = twenty\nvalue = 20\nratio to Juliet = 0.7142857142857143\nratio to Oscar = 1\nratio to Alpha = 0.5',
710+
},
711+
ptData: {
712+
curveNumber: 0,
713+
pointNumber: 14,
714+
label: 'Oscar',
715+
parent: 'Juliet'
716+
}
717+
}
718+
}, {
719+
desc: 'leaf',
720+
level: 'Oscar',
721+
pos: 10,
722+
exp: {
723+
label: {
724+
name: 'trace 0',
725+
nums: 'path = Alpha/Charlie/Foxtrot/Juliet/Oscar/Uniform/\nlabel = X ray\ntext = two\nvalue = 2\nratio to Uniform = 0.2\nratio to Oscar = 0.1\nratio to Alpha = 0.05',
726+
},
727+
ptData: {
728+
curveNumber: 0,
729+
pointNumber: 23,
730+
label: 'X ray',
731+
parent: 'Uniform'
732+
}
733+
}
734+
}, {
735+
desc: 'entry',
736+
level: undefined, // root
737+
pos: 0,
738+
exp: {
739+
label: {
740+
name: 'trace 0',
741+
nums: 'path = /\nlabel = Alpha\ntext = forty\nvalue = 40\nratio to = 1\nratio to Alpha = 1\nratio to Alpha = 1',
742+
},
743+
ptData: {
744+
curveNumber: 0,
745+
pointNumber: 0,
746+
label: 'Alpha',
747+
parent: ''
748+
}
749+
}
750+
}, {
751+
desc: 'leaf',
752+
level: undefined, // root
753+
pos: 10,
754+
exp: {
755+
label: {
756+
name: 'trace 0',
757+
nums: 'path = Alpha/Charlie/Foxtrot/\nlabel = Golf\ntext = one\nvalue = 1\nratio to Foxtrot = 0.029411764705882353\nratio to Alpha = 0.025\nratio to Alpha = 0.025',
758+
},
759+
ptData: {
760+
curveNumber: 0,
761+
pointNumber: 6,
762+
label: 'Golf',
763+
parent: 'Foxtrot'
764+
}
765+
}
766+
}]
767+
.forEach(function(spec) {
768+
it('should generate correct hover labels and event data - ' + spec.desc + ' with level:' + spec.level, function(done) {
769+
run(spec).catch(failTest).then(done);
770+
});
771+
});
772+
});
773+
632774
describe('Test treemap hover lifecycle:', function() {
633775
var gd;
634776
var hoverData;

0 commit comments

Comments
 (0)