]> git.uio.no Git - usit-rt.git/blame - share/static/js/autocomplete.js
Merge branch 'master' of git.uio.no:usit-rt
[usit-rt.git] / share / static / js / autocomplete.js
CommitLineData
af59614d
MKG
1if (!window.RT) window.RT = {}
2if (!window.RT.Autocomplete) window.RT.Autocomplete = {}
3
4window.RT.Autocomplete.bind = function(from) {
5 var cssClassMap = {
6 Users: 'user',
7 Groups: 'group',
8 Tickets: 'tickets'
9 };
10
11 jQuery("input[data-autocomplete]", from).each(function(){
12 var input = jQuery(this);
13 var what = input.attr("data-autocomplete");
14 var wants = input.attr("data-autocomplete-return");
15
16 if (!what || !what.match(/^(Users|Groups|Tickets)$/)) // Did you update cssClassMap above?
17 return;
18
19 // Don't re-bind the autocompleter
20 if (input.data("ui-autocomplete"))
21 return;
22
23 var queryargs = [];
24 var options = {
25 source: RT.Config.WebHomePath + "/Helpers/Autocomplete/" + what
26 };
27
28 if ( wants ) {
29 queryargs.push("return=" + wants);
30 }
31
32 if (input.is('[data-autocomplete-privileged]')) {
33 queryargs.push("privileged=1");
34 }
35
36 if (input.is('[data-autocomplete-multiple]')) {
37 if ( what != 'Tickets' ) {
38 queryargs.push("delim=,");
39 }
40
41 options.focus = function () {
42 // prevent value inserted on focus
43 return false;
44 }
45
46 options.select = function(event, ui) {
47 var terms = this.value.split(what == 'Tickets' ? /\s+/ : /,\s*/);
48 terms.pop(); // remove current input
49 terms.push( ui.item.value ); // add selected item
50 if ( what == 'Tickets' ) {
51 // remove non-integers in case subject search with spaces in (like "foo bar")
52 terms = jQuery.grep(terms, function(term) {
53 var str = term + ''; // stringify integers to call .match
54 return str.match(/^\d+$/);
55 } );
af59614d 56 }
c33a4027 57 terms.push(''); // add trailing delimeter so user can input another value directly
af59614d
MKG
58 this.value = terms.join(what == 'Tickets' ? ' ' : ", ");
59 return false;
60 }
61 }
62
63 var exclude = input.attr('data-autocomplete-exclude');
64 if (exclude) {
65 queryargs.push("exclude="+exclude);
66 }
67
68 if (queryargs.length)
69 options.source += "?" + queryargs.join("&");
70
71 input.addClass('autocompletes-' + cssClassMap[what] )
72 .autocomplete(options)
73 .data("ui-autocomplete")
74 ._renderItem = function(ul, item) {
75 var rendered = jQuery("<a/>");
76
77 if (item.html == null)
78 rendered.text( item.label );
79 else
80 rendered.html( item.html );
81
82 return jQuery("<li/>")
83 .data( "item.autocomplete", item )
84 .append( rendered )
85 .appendTo( ul );
86 };
87 });
88};
89jQuery(function(){ RT.Autocomplete.bind(document) });