From 97d3f7cbd350974576902bad189fb26de1349600 Mon Sep 17 00:00:00 2001 From: Philipp Tessenow Date: Tue, 28 May 2013 15:19:38 +0200 Subject: [PATCH] refactor the js code of the more_functions menu. extract it in a separate js file --- app/assets/javascripts/action_menu.js | 64 +++++++++++++++++++++++++++ app/assets/javascripts/application.js | 3 +- 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 app/assets/javascripts/action_menu.js diff --git a/app/assets/javascripts/action_menu.js b/app/assets/javascripts/action_menu.js new file mode 100644 index 0000000000..41a8b71274 --- /dev/null +++ b/app/assets/javascripts/action_menu.js @@ -0,0 +1,64 @@ +/* + The action menu is a menu that usually belongs to an OpenProject entity (like an Issue, WikiPage, Meeting, ..). + Most likely it looks like this: + + The following code is responsible to open and close the "more functions" submenu. +*/ + +jQuery(function ($) { + var animationSpeed = 100; // ms + + function menu_top_position(menu) { + // if an h2 tag follows the submenu should unfold out at the border + var menu_start_position; + if (menu.next().get(0) != undefined && (menu.next().get(0).tagName == 'H2')){ + menu_start_position = menu.next().innerHeight() + menu.next().position().top; + } + else if(menu.next().hasClass("wiki-content") && menu.next().children().next().first().get(0) != undefined && menu.next().children().next().first().get(0).tagName == 'H1'){ + var wiki_heading = menu.next().children().next().first(); + menu_start_position = wiki_heading.innerHeight() + wiki_heading.position().top; + } + return menu_start_position; + }; + + function close_menu(event) { + var menu = $(event.data.menu); + menu.find(" > li.drop-down.open").removeClass("open").find("> ul").slideUp(animationSpeed); + // no need to watch for clicks, when the menu is already closed + $('html').off('click', close_menu); + }; + + function open_menu(menu) { + var drop_down = menu.find(" > li.drop-down") + // do not open a menu, which is already open + if ( !drop_down.hasClass('open') ) { + drop_down.find('> ul').slideDown(animationSpeed, function(){ + drop_down.find('li > a:first').focus(); + // when clicking on something, which is not the menu, close the menu + $('html').on('click', {menu: menu.get(0)}, close_menu); + }); + drop_down.addClass('open'); + }; + }; + + // open the given submenu when clicking on it + function install_menu_logic(menu) { + menu.find(" > li.drop-down").click(function(event) { + $(this).find("ul.action_menu_more").css({ top: menu_top_position(menu) }); + open_menu(menu); + }); + }; + + $('.action_menu_main').each(function(idx, menu){ + install_menu_logic($(menu)); + }); +}); diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 4f0b9ec423..004a5c09c7 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -21,6 +21,7 @@ //= require controls //= require i18n/translations //= require select2 +//= require action_menu //= require openproject //= require breadcrumb //= require findDomElement @@ -752,7 +753,6 @@ jQuery(document).ready(function($) { }; - // open and close the main-menu sub-menus $("#main-menu li:has(ul) > a").not("ul ul a") .append("") @@ -803,7 +803,6 @@ jQuery(document).ready(function($) { return false; }); $("#account-nav").onClickDropDown(); - $(".action_menu_main").onClickDropDown(); // deal with potentially problematic super-long titles $(".title-bar h2").css({paddingRight: $(".title-bar-actions").outerWidth() + 15 });