From 6e0f7bd35391c8e51b82cbb005929e3b67ac73ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Mon, 25 Apr 2016 10:45:07 -0400 Subject: [PATCH 1/8] (wip) factor out 'get-autorange' algo from doAutorange, - so that range slider can use it without resetting gd.layout.xaxis.range --- src/components/rangeslider/create_slider.js | 5 + src/plots/cartesian/axes.js | 159 +++++++++++--------- 2 files changed, 94 insertions(+), 70 deletions(-) diff --git a/src/components/rangeslider/create_slider.js b/src/components/rangeslider/create_slider.js index 0aaf2b98315..56a230c4d63 100644 --- a/src/components/rangeslider/create_slider.js +++ b/src/components/rangeslider/create_slider.js @@ -10,6 +10,7 @@ var Plotly = require('../../plotly'); +var Axes = require('../../plots/cartesian/axes'); var Lib = require('../../lib'); var svgNS = require('../../constants/xmlns_namespaces').svg; @@ -129,6 +130,10 @@ module.exports = function createSlider(gd, minStart, maxStart) { }); + console.log('in create slider') + console.log(Axes.getAutoRange(fullLayout.xaxis)) + console.log(fullLayout.xaxis.range) + slider.addEventListener('mousedown', function(event) { var target = event.target, startX = event.clientX, diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index d5610fca05b..b92e1e98c5d 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -110,91 +110,108 @@ axes.minDtick = function(ax,newDiff,newFirst,allow) { } }; -axes.doAutoRange = function(ax) { - if(!ax._length) ax.setScale(); +axes.getAutoRange = function(ax) { + var newRange = []; - if(ax.autorange && ax._min && ax._max && - ax._min.length && ax._max.length) { - var minmin = ax._min[0].val, - maxmax = ax._max[0].val, - i; - - for(i = 1; i < ax._min.length; i++) { - if(minmin !== maxmax) break; - minmin = Math.min(minmin, ax._min[i].val); - } - for(i = 1; i < ax._max.length; i++) { - if(minmin !== maxmax) break; - maxmax = Math.max(maxmax, ax._max[i].val); - } - - var j,minpt,maxpt,minbest,maxbest,dp,dv, - mbest = 0, - axReverse = (ax.range && ax.range[1]0 && dp>0 && dv/dp > mbest) { - minbest = minpt; - maxbest = maxpt; - mbest = dv/dp; - } + var minmin = ax._min[0].val, + maxmax = ax._max[0].val, + i; + + for(i = 1; i < ax._min.length; i++) { + if(minmin !== maxmax) break; + minmin = Math.min(minmin, ax._min[i].val); + } + for(i = 1; i < ax._max.length; i++) { + if(minmin !== maxmax) break; + maxmax = Math.max(maxmax, ax._max[i].val); + } + + var j,minpt,maxpt,minbest,maxbest,dp,dv, + mbest = 0, + axReverse = (ax.range && ax.range[1]0 && dp>0 && dv/dp > mbest) { + minbest = minpt; + maxbest = maxpt; + mbest = dv/dp; } } - if(minmin===maxmax) { - ax.range = axReverse ? - [minmin+1, ax.rangemode!=='normal' ? 0 : minmin-1] : - [ax.rangemode!=='normal' ? 0 : minmin-1, minmin+1]; - } - else if(mbest) { - if(ax.type==='linear' || ax.type==='-') { - if(ax.rangemode==='tozero' && minbest.val>=0) { + } + + if(minmin === maxmax) { + newRange = axReverse ? + [minmin+1, ax.rangemode!=='normal' ? 0 : minmin-1] : + [ax.rangemode!=='normal' ? 0 : minmin-1, minmin+1]; + } + else if(mbest) { + if(ax.type==='linear' || ax.type==='-') { + if(ax.rangemode==='tozero' && minbest.val>=0) { + minbest = {val: 0, pad: 0}; + } + else if(ax.rangemode==='nonnegative') { + if(minbest.val - mbest*minbest.pad<0) { minbest = {val: 0, pad: 0}; } - else if(ax.rangemode==='nonnegative') { - if(minbest.val - mbest*minbest.pad<0) { - minbest = {val: 0, pad: 0}; - } - if(maxbest.val<0) { - maxbest = {val: 1, pad: 0}; - } + if(maxbest.val<0) { + maxbest = {val: 1, pad: 0}; } - - // in case it changed again... - mbest = (maxbest.val-minbest.val) / - (ax._length-minbest.pad-maxbest.pad); } - ax.range = [ - minbest.val - mbest*minbest.pad, - maxbest.val + mbest*maxbest.pad - ]; + // in case it changed again... + mbest = (maxbest.val-minbest.val) / + (ax._length-minbest.pad-maxbest.pad); + } - // don't let axis have zero size - if(ax.range[0]===ax.range[1]) { - ax.range = [ax.range[0]-1, ax.range[0]+1]; - } + newRange = [ + minbest.val - mbest*minbest.pad, + maxbest.val + mbest*maxbest.pad + ]; - // maintain reversal - if(axReverse) { - ax.range.reverse(); - } + // don't let axis have zero size + if(newRange[0] === newRange[1]) { + newRange = [newRange[0]-1, newRange[0]+1]; } + // maintain reversal + if(axReverse) { + newRange.reverse(); + } + } + + return newRange; +}; + +axes.doAutoRange = function(ax) { + if(!ax._length) ax.setScale(); + + // TODO do we really need this? + var hasDeps = (ax._min && ax._max && ax._min.length && ax._max.length); + + console.log('in do autorange') + + if(ax.autorange && hasDeps) { + ax.range = axes.getAutoRange(ax); + // doAutoRange will get called on fullLayout, // but we want to report its results back to layout var axIn = ax._gd.layout[ax._name]; + if(!axIn) ax._gd.layout[ax._name] = axIn = {}; - if(axIn!==ax) { + + if(axIn !== ax) { axIn.range = ax.range.slice(); axIn.autorange = ax.autorange; } @@ -241,12 +258,14 @@ axes.saveRangeInitial = function(gd, overwrite) { // and make it a tight bound if possible var FP_SAFE = Number.MAX_VALUE/2; axes.expand = function(ax, data, options) { - if(!ax.autorange || !data) return; + if(!(ax.autorange || (ax.rangeslider || {}).visible) || !data) return; if(!ax._min) ax._min = []; if(!ax._max) ax._max = []; if(!options) options = {}; if(!ax._m) ax.setScale(); + console.log('in exapnd', ax._name) + var len = data.length, extrappad = options.padded ? ax._length*0.05 : 0, tozero = options.tozero && (ax.type==='linear' || ax.type==='-'), From 63658e18766ac52ebc212f7974667b08ec9f9e4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikl=C3=B3s=20Tusz?= Date: Mon, 25 Apr 2016 16:54:48 -0400 Subject: [PATCH 2/8] Add range attribute and default to rangeslider --- src/components/rangeslider/attributes.js | 16 ++++++++++++++++ src/components/rangeslider/defaults.js | 16 ++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/components/rangeslider/attributes.js b/src/components/rangeslider/attributes.js index 118d06bd0c6..e6d58be6e06 100644 --- a/src/components/rangeslider/attributes.js +++ b/src/components/rangeslider/attributes.js @@ -30,6 +30,22 @@ module.exports = { role: 'style', description: 'Sets the border color of the range slider.' }, + range: { + valType: 'info_array', + role: 'info', + items: [ + {valType: 'number'}, + {valType: 'number'} + ], + description: [ + 'Sets the range of the range slider.', + 'If not set, defaults to the full xaxis range.', + 'If the axis `type` is *log*, then you must take the', + 'log of your desired range.', + 'If the axis `type` is *date*, then you must convert', + 'the date to unix time in milliseconds.' + ].join(' ') + }, thickness: { valType: 'number', dflt: 0.15, diff --git a/src/components/rangeslider/defaults.js b/src/components/rangeslider/defaults.js index c1b4cb3fb45..f0d0efeebd7 100644 --- a/src/components/rangeslider/defaults.js +++ b/src/components/rangeslider/defaults.js @@ -25,11 +25,23 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, axName, coun attributes, attr, dflt); } - coerce('visible'); - coerce('thickness'); coerce('bgcolor'); coerce('bordercolor'); coerce('borderwidth'); + coerce('thickness'); + coerce('visible'); + coerce('range'); + + // Expand slider range to the axis range + if(containerOut.range && !layoutOut[axName].autorange) { + var outRange = containerOut.range, + axRange = layoutOut[axName].range; + + outRange[0] = Math.min(outRange[0], axRange[0]); + outRange[1] = Math.max(outRange[1], axRange[1]); + } else { + layoutOut[axName]._needsExpand = true; + } if(containerOut.visible) { counterAxes.forEach(function(ax) { From 9facc51920d5cf343df8664f0e38c8e37fa5270f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikl=C3=B3s=20Tusz?= Date: Mon, 25 Apr 2016 16:55:58 -0400 Subject: [PATCH 3/8] Use rangeslider range for width and set initial range --- src/components/rangeslider/create_slider.js | 27 ++++++++++++--------- src/components/rangeslider/range_plot.js | 11 +++++---- src/plots/cartesian/axes.js | 7 ++---- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/components/rangeslider/create_slider.js b/src/components/rangeslider/create_slider.js index 56a230c4d63..61d6854e783 100644 --- a/src/components/rangeslider/create_slider.js +++ b/src/components/rangeslider/create_slider.js @@ -19,7 +19,7 @@ var helpers = require('./helpers'); var rangePlot = require('./range_plot'); -module.exports = function createSlider(gd, minStart, maxStart) { +module.exports = function createSlider(gd) { var fullLayout = gd._fullLayout, sliderContainer = fullLayout._infolayer.selectAll('g.range-slider'), options = fullLayout.xaxis.rangeslider, @@ -30,8 +30,8 @@ module.exports = function createSlider(gd, minStart, maxStart) { x = fullLayout.margin.l, y = fullLayout.height - height - fullLayout.margin.b; - minStart = minStart || 0; - maxStart = maxStart || width; + var minStart = 0, + maxStart = width; var slider = document.createElementNS(svgNS, 'g'); helpers.setAttributes(slider, { @@ -130,10 +130,6 @@ module.exports = function createSlider(gd, minStart, maxStart) { }); - console.log('in create slider') - console.log(Axes.getAutoRange(fullLayout.xaxis)) - console.log(fullLayout.xaxis.range) - slider.addEventListener('mousedown', function(event) { var target = event.target, startX = event.clientX, @@ -182,8 +178,8 @@ module.exports = function createSlider(gd, minStart, maxStart) { min = min || -Infinity; max = max || Infinity; - var rangeMin = fullLayout.xaxis.range[0], - rangeMax = fullLayout.xaxis.range[1], + var rangeMin = options.range[0], + rangeMax = options.range[1], range = rangeMax - rangeMin, pixelMin = (min - rangeMin) / range * width, pixelMax = (max - rangeMin) / range * width; @@ -222,9 +218,8 @@ module.exports = function createSlider(gd, minStart, maxStart) { helpers.setAttributes(grabberMin, { 'transform': 'translate(' + (min - handleWidth - 1) + ')' }); helpers.setAttributes(grabberMax, { 'transform': 'translate(' + max + ')' }); - // call to set range on plot here - var rangeMin = fullLayout.xaxis.range[0], - rangeMax = fullLayout.xaxis.range[1], + var rangeMin = options.range[0], + rangeMax = options.range[1], range = rangeMax - rangeMin, dataMin = min / width * range + rangeMin, dataMax = max / width * range + rangeMin; @@ -241,6 +236,11 @@ module.exports = function createSlider(gd, minStart, maxStart) { } + // Set slider range using axis autorange if necessary. + if(!options.range) { + options.range = Axes.getAutoRange(fullLayout.xaxis); + } + var rangePlots = rangePlot(gd, width, height); helpers.appendChildren(slider, [ @@ -253,6 +253,9 @@ module.exports = function createSlider(gd, minStart, maxStart) { grabberMax ]); + // Set initially selected range + setRange(fullLayout.xaxis.range[0], fullLayout.xaxis.range[1]); + sliderContainer.data([0]) .enter().append(function() { options.setRange = setRange; diff --git a/src/components/rangeslider/range_plot.js b/src/components/rangeslider/range_plot.js index e1c119ba09c..599297de61b 100644 --- a/src/components/rangeslider/range_plot.js +++ b/src/components/rangeslider/range_plot.js @@ -16,11 +16,12 @@ var svgNS = require('../../constants/xmlns_namespaces').svg; module.exports = function rangePlot(gd, w, h) { - var traces = gd._fullData, - xaxis = gd._fullLayout.xaxis, - yaxis = gd._fullLayout.yaxis, - minX = xaxis.range[0], - maxX = xaxis.range[1], + var fullLayout = gd._fullLayout, + traces = gd._fullData, + xaxis = fullLayout.xaxis, + yaxis = fullLayout.yaxis, + minX = xaxis.rangeslider.range[0], + maxX = xaxis.rangeslider.range[1], minY = yaxis.range[0], maxY = yaxis.range[1]; diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index b92e1e98c5d..e7ba503c140 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -200,8 +200,6 @@ axes.doAutoRange = function(ax) { // TODO do we really need this? var hasDeps = (ax._min && ax._max && ax._min.length && ax._max.length); - console.log('in do autorange') - if(ax.autorange && hasDeps) { ax.range = axes.getAutoRange(ax); @@ -258,14 +256,13 @@ axes.saveRangeInitial = function(gd, overwrite) { // and make it a tight bound if possible var FP_SAFE = Number.MAX_VALUE/2; axes.expand = function(ax, data, options) { - if(!(ax.autorange || (ax.rangeslider || {}).visible) || !data) return; + // if(!(ax.autorange || (ax.rangeslider || {}).visible) || !data) return; + if(!(ax.autorange || ax._needsExpand) || !data) return; if(!ax._min) ax._min = []; if(!ax._max) ax._max = []; if(!options) options = {}; if(!ax._m) ax.setScale(); - console.log('in exapnd', ax._name) - var len = data.length, extrappad = options.padded ? ax._length*0.05 : 0, tozero = options.tozero && (ax.type==='linear' || ax.type==='-'), From da32318defcba4e5e6c366c58e7f308ae5240978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikl=C3=B3s=20Tusz?= Date: Mon, 25 Apr 2016 16:56:40 -0400 Subject: [PATCH 4/8] Cleanup rangeslider draw and reorder draw call --- src/components/rangeslider/index.js | 4 ++-- src/plot_api/plot_api.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/rangeslider/index.js b/src/components/rangeslider/index.js index 77a4c092430..31bd1175c8e 100644 --- a/src/components/rangeslider/index.js +++ b/src/components/rangeslider/index.js @@ -20,7 +20,7 @@ module.exports = { supplyLayoutDefaults: supplyLayoutDefaults }; -function draw(gd, minStart, maxStart) { +function draw(gd) { if(!gd._fullLayout.xaxis) return; var fullLayout = gd._fullLayout, @@ -41,7 +41,7 @@ function draw(gd, minStart, maxStart) { var height = (fullLayout.height - fullLayout.margin.b - fullLayout.margin.t) * options.thickness, offsetShift = Math.floor(options.borderwidth / 2); - if(sliderContainer[0].length === 0 && !fullLayout._hasGL2D) createSlider(gd, minStart, maxStart); + if(sliderContainer[0].length === 0 && !fullLayout._hasGL2D) createSlider(gd); // Need to default to 0 for when making gl plots var bb = fullLayout.xaxis._boundingBox ? diff --git a/src/plot_api/plot_api.js b/src/plot_api/plot_api.js index cc42a7e39c4..e61377d5cd2 100644 --- a/src/plot_api/plot_api.js +++ b/src/plot_api/plot_api.js @@ -245,7 +245,6 @@ Plotly.plot = function(gd, data, layout, config) { function drawAxes() { // draw ticks, titles, and calculate axis scaling (._b, ._m) - RangeSlider.draw(gd); return Plotly.Axes.doTicks(gd, 'redraw'); } @@ -310,6 +309,7 @@ Plotly.plot = function(gd, data, layout, config) { Shapes.drawAll(gd); Plotly.Annotations.drawAll(gd); Legend.draw(gd); + RangeSlider.draw(gd); RangeSelector.draw(gd); } From 92d273b1398ceb3723baf5d4d31b0e8386e6232d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikl=C3=B3s=20Tusz?= Date: Mon, 25 Apr 2016 17:36:21 -0400 Subject: [PATCH 5/8] Add tests for initial ranges --- test/image/mocks/range_slider_ranges.json | 37 +++++++++ test/jasmine/tests/range_slider_test.js | 99 ++++++++++++++++++----- 2 files changed, 117 insertions(+), 19 deletions(-) create mode 100644 test/image/mocks/range_slider_ranges.json diff --git a/test/image/mocks/range_slider_ranges.json b/test/image/mocks/range_slider_ranges.json new file mode 100644 index 00000000000..686338f8ae6 --- /dev/null +++ b/test/image/mocks/range_slider_ranges.json @@ -0,0 +1,37 @@ +{ + "data": [{ + "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49], + "y": [61.54407276195499, 53.01489477283346, 54.27395817178983, 53.55001411571369, 78.9775866748205, 31.884243474727825, 56.77854253236383, 4.735201078365101, 63.12484997271903, 43.09882925106262, 43.724822753247224, 24.844310873420152, 34.89218498332549, 36.0460327216264, 28.2174958198741, 29.273481072578775, 70.89188615102645, 59.76636236708869, 66.76528535512163, 11.281051334701928, 78.37153154211197, 66.08349166666542, 50.09727630364335, 58.04698479499695, 59.74272576303902, 41.86433349552978, 48.22485560857029, 37.70855269433609, 21.119967245011217, 75.10194864698312, 55.48369213601815, 59.735088561204854, 60.42028696627966, 0.10938359086638982, 77.3773017472981, 15.086946383114501, 35.82836446307611, 23.689280033989295, 2.362484581742592, 53.40692073882494, 15.134375465281735, 7.3434664768826075, 54.52433252576499, 35.798885397722806, 38.26472971248782, 17.920068000491725, 37.0479742805594, 45.83239633915396, 43.99138484769564, 69.43228444571429], + "line": { + "shape": "spline", + "smoothing": 1 + }, + "fill": "tozeroy", + "name": "Bird 1" + }, { + "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49], + "y": [42.61173967030771, 77.84512822099697, 55.39613813617828, 4.0231685798691785, 34.55285260557025, 15.153333721685467, 77.54957038861798, 75.64407363993858, 62.12340236506287, 68.02318161065071, 34.816275599609554, 12.97751450053445, 25.16704221023005, 39.27425976595971, 41.98830052124046, 32.88934713126341, 64.3908328308427, 31.152165702544288, 53.28979283850701, 47.831576036783474, 48.46112255786373, 13.019775174742367, 44.95556684431092, 62.13365414186855, 22.796080092935433, 53.88638249610922, 9.378276407428476, 54.87772961864103, 10.622983213205028, 31.428637782080635, 63.81786719853103, 68.85325763593313, 30.412750136966178, 29.161036950263153, 19.125624934754217, 1.7788679495654591, 31.62390207284494, 33.722958647807374, 35.3846908579102, 41.364380830218224, 24.993662278935265, 39.083235916470116, 59.576257951955824, 33.620531907520075, 11.721918308606636, 10.943094423029738, 20.385230482706316, 39.62659948914896, 72.20357742148559, 38.48711164016425], + "name": "Bird 2" + }], + "layout": { + "title": "Seagull Positions", + "xaxis": { + "rangeslider": { + "visible": true, + "thickness": 0.2, + "bgcolor": "#fafafa", + "bordercolor": "black", + "borderwidth": 2, + "range": [20, 30] + }, + "title": "Time (Hours)", + "range": [10, 45] + }, + "yaxis": { + "title": "Height (ft)" + }, + "paper_bgcolor": "#eee", + "height": 500, + "width": 800 + } +} diff --git a/test/jasmine/tests/range_slider_test.js b/test/jasmine/tests/range_slider_test.js index c2faaeac982..5679eaacfe9 100644 --- a/test/jasmine/tests/range_slider_test.js +++ b/test/jasmine/tests/range_slider_test.js @@ -223,7 +223,8 @@ describe('the range slider', function() { bgcolor: '#fff', borderwidth: 0, bordercolor: '#444' - } + }, + _needsExpand: true }, yaxis: { fixedrange: true @@ -248,7 +249,8 @@ describe('the range slider', function() { bgcolor: '#fff', borderwidth: 0, bordercolor: '#444' - } + }, + _needsExpand: true }, yaxis: { fixedrange: true @@ -271,15 +273,21 @@ describe('the range slider', function() { layoutOut = { xaxis: {}, yaxis: {}}, axName = 'xaxis', counterAxes = ['yaxis'], - expected = { xaxis: { rangeslider: { - visible: true, - thickness: 0.15, - bgcolor: '#fff', - borderwidth: 0, - bordercolor: '#444' - }}, yaxis: { - fixedrange: true - }}; + expected = { + xaxis: { + rangeslider: { + visible: true, + thickness: 0.15, + bgcolor: '#fff', + borderwidth: 0, + bordercolor: '#444' + }, + _needsExpand: true + }, + yaxis: { + fixedrange: true + } + }; RangeSlider.supplyLayoutDefaults(layoutIn, layoutOut, axName, counterAxes); @@ -287,18 +295,21 @@ describe('the range slider', function() { }); it('should set all counterAxes to fixedrange', function() { - var layoutIn = { xaxis: { rangeslider: true}, yaxis: {}, yaxis2: {}}, + var layoutIn = { xaxis: { rangeslider: true }, yaxis: {}, yaxis2: {}}, layoutOut = { xaxis: {}, yaxis: {}, yaxis2: {}}, axName = 'xaxis', counterAxes = ['yaxis', 'yaxis2'], expected = { - xaxis: { rangeslider: { - visible: true, - thickness: 0.15, - bgcolor: '#fff', - borderwidth: 0, - bordercolor: '#444' - }}, + xaxis: { + rangeslider: { + visible: true, + thickness: 0.15, + bgcolor: '#fff', + borderwidth: 0, + bordercolor: '#444' + }, + _needsExpand: true + }, yaxis: { fixedrange: true}, yaxis2: { fixedrange: true } }; @@ -307,6 +318,56 @@ describe('the range slider', function() { expect(layoutOut).toEqual(expected); }); + + it('should expand the rangeslider range to axis range', function() { + var layoutIn = { xaxis: { rangeslider: { range: [5,6] } }, yaxis: {}}, + layoutOut = { xaxis: { range: [1, 10]}, yaxis: {}}, + axName = 'xaxis', + counterAxes = ['yaxis'], + expected = { + xaxis: { + rangeslider: { + visible: true, + thickness: 0.15, + bgcolor: '#fff', + borderwidth: 0, + bordercolor: '#444', + range: [1, 10] + }, + range: [1, 10] + }, + yaxis: { fixedrange: true } + }; + + RangeSlider.supplyLayoutDefaults(layoutIn, layoutOut, axName, counterAxes); + + expect(layoutOut).toEqual(expected); + }); + + it('should set _needsExpand when an axis range is set', function() { + var layoutIn = { xaxis: { rangeslider: true }, yaxis: {}}, + layoutOut = { xaxis: { range: [2, 40]}, yaxis: {}}, + axName = 'xaxis', + counterAxes = ['yaxis'], + expected = { + xaxis: { + rangeslider: { + visible: true, + thickness: 0.15, + bgcolor: '#fff', + borderwidth: 0, + bordercolor: '#444' + }, + range: [2, 40], + _needsExpand: true + }, + yaxis: { fixedrange: true } + }; + + RangeSlider.supplyLayoutDefaults(layoutIn, layoutOut, axName, counterAxes); + + expect(layoutOut).toEqual(expected); + }); }); describe('in general', function() { From 454e7c2f7b24a7e5d373c924752e5b23f46e83be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikl=C3=B3s=20Tusz?= Date: Mon, 25 Apr 2016 21:41:41 +0000 Subject: [PATCH 6/8] Add baseline image for range-slider ranges --- test/image/baselines/range_slider_ranges.png | Bin 0 -> 72338 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/image/baselines/range_slider_ranges.png diff --git a/test/image/baselines/range_slider_ranges.png b/test/image/baselines/range_slider_ranges.png new file mode 100644 index 0000000000000000000000000000000000000000..0dbc81bef79713c0a799f4a811ff7d7adbdd1f75 GIT binary patch literal 72338 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 Date: Mon, 25 Apr 2016 18:35:46 -0400 Subject: [PATCH 7/8] Force calc if relayout with rangeslider and guard against NaN --- src/components/rangeslider/range_plot.js | 4 +++- src/plot_api/plot_api.js | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/rangeslider/range_plot.js b/src/components/rangeslider/range_plot.js index 599297de61b..39dc6e1aa5d 100644 --- a/src/components/rangeslider/range_plot.js +++ b/src/components/rangeslider/range_plot.js @@ -63,7 +63,9 @@ module.exports = function rangePlot(gd, w, h) { var posX = w * (x[k] - minX) / (maxX - minX), posY = h * (1 - (y[k] - minY) / (maxY - minY)); - pointPairs.push([posX, posY]); + if(!isNaN(posX) && !isNaN(posY)) { + pointPairs.push([posX, posY]); + } } // more trace type range plots can be added here diff --git a/src/plot_api/plot_api.js b/src/plot_api/plot_api.js index e61377d5cd2..24f06adc781 100644 --- a/src/plot_api/plot_api.js +++ b/src/plot_api/plot_api.js @@ -2191,6 +2191,10 @@ Plotly.relayout = function relayout(gd, astr, val) { docalc = true; } + if(pleafPlus.indexOf('rangeslider') !== -1) { + docalc = true; + } + // toggling log without autorange: need to also recalculate ranges // logical XOR (ie are we toggling log) if(pleaf==='type' && ((parentFull.type === 'log') !== (vi === 'log'))) { From 02cb4e1933a5e823ec1b88bfbab691f472914e2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikl=C3=B3s=20Tusz?= Date: Mon, 25 Apr 2016 19:20:31 -0400 Subject: [PATCH 8/8] Create copy of mock --- test/jasmine/tests/range_slider_test.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/jasmine/tests/range_slider_test.js b/test/jasmine/tests/range_slider_test.js index 5679eaacfe9..35197a6dbbd 100644 --- a/test/jasmine/tests/range_slider_test.js +++ b/test/jasmine/tests/range_slider_test.js @@ -1,4 +1,5 @@ var Plotly = require('@lib/index'); +var Lib = require('@src/lib'); var RangeSlider = require('@src/components/rangeslider'); var createGraphDiv = require('../assets/create_graph_div'); var destroyGraphDiv = require('../assets/destroy_graph_div'); @@ -16,7 +17,9 @@ describe('the range slider', function() { beforeEach(function(done) { gd = createGraphDiv(); - Plotly.plot(gd, mock.data, mock.layout).then(function() { + var mockCopy = Lib.extendDeep({}, mock); + + Plotly.plot(gd, mockCopy.data, mockCopy.layout).then(function() { rangeSlider = document.getElementsByClassName('range-slider')[0]; children = rangeSlider.children; done();