summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/bureaucracy/script/user.js
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/lib/plugins/bureaucracy/script/user.js')
-rwxr-xr-xplatform/www/lib/plugins/bureaucracy/script/user.js90
1 files changed, 90 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/bureaucracy/script/user.js b/platform/www/lib/plugins/bureaucracy/script/user.js
new file mode 100755
index 0000000..9d5d806
--- /dev/null
+++ b/platform/www/lib/plugins/bureaucracy/script/user.js
@@ -0,0 +1,90 @@
+/**
+ * Provides a list of matching user names while user inputs into a userpicker
+ *
+ * @author Adrian Lang <lang@cosmocode.de>
+ * @author Gerrit Uitslag <klapinklapin@gmail.com>
+ */
+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;
+ }
+ });
+});