summaryrefslogtreecommitdiff
path: root/build/resources/main/static/plugins/bootstrap4-duallistbox
diff options
context:
space:
mode:
Diffstat (limited to 'build/resources/main/static/plugins/bootstrap4-duallistbox')
-rw-r--r--build/resources/main/static/plugins/bootstrap4-duallistbox/bootstrap-duallistbox.css87
-rw-r--r--build/resources/main/static/plugins/bootstrap4-duallistbox/bootstrap-duallistbox.min.css1
-rw-r--r--build/resources/main/static/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.js893
-rw-r--r--build/resources/main/static/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.min.js10
4 files changed, 991 insertions, 0 deletions
diff --git a/build/resources/main/static/plugins/bootstrap4-duallistbox/bootstrap-duallistbox.css b/build/resources/main/static/plugins/bootstrap4-duallistbox/bootstrap-duallistbox.css
new file mode 100644
index 0000000..596831a
--- /dev/null
+++ b/build/resources/main/static/plugins/bootstrap4-duallistbox/bootstrap-duallistbox.css
@@ -0,0 +1,87 @@
+/*
+ * Bootstrap Duallistbox - v4.0.2
+ * A responsive dual listbox widget optimized for Twitter Bootstrap. It works on all modern browsers and on touch devices.
+ * http://www.virtuosoft.eu/code/bootstrap-duallistbox/
+ *
+ * Made by István Ujj-Mészáros
+ * Under Apache License v2.0 License
+ */
+.bootstrap-duallistbox-container .buttons {
+ width: 100%;
+ margin-bottom: -1px;
+}
+
+.bootstrap-duallistbox-container label {
+ display: block;
+}
+
+.bootstrap-duallistbox-container .info {
+ display: inline-block;
+ margin-bottom: 5px;
+ font-size: 11px;
+}
+
+.bootstrap-duallistbox-container .clear1,
+.bootstrap-duallistbox-container .clear2 {
+ display: none;
+ font-size: 10px;
+}
+
+.bootstrap-duallistbox-container .box1.filtered .clear1,
+.bootstrap-duallistbox-container .box2.filtered .clear2 {
+ display: inline-block;
+}
+
+.bootstrap-duallistbox-container .move,
+.bootstrap-duallistbox-container .remove {
+ width: 50%;
+ box-sizing: content-box;
+}
+
+.bootstrap-duallistbox-container .btn-group .btn {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.bootstrap-duallistbox-container:not(.moveonselect) select {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.bootstrap-duallistbox-container .moveall,
+.bootstrap-duallistbox-container .removeall {
+ width: 50%;
+ box-sizing: content-box;
+}
+
+.bootstrap-duallistbox-container.bs2compatible .btn-group > .btn + .btn {
+ margin-left: 0;
+}
+
+.bootstrap-duallistbox-container select {
+ width: 100%;
+ height: 300px;
+ padding: 0;
+}
+
+.bootstrap-duallistbox-container .filter {
+ display: inline-block;
+ width: 100%;
+ height: 31px;
+ margin: 0 0 5px 0;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.bootstrap-duallistbox-container .filter.placeholder {
+ color: #aaa;
+}
+
+.bootstrap-duallistbox-container.moveonselect .move,
+.bootstrap-duallistbox-container.moveonselect .remove {
+ display:none;
+}
+
+.bootstrap-duallistbox-container.moveonselect .moveall,
+.bootstrap-duallistbox-container.moveonselect .removeall {
+ width: 100%;
+}
diff --git a/build/resources/main/static/plugins/bootstrap4-duallistbox/bootstrap-duallistbox.min.css b/build/resources/main/static/plugins/bootstrap4-duallistbox/bootstrap-duallistbox.min.css
new file mode 100644
index 0000000..c957314
--- /dev/null
+++ b/build/resources/main/static/plugins/bootstrap4-duallistbox/bootstrap-duallistbox.min.css
@@ -0,0 +1 @@
+.bootstrap-duallistbox-container .buttons{width:100%;margin-bottom:-1px}.bootstrap-duallistbox-container label{display:block}.bootstrap-duallistbox-container .info{display:inline-block;margin-bottom:5px;font-size:11px}.bootstrap-duallistbox-container .clear1,.bootstrap-duallistbox-container .clear2{display:none;font-size:10px}.bootstrap-duallistbox-container .box1.filtered .clear1,.bootstrap-duallistbox-container .box2.filtered .clear2{display:inline-block}.bootstrap-duallistbox-container .move,.bootstrap-duallistbox-container .remove{width:50%;box-sizing:content-box}.bootstrap-duallistbox-container .btn-group .btn{border-bottom-left-radius:0;border-bottom-right-radius:0}.bootstrap-duallistbox-container:not(.moveonselect) select{border-top-left-radius:0;border-top-right-radius:0}.bootstrap-duallistbox-container .moveall,.bootstrap-duallistbox-container .removeall{width:50%;box-sizing:content-box}.bootstrap-duallistbox-container.bs2compatible .btn-group>.btn+.btn{margin-left:0}.bootstrap-duallistbox-container select{width:100%;height:300px;padding:0}.bootstrap-duallistbox-container .filter{display:inline-block;width:100%;height:31px;margin:0 0 5px 0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-duallistbox-container .filter.placeholder{color:#aaa}.bootstrap-duallistbox-container.moveonselect .move,.bootstrap-duallistbox-container.moveonselect .remove{display:none}.bootstrap-duallistbox-container.moveonselect .moveall,.bootstrap-duallistbox-container.moveonselect .removeall{width:100%} \ No newline at end of file
diff --git a/build/resources/main/static/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.js b/build/resources/main/static/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.js
new file mode 100644
index 0000000..4862ec3
--- /dev/null
+++ b/build/resources/main/static/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.js
@@ -0,0 +1,893 @@
+/*
+ * Bootstrap Duallistbox - v4.0.2
+ * A responsive dual listbox widget optimized for Twitter Bootstrap. It works on all modern browsers and on touch devices.
+ * http://www.virtuosoft.eu/code/bootstrap-duallistbox/
+ *
+ * Made by István Ujj-Mészáros
+ * Under Apache License v2.0 License
+ */
+(function(factory) {
+ if (typeof define === 'function' && define.amd) {
+ define(['jquery'], factory);
+ } else if (typeof module === 'object' && module.exports) {
+ module.exports = function(root, jQuery) {
+ if (jQuery === undefined) {
+ if (typeof window !== 'undefined') {
+ jQuery = require('jquery');
+ }
+ else {
+ jQuery = require('jquery')(root);
+ }
+ }
+ factory(jQuery);
+ return jQuery;
+ };
+ } else {
+ factory(jQuery);
+ }
+}(function($) {
+ // Create the defaults once
+ var pluginName = 'bootstrapDualListbox',
+ defaults = {
+ filterTextClear: 'show all',
+ filterPlaceHolder: 'Filter',
+ moveSelectedLabel: 'Move selected',
+ moveAllLabel: 'Move all',
+ removeSelectedLabel: 'Remove selected',
+ removeAllLabel: 'Remove all',
+ moveOnSelect: true, // true/false (forced true on androids, see the comment later)
+ moveOnDoubleClick: true, // true/false (forced false on androids, cause moveOnSelect is forced to true)
+ preserveSelectionOnMove: false, // 'all' / 'moved' / false
+ selectedListLabel: false, // 'string', false
+ nonSelectedListLabel: false, // 'string', false
+ helperSelectNamePostfix: '_helper', // 'string_of_postfix' / false
+ selectorMinimalHeight: 100,
+ showFilterInputs: true, // whether to show filter inputs
+ nonSelectedFilter: '', // string, filter the non selected options
+ selectedFilter: '', // string, filter the selected options
+ infoText: 'Showing all {0}', // text when all options are visible / false for no info text
+ infoTextFiltered: '<span class="badge badge-warning">Filtered</span> {0} from {1}', // when not all of the options are visible due to the filter
+ infoTextEmpty: 'Empty list', // when there are no options present in the list
+ filterOnValues: false, // filter by selector's values, boolean
+ sortByInputOrder: false,
+ eventMoveOverride: false, // boolean, allows user to unbind default event behaviour and run their own instead
+ eventMoveAllOverride: false, // boolean, allows user to unbind default event behaviour and run their own instead
+ eventRemoveOverride: false, // boolean, allows user to unbind default event behaviour and run their own instead
+ eventRemoveAllOverride: false, // boolean, allows user to unbind default event behaviour and run their own instead
+ btnClass: 'btn-outline-secondary', // sets the button style class for all the buttons
+ btnMoveText: '&gt;', // string, sets the text for the "Move" button
+ btnRemoveText: '&lt;', // string, sets the text for the "Remove" button
+ btnMoveAllText: '&gt;&gt;', // string, sets the text for the "Move All" button
+ btnRemoveAllText: '&lt;&lt;' // string, sets the text for the "Remove All" button
+ },
+ // Selections are invisible on android if the containing select is styled with CSS
+ // http://code.google.com/p/android/issues/detail?id=16922
+ isBuggyAndroid = /android/i.test(navigator.userAgent.toLowerCase());
+
+ // The actual plugin constructor
+ function BootstrapDualListbox(element, options) {
+ this.element = $(element);
+ // jQuery has an extend method which merges the contents of two or
+ // more objects, storing the result in the first object. The first object
+ // is generally empty as we don't want to alter the default options for
+ // future instances of the plugin
+ this.settings = $.extend({}, defaults, options);
+ this._defaults = defaults;
+ this._name = pluginName;
+ this.init();
+ }
+
+ function triggerChangeEvent(dualListbox) {
+ dualListbox.element.trigger('change');
+ }
+
+ function updateSelectionStates(dualListbox) {
+ dualListbox.element.find('option').each(function(index, item) {
+ var $item = $(item);
+ if (typeof($item.data('original-index')) === 'undefined') {
+ $item.data('original-index', dualListbox.elementCount++);
+ }
+ if (typeof($item.data('_selected')) === 'undefined') {
+ $item.data('_selected', false);
+ }
+ });
+ }
+
+ function changeSelectionState(dualListbox, original_index, selected) {
+ dualListbox.element.find('option').each(function(index, item) {
+ var $item = $(item);
+ if ($item.data('original-index') === original_index) {
+ $item.prop('selected', selected);
+ if(selected){
+ $item.attr('data-sortindex', dualListbox.sortIndex);
+ dualListbox.sortIndex++;
+ } else {
+ $item.removeAttr('data-sortindex');
+ }
+ }
+ });
+ }
+
+ function formatString(s, args) {
+ console.log(s, args);
+ return s.replace(/{(\d+)}/g, function(match, number) {
+ return typeof args[number] !== 'undefined' ? args[number] : match;
+ });
+ }
+
+ function refreshInfo(dualListbox) {
+ if (!dualListbox.settings.infoText) {
+ return;
+ }
+
+ var visible1 = dualListbox.elements.select1.find('option').length,
+ visible2 = dualListbox.elements.select2.find('option').length,
+ all1 = dualListbox.element.find('option').length - dualListbox.selectedElements,
+ all2 = dualListbox.selectedElements,
+ content = '';
+
+ if (all1 === 0) {
+ content = dualListbox.settings.infoTextEmpty;
+ } else if (visible1 === all1) {
+ content = formatString(dualListbox.settings.infoText, [visible1, all1]);
+ } else {
+ content = formatString(dualListbox.settings.infoTextFiltered, [visible1, all1]);
+ }
+
+ dualListbox.elements.info1.html(content);
+ dualListbox.elements.box1.toggleClass('filtered', !(visible1 === all1 || all1 === 0));
+
+ if (all2 === 0) {
+ content = dualListbox.settings.infoTextEmpty;
+ } else if (visible2 === all2) {
+ content = formatString(dualListbox.settings.infoText, [visible2, all2]);
+ } else {
+ content = formatString(dualListbox.settings.infoTextFiltered, [visible2, all2]);
+ }
+
+ dualListbox.elements.info2.html(content);
+ dualListbox.elements.box2.toggleClass('filtered', !(visible2 === all2 || all2 === 0));
+ }
+
+ function refreshSelects(dualListbox) {
+ dualListbox.selectedElements = 0;
+
+ dualListbox.elements.select1.empty();
+ dualListbox.elements.select2.empty();
+
+ dualListbox.element.find('option').each(function(index, item) {
+ var $item = $(item);
+ if ($item.prop('selected')) {
+ dualListbox.selectedElements++;
+ dualListbox.elements.select2.append($item.clone(true).prop('selected', $item.data('_selected')));
+ } else {
+ dualListbox.elements.select1.append($item.clone(true).prop('selected', $item.data('_selected')));
+ }
+ });
+
+ if (dualListbox.settings.showFilterInputs) {
+ filter(dualListbox, 1);
+ filter(dualListbox, 2);
+ }
+ refreshInfo(dualListbox);
+ }
+
+ function filter(dualListbox, selectIndex) {
+ if (!dualListbox.settings.showFilterInputs) {
+ return;
+ }
+
+ saveSelections(dualListbox, selectIndex);
+
+ dualListbox.elements['select'+selectIndex].empty().scrollTop(0);
+ var regex,
+ allOptions = dualListbox.element.find('option'),
+ options = dualListbox.element;
+
+ if (selectIndex === 1) {
+ options = allOptions.not(':selected');
+ } else {
+ options = options.find('option:selected');
+ }
+
+ try {
+ regex = new RegExp($.trim(dualListbox.elements['filterInput'+selectIndex].val()), 'gi');
+ }
+ catch(e) {
+ // a regex to match nothing
+ regex = new RegExp('/a^/', 'gi');
+ }
+
+ options.each(function(index, item) {
+ var $item = $(item),
+ isFiltered = true;
+ if (item.text.match(regex) || (dualListbox.settings.filterOnValues && $item.attr('value').match(regex) ) ) {
+ isFiltered = false;
+ dualListbox.elements['select'+selectIndex].append($item.clone(true).prop('selected', $item.data('_selected')));
+ }
+ allOptions.eq($item.data('original-index')).data('filtered'+selectIndex, isFiltered);
+ });
+
+ refreshInfo(dualListbox);
+ }
+
+ function saveSelections(dualListbox, selectIndex) {
+ var options = dualListbox.element.find('option');
+ dualListbox.elements['select'+selectIndex].find('option').each(function(index, item) {
+ var $item = $(item);
+ options.eq($item.data('original-index')).data('_selected', $item.prop('selected'));
+ });
+ }
+
+ function sortOptionsByInputOrder(select){
+ var selectopt = select.children('option');
+
+ selectopt.sort(function(a,b){
+ var an = parseInt(a.getAttribute('data-sortindex')),
+ bn = parseInt(b.getAttribute('data-sortindex'));
+
+ if(an > bn) {
+ return 1;
+ }
+ if(an < bn) {
+ return -1;
+ }
+ return 0;
+ });
+
+ selectopt.detach().appendTo(select);
+ }
+
+ function sortOptions(select, dualListbox) {
+ select.find('option').sort(function(a, b) {
+ return ($(a).data('original-index') > $(b).data('original-index')) ? 1 : -1;
+ }).appendTo(select);
+
+ // workaround for chromium bug: https://bugs.chromium.org/p/chromium/issues/detail?id=1072475
+ refreshSelects(dualListbox);
+ }
+
+ function clearSelections(dualListbox) {
+ dualListbox.elements.select1.find('option').each(function() {
+ dualListbox.element.find('option').data('_selected', false);
+ });
+ }
+
+ function move(dualListbox) {
+ if (dualListbox.settings.preserveSelectionOnMove === 'all' && !dualListbox.settings.moveOnSelect) {
+ saveSelections(dualListbox, 1);
+ saveSelections(dualListbox, 2);
+ } else if (dualListbox.settings.preserveSelectionOnMove === 'moved' && !dualListbox.settings.moveOnSelect) {
+ saveSelections(dualListbox, 1);
+ }
+
+ dualListbox.elements.select1.find('option:selected').each(function(index, item) {
+ var $item = $(item);
+ if (!$item.data('filtered1')) {
+ changeSelectionState(dualListbox, $item.data('original-index'), true);
+ }
+ });
+
+ refreshSelects(dualListbox);
+ triggerChangeEvent(dualListbox);
+ if(dualListbox.settings.sortByInputOrder){
+ sortOptionsByInputOrder(dualListbox.elements.select2);
+ } else {
+ sortOptions(dualListbox.elements.select2, dualListbox);
+ }
+ }
+
+ function remove(dualListbox) {
+ if (dualListbox.settings.preserveSelectionOnMove === 'all' && !dualListbox.settings.moveOnSelect) {
+ saveSelections(dualListbox, 1);
+ saveSelections(dualListbox, 2);
+ } else if (dualListbox.settings.preserveSelectionOnMove === 'moved' && !dualListbox.settings.moveOnSelect) {
+ saveSelections(dualListbox, 2);
+ }
+
+ dualListbox.elements.select2.find('option:selected').each(function(index, item) {
+ var $item = $(item);
+ if (!$item.data('filtered2')) {
+ changeSelectionState(dualListbox, $item.data('original-index'), false);
+ }
+ });
+
+ refreshSelects(dualListbox);
+ triggerChangeEvent(dualListbox);
+ sortOptions(dualListbox.elements.select1, dualListbox);
+ if(dualListbox.settings.sortByInputOrder){
+ sortOptionsByInputOrder(dualListbox.elements.select2);
+ }
+ }
+
+ function moveAll(dualListbox) {
+ if (dualListbox.settings.preserveSelectionOnMove === 'all' && !dualListbox.settings.moveOnSelect) {
+ saveSelections(dualListbox, 1);
+ saveSelections(dualListbox, 2);
+ } else if (dualListbox.settings.preserveSelectionOnMove === 'moved' && !dualListbox.settings.moveOnSelect) {
+ saveSelections(dualListbox, 1);
+ }
+
+ dualListbox.element.find('option').each(function(index, item) {
+ var $item = $(item);
+ if (!$item.data('filtered1')) {
+ $item.prop('selected', true);
+ $item.attr('data-sortindex', dualListbox.sortIndex);
+ dualListbox.sortIndex++;
+ }
+ });
+
+ refreshSelects(dualListbox);
+ triggerChangeEvent(dualListbox);
+ }
+
+ function removeAll(dualListbox) {
+ if (dualListbox.settings.preserveSelectionOnMove === 'all' && !dualListbox.settings.moveOnSelect) {
+ saveSelections(dualListbox, 1);
+ saveSelections(dualListbox, 2);
+ } else if (dualListbox.settings.preserveSelectionOnMove === 'moved' && !dualListbox.settings.moveOnSelect) {
+ saveSelections(dualListbox, 2);
+ }
+
+ dualListbox.element.find('option').each(function(index, item) {
+ var $item = $(item);
+ if (!$item.data('filtered2')) {
+ $item.prop('selected', false);
+ $item.removeAttr('data-sortindex');
+ }
+ });
+
+ refreshSelects(dualListbox);
+ triggerChangeEvent(dualListbox);
+ }
+
+ function bindEvents(dualListbox) {
+ dualListbox.elements.form.submit(function(e) {
+ if (dualListbox.elements.filterInput1.is(':focus')) {
+ e.preventDefault();
+ dualListbox.elements.filterInput1.focusout();
+ } else if (dualListbox.elements.filterInput2.is(':focus')) {
+ e.preventDefault();
+ dualListbox.elements.filterInput2.focusout();
+ }
+ });
+
+ dualListbox.element.on('bootstrapDualListbox.refresh', function(e, mustClearSelections){
+ dualListbox.refresh(mustClearSelections);
+ });
+
+ dualListbox.elements.filterClear1.on('click', function() {
+ dualListbox.setNonSelectedFilter('', true);
+ });
+
+ dualListbox.elements.filterClear2.on('click', function() {
+ dualListbox.setSelectedFilter('', true);
+ });
+
+ if (dualListbox.settings.eventMoveOverride === false) {
+ dualListbox.elements.moveButton.on('click', function() {
+ move(dualListbox);
+ });
+ }
+
+ if (dualListbox.settings.eventMoveAllOverride === false) {
+ dualListbox.elements.moveAllButton.on('click', function() {
+ moveAll(dualListbox);
+ });
+ }
+
+ if (dualListbox.settings.eventRemoveOverride === false) {
+ dualListbox.elements.removeButton.on('click', function() {
+ remove(dualListbox);
+ });
+ }
+
+ if (dualListbox.settings.eventRemoveAllOverride === false) {
+ dualListbox.elements.removeAllButton.on('click', function() {
+ removeAll(dualListbox);
+ });
+ }
+
+ dualListbox.elements.filterInput1.on('change keyup', function() {
+ filter(dualListbox, 1);
+ });
+
+ dualListbox.elements.filterInput2.on('change keyup', function() {
+ filter(dualListbox, 2);
+ });
+ }
+
+ BootstrapDualListbox.prototype = {
+ init: function () {
+ // Add the custom HTML template
+ this.container = $('' +
+ '<div class="bootstrap-duallistbox-container row">' +
+ ' <div class="box1 col-md-6">' +
+ ' <label></label>' +
+ ' <span class="info-container">' +
+ ' <span class="info"></span>' +
+ ' <button type="button" class="btn btn-sm clear1" style="float:right!important;"></button>' +
+ ' </span>' +
+ ' <input class="form-control filter" type="text">' +
+ ' <div class="btn-group buttons">' +
+ ' <button type="button" class="btn moveall"></button>' +
+ ' <button type="button" class="btn move"></button>' +
+ ' </div>' +
+ ' <select multiple="multiple"></select>' +
+ ' </div>' +
+ ' <div class="box2 col-md-6">' +
+ ' <label></label>' +
+ ' <span class="info-container">' +
+ ' <span class="info"></span>' +
+ ' <button type="button" class="btn btn-sm clear2" style="float:right!important;"></button>' +
+ ' </span>' +
+ ' <input class="form-control filter" type="text">' +
+ ' <div class="btn-group buttons">' +
+ ' <button type="button" class="btn remove"></button>' +
+ ' <button type="button" class="btn removeall"></button>' +
+ ' </div>' +
+ ' <select multiple="multiple"></select>' +
+ ' </div>' +
+ '</div>')
+ .insertBefore(this.element);
+
+ // Cache the inner elements
+ this.elements = {
+ originalSelect: this.element,
+ box1: $('.box1', this.container),
+ box2: $('.box2', this.container),
+ filterInput1: $('.box1 .filter', this.container),
+ filterInput2: $('.box2 .filter', this.container),
+ filterClear1: $('.box1 .clear1', this.container),
+ filterClear2: $('.box2 .clear2', this.container),
+ label1: $('.box1 > label', this.container),
+ label2: $('.box2 > label', this.container),
+ info1: $('.box1 .info', this.container),
+ info2: $('.box2 .info', this.container),
+ select1: $('.box1 select', this.container),
+ select2: $('.box2 select', this.container),
+ moveButton: $('.box1 .move', this.container),
+ removeButton: $('.box2 .remove', this.container),
+ moveAllButton: $('.box1 .moveall', this.container),
+ removeAllButton: $('.box2 .removeall', this.container),
+ form: $($('.box1 .filter', this.container)[0].form)
+ };
+
+ // Set select IDs
+ this.originalSelectName = this.element.attr('name') || '';
+ var select1Id = 'bootstrap-duallistbox-nonselected-list_' + this.originalSelectName,
+ select2Id = 'bootstrap-duallistbox-selected-list_' + this.originalSelectName;
+ this.elements.select1.attr('id', select1Id);
+ this.elements.select2.attr('id', select2Id);
+ this.elements.label1.attr('for', select1Id);
+ this.elements.label2.attr('for', select2Id);
+
+ // Apply all settings
+ this.selectedElements = 0;
+ this.sortIndex = 0;
+ this.elementCount = 0;
+ this.setFilterTextClear(this.settings.filterTextClear);
+ this.setFilterPlaceHolder(this.settings.filterPlaceHolder);
+ this.setMoveSelectedLabel(this.settings.moveSelectedLabel);
+ this.setMoveAllLabel(this.settings.moveAllLabel);
+ this.setRemoveSelectedLabel(this.settings.removeSelectedLabel);
+ this.setRemoveAllLabel(this.settings.removeAllLabel);
+ this.setMoveOnSelect(this.settings.moveOnSelect);
+ this.setMoveOnDoubleClick(this.settings.moveOnDoubleClick);
+ this.setPreserveSelectionOnMove(this.settings.preserveSelectionOnMove);
+ this.setSelectedListLabel(this.settings.selectedListLabel);
+ this.setNonSelectedListLabel(this.settings.nonSelectedListLabel);
+ this.setHelperSelectNamePostfix(this.settings.helperSelectNamePostfix);
+ this.setSelectOrMinimalHeight(this.settings.selectorMinimalHeight);
+
+ updateSelectionStates(this);
+
+ this.setShowFilterInputs(this.settings.showFilterInputs);
+ this.setNonSelectedFilter(this.settings.nonSelectedFilter);
+ this.setSelectedFilter(this.settings.selectedFilter);
+ this.setInfoText(this.settings.infoText);
+ this.setInfoTextFiltered(this.settings.infoTextFiltered);
+ this.setInfoTextEmpty(this.settings.infoTextEmpty);
+ this.setFilterOnValues(this.settings.filterOnValues);
+ this.setSortByInputOrder(this.settings.sortByInputOrder);
+ this.setEventMoveOverride(this.settings.eventMoveOverride);
+ this.setEventMoveAllOverride(this.settings.eventMoveAllOverride);
+ this.setEventRemoveOverride(this.settings.eventRemoveOverride);
+ this.setEventRemoveAllOverride(this.settings.eventRemoveAllOverride);
+ this.setBtnClass(this.settings.btnClass);
+ this.setBtnMoveText(this.settings.btnMoveText);
+ this.setBtnRemoveText(this.settings.btnRemoveText);
+ this.setBtnMoveAllText(this.settings.btnMoveAllText);
+ this.setBtnRemoveAllText(this.settings.btnRemoveAllText);
+
+ // Hide the original select
+ this.element.hide();
+
+ bindEvents(this);
+ refreshSelects(this);
+
+ return this.element;
+ },
+ setFilterTextClear: function(value, refresh) {
+ this.settings.filterTextClear = value;
+ this.elements.filterClear1.html(value);
+ this.elements.filterClear2.html(value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setFilterPlaceHolder: function(value, refresh) {
+ this.settings.filterPlaceHolder = value;
+ this.elements.filterInput1.attr('placeholder', value);
+ this.elements.filterInput2.attr('placeholder', value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setMoveSelectedLabel: function(value, refresh) {
+ this.settings.moveSelectedLabel = value;
+ this.elements.moveButton.attr('title', value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setMoveAllLabel: function(value, refresh) {
+ this.settings.moveAllLabel = value;
+ this.elements.moveAllButton.attr('title', value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setRemoveSelectedLabel: function(value, refresh) {
+ this.settings.removeSelectedLabel = value;
+ this.elements.removeButton.attr('title', value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setRemoveAllLabel: function(value, refresh) {
+ this.settings.removeAllLabel = value;
+ this.elements.removeAllButton.attr('title', value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setMoveOnSelect: function(value, refresh) {
+ if (isBuggyAndroid) {
+ value = true;
+ }
+ this.settings.moveOnSelect = value;
+ if (this.settings.moveOnSelect) {
+ this.container.addClass('moveonselect');
+ var self = this;
+ this.elements.select1.on('change', function() {
+ move(self);
+ });
+ this.elements.select2.on('change', function() {
+ remove(self);
+ });
+ this.elements.moveButton.detach();
+ this.elements.removeButton.detach();
+ } else {
+ this.container.removeClass('moveonselect');
+ this.elements.select1.off('change');
+ this.elements.select2.off('change');
+ this.elements.moveButton.insertAfter(this.elements.moveAllButton);
+ this.elements.removeButton.insertBefore(this.elements.removeAllButton);
+ }
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setMoveOnDoubleClick: function(value, refresh) {
+ if (isBuggyAndroid) {
+ value = false;
+ }
+ this.settings.moveOnDoubleClick = value;
+ if (this.settings.moveOnDoubleClick) {
+ this.container.addClass('moveondoubleclick');
+ var self = this;
+ this.elements.select1.on('dblclick', function() {
+ move(self);
+ });
+ this.elements.select2.on('dblclick', function() {
+ remove(self);
+ });
+ } else {
+ this.container.removeClass('moveondoubleclick');
+ this.elements.select1.off('dblclick');
+ this.elements.select2.off('dblclick');
+ }
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setPreserveSelectionOnMove: function(value, refresh) {
+ // We are forcing to move on select and disabling preserveSelectionOnMove on Android
+ if (isBuggyAndroid) {
+ value = false;
+ }
+ this.settings.preserveSelectionOnMove = value;
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setSelectedListLabel: function(value, refresh) {
+ this.settings.selectedListLabel = value;
+ if (value) {
+ this.elements.label2.show().html(value);
+ } else {
+ this.elements.label2.hide().html(value);
+ }
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setNonSelectedListLabel: function(value, refresh) {
+ this.settings.nonSelectedListLabel = value;
+ if (value) {
+ this.elements.label1.show().html(value);
+ } else {
+ this.elements.label1.hide().html(value);
+ }
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setHelperSelectNamePostfix: function(value, refresh) {
+ this.settings.helperSelectNamePostfix = value;
+ if (value) {
+ this.elements.select1.attr('name', this.originalSelectName + value + '1');
+ this.elements.select2.attr('name', this.originalSelectName + value + '2');
+ } else {
+ this.elements.select1.removeAttr('name');
+ this.elements.select2.removeAttr('name');
+ }
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setSelectOrMinimalHeight: function(value, refresh) {
+ this.settings.selectorMinimalHeight = value;
+ var height = this.element.height();
+ if (this.element.height() < value) {
+ height = value;
+ }
+ this.elements.select1.height(height);
+ this.elements.select2.height(height);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setShowFilterInputs: function(value, refresh) {
+ if (!value) {
+ this.setNonSelectedFilter('');
+ this.setSelectedFilter('');
+ refreshSelects(this);
+ this.elements.filterInput1.hide();
+ this.elements.filterInput2.hide();
+ } else {
+ this.elements.filterInput1.show();
+ this.elements.filterInput2.show();
+ }
+ this.settings.showFilterInputs = value;
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setNonSelectedFilter: function(value, refresh) {
+ if (this.settings.showFilterInputs) {
+ this.settings.nonSelectedFilter = value;
+ this.elements.filterInput1.val(value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ }
+ },
+ setSelectedFilter: function(value, refresh) {
+ if (this.settings.showFilterInputs) {
+ this.settings.selectedFilter = value;
+ this.elements.filterInput2.val(value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ }
+ },
+ setInfoText: function(value, refresh) {
+ this.settings.infoText = value;
+ if (value) {
+ this.elements.info1.show();
+ this.elements.info2.show();
+ } else {
+ this.elements.info1.hide();
+ this.elements.info2.hide();
+ }
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setInfoTextFiltered: function(value, refresh) {
+ this.settings.infoTextFiltered = value;
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setInfoTextEmpty: function(value, refresh) {
+ this.settings.infoTextEmpty = value;
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setFilterOnValues: function(value, refresh) {
+ this.settings.filterOnValues = value;
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setSortByInputOrder: function(value, refresh){
+ this.settings.sortByInputOrder = value;
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setEventMoveOverride: function(value, refresh) {
+ this.settings.eventMoveOverride = value;
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setEventMoveAllOverride: function(value, refresh) {
+ this.settings.eventMoveAllOverride = value;
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setEventRemoveOverride: function(value, refresh) {
+ this.settings.eventRemoveOverride = value;
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setEventRemoveAllOverride: function(value, refresh) {
+ this.settings.eventRemoveAllOverride = value;
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setBtnClass: function(value, refresh) {
+ this.settings.btnClass = value;
+ this.elements.moveButton.attr('class', 'btn move').addClass(value);
+ this.elements.removeButton.attr('class', 'btn remove').addClass(value);
+ this.elements.moveAllButton.attr('class', 'btn moveall').addClass(value);
+ this.elements.removeAllButton.attr('class', 'btn removeall').addClass(value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setBtnMoveText: function(value, refresh) {
+ this.settings.btnMoveText = value;
+ this.elements.moveButton.html(value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setBtnRemoveText: function(value, refresh) {
+ this.settings.btnMoveText = value;
+ this.elements.removeButton.html(value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setBtnMoveAllText: function(value, refresh) {
+ this.settings.btnMoveText = value;
+ this.elements.moveAllButton.html(value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ setBtnRemoveAllText: function(value, refresh) {
+ this.settings.btnMoveText = value;
+ this.elements.removeAllButton.html(value);
+ if (refresh) {
+ refreshSelects(this);
+ }
+ return this.element;
+ },
+ getContainer: function() {
+ return this.container;
+ },
+ refresh: function(mustClearSelections) {
+ updateSelectionStates(this);
+
+ if (!mustClearSelections) {
+ saveSelections(this, 1);
+ saveSelections(this, 2);
+ } else {
+ clearSelections(this);
+ }
+
+ refreshSelects(this);
+ },
+ destroy: function() {
+ this.container.remove();
+ this.element.show();
+ $.data(this, 'plugin_' + pluginName, null);
+ return this.element;
+ }
+ };
+
+ // A really lightweight plugin wrapper around the constructor,
+ // preventing against multiple instantiations
+ $.fn[ pluginName ] = function (options) {
+ var args = arguments;
+
+ // Is the first parameter an object (options), or was omitted, instantiate a new instance of the plugin.
+ if (options === undefined || typeof options === 'object') {
+ return this.each(function () {
+ // If this is not a select
+ if (!$(this).is('select')) {
+ $(this).find('select').each(function(index, item) {
+ // For each nested select, instantiate the Dual List Box
+ $(item).bootstrapDualListbox(options);
+ });
+ } else if (!$.data(this, 'plugin_' + pluginName)) {
+ // Only allow the plugin to be instantiated once so we check that the element has no plugin instantiation yet
+
+ // if it has no instance, create a new one, pass options to our plugin constructor,
+ // and store the plugin instance in the elements jQuery data object.
+ $.data(this, 'plugin_' + pluginName, new BootstrapDualListbox(this, options));
+ }
+ });
+ // If the first parameter is a string and it doesn't start with an underscore or "contains" the `init`-function,
+ // treat this as a call to a public method.
+ } else if (typeof options === 'string' && options[0] !== '_' && options !== 'init') {
+
+ // Cache the method call to make it possible to return a value
+ var returns;
+
+ this.each(function () {
+ var instance = $.data(this, 'plugin_' + pluginName);
+ // Tests that there's already a plugin-instance and checks that the requested public method exists
+ if (instance instanceof BootstrapDualListbox && typeof instance[options] === 'function') {
+ // Call the method of our plugin instance, and pass it the supplied arguments.
+ returns = instance[options].apply(instance, Array.prototype.slice.call(args, 1));
+ }
+ });
+
+ // If the earlier cached method gives a value back return the value,
+ // otherwise return this to preserve chainability.
+ return returns !== undefined ? returns : this;
+ }
+
+ };
+
+}));
diff --git a/build/resources/main/static/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.min.js b/build/resources/main/static/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.min.js
new file mode 100644
index 0000000..83ff092
--- /dev/null
+++ b/build/resources/main/static/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.min.js
@@ -0,0 +1,10 @@
+/*
+ * Bootstrap Duallistbox - v4.0.2
+ * A responsive dual listbox widget optimized for Twitter Bootstrap. It works on all modern browsers and on touch devices.
+ * http://www.virtuosoft.eu/code/bootstrap-duallistbox/
+ *
+ * Made by István Ujj-Mészáros
+ * Under Apache License v2.0 License
+ */
+
+!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(a){var i="bootstrapDualListbox",n={filterTextClear:"show all",filterPlaceHolder:"Filter",moveSelectedLabel:"Move selected",moveAllLabel:"Move all",removeSelectedLabel:"Remove selected",removeAllLabel:"Remove all",moveOnSelect:!0,moveOnDoubleClick:!0,preserveSelectionOnMove:!1,selectedListLabel:!1,nonSelectedListLabel:!1,helperSelectNamePostfix:"_helper",selectorMinimalHeight:100,showFilterInputs:!0,nonSelectedFilter:"",selectedFilter:"",infoText:"Showing all {0}",infoTextFiltered:'<span class="badge badge-warning">Filtered</span> {0} from {1}',infoTextEmpty:"Empty list",filterOnValues:!1,sortByInputOrder:!1,eventMoveOverride:!1,eventMoveAllOverride:!1,eventRemoveOverride:!1,eventRemoveAllOverride:!1,btnClass:"btn-outline-secondary",btnMoveText:"&gt;",btnRemoveText:"&lt;",btnMoveAllText:"&gt;&gt;",btnRemoveAllText:"&lt;&lt;"},s=/android/i.test(navigator.userAgent.toLowerCase());function l(e,t){this.element=a(e),this.settings=a.extend({},n,t),this._defaults=n,this._name=i,this.init()}function t(e){e.element.trigger("change")}function o(s){s.element.find("option").each(function(e,t){var n=a(t);void 0===n.data("original-index")&&n.data("original-index",s.elementCount++),void 0===n.data("_selected")&&n.data("_selected",!1)})}function r(s,i,l){s.element.find("option").each(function(e,t){var n=a(t);n.data("original-index")===i&&(n.prop("selected",l),l?(n.attr("data-sortindex",s.sortIndex),s.sortIndex++):n.removeAttr("data-sortindex"))})}function c(e,n){return console.log(e,n),e.replace(/{(\d+)}/g,function(e,t){return void 0!==n[t]?n[t]:e})}function h(e){if(e.settings.infoText){var t=e.elements.select1.find("option").length,n=e.elements.select2.find("option").length,s=e.element.find("option").length-e.selectedElements,i=e.selectedElements,l="";l=0==s?e.settings.infoTextEmpty:c(t===s?e.settings.infoText:e.settings.infoTextFiltered,[t,s]),e.elements.info1.html(l),e.elements.box1.toggleClass("filtered",!(t===s||0==s)),l=0===i?e.settings.infoTextEmpty:c(n===i?e.settings.infoText:e.settings.infoTextFiltered,[n,i]),e.elements.info2.html(l),e.elements.box2.toggleClass("filtered",!(n===i||0===i))}}function m(s){s.selectedElements=0,s.elements.select1.empty(),s.elements.select2.empty(),s.element.find("option").each(function(e,t){var n=a(t);n.prop("selected")?(s.selectedElements++,s.elements.select2.append(n.clone(!0).prop("selected",n.data("_selected")))):s.elements.select1.append(n.clone(!0).prop("selected",n.data("_selected")))}),s.settings.showFilterInputs&&(e(s,1),e(s,2)),h(s)}function e(i,l){if(i.settings.showFilterInputs){d(i,l),i.elements["select"+l].empty().scrollTop(0);var o,r=i.element.find("option"),e=i.element;e=1===l?r.not(":selected"):e.find("option:selected");try{o=new RegExp(a.trim(i.elements["filterInput"+l].val()),"gi")}catch(e){o=new RegExp("/a^/","gi")}e.each(function(e,t){var n=a(t),s=!0;(t.text.match(o)||i.settings.filterOnValues&&n.attr("value").match(o))&&(s=!1,i.elements["select"+l].append(n.clone(!0).prop("selected",n.data("_selected")))),r.eq(n.data("original-index")).data("filtered"+l,s)}),h(i)}}function d(e,t){var s=e.element.find("option");e.elements["select"+t].find("option").each(function(e,t){var n=a(t);s.eq(n.data("original-index")).data("_selected",n.prop("selected"))})}function u(e){var t=e.children("option");t.sort(function(e,t){var n=parseInt(e.getAttribute("data-sortindex")),s=parseInt(t.getAttribute("data-sortindex"));return s<n?1:n<s?-1:0}),t.detach().appendTo(e)}function v(e,t){e.find("option").sort(function(e,t){return a(e).data("original-index")>a(t).data("original-index")?1:-1}).appendTo(e),m(t)}function f(s){"all"!==s.settings.preserveSelectionOnMove||s.settings.moveOnSelect?"moved"!==s.settings.preserveSelectionOnMove||s.settings.moveOnSelect||d(s,1):(d(s,1),d(s,2)),s.elements.select1.find("option:selected").each(function(e,t){var n=a(t);n.data("filtered1")||r(s,n.data("original-index"),!0)}),m(s),t(s),s.settings.sortByInputOrder?u(s.elements.select2):v(s.elements.select2,s)}function p(s){"all"!==s.settings.preserveSelectionOnMove||s.settings.moveOnSelect?"moved"!==s.settings.preserveSelectionOnMove||s.settings.moveOnSelect||d(s,2):(d(s,1),d(s,2)),s.elements.select2.find("option:selected").each(function(e,t){var n=a(t);n.data("filtered2")||r(s,n.data("original-index"),!1)}),m(s),t(s),v(s.elements.select1,s),s.settings.sortByInputOrder&&u(s.elements.select2)}function g(n){n.elements.form.submit(function(e){n.elements.filterInput1.is(":focus")?(e.preventDefault(),n.elements.filterInput1.focusout()):n.elements.filterInput2.is(":focus")&&(e.preventDefault(),n.elements.filterInput2.focusout())}),n.element.on("bootstrapDualListbox.refresh",function(e,t){n.refresh(t)}),n.elements.filterClear1.on("click",function(){n.setNonSelectedFilter("",!0)}),n.elements.filterClear2.on("click",function(){n.setSelectedFilter("",!0)}),!1===n.settings.eventMoveOverride&&n.elements.moveButton.on("click",function(){f(n)}),!1===n.settings.eventMoveAllOverride&&n.elements.moveAllButton.on("click",function(){var s;"all"!==(s=n).settings.preserveSelectionOnMove||s.settings.moveOnSelect?"moved"!==s.settings.preserveSelectionOnMove||s.settings.moveOnSelect||d(s,1):(d(s,1),d(s,2)),s.element.find("option").each(function(e,t){var n=a(t);n.data("filtered1")||(n.prop("selected",!0),n.attr("data-sortindex",s.sortIndex),s.sortIndex++)}),m(s),t(s)}),!1===n.settings.eventRemoveOverride&&n.elements.removeButton.on("click",function(){p(n)}),!1===n.settings.eventRemoveAllOverride&&n.elements.removeAllButton.on("click",function(){var e;"all"!==(e=n).settings.preserveSelectionOnMove||e.settings.moveOnSelect?"moved"!==e.settings.preserveSelectionOnMove||e.settings.moveOnSelect||d(e,2):(d(e,1),d(e,2)),e.element.find("option").each(function(e,t){var n=a(t);n.data("filtered2")||(n.prop("selected",!1),n.removeAttr("data-sortindex"))}),m(e),t(e)}),n.elements.filterInput1.on("change keyup",function(){e(n,1)}),n.elements.filterInput2.on("change keyup",function(){e(n,2)})}l.prototype={init:function(){this.container=a('<div class="bootstrap-duallistbox-container row"> <div class="box1 col-md-6"> <label></label> <span class="info-container"> <span class="info"></span> <button type="button" class="btn btn-sm clear1" style="float:right!important;"></button> </span> <input class="form-control filter" type="text"> <div class="btn-group buttons"> <button type="button" class="btn moveall"></button> <button type="button" class="btn move"></button> </div> <select multiple="multiple"></select> </div> <div class="box2 col-md-6"> <label></label> <span class="info-container"> <span class="info"></span> <button type="button" class="btn btn-sm clear2" style="float:right!important;"></button> </span> <input class="form-control filter" type="text"> <div class="btn-group buttons"> <button type="button" class="btn remove"></button> <button type="button" class="btn removeall"></button> </div> <select multiple="multiple"></select> </div></div>').insertBefore(this.element),this.elements={originalSelect:this.element,box1:a(".box1",this.container),box2:a(".box2",this.container),filterInput1:a(".box1 .filter",this.container),filterInput2:a(".box2 .filter",this.container),filterClear1:a(".box1 .clear1",this.container),filterClear2:a(".box2 .clear2",this.container),label1:a(".box1 > label",this.container),label2:a(".box2 > label",this.container),info1:a(".box1 .info",this.container),info2:a(".box2 .info",this.container),select1:a(".box1 select",this.container),select2:a(".box2 select",this.container),moveButton:a(".box1 .move",this.container),removeButton:a(".box2 .remove",this.container),moveAllButton:a(".box1 .moveall",this.container),removeAllButton:a(".box2 .removeall",this.container),form:a(a(".box1 .filter",this.container)[0].form)},this.originalSelectName=this.element.attr("name")||"";var e="bootstrap-duallistbox-nonselected-list_"+this.originalSelectName,t="bootstrap-duallistbox-selected-list_"+this.originalSelectName;return this.elements.select1.attr("id",e),this.elements.select2.attr("id",t),this.elements.label1.attr("for",e),this.elements.label2.attr("for",t),this.selectedElements=0,this.sortIndex=0,this.elementCount=0,this.setFilterTextClear(this.settings.filterTextClear),this.setFilterPlaceHolder(this.settings.filterPlaceHolder),this.setMoveSelectedLabel(this.settings.moveSelectedLabel),this.setMoveAllLabel(this.settings.moveAllLabel),this.setRemoveSelectedLabel(this.settings.removeSelectedLabel),this.setRemoveAllLabel(this.settings.removeAllLabel),this.setMoveOnSelect(this.settings.moveOnSelect),this.setMoveOnDoubleClick(this.settings.moveOnDoubleClick),this.setPreserveSelectionOnMove(this.settings.preserveSelectionOnMove),this.setSelectedListLabel(this.settings.selectedListLabel),this.setNonSelectedListLabel(this.settings.nonSelectedListLabel),this.setHelperSelectNamePostfix(this.settings.helperSelectNamePostfix),this.setSelectOrMinimalHeight(this.settings.selectorMinimalHeight),o(this),this.setShowFilterInputs(this.settings.showFilterInputs),this.setNonSelectedFilter(this.settings.nonSelectedFilter),this.setSelectedFilter(this.settings.selectedFilter),this.setInfoText(this.settings.infoText),this.setInfoTextFiltered(this.settings.infoTextFiltered),this.setInfoTextEmpty(this.settings.infoTextEmpty),this.setFilterOnValues(this.settings.filterOnValues),this.setSortByInputOrder(this.settings.sortByInputOrder),this.setEventMoveOverride(this.settings.eventMoveOverride),this.setEventMoveAllOverride(this.settings.eventMoveAllOverride),this.setEventRemoveOverride(this.settings.eventRemoveOverride),this.setEventRemoveAllOverride(this.settings.eventRemoveAllOverride),this.setBtnClass(this.settings.btnClass),this.setBtnMoveText(this.settings.btnMoveText),this.setBtnRemoveText(this.settings.btnRemoveText),this.setBtnMoveAllText(this.settings.btnMoveAllText),this.setBtnRemoveAllText(this.settings.btnRemoveAllText),this.element.hide(),g(this),m(this),this.element},setFilterTextClear:function(e,t){return this.settings.filterTextClear=e,this.elements.filterClear1.html(e),this.elements.filterClear2.html(e),t&&m(this),this.element},setFilterPlaceHolder:function(e,t){return this.settings.filterPlaceHolder=e,this.elements.filterInput1.attr("placeholder",e),this.elements.filterInput2.attr("placeholder",e),t&&m(this),this.element},setMoveSelectedLabel:function(e,t){return this.settings.moveSelectedLabel=e,this.elements.moveButton.attr("title",e),t&&m(this),this.element},setMoveAllLabel:function(e,t){return this.settings.moveAllLabel=e,this.elements.moveAllButton.attr("title",e),t&&m(this),this.element},setRemoveSelectedLabel:function(e,t){return this.settings.removeSelectedLabel=e,this.elements.removeButton.attr("title",e),t&&m(this),this.element},setRemoveAllLabel:function(e,t){return this.settings.removeAllLabel=e,this.elements.removeAllButton.attr("title",e),t&&m(this),this.element},setMoveOnSelect:function(e,t){if(s&&(e=!0),this.settings.moveOnSelect=e,this.settings.moveOnSelect){this.container.addClass("moveonselect");var n=this;this.elements.select1.on("change",function(){f(n)}),this.elements.select2.on("change",function(){p(n)}),this.elements.moveButton.detach(),this.elements.removeButton.detach()}else this.container.removeClass("moveonselect"),this.elements.select1.off("change"),this.elements.select2.off("change"),this.elements.moveButton.insertAfter(this.elements.moveAllButton),this.elements.removeButton.insertBefore(this.elements.removeAllButton);return t&&m(this),this.element},setMoveOnDoubleClick:function(e,t){if(s&&(e=!1),this.settings.moveOnDoubleClick=e,this.settings.moveOnDoubleClick){this.container.addClass("moveondoubleclick");var n=this;this.elements.select1.on("dblclick",function(){f(n)}),this.elements.select2.on("dblclick",function(){p(n)})}else this.container.removeClass("moveondoubleclick"),this.elements.select1.off("dblclick"),this.elements.select2.off("dblclick");return t&&m(this),this.element},setPreserveSelectionOnMove:function(e,t){return s&&(e=!1),this.settings.preserveSelectionOnMove=e,t&&m(this),this.element},setSelectedListLabel:function(e,t){return(this.settings.selectedListLabel=e)?this.elements.label2.show().html(e):this.elements.label2.hide().html(e),t&&m(this),this.element},setNonSelectedListLabel:function(e,t){return(this.settings.nonSelectedListLabel=e)?this.elements.label1.show().html(e):this.elements.label1.hide().html(e),t&&m(this),this.element},setHelperSelectNamePostfix:function(e,t){return(this.settings.helperSelectNamePostfix=e)?(this.elements.select1.attr("name",this.originalSelectName+e+"1"),this.elements.select2.attr("name",this.originalSelectName+e+"2")):(this.elements.select1.removeAttr("name"),this.elements.select2.removeAttr("name")),t&&m(this),this.element},setSelectOrMinimalHeight:function(e,t){this.settings.selectorMinimalHeight=e;var n=this.element.height();return this.element.height()<e&&(n=e),this.elements.select1.height(n),this.elements.select2.height(n),t&&m(this),this.element},setShowFilterInputs:function(e,t){return e?(this.elements.filterInput1.show(),this.elements.filterInput2.show()):(this.setNonSelectedFilter(""),this.setSelectedFilter(""),m(this),this.elements.filterInput1.hide(),this.elements.filterInput2.hide()),this.settings.showFilterInputs=e,t&&m(this),this.element},setNonSelectedFilter:function(e,t){if(this.settings.showFilterInputs)return this.settings.nonSelectedFilter=e,this.elements.filterInput1.val(e),t&&m(this),this.element},setSelectedFilter:function(e,t){if(this.settings.showFilterInputs)return this.settings.selectedFilter=e,this.elements.filterInput2.val(e),t&&m(this),this.element},setInfoText:function(e,t){return(this.settings.infoText=e)?(this.elements.info1.show(),this.elements.info2.show()):(this.elements.info1.hide(),this.elements.info2.hide()),t&&m(this),this.element},setInfoTextFiltered:function(e,t){return this.settings.infoTextFiltered=e,t&&m(this),this.element},setInfoTextEmpty:function(e,t){return this.settings.infoTextEmpty=e,t&&m(this),this.element},setFilterOnValues:function(e,t){return this.settings.filterOnValues=e,t&&m(this),this.element},setSortByInputOrder:function(e,t){return this.settings.sortByInputOrder=e,t&&m(this),this.element},setEventMoveOverride:function(e,t){return this.settings.eventMoveOverride=e,t&&m(this),this.element},setEventMoveAllOverride:function(e,t){return this.settings.eventMoveAllOverride=e,t&&m(this),this.element},setEventRemoveOverride:function(e,t){return this.settings.eventRemoveOverride=e,t&&m(this),this.element},setEventRemoveAllOverride:function(e,t){return this.settings.eventRemoveAllOverride=e,t&&m(this),this.element},setBtnClass:function(e,t){return this.settings.btnClass=e,this.elements.moveButton.attr("class","btn move").addClass(e),this.elements.removeButton.attr("class","btn remove").addClass(e),this.elements.moveAllButton.attr("class","btn moveall").addClass(e),this.elements.removeAllButton.attr("class","btn removeall").addClass(e),t&&m(this),this.element},setBtnMoveText:function(e,t){return this.settings.btnMoveText=e,this.elements.moveButton.html(e),t&&m(this),this.element},setBtnRemoveText:function(e,t){return this.settings.btnMoveText=e,this.elements.removeButton.html(e),t&&m(this),this.element},setBtnMoveAllText:function(e,t){return this.settings.btnMoveText=e,this.elements.moveAllButton.html(e),t&&m(this),this.element},setBtnRemoveAllText:function(e,t){return this.settings.btnMoveText=e,this.elements.removeAllButton.html(e),t&&m(this),this.element},getContainer:function(){return this.container},refresh:function(e){var t;o(this),e?(t=this).elements.select1.find("option").each(function(){t.element.find("option").data("_selected",!1)}):(d(this,1),d(this,2)),m(this)},destroy:function(){return this.container.remove(),this.element.show(),a.data(this,"plugin_"+i,null),this.element}},a.fn[i]=function(n){var t,s=arguments;return void 0===n||"object"==typeof n?this.each(function(){a(this).is("select")?a.data(this,"plugin_"+i)||a.data(this,"plugin_"+i,new l(this,n)):a(this).find("select").each(function(e,t){a(t).bootstrapDualListbox(n)})}):"string"==typeof n&&"_"!==n[0]&&"init"!==n?(this.each(function(){var e=a.data(this,"plugin_"+i);e instanceof l&&"function"==typeof e[n]&&(t=e[n].apply(e,Array.prototype.slice.call(s,1)))}),void 0!==t?t:this):void 0}}); \ No newline at end of file