/*========================================================================================= File Name: form-select2.js Description: Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and pagination of results. ---------------------------------------------------------------------------------------- Item Name: Vuexy - Vuejs, HTML & Laravel Admin Dashboard Template Author: Pixinvent Author URL: hhttp://www.themeforest.net/user/pixinvent ==========================================================================================*/ (function (window, document, $) { 'use strict'; var select = $('.select2'), selectIcons = $('.select2-icons'), maxLength = $('.max-length'), hideSearch = $('.hide-search'), selectArray = $('.select2-data-array'), selectAjax = $('.select2-data-ajax'), selectLg = $('.select2-size-lg'), selectSm = $('.select2-size-sm'), selectInModal = $('.select2InModal'); select.each(function () { var $this = $(this); $this.wrap('<div class="position-relative"></div>'); $this.select2({ // the following code is used to disable x-scrollbar when click in select input and // take 100% width in responsive also dropdownAutoWidth: true, width: '100%', dropdownParent: $this.parent() }); }); // Select With Icon selectIcons.each(function () { var $this = $(this); $this.wrap('<div class="position-relative"></div>'); $this.select2({ dropdownAutoWidth: true, width: '100%', minimumResultsForSearch: Infinity, dropdownParent: $this.parent(), templateResult: iconFormat, templateSelection: iconFormat, escapeMarkup: function (es) { return es; } }); }); // Format icon function iconFormat(icon) { var originalOption = icon.element; if (!icon.id) { return icon.text; } var $icon = feather.icons[$(icon.element).data('icon')].toSvg() + icon.text; return $icon; } // Limiting the number of selections maxLength.wrap('<div class="position-relative"></div>').select2({ dropdownAutoWidth: true, width: '100%', maximumSelectionLength: 2, dropdownParent: maxLength.parent(), placeholder: 'Select maximum 2 items' }); // Hide Search Box hideSearch.select2({ placeholder: 'Select an option', minimumResultsForSearch: Infinity }); // Loading array data var data = [ { id: 0, text: 'enhancement' }, { id: 1, text: 'bug' }, { id: 2, text: 'duplicate' }, { id: 3, text: 'invalid' }, { id: 4, text: 'wontfix' } ]; selectArray.wrap('<div class="position-relative"></div>').select2({ dropdownAutoWidth: true, dropdownParent: selectArray.parent(), width: '100%', data: data }); // Loading remote data selectAjax.wrap('<div class="position-relative"></div>').select2({ dropdownAutoWidth: true, dropdownParent: selectAjax.parent(), width: '100%', ajax: { url: 'https://api.github.com/search/repositories', dataType: 'json', delay: 250, data: function (params) { return { q: params.term, // search term page: params.page }; }, processResults: function (data, params) { // parse the results into the format expected by Select2 // since we are using custom formatting functions we do not need to // alter the remote JSON data, except to indicate that infinite // scrolling can be used params.page = params.page || 1; return { results: data.items, pagination: { more: params.page * 30 < data.total_count } }; }, cache: true }, placeholder: 'Search for a repository', escapeMarkup: function (markup) { return markup; }, // let our custom formatter work minimumInputLength: 1, templateResult: formatRepo, templateSelection: formatRepoSelection }); function formatRepo(repo) { if (repo.loading) return repo.text; var markup = "<div class='select2-result-repository clearfix'>" + "<div class='select2-result-repository__avatar'><img src='" + repo.owner.avatar_url + "' /></div>" + "<div class='select2-result-repository__meta'>" + "<div class='select2-result-repository__title'>" + repo.full_name + '</div>'; if (repo.description) { markup += "<div class='select2-result-repository__description'>" + repo.description + '</div>'; } markup += "<div class='select2-result-repository__statistics'>" + "<div class='select2-result-repository__forks'>" + feather.icons['share-2'].toSvg({ class: 'me-50' }) + repo.forks_count + ' Forks</div>' + "<div class='select2-result-repository__stargazers'>" + feather.icons['star'].toSvg({ class: 'me-50' }) + repo.stargazers_count + ' Stars</div>' + "<div class='select2-result-repository__watchers'>" + feather.icons['eye'].toSvg({ class: 'me-50' }) + repo.watchers_count + ' Watchers</div>' + '</div>' + '</div></div>'; return markup; } function formatRepoSelection(repo) { return repo.full_name || repo.text; } // Sizing options // Large selectLg.each(function () { var $this = $(this); $this.wrap('<div class="position-relative"></div>'); $this.select2({ dropdownAutoWidth: true, dropdownParent: $this.parent(), width: '100%', containerCssClass: 'select-lg' }); }); // Small selectSm.each(function () { var $this = $(this); $this.wrap('<div class="position-relative"></div>'); $this.select2({ dropdownAutoWidth: true, dropdownParent: $this.parent(), width: '100%', containerCssClass: 'select-sm' }); }); $('#select2InModal').on('shown.bs.modal', function () { selectInModal.select2({ placeholder: 'Select a state' }); }); })(window, document, jQuery);