File manager - Edit - /home/autoph/public_html/tasks/bootstrap4-duallistbox.tar
Back
jquery.bootstrap-duallistbox.js 0000644 00000100705 15024775016 0012777 0 ustar 00 /* * 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: '>', // string, sets the text for the "Move" button btnRemoveText: '<', // string, sets the text for the "Remove" button btnMoveAllText: '>>', // string, sets the text for the "Move All" button btnRemoveAllText: '<<' // 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; } }; })); bootstrap-duallistbox.css 0000644 00000004010 15024775016 0011625 0 ustar 00 /* * 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%; } jquery.bootstrap-duallistbox.min.js 0000644 00000040733 15024775016 0013565 0 ustar 00 /* * 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:">",btnRemoveText:"<",btnMoveAllText:">>",btnRemoveAllText:"<<"},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}}); bootstrap-duallistbox.min.css 0000644 00000003020 15024775016 0012407 0 ustar 00 .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%}
| ver. 1.4 |
.
| PHP 7.3.33 | Generation time: 0 |
proxy
|
phpinfo
|
Settings