summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/projects/settings
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/projects/settings')
-rw-r--r--app/assets/javascripts/projects/settings/access_dropdown.js7
-rw-r--r--app/assets/javascripts/projects/settings/components/shared_runners_toggle.vue79
-rw-r--r--app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js21
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,
+ },
+ });
+ },
+ });
+};