diff options
Diffstat (limited to 'app/assets/javascripts/projects/settings')
3 files changed, 104 insertions, 3 deletions
diff --git a/app/assets/javascripts/projects/settings/access_dropdown.js b/app/assets/javascripts/projects/settings/access_dropdown.js index 3ca5bca4bf2..cb4fd5265da 100644 --- a/app/assets/javascripts/projects/settings/access_dropdown.js +++ b/app/assets/javascripts/projects/settings/access_dropdown.js @@ -48,11 +48,12 @@ export default class AccessDropdown { clicked: options => { const { $el, e } = options; const item = options.selectedObj; + const fossWithMergeAccess = !this.hasLicense && this.accessLevel === ACCESS_LEVELS.MERGE; e.preventDefault(); - if (!this.hasLicense) { - // We're not multiselecting quite yet with FOSS: + if (fossWithMergeAccess) { + // We're not multiselecting quite yet in "Merge" access dropdown, on FOSS: // remove all preselected items before selecting this item // https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37499 this.accessLevelsData.forEach(level => { @@ -62,7 +63,7 @@ export default class AccessDropdown { if ($el.is('.is-active')) { if (this.noOneObj) { - if (item.id === this.noOneObj.id && this.hasLicense) { + if (item.id === this.noOneObj.id && !fossWithMergeAccess) { // remove all others selected items this.accessLevelsData.forEach(level => { if (level.id !== item.id) { diff --git a/app/assets/javascripts/projects/settings/components/shared_runners_toggle.vue b/app/assets/javascripts/projects/settings/components/shared_runners_toggle.vue new file mode 100644 index 00000000000..a4924033c1e --- /dev/null +++ b/app/assets/javascripts/projects/settings/components/shared_runners_toggle.vue @@ -0,0 +1,79 @@ +<script> +import { GlAlert, GlToggle, GlTooltip } from '@gitlab/ui'; +import { __ } from '~/locale'; +import axios from '~/lib/utils/axios_utils'; + +const DEFAULT_ERROR_MESSAGE = __('An error occurred while updating the configuration.'); + +export default { + components: { + GlAlert, + GlToggle, + GlTooltip, + }, + props: { + isDisabledAndUnoverridable: { + type: Boolean, + required: true, + }, + isEnabled: { + type: Boolean, + required: true, + }, + updatePath: { + type: String, + required: true, + }, + }, + data() { + return { + isLoading: false, + isSharedRunnerEnabled: false, + errorMessage: null, + }; + }, + created() { + this.isSharedRunnerEnabled = this.isEnabled; + }, + methods: { + toggleSharedRunners() { + this.isLoading = true; + this.errorMessage = null; + + axios + .post(this.updatePath) + .then(() => { + this.isLoading = false; + this.isSharedRunnerEnabled = !this.isSharedRunnerEnabled; + }) + .catch(error => { + this.isLoading = false; + this.errorMessage = error.response?.data?.error || DEFAULT_ERROR_MESSAGE; + }); + }, + }, +}; +</script> + +<template> + <div> + <section class="gl-mt-5"> + <gl-alert v-if="errorMessage" class="gl-mb-3" variant="danger" :dismissible="false"> + {{ errorMessage }} + </gl-alert> + <div ref="sharedRunnersToggle"> + <gl-toggle + :disabled="isDisabledAndUnoverridable" + :is-loading="isLoading" + :label="__('Enable shared runners for this project')" + :value="isSharedRunnerEnabled" + data-testid="toggle-shared-runners" + @change="toggleSharedRunners" + /> + </div> + <gl-tooltip v-if="isDisabledAndUnoverridable" :target="() => $refs.sharedRunnersToggle"> + {{ __('Shared runners are disabled on group level') }} + </gl-tooltip> + </section> + </div> +</template> diff --git a/app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js b/app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js new file mode 100644 index 00000000000..c5d45fe6fed --- /dev/null +++ b/app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js @@ -0,0 +1,21 @@ +import Vue from 'vue'; +import SharedRunnersToggle from '~/projects/settings/components/shared_runners_toggle.vue'; +import { parseBoolean } from '~/lib/utils/common_utils'; + +export default (containerId = 'toggle-shared-runners-form') => { + const containerEl = document.getElementById(containerId); + const { isDisabledAndUnoverridable, isEnabled, updatePath } = containerEl.dataset; + + return new Vue({ + el: containerEl, + render(createElement) { + return createElement(SharedRunnersToggle, { + props: { + isDisabledAndUnoverridable: parseBoolean(isDisabledAndUnoverridable), + isEnabled: parseBoolean(isEnabled), + updatePath, + }, + }); + }, + }); +}; |