Monday, September 25, 2017

Auto Expanding Menu on Hover

Today someone on the apex.world Slack asked a question about having the side navigation menu auto-expand when hovering it. So I thought I would share this with others as well.

It can be easily be done using only a couple of JavaScript lines of code:
(function(ut, $) {

var TREE_NAV_WIDGET_KEY = 'nav';

$(window).on('theme42ready', function() {
    /* Make sure that the navigation menu is collapsed on page load */
    if (ut.toggleWidgets.isExpanded(TREE_NAV_WIDGET_KEY)){
        ut.toggleWidgets.collapseWidget(TREE_NAV_WIDGET_KEY);
    }

    /* Expand on mouse over, collapse on mouse out */
    $('.apex-side-nav.js-navCollapsed .t-Body-nav').hover(
        function(){
            ut.toggleWidgets.expandWidget(TREE_NAV_WIDGET_KEY);
        },
        function() {
            ut.toggleWidgets.collapseWidget(TREE_NAV_WIDGET_KEY);
        }
    );
});

})(apex.theme42, apex.jQuery);
First thing we need to do is make sure that the side navigation is collapsed.
Then we add a hovering handler using the jQuery .hover() on the navigation menu container.

You'll end up with something like this:

Have fun

You can have a look at it in action in my Demo Application
Edit 09-27
Now triggers the custom navigation menu event.
Also calls the delayResize function so that any sticky headers get resized correctly when the side navigation menu is expanded and collapsed.

Edit 09-28
Rewrote to use namespacing, wrapped using the "theme42ready" event and replaced the collapsed/expand calls with the universal theme functions.

7 comments:

  1. Hello Maxime,
    thank for this port!

    Do you know how to do the same with the Top Navigation Menu in APEX 5?

    Best regards,
    Joerg

    ReplyDelete
    Replies
    1. Hello Joerg

      Both the top and side navigation menu are only rendering the first level items of the menu. Then when you click to expand a node, APEX is making an AJAX request to insert the node's children direct children.

      To be able to display them automatically, you would have to simulate click events when hovering the parent nodes with children.

      Max

      Delete
    2. Thanks for the tip! Javascript is not my favourite language - so I hope I can figure that out. :-j

      Delete
  2. Hi Max, really like the look of the Menu; however I am a total noob at this! I can incorporate the Javascript on Page Load but not sure where to add the JQuery.hover(). Any help would be appreciated.

    ReplyDelete
    Replies
    1. Hello
      You could either do it in an On Page Load JavaScript dynamic on page 0. Simply copy the above code in the DA.
      Even better would be to have the above code in a JavaScript file and then include that file in your application.

      Delete
  3. Hi Max,
    It works good but Problem when refresh region!

    ReplyDelete