@@ -1633,7 +1633,7 @@ $.fn.dropdown = function(parameters) {
1633
1633
. addClass ( className . selected )
1634
1634
;
1635
1635
module . set . scrollPosition ( $nextItem ) ;
1636
- if ( settings . selectOnKeydown && module . is . single ( ) ) {
1636
+ if ( settings . selectOnKeydown && module . is . single ( ) && ! $nextItem . hasClass ( className . actionable ) ) {
1637
1637
module . set . selectedItem ( $nextItem ) ;
1638
1638
}
1639
1639
}
@@ -1660,7 +1660,7 @@ $.fn.dropdown = function(parameters) {
1660
1660
. addClass ( className . selected )
1661
1661
;
1662
1662
module . set . scrollPosition ( $nextItem ) ;
1663
- if ( settings . selectOnKeydown && module . is . single ( ) ) {
1663
+ if ( settings . selectOnKeydown && module . is . single ( ) && ! $nextItem . hasClass ( className . actionable ) ) {
1664
1664
module . set . selectedItem ( $nextItem ) ;
1665
1665
}
1666
1666
}
@@ -1791,7 +1791,7 @@ $.fn.dropdown = function(parameters) {
1791
1791
;
1792
1792
if ( module . can . activate ( $ ( element ) ) ) {
1793
1793
module . set . selected ( value , $ ( element ) ) ;
1794
- if ( ! module . is . multiple ( ) ) {
1794
+ if ( ! module . is . multiple ( ) && ! ( ! settings . collapseOnActionable && $ ( element ) . hasClass ( className . actionable ) ) ) {
1795
1795
module . hideAndClear ( ) ;
1796
1796
}
1797
1797
}
@@ -1804,7 +1804,7 @@ $.fn.dropdown = function(parameters) {
1804
1804
;
1805
1805
if ( module . can . activate ( $ ( element ) ) ) {
1806
1806
module . set . value ( value , text , $ ( element ) ) ;
1807
- if ( ! module . is . multiple ( ) ) {
1807
+ if ( ! module . is . multiple ( ) && ! ( ! settings . collapseOnActionable && $ ( element ) . hasClass ( className . actionable ) ) ) {
1808
1808
module . hideAndClear ( ) ;
1809
1809
}
1810
1810
}
@@ -2428,7 +2428,7 @@ $.fn.dropdown = function(parameters) {
2428
2428
$nextSelectedItem
2429
2429
. addClass ( className . selected )
2430
2430
;
2431
- if ( settings . selectOnKeydown && module . is . single ( ) ) {
2431
+ if ( settings . selectOnKeydown && module . is . single ( ) && ! $nextItem . hasClass ( className . actionable ) ) {
2432
2432
module . set . selectedItem ( $nextSelectedItem ) ;
2433
2433
}
2434
2434
$menu
@@ -2631,7 +2631,7 @@ $.fn.dropdown = function(parameters) {
2631
2631
module . set . scrollPosition ( $nextValue ) ;
2632
2632
$selectedItem . removeClass ( className . selected ) ;
2633
2633
$nextValue . addClass ( className . selected ) ;
2634
- if ( settings . selectOnKeydown && module . is . single ( ) ) {
2634
+ if ( settings . selectOnKeydown && module . is . single ( ) && ! $nextItem . hasClass ( className . actionable ) ) {
2635
2635
module . set . selectedItem ( $nextValue ) ;
2636
2636
}
2637
2637
}
@@ -2769,17 +2769,24 @@ $.fn.dropdown = function(parameters) {
2769
2769
2770
2770
isFiltered = $selected . hasClass ( className . filtered ) ,
2771
2771
isActive = $selected . hasClass ( className . active ) ,
2772
+ isActionable = $selected . hasClass ( className . actionable ) ,
2772
2773
isUserValue = $selected . hasClass ( className . addition ) ,
2773
2774
shouldAnimate = ( isMultiple && $selectedItem . length == 1 )
2774
2775
;
2775
- if ( isMultiple ) {
2776
+ if ( isActionable ) {
2777
+ if ( ( ! isMultiple || ( ! isActive || isUserValue ) ) && settings . apiSettings && settings . saveRemoteData ) {
2778
+ module . save . remoteData ( selectedText , selectedValue ) ;
2779
+ }
2780
+ settings . onActionable . call ( element , selectedValue , selectedText , $selected ) ;
2781
+ }
2782
+ else if ( isMultiple ) {
2776
2783
if ( ! isActive || isUserValue ) {
2777
2784
if ( settings . apiSettings && settings . saveRemoteData ) {
2778
2785
module . save . remoteData ( selectedText , selectedValue ) ;
2779
2786
}
2780
2787
if ( settings . useLabels ) {
2781
- module . add . label ( selectedValue , selectedText , shouldAnimate ) ;
2782
2788
module . add . value ( selectedValue , selectedText , $selected ) ;
2789
+ module . add . label ( selectedValue , selectedText , shouldAnimate ) ;
2783
2790
module . set . activeItem ( $selected ) ;
2784
2791
module . filterActive ( ) ;
2785
2792
module . select . nextAvailable ( $selectedItem ) ;
@@ -2799,7 +2806,7 @@ $.fn.dropdown = function(parameters) {
2799
2806
if ( settings . apiSettings && settings . saveRemoteData ) {
2800
2807
module . save . remoteData ( selectedText , selectedValue ) ;
2801
2808
}
2802
- if ( ! keepSearchTerm ) {
2809
+ if ( ! keepSearchTerm && ! $selected . hasClass ( className . actionable ) ) {
2803
2810
module . set . text ( selectedText ) ;
2804
2811
}
2805
2812
module . set . value ( selectedValue , selectedText , $selected , preventChangeTrigger ) ;
@@ -2989,7 +2996,7 @@ $.fn.dropdown = function(parameters) {
2989
2996
}
2990
2997
// extend current array
2991
2998
if ( Array . isArray ( currentValue ) ) {
2992
- newValue = currentValue . concat ( [ addedValue ] ) ;
2999
+ newValue = $selectedItem . hasClass ( className . actionable ) ? currentValue : currentValue . concat ( [ addedValue ] ) ;
2993
3000
newValue = module . get . uniqueArray ( newValue ) ;
2994
3001
}
2995
3002
else {
@@ -4020,6 +4027,8 @@ $.fn.dropdown.settings = {
4020
4027
4021
4028
headerDivider : true , // whether option headers should have an additional divider line underneath when converted from <select> <optgroup>
4022
4029
4030
+ collapseOnActionable : true , // whether the dropdown should collapse upon selection of an actionable item
4031
+
4023
4032
// label settings on multi-select
4024
4033
label : {
4025
4034
transition : 'scale' ,
@@ -4039,6 +4048,7 @@ $.fn.dropdown.settings = {
4039
4048
onChange : function ( value , text , $selected ) { } ,
4040
4049
onAdd : function ( value , text , $selected ) { } ,
4041
4050
onRemove : function ( value , text , $selected ) { } ,
4051
+ onActionable : function ( value , text , $selected ) { } ,
4042
4052
onSearch : function ( searchTerm ) { } ,
4043
4053
4044
4054
onLabelSelect : function ( $selectedLabels ) { } ,
@@ -4101,7 +4111,8 @@ $.fn.dropdown.settings = {
4101
4111
icon : 'icon' , // optional icon name
4102
4112
iconClass : 'iconClass' , // optional individual class for icon (for example to use flag instead)
4103
4113
class : 'class' , // optional individual class for item/header
4104
- divider : 'divider' // optional divider append for group headers
4114
+ divider : 'divider' , // optional divider append for group headers
4115
+ actionable : 'actionable' // optional actionable item
4105
4116
} ,
4106
4117
4107
4118
keys : {
@@ -4173,7 +4184,8 @@ $.fn.dropdown.settings = {
4173
4184
header : 'header' ,
4174
4185
divider : 'divider' ,
4175
4186
groupIcon : '' ,
4176
- unfilterable : 'unfilterable'
4187
+ unfilterable : 'unfilterable' ,
4188
+ actionable : 'actionable'
4177
4189
}
4178
4190
4179
4191
} ;
@@ -4248,6 +4260,9 @@ $.fn.dropdown.settings.templates = {
4248
4260
maybeText = ( option [ fields . text ] )
4249
4261
? ' data-text="' + deQuote ( option [ fields . text ] , true ) + '"'
4250
4262
: '' ,
4263
+ maybeActionable = ( option [ fields . actionable ] )
4264
+ ? className . actionable + ' '
4265
+ : '' ,
4251
4266
maybeDisabled = ( option [ fields . disabled ] )
4252
4267
? className . disabled + ' '
4253
4268
: '' ,
@@ -4256,7 +4271,7 @@ $.fn.dropdown.settings.templates = {
4256
4271
: '' ,
4257
4272
hasDescription = ( escape ( option [ fields . description ] || '' , preserveHTML ) != '' )
4258
4273
;
4259
- html += '<div class="' + maybeDisabled + maybeDescriptionVertical + ( option [ fields . class ] ? deQuote ( option [ fields . class ] ) : className . item ) + '" data-value="' + deQuote ( option [ fields . value ] , true ) + '"' + maybeText + '>' ;
4274
+ html += '<div class="' + maybeActionable + maybeDisabled + maybeDescriptionVertical + ( option [ fields . class ] ? deQuote ( option [ fields . class ] ) : className . item ) + '" data-value="' + deQuote ( option [ fields . value ] , true ) + '"' + maybeText + '>' ;
4260
4275
if ( isMenu ) {
4261
4276
html += '<i class="' + ( itemType . indexOf ( 'left' ) !== - 1 ? 'left' : '' ) + ' dropdown icon"></i>' ;
4262
4277
}
0 commit comments