diff --git a/dist/js/bootstrap-multiselect.js b/dist/js/bootstrap-multiselect.js index 9a50a18a..38be7fa2 100644 --- a/dist/js/bootstrap-multiselect.js +++ b/dist/js/bootstrap-multiselect.js @@ -48,7 +48,7 @@ ko.bindingHandlers.multiselect = { after: ['options', 'value', 'selectedOptions', 'enable', 'disable'], - init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { + init: function (element, valueAccessor, allBindings, viewModel, bindingContext) { var $element = $(element); var config = ko.toJS(valueAccessor()); @@ -58,9 +58,9 @@ var options = allBindings.get('options'); if (ko.isObservable(options)) { ko.computed({ - read: function() { + read: function () { options(); - setTimeout(function() { + setTimeout(function () { var ms = $element.data('multiselect'); if (ms) ms.updateOriginalOptions();//Not sure how beneficial this is. @@ -79,9 +79,9 @@ var value = allBindings.get('value'); if (ko.isObservable(value)) { ko.computed({ - read: function() { + read: function () { value(); - setTimeout(function() { + setTimeout(function () { $element.multiselect('refresh'); }, 1); }, @@ -96,9 +96,9 @@ var selectedOptions = allBindings.get('selectedOptions'); if (ko.isObservable(selectedOptions)) { ko.computed({ - read: function() { + read: function () { selectedOptions(); - setTimeout(function() { + setTimeout(function () { $element.multiselect('refresh'); }, 1); }, @@ -144,12 +144,12 @@ } } - ko.utils.domNodeDisposal.addDisposeCallback(element, function() { + ko.utils.domNodeDisposal.addDisposeCallback(element, function () { $element.multiselect('destroy'); }); }, - update: function(element, valueAccessor, allBindings, viewModel, bindingContext) { + update: function (element, valueAccessor, allBindings, viewModel, bindingContext) { var $element = $(element); var config = ko.toJS(valueAccessor()); @@ -236,9 +236,9 @@ * @param {jQuery} select * @returns {String} */ - buttonText: function(options, select) { + buttonText: function (options, select) { if (this.disabledText.length > 0 - && (select.prop('disabled') || (options.length == 0 && this.disableIfEmpty))) { + && (select.prop('disabled') || (options.length == 0 && this.disableIfEmpty))) { return this.disabledText; } @@ -264,7 +264,7 @@ var selected = ''; var delimiter = this.delimiterText; - options.each(function() { + options.each(function () { var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text(); selected += label + delimiter; }); @@ -279,7 +279,7 @@ * @param {jQuery} select * @returns {@exp;selected@call;substr} */ - buttonTitle: function(options, select) { + buttonTitle: function (options, select) { if (options.length === 0) { return this.nonSelectedText; } @@ -294,7 +294,7 @@ return selected.substr(0, selected.length - this.delimiterText.length); } }, - checkboxName: function(option) { + checkboxName: function (option) { return false; // no checkbox name }, /** @@ -303,7 +303,7 @@ * @param {jQuery} element * @returns {String} */ - optionLabel: function(element){ + optionLabel: function (element) { return $(element).attr('label') || $(element).text(); }, /** @@ -312,7 +312,7 @@ * @param {jQuery} element * @returns {String} */ - optionClass: function(element) { + optionClass: function (element) { return $(element).attr('class') || ''; }, /** @@ -323,7 +323,7 @@ * @param {jQuery} option * @param {Boolean} checked */ - onChange : function(option, checked) { + onChange: function (option, checked) { }, /** @@ -331,7 +331,7 @@ * * @param {jQuery} event */ - onDropdownShow: function(event) { + onDropdownShow: function (event) { }, /** @@ -339,7 +339,7 @@ * * @param {jQuery} event */ - onDropdownHide: function(event) { + onDropdownHide: function (event) { }, /** @@ -347,7 +347,7 @@ * * @param {jQuery} event */ - onDropdownShown: function(event) { + onDropdownShown: function (event) { }, /** @@ -355,19 +355,19 @@ * * @param {jQuery} event */ - onDropdownHidden: function(event) { + onDropdownHidden: function (event) { }, /** * Triggered on select all. */ - onSelectAll: function() { + onSelectAll: function () { }, /** * Triggered on deselect all. */ - onDeselectAll: function() { + onDeselectAll: function () { }, /** @@ -376,7 +376,7 @@ * @param {jQuery} $select * @param {jQuery} $container */ - onInitialized: function($select, $container) { + onInitialized: function ($select, $container) { }, /** @@ -384,7 +384,7 @@ * * @param {jQuery} $filter */ - onFiltering: function($filter) { + onFiltering: function ($filter) { }, enableHTML: false, @@ -438,7 +438,7 @@ /** * Builds the container of the multiselect. */ - buildContainer: function() { + buildContainer: function () { this.$container = $(this.options.buttonContainer); this.$container.on('show.bs.dropdown', this.options.onDropdownShow); this.$container.on('hide.bs.dropdown', this.options.onDropdownHide); @@ -449,7 +449,7 @@ /** * Builds the button of the multiselect. */ - buildButton: function() { + buildButton: function () { this.$button = $(this.options.templates.button).addClass(this.options.buttonClass); if (this.$select.attr('class') && this.options.inheritClass) { this.$button.addClass(this.$select.attr('class')); @@ -465,9 +465,9 @@ // Manually add button width if set. if (this.options.buttonWidth && this.options.buttonWidth !== 'auto') { this.$button.css({ - 'width' : '100%', //this.options.buttonWidth, - 'overflow' : 'hidden', - 'text-overflow' : 'ellipsis' + 'width': '100%', //this.options.buttonWidth, + 'overflow': 'hidden', + 'text-overflow': 'ellipsis' }); this.$container.css({ 'width': this.options.buttonWidth @@ -486,7 +486,7 @@ /** * Builds the ul representing the dropdown menu. */ - buildDropdown: function() { + buildDropdown: function () { // Build ul. this.$ul = $(this.options.templates.ul); @@ -507,7 +507,7 @@ if (this.options.dropUp) { - var height = Math.min(this.options.maxHeight, $('option[data-role!="divider"]', this.$select).length*26 + $('option[data-role="divider"]', this.$select).length*19 + (this.options.includeSelectAllOption ? 26 : 0) + (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering ? 44 : 0)); + var height = Math.min(this.options.maxHeight, $('option[data-role!="divider"]', this.$select).length * 26 + $('option[data-role="divider"]', this.$select).length * 19 + (this.options.includeSelectAllOption ? 26 : 0) + (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering ? 44 : 0)); var moveCalc = height + 34; this.$ul.css({ @@ -526,9 +526,9 @@ * * Uses createDivider and createOptionValue to create the necessary options. */ - buildDropdownOptions: function() { + buildDropdownOptions: function () { - this.$select.children().each($.proxy(function(index, element) { + this.$select.children().each($.proxy(function (index, element) { var $element = $(element); // Support optgroups and options without a group simultaneously. @@ -557,13 +557,13 @@ }, this)); // Bind the change event on the dropdown elements. - $('li:not(.multiselect-group) input', this.$ul).on('change', $.proxy(function(event) { + $('li:not(.multiselect-group) input', this.$ul).on('change', $.proxy(function (event) { var $target = $(event.target); var checked = $target.prop('checked') || false; var isSelectAllOption = $target.val() === this.options.selectAllValue; - // Apply or unapply the configured selected class. + // uApply or unapply the configured selected class. if (this.options.selectedClass) { if (checked) { $target.closest('li') @@ -635,25 +635,25 @@ this.$select.change(); this.updateButtonText(); - if(this.options.preventInputChangeEvent) { + if (this.options.preventInputChangeEvent) { return false; } }, this)); - $('li a', this.$ul).on('mousedown', function(e) { + $('li a', this.$ul).on('mousedown', function (e) { if (e.shiftKey) { // Prevent selecting text by Shift+click return false; } }); - $('li a', this.$ul).on('touchstart click', $.proxy(function(event) { + $('li a', this.$ul).on('touchstart click', $.proxy(function (event) { event.stopPropagation(); var $target = $(event.target); if (event.shiftKey && this.options.multiple) { - if($target.is("label")){ // Handles checkbox selection manually (see https://github.com/davidstutz/bootstrap-multiselect/issues/431) + if ($target.is("label")) { // Handles checkbox selection manually (see https://github.com/davidstutz/bootstrap-multiselect/issues/431) event.preventDefault(); $target = $target.find("input"); $target.prop("checked", !$target.prop("checked")); @@ -697,7 +697,7 @@ } // Remembers last clicked option - if($target.is("input") && !$target.closest("li").is(".multiselect-item")){ + if ($target.is("input") && !$target.closest("li").is(".multiselect-item")) { this.lastToggledInput = $target; } @@ -705,7 +705,7 @@ }, this)); // Keyboard support. - this.$container.off('keydown.multiselect').on('keydown.multiselect', $.proxy(function(event) { + this.$container.off('keydown.multiselect').on('keydown.multiselect', $.proxy(function (event) { if ($('input[type="text"]', this.$container).is(':focus')) { return; } @@ -726,7 +726,7 @@ if (event.keyCode === 38 && index > 0) { index--; } - // Navigate down. + // Navigate down. else if (event.keyCode === 40 && index < $items.length - 1) { index++; } @@ -750,7 +750,7 @@ }, this)); if (this.options.enableClickableOptGroups && this.options.multiple) { - $("li.multiselect-group input", this.$ul).on("change", $.proxy(function(event) { + $("li.multiselect-group input", this.$ul).on("change", $.proxy(function (event) { event.stopPropagation(); var $target = $(event.target); @@ -775,7 +775,7 @@ } } - $.each($inputs, $.proxy(function(index, input) { + $.each($inputs, $.proxy(function (index, input) { var value = $(input).val(); var $option = this.getOptionByValue(value); @@ -807,23 +807,27 @@ } if (this.options.enableCollapsibleOptGroups && this.options.multiple) { - $("li.multiselect-group .caret-container", this.$ul).on("click", $.proxy(function(event) { + $("li.multiselect-group .caret-container", this.$ul).on("click", $.proxy(function (event) { var $li = $(event.target).closest('li'); var $inputs = $li.nextUntil("li.multiselect-group") .not('.multiselect-filter-hidden'); + var $dropupplaceholder = $li.find("span.dropup-placeholder"); + var visible = true; - $inputs.each(function() { + $inputs.each(function () { visible = visible && $(this).is(':visible'); }); if (visible) { $inputs.hide() .addClass('multiselect-collapsible-hidden'); + $dropupplaceholder.addClass("dropup"); } else { $inputs.show() .removeClass('multiselect-collapsible-hidden'); + $dropupplaceholder.removeClass("dropup"); } }, this)); @@ -838,7 +842,7 @@ * * @param {jQuery} element */ - createOptionValue: function(element) { + createOptionValue: function (element) { var $element = $(element); if ($element.is(':selected')) { $element.prop('selected', true); @@ -906,7 +910,7 @@ * * @param {jQuery} element */ - createDivider: function(element) { + createDivider: function (element) { var $divider = $(this.options.templates.divider); this.$ul.append($divider); }, @@ -916,7 +920,7 @@ * * @param {jQuery} group */ - createOptgroup: function(group) { + createOptgroup: function (group) { var label = $(group).attr("label"); var value = $(group).attr("value"); var $li = $('
  • '); @@ -932,7 +936,7 @@ } if (this.options.enableCollapsibleOptGroups && this.options.multiple) { - $('a', $li).append(''); + $('a', $li).append(''); } if (this.options.enableClickableOptGroups && this.options.multiple) { @@ -945,7 +949,7 @@ this.$ul.append($li); - $("option", group).each($.proxy(function($, group) { + $("option", group).each($.proxy(function ($, group) { this.createOptionValue(group); }, this)) }, @@ -955,7 +959,7 @@ * * Checks if a select all has already been created. */ - buildSelectAll: function() { + buildSelectAll: function () { if (typeof this.options.selectAllValue === 'number') { this.options.selectAllValue = this.options.selectAllValue.toString(); } @@ -1003,7 +1007,7 @@ /** * Builds the filter. */ - buildFilter: function() { + buildFilter: function () { // Build filter if filtering OR case insensitive filtering is enabled and the number of options exceeds (or equals) enableFilterLength. if (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering) { @@ -1015,9 +1019,9 @@ $('input', this.$filter).attr('placeholder', this.options.filterPlaceholder); // Adds optional filter clear button - if(this.options.includeFilterClearBtn) { + if (this.options.includeFilterClearBtn) { var clearBtn = $(this.options.templates.filterClearBtn); - clearBtn.on('click', $.proxy(function(event){ + clearBtn.on('click', $.proxy(function (event) { clearTimeout(this.searchTimeout); this.$filter.find('.multiselect-search').val(''); @@ -1035,24 +1039,24 @@ this.$ul.prepend(this.$filter); - this.$filter.val(this.query).on('click', function(event) { + this.$filter.val(this.query).on('click', function (event) { event.stopPropagation(); - }).on('input keydown', $.proxy(function(event) { + }).on('input keydown', $.proxy(function (event) { // Cancel enter key default behaviour if (event.which === 13) { - event.preventDefault(); - } + event.preventDefault(); + } // This is useful to catch "keydown" events after the browser has updated the control. clearTimeout(this.searchTimeout); - this.searchTimeout = this.asyncFunction($.proxy(function() { + this.searchTimeout = this.asyncFunction($.proxy(function () { if (this.query !== event.target.value) { this.query = event.target.value; var currentGroup, currentGroupVisible; - $.each($('li', this.$ul), $.proxy(function(index, element) { + $.each($('li', this.$ul), $.proxy(function (index, element) { var value = $('input', element).length > 0 ? $('input', element).val() : ""; var text = $('label', element).text(); @@ -1132,7 +1136,7 @@ /** * Unbinds the whole plugin. */ - destroy: function() { + destroy: function () { this.$container.remove(); this.$select.show(); @@ -1205,8 +1209,8 @@ * @param {Array} selectValues * @param {Boolean} triggerOnChange */ - select: function(selectValues, triggerOnChange) { - if(!$.isArray(selectValues)) { + select: function (selectValues, triggerOnChange) { + if (!$.isArray(selectValues)) { selectValues = [selectValues]; } @@ -1220,7 +1224,7 @@ var $option = this.getOptionByValue(value); var $checkbox = this.getInputByValue(value); - if($option === undefined || $checkbox === undefined) { + if ($option === undefined || $checkbox === undefined) { continue; } @@ -1271,8 +1275,8 @@ * @param {Array} deselectValues * @param {Boolean} triggerOnChange */ - deselect: function(deselectValues, triggerOnChange) { - if(!$.isArray(deselectValues)) { + deselect: function (deselectValues, triggerOnChange) { + if (!$.isArray(deselectValues)) { deselectValues = [deselectValues]; } @@ -1286,7 +1290,7 @@ var $option = this.getOptionByValue(value); var $checkbox = this.getInputByValue(value); - if($option === undefined || $checkbox === undefined) { + if ($option === undefined || $checkbox === undefined) { continue; } @@ -1325,21 +1329,21 @@ var allLis = $("li:not(.divider):not(.disabled):not(.multiselect-group)", this.$ul); var visibleLis = $("li:not(.divider):not(.disabled):not(.multiselect-group):not(.multiselect-filter-hidden):not(.multiselect-collapisble-hidden)", this.$ul).filter(':visible'); - if(justVisible) { - $('input:enabled' , visibleLis).prop('checked', true); + if (justVisible) { + $('input:enabled', visibleLis).prop('checked', true); visibleLis.addClass(this.options.selectedClass); - $('input:enabled' , visibleLis).each($.proxy(function(index, element) { + $('input:enabled', visibleLis).each($.proxy(function (index, element) { var value = $(element).val(); var option = this.getOptionByValue(value); $(option).prop('selected', true); }, this)); } else { - $('input:enabled' , allLis).prop('checked', true); + $('input:enabled', allLis).prop('checked', true); allLis.addClass(this.options.selectedClass); - $('input:enabled' , allLis).each($.proxy(function(index, element) { + $('input:enabled', allLis).each($.proxy(function (index, element) { var value = $(element).val(); var option = this.getOptionByValue(value); $(option).prop('selected', true); @@ -1370,21 +1374,21 @@ var allLis = $("li:not(.divider):not(.disabled):not(.multiselect-group)", this.$ul); var visibleLis = $("li:not(.divider):not(.disabled):not(.multiselect-group):not(.multiselect-filter-hidden):not(.multiselect-collapisble-hidden)", this.$ul).filter(':visible'); - if(justVisible) { - $('input[type="checkbox"]:enabled' , visibleLis).prop('checked', false); + if (justVisible) { + $('input[type="checkbox"]:enabled', visibleLis).prop('checked', false); visibleLis.removeClass(this.options.selectedClass); - $('input[type="checkbox"]:enabled' , visibleLis).each($.proxy(function(index, element) { + $('input[type="checkbox"]:enabled', visibleLis).each($.proxy(function (index, element) { var value = $(element).val(); var option = this.getOptionByValue(value); $(option).prop('selected', false); }, this)); } else { - $('input[type="checkbox"]:enabled' , allLis).prop('checked', false); + $('input[type="checkbox"]:enabled', allLis).prop('checked', false); allLis.removeClass(this.options.selectedClass); - $('input[type="checkbox"]:enabled' , allLis).each($.proxy(function(index, element) { + $('input[type="checkbox"]:enabled', allLis).each($.proxy(function (index, element) { var value = $(element).val(); var option = this.getOptionByValue(value); $(option).prop('selected', false); @@ -1407,7 +1411,7 @@ * * Rebuilds the dropdown, the filter and the select all option. */ - rebuild: function() { + rebuild: function () { this.$ul.html(''); // Important to distinguish between radios and checkboxes. @@ -1439,7 +1443,7 @@ /** * The provided data will be used to build the dropdown. */ - dataprovider: function(dataprovider) { + dataprovider: function (dataprovider) { var groupCounter = 0; var $select = this.$select.empty(); @@ -1455,7 +1459,7 @@ disabled: !!option.disabled }); - forEach(option.children, function(subOption) { // add children option tags + forEach(option.children, function (subOption) { // add children option tags var attributes = { value: subOption.value, label: subOption.label || subOption.value, @@ -1465,10 +1469,10 @@ }; //Loop through attributes object and add key-value for each attribute - for (var key in subOption.attributes) { + for (var key in subOption.attributes) { attributes['data-' + key] = subOption.attributes[key]; - } - //Append original attributes + new data attributes to option + } + //Append original attributes + new data attributes to option $tag.append($('