@@ -19,6 +19,8 @@ var DEFAULT_SETTINGS = {
1919 propertyToSearch : "name" ,
2020 jsonContainer : null ,
2121 contentType : "json" ,
22+ excludeCurrent : false ,
23+ excludeCurrentParameter : "x" ,
2224
2325 // Prepopulation settings
2426 prePopulate : null ,
@@ -839,8 +841,37 @@ $.TokenList = function (input, url_or_data, settings) {
839841 return template . replace ( new RegExp ( "(?![^&;]+;)(?!<[^<>]*)(" + regexp_escape ( value ) + ")(?![^<>]*>)(?![^&;]+;)" , "g" ) , highlight_term ( value , term ) ) ;
840842 }
841843
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+
842870 // Populate the results dropdown with some results
843871 function populate_dropdown ( query , results ) {
872+ // exclude current tokens if configured
873+ results = excludeCurrent ( results ) ;
874+
844875 if ( results && results . length ) {
845876 dropdown . empty ( ) ;
846877 var dropdown_ul = $ ( "<ul/>" )
@@ -939,7 +970,7 @@ $.TokenList = function (input, url_or_data, settings) {
939970 function run_search ( query ) {
940971 var cache_key = query + computeURL ( ) ;
941972 var cached_results = cache . get ( cache_key ) ;
942- if ( cached_results ) {
973+ if ( cached_results ) {
943974 if ( $ . isFunction ( $ ( input ) . data ( "settings" ) . onCachedResult ) ) {
944975 cached_results = $ ( input ) . data ( "settings" ) . onCachedResult . call ( hidden_input , cached_results ) ;
945976 }
@@ -948,7 +979,7 @@ $.TokenList = function (input, url_or_data, settings) {
948979 // Are we doing an ajax search or local data search?
949980 if ( $ ( input ) . data ( "settings" ) . url ) {
950981 var url = computeURL ( ) ;
951- // Extract exisiting get params
982+ // Extract existing get params
952983 var ajax_params = { } ;
953984 ajax_params . data = { } ;
954985 if ( url . indexOf ( "?" ) > - 1 ) {
@@ -968,10 +999,24 @@ $.TokenList = function (input, url_or_data, settings) {
968999 ajax_params . data [ $ ( input ) . data ( "settings" ) . queryParam ] = query ;
9691000 ajax_params . type = $ ( input ) . data ( "settings" ) . method ;
9701001 ajax_params . dataType = $ ( input ) . data ( "settings" ) . contentType ;
971- if ( $ ( input ) . data ( "settings" ) . crossDomain ) {
1002+ if ( $ ( input ) . data ( "settings" ) . crossDomain ) {
9721003 ajax_params . dataType = "jsonp" ;
9731004 }
9741005
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+
9751020 // Attach the success callback
9761021 ajax_params . success = function ( results ) {
9771022 cache . add ( cache_key , $ ( input ) . data ( "settings" ) . jsonContainer ? results [ $ ( input ) . data ( "settings" ) . jsonContainer ] : results ) ;
0 commit comments