aboutsummaryrefslogtreecommitdiffstats
path: root/core/src/jquery/contactsmenu.js
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/jquery/contactsmenu.js')
-rw-r--r--core/src/jquery/contactsmenu.js114
1 files changed, 114 insertions, 0 deletions
diff --git a/core/src/jquery/contactsmenu.js b/core/src/jquery/contactsmenu.js
new file mode 100644
index 00000000000..fba014c364e
--- /dev/null
+++ b/core/src/jquery/contactsmenu.js
@@ -0,0 +1,114 @@
+/**
+ * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import $ from 'jquery'
+
+import { generateUrl } from '@nextcloud/router'
+import { isA11yActivation } from '../Util/a11y.js'
+
+const LIST = ''
+ + '<div class="menu popovermenu menu-left hidden contactsmenu-popover">'
+ + ' <ul>'
+ + ' <li>'
+ + ' <a>'
+ + ' <span class="icon-loading-small"></span>'
+ + ' </a>'
+ + ' </li>'
+ + ' </ul>'
+ + '</div>'
+
+const entryTemplate = require('./contactsmenu/jquery_entry.handlebars')
+
+$.fn.contactsMenu = function(shareWith, shareType, appendTo) {
+ // 0 - user, 4 - email, 6 - remote
+ const allowedTypes = [0, 4, 6]
+ if (allowedTypes.indexOf(shareType) === -1) {
+ return
+ }
+
+ const $div = this
+ appendTo.append(LIST)
+ const $list = appendTo.find('div.contactsmenu-popover')
+
+ $div.on('click keydown', function(event) {
+ if (!isA11yActivation(event)) {
+ return
+ }
+
+ if (!$list.hasClass('hidden')) {
+ $list.addClass('hidden')
+ $list.hide()
+ return
+ }
+
+ $list.removeClass('hidden')
+ $list.show()
+
+ if ($list.hasClass('loaded')) {
+ return
+ }
+
+ $list.addClass('loaded')
+ $.ajax(generateUrl('/contactsmenu/findOne'), {
+ method: 'POST',
+ data: {
+ shareType,
+ shareWith,
+ },
+ }).then(function(data) {
+ $list.find('ul').find('li').addClass('hidden')
+
+ let actions
+ if (!data.topAction) {
+ actions = [{
+ hyperlink: '#',
+ title: t('core', 'No action available'),
+ }]
+ } else {
+ actions = [data.topAction].concat(data.actions)
+ }
+
+ actions.forEach(function(action) {
+ $list.find('ul').append(entryTemplate(action))
+ })
+
+ $div.trigger('load')
+ }, function(jqXHR) {
+ $list.find('ul').find('li').addClass('hidden')
+
+ let title
+ if (jqXHR.status === 404) {
+ title = t('core', 'No action available')
+ } else {
+ title = t('core', 'Error fetching contact actions')
+ }
+
+ $list.find('ul').append(entryTemplate({
+ hyperlink: '#',
+ title,
+ }))
+
+ $div.trigger('loaderror', jqXHR)
+ })
+ })
+
+ $(document).click(function(event) {
+ const clickedList = ($list.has(event.target).length > 0)
+ let clickedTarget = ($div.has(event.target).length > 0)
+
+ $div.each(function() {
+ if ($(this).is(event.target)) {
+ clickedTarget = true
+ }
+ })
+
+ if (clickedList || clickedTarget) {
+ return
+ }
+
+ $list.addClass('hidden')
+ $list.hide()
+ })
+}