2020-04-29 20:09:37 -04:00
|
|
|
/* eslint-disable func-names */
|
2018-03-09 15:18:59 -05:00
|
|
|
|
|
|
|
import $ from 'jquery';
|
2022-06-16 17:09:48 -04:00
|
|
|
import createFlash from '~/flash';
|
2017-05-19 17:22:46 -04:00
|
|
|
import Api from './api';
|
2020-11-18 04:09:02 -05:00
|
|
|
import { loadCSSFile } from './lib/utils/css_utils';
|
2021-02-14 13:09:20 -05:00
|
|
|
import { s__ } from './locale';
|
|
|
|
import ProjectSelectComboButton from './project_select_combo_button';
|
2016-12-14 00:26:26 -05:00
|
|
|
|
2022-06-16 17:09:48 -04:00
|
|
|
const projectSelect = async () => {
|
|
|
|
await loadCSSFile(gon.select2_css_path);
|
2017-05-30 00:35:49 -04:00
|
|
|
|
2022-06-16 17:09:48 -04:00
|
|
|
$('.ajax-project-select').each(function (i, select) {
|
|
|
|
let placeholder;
|
|
|
|
const simpleFilter = $(select).data('simpleFilter') || false;
|
|
|
|
const isInstantiated = $(select).data('select2');
|
|
|
|
this.groupId = $(select).data('groupId');
|
|
|
|
this.userId = $(select).data('userId');
|
|
|
|
this.includeGroups = $(select).data('includeGroups');
|
|
|
|
this.allProjects = $(select).data('allProjects') || false;
|
|
|
|
this.orderBy = $(select).data('orderBy') || 'id';
|
|
|
|
this.withIssuesEnabled = $(select).data('withIssuesEnabled');
|
|
|
|
this.withMergeRequestsEnabled = $(select).data('withMergeRequestsEnabled');
|
|
|
|
this.withShared =
|
|
|
|
$(select).data('withShared') === undefined ? true : $(select).data('withShared');
|
|
|
|
this.includeProjectsInSubgroups = $(select).data('includeProjectsInSubgroups') || false;
|
|
|
|
this.allowClear = $(select).data('allowClear') || false;
|
|
|
|
|
|
|
|
placeholder = s__('ProjectSelect|Search for project');
|
|
|
|
if (this.includeGroups) {
|
|
|
|
placeholder += s__('ProjectSelect| or group');
|
|
|
|
}
|
2020-11-18 04:09:02 -05:00
|
|
|
|
2022-06-16 17:09:48 -04:00
|
|
|
$(select).select2({
|
|
|
|
placeholder,
|
|
|
|
minimumInputLength: 0,
|
|
|
|
query: (query) => {
|
|
|
|
let projectsCallback;
|
|
|
|
const finalCallback = function (projects) {
|
|
|
|
const data = {
|
|
|
|
results: projects,
|
|
|
|
};
|
|
|
|
return query.callback(data);
|
|
|
|
};
|
|
|
|
if (this.includeGroups) {
|
|
|
|
projectsCallback = function (projects) {
|
|
|
|
const groupsCallback = function (groups) {
|
|
|
|
const data = groups.concat(projects);
|
|
|
|
return finalCallback(data);
|
2020-11-18 04:09:02 -05:00
|
|
|
};
|
2022-06-16 17:09:48 -04:00
|
|
|
return Api.groups(query.term, {}, groupsCallback);
|
|
|
|
};
|
|
|
|
} else {
|
|
|
|
projectsCallback = finalCallback;
|
|
|
|
}
|
|
|
|
if (this.groupId) {
|
|
|
|
return Api.groupProjects(
|
|
|
|
this.groupId,
|
|
|
|
query.term,
|
|
|
|
{
|
|
|
|
with_issues_enabled: this.withIssuesEnabled,
|
|
|
|
with_merge_requests_enabled: this.withMergeRequestsEnabled,
|
|
|
|
with_shared: this.withShared,
|
|
|
|
include_subgroups: this.includeProjectsInSubgroups,
|
|
|
|
order_by: 'similarity',
|
|
|
|
simple: true,
|
|
|
|
},
|
|
|
|
projectsCallback,
|
|
|
|
).catch(() => {
|
|
|
|
createFlash({
|
|
|
|
message: s__('ProjectSelect|Something went wrong while fetching projects'),
|
2020-11-18 04:09:02 -05:00
|
|
|
});
|
2022-06-16 17:09:48 -04:00
|
|
|
});
|
|
|
|
} else if (this.userId) {
|
|
|
|
return Api.userProjects(
|
|
|
|
this.userId,
|
|
|
|
query.term,
|
|
|
|
{
|
|
|
|
with_issues_enabled: this.withIssuesEnabled,
|
|
|
|
with_merge_requests_enabled: this.withMergeRequestsEnabled,
|
|
|
|
with_shared: this.withShared,
|
|
|
|
include_subgroups: this.includeProjectsInSubgroups,
|
|
|
|
},
|
|
|
|
projectsCallback,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return Api.projects(
|
|
|
|
query.term,
|
|
|
|
{
|
|
|
|
order_by: this.orderBy,
|
|
|
|
with_issues_enabled: this.withIssuesEnabled,
|
|
|
|
with_merge_requests_enabled: this.withMergeRequestsEnabled,
|
|
|
|
membership: !this.allProjects,
|
2020-11-18 04:09:02 -05:00
|
|
|
},
|
2022-06-16 17:09:48 -04:00
|
|
|
projectsCallback,
|
|
|
|
);
|
|
|
|
},
|
|
|
|
id(project) {
|
|
|
|
if (simpleFilter) return project.id;
|
|
|
|
return JSON.stringify({
|
|
|
|
name: project.name,
|
|
|
|
url: project.web_url,
|
|
|
|
});
|
|
|
|
},
|
|
|
|
text(project) {
|
|
|
|
return project.name_with_namespace || project.name;
|
|
|
|
},
|
2018-08-14 17:32:24 -04:00
|
|
|
|
2022-06-16 17:09:48 -04:00
|
|
|
initSelection(el, callback) {
|
|
|
|
return Api.project(el.val()).then(({ data }) => callback(data));
|
|
|
|
},
|
2018-08-14 17:32:24 -04:00
|
|
|
|
2022-06-16 17:09:48 -04:00
|
|
|
allowClear: this.allowClear,
|
2018-08-14 17:32:24 -04:00
|
|
|
|
2022-06-16 17:09:48 -04:00
|
|
|
dropdownCssClass: 'ajax-project-dropdown',
|
|
|
|
});
|
|
|
|
if (isInstantiated || simpleFilter) return select;
|
|
|
|
return new ProjectSelectComboButton(select);
|
|
|
|
});
|
2019-09-27 05:06:26 -04:00
|
|
|
};
|
|
|
|
|
2020-09-15 11:10:08 -04:00
|
|
|
export default () => {
|
|
|
|
if ($('.ajax-project-select').length) {
|
|
|
|
import(/* webpackChunkName: 'select2' */ 'select2/select2')
|
|
|
|
.then(projectSelect)
|
|
|
|
.catch(() => {});
|
|
|
|
}
|
|
|
|
};
|