@@ -461,6 +461,10 @@ $.fn.dropdown = function(parameters) {
461461 ? callback
462462 : function ( ) { }
463463 ;
464+ if ( ! module . can . show ( ) && module . is . remote ( ) ) {
465+ module . debug ( 'No API results retrieved, searching before show' ) ;
466+ module . queryRemote ( module . get . query ( ) , module . show ) ;
467+ }
464468 if ( module . can . show ( ) && ! module . is . active ( ) ) {
465469 module . debug ( 'Showing dropdown' ) ;
466470 if ( module . has . message ( ) && ! ( module . has . maxSelections ( ) || module . has . allResultsFiltered ( ) ) ) {
@@ -617,8 +621,17 @@ $.fn.dropdown = function(parameters) {
617621 . on ( 'mousedown' + eventNamespace , module . event . mousedown )
618622 . on ( 'mouseup' + eventNamespace , module . event . mouseup )
619623 . on ( 'focus' + eventNamespace , module . event . focus )
620- . on ( 'blur' + eventNamespace , module . event . blur )
621624 ;
625+ if ( module . has . menuSearch ( ) ) {
626+ $module
627+ . on ( 'blur' + eventNamespace , selector . search , module . event . search . blur )
628+ ;
629+ }
630+ else {
631+ $module
632+ . on ( 'blur' + eventNamespace , module . event . blur )
633+ ;
634+ }
622635 }
623636 $menu
624637 . on ( 'mouseenter' + eventNamespace , selector . item , module . event . item . mouseenter )
@@ -702,6 +715,9 @@ $.fn.dropdown = function(parameters) {
702715 if ( settings . apiSettings ) {
703716 if ( module . can . useAPI ( ) ) {
704717 module . queryRemote ( searchTerm , function ( ) {
718+ if ( settings . filterRemoteData ) {
719+ module . filterItems ( searchTerm ) ;
720+ }
705721 afterFiltered ( ) ;
706722 } ) ;
707723 }
@@ -757,7 +773,7 @@ $.fn.dropdown = function(parameters) {
757773 ? query
758774 : module . get . query ( ) ,
759775 results = null ,
760- escapedTerm = module . escape . regExp ( searchTerm ) ,
776+ escapedTerm = module . escape . string ( searchTerm ) ,
761777 beginsWithRegExp = new RegExp ( '^' + escapedTerm , 'igm' )
762778 ;
763779 // avoid loop if we're matching nothing
@@ -789,12 +805,15 @@ $.fn.dropdown = function(parameters) {
789805 }
790806 if ( settings . match == 'both' || settings . match == 'value' ) {
791807 value = String ( module . get . choiceValue ( $choice , text ) ) ;
792-
793808 if ( value . search ( beginsWithRegExp ) !== - 1 ) {
794809 results . push ( this ) ;
795810 return true ;
796811 }
797- else if ( settings . fullTextSearch && module . fuzzySearch ( searchTerm , value ) ) {
812+ else if ( settings . fullTextSearch === 'exact' && module . exactSearch ( searchTerm , value ) ) {
813+ results . push ( this ) ;
814+ return true ;
815+ }
816+ else if ( settings . fullTextSearch === true && module . fuzzySearch ( searchTerm , value ) ) {
798817 results . push ( this ) ;
799818 return true ;
800819 }
@@ -876,7 +895,7 @@ $.fn.dropdown = function(parameters) {
876895 : $activeItem ,
877896 hasSelected = ( $selectedItem . length > 0 )
878897 ;
879- if ( hasSelected ) {
898+ if ( hasSelected && ! module . is . multiple ( ) ) {
880899 module . debug ( 'Forcing partial selection to selected item' , $selectedItem ) ;
881900 module . event . item . click . call ( $selectedItem , { } , true ) ;
882901 return ;
@@ -2183,7 +2202,7 @@ $.fn.dropdown = function(parameters) {
21832202 $text . addClass ( className . placeholder ) ;
21842203 } ,
21852204 tabbable : function ( ) {
2186- if ( module . has . search ( ) ) {
2205+ if ( module . is . searchSelection ( ) ) {
21872206 module . debug ( 'Added tabindex to searchable dropdown' ) ;
21882207 $search
21892208 . val ( '' )
@@ -2295,12 +2314,13 @@ $.fn.dropdown = function(parameters) {
22952314 } ,
22962315 selectedItem : function ( $item ) {
22972316 var
2298- value = module . get . choiceValue ( $item ) ,
2299- text = module . get . choiceText ( $item , false )
2317+ value = module . get . choiceValue ( $item ) ,
2318+ searchText = module . get . choiceText ( $item , false ) ,
2319+ text = module . get . choiceText ( $item , true )
23002320 ;
23012321 module . debug ( 'Setting user selection to item' , $item ) ;
23022322 module . remove . activeItem ( ) ;
2303- module . set . partialSearch ( text ) ;
2323+ module . set . partialSearch ( searchText ) ;
23042324 module . set . activeItem ( $item ) ;
23052325 module . set . selected ( value , $item ) ;
23062326 module . set . text ( text ) ;
@@ -2509,7 +2529,7 @@ $.fn.dropdown = function(parameters) {
25092529 ;
25102530 $label = $ ( '<a />' )
25112531 . addClass ( className . label )
2512- . attr ( 'data-value' , escapedValue )
2532+ . attr ( 'data-' + metadata . value , escapedValue )
25132533 . html ( templates . label ( escapedValue , text ) )
25142534 ;
25152535 $label = settings . onLabelCreate . call ( $label , escapedValue , text ) ;
@@ -2557,7 +2577,7 @@ $.fn.dropdown = function(parameters) {
25572577 optionValue : function ( value ) {
25582578 var
25592579 escapedValue = module . escape . value ( value ) ,
2560- $option = $input . find ( 'option[value="' + escapedValue + '"]' ) ,
2580+ $option = $input . find ( 'option[value="' + module . escape . string ( escapedValue ) + '"]' ) ,
25612581 hasOption = ( $option . length > 0 )
25622582 ;
25632583 if ( hasOption ) {
@@ -2730,7 +2750,7 @@ $.fn.dropdown = function(parameters) {
27302750 optionValue : function ( value ) {
27312751 var
27322752 escapedValue = module . escape . value ( value ) ,
2733- $option = $input . find ( 'option[value="' + escapedValue + '"]' ) ,
2753+ $option = $input . find ( 'option[value="' + module . escape . string ( escapedValue ) + '"]' ) ,
27342754 hasOption = ( $option . length > 0 )
27352755 ;
27362756 if ( ! hasOption || ! $option . hasClass ( className . addition ) ) {
@@ -2849,7 +2869,7 @@ $.fn.dropdown = function(parameters) {
28492869 label : function ( value , shouldAnimate ) {
28502870 var
28512871 $labels = $module . find ( selector . label ) ,
2852- $removedLabel = $labels . filter ( '[data-value="' + value + '"]' )
2872+ $removedLabel = $labels . filter ( '[data-' + metadata . value + ' ="' + module . escape . string ( value ) + '"]' )
28532873 ;
28542874 module . verbose ( 'Removing label' , $removedLabel ) ;
28552875 $removedLabel . remove ( ) ;
@@ -2889,7 +2909,7 @@ $.fn.dropdown = function(parameters) {
28892909 ;
28902910 } ,
28912911 tabbable : function ( ) {
2892- if ( module . has . search ( ) ) {
2912+ if ( module . is . searchSelection ( ) ) {
28932913 module . debug ( 'Searchable dropdown initialized' ) ;
28942914 $search
28952915 . removeAttr ( 'tabindex' )
@@ -2963,7 +2983,7 @@ $.fn.dropdown = function(parameters) {
29632983 escapedValue = module . escape . value ( value ) ,
29642984 $labels = $module . find ( selector . label )
29652985 ;
2966- return ( $labels . filter ( '[data-value="' + escapedValue + '"]' ) . length > 0 ) ;
2986+ return ( $labels . filter ( '[data-' + metadata . value + ' ="' + module . escape . string ( escapedValue ) + '"]' ) . length > 0 ) ;
29672987 } ,
29682988 maxSelections : function ( ) {
29692989 return ( settings . maxSelections && module . get . selectionCount ( ) >= settings . maxSelections ) ;
@@ -3083,6 +3103,9 @@ $.fn.dropdown = function(parameters) {
30833103 multiple : function ( ) {
30843104 return $module . hasClass ( className . multiple ) ;
30853105 } ,
3106+ remote : function ( ) {
3107+ return settings . apiSettings && module . can . useAPI ( ) ;
3108+ } ,
30863109 single : function ( ) {
30873110 return ! module . is . multiple ( ) ;
30883111 } ,
@@ -3288,7 +3311,7 @@ $.fn.dropdown = function(parameters) {
32883311 hasQuotes = ( stringValue && value . search ( regExp . quote ) !== - 1 ) ,
32893312 values = [ ]
32903313 ;
3291- if ( ! module . has . selectInput ( ) || isUnparsable || ! hasQuotes ) {
3314+ if ( isUnparsable || ! hasQuotes ) {
32923315 return value ;
32933316 }
32943317 module . debug ( 'Encoding quote values for use in select' , value ) ;
@@ -3300,7 +3323,7 @@ $.fn.dropdown = function(parameters) {
33003323 }
33013324 return value . replace ( regExp . quote , '"' ) ;
33023325 } ,
3303- regExp : function ( text ) {
3326+ string : function ( text ) {
33043327 text = String ( text ) ;
33053328 return text . replace ( regExp . escape , '\\$&' ) ;
33063329 }
@@ -3503,7 +3526,10 @@ $.fn.dropdown.settings = {
35033526 apiSettings : false ,
35043527 selectOnKeydown : true , // Whether selection should occur automatically when keyboard shortcuts used
35053528 minCharacters : 0 , // Minimum characters required to trigger API call
3529+
3530+ filterRemoteData : false , // Whether API results should be filtered after being returned for query term
35063531 saveRemoteData : true , // Whether remote name/value pairs should be stored in sessionStorage to allow remote data to be restored on page refresh
3532+
35073533 throttle : 200 , // How long to wait after last user input to search remotely
35083534
35093535 context : window , // Context to use when determining if on screen
0 commit comments