summaryrefslogtreecommitdiffstats
path: root/core/src
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2019-05-08 08:34:32 +0200
committerChristoph Wurst <christoph@winzerhof-wurst.at>2019-05-08 08:34:32 +0200
commitb2165059d46eedfa6c268283919b3dba9f592bb0 (patch)
tree0321dc051229fdb2cbabcf007924e7fa68892f2d /core/src
parent1c3adf4eff65b4768c5088aa0980471c2d934280 (diff)
downloadnextcloud-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.js15
-rw-r--r--core/src/OC/menu.js135
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()
+ }
+}