Skip to content

Commit 19bb9f1

Browse files
feat(dropdown): onActionable callback
The intention of this PR is to add a new onActionable callback to allow the possibility of providing a way of having a way of performing actions when an actionable item has been selected
1 parent 74808e1 commit 19bb9f1

File tree

1 file changed

+28
-13
lines changed

1 file changed

+28
-13
lines changed

src/definitions/modules/dropdown.js

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1633,7 +1633,7 @@ $.fn.dropdown = function(parameters) {
16331633
.addClass(className.selected)
16341634
;
16351635
module.set.scrollPosition($nextItem);
1636-
if(settings.selectOnKeydown && module.is.single()) {
1636+
if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
16371637
module.set.selectedItem($nextItem);
16381638
}
16391639
}
@@ -1660,7 +1660,7 @@ $.fn.dropdown = function(parameters) {
16601660
.addClass(className.selected)
16611661
;
16621662
module.set.scrollPosition($nextItem);
1663-
if(settings.selectOnKeydown && module.is.single()) {
1663+
if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
16641664
module.set.selectedItem($nextItem);
16651665
}
16661666
}
@@ -1791,7 +1791,7 @@ $.fn.dropdown = function(parameters) {
17911791
;
17921792
if( module.can.activate( $(element) ) ) {
17931793
module.set.selected(value, $(element));
1794-
if(!module.is.multiple()) {
1794+
if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
17951795
module.hideAndClear();
17961796
}
17971797
}
@@ -1804,7 +1804,7 @@ $.fn.dropdown = function(parameters) {
18041804
;
18051805
if( module.can.activate( $(element) ) ) {
18061806
module.set.value(value, text, $(element));
1807-
if(!module.is.multiple()) {
1807+
if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
18081808
module.hideAndClear();
18091809
}
18101810
}
@@ -2428,7 +2428,7 @@ $.fn.dropdown = function(parameters) {
24282428
$nextSelectedItem
24292429
.addClass(className.selected)
24302430
;
2431-
if(settings.selectOnKeydown && module.is.single()) {
2431+
if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
24322432
module.set.selectedItem($nextSelectedItem);
24332433
}
24342434
$menu
@@ -2631,7 +2631,7 @@ $.fn.dropdown = function(parameters) {
26312631
module.set.scrollPosition($nextValue);
26322632
$selectedItem.removeClass(className.selected);
26332633
$nextValue.addClass(className.selected);
2634-
if(settings.selectOnKeydown && module.is.single()) {
2634+
if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
26352635
module.set.selectedItem($nextValue);
26362636
}
26372637
}
@@ -2769,17 +2769,24 @@ $.fn.dropdown = function(parameters) {
27692769

27702770
isFiltered = $selected.hasClass(className.filtered),
27712771
isActive = $selected.hasClass(className.active),
2772+
isActionable = $selected.hasClass(className.actionable),
27722773
isUserValue = $selected.hasClass(className.addition),
27732774
shouldAnimate = (isMultiple && $selectedItem.length == 1)
27742775
;
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) {
27762783
if(!isActive || isUserValue) {
27772784
if(settings.apiSettings && settings.saveRemoteData) {
27782785
module.save.remoteData(selectedText, selectedValue);
27792786
}
27802787
if(settings.useLabels) {
2781-
module.add.label(selectedValue, selectedText, shouldAnimate);
27822788
module.add.value(selectedValue, selectedText, $selected);
2789+
module.add.label(selectedValue, selectedText, shouldAnimate);
27832790
module.set.activeItem($selected);
27842791
module.filterActive();
27852792
module.select.nextAvailable($selectedItem);
@@ -2799,7 +2806,7 @@ $.fn.dropdown = function(parameters) {
27992806
if(settings.apiSettings && settings.saveRemoteData) {
28002807
module.save.remoteData(selectedText, selectedValue);
28012808
}
2802-
if (!keepSearchTerm) {
2809+
if (!keepSearchTerm && !$selected.hasClass(className.actionable)) {
28032810
module.set.text(selectedText);
28042811
}
28052812
module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);
@@ -2989,7 +2996,7 @@ $.fn.dropdown = function(parameters) {
29892996
}
29902997
// extend current array
29912998
if(Array.isArray(currentValue)) {
2992-
newValue = currentValue.concat([addedValue]);
2999+
newValue = $selectedItem.hasClass(className.actionable) ? currentValue : currentValue.concat([addedValue]);
29933000
newValue = module.get.uniqueArray(newValue);
29943001
}
29953002
else {
@@ -4020,6 +4027,8 @@ $.fn.dropdown.settings = {
40204027

40214028
headerDivider : true, // whether option headers should have an additional divider line underneath when converted from <select> <optgroup>
40224029

4030+
collapseOnActionable : true, // whether the dropdown should collapse upon selection of an actionable item
4031+
40234032
// label settings on multi-select
40244033
label: {
40254034
transition : 'scale',
@@ -4039,6 +4048,7 @@ $.fn.dropdown.settings = {
40394048
onChange : function(value, text, $selected){},
40404049
onAdd : function(value, text, $selected){},
40414050
onRemove : function(value, text, $selected){},
4051+
onActionable : function(value, text, $selected){},
40424052
onSearch : function(searchTerm){},
40434053

40444054
onLabelSelect : function($selectedLabels){},
@@ -4101,7 +4111,8 @@ $.fn.dropdown.settings = {
41014111
icon : 'icon', // optional icon name
41024112
iconClass : 'iconClass', // optional individual class for icon (for example to use flag instead)
41034113
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
41054116
},
41064117

41074118
keys : {
@@ -4173,7 +4184,8 @@ $.fn.dropdown.settings = {
41734184
header : 'header',
41744185
divider : 'divider',
41754186
groupIcon : '',
4176-
unfilterable : 'unfilterable'
4187+
unfilterable : 'unfilterable',
4188+
actionable : 'actionable'
41774189
}
41784190

41794191
};
@@ -4248,6 +4260,9 @@ $.fn.dropdown.settings.templates = {
42484260
maybeText = (option[fields.text])
42494261
? ' data-text="' + deQuote(option[fields.text],true) + '"'
42504262
: '',
4263+
maybeActionable = (option[fields.actionable])
4264+
? className.actionable+' '
4265+
: '',
42514266
maybeDisabled = (option[fields.disabled])
42524267
? className.disabled+' '
42534268
: '',
@@ -4256,7 +4271,7 @@ $.fn.dropdown.settings.templates = {
42564271
: '',
42574272
hasDescription = (escape(option[fields.description] || '', preserveHTML) != '')
42584273
;
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 + '>';
42604275
if (isMenu) {
42614276
html += '<i class="'+ (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>';
42624277
}

0 commit comments

Comments
 (0)