assets/javascripts/semantic_ui/definitions/modules/dropdown.js in less-rails-semantic_ui-2.0.2.0 vs assets/javascripts/semantic_ui/definitions/modules/dropdown.js in less-rails-semantic_ui-2.0.5.0
- old
+ new
@@ -307,19 +307,23 @@
.addClass(className.selection)
.addClass(className.dropdown)
.html( templates.dropdown(selectValues) )
.insertBefore($input)
;
+ if($input.hasClass(className.multiple) && $input.prop('multiple') === false) {
+ module.error(error.missingMultiple);
+ $input.prop('multiple', true);
+ }
+ if($input.is('[multiple]')) {
+ module.set.multiple();
+ }
$input
.removeAttr('class')
.detach()
.prependTo($module)
;
}
- if($input.is('[multiple]')) {
- module.set.multiple();
- }
module.refresh();
},
menu: function(values) {
$menu.html( templates.menu( values ));
$item = $menu.find(selector.item);
@@ -1447,12 +1451,12 @@
value = module.get.value()
;
if(value === '') {
return '';
}
- return (!$input.is('select') && module.is.multiple())
- ? typeof value == 'string'
+ return ( !module.has.selectInput() && module.is.multiple() )
+ ? (typeof value == 'string') // delimited string
? value.split(settings.delimiter)
: ''
: value
;
},
@@ -2088,10 +2092,16 @@
module.verbose('Skipping value update already same value', value, currentValue);
if(!module.is.initialLoad()) {
return;
}
}
+
+ if( module.is.single() && module.has.selectInput() && module.can.extendSelect() ) {
+ module.debug('Adding user option', value);
+ module.add.optionValue(value);
+ }
+
module.debug('Updating input value', value, currentValue);
$input
.val(value)
.trigger('change')
;
@@ -2258,12 +2268,17 @@
// temporarily disconnect observer
if(selectObserver) {
selectObserver.disconnect();
module.verbose('Temporarily disconnecting mutation observer', value);
}
+ if( module.is.single() ) {
+ module.verbose('Removing previous user addition');
+ $input.find('option.' + className.addition).remove();
+ }
$('<option/>')
.prop('value', value)
+ .addClass(className.addition)
.html(value)
.appendTo($input)
;
module.verbose('Adding user addition as an <option>', value);
if(selectObserver) {
@@ -2340,23 +2355,23 @@
;
if(addedValue === '') {
module.debug('Cannot select blank values from multiselect');
return;
}
- // extend currently array
+ // extend current array
if($.isArray(currentValue)) {
newValue = currentValue.concat([addedValue]);
newValue = module.get.uniqueArray(newValue);
}
else {
newValue = [addedValue];
}
// add values
- if( $input.is('select')) {
- if(settings.allowAdditions) {
- module.add.optionValue(addedValue);
+ if( module.has.selectInput() ) {
+ if(module.can.extendSelect()) {
module.debug('Adding value to select', addedValue, newValue, $input);
+ module.add.optionValue(addedValue);
}
}
else {
newValue = newValue.join(settings.delimiter);
module.debug('Setting hidden input to delimited value', newValue, $input);
@@ -2405,10 +2420,32 @@
}
else {
$item.removeClass(className.filtered);
}
},
+ optionValue: function(value) {
+ var
+ $option = $input.find('option[value="' + value + '"]'),
+ hasOption = ($option.length > 0)
+ ;
+ if(!hasOption || !$option.hasClass(className.addition)) {
+ return;
+ }
+ // temporarily disconnect observer
+ if(selectObserver) {
+ selectObserver.disconnect();
+ module.verbose('Temporarily disconnecting mutation observer', value);
+ }
+ $option.remove();
+ module.verbose('Removing user addition as an <option>', value);
+ if(selectObserver) {
+ selectObserver.observe($input[0], {
+ childList : true,
+ subtree : true
+ });
+ }
+ },
message: function() {
$menu.children(selector.message).remove();
},
searchTerm: function() {
module.verbose('Cleared search term');
@@ -2458,20 +2495,20 @@
selectedItem: function() {
$item.removeClass(className.selected);
},
value: function(removedValue, removedText, $removedItem) {
var
- values = $input.val(),
+ values = module.get.values(),
newValue
;
- if( $input.is('select') ) {
+ if( module.has.selectInput() ) {
module.verbose('Input is <select> removing selected option', removedValue);
newValue = module.remove.arrayValue(removedValue, values);
+ module.remove.optionValue(removedValue);
}
else {
module.verbose('Removing from delimited values', removedValue);
- values = values.split(settings.delimiter);
newValue = module.remove.arrayValue(removedValue, values);
newValue = newValue.join(settings.delimiter);
}
if(settings.fireOnInit === false && module.is.initialLoad()) {
module.verbose('No callback on initial load', settings.onRemove);
@@ -2481,10 +2518,13 @@
}
module.set.value(newValue, removedText, $removedItem);
module.check.maxSelections();
},
arrayValue: function(removedValue, values) {
+ if( !$.isArray(values) ) {
+ values = [values];
+ }
values = $.grep(values, function(value){
return (removedValue != value);
});
module.verbose('Removed value from delimited string', removedValue, values);
return values;
@@ -2559,10 +2599,13 @@
has: {
search: function() {
return ($search.length > 0);
},
+ selectInput: function() {
+ return ( $input.is('select') );
+ },
firstLetter: function($item, letter) {
var
text,
firstLetter
;
@@ -2712,11 +2755,11 @@
},
search: function() {
return $module.hasClass(className.search);
},
searchSelection: function() {
- return ( module.has.search() && $search.closest(selector.menu).length === 0 );
+ return ( module.has.search() && $search.parent(selector.dropdown).length === 1 );
},
selection: function() {
return $module.hasClass(className.selection);
},
userValue: function(value) {
@@ -2736,10 +2779,13 @@
can: {
click: function() {
return (hasTouch || settings.on == 'click');
},
+ extendSelect: function() {
+ return settings.allowAdditions || settings.apiSettings;
+ },
show: function() {
return !module.is.disabled() && (module.has.items() || module.has.message());
},
useAPI: function() {
return $.fn.api !== undefined;
@@ -3139,16 +3185,17 @@
noResults : 'No results found.',
serverError : 'There was an error contacting the server'
},
error : {
- action : 'You called a dropdown action that was not defined',
- alreadySetup : 'Once a select has been initialized behaviors must be called on the created ui dropdown',
- labels : 'Allowing user additions currently requires the use of labels.',
- method : 'The method you called is not defined.',
- noAPI : 'The API module is required to load resources remotely',
- noStorage : 'Saving remote data requires session storage',
- noTransition : 'This module requires ui transitions <https://github.com/Semantic-Org/UI-Transition>'
+ action : 'You called a dropdown action that was not defined',
+ alreadySetup : 'Once a select has been initialized behaviors must be called on the created ui dropdown',
+ labels : 'Allowing user additions currently requires the use of labels.',
+ missingMultiple : '<select> requires multiple property to be set to correctly preserve multiple values',
+ method : 'The method you called is not defined.',
+ noAPI : 'The API module is required to load resources remotely',
+ noStorage : 'Saving remote data requires session storage',
+ noTransition : 'This module requires ui transitions <https://github.com/Semantic-Org/UI-Transition>'
},
regExp : {
escape : /[-[\]{}()*+?.,\\^$|#\s]/g,
},