ilgizar il y a 7 ans
Parent
commit
8152b9d6fe
1 fichiers modifiés avec 102 ajouts et 89 suppressions
  1. 102 89
      public/app/plugins/panel/graph/align_yaxes.ts

+ 102 - 89
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) {
+    yaxis[0].min -= alignLevel;
+    yaxis[0].max -= alignLevel;
+    yaxis[1].min -= alignLevel;
+    yaxis[1].max -= alignLevel;
+  }
+}
+
+function restoreLevelFromZero(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 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;
 }