From aeaba5cac0794f20356ceae004e6b8f2d63bd584 Mon Sep 17 00:00:00 2001 From: hannahker Date: Wed, 31 Aug 2022 15:25:16 -0700 Subject: [PATCH 01/14] Expose variables --- src/plots/cartesian/axes.js | 5 +++++ src/plots/layout_attributes.js | 14 ++++++++++++++ src/plots/plots.js | 14 ++++++-------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 4a5bed02b15..6feefeac3f6 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2541,6 +2541,7 @@ axes.drawOne = function(gd, ax, opts) { var s = ax.side.charAt(0); var sMirror = OPPOSITE_SIDE[ax.side].charAt(0); var pos = axes.getPxPosition(gd, ax); + console.log(pos) var outsideTickLen = outsideTicks ? ax.ticklen : 0; var llbbox; @@ -3766,9 +3767,13 @@ function drawDividers(gd, ax, opts) { */ axes.getPxPosition = function(gd, ax) { var gs = gd._fullLayout._size; + console.log("PRINTING...") + //console.log(gd._fullLayout._size) var axLetter = ax._id.charAt(0); var side = ax.side; var anchorAxis; + console.log(side) + console.log(axLetter) if(ax.anchor !== 'free') { anchorAxis = ax._anchorAxis; diff --git a/src/plots/layout_attributes.js b/src/plots/layout_attributes.js index cc6e4d973a5..a5e8334e719 100644 --- a/src/plots/layout_attributes.js +++ b/src/plots/layout_attributes.js @@ -228,6 +228,20 @@ module.exports = { 'between the plotting area and the axis lines' ].join(' ') }, + minreducedwidth: { + valType: 'number', + min: 0, + dflt: 64, + editType: 'plot', + description: 'TODO' + }, + minreducedheight: { + valType: 'number', + min: 0, + dflt: 64, + editType: 'plot', + description: 'TODO' + }, autoexpand: { valType: 'boolean', dflt: true, diff --git a/src/plots/plots.js b/src/plots/plots.js index e7018f70647..970390ade08 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -1512,6 +1512,8 @@ plots.supplyLayoutGlobalDefaults = function(layoutIn, layoutOut, formatObj) { coerce('margin.b'); coerce('margin.pad'); coerce('margin.autoexpand'); + coerce('margin.minreducedwidth'); + coerce('margin.minreducedheight'); if(layoutIn.width && layoutIn.height) plots.sanitizeMargins(layoutOut); @@ -1861,10 +1863,6 @@ function initMargins(fullLayout) { var MIN_SPECIFIED_WIDTH = 2; var MIN_SPECIFIED_HEIGHT = 2; -// could be exposed as an option - the smallest we will allow automargin to shrink a larger plot -var MIN_REDUCED_WIDTH = 64; -var MIN_REDUCED_HEIGHT = 64; - /** * autoMargin: called by components that may need to expand the margins to * be rendered on-plot. @@ -1889,13 +1887,13 @@ plots.autoMargin = function(gd, id, o) { var minFinalWidth = Lib.constrain( width - margin.l - margin.r, MIN_SPECIFIED_WIDTH, - MIN_REDUCED_WIDTH + margin.minreducedwidth ); var minFinalHeight = Lib.constrain( height - margin.t - margin.b, MIN_SPECIFIED_HEIGHT, - MIN_REDUCED_HEIGHT + margin.minreducedheight ); var maxSpaceW = Math.max(0, width - minFinalWidth); @@ -2032,13 +2030,13 @@ plots.doAutoMargin = function(gd) { var minFinalWidth = Lib.constrain( width - margin.l - margin.r, MIN_SPECIFIED_WIDTH, - MIN_REDUCED_WIDTH + margin.minreducedwidth ); var minFinalHeight = Lib.constrain( height - margin.t - margin.b, MIN_SPECIFIED_HEIGHT, - MIN_REDUCED_HEIGHT + margin.minreducedheight ); var maxSpaceW = Math.max(0, width - minFinalWidth); From f826ef75fc29164df9d301884a92846d5f386588 Mon Sep 17 00:00:00 2001 From: hannahker Date: Wed, 31 Aug 2022 17:37:29 -0700 Subject: [PATCH 02/14] Add variable description --- src/plots/layout_attributes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plots/layout_attributes.js b/src/plots/layout_attributes.js index a5e8334e719..5f5bb951d3d 100644 --- a/src/plots/layout_attributes.js +++ b/src/plots/layout_attributes.js @@ -233,14 +233,14 @@ module.exports = { min: 0, dflt: 64, editType: 'plot', - description: 'TODO' + description: 'Minimum width of the plot with automargin applied.' }, minreducedheight: { valType: 'number', min: 0, dflt: 64, editType: 'plot', - description: 'TODO' + description: 'Minimum height of the plot with automargin applied.' }, autoexpand: { valType: 'boolean', From bb2ca73628271f884623f7898dc940c4b36af4a9 Mon Sep 17 00:00:00 2001 From: hannahker Date: Thu, 1 Sep 2022 17:14:39 -0700 Subject: [PATCH 03/14] Add mocks for image tests --- .../mocks/z-automargin-minreducedheight.json | 55 ++++++++++++++++++ .../mocks/z-automargin-minreducedwidth.json | 56 +++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 test/image/mocks/z-automargin-minreducedheight.json create mode 100644 test/image/mocks/z-automargin-minreducedwidth.json diff --git a/test/image/mocks/z-automargin-minreducedheight.json b/test/image/mocks/z-automargin-minreducedheight.json new file mode 100644 index 00000000000..0f0d405c2d2 --- /dev/null +++ b/test/image/mocks/z-automargin-minreducedheight.json @@ -0,0 +1,55 @@ +{ + "data": [{ + "name": "< D E A T H >", + "marker": { "color": "red" }, + "x": [ + "Antonio Vivaldi", + "Johann Sebastian Bach", + "Wolfgang Amadeus Mozart", + "Ludwig van Beethoven" + ], + "y": [ + "1741", + "1750", + "1791", + "1827" + ] + }, + { + "name": "< B I R T H >", + "marker": { "color": "blue" }, + "x": [ + "Antonio Vivaldi", + "Johann Sebastian Bach", + "Wolfgang Amadeus Mozart", + "Ludwig van Beethoven" + ], + "y": [ + "1678", + "1685", + "1756", + "1770" + ] + }], + "layout": { + "title": { + "text": "Longest and shortest
names and time periods" + }, + "width": 240, + "height": 300, + "margin": { + "t": 80, + "b": 20, + "l": 20, + "r": 20, + "minreducedheight": 55 + }, + "yaxis": { + "type": "date", + "automargin": true + }, + "xaxis": { + "automargin": true + } + } +} diff --git a/test/image/mocks/z-automargin-minreducedwidth.json b/test/image/mocks/z-automargin-minreducedwidth.json new file mode 100644 index 00000000000..5cd5db0a6a6 --- /dev/null +++ b/test/image/mocks/z-automargin-minreducedwidth.json @@ -0,0 +1,56 @@ +{ + "data": [{ + "name": "< D E A T H >", + "marker": { "color": "red" }, + "y": [ + "Antonio Vivaldi but even longer", + "Johann Sebastian Bach but even longer", + "Wolfgang Amadeus Mozart but even longer", + "Ludwig van Beethoven but even longer" + ], + "x": [ + "1741", + "1750", + "1791", + "1827" + ] + }, + { + "name": "< B I R T H >", + "marker": { "color": "blue" }, + "y": [ + "Antonio Vivaldi but even longer", + "Johann Sebastian Bach but even longer", + "Wolfgang Amadeus Mozart but even longer", + "Ludwig van Beethoven but even longer" + ], + "x": [ + "1678", + "1685", + "1756", + "1770" + ] + }], + "layout": { + "showlegend": false, + "title": { + "text": "Longest and shortest
names and time periods" + }, + "width": 240, + "height": 200, + "margin": { + "t": 80, + "b": 20, + "l": 20, + "r": 20, + "minreducedwidth": 55 + }, + "xaxis": { + "type": "date", + "automargin": true + }, + "yaxis": { + "automargin": true + } + } +} From 1c7cc49ece5226fcde54def77357618ee3143ad4 Mon Sep 17 00:00:00 2001 From: hannahker Date: Thu, 1 Sep 2022 17:23:29 -0700 Subject: [PATCH 04/14] Remove console.log --- src/plots/cartesian/axes.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 6feefeac3f6..4a5bed02b15 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2541,7 +2541,6 @@ axes.drawOne = function(gd, ax, opts) { var s = ax.side.charAt(0); var sMirror = OPPOSITE_SIDE[ax.side].charAt(0); var pos = axes.getPxPosition(gd, ax); - console.log(pos) var outsideTickLen = outsideTicks ? ax.ticklen : 0; var llbbox; @@ -3767,13 +3766,9 @@ function drawDividers(gd, ax, opts) { */ axes.getPxPosition = function(gd, ax) { var gs = gd._fullLayout._size; - console.log("PRINTING...") - //console.log(gd._fullLayout._size) var axLetter = ax._id.charAt(0); var side = ax.side; var anchorAxis; - console.log(side) - console.log(axLetter) if(ax.anchor !== 'free') { anchorAxis = ax._anchorAxis; From 61807ba37ea9473d3112d66e6cd6c5222479b24d Mon Sep 17 00:00:00 2001 From: hannahker Date: Fri, 2 Sep 2022 10:14:54 -0700 Subject: [PATCH 05/14] Reformat axis titles in mock --- .../mocks/z-automargin-minreducedwidth.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/image/mocks/z-automargin-minreducedwidth.json b/test/image/mocks/z-automargin-minreducedwidth.json index 5cd5db0a6a6..b04e4980220 100644 --- a/test/image/mocks/z-automargin-minreducedwidth.json +++ b/test/image/mocks/z-automargin-minreducedwidth.json @@ -3,10 +3,10 @@ "name": "< D E A T H >", "marker": { "color": "red" }, "y": [ - "Antonio Vivaldi but even longer", - "Johann Sebastian Bach but even longer", - "Wolfgang Amadeus Mozart but even longer", - "Ludwig van Beethoven but even longer" + "A n t o n i o V i v a l d i", + "J o h a n n S e b a s t i a n B a c h", + "W o l f g a n g A m a d e u s M o z a r t", + "L u d w i g v a n B e e t h o v e n" ], "x": [ "1741", @@ -19,10 +19,10 @@ "name": "< B I R T H >", "marker": { "color": "blue" }, "y": [ - "Antonio Vivaldi but even longer", - "Johann Sebastian Bach but even longer", - "Wolfgang Amadeus Mozart but even longer", - "Ludwig van Beethoven but even longer" + "A n t o n i o V i v a l d i", + "J o h a n n S e b a s t i a n B a c h", + "W o l f g a n g A m a d e u s M o z a r t", + "L u d w i g v a n B e e t h o v e n" ], "x": [ "1678", From d692c7efb31ac7dd74bba9362b0a2ca2e218bc02 Mon Sep 17 00:00:00 2001 From: hannahker Date: Fri, 2 Sep 2022 10:16:39 -0700 Subject: [PATCH 06/14] Update minimum and add units to description --- src/plots/layout_attributes.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plots/layout_attributes.js b/src/plots/layout_attributes.js index 5f5bb951d3d..9b9f05d6adb 100644 --- a/src/plots/layout_attributes.js +++ b/src/plots/layout_attributes.js @@ -230,17 +230,17 @@ module.exports = { }, minreducedwidth: { valType: 'number', - min: 0, + min: 2, dflt: 64, editType: 'plot', - description: 'Minimum width of the plot with automargin applied.' + description: 'Minimum width of the plot with automargin applied (in px)' }, minreducedheight: { valType: 'number', - min: 0, + min: 2, dflt: 64, editType: 'plot', - description: 'Minimum height of the plot with automargin applied.' + description: 'Minimum height of the plot with automargin applied (in px)' }, autoexpand: { valType: 'boolean', From 7fc8514bf456f2132f727c53e768c990732bb15d Mon Sep 17 00:00:00 2001 From: hannahker Date: Fri, 2 Sep 2022 10:31:49 -0700 Subject: [PATCH 07/14] Add jasmine test --- test/jasmine/tests/plots_test.js | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/test/jasmine/tests/plots_test.js b/test/jasmine/tests/plots_test.js index 3191ff11d2c..c8cbf2de200 100644 --- a/test/jasmine/tests/plots_test.js +++ b/test/jasmine/tests/plots_test.js @@ -1326,3 +1326,41 @@ describe('grids', function() { .then(done, done.fail); }); }); + +describe('Test Plots with automargin and minreducedwidth/height', function() { + var gd; + + beforeEach(function() { + gd = createGraphDiv(); + }); + + afterEach(destroyGraphDiv); + + it('should resize the plot area when tweaking min-reduced width & height', function(done) { + function assert(attr, exp) { + var xy = d3Select('rect.nsewdrag')[0][0]; + expect(xy.getAttribute(attr)).toEqual(exp); + } + + var fig = require('@mocks/z-automargin-minreducedheight.json'); + + Plotly.newPlot(gd, fig) + .then(function() { + assert('height', '55'); + }) + .then(function() { + return Plotly.relayout(gd, 'margin.minreducedheight', 100); + }) + .then(function() { + assert('height', '100'); + }) + .then(function() { + return Plotly.relayout(gd, 'margin.minreducedwidth', 100); + }) + .then(function() { + assert('width', '100'); + assert('height', '100'); + }) + .then(done, done.fail); + }); +}); From c53e0847df1f013f90e4f1e5f2d2793098738f0b Mon Sep 17 00:00:00 2001 From: hannahker Date: Fri, 2 Sep 2022 11:29:26 -0700 Subject: [PATCH 08/14] Update baseline images and layoutDefaults jasmine test --- .../baselines/z-automargin-minreducedheight.png | Bin 0 -> 16819 bytes .../baselines/z-automargin-minreducedwidth.png | Bin 0 -> 13765 bytes test/jasmine/tests/plots_test.js | 8 ++++++-- 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 test/image/baselines/z-automargin-minreducedheight.png create mode 100644 test/image/baselines/z-automargin-minreducedwidth.png diff --git a/test/image/baselines/z-automargin-minreducedheight.png b/test/image/baselines/z-automargin-minreducedheight.png new file mode 100644 index 0000000000000000000000000000000000000000..af407e59e6873d96d01e4098b69f5f292c5cc134 GIT binary patch literal 16819 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 Date: Fri, 2 Sep 2022 11:55:13 -0700 Subject: [PATCH 09/14] Fix trailing whitespace --- test/jasmine/tests/plots_test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jasmine/tests/plots_test.js b/test/jasmine/tests/plots_test.js index d5033842d4b..83349590710 100644 --- a/test/jasmine/tests/plots_test.js +++ b/test/jasmine/tests/plots_test.js @@ -238,7 +238,7 @@ describe('Test Plots', function() { b: 80, pad: 0, autoexpand: true, - minreducedwidth: 64, + minreducedwidth: 64, minreducedheight: 64 }; @@ -264,7 +264,7 @@ describe('Test Plots', function() { b: 311, pad: 0, autoexpand: true, - minreducedwidth: 64, + minreducedwidth: 64, minreducedheight: 64 }; From 0effd0ff09769088bd8500ab5120ba1bdf066e95 Mon Sep 17 00:00:00 2001 From: hannahker Date: Fri, 2 Sep 2022 12:04:56 -0700 Subject: [PATCH 10/14] Update plot schema --- test/plot-schema.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/plot-schema.json b/test/plot-schema.json index 7b882a3ea25..fd3bc8adddc 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -3352,6 +3352,20 @@ "min": 0, "valType": "number" }, + "minreducedheight": { + "description": "Minimum height of the plot with automargin applied (in px)", + "dflt": 64, + "editType": "plot", + "min": 2, + "valType": "number" + }, + "minreducedwidth": { + "description": "Minimum width of the plot with automargin applied (in px)", + "dflt": 64, + "editType": "plot", + "min": 2, + "valType": "number" + }, "pad": { "description": "Sets the amount of padding (in px) between the plotting area and the axis lines", "dflt": 0, From 6a43af48e39f4f554bb119fba2fcf533ce50a48c Mon Sep 17 00:00:00 2001 From: hannahker Date: Fri, 2 Sep 2022 14:28:15 -0700 Subject: [PATCH 11/14] Make test more flexible for CircleCI --- test/jasmine/tests/plots_test.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/jasmine/tests/plots_test.js b/test/jasmine/tests/plots_test.js index 83349590710..c946aa1ebc1 100644 --- a/test/jasmine/tests/plots_test.js +++ b/test/jasmine/tests/plots_test.js @@ -1346,11 +1346,17 @@ describe('Test Plots with automargin and minreducedwidth/height', function() { expect(xy.getAttribute(attr)).toEqual(exp); } + function assert_close(attr, exp) { + var xy = d3Select('rect.nsewdrag')[0][0]; + expect(xy.getAttribute(attr)).toBeCloseTo(exp, -1); + } + var fig = require('@mocks/z-automargin-minreducedheight.json'); Plotly.newPlot(gd, fig) .then(function() { - assert('height', '55'); + assert_close('height', '55'); + }) .then(function() { return Plotly.relayout(gd, 'margin.minreducedheight', 100); From 21f71e60969514989ec1ca2be36152bd1ac5509e Mon Sep 17 00:00:00 2001 From: hannahker Date: Fri, 2 Sep 2022 15:45:43 -0700 Subject: [PATCH 12/14] Fix code style --- test/jasmine/tests/plots_test.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/jasmine/tests/plots_test.js b/test/jasmine/tests/plots_test.js index c946aa1ebc1..666b766672f 100644 --- a/test/jasmine/tests/plots_test.js +++ b/test/jasmine/tests/plots_test.js @@ -1346,7 +1346,7 @@ describe('Test Plots with automargin and minreducedwidth/height', function() { expect(xy.getAttribute(attr)).toEqual(exp); } - function assert_close(attr, exp) { + function assertClose(attr, exp) { var xy = d3Select('rect.nsewdrag')[0][0]; expect(xy.getAttribute(attr)).toBeCloseTo(exp, -1); } @@ -1355,8 +1355,7 @@ describe('Test Plots with automargin and minreducedwidth/height', function() { Plotly.newPlot(gd, fig) .then(function() { - assert_close('height', '55'); - + assertClose('height', '55'); }) .then(function() { return Plotly.relayout(gd, 'margin.minreducedheight', 100); From 93b05d3bd80b824a5dcb95e2176a4e5c4f10d5d8 Mon Sep 17 00:00:00 2001 From: hannahker Date: Wed, 7 Sep 2022 10:31:03 -0400 Subject: [PATCH 13/14] Refactor to move attributes to top level Fix variable references Fix formatting --- src/plots/layout_attributes.js | 28 +++++++++---------- src/plots/plots.js | 17 +++++++---- .../mocks/z-automargin-minreducedheight.json | 4 +-- .../mocks/z-automargin-minreducedwidth.json | 4 +-- test/jasmine/tests/plots_test.js | 12 +++----- test/plot-schema.json | 28 +++++++++---------- 6 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/plots/layout_attributes.js b/src/plots/layout_attributes.js index 9b9f05d6adb..38fe31ed189 100644 --- a/src/plots/layout_attributes.js +++ b/src/plots/layout_attributes.js @@ -189,6 +189,20 @@ module.exports = { 'Sets the plot\'s height (in px).' ].join(' ') }, + minreducedwidth: { + valType: 'number', + min: 2, + dflt: 64, + editType: 'plot', + description: 'Minimum width of the plot with margin.automargin applied (in px)' + }, + minreducedheight: { + valType: 'number', + min: 2, + dflt: 64, + editType: 'plot', + description: 'Minimum height of the plot with margin.automargin applied (in px)' + }, margin: { l: { valType: 'number', @@ -228,20 +242,6 @@ module.exports = { 'between the plotting area and the axis lines' ].join(' ') }, - minreducedwidth: { - valType: 'number', - min: 2, - dflt: 64, - editType: 'plot', - description: 'Minimum width of the plot with automargin applied (in px)' - }, - minreducedheight: { - valType: 'number', - min: 2, - dflt: 64, - editType: 'plot', - description: 'Minimum height of the plot with automargin applied (in px)' - }, autoexpand: { valType: 'boolean', dflt: true, diff --git a/src/plots/plots.js b/src/plots/plots.js index 970390ade08..7b28bc9b543 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -1506,14 +1506,15 @@ plots.supplyLayoutGlobalDefaults = function(layoutIn, layoutOut, formatObj) { coerce('width'); coerce('height'); + coerce('minreducedwidth'); + coerce('minreducedheight'); + coerce('margin.l'); coerce('margin.r'); coerce('margin.t'); coerce('margin.b'); coerce('margin.pad'); coerce('margin.autoexpand'); - coerce('margin.minreducedwidth'); - coerce('margin.minreducedheight'); if(layoutIn.width && layoutIn.height) plots.sanitizeMargins(layoutOut); @@ -1883,17 +1884,19 @@ plots.autoMargin = function(gd, id, o) { var width = fullLayout.width; var height = fullLayout.height; var margin = fullLayout.margin; + var minreducedwidth = fullLayout.minreducedwidth; + var minreducedheight = fullLayout.minreducedheight; var minFinalWidth = Lib.constrain( width - margin.l - margin.r, MIN_SPECIFIED_WIDTH, - margin.minreducedwidth + minreducedwidth ); var minFinalHeight = Lib.constrain( height - margin.t - margin.b, MIN_SPECIFIED_HEIGHT, - margin.minreducedheight + minreducedheight ); var maxSpaceW = Math.max(0, width - minFinalWidth); @@ -1972,6 +1975,8 @@ plots.doAutoMargin = function(gd) { var mb = margin.b; var pushMargin = fullLayout._pushmargin; var pushMarginIds = fullLayout._pushmarginIds; + var minreducedwidth = fullLayout.minreducedwidth; + var minreducedheight = fullLayout.minreducedheight; if(fullLayout.margin.autoexpand !== false) { for(var k in pushMargin) { @@ -2030,13 +2035,13 @@ plots.doAutoMargin = function(gd) { var minFinalWidth = Lib.constrain( width - margin.l - margin.r, MIN_SPECIFIED_WIDTH, - margin.minreducedwidth + minreducedwidth ); var minFinalHeight = Lib.constrain( height - margin.t - margin.b, MIN_SPECIFIED_HEIGHT, - margin.minreducedheight + minreducedheight ); var maxSpaceW = Math.max(0, width - minFinalWidth); diff --git a/test/image/mocks/z-automargin-minreducedheight.json b/test/image/mocks/z-automargin-minreducedheight.json index 0f0d405c2d2..7e48b8085f4 100644 --- a/test/image/mocks/z-automargin-minreducedheight.json +++ b/test/image/mocks/z-automargin-minreducedheight.json @@ -37,12 +37,12 @@ }, "width": 240, "height": 300, + "minreducedheight": 55, "margin": { "t": 80, "b": 20, "l": 20, - "r": 20, - "minreducedheight": 55 + "r": 20 }, "yaxis": { "type": "date", diff --git a/test/image/mocks/z-automargin-minreducedwidth.json b/test/image/mocks/z-automargin-minreducedwidth.json index b04e4980220..56ce67a9de4 100644 --- a/test/image/mocks/z-automargin-minreducedwidth.json +++ b/test/image/mocks/z-automargin-minreducedwidth.json @@ -38,12 +38,12 @@ }, "width": 240, "height": 200, + "minreducedwidth": 55, "margin": { "t": 80, "b": 20, "l": 20, - "r": 20, - "minreducedwidth": 55 + "r": 20 }, "xaxis": { "type": "date", diff --git a/test/jasmine/tests/plots_test.js b/test/jasmine/tests/plots_test.js index 666b766672f..13c5fa6b941 100644 --- a/test/jasmine/tests/plots_test.js +++ b/test/jasmine/tests/plots_test.js @@ -237,9 +237,7 @@ describe('Test Plots', function() { t: 100, b: 80, pad: 0, - autoexpand: true, - minreducedwidth: 64, - minreducedheight: 64 + autoexpand: true }; supplyLayoutDefaults(layoutIn, layoutOut); @@ -263,9 +261,7 @@ describe('Test Plots', function() { t: 187, b: 311, pad: 0, - autoexpand: true, - minreducedwidth: 64, - minreducedheight: 64 + autoexpand: true }; supplyLayoutDefaults(layoutIn, layoutOut); @@ -1358,13 +1354,13 @@ describe('Test Plots with automargin and minreducedwidth/height', function() { assertClose('height', '55'); }) .then(function() { - return Plotly.relayout(gd, 'margin.minreducedheight', 100); + return Plotly.relayout(gd, 'minreducedheight', 100); }) .then(function() { assert('height', '100'); }) .then(function() { - return Plotly.relayout(gd, 'margin.minreducedwidth', 100); + return Plotly.relayout(gd, 'minreducedwidth', 100); }) .then(function() { assert('width', '100'); diff --git a/test/plot-schema.json b/test/plot-schema.json index fd3bc8adddc..29bcfafc16e 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -3352,20 +3352,6 @@ "min": 0, "valType": "number" }, - "minreducedheight": { - "description": "Minimum height of the plot with automargin applied (in px)", - "dflt": 64, - "editType": "plot", - "min": 2, - "valType": "number" - }, - "minreducedwidth": { - "description": "Minimum width of the plot with automargin applied (in px)", - "dflt": 64, - "editType": "plot", - "min": 2, - "valType": "number" - }, "pad": { "description": "Sets the amount of padding (in px) between the plotting area and the axis lines", "dflt": 0, @@ -3400,6 +3386,20 @@ "editType": "none", "valType": "string" }, + "minreducedheight": { + "description": "Minimum height of the plot with margin.automargin applied (in px)", + "dflt": 64, + "editType": "plot", + "min": 2, + "valType": "number" + }, + "minreducedwidth": { + "description": "Minimum width of the plot with margin.automargin applied (in px)", + "dflt": 64, + "editType": "plot", + "min": 2, + "valType": "number" + }, "modebar": { "activecolor": { "description": "Sets the color of the active or hovered on icons in the modebar.", From 0fff290be2203f7c0979ad577bc3f80e9f1fddfa Mon Sep 17 00:00:00 2001 From: hannahker Date: Wed, 7 Sep 2022 14:26:25 -0400 Subject: [PATCH 14/14] Add entry for changelog --- draftlogs/6307_add.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 draftlogs/6307_add.md diff --git a/draftlogs/6307_add.md b/draftlogs/6307_add.md new file mode 100644 index 00000000000..f3240a3a6a7 --- /dev/null +++ b/draftlogs/6307_add.md @@ -0,0 +1 @@ +Add `minreducedwidth` and `minreducedheight` as layout parameters [[#6307](https://github.com/plotly/plotly.js/pull/6307)] \ No newline at end of file