From b8715f28536aa5d6fb673cbc30e0eeb431ec4b46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 22 Jan 2019 13:51:55 -0500 Subject: [PATCH] allow fixedrange axes to scaleanchor with `constrain:domain` --- src/plots/cartesian/constraint_defaults.js | 15 +++++----- ...caleanchor-constrain-domain-fixedrange.png | Bin 0 -> 22448 bytes ...aleanchor-constrain-domain-fixedrange.json | 28 ++++++++++++++++++ 3 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 test/image/baselines/axes_scaleanchor-constrain-domain-fixedrange.png create mode 100644 test/image/mocks/axes_scaleanchor-constrain-domain-fixedrange.json diff --git a/src/plots/cartesian/constraint_defaults.js b/src/plots/cartesian/constraint_defaults.js index 3b275c457e4..3095a51be22 100644 --- a/src/plots/cartesian/constraint_defaults.js +++ b/src/plots/cartesian/constraint_defaults.js @@ -18,11 +18,9 @@ module.exports = function handleConstraintDefaults(containerIn, containerOut, co var thisID = containerOut._id; var letter = thisID.charAt(0); - if(containerOut.fixedrange) return; - // coerce the constraint mechanics even if this axis has no scaleanchor // because it may be the anchor of another axis. - coerce('constrain'); + var constrain = coerce('constrain'); Lib.coerce(containerIn, containerOut, { constraintoward: { valType: 'enumerated', @@ -31,9 +29,9 @@ module.exports = function handleConstraintDefaults(containerIn, containerOut, co } }, 'constraintoward'); - if(!containerIn.scaleanchor) return; + if(!containerIn.scaleanchor || (constrain === 'range' && containerOut.fixedrange)) return; - var constraintOpts = getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut); + var constraintOpts = getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut, constrain); var scaleanchor = Lib.coerce(containerIn, containerOut, { scaleanchor: { @@ -62,12 +60,13 @@ module.exports = function handleConstraintDefaults(containerIn, containerOut, co } }; -function getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut) { +function getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut, constrain) { // If this axis is already part of a constraint group, we can't // scaleanchor any other axis in that group, or we'd make a loop. // Filter allAxisIds to enforce this, also matching axis types. var thisType = layoutOut[id2name(thisID)].type; + var doesConstrainRange = constrain === 'range'; var i, j, idj, axj; @@ -77,7 +76,9 @@ function getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut) { if(idj === thisID) continue; axj = layoutOut[id2name(idj)]; - if(axj.type === thisType && !axj.fixedrange) linkableAxes.push(idj); + if(axj.type === thisType && !(doesConstrainRange && axj.fixedrange)) { + linkableAxes.push(idj); + } } for(i = 0; i < constraintGroups.length; i++) { diff --git a/test/image/baselines/axes_scaleanchor-constrain-domain-fixedrange.png b/test/image/baselines/axes_scaleanchor-constrain-domain-fixedrange.png new file mode 100644 index 0000000000000000000000000000000000000000..60bd3831990b9a45d1c6d2271bb37af2ecd0fdfe GIT binary patch literal 22448 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 Vc}W}!PU5A|Ib*0%aQf1n{{wTb