debian-mirror-gitlab/app/assets/javascripts/groups_select.js

89 lines
2.9 KiB
JavaScript
Raw Normal View History

2018-05-09 12:01:36 +05:30
import $ from 'jquery';
2018-03-27 19:54:05 +05:30
import axios from './lib/utils/axios_utils';
2017-09-10 17:25:29 +05:30
import Api from './api';
2018-03-27 19:54:05 +05:30
import { normalizeHeaders } from './lib/utils/common_utils';
2016-09-13 17:45:13 +05:30
2018-03-17 18:26:18 +05:30
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);
2018-03-27 19:54:05 +05:30
const allAvailable = $select.data('allAvailable');
const skipGroups = $select.data('skipGroups') || [];
2018-03-17 18:26:18 +05:30
$select.select2({
placeholder: 'Search for a group',
2018-11-18 11:00:15 +05:30
allowClear: $select.hasClass('allowClear'),
2018-03-17 18:26:18 +05:30
multiple: $select.hasClass('multiselect'),
minimumInputLength: 0,
ajax: {
url: Api.buildUrl(Api.groupsPath),
dataType: 'json',
quietMillis: 250,
transport(params) {
2018-03-27 19:54:05 +05:30
axios[params.type.toLowerCase()](params.url, {
params: params.data,
})
.then((res) => {
const results = res.data || [];
const headers = normalizeHeaders(res.headers);
2018-03-17 18:26:18 +05:30
const currentPage = parseInt(headers['X-PAGE'], 10) || 0;
const totalPages = parseInt(headers['X-TOTAL-PAGES'], 10) || 0;
const more = currentPage < totalPages;
2017-08-17 22:00:37 +05:30
2018-03-27 19:54:05 +05:30
params.success({
2017-08-17 22:00:37 +05:30
results,
2018-03-17 18:26:18 +05:30
pagination: {
more,
},
2018-03-27 19:54:05 +05:30
});
}).catch(params.error);
2018-03-17 18:26:18 +05:30
},
data(search, page) {
return {
search,
page,
per_page: window.GROUP_SELECT_PER_PAGE,
all_available: allAvailable,
};
},
results(data, page) {
if (data.length) return { results: [] };
2016-09-13 17:45:13 +05:30
2018-03-17 18:26:18 +05:30
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);
2016-09-13 17:45:13 +05:30
2018-03-17 18:26:18 +05:30
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;
},
});
2016-09-13 17:45:13 +05:30
2018-03-17 18:26:18 +05:30
$select.on('select2-loaded', () => {
const dropdown = document.querySelector('.select2-infinite .select2-results');
dropdown.style.height = `${Math.floor(dropdown.scrollHeight)}px`;
});
});
}