diff options
author | Christoph Wurst <christoph@winzerhof-wurst.at> | 2019-05-08 08:34:32 +0200 |
---|---|---|
committer | Christoph Wurst <christoph@winzerhof-wurst.at> | 2019-05-08 08:34:32 +0200 |
commit | b2165059d46eedfa6c268283919b3dba9f592bb0 (patch) | |
tree | 0321dc051229fdb2cbabcf007924e7fa68892f2d /core/src | |
parent | 1c3adf4eff65b4768c5088aa0980471c2d934280 (diff) | |
download | nextcloud-server-b2165059d46eedfa6c268283919b3dba9f592bb0.tar.gz nextcloud-server-b2165059d46eedfa6c268283919b3dba9f592bb0.zip |
Move OC legacy menu helpers to the bundle
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Diffstat (limited to 'core/src')
-rw-r--r-- | core/src/OC/index.js | 15 | ||||
-rw-r--r-- | core/src/OC/menu.js | 135 |
2 files changed, 150 insertions, 0 deletions
diff --git a/core/src/OC/index.js b/core/src/OC/index.js index cf334c5a835..9ac9be05e60 100644 --- a/core/src/OC/index.js +++ b/core/src/OC/index.js @@ -40,6 +40,12 @@ import ContactsMenu from './contactsmenu' import Dialogs from './dialogs' import EventSource from './eventsource' import {get, set} from './get_set' +import { + hideMenus, + registerMenu, + showMenu, + unregisterMenu, +} from './menu' import {isUserAdmin} from './admin' import L10N from './l10n' import { @@ -88,6 +94,15 @@ export default { EventSource, isUserAdmin, L10N, + + /* + * Legacy menu helpers + */ + hideMenus, + registerMenu, + showMenu, + unregisterMenu, + msg, Notification, PasswordConfirmation, diff --git a/core/src/OC/menu.js b/core/src/OC/menu.js new file mode 100644 index 00000000000..a0ecd2a5f4f --- /dev/null +++ b/core/src/OC/menu.js @@ -0,0 +1,135 @@ +/* + * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +import _ from 'underscore' +import $ from 'jquery' + +import {menuSpeed} from './constants' + +let currentMenu = null +let currentMenuToggle = null + +/** + * For menu toggling + * + * @param {jQuery} $toggle + * @param {jQuery} $menuEl + * @param {function|undefined} toggle callback invoked everytime the menu is opened + * @param {boolean} headerMenu is this a top right header menu? + * @returns {undefined} + */ +export const registerMenu = ($toggle, $menuEl, toggle, headerMenu) => { + $menuEl.addClass('menu') + + // On link, the enter key trigger a click event + // Only use the click to avoid two fired events + $toggle.on($toggle.prop('tagName') === 'A' + ? 'click.menu' + : 'click.menu keyup.menu', function (event) { + // prevent the link event (append anchor to URL) + event.preventDefault() + + // allow enter key as a trigger + if (event.key && event.key !== "Enter") { + return + } + + if ($menuEl.is(currentMenu)) { + hideMenus() + return + } else if (currentMenu) { + // another menu was open? + // close it + hideMenus() + } + + if (headerMenu === true) { + $menuEl.parent().addClass('openedMenu') + } + + // Set menu to expanded + $toggle.attr('aria-expanded', true) + + $menuEl.slideToggle(menuSpeed, toggle) + currentMenu = $menuEl + currentMenuToggle = $toggle + }) +} + +/** + * @todo Write documentation + */ +export const unregisterMenu = ($toggle, $menuEl) => { + // close menu if opened + if ($menuEl.is(currentMenu)) { + hideMenus() + } + $toggle.off('click.menu').removeClass('menutoggle') + $menuEl.removeClass('menu') +} + +/** + * Hides any open menus + * + * @param {Function} complete callback when the hiding animation is done + */ +export const hideMenus = function(complete) { + if (currentMenu) { + const lastMenu = currentMenu + currentMenu.trigger(new $.Event('beforeHide')) + currentMenu.slideUp(menuSpeed, function () { + lastMenu.trigger(new $.Event('afterHide')) + if (complete) { + complete.apply(this, arguments) + } + }) + } + + // Set menu to closed + $('.menutoggle').attr('aria-expanded', false) + + $('.openedMenu').removeClass('openedMenu') + currentMenu = null + currentMenuToggle = null +} + +/** + * Shows a given element as menu + * + * @param {Object} [$toggle=null] menu toggle + * @param {Object} $menuEl menu element + * @param {Function} complete callback when the showing animation is done + */ +export const showMenu = ($toggle, $menuEl, complete) => { + if ($menuEl.is(currentMenu)) { + return + } + hideMenus() + currentMenu = $menuEl + currentMenuToggle = $toggle + $menuEl.trigger(new $.Event('beforeShow')) + $menuEl.show() + $menuEl.trigger(new $.Event('afterShow')) + // no animation + if (_.isFunction(complete)) { + complete() + } +} |