From 8152b9d6fe750a3f662130973141a6a71a752694 Mon Sep 17 00:00:00 2001 From: ilgizar Date: Mon, 12 Mar 2018 10:54:03 +0500 Subject: [PATCH] Refactoring --- public/app/plugins/panel/graph/align_yaxes.ts | 191 ++++++++++-------- 1 file changed, 102 insertions(+), 89 deletions(-) diff --git a/public/app/plugins/panel/graph/align_yaxes.ts b/public/app/plugins/panel/graph/align_yaxes.ts index 74fc9a063c7..4884cd12441 100644 --- a/public/app/plugins/panel/graph/align_yaxes.ts +++ b/public/app/plugins/panel/graph/align_yaxes.ts @@ -6,118 +6,131 @@ import _ from 'lodash'; * @param align Y level */ export function alignYLevel(yaxis, alignLevel) { - var minLeft = yaxis[0].min; - var maxLeft = yaxis[0].max; - var minRight = yaxis[1].min; - var maxRight = yaxis[1].max; + moveLevelToZero(yaxis, alignLevel); - if (alignLevel !== 0) { - minLeft -= alignLevel; - maxLeft -= alignLevel; - minRight -= alignLevel; - maxRight -= alignLevel; - } - - // wide Y min and max using increased wideFactor - var deltaLeft = maxLeft - minLeft; - var deltaRight = maxRight - minRight; - var wideFactor = 0.25; - if (deltaLeft === 0) { - minLeft -= wideFactor; - maxLeft += wideFactor; - } - if (deltaRight === 0) { - minRight -= wideFactor; - maxRight += wideFactor; - } + expandStuckValues(yaxis); // one of graphs on zero - var zero = minLeft === 0 || minRight === 0 || maxLeft === 0 || maxRight === 0; + var zero = yaxis[0].min === 0 || yaxis[1].min === 0 || yaxis[0].max === 0 || yaxis[1].max === 0; - // on the one hand with respect to zero - var oneSide = (minLeft >= 0 && minRight >= 0) || (maxLeft <= 0 && maxRight <= 0); + var oneSide = checkOneSide(yaxis); if (zero && oneSide) { - minLeft = maxLeft > 0 ? 0 : minLeft; - maxLeft = maxLeft > 0 ? maxLeft : 0; - minRight = maxRight > 0 ? 0 : minRight; - maxRight = maxRight > 0 ? maxRight : 0; + yaxis[0].min = yaxis[0].max > 0 ? 0 : yaxis[0].min; + yaxis[0].max = yaxis[0].max > 0 ? yaxis[0].max : 0; + yaxis[1].min = yaxis[1].max > 0 ? 0 : yaxis[1].min; + yaxis[1].max = yaxis[1].max > 0 ? yaxis[1].max : 0; } else { // on the opposite sides with respect to zero - if ((minLeft >= 0 && maxRight <= 0) || (maxLeft <= 0 && minRight >= 0)) { - if (minLeft >= 0) { - minLeft = -maxLeft; - maxRight = -minRight; + if ((yaxis[0].min >= 0 && yaxis[1].max <= 0) || (yaxis[0].max <= 0 && yaxis[1].min >= 0)) { + if (yaxis[0].min >= 0) { + yaxis[0].min = -yaxis[0].max; + yaxis[1].max = -yaxis[1].min; } else { - maxLeft = -minLeft; - minRight = -maxRight; + yaxis[0].max = -yaxis[0].min; + yaxis[1].min = -yaxis[1].max; } } else { - // both across zero - var twoCross = minLeft <= 0 && maxLeft >= 0 && minRight <= 0 && maxRight >= 0; - - var rateLeft, rateRight, rate; - if (twoCross) { - rateLeft = minRight ? minLeft / minRight : 0; - rateRight = maxRight ? maxLeft / maxRight : 0; - } else { - if (oneSide) { - var absLeftMin = Math.abs(minLeft); - var absLeftMax = Math.abs(maxLeft); - var absRightMin = Math.abs(minRight); - var absRightMax = Math.abs(maxRight); - var upLeft = _.max([absLeftMin, absLeftMax]); - var downLeft = _.min([absLeftMin, absLeftMax]); - var upRight = _.max([absRightMin, absRightMax]); - var downRight = _.min([absRightMin, absRightMax]); - - rateLeft = downLeft ? upLeft / downLeft : upLeft; - rateRight = downRight ? upRight / downRight : upRight; - } else { - if (minLeft > 0 || minRight > 0) { - rateLeft = maxLeft / maxRight; - rateRight = 0; - } else { - rateLeft = 0; - rateRight = minLeft / minRight; - } - } - } - rate = rateLeft > rateRight ? rateLeft : rateRight; + var rate = getRate(yaxis); if (oneSide) { - if (minLeft > 0) { - minLeft = maxLeft / rate; - minRight = maxRight / rate; + if (yaxis[0].min > 0) { + yaxis[0].min = yaxis[0].max / rate; + yaxis[1].min = yaxis[1].max / rate; } else { - maxLeft = minLeft / rate; - maxRight = minRight / rate; + yaxis[0].max = yaxis[0].min / rate; + yaxis[1].max = yaxis[1].min / rate; } } else { - if (twoCross) { - minLeft = minRight ? minRight * rate : minLeft; - minRight = minLeft ? minLeft / rate : minRight; - maxLeft = maxRight ? maxRight * rate : maxLeft; - maxRight = maxLeft ? maxLeft / rate : maxRight; + if (checkTwoCross(yaxis)) { + yaxis[0].min = yaxis[1].min ? yaxis[1].min * rate : yaxis[0].min; + yaxis[1].min = yaxis[0].min ? yaxis[0].min / rate : yaxis[1].min; + yaxis[0].max = yaxis[1].max ? yaxis[1].max * rate : yaxis[0].max; + yaxis[1].max = yaxis[0].max ? yaxis[0].max / rate : yaxis[1].max; } else { - minLeft = minLeft > 0 ? minRight * rate : minLeft; - minRight = minRight > 0 ? minLeft / rate : minRight; - maxLeft = maxLeft < 0 ? maxRight * rate : maxLeft; - maxRight = maxRight < 0 ? maxLeft / rate : maxRight; + yaxis[0].min = yaxis[0].min > 0 ? yaxis[1].min * rate : yaxis[0].min; + yaxis[1].min = yaxis[1].min > 0 ? yaxis[0].min / rate : yaxis[1].min; + yaxis[0].max = yaxis[0].max < 0 ? yaxis[1].max * rate : yaxis[0].max; + yaxis[1].max = yaxis[1].max < 0 ? yaxis[0].max / rate : yaxis[1].max; } } } } + restoreLevelFromZero(yaxis, alignLevel); +} + +function expandStuckValues(yaxis) { + // wide Y min and max using increased wideFactor + var wideFactor = 0.25; + if (yaxis[0].max === yaxis[0].min) { + yaxis[0].min -= wideFactor; + yaxis[0].max += wideFactor; + } + if (yaxis[1].max === yaxis[1].min) { + yaxis[1].min -= wideFactor; + yaxis[1].max += wideFactor; + } +} + +function moveLevelToZero(yaxis, alignLevel) { if (alignLevel !== 0) { - minLeft += alignLevel; - maxLeft += alignLevel; - minRight += alignLevel; - maxRight += alignLevel; + yaxis[0].min -= alignLevel; + yaxis[0].max -= alignLevel; + yaxis[1].min -= alignLevel; + yaxis[1].max -= alignLevel; + } +} + +function restoreLevelFromZero(yaxis, alignLevel) { + if (alignLevel !== 0) { + yaxis[0].min += alignLevel; + yaxis[0].max += alignLevel; + yaxis[1].min += alignLevel; + yaxis[1].max += alignLevel; + } +} + +function checkOneSide(yaxis) { + // on the one hand with respect to zero + return (yaxis[0].min >= 0 && yaxis[1].min >= 0) || (yaxis[0].max <= 0 && yaxis[1].max <= 0); +} + +function checkTwoCross(yaxis) { + // both across zero + return yaxis[0].min <= 0 && yaxis[0].max >= 0 && yaxis[1].min <= 0 && yaxis[1].max >= 0; +} + +function getRate(yaxis) { + var rateLeft, rateRight, rate; + if (checkTwoCross(yaxis)) { + rateLeft = yaxis[1].min ? yaxis[0].min / yaxis[1].min : 0; + rateRight = yaxis[1].max ? yaxis[0].max / yaxis[1].max : 0; + } else { + if (checkOneSide(yaxis)) { + var absLeftMin = Math.abs(yaxis[0].min); + var absLeftMax = Math.abs(yaxis[0].max); + var absRightMin = Math.abs(yaxis[1].min); + var absRightMax = Math.abs(yaxis[1].max); + var upLeft = _.max([absLeftMin, absLeftMax]); + var downLeft = _.min([absLeftMin, absLeftMax]); + var upRight = _.max([absRightMin, absRightMax]); + var downRight = _.min([absRightMin, absRightMax]); + + rateLeft = downLeft ? upLeft / downLeft : upLeft; + rateRight = downRight ? upRight / downRight : upRight; + } else { + if (yaxis[0].min > 0 || yaxis[1].min > 0) { + rateLeft = yaxis[0].max / yaxis[1].max; + rateRight = 0; + } else { + rateLeft = 0; + rateRight = yaxis[0].min / yaxis[1].min; + } + } } - yaxis[0].min = minLeft; - yaxis[0].max = maxLeft; - yaxis[1].min = minRight; - yaxis[1].max = maxRight; + rate = rateLeft > rateRight ? rateLeft : rateRight; + + return rate; }