From 69c11fe6433b1246ed57386e6028e1cccd295ad5 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Thu, 11 Oct 2018 13:42:43 -0400 Subject: [PATCH 01/18] implement hoverinfo 'none' and 'skip' in sankey --- src/traces/sankey/plot.js | 44 ++++++++++++++-------- test/jasmine/tests/sankey_test.js | 61 ++++++++++++++++++++++++++++--- 2 files changed, 83 insertions(+), 22 deletions(-) diff --git a/src/traces/sankey/plot.js b/src/traces/sankey/plot.js index 150cff65b9f..b9a79563b71 100644 --- a/src/traces/sankey/plot.js +++ b/src/traces/sankey/plot.js @@ -132,10 +132,13 @@ module.exports = function plot(gd, calcData) { var linkHover = function(element, d, sankey) { if(gd._fullLayout.hovermode === false) return; d3.select(element).call(linkHoveredStyle.bind(0, d, sankey, true)); - gd.emit('plotly_hover', { - event: d3.event, - points: [d.link] - }); + if(d.link.trace.hoverinfo !== 'skip') { + gd.emit('plotly_hover', { + event: d3.event, + points: [d.link] + }); + } + }; var sourceLabel = _(gd, 'source:') + ' '; @@ -146,6 +149,7 @@ module.exports = function plot(gd, calcData) { var linkHoverFollow = function(element, d) { if(gd._fullLayout.hovermode === false) return; var trace = d.link.trace; + if(trace.hoverinfo === 'none' || trace.hoverinfo === 'skip') return; var rootBBox = gd._fullLayout._paperdiv.node().getBoundingClientRect(); var boundingBox = element.getBoundingClientRect(); var hoverCenterX = boundingBox.left + boundingBox.width / 2; @@ -179,10 +183,12 @@ module.exports = function plot(gd, calcData) { var linkUnhover = function(element, d, sankey) { if(gd._fullLayout.hovermode === false) return; d3.select(element).call(linkNonHoveredStyle.bind(0, d, sankey, true)); - gd.emit('plotly_unhover', { - event: d3.event, - points: [d.link] - }); + if(d.link.trace.hoverinfo !== 'skip') { + gd.emit('plotly_unhover', { + event: d3.event, + points: [d.link] + }); + } Fx.loneUnhover(fullLayout._hoverlayer.node()); }; @@ -198,15 +204,19 @@ module.exports = function plot(gd, calcData) { var nodeHover = function(element, d, sankey) { if(gd._fullLayout.hovermode === false) return; d3.select(element).call(nodeHoveredStyle, d, sankey); - gd.emit('plotly_hover', { - event: d3.event, - points: [d.node] - }); + if(d.node.trace.hoverinfo !== 'skip') { + gd.emit('plotly_hover', { + event: d3.event, + points: [d.node] + }); + } }; var nodeHoverFollow = function(element, d) { if(gd._fullLayout.hovermode === false) return; + var trace = d.node.trace; + if(trace.hoverinfo === 'none' || trace.hoverinfo === 'skip') return; var nodeRect = d3.select(element).select('.' + cn.nodeRect); var rootBBox = gd._fullLayout._paperdiv.node().getBoundingClientRect(); var boundingBox = nodeRect.node().getBoundingClientRect(); @@ -243,10 +253,12 @@ module.exports = function plot(gd, calcData) { var nodeUnhover = function(element, d, sankey) { if(gd._fullLayout.hovermode === false) return; d3.select(element).call(nodeNonHoveredStyle, d, sankey); - gd.emit('plotly_unhover', { - event: d3.event, - points: [d.node] - }); + if(d.node.trace.hoverinfo !== 'skip') { + gd.emit('plotly_unhover', { + event: d3.event, + points: [d.node] + }); + } Fx.loneUnhover(fullLayout._hoverlayer.node()); }; diff --git a/test/jasmine/tests/sankey_test.js b/test/jasmine/tests/sankey_test.js index f2f26d3a2c1..7b2fe4af30c 100644 --- a/test/jasmine/tests/sankey_test.js +++ b/test/jasmine/tests/sankey_test.js @@ -492,6 +492,38 @@ describe('sankey tests', function() { .catch(failTest) .then(done); }); + + it('should not show labels if hoverinfo is none', function(done) { + var gd = createGraphDiv(); + var mockCopy = Lib.extendDeep({}, mock); + + Plotly.plot(gd, mockCopy).then(function() { + return Plotly.restyle(gd, 'hoverinfo', 'none'); + }) + .then(function() { + _hover(404, 302); + + assertNoLabel(); + }) + .catch(failTest) + .then(done); + }); + + it('should not show labels if hoverinfo is skip', function(done) { + var gd = createGraphDiv(); + var mockCopy = Lib.extendDeep({}, mock); + + Plotly.plot(gd, mockCopy).then(function() { + return Plotly.restyle(gd, 'hoverinfo', 'skip'); + }) + .then(function() { + _hover(404, 302); + + assertNoLabel(); + }) + .catch(failTest) + .then(done); + }); }); describe('Test hover/click event data:', function() { @@ -574,6 +606,7 @@ describe('sankey tests', function() { var fig = Lib.extendDeep({}, mock); Plotly.plot(gd, fig) + .then(function() { return Plotly.restyle(gd, 'hoverinfo', 'none'); }) .then(function() { return _hover('node'); }) .then(function(d) { _assert(d, { @@ -610,11 +643,8 @@ describe('sankey tests', function() { .then(done); }); - it('should not output hover/unhover event data when hovermoder is false', function(done) { - var fig = Lib.extendDeep({}, mock); - - Plotly.plot(gd, fig) - .then(function() { return Plotly.relayout(gd, 'hovermode', false); }) + function assertNoHoverEvents() { + return Promise.resolve() .then(function() { return _hover('node'); }) .then(failTest).catch(function(err) { expect(err).toBe('plotly_hover did not get called!'); @@ -630,7 +660,26 @@ describe('sankey tests', function() { .then(function() { return _unhover('link'); }) .then(failTest).catch(function(err) { expect(err).toBe('plotly_unhover did not get called!'); - }) + }); + } + + it('should not output hover/unhover event data when hovermoder is false', function(done) { + var fig = Lib.extendDeep({}, mock); + + Plotly.plot(gd, fig) + .then(function() { return Plotly.relayout(gd, 'hovermode', false); }) + .then(assertNoHoverEvents) + .catch(failTest) + .then(done); + }); + + it('should not output hover/unhover event data when hoverinfo is skip', function(done) { + var fig = Lib.extendDeep({}, mock); + + Plotly.plot(gd, fig) + .then(function() { return Plotly.restyle(gd, 'hoverinfo', 'skip'); }) + .then(assertNoHoverEvents) + .catch(failTest) .then(done); }); }); From 880973a15590b3e8326fd30bc9ab8f08ec77841e Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Fri, 12 Oct 2018 14:35:17 -0400 Subject: [PATCH 02/18] sankey node and link each have their own hover attributes --- src/traces/sankey/attributes.js | 9 ++-- src/traces/sankey/defaults.js | 11 +++++ src/traces/sankey/plot.js | 36 +++++++-------- test/jasmine/tests/sankey_test.js | 74 +++++++++++++++++++------------ 4 files changed, 78 insertions(+), 52 deletions(-) diff --git a/src/traces/sankey/attributes.js b/src/traces/sankey/attributes.js index 4ca7d632c25..32ee7ae5743 100644 --- a/src/traces/sankey/attributes.js +++ b/src/traces/sankey/attributes.js @@ -18,11 +18,6 @@ var extendFlat = require('../../lib/extend').extendFlat; var overrideAll = require('../../plot_api/edit_types').overrideAll; module.exports = overrideAll({ - hoverinfo: extendFlat({}, plotAttrs.hoverinfo, { - flags: ['label', 'text', 'value', 'percent', 'name'], - }), - hoverlabel: fxAttrs.hoverlabel, // needs editType override - domain: domainAttrs({name: 'sankey', trace: true}), orientation: { @@ -127,6 +122,8 @@ module.exports = overrideAll({ role: 'style', description: 'Sets the thickness (in px) of the `nodes`.' }, + hoverinfo: Object.assign(plotAttrs.hoverinfo, {flags: []}), + hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The nodes of the Sankey plot.' }, @@ -185,6 +182,8 @@ module.exports = overrideAll({ role: 'info', description: 'A numeric value representing the flow volume value.' }, + hoverinfo: Object.assign(plotAttrs.hoverinfo, {flags: []}), + hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The links of the Sankey plot.' } }, 'calc', 'nested'); diff --git a/src/traces/sankey/defaults.js b/src/traces/sankey/defaults.js index 8fb3c785a51..006da0ae593 100644 --- a/src/traces/sankey/defaults.js +++ b/src/traces/sankey/defaults.js @@ -13,6 +13,7 @@ var attributes = require('./attributes'); var Color = require('../../components/color'); var tinycolor = require('tinycolor2'); var handleDomainDefaults = require('../../plots/domain').defaults; +var Registry = require('../../registry'); module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { @@ -24,6 +25,11 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('node.thickness'); coerce('node.line.color'); coerce('node.line.width'); + coerce('node.hoverinfo'); + Registry.getComponentMethod( + 'fx', + 'supplyDefaults' + )(traceIn.node, traceOut.node, defaultColor, layout); var colors = layout.colorway; @@ -39,6 +45,11 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('link.value'); coerce('link.line.color'); coerce('link.line.width'); + coerce('link.hoverinfo'); + Registry.getComponentMethod( + 'fx', + 'supplyDefaults' + )(traceIn.link, traceOut.link, defaultColor, layout); coerce('link.color', traceOut.link.value.map(function() { return tinycolor(layout.paper_bgcolor).getLuminance() < 0.333 ? diff --git a/src/traces/sankey/plot.js b/src/traces/sankey/plot.js index b9a79563b71..cb6c7300c74 100644 --- a/src/traces/sankey/plot.js +++ b/src/traces/sankey/plot.js @@ -132,7 +132,7 @@ module.exports = function plot(gd, calcData) { var linkHover = function(element, d, sankey) { if(gd._fullLayout.hovermode === false) return; d3.select(element).call(linkHoveredStyle.bind(0, d, sankey, true)); - if(d.link.trace.hoverinfo !== 'skip') { + if(d.link.trace.link.hoverinfo !== 'skip') { gd.emit('plotly_hover', { event: d3.event, points: [d.link] @@ -148,8 +148,8 @@ module.exports = function plot(gd, calcData) { var linkHoverFollow = function(element, d) { if(gd._fullLayout.hovermode === false) return; - var trace = d.link.trace; - if(trace.hoverinfo === 'none' || trace.hoverinfo === 'skip') return; + var obj = d.link.trace.link; + if(obj.hoverinfo === 'none' || obj.hoverinfo === 'skip') return; var rootBBox = gd._fullLayout._paperdiv.node().getBoundingClientRect(); var boundingBox = element.getBoundingClientRect(); var hoverCenterX = boundingBox.left + boundingBox.width / 2; @@ -164,11 +164,11 @@ module.exports = function plot(gd, calcData) { sourceLabel + d.link.source.label, targetLabel + d.link.target.label ].filter(renderableValuePresent).join('
'), - color: castHoverOption(trace, 'bgcolor') || Color.addOpacity(d.tinyColorHue, 1), - borderColor: castHoverOption(trace, 'bordercolor'), - fontFamily: castHoverOption(trace, 'font.family'), - fontSize: castHoverOption(trace, 'font.size'), - fontColor: castHoverOption(trace, 'font.color'), + color: castHoverOption(obj, 'bgcolor') || Color.addOpacity(d.tinyColorHue, 1), + borderColor: castHoverOption(obj, 'bordercolor'), + fontFamily: castHoverOption(obj, 'font.family'), + fontSize: castHoverOption(obj, 'font.size'), + fontColor: castHoverOption(obj, 'font.color'), idealAlign: d3.event.x < hoverCenterX ? 'right' : 'left' }, { container: fullLayout._hoverlayer.node(), @@ -183,7 +183,7 @@ module.exports = function plot(gd, calcData) { var linkUnhover = function(element, d, sankey) { if(gd._fullLayout.hovermode === false) return; d3.select(element).call(linkNonHoveredStyle.bind(0, d, sankey, true)); - if(d.link.trace.hoverinfo !== 'skip') { + if(d.link.trace.link.hoverinfo !== 'skip') { gd.emit('plotly_unhover', { event: d3.event, points: [d.link] @@ -204,7 +204,7 @@ module.exports = function plot(gd, calcData) { var nodeHover = function(element, d, sankey) { if(gd._fullLayout.hovermode === false) return; d3.select(element).call(nodeHoveredStyle, d, sankey); - if(d.node.trace.hoverinfo !== 'skip') { + if(d.node.trace.node.hoverinfo !== 'skip') { gd.emit('plotly_hover', { event: d3.event, points: [d.node] @@ -215,8 +215,8 @@ module.exports = function plot(gd, calcData) { var nodeHoverFollow = function(element, d) { if(gd._fullLayout.hovermode === false) return; - var trace = d.node.trace; - if(trace.hoverinfo === 'none' || trace.hoverinfo === 'skip') return; + var obj = d.node.trace.node; + if(obj.hoverinfo === 'none' || obj.hoverinfo === 'skip') return; var nodeRect = d3.select(element).select('.' + cn.nodeRect); var rootBBox = gd._fullLayout._paperdiv.node().getBoundingClientRect(); var boundingBox = nodeRect.node().getBoundingClientRect(); @@ -234,11 +234,11 @@ module.exports = function plot(gd, calcData) { incomingLabel + d.node.targetLinks.length, outgoingLabel + d.node.sourceLinks.length ].filter(renderableValuePresent).join('
'), - color: castHoverOption(trace, 'bgcolor') || d.tinyColorHue, - borderColor: castHoverOption(trace, 'bordercolor'), - fontFamily: castHoverOption(trace, 'font.family'), - fontSize: castHoverOption(trace, 'font.size'), - fontColor: castHoverOption(trace, 'font.color'), + color: castHoverOption(obj, 'bgcolor') || d.tinyColorHue, + borderColor: castHoverOption(obj, 'bordercolor'), + fontFamily: castHoverOption(obj, 'font.family'), + fontSize: castHoverOption(obj, 'font.size'), + fontColor: castHoverOption(obj, 'font.color'), idealAlign: 'left' }, { container: fullLayout._hoverlayer.node(), @@ -253,7 +253,7 @@ module.exports = function plot(gd, calcData) { var nodeUnhover = function(element, d, sankey) { if(gd._fullLayout.hovermode === false) return; d3.select(element).call(nodeNonHoveredStyle, d, sankey); - if(d.node.trace.hoverinfo !== 'skip') { + if(d.node.trace.node.hoverinfo !== 'skip') { gd.emit('plotly_unhover', { event: d3.event, points: [d.node] diff --git a/test/jasmine/tests/sankey_test.js b/test/jasmine/tests/sankey_test.js index 7b2fe4af30c..1b47e3b6cb7 100644 --- a/test/jasmine/tests/sankey_test.js +++ b/test/jasmine/tests/sankey_test.js @@ -394,6 +394,9 @@ describe('sankey tests', function() { Lib.clearThrottle(); } + var node = [404, 302], + link = [450, 300]; + it('should show the correct hover labels', function(done) { var gd = createGraphDiv(); var mockCopy = Lib.extendDeep({}, mock); @@ -433,10 +436,14 @@ describe('sankey tests', function() { ); return Plotly.restyle(gd, { - 'hoverlabel.bgcolor': 'red', - 'hoverlabel.bordercolor': 'blue', - 'hoverlabel.font.size': 20, - 'hoverlabel.font.color': 'black' + 'node.hoverlabel.bgcolor': 'red', + 'node.hoverlabel.bordercolor': 'blue', + 'node.hoverlabel.font.size': 20, + 'node.hoverlabel.font.color': 'black', + 'link.hoverlabel.bgcolor': 'red', + 'link.hoverlabel.bordercolor': 'blue', + 'link.hoverlabel.font.size': 20, + 'link.hoverlabel.font.color': 'black' }); }) .then(function() { @@ -459,7 +466,7 @@ describe('sankey tests', function() { .then(done); }); - it('should show correct hover labels even if there is no link.label supplied', function(done) { + it('should show the correct hover labels even if there is no link.label supplied', function(done) { var gd = createGraphDiv(); var mockCopy = Lib.extendDeep({}, mock); delete mockCopy.data[0].link.label; @@ -477,7 +484,7 @@ describe('sankey tests', function() { .then(done); }); - it('should not show labels if hovermode is false', function(done) { + it('should not show any labels if hovermode is false', function(done) { var gd = createGraphDiv(); var mockCopy = Lib.extendDeep({}, mock); @@ -485,40 +492,56 @@ describe('sankey tests', function() { return Plotly.relayout(gd, 'hovermode', false); }) .then(function() { - _hover(404, 302); - + _hover(node[0], node[1]); + assertNoLabel(); + }) + .then(function() { + _hover(link[0], link[1]); assertNoLabel(); }) .catch(failTest) .then(done); }); - it('should not show labels if hoverinfo is none', function(done) { + it('should not show node labels if node.hoverinfo is none', function(done) { var gd = createGraphDiv(); var mockCopy = Lib.extendDeep({}, mock); Plotly.plot(gd, mockCopy).then(function() { - return Plotly.restyle(gd, 'hoverinfo', 'none'); + return Plotly.restyle(gd, 'node.hoverinfo', 'none'); }) .then(function() { - _hover(404, 302); - + _hover(node[0], node[1]); assertNoLabel(); }) .catch(failTest) .then(done); }); - it('should not show labels if hoverinfo is skip', function(done) { + it('should not show link labels if link.hoverinfo is none', function(done) { var gd = createGraphDiv(); var mockCopy = Lib.extendDeep({}, mock); Plotly.plot(gd, mockCopy).then(function() { - return Plotly.restyle(gd, 'hoverinfo', 'skip'); + return Plotly.restyle(gd, 'link.hoverinfo', 'none'); }) .then(function() { - _hover(404, 302); + _hover(link[0], link[1]); + assertNoLabel(); + }) + .catch(failTest) + .then(done); + }); + + it('should not show node labels if node.hoverinfo is skip', function(done) { + var gd = createGraphDiv(); + var mockCopy = Lib.extendDeep({}, mock); + Plotly.plot(gd, mockCopy).then(function() { + return Plotly.restyle(gd, 'node.hoverinfo', 'skip'); + }) + .then(function() { + _hover(node[0], node[1]); assertNoLabel(); }) .catch(failTest) @@ -643,21 +666,13 @@ describe('sankey tests', function() { .then(done); }); - function assertNoHoverEvents() { + function assertNoHoverEvents(type) { return Promise.resolve() - .then(function() { return _hover('node'); }) + .then(function() { return _hover(type); }) .then(failTest).catch(function(err) { expect(err).toBe('plotly_hover did not get called!'); }) - .then(function() { return _unhover('node'); }) - .then(failTest).catch(function(err) { - expect(err).toBe('plotly_unhover did not get called!'); - }) - .then(function() { return _hover('link'); }) - .then(failTest).catch(function(err) { - expect(err).toBe('plotly_hover did not get called!'); - }) - .then(function() { return _unhover('link'); }) + .then(function() { return _unhover(type); }) .then(failTest).catch(function(err) { expect(err).toBe('plotly_unhover did not get called!'); }); @@ -668,7 +683,8 @@ describe('sankey tests', function() { Plotly.plot(gd, fig) .then(function() { return Plotly.relayout(gd, 'hovermode', false); }) - .then(assertNoHoverEvents) + .then(function() { return assertNoHoverEvents('node');}) + .then(function() { return assertNoHoverEvents('link');}) .catch(failTest) .then(done); }); @@ -677,8 +693,8 @@ describe('sankey tests', function() { var fig = Lib.extendDeep({}, mock); Plotly.plot(gd, fig) - .then(function() { return Plotly.restyle(gd, 'hoverinfo', 'skip'); }) - .then(assertNoHoverEvents) + .then(function() { return Plotly.restyle(gd, 'link.hoverinfo', 'skip'); }) + .then(function() { return assertNoHoverEvents('link');}) .catch(failTest) .then(done); }); From d247b8b498724b9a1e718bcb25d3fff976cc8b44 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Fri, 12 Oct 2018 14:41:26 -0400 Subject: [PATCH 03/18] sankey remove unused value --- src/traces/sankey/attributes.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/traces/sankey/attributes.js b/src/traces/sankey/attributes.js index 32ee7ae5743..5cd7f169268 100644 --- a/src/traces/sankey/attributes.js +++ b/src/traces/sankey/attributes.js @@ -14,7 +14,6 @@ var colorAttrs = require('../../components/color/attributes'); var fxAttrs = require('../../components/fx/attributes'); var domainAttrs = require('../../plots/domain').attributes; -var extendFlat = require('../../lib/extend').extendFlat; var overrideAll = require('../../plot_api/edit_types').overrideAll; module.exports = overrideAll({ From 1919b721f3b87184bda4c523e24d458f3797a54a Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Fri, 12 Oct 2018 15:30:55 -0400 Subject: [PATCH 04/18] fix sankey attributes definition --- src/traces/sankey/attributes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/traces/sankey/attributes.js b/src/traces/sankey/attributes.js index 5cd7f169268..0aa42446e95 100644 --- a/src/traces/sankey/attributes.js +++ b/src/traces/sankey/attributes.js @@ -121,7 +121,7 @@ module.exports = overrideAll({ role: 'style', description: 'Sets the thickness (in px) of the `nodes`.' }, - hoverinfo: Object.assign(plotAttrs.hoverinfo, {flags: []}), + hoverinfo: Object.assign({}, plotAttrs.hoverinfo, {flags: []}), hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The nodes of the Sankey plot.' }, @@ -181,7 +181,7 @@ module.exports = overrideAll({ role: 'info', description: 'A numeric value representing the flow volume value.' }, - hoverinfo: Object.assign(plotAttrs.hoverinfo, {flags: []}), + hoverinfo: Object.assign({}, plotAttrs.hoverinfo, {flags: []}), hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The links of the Sankey plot.' } From e942bc52eef6deaad2b93889b2bd41e988a26c28 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Fri, 12 Oct 2018 16:23:33 -0400 Subject: [PATCH 05/18] fix sankey attribute to pass test-image --- src/traces/sankey/attributes.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/traces/sankey/attributes.js b/src/traces/sankey/attributes.js index 0aa42446e95..1f15f6e8c70 100644 --- a/src/traces/sankey/attributes.js +++ b/src/traces/sankey/attributes.js @@ -14,6 +14,7 @@ var colorAttrs = require('../../components/color/attributes'); var fxAttrs = require('../../components/fx/attributes'); var domainAttrs = require('../../plots/domain').attributes; +var extendFlat = require('../../lib/extend').extendFlat; var overrideAll = require('../../plot_api/edit_types').overrideAll; module.exports = overrideAll({ @@ -121,7 +122,7 @@ module.exports = overrideAll({ role: 'style', description: 'Sets the thickness (in px) of the `nodes`.' }, - hoverinfo: Object.assign({}, plotAttrs.hoverinfo, {flags: []}), + hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {flags: []}), hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The nodes of the Sankey plot.' }, @@ -181,7 +182,7 @@ module.exports = overrideAll({ role: 'info', description: 'A numeric value representing the flow volume value.' }, - hoverinfo: Object.assign({}, plotAttrs.hoverinfo, {flags: []}), + hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {flags: []}), hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The links of the Sankey plot.' } From 1813d6cbd0c9c1600ad8c96aebc8d752f379e833 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Fri, 12 Oct 2018 17:41:19 -0400 Subject: [PATCH 06/18] sankey hide unsupported top-level properties from plot-schema --- src/plot_api/edit_types.js | 3 ++- src/traces/sankey/attributes.js | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/plot_api/edit_types.js b/src/plot_api/edit_types.js index b31724cd874..7fa72e0bb05 100644 --- a/src/plot_api/edit_types.js +++ b/src/plot_api/edit_types.js @@ -10,6 +10,7 @@ var Lib = require('../lib'); var extendFlat = Lib.extendFlat; +var extendDeepAll = Lib.extendDeepAll; var isPlainObject = Lib.isPlainObject; var traceOpts = { @@ -115,7 +116,7 @@ function falseObj(keys) { * @return {object} a new attributes object with `editType` modified as directed */ function overrideAll(attrs, editTypeOverride, overrideContainers) { - var out = extendFlat({}, attrs); + var out = extendDeepAll({}, attrs); for(var key in out) { var attr = out[key]; if(isPlainObject(attr)) { diff --git a/src/traces/sankey/attributes.js b/src/traces/sankey/attributes.js index 1f15f6e8c70..26676c1534c 100644 --- a/src/traces/sankey/attributes.js +++ b/src/traces/sankey/attributes.js @@ -185,5 +185,7 @@ module.exports = overrideAll({ hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {flags: []}), hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The links of the Sankey plot.' - } + }, + hoverinfo: undefined, + hoverlabel: undefined }, 'calc', 'nested'); From 9e4f1a08f62e25ff7c80831b34a9ed8bc759f208 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Fri, 12 Oct 2018 18:10:35 -0400 Subject: [PATCH 07/18] hide unsupported properties in sankey more safely --- src/plot_api/edit_types.js | 3 +-- src/traces/sankey/attributes.js | 7 ++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plot_api/edit_types.js b/src/plot_api/edit_types.js index 7fa72e0bb05..b31724cd874 100644 --- a/src/plot_api/edit_types.js +++ b/src/plot_api/edit_types.js @@ -10,7 +10,6 @@ var Lib = require('../lib'); var extendFlat = Lib.extendFlat; -var extendDeepAll = Lib.extendDeepAll; var isPlainObject = Lib.isPlainObject; var traceOpts = { @@ -116,7 +115,7 @@ function falseObj(keys) { * @return {object} a new attributes object with `editType` modified as directed */ function overrideAll(attrs, editTypeOverride, overrideContainers) { - var out = extendDeepAll({}, attrs); + var out = extendFlat({}, attrs); for(var key in out) { var attr = out[key]; if(isPlainObject(attr)) { diff --git a/src/traces/sankey/attributes.js b/src/traces/sankey/attributes.js index 26676c1534c..d9b6560a179 100644 --- a/src/traces/sankey/attributes.js +++ b/src/traces/sankey/attributes.js @@ -17,7 +17,7 @@ var domainAttrs = require('../../plots/domain').attributes; var extendFlat = require('../../lib/extend').extendFlat; var overrideAll = require('../../plot_api/edit_types').overrideAll; -module.exports = overrideAll({ +var attrs = module.exports = overrideAll({ domain: domainAttrs({name: 'sankey', trace: true}), orientation: { @@ -186,6 +186,7 @@ module.exports = overrideAll({ hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The links of the Sankey plot.' }, - hoverinfo: undefined, - hoverlabel: undefined }, 'calc', 'nested'); +// hide unsupported top-level properties from plot-schema +attrs.hoverinfo = undefined; +attrs.hoverlabel = undefined; From 706e7ae5f4a7f433246e26c60111596fdeb24f49 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Mon, 15 Oct 2018 12:02:17 -0400 Subject: [PATCH 08/18] fix sankey attributes and add better test --- src/traces/sankey/attributes.js | 6 ++-- src/traces/sankey/defaults.js | 12 ++----- test/jasmine/tests/sankey_test.js | 53 +++++++++++++++++++++---------- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/src/traces/sankey/attributes.js b/src/traces/sankey/attributes.js index d9b6560a179..82e505a56f2 100644 --- a/src/traces/sankey/attributes.js +++ b/src/traces/sankey/attributes.js @@ -122,7 +122,7 @@ var attrs = module.exports = overrideAll({ role: 'style', description: 'Sets the thickness (in px) of the `nodes`.' }, - hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {flags: []}), + hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {valtype: 'enumerated', values: ['all', 'none', 'skip'], flags: [], arrayOk: false }), hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The nodes of the Sankey plot.' }, @@ -182,10 +182,10 @@ var attrs = module.exports = overrideAll({ role: 'info', description: 'A numeric value representing the flow volume value.' }, - hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {flags: []}), + hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {valtype: 'enumerated', values: ['all', 'none', 'skip'], flags: [], arrayOk: false }), hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The links of the Sankey plot.' - }, + } }, 'calc', 'nested'); // hide unsupported top-level properties from plot-schema attrs.hoverinfo = undefined; diff --git a/src/traces/sankey/defaults.js b/src/traces/sankey/defaults.js index 006da0ae593..dfcea06ef2e 100644 --- a/src/traces/sankey/defaults.js +++ b/src/traces/sankey/defaults.js @@ -13,7 +13,7 @@ var attributes = require('./attributes'); var Color = require('../../components/color'); var tinycolor = require('tinycolor2'); var handleDomainDefaults = require('../../plots/domain').defaults; -var Registry = require('../../registry'); +var handleFxDefaults = require('../../components/fx/defaults'); module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { @@ -26,10 +26,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('node.line.color'); coerce('node.line.width'); coerce('node.hoverinfo'); - Registry.getComponentMethod( - 'fx', - 'supplyDefaults' - )(traceIn.node, traceOut.node, defaultColor, layout); + handleFxDefaults(traceIn.node, traceOut.node, defaultColor, layout); var colors = layout.colorway; @@ -46,10 +43,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('link.line.color'); coerce('link.line.width'); coerce('link.hoverinfo'); - Registry.getComponentMethod( - 'fx', - 'supplyDefaults' - )(traceIn.link, traceOut.link, defaultColor, layout); + handleFxDefaults(traceIn.link, traceOut.link, defaultColor, layout); coerce('link.color', traceOut.link.value.map(function() { return tinycolor(layout.paper_bgcolor).getLuminance() < 0.333 ? diff --git a/test/jasmine/tests/sankey_test.js b/test/jasmine/tests/sankey_test.js index 1b47e3b6cb7..b2513d77f41 100644 --- a/test/jasmine/tests/sankey_test.js +++ b/test/jasmine/tests/sankey_test.js @@ -440,10 +440,10 @@ describe('sankey tests', function() { 'node.hoverlabel.bordercolor': 'blue', 'node.hoverlabel.font.size': 20, 'node.hoverlabel.font.color': 'black', - 'link.hoverlabel.bgcolor': 'red', - 'link.hoverlabel.bordercolor': 'blue', - 'link.hoverlabel.font.size': 20, - 'link.hoverlabel.font.color': 'black' + 'link.hoverlabel.bgcolor': 'yellow', + 'link.hoverlabel.bordercolor': 'magenta', + 'link.hoverlabel.font.size': 18, + 'link.hoverlabel.font.color': 'green' }); }) .then(function() { @@ -459,7 +459,7 @@ describe('sankey tests', function() { assertLabel( ['source: Solid', 'target: Industry', '46TWh'], - ['rgb(255, 0, 0)', 'rgb(0, 0, 255)', 20, 'Roboto', 'rgb(0, 0, 0)'] + ['rgb(255, 255, 0)', 'rgb(255, 0, 255)', 18, 'Roboto', 'rgb(0, 128, 0)'] ); }) .catch(failTest) @@ -547,6 +547,21 @@ describe('sankey tests', function() { .catch(failTest) .then(done); }); + + it('should not show link labels if link.hoverinfo is skip', function(done) { + var gd = createGraphDiv(); + var mockCopy = Lib.extendDeep({}, mock); + + Plotly.plot(gd, mockCopy).then(function() { + return Plotly.restyle(gd, 'link.hoverinfo', 'skip'); + }) + .then(function() { + _hover(link[0], link[1]); + assertNoLabel(); + }) + .catch(failTest) + .then(done); + }); }); describe('Test hover/click event data:', function() { @@ -667,15 +682,17 @@ describe('sankey tests', function() { }); function assertNoHoverEvents(type) { - return Promise.resolve() - .then(function() { return _hover(type); }) - .then(failTest).catch(function(err) { - expect(err).toBe('plotly_hover did not get called!'); - }) - .then(function() { return _unhover(type); }) - .then(failTest).catch(function(err) { - expect(err).toBe('plotly_unhover did not get called!'); - }); + return function() { + return Promise.resolve() + .then(function() { return _hover(type); }) + .then(failTest).catch(function(err) { + expect(err).toBe('plotly_hover did not get called!'); + }) + .then(function() { return _unhover(type); }) + .then(failTest).catch(function(err) { + expect(err).toBe('plotly_unhover did not get called!'); + }); + }; } it('should not output hover/unhover event data when hovermoder is false', function(done) { @@ -683,8 +700,8 @@ describe('sankey tests', function() { Plotly.plot(gd, fig) .then(function() { return Plotly.relayout(gd, 'hovermode', false); }) - .then(function() { return assertNoHoverEvents('node');}) - .then(function() { return assertNoHoverEvents('link');}) + .then(assertNoHoverEvents('node')) + .then(assertNoHoverEvents('link')) .catch(failTest) .then(done); }); @@ -694,7 +711,9 @@ describe('sankey tests', function() { Plotly.plot(gd, fig) .then(function() { return Plotly.restyle(gd, 'link.hoverinfo', 'skip'); }) - .then(function() { return assertNoHoverEvents('link');}) + .then(assertNoHoverEvents('link')) + .then(function() { return Plotly.restyle(gd, 'node.hoverinfo', 'skip'); }) + .then(assertNoHoverEvents('node')) .catch(failTest) .then(done); }); From 7c24d293aa9b816abd99e2a93d08185e117056f3 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Mon, 15 Oct 2018 12:26:00 -0400 Subject: [PATCH 09/18] fix sankey attributes to pass plotschema test --- src/traces/sankey/attributes.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/traces/sankey/attributes.js b/src/traces/sankey/attributes.js index 82e505a56f2..51c20302ab8 100644 --- a/src/traces/sankey/attributes.js +++ b/src/traces/sankey/attributes.js @@ -122,7 +122,14 @@ var attrs = module.exports = overrideAll({ role: 'style', description: 'Sets the thickness (in px) of the `nodes`.' }, - hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {valtype: 'enumerated', values: ['all', 'none', 'skip'], flags: [], arrayOk: false }), + hoverinfo: { + valtype: 'enumerated', + values: ['all', 'none', 'skip'], + dflt: 'all', + role: 'info', + editType: 'none', + description: plotAttrs.hoverinfo.description + }, hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The nodes of the Sankey plot.' }, @@ -182,7 +189,14 @@ var attrs = module.exports = overrideAll({ role: 'info', description: 'A numeric value representing the flow volume value.' }, - hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {valtype: 'enumerated', values: ['all', 'none', 'skip'], flags: [], arrayOk: false }), + hoverinfo: { + valtype: 'enumerated', + values: ['all', 'none', 'skip'], + dflt: 'all', + role: 'info', + editType: 'none', + description: plotAttrs.hoverinfo.description + }, hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The links of the Sankey plot.' } From 53d7ce310b3c5cf490f4927bf575a662e0a52c1f Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Mon, 15 Oct 2018 12:33:02 -0400 Subject: [PATCH 10/18] fix lint issue --- src/traces/sankey/attributes.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/traces/sankey/attributes.js b/src/traces/sankey/attributes.js index 51c20302ab8..c4ae7193dd3 100644 --- a/src/traces/sankey/attributes.js +++ b/src/traces/sankey/attributes.js @@ -14,7 +14,6 @@ var colorAttrs = require('../../components/color/attributes'); var fxAttrs = require('../../components/fx/attributes'); var domainAttrs = require('../../plots/domain').attributes; -var extendFlat = require('../../lib/extend').extendFlat; var overrideAll = require('../../plot_api/edit_types').overrideAll; var attrs = module.exports = overrideAll({ From 87c30fe5a8d90a36bdc081eb9a9d84c0d79512e8 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Mon, 15 Oct 2018 12:46:03 -0400 Subject: [PATCH 11/18] fix sankey attribute key valtype -> valType --- src/traces/sankey/attributes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/traces/sankey/attributes.js b/src/traces/sankey/attributes.js index c4ae7193dd3..c270af40598 100644 --- a/src/traces/sankey/attributes.js +++ b/src/traces/sankey/attributes.js @@ -122,7 +122,7 @@ var attrs = module.exports = overrideAll({ description: 'Sets the thickness (in px) of the `nodes`.' }, hoverinfo: { - valtype: 'enumerated', + valType: 'enumerated', values: ['all', 'none', 'skip'], dflt: 'all', role: 'info', @@ -189,7 +189,7 @@ var attrs = module.exports = overrideAll({ description: 'A numeric value representing the flow volume value.' }, hoverinfo: { - valtype: 'enumerated', + valType: 'enumerated', values: ['all', 'none', 'skip'], dflt: 'all', role: 'info', From 7a3203662fcbf6ca919dcbeddc745b8a9e64f3a8 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Mon, 15 Oct 2018 13:11:44 -0400 Subject: [PATCH 12/18] update description of hoverinfo in sankey --- src/traces/sankey/attributes.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/traces/sankey/attributes.js b/src/traces/sankey/attributes.js index c270af40598..e71c7204e3d 100644 --- a/src/traces/sankey/attributes.js +++ b/src/traces/sankey/attributes.js @@ -9,7 +9,6 @@ 'use strict'; var fontAttrs = require('../../plots/font_attributes'); -var plotAttrs = require('../../plots/attributes'); var colorAttrs = require('../../components/color/attributes'); var fxAttrs = require('../../components/fx/attributes'); var domainAttrs = require('../../plots/domain').attributes; @@ -127,7 +126,11 @@ var attrs = module.exports = overrideAll({ dflt: 'all', role: 'info', editType: 'none', - description: plotAttrs.hoverinfo.description + description: [ + 'Determines which trace information appear when hovering nodes.', + 'If `none` or `skip` are set, no information is displayed upon hovering.', + 'But, if `none` is set, click and hover events are still fired.' + ].join(' ') }, hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The nodes of the Sankey plot.' @@ -194,7 +197,11 @@ var attrs = module.exports = overrideAll({ dflt: 'all', role: 'info', editType: 'none', - description: plotAttrs.hoverinfo.description + description: [ + 'Determines which trace information appear when hovering links.', + 'If `none` or `skip` are set, no information is displayed upon hovering.', + 'But, if `none` is set, click and hover events are still fired.' + ].join(' ') }, hoverlabel: fxAttrs.hoverlabel, // needs editType override, description: 'The links of the Sankey plot.' From b436003ad534946385f74944e8a06e31d54d360f Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Mon, 15 Oct 2018 13:58:30 -0400 Subject: [PATCH 13/18] remove editType on hoverinfo since it's overriden --- src/traces/sankey/attributes.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/traces/sankey/attributes.js b/src/traces/sankey/attributes.js index e71c7204e3d..dfbd8845822 100644 --- a/src/traces/sankey/attributes.js +++ b/src/traces/sankey/attributes.js @@ -125,7 +125,6 @@ var attrs = module.exports = overrideAll({ values: ['all', 'none', 'skip'], dflt: 'all', role: 'info', - editType: 'none', description: [ 'Determines which trace information appear when hovering nodes.', 'If `none` or `skip` are set, no information is displayed upon hovering.', @@ -196,7 +195,6 @@ var attrs = module.exports = overrideAll({ values: ['all', 'none', 'skip'], dflt: 'all', role: 'info', - editType: 'none', description: [ 'Determines which trace information appear when hovering links.', 'If `none` or `skip` are set, no information is displayed upon hovering.', From fe7ab494de4f3c932ebfca729658223e54177c4f Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Mon, 15 Oct 2018 14:52:19 -0400 Subject: [PATCH 14/18] sankey update defaults --- src/traces/sankey/defaults.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/traces/sankey/defaults.js b/src/traces/sankey/defaults.js index dfcea06ef2e..120bac93047 100644 --- a/src/traces/sankey/defaults.js +++ b/src/traces/sankey/defaults.js @@ -13,12 +13,19 @@ var attributes = require('./attributes'); var Color = require('../../components/color'); var tinycolor = require('tinycolor2'); var handleDomainDefaults = require('../../plots/domain').defaults; -var handleFxDefaults = require('../../components/fx/defaults'); +var handleHoverLabelDefaults = require('../../components/fx/hoverlabel_defaults'); +var fxAttrs = require('../../components/fx/attributes'); module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); } + function coerceHoverLabel(type) { + function coerce(attr, dflt) { + return Lib.coerce(traceIn[type], traceOut[type], fxAttrs, attr, dflt); + } + handleHoverLabelDefaults(traceIn[type], traceOut[type], coerce, layout.hoverlabel); + } coerce('node.label'); coerce('node.pad'); @@ -26,7 +33,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('node.line.color'); coerce('node.line.width'); coerce('node.hoverinfo'); - handleFxDefaults(traceIn.node, traceOut.node, defaultColor, layout); + coerceHoverLabel('node'); var colors = layout.colorway; @@ -43,7 +50,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('link.line.color'); coerce('link.line.width'); coerce('link.hoverinfo'); - handleFxDefaults(traceIn.link, traceOut.link, defaultColor, layout); + coerceHoverLabel('link'); coerce('link.color', traceOut.link.value.map(function() { return tinycolor(layout.paper_bgcolor).getLuminance() < 0.333 ? From 644c4e350c51d6ccfad6cc7a3dc963333c9dfcfc Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Mon, 15 Oct 2018 16:50:01 -0400 Subject: [PATCH 15/18] sankey improve attribute coercion --- src/traces/sankey/defaults.js | 52 +++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/traces/sankey/defaults.js b/src/traces/sankey/defaults.js index 120bac93047..387a5df1285 100644 --- a/src/traces/sankey/defaults.js +++ b/src/traces/sankey/defaults.js @@ -14,45 +14,49 @@ var Color = require('../../components/color'); var tinycolor = require('tinycolor2'); var handleDomainDefaults = require('../../plots/domain').defaults; var handleHoverLabelDefaults = require('../../components/fx/hoverlabel_defaults'); -var fxAttrs = require('../../components/fx/attributes'); +var Template = require('../../plot_api/plot_template'); module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); } - function coerceHoverLabel(type) { - function coerce(attr, dflt) { - return Lib.coerce(traceIn[type], traceOut[type], fxAttrs, attr, dflt); - } - handleHoverLabelDefaults(traceIn[type], traceOut[type], coerce, layout.hoverlabel); - } - coerce('node.label'); - coerce('node.pad'); - coerce('node.thickness'); - coerce('node.line.color'); - coerce('node.line.width'); - coerce('node.hoverinfo'); - coerceHoverLabel('node'); + // node attributes + var nodeIn = traceIn.node, nodeOut = Template.newContainer(traceOut, 'node'); + function coerceNode(attr, dflt) { + return Lib.coerce(nodeIn, nodeOut, attributes.node, attr, dflt); + } + coerceNode('label'); + coerceNode('pad'); + coerceNode('thickness'); + coerceNode('line.color'); + coerceNode('line.width'); + coerceNode('hoverinfo'); + handleHoverLabelDefaults(nodeIn, nodeOut, coerceNode, layout.hoverlabel); var colors = layout.colorway; var defaultNodePalette = function(i) {return colors[i % colors.length];}; - coerce('node.color', traceOut.node.label.map(function(d, i) { + coerceNode('color', nodeOut.label.map(function(d, i) { return Color.addOpacity(defaultNodePalette(i), 0.8); })); - coerce('link.label'); - coerce('link.source'); - coerce('link.target'); - coerce('link.value'); - coerce('link.line.color'); - coerce('link.line.width'); - coerce('link.hoverinfo'); - coerceHoverLabel('link'); + // link attributes + var linkIn = traceIn.link, linkOut = Template.newContainer(traceOut, 'link'); + function coerceLink(attr, dflt) { + return Lib.coerce(linkIn, linkOut, attributes.link, attr, dflt); + } + coerceLink('label'); + coerceLink('source'); + coerceLink('target'); + coerceLink('value'); + coerceLink('line.color'); + coerceLink('line.width'); + coerceLink('hoverinfo'); + handleHoverLabelDefaults(linkIn, linkOut, coerceLink, layout.hoverlabel); - coerce('link.color', traceOut.link.value.map(function() { + coerceLink('color', linkOut.value.map(function() { return tinycolor(layout.paper_bgcolor).getLuminance() < 0.333 ? 'rgba(255, 255, 255, 0.6)' : 'rgba(0, 0, 0, 0.2)'; From ccaef04c8a497ef1debbcf79086937663cc49808 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Tue, 16 Oct 2018 12:18:22 -0400 Subject: [PATCH 16/18] test sankey hoverlabels defined in template --- test/jasmine/tests/sankey_test.js | 53 +++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/test/jasmine/tests/sankey_test.js b/test/jasmine/tests/sankey_test.js index b2513d77f41..eb25d602b27 100644 --- a/test/jasmine/tests/sankey_test.js +++ b/test/jasmine/tests/sankey_test.js @@ -466,6 +466,59 @@ describe('sankey tests', function() { .then(done); }); + it('should show the correct hover labels with the style provided in template', function(done) { + var gd = createGraphDiv(); + var mockCopy = Lib.extendDeep({}, mock); + mockCopy.layout.template = { + data: { + sankey: [{ + node: { + hoverlabel: { + bgcolor: 'red', + bordercolor: 'blue', + font: { + size: 20, + color: 'black', + family: 'Roboto' + } + } + }, + link: { + hoverlabel: { + bgcolor: 'yellow', + bordercolor: 'magenta', + font: { + size: 18, + color: 'green', + family: 'Roboto' + } + } + } + }] + } + }; + + Plotly.plot(gd, mockCopy) + .then(function() { + _hover(404, 302); + + assertLabel( + ['Solid', 'incoming flow count: 4', 'outgoing flow count: 3', '447TWh'], + ['rgb(255, 0, 0)', 'rgb(0, 0, 255)', 20, 'Roboto', 'rgb(0, 0, 0)'] + ); + }) + .then(function() { + _hover(450, 300); + + assertLabel( + ['source: Solid', 'target: Industry', '46TWh'], + ['rgb(255, 255, 0)', 'rgb(255, 0, 255)', 18, 'Roboto', 'rgb(0, 128, 0)'] + ); + }) + .catch(failTest) + .then(done); + }); + it('should show the correct hover labels even if there is no link.label supplied', function(done) { var gd = createGraphDiv(); var mockCopy = Lib.extendDeep({}, mock); From dc8ba12f16245f89814ba4e8f733f733337ee12a Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Tue, 23 Oct 2018 12:46:18 -0400 Subject: [PATCH 17/18] sankey move defaultLinkColor outside for loop to speed up coerce --- src/traces/sankey/defaults.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/traces/sankey/defaults.js b/src/traces/sankey/defaults.js index 387a5df1285..3174a3348e2 100644 --- a/src/traces/sankey/defaults.js +++ b/src/traces/sankey/defaults.js @@ -56,10 +56,12 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerceLink('hoverinfo'); handleHoverLabelDefaults(linkIn, linkOut, coerceLink, layout.hoverlabel); + var defautLinkColor = tinycolor(layout.paper_bgcolor).getLuminance() < 0.333 ? + 'rgba(255, 255, 255, 0.6)' : + 'rgba(0, 0, 0, 0.2)'; + coerceLink('color', linkOut.value.map(function() { - return tinycolor(layout.paper_bgcolor).getLuminance() < 0.333 ? - 'rgba(255, 255, 255, 0.6)' : - 'rgba(0, 0, 0, 0.2)'; + return defautLinkColor; })); handleDomainDefaults(traceOut, layout, coerce); From ea73c64220ff299e1d041981b4c7e932addd0e58 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Tue, 23 Oct 2018 12:59:33 -0400 Subject: [PATCH 18/18] fix typo: defautLinkColor -> defaultLinkColor --- src/traces/sankey/defaults.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/traces/sankey/defaults.js b/src/traces/sankey/defaults.js index 3174a3348e2..a755fc34e75 100644 --- a/src/traces/sankey/defaults.js +++ b/src/traces/sankey/defaults.js @@ -56,12 +56,12 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerceLink('hoverinfo'); handleHoverLabelDefaults(linkIn, linkOut, coerceLink, layout.hoverlabel); - var defautLinkColor = tinycolor(layout.paper_bgcolor).getLuminance() < 0.333 ? + var defaultLinkColor = tinycolor(layout.paper_bgcolor).getLuminance() < 0.333 ? 'rgba(255, 255, 255, 0.6)' : 'rgba(0, 0, 0, 0.2)'; coerceLink('color', linkOut.value.map(function() { - return defautLinkColor; + return defaultLinkColor; })); handleDomainDefaults(traceOut, layout, coerce);