summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/Controller/ContactsMenuController.php17
-rw-r--r--core/css/share.scss15
-rw-r--r--core/js/core.json1
-rw-r--r--core/js/jquery.contactsmenu.js107
-rw-r--r--core/js/merged-template-prepend.json3
-rw-r--r--core/js/sharedialogshareelistview.js11
-rw-r--r--core/routes.php1
7 files changed, 153 insertions, 2 deletions
diff --git a/core/Controller/ContactsMenuController.php b/core/Controller/ContactsMenuController.php
index b0e0e0c6a77..bbb990f1a4f 100644
--- a/core/Controller/ContactsMenuController.php
+++ b/core/Controller/ContactsMenuController.php
@@ -26,6 +26,7 @@ namespace OC\Core\Controller;
use OC\Contacts\ContactsMenu\Manager;
use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IRequest;
use OCP\IUserSession;
@@ -59,4 +60,20 @@ class ContactsMenuController extends Controller {
return $this->manager->getEntries($this->userSession->getUser(), $filter);
}
+ /**
+ * @NoAdminRequired
+ *
+ * @param integer $shareType
+ * @param string $shareWith
+ * @return JSONResponse
+ */
+ public function findOne($shareType, $shareWith) {
+ $contact = $this->manager->findOne($this->userSession->getUser(), $shareType, $shareWith);
+
+ if ($contact) {
+ return $contact;
+ } else {
+ return new JSONResponse([], Http::STATUS_NOT_FOUND);
+ }
+ }
}
diff --git a/core/css/share.scss b/core/css/share.scss
index 552e20c80cc..2ea80b146b5 100644
--- a/core/css/share.scss
+++ b/core/css/share.scss
@@ -87,6 +87,7 @@
list-style-type: none;
padding: 8px;
> li {
+ position: relative;
padding-top: 10px;
padding-bottom: 10px;
font-weight: bold;
@@ -103,6 +104,7 @@
padding: 3px 6px;
}
}
+
.shareOption {
white-space: nowrap;
display: inline-block;
@@ -185,6 +187,19 @@ a {
color: rgba($color-main-text, .4);
}
+.contactsmenu-popover {
+ left: -8px;
+ right: auto;
+ padding: 3px 6px;
+ li.hidden {
+ display: none !important;
+ }
+ &:after {
+ left: 8px;
+ right: auto;
+ }
+}
+
.popovermenu .datepicker {
margin-left: 35px;
}
diff --git a/core/js/core.json b/core/js/core.json
index aadd66a0558..15e406bf2d2 100644
--- a/core/js/core.json
+++ b/core/js/core.json
@@ -20,6 +20,7 @@
"libraries": [
"jquery-showpassword.js",
"jquery.avatar.js",
+ "jquery.contactsmenu.js",
"placeholder.js"
],
"modules": [
diff --git a/core/js/jquery.contactsmenu.js b/core/js/jquery.contactsmenu.js
new file mode 100644
index 00000000000..3c782cc5bfd
--- /dev/null
+++ b/core/js/jquery.contactsmenu.js
@@ -0,0 +1,107 @@
+/**
+ * Copyright (c) 2017 Georg Ehrke <oc.list@georgehrke.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+(function ($) {
+ var ENTRY = ''
+ + '<li>'
+ + ' <a href="{{hyperlink}}">'
+ + ' {{#if icon}}<img src="{{icon}}">{{/if}}'
+ + ' <span>{{title}}</span>'
+ + ' </a>'
+ + '</li>';
+
+ $.fn.contactsMenu = function(shareWith, shareType, appendTo) {
+ if (typeof(shareWith) !== 'undefined') {
+ shareWith = String(shareWith);
+ } else {
+ if (typeof(this.data('share-with')) !== 'undefined') {
+ shareWith = this.data('share-with');
+ }
+ }
+ if (typeof(shareType) !== 'undefined') {
+ shareType = Number(shareType);
+ } else {
+ if (typeof(this.data('share-type')) !== 'undefined') {
+ shareType = this.data('share-type');
+ }
+ }
+ if (typeof(appendTo) === 'undefined') {
+ appendTo = this;
+ }
+
+ // 0 - user, 4 - email, 6 - remote
+ var allowedTypes = [0, 4, 6];
+ if (allowedTypes.indexOf(shareType) === -1) {
+ return;
+ }
+
+ var $div = this;
+ appendTo.append('<div class="menu popovermenu bubble hidden contactsmenu-popover"><ul><li><a><span class="icon-loading-small"></span></a></li></ul></div>');
+ var $list = appendTo.find('div.contactsmenu-popover');
+ var url = OC.generateUrl('/contactsmenu/findOne');
+
+ $div.click(function() {
+ $list.show();
+
+ if ($list.hasClass('loaded')) {
+ return;
+ }
+
+ $list.addClass('loaded');
+ $.ajax(url, {
+ method: 'POST',
+ data: {
+ shareType: shareType,
+ shareWith: shareWith
+ }
+ }).then(function(data) {
+ $list.find('ul').find('li').addClass('hidden');
+
+ var actions;
+ if (!data.topAction) {
+ actions = [{
+ hyperlink: '#',
+ title: t('core', 'No action available')
+ }];
+ } else {
+ actions = [data.topAction].concat(data.actions);
+ }
+
+ actions.forEach(function(action) {
+ var template = Handlebars.compile(ENTRY);
+ $list.find('ul').append(template(action));
+ });
+
+ if (actions.length === 0) {
+
+ }
+ });
+ });
+
+ $(document).click(function(event) {
+ var clickedList = $.contains($list, event.target);
+ var clickedLi = $.contains($div, event.target);
+
+ $div.each(function() {
+ if ($(this).is(event.target)) {
+ clickedLi = true;
+ }
+ });
+
+ if (clickedList) {
+ return;
+ }
+
+ if (clickedLi) {
+ return;
+ }
+
+ $list.hide();
+
+ });
+ };
+}(jQuery));
diff --git a/core/js/merged-template-prepend.json b/core/js/merged-template-prepend.json
index 12b7ca8faa3..0dd6bed5329 100644
--- a/core/js/merged-template-prepend.json
+++ b/core/js/merged-template-prepend.json
@@ -13,5 +13,6 @@
"mimetypelist.js",
"oc-backbone.js",
"placeholder.js",
- "jquery.avatar.js"
+ "jquery.avatar.js",
+ "jquery.contactsmenu.js"
]
diff --git a/core/js/sharedialogshareelistview.js b/core/js/sharedialogshareelistview.js
index 3a481e53dde..982004bf52d 100644
--- a/core/js/sharedialogshareelistview.js
+++ b/core/js/sharedialogshareelistview.js
@@ -26,7 +26,7 @@
'{{#each sharees}}' +
'<li data-share-id="{{shareId}}" data-share-type="{{shareType}}" data-share-with="{{shareWith}}">' +
'<div class="avatar {{#if modSeed}}imageplaceholderseed{{/if}}" data-username="{{shareWith}}" data-displayname="{{shareWithDisplayName}}" {{#if modSeed}}data-seed="{{shareWith}} {{shareType}}"{{/if}}></div>' +
- '<span class="has-tooltip username" title="{{shareWithTitle}}">{{shareWithDisplayName}}</span>' +
+ '<span class="username" title="{{shareWithTitle}}">{{shareWithDisplayName}}</span>' +
'<span class="sharingOptionsGroup">' +
'{{#if editPermissionPossible}}' +
'<span class="shareOption">' +
@@ -361,6 +361,15 @@
this.$('.has-tooltip').tooltip({
placement: 'bottom'
});
+
+ this.$('ul.shareWithList > li').each(function() {
+ var $this = $(this);
+
+ var shareWith = $this.data('share-with');
+ var shareType = $this.data('share-type');
+
+ $this.find('div.avatar, span.username').contactsMenu(shareWith, shareType, $this);
+ })
} else {
var permissionChangeShareId = parseInt(this._renderPermissionChange, 10);
var shareWithIndex = this.model.findShareWithIndex(permissionChangeShareId);
diff --git a/core/routes.php b/core/routes.php
index 37db2642c1b..c167dad2f9f 100644
--- a/core/routes.php
+++ b/core/routes.php
@@ -61,6 +61,7 @@ $application->registerRoutes($this, [
['name' => 'Css#getCss', 'url' => '/css/{appName}/{fileName}', 'verb' => 'GET'],
['name' => 'Js#getJs', 'url' => '/js/{appName}/{fileName}', 'verb' => 'GET'],
['name' => 'contactsMenu#index', 'url' => '/contactsmenu/contacts', 'verb' => 'POST'],
+ ['name' => 'contactsMenu#findOne', 'url' => '/contactsmenu/findOne', 'verb' => 'POST'],
],
'ocs' => [
['root' => '/cloud', 'name' => 'OCS#getCapabilities', 'url' => '/capabilities', 'verb' => 'GET'],