/** * Provides a list of matching user names while user inputs into a userpicker * * @author Adrian Lang * @author Gerrit Uitslag */ jQuery(function () { /** * Ajax request for user suggestions * * @param {Object} request object, with single 'term' property * @param {Function} response callback, argument: the data array to suggest to the user. * @param {Function} getterm callback, argument: the request Object, returns: search term */ function ajaxsource(request, response, getterm) { jQuery.getJSON( DOKU_BASE + 'lib/exe/ajax.php', { call: 'bureaucracy_user_field', search: getterm(request) }, function (data) { response(jQuery.map(data, function (name, user) { return { label: name + ' (' + user + ')', value: user } })) } ); } function split(val) { return val.split(/,\s*/); } function extractLast(term) { return split(term).pop(); } /** * pick one user */ jQuery(".userpicker").autocomplete({ source: function (request, response) { ajaxsource(request, response, function (req) { return req.term }) } }); /** * pick one or more users */ jQuery(".userspicker") // don't navigate away from the field on tab when selecting an item .bind("keydown", function (event) { if (event.keyCode === jQuery.ui.keyCode.TAB && jQuery(this).data("ui-autocomplete").menu.active) { event.preventDefault(); } }) .autocomplete({ minLength: 0, source: function (request, response) { ajaxsource(request, response, function (req) { return extractLast(req.term) }) }, search: function () { // custom minLength var term = extractLast(this.value); return term.length >= 2; }, focus: function () { // prevent value inserted on focus return false; }, 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; } }); });