@@ -19,6 +19,8 @@ var DEFAULT_SETTINGS = {
19
19
propertyToSearch : "name" ,
20
20
jsonContainer : null ,
21
21
contentType : "json" ,
22
+ excludeCurrent : false ,
23
+ excludeCurrentParameter : "x" ,
22
24
23
25
// Prepopulation settings
24
26
prePopulate : null ,
@@ -839,8 +841,37 @@ $.TokenList = function (input, url_or_data, settings) {
839
841
return template . replace ( new RegExp ( "(?![^&;]+;)(?!<[^<>]*)(" + regexp_escape ( value ) + ")(?![^<>]*>)(?![^&;]+;)" , "g" ) , highlight_term ( value , term ) ) ;
840
842
}
841
843
844
+ // exclude existing tokens from dropdown, so the list is clearer
845
+ function excludeCurrent ( results ) {
846
+ if ( $ ( input ) . data ( "settings" ) . excludeCurrent ) {
847
+ var currentTokens = $ ( input ) . data ( "tokenInputObject" ) . getTokens ( ) ,
848
+ trimmedList = [ ] ;
849
+ if ( currentTokens . length ) {
850
+ $ . each ( results , function ( index , value ) {
851
+ var notFound = true ;
852
+ $ . each ( currentTokens , function ( cIndex , cValue ) {
853
+ if ( value [ $ ( input ) . data ( "settings" ) . propertyToSearch ] == cValue [ $ ( input ) . data ( "settings" ) . propertyToSearch ] ) {
854
+ notFound = false ;
855
+ return false ;
856
+ }
857
+ } ) ;
858
+
859
+ if ( notFound ) {
860
+ trimmedList . push ( value ) ;
861
+ }
862
+ } ) ;
863
+ results = trimmedList ;
864
+ }
865
+ }
866
+
867
+ return results ;
868
+ }
869
+
842
870
// Populate the results dropdown with some results
843
871
function populate_dropdown ( query , results ) {
872
+ // exclude current tokens if configured
873
+ results = excludeCurrent ( results ) ;
874
+
844
875
if ( results && results . length ) {
845
876
dropdown . empty ( ) ;
846
877
var dropdown_ul = $ ( "<ul/>" )
@@ -939,7 +970,7 @@ $.TokenList = function (input, url_or_data, settings) {
939
970
function run_search ( query ) {
940
971
var cache_key = query + computeURL ( ) ;
941
972
var cached_results = cache . get ( cache_key ) ;
942
- if ( cached_results ) {
973
+ if ( cached_results ) {
943
974
if ( $ . isFunction ( $ ( input ) . data ( "settings" ) . onCachedResult ) ) {
944
975
cached_results = $ ( input ) . data ( "settings" ) . onCachedResult . call ( hidden_input , cached_results ) ;
945
976
}
@@ -948,7 +979,7 @@ $.TokenList = function (input, url_or_data, settings) {
948
979
// Are we doing an ajax search or local data search?
949
980
if ( $ ( input ) . data ( "settings" ) . url ) {
950
981
var url = computeURL ( ) ;
951
- // Extract exisiting get params
982
+ // Extract existing get params
952
983
var ajax_params = { } ;
953
984
ajax_params . data = { } ;
954
985
if ( url . indexOf ( "?" ) > - 1 ) {
@@ -968,10 +999,24 @@ $.TokenList = function (input, url_or_data, settings) {
968
999
ajax_params . data [ $ ( input ) . data ( "settings" ) . queryParam ] = query ;
969
1000
ajax_params . type = $ ( input ) . data ( "settings" ) . method ;
970
1001
ajax_params . dataType = $ ( input ) . data ( "settings" ) . contentType ;
971
- if ( $ ( input ) . data ( "settings" ) . crossDomain ) {
1002
+ if ( $ ( input ) . data ( "settings" ) . crossDomain ) {
972
1003
ajax_params . dataType = "jsonp" ;
973
1004
}
974
1005
1006
+ // exclude current tokens?
1007
+ // send exclude list to the server, so it can also exclude existing tokens
1008
+ if ( $ ( input ) . data ( "settings" ) . excludeCurrent ) {
1009
+ var currentTokens = $ ( input ) . data ( "tokenInputObject" ) . getTokens ( ) ;
1010
+ var tokenList = $ . map ( currentTokens , function ( el ) {
1011
+ if ( typeof $ ( input ) . data ( "settings" ) . tokenValue == 'function' )
1012
+ return $ ( input ) . data ( "settings" ) . tokenValue . call ( this , el ) ;
1013
+
1014
+ return el [ $ ( input ) . data ( "settings" ) . tokenValue ] ;
1015
+ } ) ;
1016
+
1017
+ ajax_params . data [ $ ( input ) . data ( "settings" ) . excludeCurrentParameter ] = tokenList . join ( $ ( input ) . data ( "settings" ) . tokenDelimiter ) ;
1018
+ }
1019
+
975
1020
// Attach the success callback
976
1021
ajax_params . success = function ( results ) {
977
1022
cache . add ( cache_key , $ ( input ) . data ( "settings" ) . jsonContainer ? results [ $ ( input ) . data ( "settings" ) . jsonContainer ] : results ) ;
0 commit comments