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, },