diff --git a/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue b/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue
index 0e02863bb9f6bf4ffdd6ee88b5ba9ef216f71e5f..da6fb77525808a87e13e3e96773e61438246dfce 100644
--- a/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue
+++ b/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue
@@ -49,6 +49,10 @@ export default {
ciCdLabel: __('CI/CD'),
repositoryLabel: s__('ProjectSettings|Repository'),
requirementsLabel: s__('ProjectSettings|Requirements'),
+ releasesLabel: s__('ProjectSettings|Releases'),
+ releasesHelpText: s__(
+ 'ProjectSettings|Combine git tags with release notes, release evidence, and assets to create a release.',
+ ),
securityAndComplianceLabel: s__('ProjectSettings|Security & Compliance'),
snippetsLabel: s__('ProjectSettings|Snippets'),
wikiLabel: s__('ProjectSettings|Wiki'),
@@ -145,6 +149,11 @@ export default {
required: false,
default: '',
},
+ releasesHelpPath: {
+ type: String,
+ required: false,
+ default: '',
+ },
lfsHelpPath: {
type: String,
required: false,
@@ -229,6 +238,7 @@ export default {
operationsAccessLevel: featureAccessLevel.EVERYONE,
environmentsAccessLevel: featureAccessLevel.EVERYONE,
featureFlagsAccessLevel: featureAccessLevel.PROJECT_MEMBERS,
+ releasesAccessLevel: featureAccessLevel.EVERYONE,
containerRegistryAccessLevel: featureAccessLevel.EVERYONE,
warnAboutPotentiallyUnwantedCharacters: true,
lfsEnabled: true,
@@ -409,6 +419,10 @@ export default {
featureAccessLevel.PROJECT_MEMBERS,
this.featureFlagsAccessLevel,
);
+ this.releasesAccessLevel = Math.min(
+ featureAccessLevel.PROJECT_MEMBERS,
+ this.releasesAccessLevel,
+ );
this.containerRegistryAccessLevel = Math.min(
featureAccessLevel.PROJECT_MEMBERS,
this.containerRegistryAccessLevel,
@@ -921,6 +935,19 @@ export default {
name="project[project_feature_attributes][feature_flags_access_level]"
/>
+
+
+
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index a65dd6703f28a4886b239dadcc92bd21e5348dbd..b140184f6fd998f3680e68ae624ff55a30641e6f 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -391,7 +391,8 @@ def project_permissions_panel_data(project)
issuesHelpPath: help_page_path('user/project/issues/index'),
membersPagePath: project_project_members_path(project),
environmentsHelpPath: help_page_path('ci/environments/index'),
- featureFlagsHelpPath: help_page_path('operations/feature_flags')
+ featureFlagsHelpPath: help_page_path('operations/feature_flags'),
+ releasesHelpPath: help_page_path('user/project/releases/index')
}
end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index fea9aa2529ce041b4a3131fc7b3eb7d460f20d1b..82f92931d322e578526acbe7fb6836d26960b170 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -30799,6 +30799,9 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, options, checks, and squash options."
msgstr ""
+msgid "ProjectSettings|Combine git tags with release notes, release evidence, and assets to create a release."
+msgstr ""
+
msgid "ProjectSettings|Configure your project resources and monitor their health."
msgstr ""
@@ -30994,6 +30997,9 @@ msgstr ""
msgid "ProjectSettings|Public"
msgstr ""
+msgid "ProjectSettings|Releases"
+msgstr ""
+
msgid "ProjectSettings|Repository"
msgstr ""
diff --git a/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js b/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js
index b65f2c8020d861e080fdcd195a5b850f2c442747..b64d3297acc0ed54f9f85cb8f82a7978a317761c 100644
--- a/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js
+++ b/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js
@@ -129,6 +129,7 @@ describe('Settings Panel', () => {
const findConfirmDangerButton = () => wrapper.findComponent(ConfirmDanger);
const findEnvironmentsSettings = () => wrapper.findComponent({ ref: 'environments-settings' });
const findFeatureFlagsSettings = () => wrapper.findComponent({ ref: 'feature-flags-settings' });
+ const findReleasesSettings = () => wrapper.findComponent({ ref: 'environments-settings' });
afterEach(() => {
wrapper.destroy();
@@ -825,4 +826,23 @@ describe('Settings Panel', () => {
});
});
});
+
+ describe('Releases', () => {
+ describe('with feature flag', () => {
+ it('should show the releases toggle', () => {
+ wrapper = mountComponent({
+ glFeatures: { splitOperationsVisibilityPermissions: true },
+ });
+
+ expect(findReleasesSettings().exists()).toBe(true);
+ });
+ });
+ describe('without feature flag', () => {
+ it('should not show the releases toggle', () => {
+ wrapper = mountComponent({});
+
+ expect(findReleasesSettings().exists()).toBe(false);
+ });
+ });
+ });
});