diff --git a/media/js/base.js b/media/js/base.js
index 7244320fa7..e838450653 100644
--- a/media/js/base.js
+++ b/media/js/base.js
@@ -812,3 +812,56 @@ function HTMLescape(html){
.parentNode
.innerHTML;
}
+
+function userInputOPtionsForSelect2(user_search_url) {
+ return {
+ tags: [],
+
+ tokenSeparators: [",", " "],
+
+ minimumInputLength: 1, // input at least 1 character
+
+ ajax: {
+ url: user_search_url,
+ dataType: 'json',
+ delay: 250,
+ cache: true,
+ data: function (params) {
+ return {
+ q: params
+ };
+ },
+ results: function (data) {
+ var user_list = [], users = data['users'];
+ for (var i = 0, len = users.length; i < len; i++) {
+ user_list.push({ // 'id' & 'text' are required by the plugin
+ "id": users[i].email,
+ // for search. both name & email can be searched.
+ // use ' '(space) to separate name & email
+ "text": users[i].name + ' ' + users[i].email,
+ "avatar": users[i].avatar,
+ "name": users[i].name
+ });
+ }
+ return {
+ results: user_list
+ };
+ }
+ },
+
+ // format items shown in the drop-down menu
+ formatResult: function(item) {
+ if (item.avatar) {
+ return item.avatar + '' + HTMLescape(item.name) + '
' + HTMLescape(item.id) + '';
+ } else {
+ return; // if no match, show nothing
+ }
+ },
+
+ // format selected item shown in the input
+ formatSelection: function(item) {
+ return HTMLescape(item.name || item.id); // if no name, show the email, i.e., when directly input, show the email
+ },
+ escapeMarkup: function(m) { return m; }
+ };
+}
diff --git a/seahub/group/templates/group/group_manage.html b/seahub/group/templates/group/group_manage.html
index f1c951f8e8..cf4b675b87 100644
--- a/seahub/group/templates/group/group_manage.html
+++ b/seahub/group/templates/group/group_manage.html
@@ -1,5 +1,10 @@
{% extends 'group/group_base.html' %}
-{% load seahub_tags avatar_tags group_avatar_tags i18n %}
+{% load seahub_tags avatar_tags group_avatar_tags i18n staticfiles %}
+
+{% block extra_style %}
+
+
+{% endblock %}
{% block cur_admin %}tab-cur{% endblock %}
@@ -104,16 +109,28 @@