diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-11-16 18:11:26 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-11-16 18:11:26 +0000 |
commit | 8fa0c53e26c947ac647b8067fde3e9673b77b1a6 (patch) | |
tree | da32e7224125973e9e87d3856fb7e672ff41c8b1 /app/assets/javascripts/packages_and_registries | |
parent | 0552020767452da44de2bf5424096f2cb2ea6bf5 (diff) | |
download | gitlab-ce-8fa0c53e26c947ac647b8067fde3e9673b77b1a6.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/packages_and_registries')
7 files changed, 366 insertions, 8 deletions
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/forwarding_settings.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/forwarding_settings.vue new file mode 100644 index 00000000000..c7fddadab1b --- /dev/null +++ b/app/assets/javascripts/packages_and_registries/settings/group/components/forwarding_settings.vue @@ -0,0 +1,91 @@ +<script> +import { GlFormCheckbox, GlFormGroup, GlSprintf } from '@gitlab/ui'; +import { isEqual } from 'lodash'; +import { + PACKAGE_FORWARDING_CHECKBOX_LABEL, + PACKAGE_FORWARDING_ENFORCE_LABEL, +} from '~/packages_and_registries/settings/group/constants'; + +export default { + name: 'ForwardingSettings', + i18n: { + PACKAGE_FORWARDING_CHECKBOX_LABEL, + PACKAGE_FORWARDING_ENFORCE_LABEL, + }, + components: { + GlFormCheckbox, + GlFormGroup, + GlSprintf, + }, + props: { + disabled: { + type: Boolean, + required: false, + default: true, + }, + forwarding: { + type: Boolean, + required: false, + default: false, + }, + label: { + type: String, + required: true, + }, + lockForwarding: { + type: Boolean, + required: false, + default: false, + }, + modelNames: { + type: Object, + required: true, + validator(value) { + return isEqual(Object.keys(value), ['forwarding', 'lockForwarding', 'isLocked']); + }, + }, + }, + computed: { + fields() { + return [ + { + testid: 'forwarding-checkbox', + label: PACKAGE_FORWARDING_CHECKBOX_LABEL, + updateField: this.modelNames.forwarding, + checked: this.forwarding, + }, + { + testid: 'lock-forwarding-checkbox', + label: PACKAGE_FORWARDING_ENFORCE_LABEL, + updateField: this.modelNames.lockForwarding, + checked: this.lockForwarding, + }, + ]; + }, + }, + methods: { + update(type, value) { + this.$emit('update', type, value); + }, + }, +}; +</script> + +<template> + <gl-form-group :label="label"> + <gl-form-checkbox + v-for="field in fields" + :key="field.testid" + :checked="field.checked" + :disabled="disabled" + :data-testid="field.testid" + @change="update(field.updateField, $event)" + > + <gl-sprintf :message="field.label"> + <template #packageType> + {{ label }} + </template> + </gl-sprintf> + </gl-form-checkbox> + </gl-form-group> +</template> diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue index f285dfc0755..36eb65c623b 100644 --- a/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue +++ b/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue @@ -2,6 +2,7 @@ import { GlAlert } from '@gitlab/ui'; import { n__ } from '~/locale'; import PackagesSettings from '~/packages_and_registries/settings/group/components/packages_settings.vue'; +import PackagesForwardingSettings from '~/packages_and_registries/settings/group/components/packages_forwarding_settings.vue'; import DependencyProxySettings from '~/packages_and_registries/settings/group/components/dependency_proxy_settings.vue'; import getGroupPackagesSettingsQuery from '~/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql'; @@ -11,6 +12,7 @@ export default { components: { GlAlert, PackagesSettings, + PackagesForwardingSettings, DependencyProxySettings, }, inject: ['groupPath'], @@ -82,6 +84,12 @@ export default { @error="handleError(2)" /> + <packages-forwarding-settings + :forward-settings="packageSettings" + @success="handleSuccess(2)" + @error="handleError(2)" + /> + <dependency-proxy-settings :dependency-proxy-settings="dependencyProxySettings" :dependency-proxy-image-ttl-policy="dependencyProxyImageTtlPolicy" 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> diff --git a/app/assets/javascripts/packages_and_registries/settings/group/constants.js b/app/assets/javascripts/packages_and_registries/settings/group/constants.js index 2dd6d3f76f6..c93cd7f7d78 100644 --- a/app/assets/javascripts/packages_and_registries/settings/group/constants.js +++ b/app/assets/javascripts/packages_and_registries/settings/group/constants.js @@ -7,6 +7,8 @@ export const PACKAGE_SETTINGS_DESCRIPTION = s__( ); export const PACKAGE_FORMATS_TABLE_HEADER = s__('PackageRegistry|Package formats'); export const MAVEN_PACKAGE_FORMAT = s__('PackageRegistry|Maven'); +export const NPM_PACKAGE_FORMAT = s__('PackageRegistry|npm'); +export const PYPI_PACKAGE_FORMAT = s__('PackageRegistry|PyPI'); export const GENERIC_PACKAGE_FORMAT = s__('PackageRegistry|Generic'); export const DUPLICATES_TOGGLE_LABEL = s__('PackageRegistry|Allow duplicates'); @@ -15,11 +17,65 @@ export const DUPLICATES_SETTINGS_EXCEPTION_LEGEND = s__( 'PackageRegistry|Publish packages if their name or version matches this regex.', ); +export const PACKAGE_FORWARDING_SETTINGS_HEADER = s__('PackageRegistry|Package forwarding'); +export const PACKAGE_FORWARDING_SETTINGS_DESCRIPTION = s__( + 'PackageRegistry|Forward package requests to a public registry if the packages are not found in the GitLab package registry.', +); +export const PACKAGE_FORWARDING_CHECKBOX_LABEL = s__( + `PackageRegistry|Forward %{packageType} package requests`, +); +export const PACKAGE_FORWARDING_ENFORCE_LABEL = s__( + `PackageRegistry|Enforce %{packageType} setting for all subgroups`, +); + +const MAVEN_PACKAGE_REQUESTS_FORWARDING = 'mavenPackageRequestsForwarding'; +const LOCK_MAVEN_PACKAGE_REQUESTS_FORWARDING = 'lockMavenPackageRequestsForwarding'; +const MAVEN_PACKAGE_REQUESTS_FORWARDING_LOCKED = 'mavenPackageRequestsForwardingLocked'; +const NPM_PACKAGE_REQUESTS_FORWARDING = 'npmPackageRequestsForwarding'; +const LOCK_NPM_PACKAGE_REQUESTS_FORWARDING = 'lockNpmPackageRequestsForwarding'; +const NPM_PACKAGE_REQUESTS_FORWARDING_LOCKED = 'npmPackageRequestsForwardingLocked'; +const PYPI_PACKAGE_REQUESTS_FORWARDING = 'pypiPackageRequestsForwarding'; +const LOCK_PYPI_PACKAGE_REQUESTS_FORWARDING = 'lockPypiPackageRequestsForwarding'; +const PYPI_PACKAGE_REQUESTS_FORWARDING_LOCKED = 'pypiPackageRequestsForwardingLocked'; + +export const PACKAGE_FORWARDING_FORM_BUTTON = __('Save changes'); + export const DEPENDENCY_PROXY_HEADER = s__('DependencyProxy|Dependency Proxy'); export const DEPENDENCY_PROXY_DESCRIPTION = s__( 'DependencyProxy|Enable the Dependency Proxy and settings for clearing the cache.', ); +export const PACKAGE_FORWARDING_FIELDS = [ + { + label: NPM_PACKAGE_FORMAT, + testid: 'npm', + modelNames: { + forwarding: NPM_PACKAGE_REQUESTS_FORWARDING, + lockForwarding: LOCK_NPM_PACKAGE_REQUESTS_FORWARDING, + isLocked: NPM_PACKAGE_REQUESTS_FORWARDING_LOCKED, + }, + }, + { + label: PYPI_PACKAGE_FORMAT, + testid: 'pypi', + modelNames: { + forwarding: PYPI_PACKAGE_REQUESTS_FORWARDING, + lockForwarding: LOCK_PYPI_PACKAGE_REQUESTS_FORWARDING, + isLocked: PYPI_PACKAGE_REQUESTS_FORWARDING_LOCKED, + }, + }, +]; + +export const MAVEN_FORWARDING_FIELDS = { + label: MAVEN_PACKAGE_FORMAT, + testid: 'maven', + modelNames: { + forwarding: MAVEN_PACKAGE_REQUESTS_FORWARDING, + lockForwarding: LOCK_MAVEN_PACKAGE_REQUESTS_FORWARDING, + isLocked: MAVEN_PACKAGE_REQUESTS_FORWARDING_LOCKED, + }, +}; + // Parameters export const PACKAGES_DOCS_PATH = helpPagePath('user/packages/index'); diff --git a/app/assets/javascripts/packages_and_registries/settings/group/graphql/fragments/package_settings_fields.fragment.graphql b/app/assets/javascripts/packages_and_registries/settings/group/graphql/fragments/package_settings_fields.fragment.graphql new file mode 100644 index 00000000000..267e40263f2 --- /dev/null +++ b/app/assets/javascripts/packages_and_registries/settings/group/graphql/fragments/package_settings_fields.fragment.graphql @@ -0,0 +1,15 @@ +fragment PackageSettingsFields on PackageSettings { + mavenDuplicatesAllowed + mavenDuplicateExceptionRegex + genericDuplicatesAllowed + genericDuplicateExceptionRegex + mavenPackageRequestsForwarding + lockMavenPackageRequestsForwarding + mavenPackageRequestsForwardingLocked + npmPackageRequestsForwarding + lockNpmPackageRequestsForwarding + npmPackageRequestsForwardingLocked + pypiPackageRequestsForwarding + lockPypiPackageRequestsForwarding + pypiPackageRequestsForwardingLocked +} diff --git a/app/assets/javascripts/packages_and_registries/settings/group/graphql/mutations/update_group_packages_settings.mutation.graphql b/app/assets/javascripts/packages_and_registries/settings/group/graphql/mutations/update_group_packages_settings.mutation.graphql index 5c245ff9453..5558cb66f42 100644 --- a/app/assets/javascripts/packages_and_registries/settings/group/graphql/mutations/update_group_packages_settings.mutation.graphql +++ b/app/assets/javascripts/packages_and_registries/settings/group/graphql/mutations/update_group_packages_settings.mutation.graphql @@ -1,10 +1,9 @@ +#import "~/packages_and_registries/settings/group/graphql/fragments/package_settings_fields.fragment.graphql" + mutation updateNamespacePackageSettings($input: UpdateNamespacePackageSettingsInput!) { updateNamespacePackageSettings(input: $input) { packageSettings { - mavenDuplicatesAllowed - mavenDuplicateExceptionRegex - genericDuplicatesAllowed - genericDuplicateExceptionRegex + ...PackageSettingsFields } errors } diff --git a/app/assets/javascripts/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql b/app/assets/javascripts/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql index 404d9d26d49..82a282d6d81 100644 --- a/app/assets/javascripts/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql +++ b/app/assets/javascripts/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql @@ -1,3 +1,5 @@ +#import "~/packages_and_registries/settings/group/graphql/fragments/package_settings_fields.fragment.graphql" + query getGroupPackagesSettings($fullPath: ID!) { group(fullPath: $fullPath) { id @@ -9,10 +11,7 @@ query getGroupPackagesSettings($fullPath: ID!) { enabled } packageSettings { - mavenDuplicatesAllowed - mavenDuplicateExceptionRegex - genericDuplicatesAllowed - genericDuplicateExceptionRegex + ...PackageSettingsFields } } } |