import $ from 'jquery'; import axios from './lib/utils/axios_utils'; import Api from './api'; import { normalizeHeaders } from './lib/utils/common_utils'; export default function groupsSelect() { // Needs to be accessible in rspec window.GROUP_SELECT_PER_PAGE = 20; $('.ajax-groups-select').each(function setAjaxGroupsSelect2() { const $select = $(this); const allAvailable = $select.data('allAvailable'); const skipGroups = $select.data('skipGroups') || []; $select.select2({ placeholder: 'Search for a group', multiple: $select.hasClass('multiselect'), minimumInputLength: 0, ajax: { url: Api.buildUrl(Api.groupsPath), dataType: 'json', quietMillis: 250, transport(params) { axios[params.type.toLowerCase()](params.url, { params: params.data, }) .then((res) => { const results = res.data || []; const headers = normalizeHeaders(res.headers); const currentPage = parseInt(headers['X-PAGE'], 10) || 0; const totalPages = parseInt(headers['X-TOTAL-PAGES'], 10) || 0; const more = currentPage < totalPages; params.success({ results, pagination: { more, }, }); }).catch(params.error); }, data(search, page) { return { search, page, per_page: window.GROUP_SELECT_PER_PAGE, all_available: allAvailable, }; }, results(data, page) { if (data.length) return { results: [] }; const groups = data.length ? data : data.results || []; const more = data.pagination ? data.pagination.more : false; const results = groups.filter(group => skipGroups.indexOf(group.id) === -1); return { results, page, more, }; }, }, // eslint-disable-next-line consistent-return initSelection(element, callback) { const id = $(element).val(); if (id !== '') { return Api.group(id, callback); } }, formatResult(object) { return `<div class='group-result'> <div class='group-name'>${object.full_name}</div> <div class='group-path'>${object.full_path}</div> </div>`; }, formatSelection(object) { return object.full_name; }, dropdownCssClass: 'ajax-groups-dropdown select2-infinite', // we do not want to escape markup since we are displaying html in results escapeMarkup(m) { return m; }, }); $select.on('select2-loaded', () => { const dropdown = document.querySelector('.select2-infinite .select2-results'); dropdown.style.height = `${Math.floor(dropdown.scrollHeight)}px`; }); }); }