From f05a29a0d8f75499ebdd05d5486fe21b5b8d21d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Sun, 31 Mar 2019 13:48:56 -0400 Subject: [PATCH] draw blank bars as empty paths + allow blank bars to draw outsidetext --- src/traces/bar/plot.js | 37 +++++++++--------- .../image/baselines/blank-bar-outsidetext.png | Bin 0 -> 12621 bytes test/image/mocks/blank-bar-outsidetext.json | 29 ++++++++++++++ test/jasmine/tests/bar_test.js | 10 +++-- test/jasmine/tests/waterfall_test.js | 10 +++-- 5 files changed, 60 insertions(+), 26 deletions(-) create mode 100644 test/image/baselines/blank-bar-outsidetext.png create mode 100644 test/image/mocks/blank-bar-outsidetext.json diff --git a/src/traces/bar/plot.js b/src/traces/bar/plot.js index abc63612673..c8d77b2f00b 100644 --- a/src/traces/bar/plot.js +++ b/src/traces/bar/plot.js @@ -83,12 +83,11 @@ module.exports = function plot(gd, plotinfo, cdModule, traceLayer) { di.ct = [(x0 + x1) / 2, y1]; } - if(!isNumeric(x0) || !isNumeric(x1) || - !isNumeric(y0) || !isNumeric(y1) || - x0 === x1 || y0 === y1) { - bar.remove(); - return; - } + var isBlank = di.isBlank = ( + !isNumeric(x0) || !isNumeric(x1) || + !isNumeric(y0) || !isNumeric(y1) || + x0 === x1 || y0 === y1 + ); // in waterfall mode `between` we need to adjust bar end points to match the connector width if(adjustPixel) { @@ -158,7 +157,7 @@ module.exports = function plot(gd, plotinfo, cdModule, traceLayer) { Lib.ensureSingle(bar, 'path') .style('vector-effect', 'non-scaling-stroke') - .attr('d', 'M' + x0 + ',' + y0 + 'V' + y1 + 'H' + x1 + 'V' + y0 + 'Z') + .attr('d', isBlank ? 'M0,0Z' : 'M' + x0 + ',' + y0 + 'V' + y1 + 'H' + x1 + 'V' + y0 + 'Z') .call(Drawing.setClipUrl, plotinfo.layerClipId, gd); appendBarText(gd, bar, cd, i, x0, x1, y0, y1); @@ -206,11 +205,6 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { var text = getText(trace, i); textPosition = getTextPosition(trace, i); - if(!text || textPosition === 'none') { - bar.select('text').remove(); - return; - } - var layoutFont = fullLayout.font; var barColor = style.getBarColor(calcTrace[i], trace); var insideTextFont = style.getInsideTextFont(trace, i, layoutFont, barColor); @@ -219,15 +213,20 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { // compute text position var prefix = trace.type === 'waterfall' ? 'waterfall' : 'bar'; var barmode = fullLayout[prefix + 'mode']; - var inStackMode = (barmode === 'stack'); - var inRelativeMode = (barmode === 'relative'); - var inStackOrRelativeMode = inStackMode || inRelativeMode; + var inStackOrRelativeMode = barmode === 'stack' || barmode === 'relative'; var calcBar = calcTrace[i]; var isOutmostBar = !inStackOrRelativeMode || calcBar._outmost; - var barWidth = Math.abs(x1 - x0) - 2 * TEXTPAD; // padding excluded - var barHeight = Math.abs(y1 - y0) - 2 * TEXTPAD; // padding excluded + // padding excluded + var barWidth = Math.abs(x1 - x0) - 2 * TEXTPAD; + var barHeight = Math.abs(y1 - y0) - 2 * TEXTPAD; + + if(!text || textPosition === 'none' || + (calcBar.isBlank && (textPosition === 'auto' || textPosition === 'inside'))) { + bar.select('text').remove(); + return; + } var textSelection; var textBB; @@ -263,7 +262,9 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { textSelection.remove(); textSelection = null; } - } else textPosition = 'inside'; + } else { + textPosition = 'inside'; + } } if(!textSelection) { diff --git a/test/image/baselines/blank-bar-outsidetext.png b/test/image/baselines/blank-bar-outsidetext.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a2cd42638fb3102d7d1aca7a447c693b1bed19 GIT binary patch literal 12621 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