7
7
* choose which one suits your project best!
8
8
*
9
9
*/
10
+ ; ( function ( $ ) {
10
11
11
- ( function ( $ ) {
12
- // Default settings
13
- var DEFAULT_SETTINGS = {
12
+ // Default settings
13
+ var DEFAULT_SETTINGS = {
14
14
// Search settings
15
15
method : "GET" ,
16
16
queryParam : "q" ,
@@ -58,6 +58,7 @@ var DEFAULT_SETTINGS = {
58
58
// Behavioral settings
59
59
allowFreeTagging : false ,
60
60
allowTabOut : false ,
61
+ autoSelectFirstResult : false ,
61
62
62
63
// Callbacks
63
64
onResult : null ,
@@ -72,10 +73,10 @@ var DEFAULT_SETTINGS = {
72
73
73
74
// Keep track if the input is currently in disabled mode
74
75
disabled : false
75
- } ;
76
+ } ;
76
77
77
- // Default classes to use when theming
78
- var DEFAULT_CLASSES = {
78
+ // Default classes to use when theming
79
+ var DEFAULT_CLASSES = {
79
80
tokenList : "token-input-list" ,
80
81
token : "token-input-token" ,
81
82
tokenReadOnly : "token-input-token-readonly" ,
@@ -89,17 +90,17 @@ var DEFAULT_CLASSES = {
89
90
inputToken : "token-input-input-token" ,
90
91
focused : "token-input-focused" ,
91
92
disabled : "token-input-disabled"
92
- } ;
93
+ } ;
93
94
94
- // Input box position "enum"
95
- var POSITION = {
95
+ // Input box position "enum"
96
+ var POSITION = {
96
97
BEFORE : 0 ,
97
98
AFTER : 1 ,
98
99
END : 2
99
- } ;
100
+ } ;
100
101
101
- // Keys "enum"
102
- var KEY = {
102
+ // Keys "enum"
103
+ var KEY = {
103
104
BACKSPACE : 8 ,
104
105
TAB : 9 ,
105
106
ENTER : 13 ,
@@ -115,18 +116,18 @@ var KEY = {
115
116
DOWN : 40 ,
116
117
NUMPAD_ENTER : 108 ,
117
118
COMMA : 188
118
- } ;
119
+ } ;
119
120
120
- var HTML_ESCAPES = {
121
- '&' : '&' ,
122
- '<' : '<' ,
123
- '>' : '>' ,
124
- '"' : '"' ,
125
- "'" : ''' ,
126
- '/' : '/'
127
- } ;
121
+ var HTML_ESCAPES = {
122
+ '&' : '&' ,
123
+ '<' : '<' ,
124
+ '>' : '>' ,
125
+ '"' : '"' ,
126
+ "'" : ''' ,
127
+ '/' : '/'
128
+ } ;
128
129
129
- var HTML_ESCAPE_CHARS = / [ & < > " ' \/ ] / g;
130
+ var HTML_ESCAPE_CHARS = / [ & < > " ' \/ ] / g;
130
131
131
132
function coerceToString ( val ) {
132
133
return String ( ( val === null || val === undefined ) ? '' : val ) ;
@@ -201,7 +202,7 @@ $.TokenList = function (input, url_or_data, settings) {
201
202
//
202
203
203
204
// Configure the data source
204
- if ( $ . type ( url_or_data ) === "string" || $ . type ( url_or_data ) === "function" ) {
205
+ if ( typeof ( url_or_data ) === "string" || typeof ( url_or_data ) === "function" ) {
205
206
// Set the url to query against
206
207
$ ( input ) . data ( "settings" ) . url = url_or_data ;
207
208
@@ -235,7 +236,6 @@ $.TokenList = function (input, url_or_data, settings) {
235
236
$ ( input ) . data ( "settings" ) . classes = DEFAULT_CLASSES ;
236
237
}
237
238
238
-
239
239
// Save the tokens
240
240
var saved_tokens = [ ] ;
241
241
@@ -250,7 +250,7 @@ $.TokenList = function (input, url_or_data, settings) {
250
250
var input_val ;
251
251
252
252
// Create a new text input an attach keyup events
253
- var input_box = $ ( "<input type=\"text\" autocomplete=\"off\" autocapitalize=\"off\"/>" )
253
+ var input_box = $ ( "<input type=\"text\" autocomplete=\"off\" autocapitalize=\"off\"/>" )
254
254
. css ( {
255
255
outline : "none"
256
256
} )
@@ -284,39 +284,46 @@ $.TokenList = function (input, url_or_data, settings) {
284
284
case KEY . RIGHT :
285
285
case KEY . UP :
286
286
case KEY . DOWN :
287
- if ( ! $ ( this ) . val ( ) ) {
288
- previous_token = input_token . prev ( ) ;
289
- next_token = input_token . next ( ) ;
290
-
291
- if ( ( previous_token . length && previous_token . get ( 0 ) === selected_token ) || ( next_token . length && next_token . get ( 0 ) === selected_token ) ) {
292
- // Check if there is a previous/next token and it is selected
293
- if ( event . keyCode === KEY . LEFT || event . keyCode === KEY . UP ) {
294
- deselect_token ( $ ( selected_token ) , POSITION . BEFORE ) ;
295
- } else {
296
- deselect_token ( $ ( selected_token ) , POSITION . AFTER ) ;
297
- }
298
- } else if ( ( event . keyCode === KEY . LEFT || event . keyCode === KEY . UP ) && previous_token . length ) {
299
- // We are moving left, select the previous token if it exists
300
- select_token ( $ ( previous_token . get ( 0 ) ) ) ;
301
- } else if ( ( event . keyCode === KEY . RIGHT || event . keyCode === KEY . DOWN ) && next_token . length ) {
302
- // We are moving right, select the next token if it exists
303
- select_token ( $ ( next_token . get ( 0 ) ) ) ;
304
- }
305
- } else {
306
- var dropdown_item = null ;
287
+ if ( this . value . length === 0 ) {
288
+ previous_token = input_token . prev ( ) ;
289
+ next_token = input_token . next ( ) ;
290
+
291
+ if ( ( previous_token . length && previous_token . get ( 0 ) === selected_token ) || ( next_token . length && next_token . get ( 0 ) === selected_token ) ) {
292
+ // Check if there is a previous/next token and it is selected
293
+ if ( event . keyCode === KEY . LEFT || event . keyCode === KEY . UP ) {
294
+ deselect_token ( $ ( selected_token ) , POSITION . BEFORE ) ;
295
+ } else {
296
+ deselect_token ( $ ( selected_token ) , POSITION . AFTER ) ;
297
+ }
298
+ } else if ( ( event . keyCode === KEY . LEFT || event . keyCode === KEY . UP ) && previous_token . length ) {
299
+ // We are moving left, select the previous token if it exists
300
+ select_token ( $ ( previous_token . get ( 0 ) ) ) ;
301
+ } else if ( ( event . keyCode === KEY . RIGHT || event . keyCode === KEY . DOWN ) && next_token . length ) {
302
+ // We are moving right, select the next token if it exists
303
+ select_token ( $ ( next_token . get ( 0 ) ) ) ;
304
+ }
305
+ } else {
306
+ var dropdown_item = null ;
307
307
308
- if ( event . keyCode === KEY . DOWN || event . keyCode === KEY . RIGHT ) {
309
- dropdown_item = $ ( selected_dropdown_item ) . next ( ) ;
310
- } else {
311
- dropdown_item = $ ( selected_dropdown_item ) . prev ( ) ;
312
- }
308
+ if ( event . keyCode === KEY . DOWN || event . keyCode === KEY . RIGHT ) {
309
+ dropdown_item = $ ( dropdown ) . find ( 'li' ) . first ( ) ;
313
310
314
- if ( dropdown_item . length ) {
315
- select_dropdown_item ( dropdown_item ) ;
316
- }
311
+ if ( selected_dropdown_item ) {
312
+ dropdown_item = $ ( selected_dropdown_item ) . next ( ) ;
313
+ }
314
+ } else {
315
+ dropdown_item = $ ( dropdown ) . find ( 'li' ) . last ( ) ;
316
+
317
+ if ( selected_dropdown_item ) {
318
+ dropdown_item = $ ( selected_dropdown_item ) . prev ( ) ;
319
+ }
317
320
}
318
- return false ;
319
- break ;
321
+
322
+ select_dropdown_item ( dropdown_item ) ;
323
+ }
324
+
325
+ return false ;
326
+ break ;
320
327
321
328
case KEY . BACKSPACE :
322
329
previous_token = input_token . prev ( ) ;
@@ -377,21 +384,24 @@ $.TokenList = function (input, url_or_data, settings) {
377
384
} ) ;
378
385
379
386
// Keep reference for placeholder
380
- if ( settings . placeholder )
381
- input_box . attr ( "placeholder" , settings . placeholder )
387
+ if ( settings . placeholder ) {
388
+ input_box . attr ( "placeholder" , settings . placeholder ) ;
389
+ }
382
390
383
391
// Keep a reference to the original input box
384
392
var hidden_input = $ ( input )
385
- . hide ( )
386
- . val ( "" )
387
- . focus ( function ( ) {
388
- focus_with_timeout ( input_box ) ;
389
- } )
390
- . blur ( function ( ) {
391
- input_box . blur ( ) ;
392
- //return the object to this can be referenced in the callback functions.
393
- return hidden_input ;
394
- } ) ;
393
+ . hide ( )
394
+ . val ( "" )
395
+ . focus ( function ( ) {
396
+ focus_with_timeout ( input_box ) ;
397
+ } )
398
+ . blur ( function ( ) {
399
+ input_box . blur ( ) ;
400
+
401
+ //return the object to this can be referenced in the callback functions.
402
+ return hidden_input ;
403
+ } )
404
+ ;
395
405
396
406
// Keep a reference to the selected token and dropdown item
397
407
var selected_token = null ;
@@ -459,10 +469,12 @@ $.TokenList = function (input, url_or_data, settings) {
459
469
// Pre-populate list if items exist
460
470
hidden_input . val ( "" ) ;
461
471
var li_data = $ ( input ) . data ( "settings" ) . prePopulate || hidden_input . data ( "pre" ) ;
462
- if ( $ ( input ) . data ( "settings" ) . processPrePopulate && $ . isFunction ( $ ( input ) . data ( "settings" ) . onResult ) ) {
472
+
473
+ if ( $ ( input ) . data ( "settings" ) . processPrePopulate && $ . isFunction ( $ ( input ) . data ( "settings" ) . onResult ) ) {
463
474
li_data = $ ( input ) . data ( "settings" ) . onResult . call ( hidden_input , li_data ) ;
464
475
}
465
- if ( li_data && li_data . length ) {
476
+
477
+ if ( li_data && li_data . length ) {
466
478
$ . each ( li_data , function ( index , value ) {
467
479
insert_token ( value ) ;
468
480
checkTokenLimit ( ) ;
@@ -476,8 +488,8 @@ $.TokenList = function (input, url_or_data, settings) {
476
488
}
477
489
478
490
// Initialization is done
479
- if ( $ . isFunction ( $ ( input ) . data ( "settings" ) . onReady ) ) {
480
- $ ( input ) . data ( "settings" ) . onReady . call ( ) ;
491
+ if ( $ ( input ) . data ( "settings" ) . onReady === "function" ) {
492
+ $ ( input ) . data ( "settings" ) . onReady . call ( ) ;
481
493
}
482
494
483
495
//
@@ -894,7 +906,6 @@ $.TokenList = function (input, url_or_data, settings) {
894
906
var this_li = $ ( input ) . data ( "settings" ) . resultsFormatter ( value ) ;
895
907
896
908
this_li = find_value_and_highlight_term ( this_li , value [ $ ( input ) . data ( "settings" ) . propertyToSearch ] , query ) ;
897
-
898
909
this_li = $ ( this_li ) . appendTo ( dropdown_ul ) ;
899
910
900
911
if ( index % 2 ) {
@@ -903,7 +914,7 @@ $.TokenList = function (input, url_or_data, settings) {
903
914
this_li . addClass ( $ ( input ) . data ( "settings" ) . classes . dropdownItem2 ) ;
904
915
}
905
916
906
- if ( index === 0 ) {
917
+ if ( index === 0 && $ ( input ) . data ( "settings" ) . autoSelectFirstResult ) {
907
918
select_dropdown_item ( this_li ) ;
908
919
}
909
920
@@ -1102,5 +1113,5 @@ $.TokenList.Cache = function (options) {
1102
1113
return data [ query ] ;
1103
1114
} ;
1104
1115
} ;
1105
- } ( jQuery ) ) ;
1106
1116
1117
+ } ( jQuery ) ) ;
0 commit comments