64 lines
2.6 KiB
JavaScript
64 lines
2.6 KiB
JavaScript
import { escape } from 'lodash';
|
|
import { __, sprintf } from '~/locale';
|
|
import eventHub from '~/projects/new/event_hub';
|
|
import { VISIBILITY_LEVELS_STRING_TO_INTEGER } from '~/visibility_level/constants';
|
|
|
|
function setVisibilityOptions({ name, visibility, showPath, editPath }) {
|
|
document.querySelectorAll('.visibility-level-setting .gl-form-radio').forEach((option) => {
|
|
// Don't change anything if the option is restricted by admin
|
|
if (option.classList.contains('restricted')) {
|
|
return;
|
|
}
|
|
|
|
const optionInput = option.querySelector('input[type=radio]');
|
|
const optionValue = optionInput ? parseInt(optionInput.value, 10) : 0;
|
|
|
|
if (VISIBILITY_LEVELS_STRING_TO_INTEGER[visibility] < optionValue) {
|
|
option.classList.add('disabled');
|
|
optionInput.disabled = true;
|
|
const reason = option.querySelector('.option-disabled-reason');
|
|
if (reason) {
|
|
const optionTitle = option.querySelector('.js-visibility-level-radio span');
|
|
const optionName = optionTitle ? optionTitle.innerText.toLowerCase() : '';
|
|
// eslint-disable-next-line no-unsanitized/property
|
|
reason.innerHTML = sprintf(
|
|
__(
|
|
'This project cannot be %{visibilityLevel} because the visibility of %{openShowLink}%{name}%{closeShowLink} is %{visibility}. To make this project %{visibilityLevel}, you must first %{openEditLink}change the visibility%{closeEditLink} of the parent group.',
|
|
),
|
|
{
|
|
visibilityLevel: optionName,
|
|
name: escape(name),
|
|
visibility,
|
|
openShowLink: `<a href="${showPath}">`,
|
|
closeShowLink: '</a>',
|
|
openEditLink: `<a href="${editPath}">`,
|
|
closeEditLink: '</a>',
|
|
},
|
|
false,
|
|
);
|
|
}
|
|
} else {
|
|
option.classList.remove('disabled');
|
|
optionInput.disabled = false;
|
|
}
|
|
});
|
|
}
|
|
|
|
function handleSelect2DropdownChange(namespaceSelector) {
|
|
if (!namespaceSelector || !('selectedIndex' in namespaceSelector)) {
|
|
return;
|
|
}
|
|
const selectedNamespace = namespaceSelector.options[namespaceSelector.selectedIndex];
|
|
setVisibilityOptions(selectedNamespace.dataset);
|
|
}
|
|
|
|
export default function initProjectVisibilitySelector() {
|
|
eventHub.$on('update-visibility', setVisibilityOptions);
|
|
|
|
const namespaceSelector = document.querySelector('select.js-select-namespace');
|
|
if (namespaceSelector) {
|
|
const el = document.querySelector('.select2.js-select-namespace');
|
|
el.addEventListener('change', () => handleSelect2DropdownChange(namespaceSelector));
|
|
handleSelect2DropdownChange(namespaceSelector);
|
|
}
|
|
}
|