Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/packages_and_registries/settings/group/components/packages_forwarding_settings.vue')
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/packages_forwarding_settings.vue190
1 files changed, 190 insertions, 0 deletions
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/packages_forwarding_settings.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/packages_forwarding_settings.vue
new file mode 100644
index 00000000000..b7d7f0aaca7
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/settings/group/components/packages_forwarding_settings.vue
@@ -0,0 +1,190 @@
+<script>
+import { GlButton } from '@gitlab/ui';
+import { isEqual } from 'lodash';
+import {
+ PACKAGE_FORWARDING_SETTINGS_HEADER,
+ PACKAGE_FORWARDING_SETTINGS_DESCRIPTION,
+ PACKAGE_FORWARDING_FORM_BUTTON,
+ PACKAGE_FORWARDING_FIELDS,
+ MAVEN_FORWARDING_FIELDS,
+} from '~/packages_and_registries/settings/group/constants';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import updateNamespacePackageSettings from '~/packages_and_registries/settings/group/graphql/mutations/update_group_packages_settings.mutation.graphql';
+import { updateGroupPackageSettings } from '~/packages_and_registries/settings/group/graphql/utils/cache_update';
+import { updateGroupPackagesSettingsOptimisticResponse } from '~/packages_and_registries/settings/group/graphql/utils/optimistic_responses';
+
+import SettingsBlock from '~/packages_and_registries/shared/components/settings_block.vue';
+import ForwardingSettings from '~/packages_and_registries/settings/group/components/forwarding_settings.vue';
+
+export default {
+ name: 'PackageForwardingSettings',
+ i18n: {
+ PACKAGE_FORWARDING_FORM_BUTTON,
+ PACKAGE_FORWARDING_SETTINGS_HEADER,
+ PACKAGE_FORWARDING_SETTINGS_DESCRIPTION,
+ },
+ components: {
+ ForwardingSettings,
+ GlButton,
+ SettingsBlock,
+ },
+ mixins: [glFeatureFlagsMixin()],
+ inject: ['groupPath'],
+ props: {
+ forwardSettings: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ mutationLoading: false,
+ workingCopy: { ...this.forwardSettings },
+ };
+ },
+ computed: {
+ packageForwardingFields() {
+ const fields = PACKAGE_FORWARDING_FIELDS;
+
+ if (this.glFeatures.mavenCentralRequestForwarding) {
+ return fields.concat(MAVEN_FORWARDING_FIELDS);
+ }
+
+ return fields;
+ },
+ isEdited() {
+ return !isEqual(this.forwardSettings, this.workingCopy);
+ },
+ isDisabled() {
+ return !this.isEdited || this.mutationLoading;
+ },
+ npmMutation() {
+ if (this.workingCopy.npmPackageRequestsForwardingLocked) {
+ return {};
+ }
+
+ return {
+ npmPackageRequestsForwarding: this.workingCopy.npmPackageRequestsForwarding,
+ lockNpmPackageRequestsForwarding: this.workingCopy.lockNpmPackageRequestsForwarding,
+ };
+ },
+ pypiMutation() {
+ if (this.workingCopy.pypiPackageRequestsForwardingLocked) {
+ return {};
+ }
+
+ return {
+ pypiPackageRequestsForwarding: this.workingCopy.pypiPackageRequestsForwarding,
+ lockPypiPackageRequestsForwarding: this.workingCopy.lockPypiPackageRequestsForwarding,
+ };
+ },
+ mavenMutation() {
+ if (this.workingCopy.mavenPackageRequestsForwardingLocked) {
+ return {};
+ }
+
+ return {
+ mavenPackageRequestsForwarding: this.workingCopy.mavenPackageRequestsForwarding,
+ lockMavenPackageRequestsForwarding: this.workingCopy.lockMavenPackageRequestsForwarding,
+ };
+ },
+ mutationVariables() {
+ return {
+ ...this.npmMutation,
+ ...this.pypiMutation,
+ ...this.mavenMutation,
+ };
+ },
+ },
+ watch: {
+ forwardSettings(newValue) {
+ this.workingCopy = { ...newValue };
+ },
+ },
+ methods: {
+ isForwardingFieldsDisabled(fields) {
+ const isLocked = fields?.modelNames?.isLocked;
+
+ return this.mutationLoading || this.workingCopy[isLocked];
+ },
+ forwardingFieldsForwarding(fields) {
+ const forwarding = fields?.modelNames?.forwarding;
+
+ return this.workingCopy[forwarding];
+ },
+ forwardingFieldsLockForwarding(fields) {
+ const lockForwarding = fields?.modelNames?.lockForwarding;
+
+ return this.workingCopy[lockForwarding];
+ },
+ async submit() {
+ this.mutationLoading = true;
+ try {
+ const { data } = await this.$apollo.mutate({
+ mutation: updateNamespacePackageSettings,
+ variables: {
+ input: {
+ namespacePath: this.groupPath,
+ ...this.mutationVariables,
+ },
+ },
+ update: updateGroupPackageSettings(this.groupPath),
+ optimisticResponse: updateGroupPackagesSettingsOptimisticResponse({
+ ...this.forwardSettings,
+ ...this.mutationVariables,
+ }),
+ });
+
+ if (data.updateNamespacePackageSettings?.errors?.length > 0) {
+ throw new Error();
+ } else {
+ this.$emit('success');
+ }
+ } catch {
+ this.$emit('error');
+ } finally {
+ this.mutationLoading = false;
+ }
+ },
+ updateWorkingCopy(type, value) {
+ this.$set(this.workingCopy, type, value);
+ },
+ },
+};
+</script>
+
+<template>
+ <settings-block>
+ <template #title> {{ $options.i18n.PACKAGE_FORWARDING_SETTINGS_HEADER }}</template>
+ <template #description>
+ <span data-testid="description">
+ {{ $options.i18n.PACKAGE_FORWARDING_SETTINGS_DESCRIPTION }}
+ </span>
+ </template>
+ <template #default>
+ <form @submit.prevent="submit">
+ <forwarding-settings
+ v-for="forwardingFields in packageForwardingFields"
+ :key="forwardingFields.label"
+ :data-testid="forwardingFields.testid"
+ :disabled="isForwardingFieldsDisabled(forwardingFields)"
+ :forwarding="forwardingFieldsForwarding(forwardingFields)"
+ :label="forwardingFields.label"
+ :lock-forwarding="forwardingFieldsLockForwarding(forwardingFields)"
+ :model-names="forwardingFields.modelNames"
+ @update="updateWorkingCopy"
+ />
+ <gl-button
+ type="submit"
+ :disabled="isDisabled"
+ :loading="mutationLoading"
+ category="primary"
+ variant="confirm"
+ class="js-no-auto-disable gl-mr-4"
+ >
+ {{ $options.i18n.PACKAGE_FORWARDING_FORM_BUTTON }}
+ </gl-button>
+ </form>
+ </template>
+ </settings-block>
+</template>