Boostrap multi select

by Malin Jayakody

HTML

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/css/bootstrap-select.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/js/bootstrap-select.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<select class="selectpicker show-tick" multiple data-action-box="true">
  <option value="101">Level 1</option>
  <option value="1012">Level 2</option>
  <option value="10121">Level 3</option>
  <option value="10122">Level 3</option>
  <option value="10123">Level 3</option>
  <option value="10124">Level 3</option>
  <option value="1013">Level 2</option>
  <option value="1014">Level 2</option>
  <option value="1015">Level 2</option>
  <option value="102">Level 1</option>
  <option value="1022">Level 2</option>
  <option value="1023">Level 2</option>
  <option value="1024">Level 2</option>
  <option value="1025">Level 2</option>
</select>

JavaScript

jQuery(function($) {
  $('.selectpicker').selectpicker().on('changed.bs.select', function(e, index, selected, oldValue) {
    var arr = $(this).selectpicker('val'),
      selectedOption = $(this).find('option').eq(index).attr('value'),
      linkedOptions = $(this).find('option[value^="' + selectedOption + '"]').not('[value="' + selectedOption + '"]');

    if (selected) {
      linkedOptions.each(function(i, el) {
        arr.push($(el).attr('value'));
      });
    } else {
      linkedOptions.each(function(i, el) {
        var index = arr.indexOf($(el).attr('value'));
        if (index != -1) {
          arr.splice(index, 1);
        }
      });
    }
    $(this).selectpicker('val', arr);
  });
});