diff --git a/group/templates/group/group_info.html b/group/templates/group/group_info.html
index e61b5eda44..c8fc538c28 100644
--- a/group/templates/group/group_info.html
+++ b/group/templates/group/group_info.html
@@ -161,13 +161,7 @@ addConfirmTo($('#quit-group'), '确定要退出?');
addConfirmTo($('.cancel-share'), '确定要取消共享该目录?');
$(function() {
- var member_list = [], nickname, pinyin;
- {% for member in members %}
- nickname = '{{ member.user_name|email2nickname }}';
- pinyin = '{{ member.user_name|email2nickname|char2pinyin }}';
- member_list.push({value:nickname + pinyin, label:nickname});
- {% endfor %}
- addAtAutocomplete('#message', '#group-message-form', member_list, {'border':'1px solid #ddd', 'width':'600px', 'height': '80px', 'word-wrap':'break-word', 'overflow-y':'auto', 'line-height': '1.5em'}); // remember to add unit (px or em) to line-height, as js in ie will take 1.5 as 1.5, not 1.5em
+ addAtAutocomplete('#message', '#group-message-form', {{ group.id }}, "{% url 'group_attention' %}", {'border':'1px solid #ddd', 'width':'600px', 'height': '80px', 'word-wrap':'break-word', 'overflow-y':'auto', 'line-height': '1.5em'}); // remember to add unit (px or em) to line-height, as js in ie will take 1.5 as 1.5, not 1.5em
});
$("table tr:gt(0)").hover(
diff --git a/group/urls.py b/group/urls.py
index ab6b6cec7b..f5af5eb094 100644
--- a/group/urls.py
+++ b/group/urls.py
@@ -2,7 +2,7 @@ from django.conf.urls.defaults import *
from views import group_info, group_member_operations, \
group_members, msg_reply, msg_reply_new, group_recommend, \
- create_group_repo, group_joinrequest
+ create_group_repo, group_joinrequest, attention
urlpatterns = patterns('',
url(r'^(?P[\d]+)/$', group_info, name='group_info'),
@@ -12,5 +12,6 @@ urlpatterns = patterns('',
url(r'^(?P[\d]+)/create-repo/$', create_group_repo, name='create_group_repo'),
(r'^(?P[\d]+)/member/(?P[^/]+)/$', group_member_operations),
url(r'^recommend/$', group_recommend, name='group_recommend'),
+ url(r'^attention/$', attention, name='group_attention'),
url(r'^joinrequest/(?P[\d]+)/$', group_joinrequest, name='group_joinrequest'),
)
diff --git a/group/views.py b/group/views.py
index 01a226db06..f23f12460f 100644
--- a/group/views.py
+++ b/group/views.py
@@ -861,3 +861,37 @@ def group_joinrequest(request, group_id):
return HttpResponseBadRequest(json.dumps(form.errors),
content_type=content_type)
+def attention(request):
+ """
+ Handle ajax request to query group members used in autocomplete.
+ """
+ if not request.is_ajax():
+ raise Http404
+
+ try:
+ gid = int(request.GET.get('gid', ''))
+ except ValueError:
+ raise Http404
+
+ name_str = request.GET.get('name_startsWith')
+ user = request.user.username
+
+ if not is_group_user(gid, user):
+ raise Http404
+
+ result = []
+ # Get all group users
+ members = get_group_members(gid)
+ for m in members:
+ if m.user_name == user:
+ continue
+ from base.templatetags.seahub_tags import email2nickname, char2pinyin
+ nickname = email2nickname(m.user_name)
+ pinyin = char2pinyin(nickname)
+ if nickname.startswith(name_str) or pinyin.startswith(name_str):
+ result.append({'contact_name': nickname})
+
+ content_type = 'application/json; charset=utf-8'
+
+ return HttpResponse(json.dumps(result), content_type=content_type)
+
diff --git a/media/js/utils.js b/media/js/utils.js
index 7c9c6c4851..6424a26e90 100644
--- a/media/js/utils.js
+++ b/media/js/utils.js
@@ -1,13 +1,11 @@
-/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-
//add op confirm dialog
var Op_url = '';
function addConfirmTo(ele, confirm_con) {
ele.each(function() {
$(this).click(function() {
- if (confirm_con) {
- $('#confirm-con').html(confirm_con);
- }
+ if (confirm_con) {
+ $('#confirm-con').html(confirm_con);
+ }
$('#dialog-confirm').modal({appendTo:'#main'});
Op_url = $(this).attr('data');
return false;//in case ele is ''
@@ -58,10 +56,10 @@ function addAutocomplete(ele_id, container_id, data) {
delay: 100,
minLength: 0,
source: function(request, response) {
- var matcher = new RegExp($.ui.autocomplete.escapeRegex(extractLast(request.term)), "i");
- response($.grep(data, function(value) {
- return matcher.test(value.value);
- }));
+ var matcher = new RegExp($.ui.autocomplete.escapeRegex(extractLast(request.term)), "i");
+ response($.grep(data, function(value) {
+ return matcher.test(value.value);
+ }));
},
focus: function() {
return false;
@@ -83,7 +81,7 @@ function addAutocomplete(ele_id, container_id, data) {
* @param ele_css: {'xx':'xxx'}, styles to be applied to ele_cp
* @param container_id: id of autocomplete's container, often container of element above
*/
-function addAtAutocomplete(ele_id, container_id, data, ele_css) {
+function addAtAutocomplete(ele_id, container_id, gid, aj_url, ele_css) {
var pos = ''; // cursor position
var cursor_at_end; // Boolean. if cursor at the end or in the middle.
var end_str = ''; // str after '@' when '@' is inserted into the middle of the ele's value
@@ -150,10 +148,22 @@ function addAtAutocomplete(ele_id, container_id, data, ele_css) {
} else {
request_term = request.term.slice(pos + 1, - end_str.length);
}
- var matcher = new RegExp($.ui.autocomplete.escapeRegex(request_term), "i");
- response($.grep(data, function(value) {
- return matcher.test(value.value);
- }));
+ $.ajax({
+ url: aj_url,
+ dataType: "json",
+ data: {
+ gid: gid,
+ name_startsWith: request_term
+ },
+ success: function(data) {
+ response($.map(data, function(value) {
+ return {
+ label: value.contact_name,
+ value: value.contact_name
+ }
+ }));
+ }
+ });
} else {
response(null); // when cursor is at the left of current @ or @ is deleted
}