AMBARI-7251.Configs: hover dialog needs a delay(XIWANG)

Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/24a486a5
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/24a486a5
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/24a486a5

Branch: refs/heads/branch-alerts-dev
Commit: 24a486a5340d58f7fe459d7bcd613a5f90b01894
Parents: 11146fb
Author: Xi Wang <xiw...@apache.org>
Authored: Wed Sep 10 12:14:09 2014 -0700
Committer: Xi Wang <xiw...@apache.org>
Committed: Wed Sep 10 13:44:19 2014 -0700

----------------------------------------------------------------------
 ambari-web/app/styles/application.less          |   9 +-
 .../views/common/configs/config_history_flow.js |   5 +
 ambari-web/vendor/scripts/jquery.hoverIntent.js | 115 +++++++++++++++++++
 3 files changed, 123 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/24a486a5/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less 
b/ambari-web/app/styles/application.less
index eb33e6d..31ddc76 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -4964,7 +4964,7 @@ ul.inline li {
   margin-top: -5px;
   .version-slider {
     width: 100%;
-    height: 64px;
+    height: 58px;
     margin: 5px 0;
     .flow-element {
       width: 18.5%;
@@ -4985,7 +4985,7 @@ ul.inline li {
         font-size: 11px;
         .top-label {
           min-width: 20px;
-          padding: 3px 2px;
+          padding: 0px 2px;
         }
         .author,
         .content {
@@ -5011,7 +5011,7 @@ ul.inline li {
       .version-box .version-popover {
         display: none;
         position: absolute;
-        bottom: 58px;
+        bottom: 50px;
         left: -45px;
         z-index: 1000;
         float: left;
@@ -5044,9 +5044,6 @@ ul.inline li {
         }
       }
       .version-box:hover{
-        .version-popover {
-          display: block;
-        }
         .box {
           background-color: #e6f1f6;
         }

http://git-wip-us.apache.org/repos/asf/ambari/blob/24a486a5/ambari-web/app/views/common/configs/config_history_flow.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/config_history_flow.js 
b/ambari-web/app/views/common/configs/config_history_flow.js
index d7d8d3f..1fe7d23 100644
--- a/ambari-web/app/views/common/configs/config_history_flow.js
+++ b/ambari-web/app/views/common/configs/config_history_flow.js
@@ -142,6 +142,11 @@ App.ConfigHistoryFlowView = Em.View.extend({
   },
 
   didInsertElement: function () {
+    $('.version-box').hoverIntent(function() {
+      $(this).find('.version-popover').delay(800).fadeIn(400);
+    }, function() {
+      $(this).find('.version-popover').hide();
+    });
     App.tooltip(this.$('[data-toggle=tooltip]'),{
       placement: 'bottom'
     });

http://git-wip-us.apache.org/repos/asf/ambari/blob/24a486a5/ambari-web/vendor/scripts/jquery.hoverIntent.js
----------------------------------------------------------------------
diff --git a/ambari-web/vendor/scripts/jquery.hoverIntent.js 
b/ambari-web/vendor/scripts/jquery.hoverIntent.js
new file mode 100644
index 0000000..ae2544c
--- /dev/null
+++ b/ambari-web/vendor/scripts/jquery.hoverIntent.js
@@ -0,0 +1,115 @@
+/*!
+ * hoverIntent v1.8.0 // 2014.06.29 // jQuery v1.9.1+
+ * http://cherne.net/brian/resources/jquery.hoverIntent.html
+ *
+ * You may use hoverIntent under the terms of the MIT license. Basically that
+ * means you are free to use hoverIntent as long as this header is left intact.
+ * Copyright 2007, 2014 Brian Cherne
+ */
+
+/* hoverIntent is similar to jQuery's built-in "hover" method except that
+ * instead of firing the handlerIn function immediately, hoverIntent checks
+ * to see if the user's mouse has slowed down (beneath the sensitivity
+ * threshold) before firing the event. The handlerOut function is only
+ * called after a matching handlerIn.
+ *
+ * // basic usage ... just like .hover()
+ * .hoverIntent( handlerIn, handlerOut )
+ * .hoverIntent( handlerInOut )
+ *
+ * // basic usage ... with event delegation!
+ * .hoverIntent( handlerIn, handlerOut, selector )
+ * .hoverIntent( handlerInOut, selector )
+ *
+ * // using a basic configuration object
+ * .hoverIntent( config )
+ *
+ * @param  handlerIn   function OR configuration object
+ * @param  handlerOut  function OR selector for delegation OR undefined
+ * @param  selector    selector OR undefined
+ * @author Brian Cherne <brian(at)cherne(dot)net>
+ */
+(function($) {
+  $.fn.hoverIntent = function(handlerIn,handlerOut,selector) {
+
+    // default configuration values
+    var cfg = {
+      interval: 100,
+      sensitivity: 6,
+      timeout: 0
+    };
+
+    if ( typeof handlerIn === "object" ) {
+      cfg = $.extend(cfg, handlerIn );
+    } else if ($.isFunction(handlerOut)) {
+      cfg = $.extend(cfg, { over: handlerIn, out: handlerOut, selector: 
selector } );
+    } else {
+      cfg = $.extend(cfg, { over: handlerIn, out: handlerIn, selector: 
handlerOut } );
+    }
+
+    // instantiate variables
+    // cX, cY = current X and Y position of mouse, updated by mousemove event
+    // pX, pY = previous X and Y position of mouse, set by mouseover and 
polling interval
+    var cX, cY, pX, pY;
+
+    // A private function for getting mouse position
+    var track = function(ev) {
+      cX = ev.pageX;
+      cY = ev.pageY;
+    };
+
+    // A private function for comparing current and previous mouse position
+    var compare = function(ev,ob) {
+      ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
+      // compare mouse positions to see if they've crossed the threshold
+      if ( Math.sqrt( (pX-cX)*(pX-cX) + (pY-cY)*(pY-cY) ) < cfg.sensitivity ) {
+        $(ob).off("mousemove.hoverIntent",track);
+        // set hoverIntent state to true (so mouseOut can be called)
+        ob.hoverIntent_s = true;
+        return cfg.over.apply(ob,[ev]);
+      } else {
+        // set previous coordinates for next time
+        pX = cX; pY = cY;
+        // use self-calling timeout, guarantees intervals are spaced out 
properly (avoids JavaScript timer bugs)
+        ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , 
cfg.interval );
+      }
+    };
+
+    // A private function for delaying the mouseOut function
+    var delay = function(ev,ob) {
+      ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
+      ob.hoverIntent_s = false;
+      return cfg.out.apply(ob,[ev]);
+    };
+
+    // A private function for handling mouse 'hovering'
+    var handleHover = function(e) {
+      // copy objects to be passed into t (required for event object to be 
passed in IE)
+      var ev = $.extend({},e);
+      var ob = this;
+
+      // cancel hoverIntent timer if it exists
+      if (ob.hoverIntent_t) { ob.hoverIntent_t = 
clearTimeout(ob.hoverIntent_t); }
+
+      // if e.type === "mouseenter"
+      if (e.type === "mouseenter") {
+        // set "previous" X and Y position based on initial entry point
+        pX = ev.pageX; pY = ev.pageY;
+        // update "current" X and Y position based on mousemove
+        $(ob).on("mousemove.hoverIntent",track);
+        // start polling interval (self-calling timeout) to compare mouse 
coordinates over time
+        if (!ob.hoverIntent_s) { ob.hoverIntent_t = setTimeout( 
function(){compare(ev,ob);} , cfg.interval );}
+
+        // else e.type == "mouseleave"
+      } else {
+        // unbind expensive mousemove event
+        $(ob).off("mousemove.hoverIntent",track);
+        // if hoverIntent state is true, then call the mouseOut function after 
the specified delay
+        if (ob.hoverIntent_s) { ob.hoverIntent_t = setTimeout( 
function(){delay(ev,ob);} , cfg.timeout );}
+      }
+    };
+
+    // listen for mouseenter and mouseleave
+    return 
this.on({'mouseenter.hoverIntent':handleHover,'mouseleave.hoverIntent':handleHover},
 cfg.selector);
+  };
+})(jQuery);

Reply via email to