How to remove selected option from the option list in select2 multiselect and show selected options in the order they are selected
Part #1 of Q:
You can do a CSS trick to hide selected item
like this:
.select2-results__option[aria-selected=true] {
display: none;
}
Part #2 of Q:
Also you can do a JQuery trick to force selected items
to end of tags box, ( by getting selected item on select, detach it (remove it), then reAppend it to tags box, then call "change function" to apply changes ):
$("select").on("select2:select", function (evt) {
var element = evt.params.data.element;
var $element = $(element);
$element.detach();
$(this).append($element);
$(this).trigger("change");
});
Finally Updated JsFiddle, I hope it works for you, Thanks !
Edit #1
You can Clear All Selected
by this call (apply Null values):
$("#dynamicAttributes").val(null).trigger("change");
on Button:
$('#btnReset').click(function() {
$("#dynamicAttributes").val(null).trigger("change");
});
Updated Fiddle #2
I find a way to make the selected values not to appear anymore on the selection pop up list
On the documentation you can they have list of events Select2 events
open
I make use of these select2 event open to hide the selected values
Here is the javascript ::
$(document).ready(function() {
$('#dynamicAttributes').select2({
allowClear: true,
minimumResultsForSearch: -1,
width: 600
});
// override the select2 open event
$('#dynamicAttributes').on('select2:open', function () {
// get values of selected option
var values = $(this).val();
// get the pop up selection
var pop_up_selection = $('.select2-results__options');
if (values != null ) {
// hide the selected values
pop_up_selection.find("li[aria-selected=true]").hide();
} else {
// show all the selection values
pop_up_selection.find("li[aria-selected=true]").show();
}
});
});
Here is a DEMO
Hope it helps.
my solution was modified the select2.js (the core, version 4.0.3) in the line #3158. Add the following verification :
if ($option[0].selected == true) {
return;
}
With this verification, we can exclude from the dropdown list, the selected ones. And if you write the name of a selected option, appear the text of option "noResult" .
Here the complete code:
SelectAdapter.prototype.query = function (params, callback) {
var data = [];
var self = this;
var $options = this.$element.children();
$options.each(function () {
var $option = $(this);
if (!$option.is('option') && !$option.is('optgroup') ) {
return;
}
if ($option[0].selected == true) {
return;
}
var option = self.item($option);
var matches = self.matches(params, option);
if (matches !== null) {
data.push(matches);
}
});
callback({
results: data
});
};