Index: setup.py =================================================================== --- setup.py (revision 12686) +++ setup.py (working copy) @@ -10,12 +10,12 @@ from setuptools import find_packages, setup -version='0.4.2' +version='0.4.5' setup(name='AutocompleteUsers', version=version, description="complete the known trac users, AJAX style", - author='Jeff Hammel', + author='Jeff Hammel & Mario Wehr', author_email='jhammel@openplans.org', maintainer = 'Ryan J Ollos', maintainer_email = 'ryano@physiosonics.com', Index: autocompleteusers/htdocs/css/autocomplete.css =================================================================== --- autocompleteusers/htdocs/css/autocomplete.css (revision 12686) +++ autocompleteusers/htdocs/css/autocomplete.css (working copy) @@ -1,4 +1,16 @@ -.ac_results { +.ui-autocomplete-loading { + background:url('indicator.gif') no-repeat right center +} + +.ui-autocomplete.ui-menu{ + padding: 0px; + border: 1px solid black; + background-color: white; + overflow: hidden; + z-index: 99999; + } + +.ui-autocomplete-results { padding: 0px; border: 1px solid black; background-color: white; @@ -6,14 +18,14 @@ z-index: 99999; } -.ac_results ul { +.ui-autocomplete-results ul { list-style-position: outside; list-style: none; padding: 0; margin: 0; } -.ac_results li { +.ui-autocomplete-results li { margin: 0px; padding: 2px 5px; cursor: default; @@ -34,20 +46,17 @@ white-space: nowrap; } -.ac_results li div.mail { +li div.mail { font-size: 80%; color: #888; } -.ac_loading { - background: white url('indicator.gif') right center no-repeat; -} - -.ac_odd { +.ui-autocomplete-results li.ui-autocomplete-odd{ background-color: #eee; } -.ac_over { +.ui-autocomplete-over { background-color: #ffd; color: #000; } + Index: autocompleteusers/htdocs/js/autocomplete_newticket.js =================================================================== --- autocompleteusers/htdocs/js/autocomplete_newticket.js (revision 12686) +++ autocompleteusers/htdocs/js/autocomplete_newticket.js (working copy) @@ -1,5 +1,15 @@ jQuery(document).ready(function($) { - $("#field-owner").autocomplete("subjects", { - formatItem: formatItem - }); + $("#field-owner").autocomplete({ + source: function( request, response ) { + $.ajax({ + url: "subjects", + type: "GET", + dataType: "text", + data: 'q=' + request.term , + success: function( data ) { + response( $.map( data.split("\n"), formatItem )); + } + }); + } + }); }); \ No newline at end of file Index: autocompleteusers/htdocs/js/autocomplete_newticket_cc.js =================================================================== --- autocompleteusers/htdocs/js/autocomplete_newticket_cc.js (revision 12686) +++ autocompleteusers/htdocs/js/autocomplete_newticket_cc.js (working copy) @@ -1,10 +1,46 @@ jQuery(document).ready(function($) { - $("#field-cc").autocomplete("subjects", { - multiple: true, - formatItem: formatItem, - delay: 100 - }); - $("input:text#field-reporter").autocomplete("subjects", { - formatItem: formatItem - }); -}); \ No newline at end of file + $("#field-cc").autocomplete({ + source: function( request, response ) { + $.ajax({ + url: "subjects", + type: "GET", + dataType: "text", + data: 'q=' + extractLast( request.term ) , + success: function( data ) { + response( $.map( data.split("\n"), formatItem )); + } + }); + }, + + select: function( event, ui ) { + var terms = split( this.value ); + // remove the current input + terms.pop(); + // add the selected item + terms.push( ui.item.value ); + // add placeholder to get the comma-and-space at the end + terms.push( "" ); + this.value = terms.join( "," ); + return false; + } + }).data("autocomplete")._renderItem = function (ul, item) { + return $( "
  • " ) + .data('item.autocomplete', item) + .append( "" + item.label + "
    " + item.desc + "
    " ) + .appendTo( ul ); + }; + $("input:text#field-reporter").autocomplete({ + source: function( request, response ) { + $.ajax({ + url: "subjects", + type: "GET", + dataType: "text", + data: 'q=' + request.term , + success: function( data ) { + response( $.map( data.split("\n"), formatItem )); + } + }); + } + }); +}); + Index: autocompleteusers/htdocs/js/autocomplete_ticket.js =================================================================== --- autocompleteusers/htdocs/js/autocomplete_ticket.js (revision 12686) +++ autocompleteusers/htdocs/js/autocomplete_ticket.js (working copy) @@ -1,5 +1,15 @@ jQuery(document).ready(function($) { - $("[id$=reassign_owner]").autocomplete("../subjects", { - formatItem: formatItem - }); + $("[id$=action_changeowner_reassign_owner]").autocomplete({ + source: function( request, response ) { + $.ajax({ + url: "../subjects", + type: "GET", + dataType: "text", + data: 'q=' + request.term , + success: function( data ) { + response( $.map( data.split("\n"), formatItem )); + } + }); + } + }); }); \ No newline at end of file Index: autocompleteusers/htdocs/js/format_item.js =================================================================== --- autocompleteusers/htdocs/js/format_item.js (revision 12686) +++ autocompleteusers/htdocs/js/format_item.js (working copy) @@ -1,5 +1,16 @@ function formatItem(row) { - var firstLine = (row[2]) ? row[0] + " (" + row[2] + ")" : row[0]; - return "
    " + firstLine + "
    " - + (row[1] ? "
    " + row[1] + "
    " : ''); -} + var array = row.split('|'); + return { + label : (array[2]) ? array[0] + " (" + array[2] + ")" : array[0], + value : array[0], + desc : (array[1]) ? array[1] : "no results" + } +}; + +function split( val ) { + return val.split( /\s*[,;]\s*/ ); + } + +function extractLast( term ) { + return split( term ).pop(); +} \ No newline at end of file Index: autocompleteusers/htdocs/js/autocomplete_perms.js =================================================================== --- autocompleteusers/htdocs/js/autocomplete_perms.js (revision 12686) +++ autocompleteusers/htdocs/js/autocomplete_perms.js (working copy) @@ -1,11 +1,41 @@ -$(document).ready(function() { - $("#gp_subject").autocomplete("../../subjects?groups=1", { - formatItem: formatItem +jQuery(document).ready(function($) { + $("#gp_subject").autocomplete({ + source: function( request, response ) { + $.ajax({ + url: "../../subjects?groups=1", + type: "GET", + dataType: "text", + data: 'q=' + request.term , + success: function( data ) { + response( $.map( data.split("\n"), formatItem )); + } + }); + } }); - $("#sg_subject").autocomplete("../../subjects?groups=1", { - formatItem: formatItem + $("#sg_subject").autocomplete({ + source: function( request, response ) { + $.ajax({ + url: "../../subjects?groups=1", + type: "GET", + dataType: "text", + data: 'q=' + request.term , + success: function( data ) { + response( $.map( data.split("\n"), formatItem )); + } + }); + } }); - $("#sg_group").autocomplete("../../subjects?groups=1&users=0", { - formatItem: formatItem + $("#sg_group").autocomplete({ + source: function( request, response ) { + $.ajax({ + url: "../../subjects?groups=1&users=0", + type: "GET", + dataType: "text", + data: 'q=' + request.term , + success: function( data ) { + response( $.map( data.split("\n"), formatItem )); + } + }); + } }); }); Index: autocompleteusers/htdocs/js/autocomplete_ticket_cc.js =================================================================== --- autocompleteusers/htdocs/js/autocomplete_ticket_cc.js (revision 12686) +++ autocompleteusers/htdocs/js/autocomplete_ticket_cc.js (working copy) @@ -1,9 +1,45 @@ jQuery(document).ready(function($) { - $("#field-cc").autocomplete("../subjects", { - multiple: true, - formatItem: formatItem - }); - $("input:text#field-reporter").autocomplete("../subjects", { - formatItem: formatItem - }); -}); \ No newline at end of file + $("#field-cc").autocomplete({ + source: function( request, response ) { + $.ajax({ + url: "../subjects", + type: "GET", + dataType: "text", + data: 'q=' + extractLast( request.term ) , + success: function( data ) { + response( $.map( data.split("\n"), formatItem )); + } + }); + }, + select: function( event, ui ) { + var terms = split( this.value ); + // remove the current input + terms.pop(); + // add the selected item + terms.push( ui.item.value ); + // add placeholder to get the comma-and-space at the end + terms.push( "" ); + this.value = terms.join( "," ); + return false; + } + }).data("autocomplete")._renderItem = function (ul, item) { + return $( "
  • " ) + .data('item.autocomplete', item) + .append( "" + item.label + "
    " + item.desc + "
    " ) + .appendTo( ul ); + }; + $("input:text#field-reporter").autocomplete({ + source: function( request, response ) { + $.ajax({ + url: "../subjects", + type: "GET", + dataType: "text", + data: 'q=' + request.term , + success: function( data ) { + response( $.map( data.split("\n"), formatItem )); + } + }); + } + }); +}); + Index: autocompleteusers/autocompleteusers.py =================================================================== --- autocompleteusers/autocompleteusers.py (revision 12686) +++ autocompleteusers/autocompleteusers.py (working copy) @@ -37,7 +37,7 @@ if req.args.get('users', '1') == '1': users = self._get_users(req) subjects = ['%s|%s|%s' % (user[USER], - user[EMAIL] and '<%s> ' % user[EMAIL] or '', + user[EMAIL] and '%s' % user[EMAIL] or '', user[NAME]) for value, user in users] # value unused (placeholder needed for sorting) @@ -63,13 +63,13 @@ return handler def post_process_request(self, req, template, data, content_type): - if template in ('ticket.html', 'admin_perms.html', 'query.html'): + if template in ('ticket.html', 'admin_perms.html', 'query.html', 'admin_svnpolicies.html'): add_stylesheet(req, 'autocomplete/css/autocomplete.css') - add_script(req, 'autocomplete/js/autocomplete.js') add_script(req, 'autocomplete/js/format_item.js') + add_script(req, 'autocomplete/js/format_item.js') if template == 'ticket.html': restrict_owner = self.env.config.getbool('ticket', 'restrict_owner') - if req.path_info.rstrip() == '/newticket': + if req.path_info.rstrip() == '/newticket': add_script(req, 'autocomplete/js/autocomplete_newticket_cc.js') if not restrict_owner: add_script(req, 'autocomplete/js/autocomplete_newticket.js') @@ -79,9 +79,13 @@ add_script(req, 'autocomplete/js/autocomplete_ticket.js') elif template == 'admin_perms.html': add_script(req, 'autocomplete/js/autocomplete_perms.js') + add_script(req, 'common/js/jquery-ui.js') elif template == 'query.html': add_script(req, 'autocomplete/js/autocomplete_query.js') - + elif template == 'admin_svnpolicies.html': + add_script(req, 'common/js/jquery-ui.js') + add_script(req, 'autocomplete/js/autocomplete_admin_svnpolicies_recp_list.js') + return template, data, content_type # ITemplateStreamFilter methods