diff options
33 files changed, 179 insertions, 173 deletions
diff --git a/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js b/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js index 908cbfd6dc8..a44b9827fe9 100644 --- a/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js +++ b/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js @@ -138,6 +138,12 @@ export const scrollToDraft = ({ dispatch, rootGetters }, draft) => { window.mrTabs.tabShown(tab); } + const { file_path: filePath } = draft; + + if (filePath) { + dispatch('diffs/setFileCollapsedAutomatically', { filePath, collapsed: false }, { root: true }); + } + if (discussion) { dispatch('expandDiscussion', { discussionId: discussion.id }, { root: true }); } diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js index d5cd4af4d06..ace507f601a 100644 --- a/app/assets/javascripts/diffs/store/actions.js +++ b/app/assets/javascripts/diffs/store/actions.js @@ -744,6 +744,10 @@ export const setFileCollapsedByUser = ({ commit }, { filePath, collapsed }) => { commit(types.SET_FILE_COLLAPSED, { filePath, collapsed, trigger: DIFF_FILE_MANUAL_COLLAPSE }); }; +export const setFileCollapsedAutomatically = ({ commit }, { filePath, collapsed }) => { + commit(types.SET_FILE_COLLAPSED, { filePath, collapsed, trigger: DIFF_FILE_AUTOMATIC_COLLAPSE }); +}; + export const setSuggestPopoverDismissed = ({ commit, state }) => axios .post(state.dismissEndpoint, { diff --git a/app/assets/javascripts/projects/new/components/new_project_url_select.vue b/app/assets/javascripts/projects/new/components/new_project_url_select.vue index 506f1ec5ffd..e6a02a0d67d 100644 --- a/app/assets/javascripts/projects/new/components/new_project_url_select.vue +++ b/app/assets/javascripts/projects/new/components/new_project_url_select.vue @@ -7,6 +7,7 @@ import { GlDropdownText, GlDropdownSectionHeader, GlSearchBoxByType, + GlTruncate, } from '@gitlab/ui'; import { joinPaths, PATH_SEPARATOR } from '~/lib/utils/url_utility'; import { MINIMUM_SEARCH_LENGTH } from '~/graphql_shared/constants'; @@ -26,6 +27,7 @@ export default { GlDropdownText, GlDropdownSectionHeader, GlSearchBoxByType, + GlTruncate, }, mixins: [Tracking.mixin()], apollo: { @@ -137,13 +139,20 @@ export default { > <gl-dropdown - :text="selectedNamespace.fullPath" class="js-group-namespace-dropdown gl-flex-grow-1" :toggle-class="`gl-rounded-top-right-base! gl-rounded-bottom-right-base! gl-w-20 ${dropdownPlaceholderClass}`" data-qa-selector="select_namespace_dropdown" @show="track('activate_form_input', { label: trackLabel, property: 'project_path' })" @shown="handleDropdownShown" > + <template #button-text> + <gl-truncate + v-if="selectedNamespace.fullPath" + :text="selectedNamespace.fullPath" + position="start" + with-tooltip + /> + </template> <gl-search-box-by-type ref="search" v-model.trim="search" diff --git a/app/assets/javascripts/projects/project_visibility.js b/app/assets/javascripts/projects/project_visibility.js index d299e106b14..2a4916ecabf 100644 --- a/app/assets/javascripts/projects/project_visibility.js +++ b/app/assets/javascripts/projects/project_visibility.js @@ -10,7 +10,7 @@ const visibilityLevel = { }; function setVisibilityOptions({ name, visibility, showPath, editPath }) { - document.querySelectorAll('.visibility-level-setting .form-check').forEach((option) => { + document.querySelectorAll('.visibility-level-setting .gl-form-radio').forEach((option) => { // Don't change anything if the option is restricted by admin if (option.classList.contains('restricted')) { return; @@ -24,7 +24,7 @@ function setVisibilityOptions({ name, visibility, showPath, editPath }) { optionInput.disabled = true; const reason = option.querySelector('.option-disabled-reason'); if (reason) { - const optionTitle = option.querySelector('.option-title'); + const optionTitle = option.querySelector('.form-check-label span'); const optionName = optionTitle ? optionTitle.innerText.toLowerCase() : ''; reason.innerHTML = sprintf( __( diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss index 0c7b74684cc..d0f058f6c68 100644 --- a/app/assets/stylesheets/pages/settings.scss +++ b/app/assets/stylesheets/pages/settings.scss @@ -156,39 +156,33 @@ } .visibility-level-setting { - .form-check { - margin-bottom: 10px; - - .option-title { - font-weight: $gl-font-weight-normal; - display: inline-block; - color: $gl-text-color; - vertical-align: top; - } + .option-title { + font-weight: $gl-font-weight-normal; + display: inline-block; + color: $gl-text-color; + vertical-align: top; + } - .option-description, - .option-disabled-reason { - margin-left: 20px; - color: $project-option-descr-color; - margin-top: -5px; + .option-description, + .option-disabled-reason { + color: $project-option-descr-color; + } + + .option-disabled-reason { + display: none; + } + + .disabled { + svg { + opacity: 0.5; } - .option-disabled-reason { + .option-description { display: none; } - &.disabled { - svg { - opacity: 0.5; - } - - .option-description { - display: none; - } - - .option-disabled-reason { - display: block; - } + .option-disabled-reason { + display: block; } } } diff --git a/app/serializers/issue_entity.rb b/app/serializers/issue_entity.rb index eba2c49bc2e..ea43ed87d22 100644 --- a/app/serializers/issue_entity.rb +++ b/app/serializers/issue_entity.rb @@ -73,7 +73,7 @@ class IssueEntity < IssuableEntity end expose :archived_project_docs_path, if: -> (issue) { issue.project.archived? } do |issue| - help_page_path('user/project/settings/index.md', anchor: 'archiving-a-project') + help_page_path('user/project/settings/index.md', anchor: 'archive-a-project') end expose :issue_email_participants do |issue| diff --git a/app/views/groups/settings/_general.html.haml b/app/views/groups/settings/_general.html.haml index 3e3de5d60e0..0535205925a 100644 --- a/app/views/groups/settings/_general.html.haml +++ b/app/views/groups/settings/_general.html.haml @@ -1,4 +1,4 @@ -= form_for @group, html: { multipart: true, class: 'gl-show-field-errors js-general-settings-form' }, authenticity_token: true do |f| += gitlab_ui_form_for @group, html: { multipart: true, class: 'gl-show-field-errors js-general-settings-form' }, authenticity_token: true do |f| %input{ type: 'hidden', name: 'update_section', value: 'js-general-settings' } = form_errors(@group, pajamas_alert: true) diff --git a/app/views/projects/_remove.html.haml b/app/views/projects/_remove.html.haml index d0dfbb89ca7..ed238dab4ff 100644 --- a/app/views/projects/_remove.html.haml +++ b/app/views/projects/_remove.html.haml @@ -7,7 +7,7 @@ %h4.danger-title= _('Delete project') %p %strong= _('Deleting the project will delete its repository and all related resources, including issues and merge requests.') - = link_to _('Learn more.'), help_page_path('user/project/settings/index', anchor: 'removing-a-fork-relationship'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('user/project/settings/index', anchor: 'remove-a-fork-relationship'), target: '_blank', rel: 'noopener noreferrer' %p %strong= _('Deleted projects cannot be restored!') #js-project-delete-button{ data: { form_path: project_path(project), confirm_phrase: delete_confirm_phrase(project), is_fork: project.forked?.to_s, issues_count: number_with_delimiter(issues_count), merge_requests_count: number_with_delimiter(merge_requests_count), forks_count: number_with_delimiter(forks_count), stars_count: number_with_delimiter(project.star_count) } } diff --git a/app/views/projects/_remove_fork.html.haml b/app/views/projects/_remove_fork.html.haml index bb51aa86170..bfc1e77118a 100644 --- a/app/views/projects/_remove_fork.html.haml +++ b/app/views/projects/_remove_fork.html.haml @@ -8,5 +8,5 @@ = form_for @project, url: remove_fork_project_path(@project), method: :delete, html: { id: remove_form_id } do |f| %p %strong= _('Once removed, the fork relationship cannot be restored. This project will no longer be able to receive or send merge requests to the source project or other forks.') - = link_to _('Learn more.'), help_page_path('user/project/settings/index', anchor: 'removing-a-fork-relationship'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('user/project/settings/index', anchor: 'remove-a-fork-relationship'), target: '_blank', rel: 'noopener noreferrer' .js-confirm-danger{ data: remove_fork_project_confirm_json(@project, remove_form_id) } diff --git a/app/views/projects/_transfer.html.haml b/app/views/projects/_transfer.html.haml index 9e6648c71fc..393b199fb05 100644 --- a/app/views/projects/_transfer.html.haml +++ b/app/views/projects/_transfer.html.haml @@ -7,7 +7,7 @@ %h4.danger-title= _('Transfer project') = form_for @project, url: transfer_project_path(@project), method: :put, html: { class: 'js-project-transfer-form', id: form_id } do |f| .form-group - - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'transferring-an-existing-project-into-another-namespace') } + - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'transfer-a-project-to-another-namespace') } %p= _("Transfer your project into another namespace. %{link_start}Learn more.%{link_end}").html_safe % { link_start: link_start, link_end: '</a>'.html_safe } %p= _('When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier.') %p diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 41d6b7086c1..d61f359294a 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -90,7 +90,7 @@ = render 'projects/errors' = form_for @project do |f| .form-group - - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'renaming-a-repository') } + - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'rename-a-repository') } %p= _("A project’s repository name defines its URL (the one you use to access the project via a browser) and its place on the file disk where GitLab is installed. %{link_start}Learn more.%{link_end}").html_safe % { link_start: link_start, link_end: '</a>'.html_safe } %ul %li= _("Be careful. Renaming a project's repository can have unintended side effects.") diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 511adf37b39..07c38d9845c 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -12,7 +12,7 @@ .row{ 'v-cloak': true } #blank-project-pane.tab-pane.active - = form_for @project, html: { class: 'new_project gl-mt-3' } do |f| + = gitlab_ui_form_for @project, html: { class: 'new_project gl-mt-3' } do |f| = render 'new_project_fields', f: f, project_name_id: "blank-project-name" #create-from-template-pane.tab-pane @@ -22,7 +22,7 @@ - contributing_templates_url = 'https://gitlab.com/gitlab-org/project-templates/contributing' - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: contributing_templates_url } = _('Learn how to %{link_start}contribute to the built-in templates%{link_end}').html_safe % { link_start: link_start, link_end: '</a>'.html_safe } - = form_for @project, html: { class: 'new_project' } do |f| + = gitlab_ui_form_for @project, html: { class: 'new_project' } do |f| .project-template .form-group %div diff --git a/app/views/projects/settings/_archive.html.haml b/app/views/projects/settings/_archive.html.haml index 8a080241513..2f97a068b49 100644 --- a/app/views/projects/settings/_archive.html.haml +++ b/app/views/projects/settings/_archive.html.haml @@ -7,14 +7,14 @@ - else = _('Archive project') - if @project.archived? - - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'unarchiving-a-project') } + - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'unarchive-a-project') } %p= _("Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}").html_safe % { strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe, link_start: link_start, link_end: '</a>'.html_safe } = link_to _('Unarchive project'), unarchive_project_path(@project), aria: { label: _('Unarchive project') }, data: { confirm: _("Are you sure that you want to unarchive this project?"), qa_selector: 'unarchive_project_link' }, method: :post, class: "gl-button btn btn-confirm" - else - - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'archiving-a-project') } + - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'archive-a-project') } %p= _("Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}").html_safe % { strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe, link_start: link_start, link_end: '</a>'.html_safe } = link_to _('Archive project'), archive_project_path(@project), aria: { label: _('Archive project') }, diff --git a/app/views/shared/_visibility_radios.html.haml b/app/views/shared/_visibility_radios.html.haml index 760fe18ddec..efb39ee74ce 100644 --- a/app/views/shared/_visibility_radios.html.haml +++ b/app/views/shared/_visibility_radios.html.haml @@ -2,15 +2,13 @@ - selected_level = snippets_selected_visibility_level(available_visibility_levels, selected_level) - available_visibility_levels.each do |level| - .form-check - = form.radio_button model_method, level, checked: (selected_level == level), class: 'form-check-input', data: { track_label: "blank_project", track_action: "activate_form_input", track_property: "#{model_method}_#{level}", track_value: "", qa_selector: "#{visibility_level_label(level).downcase}_radio" } - = form.label "#{model_method}_#{level}", class: 'form-check-label' do - = visibility_level_icon(level) - .option-title - = visibility_level_label(level) - .option-description - = visibility_level_description(level, form_model) - .option-disabled-reason + + = form.gitlab_ui_radio_component model_method, level, + "#{visibility_level_icon(level)} #{visibility_level_label(level)}".html_safe, + help_text: '<span class="option-description">%{visibility_level_description}</span><span class="option-disabled-reason"></span>'.html_safe % { visibility_level_description: visibility_level_description(level, form_model)}, + radio_options: { checked: (selected_level == level), data: { track_label: "blank_project", track_action: "activate_form_input", track_property: "#{model_method}_#{level}", track_value: "", qa_selector: "#{visibility_level_label(level).downcase}_radio" } }, + label_options: { class: 'form-check-label gl-mb-2' } + .text-muted - if all_visibility_levels_restricted? diff --git a/doc/administration/operations/moving_repositories.md b/doc/administration/operations/moving_repositories.md index 1459b707e5c..1de04978958 100644 --- a/doc/administration/operations/moving_repositories.md +++ b/doc/administration/operations/moving_repositories.md @@ -385,6 +385,6 @@ See the following for information on troubleshooting repository moves. ### Repository move fails for archived projects Because of a [known issue](https://gitlab.com/gitlab-org/gitlab/-/issues/363670), -[archived projects](../../user/project/settings/index.md#advanced-settings) fail to move even though the data is cloned +[archived projects](../../user/project/settings/index.md#advanced-project-settings) fail to move even though the data is cloned by Gitaly. Make sure archived projects are -[unarchived](../../user/project/settings/index.md#unarchiving-a-project) before initiating a move. +[unarchived](../../user/project/settings/index.md#unarchive-a-project) before initiating a move. diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md index 2fa3eea54bd..43548d21f70 100644 --- a/doc/administration/packages/container_registry.md +++ b/doc/administration/packages/container_registry.md @@ -1389,7 +1389,7 @@ project or branch name. Special characters can include: - Double hyphen/dash To get around this, you can [change the group path](../../user/group/index.md#change-a-groups-path), -[change the project path](../../user/project/settings/index.md#renaming-a-repository) or change the +[change the project path](../../user/project/settings/index.md#rename-a-repository) or change the branch name. Another option is to create a [push rule](../../user/project/repository/push_rules.md) to prevent this at the instance level. diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md index 619080708de..7d67c648bc8 100644 --- a/doc/administration/pages/index.md +++ b/doc/administration/pages/index.md @@ -1395,7 +1395,7 @@ this setting needs to be configured on the main GitLab server. If the wildcard DNS [prerequisite](#prerequisites) can't be met, you can still use GitLab Pages in a limited fashion: -1. [Move](../../user/project/settings/index.md#transferring-an-existing-project-into-another-namespace) +1. [Move](../../user/project/settings/index.md#transfer-a-project-to-another-namespace) all projects you need to use Pages with into a single group namespace, for example `pages`. 1. Configure a [DNS entry](#dns-configuration) without the `*.`-wildcard, for example `pages.example.io`. 1. Configure `pages_external_url http://example.io/` in your `gitlab.rb` file. diff --git a/doc/api/projects.md b/doc/api/projects.md index 45c675c0b82..e5e5735aac6 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -2662,7 +2662,7 @@ DELETE /projects/:id/push_rule > The `_links.cluster_agents` attribute in the response [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347047) in GitLab 14.10. -See the [Project documentation](../user/project/settings/index.md#transferring-an-existing-project-into-another-namespace) +See the [Project documentation](../user/project/settings/index.md#transfer-a-project-to-another-namespace) for prerequisites to transfer a project. ```plaintext diff --git a/doc/tutorials/move_personal_project_to_a_group.md b/doc/tutorials/move_personal_project_to_a_group.md index f8b91792780..fdda42be3fa 100644 --- a/doc/tutorials/move_personal_project_to_a_group.md +++ b/doc/tutorials/move_personal_project_to_a_group.md @@ -77,7 +77,7 @@ project. NOTE: For more information about these migration steps, -see [Transferring your project into another namespace](../user/project/settings/index.md#transferring-an-existing-project-into-another-namespace). +see [Transferring your project into another namespace](../user/project/settings/index.md#transfer-a-project-to-another-namespace). A migration might result in follow-up work to update the project path in your related resources and tools, such as websites and package managers. diff --git a/doc/user/group/index.md b/doc/user/group/index.md index 0d1599503ef..d1072ecb17e 100644 --- a/doc/user/group/index.md +++ b/doc/user/group/index.md @@ -865,7 +865,7 @@ Support for group-level settings for merge request approval rules is tracked in - [Audit Events](../../administration/audit_events.md#group-events). - [CI/CD minutes quota](../../ci/pipelines/cicd_minutes.md): Keep track of the CI/CD minute quota for the group. - [Integrations](../admin_area/settings/project_integration_management.md). -- [Transfer a project into a group](../project/settings/index.md#transferring-an-existing-project-into-another-namespace). +- [Transfer a project into a group](../project/settings/index.md#transfer-a-project-to-another-namespace). - [Share a project with a group](../project/members/share_project_with_groups.md): Give all group members access to the project at once. - [Lock the sharing with group feature](#prevent-a-project-from-being-shared-with-groups). - [Enforce two-factor authentication (2FA)](../../security/two_factor_authentication.md#enforce-2fa-for-all-users-in-a-group): Enforce 2FA diff --git a/doc/user/packages/container_registry/index.md b/doc/user/packages/container_registry/index.md index ae64c419632..f33e3c79bad 100644 --- a/doc/user/packages/container_registry/index.md +++ b/doc/user/packages/container_registry/index.md @@ -564,7 +564,7 @@ project or branch name. Special characters can include: - Trailing hyphen/dash To get around this, you can [change the group path](../../group/index.md#change-a-groups-path), -[change the project path](../../project/settings/index.md#renaming-a-repository) or change the branch +[change the project path](../../project/settings/index.md#rename-a-repository) or change the branch name. You may also get a `404 Not Found` or `Unknown Manifest` message if you are using diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md index 07f21da3099..bf696310158 100644 --- a/doc/user/profile/index.md +++ b/doc/user/profile/index.md @@ -130,7 +130,7 @@ GitLab displays the contents of your README below your contribution graph. ### From an existing project To add the README from an existing project to your profile, -[update the path](../project/settings/index.md#renaming-a-repository) of the project +[update the path](../project/settings/index.md#rename-a-repository) of the project to match your username. ## Add external accounts to your user profile page diff --git a/doc/user/project/merge_requests/creating_merge_requests.md b/doc/user/project/merge_requests/creating_merge_requests.md index 6ee02238a22..f30b20e9d34 100644 --- a/doc/user/project/merge_requests/creating_merge_requests.md +++ b/doc/user/project/merge_requests/creating_merge_requests.md @@ -104,7 +104,7 @@ You can create a merge request from your fork to contribute back to the main pro After your work is merged, if you don't intend to make any other contributions to the upstream project, you can unlink your fork from its upstream project. Go to **Settings > Advanced Settings** and -[remove the forking relationship](../settings/index.md#removing-a-fork-relationship). +[remove the forking relationship](../settings/index.md#remove-a-fork-relationship). For more information, [see the forking workflow documentation](../repository/forking_workflow.md). diff --git a/doc/user/project/repository/forking_workflow.md b/doc/user/project/repository/forking_workflow.md index 0e6c98457c7..85bea80f777 100644 --- a/doc/user/project/repository/forking_workflow.md +++ b/doc/user/project/repository/forking_workflow.md @@ -68,4 +68,4 @@ changes are added to the repository and branch you're merging into. ## Removing a fork relationship -You can unlink your fork from its upstream project in the [advanced settings](../settings/index.md#removing-a-fork-relationship). +You can unlink your fork from its upstream project in the [advanced settings](../settings/index.md#remove-a-fork-relationship). diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md index 02b5639cae8..7caf88f1faa 100644 --- a/doc/user/project/repository/index.md +++ b/doc/user/project/repository/index.md @@ -232,7 +232,7 @@ When a repository path changes, GitLab handles the transition from the old location to the new one with a redirect. When you [rename a user](../../profile/index.md#change-your-username), -[change a group path](../../group/index.md#change-a-groups-path), or [rename a repository](../settings/index.md#renaming-a-repository): +[change a group path](../../group/index.md#change-a-groups-path), or [rename a repository](../settings/index.md#rename-a-repository): - URLs for the namespace and everything under it, like projects, are redirected to the new URLs. diff --git a/doc/user/project/repository/web_editor.md b/doc/user/project/repository/web_editor.md index 370a349b982..4ca341f0535 100644 --- a/doc/user/project/repository/web_editor.md +++ b/doc/user/project/repository/web_editor.md @@ -137,7 +137,7 @@ The **Create merge request** button doesn't display if: - Your project has an active fork relationship. To make this button appear, one possible workaround is to -[remove your project's fork relationship](../settings/index.md#removing-a-fork-relationship). +[remove your project's fork relationship](../settings/index.md#remove-a-fork-relationship). After removal, the fork relationship cannot be restored. This project can no longer be able to receive or send merge requests to the source project, or other forks. diff --git a/doc/user/project/settings/index.md b/doc/user/project/settings/index.md index 46a6c1a049e..7d1bfcaab59 100644 --- a/doc/user/project/settings/index.md +++ b/doc/user/project/settings/index.md @@ -278,24 +278,34 @@ When you disable a feature, the following additional features are also disabled: - Metrics dashboard access requires reading project environments and deployments. Users with access to the metrics dashboard can also access environments and deployments. -## Disabling the CVE ID request button **(FREE SAAS)** +## Disable CVE identifier request in issues **(FREE SAAS)** > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41203) in GitLab 13.4, only for public projects on GitLab.com. -In applicable environments, a [**Create CVE ID Request** button](../../application_security/cve_id_request.md) -is present in the issue sidebar. The button may be disabled on a per-project basis by toggling the -setting **Enable CVE ID requests in the issue sidebar**. +In some environments, users can submit a [CVE identifier request](../../application_security/cve_id_request.md) in an issue. -![CVE ID Request toggle](img/cve_id_request_toggle.png) +To disable the CVE identifier request option in issues in your project: -## Disabling email notifications +1. On the top bar, select **Menu > Projects** and find your project. +1. On the left sidebar, select **Settings > General**. +1. Expand the **Visibility, project features, permissions** section. +1. Under **Issues**, turn off the **CVE ID requests in the issue sidebar** toggle. +1. Select **Save changes**. + +## Disable project email notifications -Project owners can disable all [email notifications](../../profile/notifications.md) -related to the project by selecting the **Disable email notifications** checkbox. +Prerequisites: + +- You must be an Owner of the project to disable email notifications related to the project. + +1. On the top bar, select **Menu > Projects** and find your project. +1. On the left sidebar, select **Settings > General**. +1. Expand the **Visibility, project features, permissions** section. +1. Clear the **Disable email notifications** checkbox. ## Configure merge request settings for a project -Set up your project's merge request settings: +Configure your project's merge request settings: - Set up the [merge request method](../merge_requests/methods/index.md) (merge commit, fast-forward merge). - Add merge request [description templates](../description_templates.md#description-templates). @@ -317,91 +327,74 @@ Enable [Service Desk](../service_desk.md) for your project to offer customer sup Learn how to [export a project](import_export.md#import-a-project-and-its-data) in GitLab. -## Advanced settings +## Advanced project settings -Here you can run housekeeping, archive, rename, transfer, -[remove a fork relationship](#removing-a-fork-relationship), or delete a project. +Use the advanced settings to archive, rename, transfer, +remove a fork relationship, or delete a project. -## Archiving a project +### Archive a project -Archiving a project makes it read-only for all users and indicates that it's -no longer actively maintained. Projects that have been archived can also be -unarchived. Only project owners and administrators have the -[permissions](../../permissions.md#project-members-permissions) to archive a project. - -When a project is archived, the repository, packages, issues, merge requests, and all -other features are read-only. Archived projects are also hidden -in project listings. +When you archive a project, the repository, packages, issues, merge requests, and all +other features are read-only. Archived projects are also hidden from project listings. To archive a project: -1. Navigate to your project's **Settings > General**. -1. Under **Advanced**, select **Expand**. +1. On the top bar, select **Menu > Projects** and find your project. +1. On the left sidebar, select **Settings > General**. +1. Expand **Advanced**. 1. In the **Archive project** section, select **Archive project**. -1. Confirm the action when asked to. - -## Unarchiving a project +1. To confirm, select **OK**. -Unarchiving a project removes the read-only restriction on a project, and makes it -available in project listings. Only project owners and administrators have the -[permissions](../../permissions.md#project-members-permissions) to unarchive a project. +### Unarchive a project -To find an archived project: +When you unarchive a project, you remove the read-only restriction and make it +available in project lists. -1. Sign in to GitLab as the project owner or a user with administrator access. -1. If you: - - Have the project's URL, open the project's page in your browser. - - Don't have the project's URL: - 1. On the top bar, select **Menu > Project**. - 1. Select **Explore projects**. - 1. In the **Sort projects** dropdown box, select **Show archived projects**. - 1. In the **Filter by name** field, provide the project's name. - 1. Select the link to the project to open its **Details** page. +Prerequisites: -Next, to unarchive the project: +- To unarchive a project, you must be an administrator or a project Owner. -1. Navigate to your project's **Settings > General**. +1. Find the archived project. + 1. On the top bar, select **Menu > Project**. + 1. Select **Explore projects**. + 1. In the **Sort projects** dropdown list, select **Show archived projects**. + 1. In the **Filter by name** field, enter the project name. + 1. Select the project link. +1. On the left sidebar, select **Settings > General**. 1. Under **Advanced**, select **Expand**. 1. In the **Unarchive project** section, select **Unarchive project**. -1. Confirm the action when asked to. +1. To confirm, select **OK**. -## Renaming a repository +### Rename a repository -NOTE: -Only project maintainers and administrators have the [permissions](../../permissions.md#project-members-permissions) to rename a -repository. Not to be confused with a project's name where it can also be -changed from the [general project settings](#edit-project-name-and-description). - -A project's repository name defines its URL (the one you use to access the -project via a browser) and its place on the file disk where GitLab is installed. +A project's repository name defines its URL and its place on the file disk +where GitLab is installed. -To rename a repository: +Prerequisites: -1. Navigate to your project's **Settings > General**. -1. Under **Advanced**, select **Expand**. -1. Under **Change path**, update the repository's path. -1. Select **Change path**. +You must be a project maintainer or administrator to rename a repository. -Remember that this can have unintended side effects since everyone with the -old URL can't push or pull. Read more about what happens with the +NOTE: +When you change the repository path, users may experience issues if they push to, or pull from, the old URL. For more information, see [redirects when renaming repositories](../repository/index.md#what-happens-when-a-repository-path-changes). -## Transferring an existing project into another namespace +To rename a repository: -NOTE: -Only project owners and administrators have the [permissions](../../permissions.md#project-members-permissions) -to transfer a project. +1. On the top bar, select **Menu > Projects** and find your project. +1. On the left sidebar, select **Settings > General**. +1. Expand the **Advanced** section. +1. In the **Change path** text box, edit the path. +1. Select **Change path**. + +## Transfer a project to another namespace -You can transfer an existing project to another [group](../../group/index.md), -or you can transfer a [personal project](../working_with_projects.md#view-personal-projects) to a group. +When you transfer a project to another namespace, you move the project to a different group. Prerequisites: -- A group for your project. You can [view your existing groups](../../group/index.md#view-groups) - to find a suitable group. If you don't have a group, [create one](../../group/index.md#create-a-group). -- You must have at least the Maintainer role in that group. -- You must be the Owner of that project. -- The group to which the project is being transferred to must allow creation of new projects. +- You must have at least the Maintainer role for the [group](../../group/index.md#create-a-group) to which you are transferring. +- You must be the Owner of the project you transfer. +- The group must allow creation of new projects. - The project must not contain any [container images](../../packages/container_registry/index.md#limitations). - If you transfer a project to a different root namespace, the project must not contain any @@ -416,19 +409,18 @@ To transfer a project: 1. Select **Transfer project**. 1. Enter the project's name and select **Confirm**. -You are redirected to the project's new URL. Read what happens with the -[redirects from the old URL to the new one](../repository/index.md#what-happens-when-a-repository-path-changes). +You are redirected to the project's new page and GitLab applies a redirect. For more information about repository redirects, see [What happens when a repository path changes](../repository/index.md#what-happens-when-a-repository-path-changes). NOTE: -GitLab administrators can use the [administration interface](../../admin_area/index.md#administering-projects) -to move any project to any namespace if needed. +If you are an administrator, you can also use the [administration interface](../../admin_area/index.md#administering-projects) +to move any project to any namespace. -## Transferring a GitLab.com project to a different subscription tier +### Transferring a GitLab SaaS project to a different subscription tier -When you transfer a project from a namespace that's licensed for GitLab SaaS Premium or Ultimate to Free, some data related to the paid features is deleted. +When you transfer a project from a namespace licensed for GitLab SaaS Premium or Ultimate to GitLab Free, the following paid feature data is deleted: -For example, [project access tokens](../../../user/project/settings/project_access_tokens.md) are revoked, and -[pipeline subscriptions](../../../ci/pipelines/multi_project_pipelines.md#trigger-a-pipeline-when-an-upstream-project-is-rebuilt) +- [Project access tokens](../../../user/project/settings/project_access_tokens.md) are revoked +- [Pipeline subscriptions](../../../ci/pipelines/multi_project_pipelines.md#trigger-a-pipeline-when-an-upstream-project-is-rebuilt) and [test cases](../../../ci/test_cases/index.md) are deleted. ## Delete a project @@ -460,7 +452,7 @@ in GitLab 12.6, and then to [immediate deletion](https://gitlab.com/gitlab-org/g Projects can be deleted after a delay period. Multiple settings can affect whether delayed project deletion is enabled for a particular project: -- Self-managed instance [settings](../../admin_area/settings/visibility_and_access_controls.md#deletion-protection). +- Self-managed instance [settings](../../admin_area/settings/visibility_and_access_controls.md#delayed-project-deletion). You can enable delayed project deletion as the default setting for new groups, and configure the number of days for the delay. For GitLab.com, see the [GitLab.com settings](../../gitlab_com/index.md#delayed-project-deletion). - Group [settings](../../group/index.md#enable-delayed-project-deletion) to enabled delayed project deletion for all @@ -499,27 +491,23 @@ To restore a project marked for deletion: 1. Navigate to your project, and select **Settings > General > Advanced**. 1. In the Restore project section, select **Restore project**. -## Removing a fork relationship +## Remove a fork relationship + +Prerequisites: -Forking is a great way to [contribute to a project](../repository/forking_workflow.md) -of which you're not a member. -If you want to use the fork for yourself and don't need to send -[merge requests](../merge_requests/index.md) to the upstream project, -you can safely remove the fork relationship. +- You must be a project owner to remove a fork relationship. WARNING: -Once removed, you can't send merge requests to the source, and if anyone has forked your project, their fork also loses the relationship. +If you remove a fork relationship, you can't send merge requests to the source. If anyone has forked your project, their fork also loses the relationship. To restore the fork relationship, [use the API](../../../api/projects.md#create-a-forked-fromto-relation-between-existing-projects). -To do so: +To remove a fork relationship: -1. Navigate to your project's **Settings > General > Advanced**. -1. Under **Remove fork relationship**, select the likewise-labeled button. -1. Confirm the action by typing the project's path as instructed. - -NOTE: -Only project owners have the [permissions](../../permissions.md#project-members-permissions) -to remove a fork relationship. +1. On the top bar, select **Menu > Projects** and find your project. +1. On the left sidebar, select **Settings > General**. +1. Expand **Advanced**. +1. In the **Remove fork relationship** section, select **Remove fork relationship**. +1. To confirm, enter the project path and select **Confirm**. ## Monitor settings diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md index 13d613a0cf3..9572bc241fc 100644 --- a/doc/user/project/working_with_projects.md +++ b/doc/user/project/working_with_projects.md @@ -198,7 +198,7 @@ GitLab creates your project in your chosen namespace. You cannot use `git push` to create projects with project paths that: - Have previously been used. -- Have been [renamed](settings/index.md#renaming-a-repository). +- Have been [renamed](settings/index.md#rename-a-repository). Previously used project paths have a redirect. The redirect causes push attempts to redirect requests to the renamed project location, instead of creating a new project. To create a new project for a previously diff --git a/qa/qa/page/component/visibility_setting.rb b/qa/qa/page/component/visibility_setting.rb index 4370cfb4564..f07b9c1c455 100644 --- a/qa/qa/page/component/visibility_setting.rb +++ b/qa/qa/page/component/visibility_setting.rb @@ -15,7 +15,7 @@ module QA end def set_visibility(visibility) - choose_element("#{visibility.downcase}_radio", false, true) + find('label', text: visibility.capitalize).click end end end diff --git a/qa/qa/page/project/new.rb b/qa/qa/page/project/new.rb index 7da763ca0e6..7864e664429 100644 --- a/qa/qa/page/project/new.rb +++ b/qa/qa/page/project/new.rb @@ -76,7 +76,7 @@ module QA end def set_visibility(visibility) - choose visibility.capitalize + find('label', text: visibility.capitalize).click end # Disable experiment for SAST at project creation https://gitlab.com/gitlab-org/gitlab/-/issues/333196 diff --git a/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js b/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js index 172b510645d..9f50b12bac2 100644 --- a/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js +++ b/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js @@ -298,14 +298,18 @@ describe('Batch comments store actions', () => { const draft = { discussion_id: '1', id: '2', + file_path: 'lib/example.js', }; actions.scrollToDraft({ dispatch, rootGetters }, draft); - expect(dispatch.mock.calls[0]).toEqual([ - 'expandDiscussion', - { discussionId: '1' }, - { root: true }, + expect(dispatch.mock.calls).toEqual([ + [ + 'diffs/setFileCollapsedAutomatically', + { filePath: draft.file_path, collapsed: false }, + { root: true }, + ], + ['expandDiscussion', { discussionId: '1' }, { root: true }], ]); expect(window.mrTabs.tabShown).toHaveBeenCalledWith('diffs'); diff --git a/spec/frontend/projects/new/components/new_project_url_select_spec.js b/spec/frontend/projects/new/components/new_project_url_select_spec.js index ba22622e1f7..b6d4ee32cf5 100644 --- a/spec/frontend/projects/new/components/new_project_url_select_spec.js +++ b/spec/frontend/projects/new/components/new_project_url_select_spec.js @@ -4,6 +4,7 @@ import { GlDropdownItem, GlDropdownSectionHeader, GlSearchBoxByType, + GlTruncate, } from '@gitlab/ui'; import { mount, shallowMount } from '@vue/test-utils'; import Vue, { nextTick } from 'vue'; @@ -15,7 +16,6 @@ import { getIdFromGraphQLId } from '~/graphql_shared/utils'; import eventHub from '~/projects/new/event_hub'; import NewProjectUrlSelect from '~/projects/new/components/new_project_url_select.vue'; import searchQuery from '~/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql'; -import { s__ } from '~/locale'; describe('NewProjectUrlSelect component', () => { let wrapper; @@ -90,6 +90,7 @@ describe('NewProjectUrlSelect component', () => { const findButtonLabel = () => wrapper.findComponent(GlButton); const findDropdown = () => wrapper.findComponent(GlDropdown); + const findSelectedPath = () => wrapper.findComponent(GlTruncate); const findInput = () => wrapper.findComponent(GlSearchBoxByType); const findHiddenNamespaceInput = () => wrapper.find('[name="project[namespace_id]"]'); @@ -121,14 +122,15 @@ describe('NewProjectUrlSelect component', () => { describe('when namespaceId is provided', () => { beforeEach(() => { - wrapper = mountComponent(); + wrapper = mountComponent({ mountFn: mount }); }); it('renders a dropdown with the given namespace full path as the text', () => { - const dropdownProps = findDropdown().props(); + expect(findSelectedPath().props('text')).toBe(defaultProvide.namespaceFullPath); + }); - expect(dropdownProps.text).toBe(defaultProvide.namespaceFullPath); - expect(dropdownProps.toggleClass).not.toContain('gl-text-gray-500!'); + it('renders a dropdown without the class', () => { + expect(findDropdown().props('toggleClass')).not.toContain('gl-text-gray-500!'); }); it('renders a hidden input with the given namespace id', () => { @@ -150,14 +152,15 @@ describe('NewProjectUrlSelect component', () => { }; beforeEach(() => { - wrapper = mountComponent({ provide }); + wrapper = mountComponent({ provide, mountFn: mount }); }); it("renders a dropdown with the user's namespace full path as the text", () => { - const dropdownProps = findDropdown().props(); + expect(findSelectedPath().props('text')).toBe('Pick a group or namespace'); + }); - expect(dropdownProps.text).toBe(s__('ProjectsNew|Pick a group or namespace')); - expect(dropdownProps.toggleClass).toContain('gl-text-gray-500!'); + it('renders a dropdown with the class', () => { + expect(findDropdown().props('toggleClass')).toContain('gl-text-gray-500!'); }); it("renders a hidden input with the user's namespace id", () => { @@ -236,8 +239,8 @@ describe('NewProjectUrlSelect component', () => { expect(listItems.at(2).text()).toBe(data.currentUser.groups.nodes[2].fullPath); }); - it('sets the selection to the group', async () => { - expect(findDropdown().props('text')).toBe(fullPath); + it('sets the selection to the group', () => { + expect(findSelectedPath().props('text')).toBe(fullPath); }); }); diff --git a/spec/serializers/issue_entity_spec.rb b/spec/serializers/issue_entity_spec.rb index 9525ed02314..6b9c703c627 100644 --- a/spec/serializers/issue_entity_spec.rb +++ b/spec/serializers/issue_entity_spec.rb @@ -139,7 +139,7 @@ RSpec.describe IssueEntity do end it 'returns archived project doc' do - expect(subject[:archived_project_docs_path]).to eq('/help/user/project/settings/index.md#archiving-a-project') + expect(subject[:archived_project_docs_path]).to eq('/help/user/project/settings/index.md#archive-a-project') end end end |