From 7b62b73d9cc89c14c0a1167076ddeeb71b135eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Tue, 11 Jul 2017 17:22:42 -0400 Subject: [PATCH 1/7] handle cliponaxis false/true traces coexisting on same subplot --- src/traces/scatter/plot.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/traces/scatter/plot.js b/src/traces/scatter/plot.js index 2155cc03e96..eec2d39e05b 100644 --- a/src/traces/scatter/plot.js +++ b/src/traces/scatter/plot.js @@ -404,8 +404,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition var trace = d[0].trace, s = d3.select(this), showMarkers = subTypes.hasMarkers(trace), - showText = subTypes.hasText(trace), - hasClipOnAxisFalse = trace.cliponaxis === false; + showText = subTypes.hasText(trace); var keyFunc = getKeyFunc(trace), markerFilter = hideFilter, @@ -450,7 +449,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition if(hasNode) { Drawing.singlePointStyle(d, sel, trace, markerScale, lineScale, gd); - if(hasClipOnAxisFalse) { + if(plotinfo.layerClipId) { Drawing.hideOutsideRangePoint(d, sel, xa, ya); } @@ -486,7 +485,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition hasNode = Drawing.translatePoint(d, sel, xa, ya); if(hasNode) { - if(hasClipOnAxisFalse) { + if(plotinfo.layerClipId) { Drawing.hideOutsideRangePoint(d, g, xa, ya); } } else { @@ -525,6 +524,13 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition .each(makePoints); join.exit().remove(); + + // lastly, clip points groups of `cliponaxis !== false` traces + // on `plotinfo._hasClipOnAxisFalse === true` subplots + join.each(function(d) { + var hasClipOnAxisFalse = d[0].trace.cliponaxis === false; + Drawing.setClipUrl(d3.select(this), hasClipOnAxisFalse ? null : plotinfo.layerClipId); + }); } function selectMarkers(gd, idx, plotinfo, cdscatter, cdscatterAll) { From 02b9fbc10b253656be0d49f4ecd41e017e2d466a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Tue, 11 Jul 2017 17:24:26 -0400 Subject: [PATCH 2/7] rename 'layers' cartesian constant -> 'traceLayerClasses' - which is more meaningul - other misc lint --- src/plot_api/subroutines.js | 4 ++-- src/plots/cartesian/constants.js | 4 ++-- src/plots/cartesian/index.js | 4 ++-- test/jasmine/tests/scatter_test.js | 5 ++--- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/plot_api/subroutines.js b/src/plot_api/subroutines.js index 8e6d5c71251..05ffc99a260 100644 --- a/src/plot_api/subroutines.js +++ b/src/plot_api/subroutines.js @@ -180,8 +180,8 @@ exports.lsInner = function(gd) { Drawing.setClipUrl(plotinfo.plot, plotClipId); - for(i = 0; i < cartesianConstants.layers.length; i++) { - var layer = cartesianConstants.layers[i]; + for(i = 0; i < cartesianConstants.traceLayerClasses.length; i++) { + var layer = cartesianConstants.traceLayerClasses[i]; if(layer !== 'scatterlayer') { plotinfo.plot.selectAll('g.' + layer).call(Drawing.setClipUrl, layerClipId); } diff --git a/src/plots/cartesian/constants.js b/src/plots/cartesian/constants.js index f502bcee5f5..e9a424a5ffc 100644 --- a/src/plots/cartesian/constants.js +++ b/src/plots/cartesian/constants.js @@ -51,14 +51,14 @@ module.exports = { DFLTRANGEX: [-1, 6], DFLTRANGEY: [-1, 4], - // Layers to keep plot types in the right order. + // Layers to keep trace types in the right order. // from back to front: // 1. heatmaps, 2D histos and contour maps // 2. bars / 1D histos // 3. errorbars for bars and scatter // 4. scatter // 5. box plots - layers: [ + traceLayerClasses: [ 'imagelayer', 'maplayer', 'barlayer', diff --git a/src/plots/cartesian/index.js b/src/plots/cartesian/index.js index 7548a608251..0005ca1760e 100644 --- a/src/plots/cartesian/index.js +++ b/src/plots/cartesian/index.js @@ -339,8 +339,8 @@ function makeSubplotLayer(plotinfo) { // common attributes for all subplots, overlays or not - for(var i = 0; i < constants.layers.length; i++) { - joinLayer(plotinfo.plot, 'g', constants.layers[i]); + for(var i = 0; i < constants.traceLayerClasses.length; i++) { + joinLayer(plotinfo.plot, 'g', constants.traceLayerClasses[i]); } plotinfo.xlines diff --git a/test/jasmine/tests/scatter_test.js b/test/jasmine/tests/scatter_test.js index 7dfd8572452..ec42e45a2e4 100644 --- a/test/jasmine/tests/scatter_test.js +++ b/test/jasmine/tests/scatter_test.js @@ -675,7 +675,7 @@ describe('scatter hoverPoints', function() { }); }); -describe('Test scatter *clipnaxis*', function() { +describe('Test scatter *clipnaxis*:', function() { afterEach(destroyGraphDiv); it('should show/hide point/text/errorbars in clipped and non-clipped layers', function(done) { @@ -684,7 +684,7 @@ describe('Test scatter *clipnaxis*', function() { var xRange0 = fig.layout.xaxis.range.slice(); var yRange0 = fig.layout.yaxis.range.slice(); - // only show *cliponaxis: false* trace + // only show 1 *cliponaxis: false* trace fig.data = [fig.data[2]]; // add lines @@ -805,5 +805,4 @@ describe('Test scatter *clipnaxis*', function() { .catch(fail) .then(done); }); - }); From 1c85de675ada7c46b688e49034612439a4178dc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Tue, 11 Jul 2017 17:25:57 -0400 Subject: [PATCH 3/7] add 'layer' axis attribute - has 2 possible values: 'above traces' and 'below traces' for now, but opens the door for other values down the road. --- src/plots/cartesian/constants.js | 7 ++- src/plots/cartesian/index.js | 51 ++++++++++++---- src/plots/cartesian/layout_attributes.js | 12 ++++ src/plots/cartesian/position_defaults.js | 2 + src/plots/plots.js | 25 +++++--- test/jasmine/tests/cartesian_test.js | 75 ++++++++++++++++++++++++ test/jasmine/tests/plots_test.js | 10 +++- 7 files changed, 162 insertions(+), 20 deletions(-) diff --git a/src/plots/cartesian/constants.js b/src/plots/cartesian/constants.js index e9a424a5ffc..80c6f48af50 100644 --- a/src/plots/cartesian/constants.js +++ b/src/plots/cartesian/constants.js @@ -65,5 +65,10 @@ module.exports = { 'carpetlayer', 'boxlayer', 'scatterlayer' - ] + ], + + layerValue2layerClass: { + 'above traces': 'above', + 'below traces': 'below' + } }; diff --git a/src/plots/cartesian/index.js b/src/plots/cartesian/index.js index 0005ca1760e..1b7ae929c9b 100644 --- a/src/plots/cartesian/index.js +++ b/src/plots/cartesian/index.js @@ -296,6 +296,8 @@ function makeSubplotData(gd) { function makeSubplotLayer(plotinfo) { var plotgroup = plotinfo.plotgroup; var id = plotinfo.id; + var xLayer = constants.layerValue2layerClass[plotinfo.xaxis.layer]; + var yLayer = constants.layerValue2layerClass[plotinfo.yaxis.layer]; if(!plotinfo.mainplot) { var backLayer = joinLayer(plotgroup, 'g', 'layer-subplot'); @@ -308,19 +310,36 @@ function makeSubplotLayer(plotinfo) { plotinfo.zerolinelayer = joinLayer(plotgroup, 'g', 'zerolinelayer'); plotinfo.overzero = joinLayer(plotgroup, 'g', 'overzero'); + joinLayer(plotgroup, 'path', 'xlines-below'); + joinLayer(plotgroup, 'path', 'ylines-below'); + plotinfo.overlinesBelow = joinLayer(plotgroup, 'g', 'overlines-below'); + + joinLayer(plotgroup, 'g', 'xaxislayer-below'); + joinLayer(plotgroup, 'g', 'yaxislayer-below'); + plotinfo.overaxesBelow = joinLayer(plotgroup, 'g', 'overaxes-below'); + plotinfo.plot = joinLayer(plotgroup, 'g', 'plot'); plotinfo.overplot = joinLayer(plotgroup, 'g', 'overplot'); - plotinfo.xlines = joinLayer(plotgroup, 'path', 'xlines'); - plotinfo.ylines = joinLayer(plotgroup, 'path', 'ylines'); - plotinfo.overlines = joinLayer(plotgroup, 'g', 'overlines'); + joinLayer(plotgroup, 'path', 'xlines-above'); + joinLayer(plotgroup, 'path', 'ylines-above'); + plotinfo.overlinesAbove = joinLayer(plotgroup, 'g', 'overlines-above'); + + joinLayer(plotgroup, 'g', 'xaxislayer-above'); + joinLayer(plotgroup, 'g', 'yaxislayer-above'); + plotinfo.overaxesAbove = joinLayer(plotgroup, 'g', 'overaxes-above'); - plotinfo.xaxislayer = joinLayer(plotgroup, 'g', 'xaxislayer'); - plotinfo.yaxislayer = joinLayer(plotgroup, 'g', 'yaxislayer'); - plotinfo.overaxes = joinLayer(plotgroup, 'g', 'overaxes'); + // set refs to correct layers as determined by 'axis.layer' + plotinfo.xlines = plotgroup.select('.xlines-' + xLayer); + plotinfo.ylines = plotgroup.select('.ylines-' + yLayer); + plotinfo.xaxislayer = plotgroup.select('.xaxislayer-' + xLayer); + plotinfo.yaxislayer = plotgroup.select('.yaxislayer-' + yLayer); } else { var mainplotinfo = plotinfo.mainplotinfo; + var mainplotgroup = mainplotinfo.plotgroup; + var xId = id + '-x'; + var yId = id + '-y'; // now make the components of overlaid subplots // overlays don't have backgrounds, and append all @@ -330,11 +349,23 @@ function makeSubplotLayer(plotinfo) { plotinfo.gridlayer = joinLayer(mainplotinfo.overgrid, 'g', id); plotinfo.zerolinelayer = joinLayer(mainplotinfo.overzero, 'g', id); + joinLayer(mainplotinfo.overlinesBelow, 'path', xId); + joinLayer(mainplotinfo.overlinesBelow, 'path', yId); + joinLayer(mainplotinfo.overaxesBelow, 'g', xId); + joinLayer(mainplotinfo.overaxesBelow, 'g', yId); + plotinfo.plot = joinLayer(mainplotinfo.overplot, 'g', id); - plotinfo.xlines = joinLayer(mainplotinfo.overlines, 'path', id + '-x'); - plotinfo.ylines = joinLayer(mainplotinfo.overlines, 'path', id + '-y'); - plotinfo.xaxislayer = joinLayer(mainplotinfo.overaxes, 'g', id + '-x'); - plotinfo.yaxislayer = joinLayer(mainplotinfo.overaxes, 'g', id + '-y'); + + joinLayer(mainplotinfo.overlinesAbove, 'path', xId); + joinLayer(mainplotinfo.overlinesAbove, 'path', yId); + joinLayer(mainplotinfo.overaxesAbove, 'g', xId); + joinLayer(mainplotinfo.overaxesAbove, 'g', yId); + + // set refs to correct layers as determined by 'abovetraces' + plotinfo.xlines = mainplotgroup.select('.overlines-' + xLayer).select('.' + xId); + plotinfo.ylines = mainplotgroup.select('.overlines-' + yLayer).select('.' + yId); + plotinfo.xaxislayer = mainplotgroup.select('.overaxes-' + xLayer).select('.' + xId); + plotinfo.yaxislayer = mainplotgroup.select('.overaxes-' + yLayer).select('.' + yId); } // common attributes for all subplots, overlays or not diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index ef75a5e91c5..62d5038a7fa 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -573,6 +573,18 @@ module.exports = { 'If *false*, this axis does not overlay any same-letter axes.' ].join(' ') }, + layer: { + valType: 'enumerated', + values: ['above traces', 'below traces'], + dflt: 'above traces', + role: 'info', + description: [ + 'Sets the layer on which this axis is displayed.', + 'If *above traces*, this axis is displayed above all the subplot\'s traces', + 'If *below traces*, this axis is displayed below all the subplot\'s traces,', + 'but above the grid lines.' + ].join(' ') + }, domain: { valType: 'info_array', role: 'info', diff --git a/src/plots/cartesian/position_defaults.js b/src/plots/cartesian/position_defaults.js index 94ea5ed4e73..ba797fbe038 100644 --- a/src/plots/cartesian/position_defaults.js +++ b/src/plots/cartesian/position_defaults.js @@ -59,5 +59,7 @@ module.exports = function handlePositionDefaults(containerIn, containerOut, coer Lib.noneOrAll(containerIn.domain, containerOut.domain, [0, 1]); } + coerce('layer'); + return containerOut; }; diff --git a/src/plots/plots.js b/src/plots/plots.js index 1a95bad876b..ab54d91ec7b 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -638,9 +638,11 @@ plots.linkSubplots = function(newFullData, newFullLayout, oldFullData, oldFullLa var ids = Plotly.Axes.getSubplots(mockGd); for(var i = 0; i < ids.length; i++) { - var id = ids[i], - oldSubplot = oldSubplots[id], - plotinfo; + var id = ids[i]; + var oldSubplot = oldSubplots[id]; + var xaxis = Plotly.Axes.getFromId(mockGd, id, 'x'); + var yaxis = Plotly.Axes.getFromId(mockGd, id, 'y'); + var plotinfo; if(oldSubplot) { plotinfo = newSubplots[id] = oldSubplot; @@ -648,14 +650,23 @@ plots.linkSubplots = function(newFullData, newFullLayout, oldFullData, oldFullLa if(plotinfo._scene2d) { plotinfo._scene2d.updateRefs(newFullLayout); } - } - else { + + if(plotinfo.xaxis.layer !== xaxis.layer) { + plotinfo.xlines.attr('d', null); + plotinfo.xaxislayer.selectAll('*').remove(); + } + + if(plotinfo.yaxis.layer !== yaxis.layer) { + plotinfo.ylines.attr('d', null); + plotinfo.yaxislayer.selectAll('*').remove(); + } + } else { plotinfo = newSubplots[id] = {}; plotinfo.id = id; } - plotinfo.xaxis = Plotly.Axes.getFromId(mockGd, id, 'x'); - plotinfo.yaxis = Plotly.Axes.getFromId(mockGd, id, 'y'); + plotinfo.xaxis = xaxis; + plotinfo.yaxis = yaxis; // By default, we clip at the subplot level, // but if one trace on a given subplot has *cliponaxis* set to false, diff --git a/test/jasmine/tests/cartesian_test.js b/test/jasmine/tests/cartesian_test.js index f700e378ed6..324d3789f87 100644 --- a/test/jasmine/tests/cartesian_test.js +++ b/test/jasmine/tests/cartesian_test.js @@ -403,4 +403,79 @@ describe('subplot creation / deletion:', function() { .catch(failTest) .then(done); }); + + it('should clear obsolete content out of axis layers when relayout\'ing *layer*', function(done) { + var fig = Lib.extendDeep({}, require('@mocks/overlaying-axis-lines.json')); + + function assertPathDatum(sel, expected, msg) { + expect(sel.attr('d') === null ? false : true).toBe(expected, msg); + } + + function assertChildrenCnt(sel, expected, msg) { + expect(sel.selectAll('*').size()).toBe(expected, msg); + } + + function _assert(xBelow, yBelow, xAbove, yAbove) { + var g = d3.select('.subplot.xy'); + + assertPathDatum(g.select('.xlines-below'), xBelow[0], 'xlines below'); + assertChildrenCnt(g.select('.xaxislayer-below'), xBelow[1], 'xaxislayer below'); + + assertPathDatum(g.select('.ylines-below'), yBelow[0], 'ylines below'); + assertChildrenCnt(g.select('.yaxislayer-below'), yBelow[1], 'yaxislayer below'); + + assertPathDatum(g.select('.xlines-above'), xAbove[0], 'xlines above'); + assertChildrenCnt(g.select('.xaxislayer-above'), xAbove[1], 'xaxislayer above'); + + assertPathDatum(g.select('.ylines-above'), yAbove[0], 'ylines above'); + assertChildrenCnt(g.select('.yaxislayer-above'), yAbove[1], 'yaxislayer above'); + } + + Plotly.plot(gd, fig).then(function() { + _assert( + [false, 0], + [false, 0], + [true, 10], + [true, 10] + ); + return Plotly.relayout(gd, 'xaxis.layer', 'below traces'); + }) + .then(function() { + _assert( + [true, 10], + [false, 0], + [false, 0], + [true, 10] + ); + return Plotly.relayout(gd, 'yaxis.layer', 'below traces'); + }) + .then(function() { + _assert( + [true, 10], + [true, 10], + [false, 0], + [false, 0] + ); + return Plotly.relayout(gd, { 'xaxis.layer': null, 'yaxis.layer': null }); + }) + .then(function() { + _assert( + [false, 0], + [false, 0], + [true, 10], + [true, 10] + ); + return Plotly.relayout(gd, { 'xaxis.layer': 'below traces', 'yaxis.layer': 'below traces' }); + }) + .then(function() { + _assert( + [true, 10], + [true, 10], + [false, 0], + [false, 0] + ); + }) + .catch(failTest) + .then(done); + }); }); diff --git a/test/jasmine/tests/plots_test.js b/test/jasmine/tests/plots_test.js index b333989aeae..b95b6482db0 100644 --- a/test/jasmine/tests/plots_test.js +++ b/test/jasmine/tests/plots_test.js @@ -1,5 +1,6 @@ var Plotly = require('@lib/index'); var Plots = require('@src/plots/plots'); +var Lib = require('@src/lib'); var d3 = require('d3'); var createGraphDiv = require('../assets/create_graph_div'); @@ -38,13 +39,18 @@ describe('Test Plots', function() { var oldFullLayout = { _plots: { xy: { plot: {} } }, - xaxis: { c2p: function() {} }, - yaxis: { _m: 20 }, + xaxis: { c2p: function() {}, layer: 'above traces' }, + yaxis: { _m: 20, layer: 'above traces' }, scene: { _scene: {} }, annotations: [{ _min: 10, }, { _max: 20 }], someFunc: function() {} }; + Lib.extendFlat(oldFullLayout._plots.xy, { + xaxis: oldFullLayout.xaxis, + yaxis: oldFullLayout.yaxis + }); + var newData = [{ type: 'scatter3d', z: [1, 2, 3, 4] From e44aa4d5d313574e630d56cda3bc9b8a97af4da0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Tue, 11 Jul 2017 17:28:45 -0400 Subject: [PATCH 4/7] improve cliponaxis_false mock - show off `(x|y)axis.layer` - lock down behavior for `cliponaxis: true` traces on hasClipOnAxisFalse subplot - add annotations for more descriptive mock --- test/image/baselines/cliponaxis_false.png | Bin 37319 -> 50612 bytes test/image/mocks/cliponaxis_false.json | 67 ++++++++++++++++++++-- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/test/image/baselines/cliponaxis_false.png b/test/image/baselines/cliponaxis_false.png index aaa7ecb5d2df1b81253b089caf1945dc39753948..43f2dce84235734c4a0c5dd5cc23950ff44e5dc6 100644 GIT binary patch literal 50612 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 literal 37319 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 diff --git a/test/image/mocks/cliponaxis_false.json b/test/image/mocks/cliponaxis_false.json index 1053fc82087..22b38fd91c0 100644 --- a/test/image/mocks/cliponaxis_false.json +++ b/test/image/mocks/cliponaxis_false.json @@ -21,7 +21,7 @@ "opacity": 1 }, "text": "not
clipped", - "textposition": ["left", "left", "bottom", "right", "right", "top"], + "textposition": ["left", "left", "bottom", "bottom left", "top left", "top"], "error_y": { "array": [0.1, 0.2, 0.3, 0.1, 0.3, 0.2], "arrayminus": [0.1, 0.2, 0.1, 0.1, 0.1, 0.2] @@ -32,23 +32,82 @@ }, "cliponaxis": false + }, + { + "mode": "markers", + "x": [1, 1, 2, 3, 3, 2], + "y": [2, 1, 1, 1, 2, 2], + "marker": { + "size": [15, 20, 40, 25, 50, 40], + "opacity": 1 + }, + "cliponaxis": false, + "xaxis": "x2", + "yaxis": "y2" + }, + { + "mode": "markers+text", + "x": [1, 1.5, 2.5, 3, 2.5, 1.5], + "y": [1.5, 1, 1, 1.5, 2, 2], + "marker": { + "size": 30 + }, + "text": "clipped
should not see this!", + "textposition": ["left", "bottom", "bottom", "right", "top", "top"], + "cliponaxis": true } ], "layout": { "xaxis": { + "domain": [0, 0.48], "range": [1, 3], "showline": true, "linewidth": 2, - "mirror": "all" + "mirror": "all", + "layer": "below traces" }, "yaxis": { "range": [1, 2], "showline": true, "linewidth": 2, - "mirror": "all" + "mirror": "all", + "layer": "below traces" + }, + "xaxis2": { + "anchor": "y2", + "range": [1, 3], + "domain": [0.52, 1], + "showline": true, + "linewidth": 2, + "mirror": "all", + "layer": "above traces" + }, + "yaxis2": { + "anchor": "x2", + "range": [1, 2], + "showline": true, + "linewidth": 2, + "mirror": "all", + "side": "right", + "layer": "above traces" }, + "annotations": [{ + "showarrow": false, + "xref": "paper", "yref": "paper", + "x": 0.24, "y": 0.5, + "xanchor": "center", + "text": "axis layer
below traces" + }, { + "showarrow": false, + "xref": "paper", "yref": "paper", + "x": 0.74, "y": 0.5, + "xanchor": "center", + "text": "axis layer
above traces" + }], "showlegend": false, "dragmode": "pan", - "hovermode": "closest" + "hovermode": "closest", + "height": 500, + "width": 800 } } From e84701f75ac30e093dfcb73341a3ec472b8643da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 12 Jul 2017 16:40:31 -0400 Subject: [PATCH 5/7] replace strict-d3 IIFE with browserify 'require' transform - which replaces all `require('d3')` with `require('./strict-d3')` - so that strict-d3.js can more easily be used across all our tools - activate when bundling plotly.js in jasmine tests, `npm run watch` and `npm run cibuild` - :hocho: - diff --git a/tasks/cibundle.js b/tasks/cibundle.js index cd5ff768a4c..6f6e13d90f0 100644 --- a/tasks/cibundle.js +++ b/tasks/cibundle.js @@ -16,6 +16,7 @@ var _bundle = require('./util/browserify_wrapper'); _bundle(constants.pathToPlotlyIndex, constants.pathToPlotlyBuild, { standalone: 'Plotly', pathToMinBundle: constants.pathToPlotlyDistMin, + debug: true }); // Browserify the geo assets diff --git a/tasks/util/browserify_wrapper.js b/tasks/util/browserify_wrapper.js index 0e13fa01874..7050706eb93 100644 --- a/tasks/util/browserify_wrapper.js +++ b/tasks/util/browserify_wrapper.js @@ -7,6 +7,7 @@ var UglifyJS = require('uglify-js'); var constants = require('./constants'); var compressAttributes = require('./compress_attributes'); var patchMinified = require('./patch_minified'); +var strictD3 = require('./strict_d3'); /** Convenience browserify wrapper * @@ -32,16 +33,20 @@ module.exports = function _bundle(pathToIndex, pathToBundle, opts) { opts = opts || {}; // do we output a minified file? - var pathToMinBundle = opts.pathToMinBundle, - outputMinified = !!pathToMinBundle && !opts.debug; + var pathToMinBundle = opts.pathToMinBundle; + var outputMinified = !!pathToMinBundle; var browserifyOpts = {}; browserifyOpts.standalone = opts.standalone; browserifyOpts.debug = opts.debug; browserifyOpts.transform = outputMinified ? [compressAttributes] : []; - var b = browserify(pathToIndex, browserifyOpts), - bundleWriteStream = fs.createWriteStream(pathToBundle); + if(opts.debug) { + browserifyOpts.transform.push(strictD3); + } + + var b = browserify(pathToIndex, browserifyOpts); + var bundleWriteStream = fs.createWriteStream(pathToBundle); bundleWriteStream.on('finish', function() { logger(pathToBundle); diff --git a/tasks/util/constants.js b/tasks/util/constants.js index 9c8b1aaf828..7cffc50cfe0 100644 --- a/tasks/util/constants.js +++ b/tasks/util/constants.js @@ -58,6 +58,7 @@ module.exports = { pathToTestDashboardBundle: path.join(pathToBuild, 'test_dashboard-bundle.js'), pathToImageViewerBundle: path.join(pathToBuild, 'image_viewer-bundle.js'), + pathToImageTest: pathToImageTest, pathToTestImageMocks: path.join(pathToImageTest, 'mocks/'), pathToTestImageBaselines: path.join(pathToImageTest, 'baselines/'), pathToTestImages: path.join(pathToBuild, 'test_images/'), diff --git a/tasks/util/strict_d3.js b/tasks/util/strict_d3.js new file mode 100644 index 00000000000..1e51ab8912b --- /dev/null +++ b/tasks/util/strict_d3.js @@ -0,0 +1,26 @@ +var path = require('path'); +var transformTools = require('browserify-transform-tools'); +var constants = require('./constants'); + +var pathToStrictD3Module = path.join( + constants.pathToImageTest, + 'strict-d3.js' +); + +/** + * Transform `require('d3')` expressions to `require(/path/to/strict-d3.js)` + */ + +module.exports = transformTools.makeRequireTransform('requireTransform', + { evaluateArguments: true, jsFilesOnly: true }, + function(args, opts, cb) { + var pathIn = args[0]; + var pathOut; + + if(pathIn === 'd3' && opts.file !== pathToStrictD3Module) { + pathOut = 'require(\'' + pathToStrictD3Module + '\')'; + } + + if(pathOut) return cb(null, pathOut); + else return cb(); + }); diff --git a/tasks/util/watchified_bundle.js b/tasks/util/watchified_bundle.js index e2ab22068ee..864716dca6f 100644 --- a/tasks/util/watchified_bundle.js +++ b/tasks/util/watchified_bundle.js @@ -7,6 +7,7 @@ var prettySize = require('prettysize'); var constants = require('./constants'); var common = require('./common'); var compressAttributes = require('./compress_attributes'); +var strictD3 = require('./strict_d3'); /** * Make a plotly.js browserify bundle function watched by watchify. @@ -22,7 +23,7 @@ module.exports = function makeWatchifiedBundle(onFirstBundleCallback) { var b = browserify(constants.pathToPlotlyIndex, { debug: true, standalone: 'Plotly', - transform: [compressAttributes], + transform: [strictD3, compressAttributes], cache: {}, packageCache: {}, plugin: [watchify] diff --git a/test/image/index.html b/test/image/index.html index 9907839a5d5..efa5c6d2edc 100644 --- a/test/image/index.html +++ b/test/image/index.html @@ -5,7 +5,6 @@ - diff --git a/test/image/strict-d3.js b/test/image/strict-d3.js index d54336e3dfb..a28a4eb033b 100644 --- a/test/image/strict-d3.js +++ b/test/image/strict-d3.js @@ -2,77 +2,45 @@ * strict-d3: wrap selection.style to prohibit specific incorrect style values * that are known to cause problems in IE (at least IE9) */ +'use strict'; -/* global Plotly:false */ -(function() { - 'use strict'; +var d3 = require('d3'); +var isNumeric = require('fast-isnumeric'); - var selProto = Plotly.d3.selection.prototype; +var selProto = d3.selection.prototype; +var originalSelStyle = selProto.style; - var originalSelStyle = selProto.style; +selProto.style = function() { + var sel = this; + var obj = arguments[0]; - selProto.style = function() { - var sel = this, - obj = arguments[0]; - - if(sel.size()) { - if(typeof obj === 'string') { - checkVal(sel, obj, arguments[1]); - } - else { - Object.keys(obj).forEach(function(key) { checkVal(sel, key, obj[key]); }); - } - } - - return originalSelStyle.apply(sel, arguments); - }; - - function checkVal(sel, key, val) { - if(typeof val === 'string') { - // in case of multipart styles (stroke-dasharray, margins, etc) - // test each part separately - val.split(/[, ]/g).forEach(function(valPart) { - var pxSplit = valPart.length - 2; - if(valPart.substr(pxSplit) === 'px' && !isNumeric(valPart.substr(0, pxSplit))) { - throw new Error('d3 selection.style called with value: ' + val); - } - }); - } - - // Microsoft browsers incl. "Edge" don't support CSS transform on SVG elements - if(key === 'transform' && sel.node() instanceof SVGElement) { - throw new Error('d3 selection.style called on an SVG element with key: ' + key); + if(sel.size()) { + if(typeof obj === 'string') { + checkStyleVal(sel, obj, arguments[1]); + } else { + Object.keys(obj).forEach(function(key) { checkStyleVal(sel, key, obj[key]); }); } } - // below ripped from fast-isnumeric so I don't need to build this file - - function allBlankCharCodes(str) { - var l = str.length, - a; - for(var i = 0; i < l; i++) { - a = str.charCodeAt(i); - if((a < 9 || a > 13) && (a !== 32) && (a !== 133) && (a !== 160) && - (a !== 5760) && (a !== 6158) && (a < 8192 || a > 8205) && - (a !== 8232) && (a !== 8233) && (a !== 8239) && (a !== 8287) && - (a !== 8288) && (a !== 12288) && (a !== 65279)) { - return false; + return originalSelStyle.apply(sel, arguments); +}; + +function checkStyleVal(sel, key, val) { + if(typeof val === 'string') { + // in case of multipart styles (stroke-dasharray, margins, etc) + // test each part separately + val.split(/[, ]/g).forEach(function(valPart) { + var pxSplit = valPart.length - 2; + if(valPart.substr(pxSplit) === 'px' && !isNumeric(valPart.substr(0, pxSplit))) { + throw new Error('d3 selection.style called with value: ' + val); } - } - return true; + }); } - function isNumeric(n) { - var type = typeof n; - if(type === 'string') { - var original = n; - n = +n; - // whitespace strings cast to zero - filter them out - if(n === 0 && allBlankCharCodes(original)) return false; - } - else if(type !== 'number') return false; - - return n - n < 1; + // Microsoft browsers incl. "Edge" don't support CSS transform on SVG elements + if(key === 'transform' && sel.node() instanceof SVGElement) { + throw new Error('d3 selection.style called on an SVG element with key: ' + key); } +} -})(); +module.exports = d3; diff --git a/test/jasmine/karma.conf.js b/test/jasmine/karma.conf.js index 8f8af91fbf7..43408f66367 100644 --- a/test/jasmine/karma.conf.js +++ b/test/jasmine/karma.conf.js @@ -95,6 +95,7 @@ if(isFullSuite) { } var pathToShortcutPath = path.join(__dirname, '..', '..', 'tasks', 'util', 'shortcut_paths.js'); +var pathToStrictD3 = path.join(__dirname, '..', '..', 'tasks', 'util', 'strict_d3.js'); var pathToMain = path.join(__dirname, '..', '..', 'lib', 'index.js'); var pathToJQuery = path.join(__dirname, 'assets', 'jquery-1.8.3.min.js'); var pathToIE9mock = path.join(__dirname, 'assets', 'ie9_mock.js'); @@ -193,7 +194,7 @@ func.defaultConfig = { }, browserify: { - transform: [pathToShortcutPath], + transform: [pathToStrictD3, pathToShortcutPath], extensions: ['.js'], watch: !argv.nowatch, debug: true From e234827dac252743bb68329487cabaee80dab953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 12 Jul 2017 16:44:17 -0400 Subject: [PATCH 6/7] fixes #1873 - apply transform on child - instead of on element itself - see https://codepen.io/etpinard/pen/eRbxrp for more info on the problem - lock down this rule by adding condition in strict-d3.js --- src/plots/cartesian/dragbox.js | 2 +- src/plots/cartesian/transition_axes.js | 4 ++-- src/plots/ternary/ternary.js | 4 ++-- test/image/strict-d3.js | 24 ++++++++++++++++++++++++ 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/plots/cartesian/dragbox.js b/src/plots/cartesian/dragbox.js index fa93d51e5b4..c1e2b4cda46 100644 --- a/src/plots/cartesian/dragbox.js +++ b/src/plots/cartesian/dragbox.js @@ -743,7 +743,7 @@ module.exports = function dragBox(gd, plotinfo, x, y, w, h, ns, ew) { var plotDx = xa2._offset - clipDx / xScaleFactor2, plotDy = ya2._offset - clipDy / yScaleFactor2; - fullLayout._defs.selectAll('#' + subplot.clipId) + fullLayout._defs.select('#' + subplot.clipId + '> rect') .call(Drawing.setTranslate, clipDx, clipDy) .call(Drawing.setScale, xScaleFactor2, yScaleFactor2); diff --git a/src/plots/cartesian/transition_axes.js b/src/plots/cartesian/transition_axes.js index 37557d6cc5f..2994b07efe9 100644 --- a/src/plots/cartesian/transition_axes.js +++ b/src/plots/cartesian/transition_axes.js @@ -137,7 +137,7 @@ module.exports = function transitionAxes(gd, newLayout, transitionOpts, makeOnCo var xa2 = subplot.xaxis; var ya2 = subplot.yaxis; - fullLayout._defs.selectAll('#' + subplot.clipId) + fullLayout._defs.select('#' + subplot.clipId + '> rect') .call(Drawing.setTranslate, 0, 0) .call(Drawing.setScale, 1, 1); @@ -221,7 +221,7 @@ module.exports = function transitionAxes(gd, newLayout, transitionOpts, makeOnCo var plotDx = xa2._offset - fracDx, plotDy = ya2._offset - fracDy; - fullLayout._defs.selectAll('#' + subplot.clipId) + fullLayout._defs.select('#' + subplot.clipId + '> rect') .call(Drawing.setTranslate, clipDx, clipDy) .call(Drawing.setScale, 1 / xScaleFactor, 1 / yScaleFactor); diff --git a/src/plots/ternary/ternary.js b/src/plots/ternary/ternary.js index 0d4431f7a1a..c5840d5e9ec 100644 --- a/src/plots/ternary/ternary.js +++ b/src/plots/ternary/ternary.js @@ -292,7 +292,7 @@ proto.adjustLayout = function(ternaryLayout, graphSize) { _this.plotContainer.selectAll('.scatterlayer,.maplayer') .attr('transform', plotTransform); - _this.clipDefRelative.attr('transform', null); + _this.clipDefRelative.select('path').attr('transform', null); // TODO: shift axes to accommodate linewidth*sin(30) tick mark angle @@ -619,7 +619,7 @@ proto.initInteractions = function() { .attr('transform', plotTransform); var plotTransform2 = 'translate(' + -dx + ',' + -dy + ')'; - _this.clipDefRelative.attr('transform', plotTransform2); + _this.clipDefRelative.select('path').attr('transform', plotTransform2); // move the ticks _this.aaxis.range = [mins.a, _this.sum - mins.b - mins.c]; diff --git a/test/image/strict-d3.js b/test/image/strict-d3.js index a28a4eb033b..fec9f4cbec0 100644 --- a/test/image/strict-d3.js +++ b/test/image/strict-d3.js @@ -8,8 +8,24 @@ var d3 = require('d3'); var isNumeric = require('fast-isnumeric'); var selProto = d3.selection.prototype; +var originalSelAttr = selProto.attr; var originalSelStyle = selProto.style; +selProto.attr = function() { + var sel = this; + var obj = arguments[0]; + + if(sel.size()) { + if(typeof obj === 'string') { + checkAttrVal(sel, obj, arguments[1]); + } else { + Object.keys(obj).forEach(function(key) { checkAttrVal(sel, key, obj[key]); }); + } + } + + return originalSelAttr.apply(sel, arguments); +}; + selProto.style = function() { var sel = this; var obj = arguments[0]; @@ -25,6 +41,14 @@ selProto.style = function() { return originalSelStyle.apply(sel, arguments); }; +function checkAttrVal(sel, key) { + // setting the transform attribute on a does not + // work in Chrome, IE and Edge + if(sel.node().nodeName === 'clipPath' && key === 'transform') { + throw new Error('d3 selection.attr called with key \'transform\' on a clipPath node'); + } +} + function checkStyleVal(sel, key, val) { if(typeof val === 'string') { // in case of multipart styles (stroke-dasharray, margins, etc) From 6f494c692f70c8d2714d1c4457b9dbbd5da2eb90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 12 Jul 2017 18:04:15 -0400 Subject: [PATCH 7/7] talk about 'cliponaxis' in axis 'layer' description and vice-versa --- src/plots/cartesian/layout_attributes.js | 4 +++- src/traces/scatter/attributes.js | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index 62d5038a7fa..90855d7452a 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -582,7 +582,9 @@ module.exports = { 'Sets the layer on which this axis is displayed.', 'If *above traces*, this axis is displayed above all the subplot\'s traces', 'If *below traces*, this axis is displayed below all the subplot\'s traces,', - 'but above the grid lines.' + 'but above the grid lines.', + 'Useful when used together with scatter-like traces with `cliponaxis`', + 'set to *false* to show markers and/or text nodes above this axis.' ].join(' ') }, domain: { diff --git a/src/traces/scatter/attributes.js b/src/traces/scatter/attributes.js index 2076f1012b7..f48092247b3 100644 --- a/src/traces/scatter/attributes.js +++ b/src/traces/scatter/attributes.js @@ -186,7 +186,9 @@ module.exports = { editType: 'doplot', description: [ 'Determines whether or not markers and text nodes', - 'are clipped about the subplot axes.' + 'are clipped about the subplot axes.', + 'To show markers and text nodes above axis lines and tick labels,', + 'make sure to set `xaxis.layer` and `yaxis.layer` to *below traces*.' ].join(' ') },