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:
-rw-r--r--.gitlab/ci/qa-common/main.gitlab-ci.yml2
-rw-r--r--.rubocop_todo/rspec/feature_category.yml1
-rw-r--r--.rubocop_todo/rspec/named_subject.yml1
-rw-r--r--GITLAB_PAGES_VERSION2
-rw-r--r--app/assets/javascripts/ci/job_details/components/log/log.vue28
-rw-r--r--app/assets/javascripts/ci/job_details/job_app.vue1
-rw-r--r--app/assets/javascripts/ci/job_details/store/actions.js73
-rw-r--r--app/assets/javascripts/ci/job_details/store/mutation_types.js2
-rw-r--r--app/assets/javascripts/ci/job_details/store/mutations.js5
-rw-r--r--app/assets/javascripts/ci/job_details/store/state.js3
-rw-r--r--app/assets/javascripts/frequent_items/components/app.vue183
-rw-r--r--app/assets/javascripts/frequent_items/components/frequent_items_list.vue90
-rw-r--r--app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue132
-rw-r--r--app/assets/javascripts/frequent_items/components/frequent_items_mixin.js23
-rw-r--r--app/assets/javascripts/frequent_items/components/frequent_items_search_input.vue63
-rw-r--r--app/assets/javascripts/frequent_items/constants.js54
-rw-r--r--app/assets/javascripts/frequent_items/event_hub.js3
-rw-r--r--app/assets/javascripts/frequent_items/store/actions.js112
-rw-r--r--app/assets/javascripts/frequent_items/store/getters.js1
-rw-r--r--app/assets/javascripts/frequent_items/store/index.js29
-rw-r--r--app/assets/javascripts/frequent_items/store/mutation_types.js12
-rw-r--r--app/assets/javascripts/frequent_items/store/mutations.js88
-rw-r--r--app/assets/javascripts/frequent_items/store/state.js11
-rw-r--r--app/assets/javascripts/frequent_items/utils.js67
-rw-r--r--app/assets/javascripts/import/details/components/bulk_import_details_app.vue23
-rw-r--r--app/assets/javascripts/import/details/components/import_details_table.vue2
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_table.vue8
-rw-r--r--app/assets/javascripts/issues/show/components/header_actions.vue2
-rw-r--r--app/assets/javascripts/lib/utils/vuex_module_mappers.js92
-rw-r--r--app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue13
-rw-r--r--app/assets/javascripts/pages/import/history/components/import_history_app.vue4
-rw-r--r--app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue2
-rw-r--r--app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue4
-rw-r--r--app/assets/javascripts/super_sidebar/constants.js12
-rw-r--r--app/assets/javascripts/super_sidebar/utils.js2
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/header.vue498
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/header_divider.vue16
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue2
-rw-r--r--app/assets/stylesheets/_page_specific_files.scss1
-rw-r--r--app/assets/stylesheets/framework/dropdowns.scss89
-rw-r--r--app/assets/stylesheets/framework/header.scss14
-rw-r--r--app/assets/stylesheets/page_bundles/notes.scss (renamed from app/assets/stylesheets/pages/notes.scss)6
-rw-r--r--app/finders/concerns/packages/finder_helper.rb15
-rw-r--r--app/finders/packages/maven/package_finder.rb11
-rw-r--r--app/helpers/json_helper.rb14
-rw-r--r--app/views/groups/work_items/index.html.haml1
-rw-r--r--app/views/import/bulk_imports/details.html.haml5
-rw-r--r--app/views/import/bulk_imports/history.html.haml5
-rw-r--r--app/views/import/bulk_imports/status.html.haml4
-rw-r--r--app/views/layouts/_head.html.haml4
-rw-r--r--app/views/projects/_service_desk_settings.html.haml2
-rw-r--r--app/views/projects/commit/show.html.haml1
-rw-r--r--app/views/projects/commits/show.html.haml1
-rw-r--r--app/views/projects/issues/service_desk/_alert_moved_from_service_desk.html.haml2
-rw-r--r--app/views/projects/issues/service_desk/_service_desk_empty_state.html.haml2
-rw-r--r--app/views/projects/issues/service_desk/_service_desk_info_content.html.haml2
-rw-r--r--app/views/projects/issues/show.html.haml1
-rw-r--r--app/views/projects/merge_requests/creations/new.html.haml1
-rw-r--r--app/views/projects/merge_requests/diffs.html.haml1
-rw-r--r--app/views/projects/merge_requests/index.html.haml1
-rw-r--r--app/views/projects/merge_requests/show.html.haml1
-rw-r--r--app/views/projects/work_items/show.html.haml1
-rw-r--r--app/views/snippets/edit.html.haml1
-rw-r--r--app/views/snippets/new.html.haml1
-rw-r--r--app/views/snippets/show.html.haml1
-rw-r--r--config/application.rb1
-rw-r--r--config/events/20210915205107_default_click_link.yml20
-rw-r--r--config/feature_flags/development/maven_remove_permissions_check_from_finder.yml8
-rwxr-xr-xconfig/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20231116002424_p_ci_templates_diffblue_cover_monthly.yml24
-rwxr-xr-xconfig/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20231116002421_p_ci_templates_diffblue_cover_weekly.yml24
-rw-r--r--doc/administration/admin_area.md48
-rw-r--r--doc/administration/analytics/dev_ops_reports.md3
-rw-r--r--doc/administration/analytics/index.md3
-rw-r--r--doc/administration/analytics/usage_trends.md3
-rw-r--r--doc/administration/appearance.md6
-rw-r--r--doc/administration/audit_event_streaming/index.md36
-rw-r--r--doc/administration/audit_events.md6
-rw-r--r--doc/administration/auditor_users.md3
-rw-r--r--doc/administration/auth/ldap/ldap-troubleshooting.md3
-rw-r--r--doc/administration/auth/ldap/ldap_synchronization.md6
-rw-r--r--doc/administration/backup_restore/index.md204
-rw-r--r--doc/administration/backup_restore/migrate_to_new_server.md210
-rw-r--r--doc/administration/broadcast_messages.md9
-rw-r--r--doc/administration/credentials_inventory.md9
-rw-r--r--doc/administration/custom_project_templates.md3
-rw-r--r--doc/administration/diff_limits.md3
-rw-r--r--doc/administration/email_from_gitlab.md3
-rw-r--r--doc/administration/external_users.md3
-rw-r--r--doc/administration/geo/disaster_recovery/background_verification.md9
-rw-r--r--doc/administration/geo/disaster_recovery/planned_failover.md9
-rw-r--r--doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md3
-rw-r--r--doc/administration/geo/index.md5
-rw-r--r--doc/administration/geo/replication/configuration.md6
-rw-r--r--doc/administration/geo/replication/container_registry.md3
-rw-r--r--doc/administration/geo/replication/disable_geo.md3
-rw-r--r--doc/administration/geo/replication/object_storage.md3
-rw-r--r--doc/administration/geo/replication/remove_geo_site.md3
-rw-r--r--doc/administration/geo/replication/troubleshooting.md9
-rw-r--r--doc/administration/geo/replication/tuning.md3
-rw-r--r--doc/administration/geo/setup/two_single_node_external_services.md10
-rw-r--r--doc/administration/geo/setup/two_single_node_sites.md10
-rw-r--r--doc/administration/geo_sites.md6
-rw-r--r--doc/administration/gitaly/troubleshooting.md3
-rw-r--r--doc/administration/housekeeping.md3
-rw-r--r--doc/administration/inactive_project_deletion.md3
-rw-r--r--doc/administration/integration/diagrams_net.md3
-rw-r--r--doc/administration/integration/kroki.md3
-rw-r--r--doc/administration/integration/mailgun.md3
-rw-r--r--doc/administration/integration/plantuml.md3
-rw-r--r--doc/administration/integration/terminal.md3
-rw-r--r--doc/administration/license.md3
-rw-r--r--doc/administration/license_file.md9
-rw-r--r--doc/administration/maintenance_mode/index.md3
-rw-r--r--doc/administration/merge_requests_approvals.md3
-rw-r--r--doc/administration/moderate_users.md42
-rw-r--r--doc/administration/monitoring/performance/gitlab_configuration.md3
-rw-r--r--doc/administration/monitoring/performance/grafana_configuration.md3
-rw-r--r--doc/administration/monitoring/performance/performance_bar.md3
-rw-r--r--doc/administration/monitoring/prometheus/gitlab_metrics.md3
-rw-r--r--doc/administration/operations/fast_ssh_key_lookup.md3
-rw-r--r--doc/administration/packages/container_registry.md3
-rw-r--r--doc/administration/pages/index.md18
-rw-r--r--doc/administration/pages/source.md3
-rw-r--r--doc/administration/pages/troubleshooting.md3
-rw-r--r--doc/administration/polling.md3
-rw-r--r--doc/administration/reporting/git_abuse_rate_limit.md6
-rw-r--r--doc/administration/reporting/ip_addr_restrictions.md3
-rw-r--r--doc/administration/reporting/spamcheck.md3
-rw-r--r--doc/administration/repository_checks.md9
-rw-r--r--doc/administration/repository_storage_paths.md6
-rw-r--r--doc/administration/review_abuse_reports.md6
-rw-r--r--doc/administration/review_spam_logs.md3
-rw-r--r--doc/administration/server_hooks.md3
-rw-r--r--doc/administration/settings/account_and_limit_settings.md45
-rw-r--r--doc/administration/settings/continuous_integration.md63
-rw-r--r--doc/administration/settings/deprecated_api_rate_limits.md3
-rw-r--r--doc/administration/settings/email.md18
-rw-r--r--doc/administration/settings/external_authorization.md6
-rw-r--r--doc/administration/settings/files_api_rate_limits.md3
-rw-r--r--doc/administration/settings/floc.md3
-rw-r--r--doc/administration/settings/git_lfs_rate_limits.md3
-rw-r--r--doc/administration/settings/gitaly_timeouts.md3
-rw-r--r--doc/administration/settings/help_page.md15
-rw-r--r--doc/administration/settings/import_and_export_settings.md27
-rw-r--r--doc/administration/settings/import_export_rate_limits.md3
-rw-r--r--doc/administration/settings/incident_management_rate_limits.md3
-rw-r--r--doc/administration/settings/index.md3
-rw-r--r--doc/administration/settings/instance_template_repository.md3
-rw-r--r--doc/administration/settings/jira_cloud_app.md9
-rw-r--r--doc/administration/settings/localization.md6
-rw-r--r--doc/administration/settings/package_registry_rate_limits.md6
-rw-r--r--doc/administration/settings/project_integration_management.md9
-rw-r--r--doc/administration/settings/protected_paths.md3
-rw-r--r--doc/administration/settings/rate_limit_on_issues_creation.md3
-rw-r--r--doc/administration/settings/rate_limit_on_notes_creation.md3
-rw-r--r--doc/administration/settings/rate_limit_on_pipelines_creation.md3
-rw-r--r--doc/administration/settings/rate_limit_on_projects_api.md3
-rw-r--r--doc/administration/settings/rate_limit_on_users_api.md3
-rw-r--r--doc/administration/settings/rate_limits_on_git_ssh_operations.md3
-rw-r--r--doc/administration/settings/rate_limits_on_raw_endpoints.md3
-rw-r--r--doc/administration/settings/scim_setup.md3
-rw-r--r--doc/administration/settings/security_and_compliance.md3
-rw-r--r--doc/administration/settings/sidekiq_job_limits.md3
-rw-r--r--doc/administration/settings/sign_in_restrictions.md9
-rw-r--r--doc/administration/settings/sign_up_restrictions.md21
-rw-r--r--doc/administration/settings/slack_app.md3
-rw-r--r--doc/administration/settings/terms.md3
-rw-r--r--doc/administration/settings/terraform_limits.md3
-rw-r--r--doc/administration/settings/third_party_offers.md3
-rw-r--r--doc/administration/settings/usage_statistics.md15
-rw-r--r--doc/administration/settings/user_and_ip_rate_limits.md18
-rw-r--r--doc/administration/settings/visibility_and_access_controls.md30
-rw-r--r--doc/administration/sidekiq/extra_sidekiq_processes.md3
-rw-r--r--doc/administration/static_objects_external_storage.md3
-rw-r--r--doc/administration/system_hooks.md3
-rw-r--r--doc/administration/troubleshooting/index.md4
-rw-r--r--doc/administration/troubleshooting/ssl.md11
-rw-r--r--doc/administration/user_cohorts.md3
-rw-r--r--doc/administration/whats-new.md3
-rw-r--r--doc/api/system_hooks.md3
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-admin-area.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-agent-for-kubernetes.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-backups.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-ci-runners.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-container-registry.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-contributions-forks.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-data-migration.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-database-sequences.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-explore.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-git-access.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-gitlab-pages.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-global-search.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-graphql.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-organizations.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-personal-access-tokens.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-personal-namespaces.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-router-endpoints-classification.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-schema-changes.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-secrets.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-snippets.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-template.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-uploads.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-user-profile.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-your-work.md6
-rw-r--r--doc/architecture/blueprints/cells/glossary.md6
-rw-r--r--doc/architecture/blueprints/cells/impact.md7
-rw-r--r--doc/ci/index.md2
-rw-r--r--doc/ci/introduction/index.md11
-rw-r--r--doc/ci/lint.md2
-rw-r--r--doc/ci/migration/circleci.md2
-rw-r--r--doc/ci/pipelines/cicd_minutes.md6
-rw-r--r--doc/ci/pipelines/index.md2
-rw-r--r--doc/ci/pipelines/pipeline_efficiency.md2
-rw-r--r--doc/ci/runners/configure_runners.md3
-rw-r--r--doc/ci/runners/runners_scope.md18
-rw-r--r--doc/ci/variables/index.md3
-rw-r--r--doc/development/ai_features/duo_chat.md59
-rw-r--r--doc/development/database/background_migrations.md11
-rw-r--r--doc/development/documentation/contribute.md11
-rw-r--r--doc/development/documentation/site_architecture/index.md2
-rw-r--r--doc/development/documentation/styleguide/index.md3
-rw-r--r--doc/development/integrations/jenkins.md3
-rw-r--r--doc/development/internal_analytics/internal_event_instrumentation/local_setup_and_debugging.md3
-rw-r--r--doc/development/internal_analytics/internal_events/index.md11
-rw-r--r--doc/development/runner_fleet_dashboard.md3
-rw-r--r--doc/development/testing_guide/end_to_end/package_and_test_pipeline.md11
-rw-r--r--doc/install/azure/index.md3
-rw-r--r--doc/install/migrate/compare_sm_to_saas.md11
-rw-r--r--doc/integration/advanced_search/elasticsearch.md24
-rw-r--r--doc/integration/akismet.md3
-rw-r--r--doc/integration/glab/index.md11
-rw-r--r--doc/integration/kerberos.md3
-rw-r--r--doc/integration/oauth_provider.md3
-rw-r--r--doc/integration/omniauth.md3
-rw-r--r--doc/integration/recaptcha.md3
-rw-r--r--doc/integration/sourcegraph.md3
-rw-r--r--doc/raketasks/migrate_snippets.md11
-rw-r--r--doc/security/hardening_application_recommendations.md21
-rw-r--r--doc/security/password_length_limits.md3
-rw-r--r--doc/security/project_import_decompressed_archive_size_limits.md11
-rw-r--r--doc/security/reset_user_password.md3
-rw-r--r--doc/security/ssh_keys_restrictions.md3
-rw-r--r--doc/security/two_factor_authentication.md3
-rw-r--r--doc/security/unlock_user.md3
-rw-r--r--doc/security/user_email_confirmation.md3
-rw-r--r--doc/security/webhooks.md12
-rw-r--r--doc/subscriptions/index.md2
-rw-r--r--doc/subscriptions/self_managed/index.md12
-rw-r--r--doc/topics/autodevops/index.md5
-rw-r--r--doc/topics/autodevops/prepare_deployment.md4
-rw-r--r--doc/topics/autodevops/requirements.md2
-rw-r--r--doc/topics/gitlab_flow.md11
-rw-r--r--doc/tutorials/automate_runner_creation/index.md3
-rw-r--r--doc/tutorials/manage_user/index.md3
-rw-r--r--doc/update/background_migrations.md9
-rw-r--r--doc/user/admin_area/custom_project_templates.md11
-rw-r--r--doc/user/admin_area/diff_limits.md11
-rw-r--r--doc/user/admin_area/email_from_gitlab.md11
-rw-r--r--doc/user/admin_area/external_users.md11
-rw-r--r--doc/user/admin_area/geo_sites.md11
-rw-r--r--doc/user/admin_area/index.md11
-rw-r--r--doc/user/admin_area/license.md11
-rw-r--r--doc/user/admin_area/license_file.md11
-rw-r--r--doc/user/admin_area/merge_requests_approvals.md11
-rw-r--r--doc/user/admin_area/moderate_users.md11
-rw-r--r--doc/user/admin_area/monitoring/health_check.md11
-rw-r--r--doc/user/admin_area/reporting/git_abuse_rate_limit.md11
-rw-r--r--doc/user/admin_area/reporting/ip_addr_restrictions.md11
-rw-r--r--doc/user/admin_area/reporting/spamcheck.md11
-rw-r--r--doc/user/admin_area/review_abuse_reports.md11
-rw-r--r--doc/user/admin_area/settings/account_and_limit_settings.md11
-rw-r--r--doc/user/admin_area/settings/continuous_integration.md11
-rw-r--r--doc/user/admin_area/settings/deprecated_api_rate_limits.md11
-rw-r--r--doc/user/admin_area/settings/email.md11
-rw-r--r--doc/user/admin_area/settings/external_authorization.md11
-rw-r--r--doc/user/admin_area/settings/files_api_rate_limits.md11
-rw-r--r--doc/user/admin_area/settings/incident_management_rate_limits.md11
-rw-r--r--doc/user/admin_area/settings/index.md11
-rw-r--r--doc/user/admin_area/settings/instance_template_repository.md11
-rw-r--r--doc/user/admin_area/settings/package_registry_rate_limits.md11
-rw-r--r--doc/user/admin_area/settings/project_integration_management.md11
-rw-r--r--doc/user/admin_area/settings/protected_paths.md11
-rw-r--r--doc/user/admin_area/settings/push_event_activities_limit.md11
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_issues_creation.md11
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_notes_creation.md11
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md11
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_projects_api.md11
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_users_api.md11
-rw-r--r--doc/user/admin_area/settings/rate_limits_on_git_ssh_operations.md11
-rw-r--r--doc/user/admin_area/settings/rate_limits_on_raw_endpoints.md11
-rw-r--r--doc/user/admin_area/settings/scim_setup.md11
-rw-r--r--doc/user/admin_area/settings/security_and_compliance.md11
-rw-r--r--doc/user/admin_area/settings/sidekiq_job_limits.md11
-rw-r--r--doc/user/admin_area/settings/sign_in_restrictions.md11
-rw-r--r--doc/user/admin_area/settings/sign_up_restrictions.md11
-rw-r--r--doc/user/admin_area/settings/slack_app.md11
-rw-r--r--doc/user/admin_area/settings/terms.md11
-rw-r--r--doc/user/admin_area/settings/terraform_limits.md11
-rw-r--r--doc/user/admin_area/settings/third_party_offers.md11
-rw-r--r--doc/user/admin_area/settings/usage_statistics.md11
-rw-r--r--doc/user/admin_area/settings/user_and_ip_rate_limits.md11
-rw-r--r--doc/user/admin_area/settings/visibility_and_access_controls.md11
-rw-r--r--doc/user/admin_area/user_cohorts.md11
-rw-r--r--doc/user/application_security/generate_test_vulnerabilities/index.md6
-rw-r--r--doc/user/clusters/agent/gitops/flux.md11
-rw-r--r--doc/user/clusters/agent/gitops/helm.md11
-rw-r--r--doc/user/custom_roles.md3
-rw-r--r--doc/user/gitlab_com/index.md2
-rw-r--r--doc/user/group/import/index.md5
-rw-r--r--doc/user/group/index.md2
-rw-r--r--doc/user/group/manage.md2
-rw-r--r--doc/user/group/reporting/git_abuse_rate_limit.md2
-rw-r--r--doc/user/group/saml_sso/group_sync.md6
-rw-r--r--doc/user/group/saml_sso/troubleshooting.md3
-rw-r--r--doc/user/infrastructure/clusters/connect/index.md3
-rw-r--r--doc/user/instance/clusters/index.md3
-rw-r--r--doc/user/packages/container_registry/authenticate_with_container_registry.md2
-rw-r--r--doc/user/packages/container_registry/reduce_container_registry_storage.md5
-rw-r--r--doc/user/packages/maven_repository/index.md5
-rw-r--r--doc/user/packages/npm_registry/index.md2
-rw-r--r--doc/user/packages/package_registry/index.md2
-rw-r--r--doc/user/packages/pypi_repository/index.md2
-rw-r--r--doc/user/product_analytics/index.md3
-rw-r--r--doc/user/profile/account/create_accounts.md5
-rw-r--r--doc/user/profile/account/delete_account.md3
-rw-r--r--doc/user/profile/personal_access_tokens.md5
-rw-r--r--doc/user/project/changelogs.md2
-rw-r--r--doc/user/project/clusters/add_eks_clusters.md3
-rw-r--r--doc/user/project/deploy_keys/index.md5
-rw-r--r--doc/user/project/deploy_tokens/index.md2
-rw-r--r--doc/user/project/description_templates.md4
-rw-r--r--doc/user/project/import/index.md3
-rw-r--r--doc/user/project/integrations/gitlab_slack_application.md2
-rw-r--r--doc/user/project/integrations/mattermost_slash_commands.md3
-rw-r--r--doc/user/project/integrations/mlflow_client.md11
-rw-r--r--doc/user/project/merge_requests/approvals/index.md4
-rw-r--r--doc/user/project/merge_requests/approvals/rules.md2
-rw-r--r--doc/user/project/merge_requests/approvals/settings.md10
-rw-r--r--doc/user/project/merge_requests/reviews/index.md2
-rw-r--r--doc/user/project/repository/branches/default.md9
-rw-r--r--doc/user/project/repository/code_suggestions/index.md2
-rw-r--r--doc/user/project/repository/code_suggestions/self_managed.md21
-rw-r--r--doc/user/project/repository/index.md8
-rw-r--r--doc/user/project/repository/push_rules.md3
-rw-r--r--doc/user/project/repository/vscode.md11
-rw-r--r--doc/user/project/repository/web_editor.md2
-rw-r--r--doc/user/project/service_desk.md11
-rw-r--r--doc/user/project/settings/import_export.md3
-rw-r--r--doc/user/public_access.md2
-rw-r--r--doc/user/snippets.md4
-rw-r--r--lib/gitlab/ci/templates/Diffblue-Cover.gitlab-ci.yml88
-rw-r--r--locale/gitlab.pot71
-rw-r--r--package.json2
-rwxr-xr-xscripts/duo_chat/reporter.rb194
-rw-r--r--spec/features/groups/import_export/migration_history_spec.rb2
-rw-r--r--spec/features/issues/service_desk_spec.rb6
-rw-r--r--spec/finders/concerns/packages/finder_helper_spec.rb109
-rw-r--r--spec/finders/packages/maven/package_finder_spec.rb24
-rw-r--r--spec/frontend/ci/job_details/store/actions_spec.js121
-rw-r--r--spec/frontend/frequent_items/components/app_spec.js286
-rw-r--r--spec/frontend/frequent_items/components/frequent_items_list_item_spec.js161
-rw-r--r--spec/frontend/frequent_items/components/frequent_items_list_spec.js121
-rw-r--r--spec/frontend/frequent_items/components/frequent_items_search_input_spec.js74
-rw-r--r--spec/frontend/frequent_items/mock_data.js169
-rw-r--r--spec/frontend/frequent_items/store/actions_spec.js304
-rw-r--r--spec/frontend/frequent_items/store/getters_spec.js24
-rw-r--r--spec/frontend/frequent_items/store/mutations_spec.js152
-rw-r--r--spec/frontend/frequent_items/utils_spec.js131
-rw-r--r--spec/frontend/import/details/components/bulk_import_details_app_spec.js14
-rw-r--r--spec/frontend/import_entities/import_groups/utils_spec.js2
-rw-r--r--spec/frontend/lib/utils/vuex_module_mappers_spec.js133
-rw-r--r--spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js2
-rw-r--r--spec/frontend/super_sidebar/mock_data.js29
-rw-r--r--spec/frontend/super_sidebar/utils_spec.js4
-rw-r--r--spec/helpers/json_helper_spec.rb36
-rw-r--r--spec/lib/gitlab/ci/templates/Diffblue_Cover_spec.rb26
-rw-r--r--spec/lib/gitlab/ci/templates/templates_spec.rb1
-rw-r--r--spec/requests/api/maven_packages_spec.rb58
-rw-r--r--spec/scripts/duo_chat/reporter_spec.rb270
-rw-r--r--yarn.lock8
383 files changed, 2002 insertions, 5034 deletions
diff --git a/.gitlab/ci/qa-common/main.gitlab-ci.yml b/.gitlab/ci/qa-common/main.gitlab-ci.yml
index ab3cc773a09..5d9438cc5e6 100644
--- a/.gitlab/ci/qa-common/main.gitlab-ci.yml
+++ b/.gitlab/ci/qa-common/main.gitlab-ci.yml
@@ -5,7 +5,7 @@ workflow:
name: $PIPELINE_NAME
include:
- - component: "gitlab.com/gitlab-org/quality/pipeline-common/allure-report@7.13.1"
+ - component: "gitlab.com/gitlab-org/quality/pipeline-common/allure-report@7.13.2"
inputs:
job_name: "e2e-test-report"
job_stage: "report"
diff --git a/.rubocop_todo/rspec/feature_category.yml b/.rubocop_todo/rspec/feature_category.yml
index 5cf13baf9e5..320b311e6cd 100644
--- a/.rubocop_todo/rspec/feature_category.yml
+++ b/.rubocop_todo/rspec/feature_category.yml
@@ -2427,7 +2427,6 @@ RSpec/FeatureCategory:
- 'spec/helpers/invite_members_helper_spec.rb'
- 'spec/helpers/issuables_description_templates_helper_spec.rb'
- 'spec/helpers/issues_helper_spec.rb'
- - 'spec/helpers/json_helper_spec.rb'
- 'spec/helpers/keyset_helper_spec.rb'
- 'spec/helpers/labels_helper_spec.rb'
- 'spec/helpers/lazy_image_tag_helper_spec.rb'
diff --git a/.rubocop_todo/rspec/named_subject.yml b/.rubocop_todo/rspec/named_subject.yml
index 9ee86882271..20e43b25c1e 100644
--- a/.rubocop_todo/rspec/named_subject.yml
+++ b/.rubocop_todo/rspec/named_subject.yml
@@ -1612,7 +1612,6 @@ RSpec/NamedSubject:
- 'spec/helpers/hooks_helper_spec.rb'
- 'spec/helpers/integrations_helper_spec.rb'
- 'spec/helpers/jira_connect_helper_spec.rb'
- - 'spec/helpers/json_helper_spec.rb'
- 'spec/helpers/labels_helper_spec.rb'
- 'spec/helpers/listbox_helper_spec.rb'
- 'spec/helpers/markup_helper_spec.rb'
diff --git a/GITLAB_PAGES_VERSION b/GITLAB_PAGES_VERSION
index e347135ff4a..d35f1128be3 100644
--- a/GITLAB_PAGES_VERSION
+++ b/GITLAB_PAGES_VERSION
@@ -1 +1 @@
-6cb3173f9a1468c93d5c3fa9327e9b560de1329b
+38a79230add5dc453d8fafa48f7f3e218a70f0be
diff --git a/app/assets/javascripts/ci/job_details/components/log/log.vue b/app/assets/javascripts/ci/job_details/components/log/log.vue
index fb6a6a58074..433d1b3579b 100644
--- a/app/assets/javascripts/ci/job_details/components/log/log.vue
+++ b/app/assets/javascripts/ci/job_details/components/log/log.vue
@@ -20,23 +20,11 @@ export default {
},
},
computed: {
- ...mapState([
- 'jobLogEndpoint',
- 'jobLog',
- 'isJobLogComplete',
- 'isScrolledToBottomBeforeReceivingJobLog',
- ]),
+ ...mapState(['jobLogEndpoint', 'jobLog', 'isJobLogComplete']),
highlightedLines() {
return this.searchResults.map((result) => result.lineNumber);
},
},
- updated() {
- this.$nextTick(() => {
- if (!window.location.hash) {
- this.handleScrollDown();
- }
- });
- },
mounted() {
if (window.location.hash) {
const lineNumber = getLocationHash();
@@ -57,20 +45,6 @@ export default {
handleOnClickCollapsibleLine(section) {
this.toggleCollapsibleLine(section);
},
- /**
- * The job log is sent in HTML, which means we need to use `v-html` to render it
- * Using the updated hook with $nextTick is not enough to wait for the DOM to be updated
- * in this case because it runs before `v-html` has finished running, since there's no
- * Vue binding.
- * In order to scroll the page down after `v-html` has finished, we need to use setTimeout
- */
- handleScrollDown() {
- if (this.isScrolledToBottomBeforeReceivingJobLog) {
- setTimeout(() => {
- this.scrollBottom();
- }, 0);
- }
- },
isHighlighted({ lineNumber }) {
return this.highlightedLines.includes(lineNumber);
},
diff --git a/app/assets/javascripts/ci/job_details/job_app.vue b/app/assets/javascripts/ci/job_details/job_app.vue
index e0708289b43..1c581a2df78 100644
--- a/app/assets/javascripts/ci/job_details/job_app.vue
+++ b/app/assets/javascripts/ci/job_details/job_app.vue
@@ -88,7 +88,6 @@ export default {
'isJobLogSizeVisible',
'isScrollBottomDisabled',
'isScrollTopDisabled',
- 'isScrolledToBottomBeforeReceivingJobLog',
'hasError',
'selectedStage',
]),
diff --git a/app/assets/javascripts/ci/job_details/store/actions.js b/app/assets/javascripts/ci/job_details/store/actions.js
index adcba0f2409..a54dbf2e7b1 100644
--- a/app/assets/javascripts/ci/job_details/store/actions.js
+++ b/app/assets/javascripts/ci/job_details/store/actions.js
@@ -150,40 +150,47 @@ export const enableScrollTop = ({ commit }) => commit(types.ENABLE_SCROLL_TOP);
export const toggleScrollAnimation = ({ commit }, toggle) =>
commit(types.TOGGLE_SCROLL_ANIMATION, toggle);
-/**
- * Responsible to handle automatic scroll
- */
-export const toggleScrollisInBottom = ({ commit }, toggle) => {
- commit(types.TOGGLE_IS_SCROLL_IN_BOTTOM_BEFORE_UPDATING_JOB_LOG, toggle);
-};
-
export const requestJobLog = ({ commit }) => commit(types.REQUEST_JOB_LOG);
-export const fetchJobLog = ({ dispatch, state }) =>
- // update trace endpoint once BE compeletes trace re-naming in #340626
- axios
- .get(`${state.jobLogEndpoint}/trace.json`, {
- params: { state: state.jobLogState },
- })
- .then(({ data }) => {
- dispatch('toggleScrollisInBottom', isScrolledToBottom());
- dispatch('receiveJobLogSuccess', data);
-
- if (data.complete) {
- dispatch('stopPollingJobLog');
- dispatch('requestTestSummary');
- } else if (!state.jobLogTimeout) {
- dispatch('startPollingJobLog');
- }
- })
- .catch((e) => {
- if (e.response?.status === HTTP_STATUS_FORBIDDEN) {
- dispatch('receiveJobLogUnauthorizedError');
- } else {
- reportToSentry('job_actions', e);
- dispatch('receiveJobLogError');
- }
- });
+export const fetchJobLog = ({ commit, dispatch, state }) => {
+ let isScrolledToBottomBeforeReceivingJobLog;
+
+ // update trace endpoint once BE completes trace re-naming in #340626
+ return (
+ axios
+ .get(`${state.jobLogEndpoint}/trace.json`, {
+ params: { state: state.jobLogState },
+ })
+ .then(({ data }) => {
+ isScrolledToBottomBeforeReceivingJobLog = isScrolledToBottom();
+
+ commit(types.RECEIVE_JOB_LOG_SUCCESS, data);
+
+ if (data.complete) {
+ dispatch('stopPollingJobLog');
+ dispatch('requestTestSummary');
+ } else if (!state.jobLogTimeout) {
+ dispatch('startPollingJobLog');
+ }
+ })
+ // place `scrollBottom` in a separate `then()` block
+ // to wait on related components to update
+ // after the RECEIVE_JOB_LOG_SUCCESS commit
+ .then(() => {
+ if (isScrolledToBottomBeforeReceivingJobLog) {
+ dispatch('scrollBottom');
+ }
+ })
+ .catch((e) => {
+ if (e.response?.status === HTTP_STATUS_FORBIDDEN) {
+ dispatch('receiveJobLogUnauthorizedError');
+ } else {
+ reportToSentry('job_actions', e);
+ dispatch('receiveJobLogError');
+ }
+ })
+ );
+};
export const startPollingJobLog = ({ dispatch, commit }) => {
const jobLogTimeout = setTimeout(() => {
@@ -200,8 +207,6 @@ export const stopPollingJobLog = ({ state, commit }) => {
commit(types.STOP_POLLING_JOB_LOG);
};
-export const receiveJobLogSuccess = ({ commit }, log) => commit(types.RECEIVE_JOB_LOG_SUCCESS, log);
-
export const receiveJobLogError = ({ dispatch }) => {
dispatch('stopPollingJobLog');
createAlert({
diff --git a/app/assets/javascripts/ci/job_details/store/mutation_types.js b/app/assets/javascripts/ci/job_details/store/mutation_types.js
index 86ebbe57714..1feb35c51d8 100644
--- a/app/assets/javascripts/ci/job_details/store/mutation_types.js
+++ b/app/assets/javascripts/ci/job_details/store/mutation_types.js
@@ -11,8 +11,6 @@ export const ENABLE_SCROLL_BOTTOM = 'ENABLE_SCROLL_BOTTOM';
export const ENABLE_SCROLL_TOP = 'ENABLE_SCROLL_TOP';
export const TOGGLE_SCROLL_ANIMATION = 'TOGGLE_SCROLL_ANIMATION';
-export const TOGGLE_IS_SCROLL_IN_BOTTOM_BEFORE_UPDATING_JOB_LOG = 'TOGGLE_IS_SCROLL_IN_BOTTOM';
-
export const REQUEST_JOB = 'REQUEST_JOB';
export const RECEIVE_JOB_SUCCESS = 'RECEIVE_JOB_SUCCESS';
export const RECEIVE_JOB_ERROR = 'RECEIVE_JOB_ERROR';
diff --git a/app/assets/javascripts/ci/job_details/store/mutations.js b/app/assets/javascripts/ci/job_details/store/mutations.js
index ad0603c050e..72f9a86c4a9 100644
--- a/app/assets/javascripts/ci/job_details/store/mutations.js
+++ b/app/assets/javascripts/ci/job_details/store/mutations.js
@@ -111,11 +111,6 @@ export default {
[types.TOGGLE_SCROLL_ANIMATION](state, toggle) {
state.isScrollingDown = toggle;
},
-
- [types.TOGGLE_IS_SCROLL_IN_BOTTOM_BEFORE_UPDATING_JOB_LOG](state, toggle) {
- state.isScrolledToBottomBeforeReceivingJobLog = toggle;
- },
-
[types.REQUEST_JOBS_FOR_STAGE](state, stage = {}) {
state.isLoadingJobs = true;
state.selectedStage = stage.name;
diff --git a/app/assets/javascripts/ci/job_details/store/state.js b/app/assets/javascripts/ci/job_details/store/state.js
index aa4497d0e37..512b8b115b7 100644
--- a/app/assets/javascripts/ci/job_details/store/state.js
+++ b/app/assets/javascripts/ci/job_details/store/state.js
@@ -16,9 +16,6 @@ export default () => ({
isScrollBottomDisabled: true,
isScrollTopDisabled: true,
- // Used to check if we should keep the automatic scroll
- isScrolledToBottomBeforeReceivingJobLog: true,
-
jobLog: [],
isJobLogComplete: false,
jobLogSize: 0,
diff --git a/app/assets/javascripts/frequent_items/components/app.vue b/app/assets/javascripts/frequent_items/components/app.vue
deleted file mode 100644
index 947d3053094..00000000000
--- a/app/assets/javascripts/frequent_items/components/app.vue
+++ /dev/null
@@ -1,183 +0,0 @@
-<script>
-import { GlLoadingIcon, GlButton, GlIcon, GlTooltipDirective } from '@gitlab/ui';
-import AccessorUtilities from '~/lib/utils/accessor';
-import {
- mapVuexModuleState,
- mapVuexModuleActions,
- mapVuexModuleGetters,
-} from '~/lib/utils/vuex_module_mappers';
-import Tracking from '~/tracking';
-import { FREQUENT_ITEMS, STORAGE_KEY } from '../constants';
-import eventHub from '../event_hub';
-import { isMobile, updateExistingFrequentItem, sanitizeItem } from '../utils';
-import FrequentItemsList from './frequent_items_list.vue';
-import frequentItemsMixin from './frequent_items_mixin';
-import FrequentItemsSearchInput from './frequent_items_search_input.vue';
-
-const trackingMixin = Tracking.mixin();
-
-export default {
- components: {
- FrequentItemsSearchInput,
- FrequentItemsList,
- GlLoadingIcon,
- GlButton,
- GlIcon,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- mixins: [frequentItemsMixin, trackingMixin],
- inject: ['vuexModule'],
- props: {
- currentUserName: {
- type: String,
- required: true,
- },
- currentItem: {
- type: Object,
- required: true,
- },
- searchClass: {
- type: String,
- required: false,
- default: '',
- },
- },
- computed: {
- ...mapVuexModuleState((vm) => vm.vuexModule, [
- 'searchQuery',
- 'isLoadingItems',
- 'isItemsListEditable',
- 'isFetchFailed',
- 'isItemRemovalFailed',
- 'items',
- ]),
- ...mapVuexModuleGetters((vm) => vm.vuexModule, ['hasSearchQuery']),
- translations() {
- return this.getTranslations(['loadingMessage', 'header', 'headerEditToggle']);
- },
- },
- created() {
- const { namespace, currentUserName, currentItem } = this;
- const storageKey = `${currentUserName}/${STORAGE_KEY[namespace]}`;
-
- this.setNamespace(namespace);
- this.setStorageKey(storageKey);
-
- if (currentItem.id) {
- this.logItemAccess(storageKey, currentItem);
- }
-
- eventHub.$on(`${this.namespace}-dropdownOpen`, this.dropdownOpenHandler);
-
- // As we init it through requestIdleCallback it could be that the dropdown is already open
- const namespaceDropdown = document.getElementById(`nav-${this.namespace}-dropdown`);
- if (namespaceDropdown && namespaceDropdown.classList.contains('show')) {
- this.dropdownOpenHandler();
- }
- },
- beforeDestroy() {
- eventHub.$off(`${this.namespace}-dropdownOpen`, this.dropdownOpenHandler);
- },
- methods: {
- ...mapVuexModuleActions((vm) => vm.vuexModule, [
- 'setNamespace',
- 'setStorageKey',
- 'toggleItemsListEditablity',
- 'fetchFrequentItems',
- ]),
- toggleItemsListEditablityTracked() {
- this.track('click_button', {
- label: 'toggle_edit_frequent_items',
- property: 'navigation_top',
- });
- this.toggleItemsListEditablity();
- },
- dropdownOpenHandler() {
- if (this.searchQuery === '' || isMobile()) {
- this.fetchFrequentItems();
- }
- },
- logItemAccess(storageKey, unsanitizedItem) {
- const item = sanitizeItem(unsanitizedItem);
-
- if (!AccessorUtilities.canUseLocalStorage()) {
- return false;
- }
-
- // Check if there's any frequent items list set
- const storedRawItems = localStorage.getItem(storageKey);
- const storedFrequentItems = storedRawItems
- ? JSON.parse(storedRawItems)
- : [{ ...item, frequency: 1 }]; // No frequent items list set, set one up.
-
- // Check if item already exists in list
- const itemMatchIndex = storedFrequentItems.findIndex(
- (frequentItem) => frequentItem.id === item.id,
- );
-
- if (itemMatchIndex > -1) {
- storedFrequentItems[itemMatchIndex] = updateExistingFrequentItem(
- storedFrequentItems[itemMatchIndex],
- item,
- );
- } else {
- if (storedFrequentItems.length === FREQUENT_ITEMS.MAX_COUNT) {
- storedFrequentItems.shift();
- }
-
- storedFrequentItems.push({ ...item, frequency: 1 });
- }
-
- return localStorage.setItem(storageKey, JSON.stringify(storedFrequentItems));
- },
- },
-};
-</script>
-
-<template>
- <div class="gl-display-flex gl-flex-direction-column gl-flex-align-items-stretch gl-h-full">
- <frequent-items-search-input
- :namespace="namespace"
- :class="searchClass"
- data-testid="frequent-items-search-input"
- />
- <gl-loading-icon
- v-if="isLoadingItems"
- :label="translations.loadingMessage"
- size="lg"
- class="loading-animation prepend-top-20"
- data-testid="loading"
- />
- <div
- v-if="!isLoadingItems && !hasSearchQuery"
- class="section-header gl-display-flex"
- data-testid="header"
- >
- <span class="gl-flex-grow-1">{{ translations.header }}</span>
- <gl-button
- v-if="items.length"
- v-gl-tooltip.left
- size="small"
- category="tertiary"
- :aria-label="translations.headerEditToggle"
- :title="translations.headerEditToggle"
- :class="{ 'gl-bg-gray-100!': isItemsListEditable }"
- class="gl-p-2!"
- @click="toggleItemsListEditablityTracked"
- >
- <gl-icon name="pencil" :class="{ 'gl-text-gray-900!': isItemsListEditable }" />
- </gl-button>
- </div>
- <frequent-items-list
- v-if="!isLoadingItems"
- :items="items"
- :namespace="namespace"
- :has-search-query="hasSearchQuery"
- :is-fetch-failed="isFetchFailed"
- :is-item-removal-failed="isItemRemovalFailed"
- :matcher="searchQuery"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/frequent_items/components/frequent_items_list.vue b/app/assets/javascripts/frequent_items/components/frequent_items_list.vue
deleted file mode 100644
index da1d3bedaf4..00000000000
--- a/app/assets/javascripts/frequent_items/components/frequent_items_list.vue
+++ /dev/null
@@ -1,90 +0,0 @@
-<script>
-import { sanitizeItem } from '../utils';
-import FrequentItemsListItem from './frequent_items_list_item.vue';
-import frequentItemsMixin from './frequent_items_mixin';
-
-export default {
- components: {
- FrequentItemsListItem,
- },
- mixins: [frequentItemsMixin],
- props: {
- items: {
- type: Array,
- required: true,
- },
- hasSearchQuery: {
- type: Boolean,
- required: true,
- },
- isFetchFailed: {
- type: Boolean,
- required: true,
- },
- isItemRemovalFailed: {
- type: Boolean,
- required: true,
- },
- matcher: {
- type: String,
- required: true,
- },
- },
- computed: {
- translations() {
- return this.getTranslations([
- 'itemListEmptyMessage',
- 'itemListErrorMessage',
- 'searchListEmptyMessage',
- 'searchListErrorMessage',
- ]);
- },
- isListEmpty() {
- return this.items.length === 0;
- },
- showListEmptyMessage() {
- return this.isListEmpty || this.isItemRemovalFailed;
- },
- listEmptyMessage() {
- if (this.hasSearchQuery) {
- return this.isFetchFailed
- ? this.translations.searchListErrorMessage
- : this.translations.searchListEmptyMessage;
- }
-
- return this.isFetchFailed || this.isItemRemovalFailed
- ? this.translations.itemListErrorMessage
- : this.translations.itemListEmptyMessage;
- },
- sanitizedItems() {
- return this.items.map(sanitizeItem);
- },
- },
-};
-</script>
-
-<template>
- <div class="frequent-items-list-container">
- <ul data-testid="frequent-items-list" class="list-unstyled">
- <li
- v-if="showListEmptyMessage"
- :class="{ 'section-failure': isFetchFailed }"
- class="section-empty gl-mb-3"
- data-testid="frequent-items-list-empty"
- >
- {{ listEmptyMessage }}
- </li>
- <frequent-items-list-item
- v-for="item in sanitizedItems"
- v-else
- :key="item.id"
- :item-id="item.id"
- :item-name="item.name"
- :namespace="item.namespace"
- :web-url="item.webUrl"
- :avatar-url="item.avatarUrl"
- :matcher="matcher"
- />
- </ul>
- </div>
-</template>
diff --git a/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue b/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue
deleted file mode 100644
index 056dedf8757..00000000000
--- a/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue
+++ /dev/null
@@ -1,132 +0,0 @@
-<script>
-import { GlButton, GlTooltipDirective, GlIcon } from '@gitlab/ui';
-import SafeHtml from '~/vue_shared/directives/safe_html';
-import highlight from '~/lib/utils/highlight';
-import { truncateNamespace } from '~/lib/utils/text_utility';
-import { mapVuexModuleState, mapVuexModuleActions } from '~/lib/utils/vuex_module_mappers';
-import Tracking from '~/tracking';
-import ProjectAvatar from '~/vue_shared/components/project_avatar.vue';
-
-const trackingMixin = Tracking.mixin();
-
-export default {
- components: {
- GlIcon,
- GlButton,
- ProjectAvatar,
- },
- directives: {
- SafeHtml,
- GlTooltip: GlTooltipDirective,
- },
- mixins: [trackingMixin],
- inject: ['vuexModule'],
- props: {
- matcher: {
- type: String,
- required: false,
- default: '',
- },
- itemId: {
- type: Number,
- required: true,
- },
- itemName: {
- type: String,
- required: true,
- },
- namespace: {
- type: String,
- required: false,
- default: '',
- },
- webUrl: {
- type: String,
- required: true,
- },
- avatarUrl: {
- required: true,
- validator(value) {
- return value === null || typeof value === 'string';
- },
- },
- },
- computed: {
- ...mapVuexModuleState((vm) => vm.vuexModule, ['dropdownType', 'isItemsListEditable']),
- truncatedNamespace() {
- return truncateNamespace(this.namespace);
- },
- highlightedItemName() {
- return highlight(this.itemName, this.matcher);
- },
- itemTrackingLabel() {
- return `${this.dropdownType}_dropdown_frequent_items_list_item`;
- },
- },
- methods: {
- removeFrequentItemTracked(item) {
- this.track('click_button', {
- label: `${this.dropdownType}_dropdown_remove_frequent_item`,
- property: 'navigation_top',
- });
- this.removeFrequentItem(item);
- },
- ...mapVuexModuleActions((vm) => vm.vuexModule, ['removeFrequentItem']),
- },
-};
-</script>
-
-<template>
- <li class="frequent-items-list-item-container gl-relative">
- <gl-button
- category="tertiary"
- :href="webUrl"
- class="gl-text-left gl-w-full"
- button-text-classes="gl-display-flex gl-w-full"
- data-testid="frequent-item-link"
- @click="track('click_link', { label: itemTrackingLabel, property: 'navigation_top' })"
- >
- <div class="gl-flex-grow-1">
- <project-avatar
- class="gl-float-left gl-mr-3"
- :project-avatar-url="avatarUrl"
- :project-id="itemId"
- :project-name="itemName"
- aria-hidden="true"
- />
- <div
- data-testid="frequent-items-item-metadata-container"
- class="frequent-items-item-metadata-container"
- >
- <div
- v-safe-html="highlightedItemName"
- data-testid="frequent-items-item-title"
- :title="itemName"
- class="frequent-items-item-title"
- ></div>
- <div
- v-if="namespace"
- data-testid="frequent-items-item-namespace"
- :title="namespace"
- class="frequent-items-item-namespace"
- >
- {{ truncatedNamespace }}
- </div>
- </div>
- </div>
- </gl-button>
- <gl-button
- v-if="isItemsListEditable"
- v-gl-tooltip.left
- size="small"
- category="tertiary"
- :aria-label="__('Remove')"
- :title="__('Remove')"
- class="gl-align-self-center gl-p-1! gl-absolute! gl-w-auto! gl-right-4 gl-top-half gl-translate-y-n50"
- data-testid="item-remove"
- @click.stop.prevent="removeFrequentItemTracked(itemId)"
- >
- <gl-icon name="close" />
- </gl-button>
- </li>
-</template>
diff --git a/app/assets/javascripts/frequent_items/components/frequent_items_mixin.js b/app/assets/javascripts/frequent_items/components/frequent_items_mixin.js
deleted file mode 100644
index 704dc83ca8e..00000000000
--- a/app/assets/javascripts/frequent_items/components/frequent_items_mixin.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import { TRANSLATION_KEYS } from '../constants';
-
-export default {
- props: {
- namespace: {
- type: String,
- required: true,
- },
- },
- methods: {
- getTranslations(keys) {
- const translationStrings = keys.reduce(
- (acc, key) => ({
- ...acc,
- [key]: TRANSLATION_KEYS[this.namespace][key],
- }),
- {},
- );
-
- return translationStrings;
- },
- },
-};
diff --git a/app/assets/javascripts/frequent_items/components/frequent_items_search_input.vue b/app/assets/javascripts/frequent_items/components/frequent_items_search_input.vue
deleted file mode 100644
index 023245f050b..00000000000
--- a/app/assets/javascripts/frequent_items/components/frequent_items_search_input.vue
+++ /dev/null
@@ -1,63 +0,0 @@
-<script>
-import { GlSearchBoxByType } from '@gitlab/ui';
-import { debounce } from 'lodash';
-import { mapVuexModuleActions, mapVuexModuleState } from '~/lib/utils/vuex_module_mappers';
-import Tracking from '~/tracking';
-import frequentItemsMixin from './frequent_items_mixin';
-
-const trackingMixin = Tracking.mixin();
-
-export default {
- components: {
- GlSearchBoxByType,
- },
- mixins: [frequentItemsMixin, trackingMixin],
- inject: ['vuexModule'],
- data() {
- return {
- searchQuery: '',
- };
- },
- computed: {
- ...mapVuexModuleState((vm) => vm.vuexModule, ['dropdownType']),
- translations() {
- return this.getTranslations(['searchInputPlaceholder']);
- },
- },
- watch: {
- searchQuery: debounce(function debounceSearchQuery() {
- this.track('type_search_query', {
- label: `${this.dropdownType}_dropdown_frequent_items_search_input`,
- property: 'navigation_top',
- });
- this.setSearchQuery(this.searchQuery);
- }, 500),
- },
- methods: {
- ...mapVuexModuleActions((vm) => vm.vuexModule, ['setSearchQuery']),
- trackFocus() {
- this.track('focus_input', {
- label: `${this.dropdownType}_dropdown_frequent_items_search_input`,
- property: 'navigation_top',
- });
- },
- trackBlur() {
- this.track('blur_input', {
- label: `${this.dropdownType}_dropdown_frequent_items_search_input`,
- property: 'navigation_top',
- });
- },
- },
-};
-</script>
-
-<template>
- <div class="search-input-container">
- <gl-search-box-by-type
- v-model="searchQuery"
- :placeholder="translations.searchInputPlaceholder"
- @focus="trackFocus"
- @blur="trackBlur"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/frequent_items/constants.js b/app/assets/javascripts/frequent_items/constants.js
deleted file mode 100644
index a7c27abf58e..00000000000
--- a/app/assets/javascripts/frequent_items/constants.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import { s__ } from '~/locale';
-
-export const FREQUENT_ITEMS = {
- MAX_COUNT: 20,
- LIST_COUNT_DESKTOP: 5,
- LIST_COUNT_MOBILE: 3,
- ELIGIBLE_FREQUENCY: 3,
-};
-
-export const FIFTEEN_MINUTES_IN_MS = 900000;
-
-export const STORAGE_KEY = {
- projects: 'frequent-projects',
- groups: 'frequent-groups',
-};
-
-export const TRANSLATION_KEYS = {
- projects: {
- loadingMessage: s__('ProjectsDropdown|Loading projects'),
- header: s__('ProjectsDropdown|Frequently visited'),
- headerEditToggle: s__('ProjectsDropdown|Toggle edit mode'),
- itemListErrorMessage: s__(
- 'ProjectsDropdown|This feature requires browser localStorage support',
- ),
- itemListEmptyMessage: s__('ProjectsDropdown|Projects you visit often will appear here'),
- searchListErrorMessage: s__('ProjectsDropdown|Something went wrong on our end.'),
- searchListEmptyMessage: s__('ProjectsDropdown|Sorry, no projects matched your search'),
- searchInputPlaceholder: s__('ProjectsDropdown|Search your projects'),
- },
- groups: {
- loadingMessage: s__('GroupsDropdown|Loading groups'),
- header: s__('GroupsDropdown|Frequently visited'),
- headerEditToggle: s__('GroupsDropdown|Toggle edit mode'),
- itemListErrorMessage: s__('GroupsDropdown|This feature requires browser localStorage support'),
- itemListEmptyMessage: s__('GroupsDropdown|Groups you visit often will appear here'),
- searchListErrorMessage: s__('GroupsDropdown|Something went wrong on our end.'),
- searchListEmptyMessage: s__('GroupsDropdown|Sorry, no groups matched your search'),
- searchInputPlaceholder: s__('GroupsDropdown|Search your groups'),
- },
-};
-
-export const FREQUENT_ITEMS_PROJECTS = {
- namespace: 'projects',
- key: 'project',
- vuexModule: 'frequentProjects',
-};
-
-export const FREQUENT_ITEMS_GROUPS = {
- namespace: 'groups',
- key: 'group',
- vuexModule: 'frequentGroups',
-};
-
-export const FREQUENT_ITEMS_DROPDOWNS = [FREQUENT_ITEMS_PROJECTS, FREQUENT_ITEMS_GROUPS];
diff --git a/app/assets/javascripts/frequent_items/event_hub.js b/app/assets/javascripts/frequent_items/event_hub.js
deleted file mode 100644
index e31806ad199..00000000000
--- a/app/assets/javascripts/frequent_items/event_hub.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import createEventHub from '~/helpers/event_hub_factory';
-
-export default createEventHub();
diff --git a/app/assets/javascripts/frequent_items/store/actions.js b/app/assets/javascripts/frequent_items/store/actions.js
deleted file mode 100644
index e5ef49ec402..00000000000
--- a/app/assets/javascripts/frequent_items/store/actions.js
+++ /dev/null
@@ -1,112 +0,0 @@
-import AccessorUtilities from '~/lib/utils/accessor';
-import { isLoggedIn } from '~/lib/utils/common_utils';
-import { getGroups, getProjects } from '~/rest_api';
-import { getTopFrequentItems } from '../utils';
-import * as types from './mutation_types';
-
-export const setNamespace = ({ commit }, namespace) => {
- commit(types.SET_NAMESPACE, namespace);
-};
-
-export const setStorageKey = ({ commit }, key) => {
- commit(types.SET_STORAGE_KEY, key);
-};
-
-export const toggleItemsListEditablity = ({ commit }) => {
- commit(types.TOGGLE_ITEMS_LIST_EDITABILITY);
-};
-
-export const requestFrequentItems = ({ commit }) => {
- commit(types.REQUEST_FREQUENT_ITEMS);
-};
-export const receiveFrequentItemsSuccess = ({ commit }, data) => {
- commit(types.RECEIVE_FREQUENT_ITEMS_SUCCESS, data);
-};
-export const receiveFrequentItemsError = ({ commit }) => {
- commit(types.RECEIVE_FREQUENT_ITEMS_ERROR);
-};
-
-export const fetchFrequentItems = ({ state, dispatch }) => {
- dispatch('requestFrequentItems');
-
- if (AccessorUtilities.canUseLocalStorage()) {
- const storedFrequentItems = JSON.parse(localStorage.getItem(state.storageKey));
-
- dispatch(
- 'receiveFrequentItemsSuccess',
- !storedFrequentItems ? [] : getTopFrequentItems(storedFrequentItems),
- );
- } else {
- dispatch('receiveFrequentItemsError');
- }
-};
-
-export const requestSearchedItems = ({ commit }) => {
- commit(types.REQUEST_SEARCHED_ITEMS);
-};
-export const receiveSearchedItemsSuccess = ({ commit }, data) => {
- commit(types.RECEIVE_SEARCHED_ITEMS_SUCCESS, data);
-};
-export const receiveSearchedItemsError = ({ commit }) => {
- commit(types.RECEIVE_SEARCHED_ITEMS_ERROR);
-};
-export const fetchSearchedItems = ({ state, dispatch }, searchQuery) => {
- dispatch('requestSearchedItems');
-
- const params = {
- simple: true,
- per_page: 20,
- membership: isLoggedIn(),
- };
-
- let searchFunction;
- if (state.namespace === 'projects') {
- searchFunction = getProjects;
- params.order_by = 'last_activity_at';
- } else {
- searchFunction = getGroups;
- }
-
- return searchFunction(searchQuery, params)
- .then((results) => {
- dispatch('receiveSearchedItemsSuccess', results);
- })
- .catch(() => {
- dispatch('receiveSearchedItemsError');
- });
-};
-
-export const setSearchQuery = ({ commit, dispatch }, query) => {
- commit(types.SET_SEARCH_QUERY, query);
-
- if (query) {
- dispatch('fetchSearchedItems', query);
- } else {
- dispatch('fetchFrequentItems');
- }
-};
-
-export const removeFrequentItemSuccess = ({ commit }, itemId) => {
- commit(types.RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS, itemId);
-};
-
-export const removeFrequentItemError = ({ commit }) => {
- commit(types.RECEIVE_REMOVE_FREQUENT_ITEM_ERROR);
-};
-
-export const removeFrequentItem = ({ state, dispatch }, itemId) => {
- if (AccessorUtilities.canUseLocalStorage()) {
- try {
- const storedRawItems = JSON.parse(localStorage.getItem(state.storageKey));
- localStorage.setItem(
- state.storageKey,
- JSON.stringify(storedRawItems.filter((item) => item.id !== itemId)),
- );
- dispatch('removeFrequentItemSuccess', itemId);
- } catch {
- dispatch('removeFrequentItemError');
- }
- } else {
- dispatch('removeFrequentItemError');
- }
-};
diff --git a/app/assets/javascripts/frequent_items/store/getters.js b/app/assets/javascripts/frequent_items/store/getters.js
deleted file mode 100644
index e52678dbec2..00000000000
--- a/app/assets/javascripts/frequent_items/store/getters.js
+++ /dev/null
@@ -1 +0,0 @@
-export const hasSearchQuery = (state) => state.searchQuery !== '';
diff --git a/app/assets/javascripts/frequent_items/store/index.js b/app/assets/javascripts/frequent_items/store/index.js
deleted file mode 100644
index 3e5c9618805..00000000000
--- a/app/assets/javascripts/frequent_items/store/index.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// eslint-disable-next-line no-restricted-imports
-import Vuex from 'vuex';
-import { FREQUENT_ITEMS_DROPDOWNS } from '../constants';
-import * as actions from './actions';
-import * as getters from './getters';
-import mutations from './mutations';
-import state from './state';
-
-export const createFrequentItemsModule = (initState = {}) => ({
- namespaced: true,
- actions,
- getters,
- mutations,
- state: state(initState),
-});
-
-export const createStoreOptions = () => ({
- modules: FREQUENT_ITEMS_DROPDOWNS.reduce(
- (acc, { namespace, vuexModule }) =>
- Object.assign(acc, {
- [vuexModule]: createFrequentItemsModule({ dropdownType: namespace }),
- }),
- {},
- ),
-});
-
-export const createStore = () => {
- return new Vuex.Store(createStoreOptions());
-};
diff --git a/app/assets/javascripts/frequent_items/store/mutation_types.js b/app/assets/javascripts/frequent_items/store/mutation_types.js
deleted file mode 100644
index 9c9346081e9..00000000000
--- a/app/assets/javascripts/frequent_items/store/mutation_types.js
+++ /dev/null
@@ -1,12 +0,0 @@
-export const SET_NAMESPACE = 'SET_NAMESPACE';
-export const SET_STORAGE_KEY = 'SET_STORAGE_KEY';
-export const SET_SEARCH_QUERY = 'SET_SEARCH_QUERY';
-export const TOGGLE_ITEMS_LIST_EDITABILITY = 'TOGGLE_ITEMS_LIST_EDITABILITY';
-export const REQUEST_FREQUENT_ITEMS = 'REQUEST_FREQUENT_ITEMS';
-export const RECEIVE_FREQUENT_ITEMS_SUCCESS = 'RECEIVE_FREQUENT_ITEMS_SUCCESS';
-export const RECEIVE_FREQUENT_ITEMS_ERROR = 'RECEIVE_FREQUENT_ITEMS_ERROR';
-export const REQUEST_SEARCHED_ITEMS = 'REQUEST_SEARCHED_ITEMS';
-export const RECEIVE_SEARCHED_ITEMS_SUCCESS = 'RECEIVE_SEARCHED_ITEMS_SUCCESS';
-export const RECEIVE_SEARCHED_ITEMS_ERROR = 'RECEIVE_SEARCHED_ITEMS_ERROR';
-export const RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS = 'RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS';
-export const RECEIVE_REMOVE_FREQUENT_ITEM_ERROR = 'RECEIVE_REMOVE_FREQUENT_ITEM_ERROR';
diff --git a/app/assets/javascripts/frequent_items/store/mutations.js b/app/assets/javascripts/frequent_items/store/mutations.js
deleted file mode 100644
index 9882bef444a..00000000000
--- a/app/assets/javascripts/frequent_items/store/mutations.js
+++ /dev/null
@@ -1,88 +0,0 @@
-import * as types from './mutation_types';
-
-export default {
- [types.SET_NAMESPACE](state, namespace) {
- Object.assign(state, {
- namespace,
- });
- },
- [types.SET_STORAGE_KEY](state, storageKey) {
- Object.assign(state, {
- storageKey,
- });
- },
- [types.SET_SEARCH_QUERY](state, searchQuery) {
- const hasSearchQuery = searchQuery !== '';
-
- Object.assign(state, {
- searchQuery,
- isLoadingItems: true,
- hasSearchQuery,
- });
- },
- [types.TOGGLE_ITEMS_LIST_EDITABILITY](state) {
- Object.assign(state, {
- isItemsListEditable: !state.isItemsListEditable,
- });
- },
- [types.REQUEST_FREQUENT_ITEMS](state) {
- Object.assign(state, {
- isLoadingItems: true,
- hasSearchQuery: false,
- });
- },
- [types.RECEIVE_FREQUENT_ITEMS_SUCCESS](state, rawItems) {
- Object.assign(state, {
- items: rawItems,
- isLoadingItems: false,
- hasSearchQuery: false,
- isFetchFailed: false,
- });
- },
- [types.RECEIVE_FREQUENT_ITEMS_ERROR](state) {
- Object.assign(state, {
- isLoadingItems: false,
- hasSearchQuery: false,
- isFetchFailed: true,
- });
- },
- [types.REQUEST_SEARCHED_ITEMS](state) {
- Object.assign(state, {
- isLoadingItems: true,
- hasSearchQuery: true,
- });
- },
- [types.RECEIVE_SEARCHED_ITEMS_SUCCESS](state, results) {
- const rawItems = results.data;
- Object.assign(state, {
- items: rawItems.map((rawItem) => ({
- id: rawItem.id,
- name: rawItem.name,
- namespace: rawItem.name_with_namespace || rawItem.full_name,
- webUrl: rawItem.web_url,
- avatarUrl: rawItem.avatar_url,
- })),
- isLoadingItems: false,
- hasSearchQuery: true,
- isFetchFailed: false,
- });
- },
- [types.RECEIVE_SEARCHED_ITEMS_ERROR](state) {
- Object.assign(state, {
- isLoadingItems: false,
- hasSearchQuery: true,
- isFetchFailed: true,
- });
- },
- [types.RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS](state, itemId) {
- Object.assign(state, {
- items: state.items.filter((item) => item.id !== itemId),
- isItemRemovalFailed: false,
- });
- },
- [types.RECEIVE_REMOVE_FREQUENT_ITEM_ERROR](state) {
- Object.assign(state, {
- isItemRemovalFailed: true,
- });
- },
-};
diff --git a/app/assets/javascripts/frequent_items/store/state.js b/app/assets/javascripts/frequent_items/store/state.js
deleted file mode 100644
index ee94e9cd221..00000000000
--- a/app/assets/javascripts/frequent_items/store/state.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export default ({ dropdownType = '' } = {}) => ({
- namespace: '',
- dropdownType,
- storageKey: '',
- searchQuery: '',
- isLoadingItems: false,
- isFetchFailed: false,
- isItemsListEditable: false,
- isItemRemovalFailed: false,
- items: [],
-});
diff --git a/app/assets/javascripts/frequent_items/utils.js b/app/assets/javascripts/frequent_items/utils.js
deleted file mode 100644
index f71405a5bc4..00000000000
--- a/app/assets/javascripts/frequent_items/utils.js
+++ /dev/null
@@ -1,67 +0,0 @@
-import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
-import { take } from 'lodash';
-import { sanitize } from '~/lib/dompurify';
-import { FREQUENT_ITEMS, FIFTEEN_MINUTES_IN_MS } from './constants';
-
-export const isMobile = () => ['md', 'sm', 'xs'].includes(bp.getBreakpointSize());
-
-export const getTopFrequentItems = (items) => {
- if (!items) {
- return [];
- }
- const frequentItemsCount = isMobile()
- ? FREQUENT_ITEMS.LIST_COUNT_MOBILE
- : FREQUENT_ITEMS.LIST_COUNT_DESKTOP;
-
- const frequentItems = items.filter((item) => item.frequency >= FREQUENT_ITEMS.ELIGIBLE_FREQUENCY);
-
- if (!frequentItems || frequentItems.length === 0) {
- return [];
- }
-
- frequentItems.sort((itemA, itemB) => {
- // Sort all frequent items in decending order of frequency
- // and then by lastAccessedOn with recent most first
- if (itemA.frequency !== itemB.frequency) {
- return itemB.frequency - itemA.frequency;
- }
- if (itemA.lastAccessedOn !== itemB.lastAccessedOn) {
- return itemB.lastAccessedOn - itemA.lastAccessedOn;
- }
-
- return 0;
- });
-
- return take(frequentItems, frequentItemsCount);
-};
-
-export const updateExistingFrequentItem = (frequentItem, item) => {
- // `frequentItem` comes from localStorage and it's possible it doesn't have a `lastAccessedOn`
- const neverAccessed = !frequentItem.lastAccessedOn;
- const shouldUpdate =
- neverAccessed ||
- Math.abs(item.lastAccessedOn - frequentItem.lastAccessedOn) / FIFTEEN_MINUTES_IN_MS > 1;
-
- return {
- ...item,
- frequency: shouldUpdate ? frequentItem.frequency + 1 : frequentItem.frequency,
- lastAccessedOn: shouldUpdate ? Date.now() : frequentItem.lastAccessedOn,
- };
-};
-
-export const sanitizeItem = (item) => {
- // Only sanitize if the key exists on the item
- const maybeSanitize = (key) => {
- if (!Object.prototype.hasOwnProperty.call(item, key)) {
- return {};
- }
-
- return { [key]: sanitize(item[key].toString(), { ALLOWED_TAGS: [] }) };
- };
-
- return {
- ...item,
- ...maybeSanitize('name'),
- ...maybeSanitize('namespace'),
- };
-};
diff --git a/app/assets/javascripts/import/details/components/bulk_import_details_app.vue b/app/assets/javascripts/import/details/components/bulk_import_details_app.vue
index 5da16454032..a248dd3d2c4 100644
--- a/app/assets/javascripts/import/details/components/bulk_import_details_app.vue
+++ b/app/assets/javascripts/import/details/components/bulk_import_details_app.vue
@@ -1,10 +1,14 @@
<script>
-import { __ } from '~/locale';
+import { sprintf, s__, __ } from '~/locale';
+import { getParameterValues } from '~/lib/utils/url_utility';
+
import ImportDetailsTable from '~/import/details/components/import_details_table.vue';
export default {
name: 'BulkImportDetailsApp',
- components: { ImportDetailsTable },
+ components: {
+ ImportDetailsTable,
+ },
fields: [
{
@@ -28,12 +32,25 @@ export default {
],
LOCAL_STORAGE_KEY: 'gl-bulk-import-details-page-size',
+
+ gitlabLogo: window.gon.gitlab_logo,
+
+ computed: {
+ title() {
+ const id = getParameterValues('entity_id')[0];
+
+ return sprintf(s__('BulkImport|Items that failed to be imported for %{id}'), { id });
+ },
+ },
};
</script>
<template>
<div>
- <h1>{{ s__('Import|GitLab Migration details') }}</h1>
+ <h1 class="gl-font-size-h1 gl-my-0 gl-py-4 gl-display-flex gl-align-items-center gl-gap-3">
+ <img :src="$options.gitlabLogo" class="gl-w-6 gl-h-6" />
+ <span>{{ title }}</span>
+ </h1>
<import-details-table
bulk-import
diff --git a/app/assets/javascripts/import/details/components/import_details_table.vue b/app/assets/javascripts/import/details/components/import_details_table.vue
index fa22991bec0..8b9bf14e3a3 100644
--- a/app/assets/javascripts/import/details/components/import_details_table.vue
+++ b/app/assets/javascripts/import/details/components/import_details_table.vue
@@ -140,7 +140,7 @@ export default {
<template>
<div>
- <gl-table :fields="fields" :items="items" class="gl-mt-5" :busy="loading" show-empty>
+ <gl-table :fields="fields" :items="items" :busy="loading" show-empty>
<template #table-busy>
<gl-loading-icon size="lg" class="gl-my-5" />
</template>
diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
index 82faf4fc110..8c6c11a9704 100644
--- a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
+++ b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
@@ -591,11 +591,11 @@ export default {
<template>
<div>
<div
- class="gl-display-flex gl-align-items-center gl-border-solid gl-border-gray-200 gl-border-0 gl-border-b-1"
+ class="gl-display-flex gl-align-items-center gl-border-solid gl-border-gray-100 gl-border-0 gl-border-b-1"
>
- <h1 class="gl-my-0 gl-py-4 gl-font-size-h1gl-display-flex">
- <img :src="$options.gitlabLogo" class="gl-w-6 gl-h-6 gl-mb-2 gl-display-inline gl-mr-2" />
- {{ s__('BulkImport|Import groups from GitLab') }}
+ <h1 class="gl-font-size-h1 gl-my-0 gl-py-4 gl-display-flex gl-align-items-center gl-gap-3">
+ <img :src="$options.gitlabLogo" class="gl-w-6 gl-h-6" />
+ <span>{{ s__('BulkImport|Import groups by direct transfer') }}</span>
</h1>
<gl-link :href="historyPath" class="gl-ml-auto">{{ s__('BulkImport|History') }}</gl-link>
</div>
diff --git a/app/assets/javascripts/issues/show/components/header_actions.vue b/app/assets/javascripts/issues/show/components/header_actions.vue
index c362175a99a..a609e864243 100644
--- a/app/assets/javascripts/issues/show/components/header_actions.vue
+++ b/app/assets/javascripts/issues/show/components/header_actions.vue
@@ -320,7 +320,7 @@ export default {
:loading="isToggleStateButtonLoading"
placement="right"
>
- <template v-if="showMovedSidebarOptions">
+ <template v-if="showMovedSidebarOptions && !glFeatures.notificationsTodosButtons">
<sidebar-subscriptions-widget
:iid="String(iid)"
:full-path="fullPath"
diff --git a/app/assets/javascripts/lib/utils/vuex_module_mappers.js b/app/assets/javascripts/lib/utils/vuex_module_mappers.js
deleted file mode 100644
index 5298eb67c2b..00000000000
--- a/app/assets/javascripts/lib/utils/vuex_module_mappers.js
+++ /dev/null
@@ -1,92 +0,0 @@
-import { mapValues, isString } from 'lodash';
-// eslint-disable-next-line no-restricted-imports
-import { mapState, mapActions } from 'vuex';
-
-export const REQUIRE_STRING_ERROR_MESSAGE =
- '`vuex_module_mappers` can only be used with an array of strings, or an object with string values. Consider using the regular `vuex` map helpers instead.';
-
-const normalizeFieldsToObject = (fields) => {
- return Array.isArray(fields)
- ? fields.reduce((acc, key) => Object.assign(acc, { [key]: key }), {})
- : fields;
-};
-
-const mapVuexModuleFields = ({ namespaceSelector, fields, vuexHelper, selector } = {}) => {
- // The `vuexHelper` needs an object which maps keys to field selector functions.
- const map = mapValues(normalizeFieldsToObject(fields), (value) => {
- if (!isString(value)) {
- throw new Error(REQUIRE_STRING_ERROR_MESSAGE);
- }
-
- // We need to use a good ol' function to capture the right "this".
- return function mappedFieldSelector(...args) {
- const namespace = namespaceSelector(this);
-
- return selector(namespace, value, ...args);
- };
- });
-
- return vuexHelper(map);
-};
-
-/**
- * Like `mapState`, but takes a function in the first param for selecting a namespace.
- *
- * ```
- * computed: {
- * ...mapVuexModuleState(vm => vm.vuexModule, ['foo']),
- * }
- * ```
- *
- * @param {Function} namespaceSelector
- * @param {Array|Object} fields
- */
-export const mapVuexModuleState = (namespaceSelector, fields) =>
- mapVuexModuleFields({
- namespaceSelector,
- fields,
- vuexHelper: mapState,
- selector: (namespace, value, state) => state[namespace][value],
- });
-
-/**
- * Like `mapActions`, but takes a function in the first param for selecting a namespace.
- *
- * ```
- * methods: {
- * ...mapVuexModuleActions(vm => vm.vuexModule, ['fetchFoos']),
- * }
- * ```
- *
- * @param {Function} namespaceSelector
- * @param {Array|Object} fields
- */
-export const mapVuexModuleActions = (namespaceSelector, fields) =>
- mapVuexModuleFields({
- namespaceSelector,
- fields,
- vuexHelper: mapActions,
- selector: (namespace, value, dispatch, ...args) => dispatch(`${namespace}/${value}`, ...args),
- });
-
-/**
- * Like `mapGetters`, but takes a function in the first param for selecting a namespace.
- *
- * ```
- * computed: {
- * ...mapGetters(vm => vm.vuexModule, ['hasSearchInfo']),
- * }
- * ```
- *
- * @param {Function} namespaceSelector
- * @param {Array|Object} fields
- */
-export const mapVuexModuleGetters = (namespaceSelector, fields) =>
- mapVuexModuleFields({
- namespaceSelector,
- fields,
- // `mapGetters` does not let us pass an object which maps to functions. Thankfully `mapState` does
- // and gives us access to the getters.
- vuexHelper: mapState,
- selector: (namespace, value, state, getters) => getters[`${namespace}/${value}`],
- });
diff --git a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
index 23d6fa64c64..e99aceb2196 100644
--- a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
+++ b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
@@ -233,14 +233,11 @@ export default {
<template>
<div>
- <div
- class="gl-border-solid gl-border-gray-200 gl-border-0 gl-border-b-1 gl-display-flex gl-align-items-center"
- >
- <h1 class="gl-my-0 gl-py-4 gl-font-size-h1">
- <img :src="$options.gitlabLogo" class="gl-w-6 gl-h-6 gl-mb-2 gl-display-inline gl-mr-2" />
- {{ s__('BulkImport|GitLab Migration history') }}
- </h1>
- </div>
+ <h1 class="gl-font-size-h1 gl-my-0 gl-py-4 gl-display-flex gl-align-items-center gl-gap-3">
+ <img :src="$options.gitlabLogo" class="gl-w-6 gl-h-6" />
+ <span>{{ s__('BulkImport|Direct transfer history') }}</span>
+ </h1>
+
<gl-loading-icon v-if="loading" size="lg" class="gl-mt-5" />
<gl-empty-state
v-else-if="!hasHistoryItems"
diff --git a/app/assets/javascripts/pages/import/history/components/import_history_app.vue b/app/assets/javascripts/pages/import/history/components/import_history_app.vue
index 9c0f937fe0e..94fa40cc700 100644
--- a/app/assets/javascripts/pages/import/history/components/import_history_app.vue
+++ b/app/assets/javascripts/pages/import/history/components/import_history_app.vue
@@ -154,9 +154,7 @@ export default {
</gl-link>
<span v-else>{{ item.import_url }}</span>
</template>
- <span v-else>{{
- s__('BulkImport|Template / File-based import / GitLab Migration')
- }}</span>
+ <span v-else>{{ s__('BulkImport|Template / File-based import / Direct transfer') }}</span>
</template>
<template #cell(destination)="{ item }">
<gl-link :href="item.http_url_to_repo">
diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
index e5d2392b454..69ea29edc14 100644
--- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
+++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
@@ -9,7 +9,7 @@ import ServiceDeskSetting from './service_desk_setting.vue';
const CustomEmailWrapper = () => import('./custom_email_wrapper.vue');
export default {
- serviceDeskEmailHelpPath: helpPagePath('/user/project/service_desk.html', {
+ serviceDeskEmailHelpPath: helpPagePath('/user/project/service_desk/configure.html', {
anchor: 'use-an-additional-service-desk-alias-email',
}),
components: {
diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
index 5febb6ff0aa..891ad53dd10 100644
--- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
+++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
@@ -132,12 +132,12 @@ export default {
return this.serviceDeskEmail && this.serviceDeskEmail !== this.incomingEmail;
},
emailSuffixHelpUrl() {
- return helpPagePath('user/project/service_desk.html', {
+ return helpPagePath('user/project/service_desk/configure.html', {
anchor: 'configure-a-suffix-for-service-desk-alias-email',
});
},
serviceDeskEmailAddressHelpUrl() {
- return helpPagePath('user/project/service_desk.html', {
+ return helpPagePath('user/project/service_desk/configure.html', {
anchor: 'use-an-additional-service-desk-alias-email',
});
},
diff --git a/app/assets/javascripts/super_sidebar/constants.js b/app/assets/javascripts/super_sidebar/constants.js
index f4da76f4a6e..061c0c855fe 100644
--- a/app/assets/javascripts/super_sidebar/constants.js
+++ b/app/assets/javascripts/super_sidebar/constants.js
@@ -57,3 +57,15 @@ export const DROPDOWN_Y_OFFSET = 4;
export const NAV_ITEM_LINK_ACTIVE_CLASS = 'gl-bg-t-gray-a-08';
export const IMPERSONATING_OFFSET = 34;
+
+// Frequent items constants
+export const FREQUENT_ITEMS = {
+ MAX_COUNT: 20,
+ ELIGIBLE_FREQUENCY: 3,
+};
+
+export const FIFTEEN_MINUTES_IN_MS = 900000;
+
+export const STORAGE_KEY = {
+ projects: 'frequent-projects',
+};
diff --git a/app/assets/javascripts/super_sidebar/utils.js b/app/assets/javascripts/super_sidebar/utils.js
index 2f24eb84f92..18334a7d139 100644
--- a/app/assets/javascripts/super_sidebar/utils.js
+++ b/app/assets/javascripts/super_sidebar/utils.js
@@ -1,6 +1,6 @@
import * as Sentry from '~/sentry/sentry_browser_wrapper';
import AccessorUtilities from '~/lib/utils/accessor';
-import { FREQUENT_ITEMS, FIFTEEN_MINUTES_IN_MS } from '~/frequent_items/constants';
+import { FREQUENT_ITEMS, FIFTEEN_MINUTES_IN_MS } from '~/super_sidebar/constants';
import axios from '~/lib/utils/axios_utils';
/**
diff --git a/app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue b/app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue
index d99b90fa561..a7dfc1e2cdb 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue
@@ -88,7 +88,7 @@ export default {
placement="right"
searchable
size="small"
- class="comment-template-dropdown gl-mr-3"
+ class="comment-template-dropdown gl-mr-2"
positioning-strategy="fixed"
:searching="$apollo.queries.savedReplies.loading"
@shown="fetchCommentTemplates"
diff --git a/app/assets/javascripts/vue_shared/components/markdown/header.vue b/app/assets/javascripts/vue_shared/components/markdown/header.vue
index 2d088aa2200..8b9600b2f07 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/header.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/header.vue
@@ -21,6 +21,7 @@ import { updateText } from '~/lib/utils/text_markdown';
import ToolbarButton from './toolbar_button.vue';
import DrawioToolbarButton from './drawio_toolbar_button.vue';
import CommentTemplatesDropdown from './comment_templates_dropdown.vue';
+import HeaderDivider from './header_divider.vue';
export default {
components: {
@@ -30,6 +31,7 @@ export default {
DrawioToolbarButton,
CommentTemplatesDropdown,
AiActionsDropdown: () => import('ee_component/ai/components/ai_actions_dropdown.vue'),
+ HeaderDivider,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -261,249 +263,271 @@ export default {
<div class="gl-display-flex gl-align-items-center gl-flex-wrap">
<div
data-testid="md-header-toolbar"
- class="md-header-toolbar gl-display-flex gl-py-3 gl-flex-wrap gl-row-gap-3"
+ class="md-header-toolbar gl-display-flex gl-py-3 gl-row-gap-2 gl-flex-grow-1 gl-align-items-flex-start"
>
- <gl-button
- v-if="enablePreview"
- data-testid="preview-toggle"
- :value="previewMarkdown ? 'preview' : 'edit'"
- :label="$options.i18n.previewTabTitle"
- class="js-md-preview-button gl-flex-direction-row-reverse gl-align-items-center gl-font-weight-normal! gl-mr-2"
- size="small"
- category="tertiary"
- @click="switchPreview"
- >{{ previewMarkdown ? $options.i18n.hidePreview : $options.i18n.preview }}</gl-button
- >
- <template v-if="!previewMarkdown && canSuggest">
+ <div class="gl-display-flex gl-flex-wrap gl-row-gap-2">
+ <gl-button
+ v-if="enablePreview"
+ data-testid="preview-toggle"
+ :value="previewMarkdown ? 'preview' : 'edit'"
+ :label="$options.i18n.previewTabTitle"
+ class="js-md-preview-button gl-flex-direction-row-reverse gl-align-items-center gl-font-weight-normal!"
+ size="small"
+ category="tertiary"
+ @click="switchPreview"
+ >{{ previewMarkdown ? $options.i18n.hidePreview : $options.i18n.preview }}</gl-button
+ >
+ <template v-if="!previewMarkdown && canSuggest">
+ <div class="gl-display-flex gl-row-gap-2">
+ <header-divider :preview-markdown="previewMarkdown" />
+ <toolbar-button
+ ref="suggestButton"
+ :tag="mdSuggestion"
+ :prepend="true"
+ :button-title="__('Insert suggestion')"
+ :cursor-offset="4"
+ :tag-content="lineContent"
+ tracking-property="codeSuggestion"
+ icon="doc-code"
+ data-testid="suggestion-button"
+ class="js-suggestion-btn"
+ @click="handleSuggestDismissed"
+ />
+ <gl-popover
+ v-if="suggestPopoverVisible"
+ :target="$refs.suggestButton.$el"
+ :css-classes="['diff-suggest-popover']"
+ placement="bottom"
+ :show="suggestPopoverVisible"
+ triggers=""
+ >
+ <strong>{{ __('New! Suggest changes directly') }}</strong>
+ <p class="mb-2">
+ {{
+ __(
+ 'Suggest code changes which can be immediately applied in one click. Try it out!',
+ )
+ }}
+ </p>
+ <gl-button
+ variant="confirm"
+ category="primary"
+ size="small"
+ data-testid="dismiss-suggestion-popover-button"
+ @click="handleSuggestDismissed"
+ >
+ {{ __('Got it') }}
+ </gl-button>
+ </gl-popover>
+ </div>
+ </template>
+ <div class="gl-display-flex gl-row-gap-2">
+ <div
+ v-if="!previewMarkdown && editorAiActions.length"
+ class="gl-display-flex gl-row-gap-2"
+ >
+ <header-divider :preview-markdown="previewMarkdown" />
+ <ai-actions-dropdown
+ :actions="editorAiActions"
+ @input="insertAIAction"
+ @replace="replaceTextarea"
+ />
+ </div>
+ <header-divider :preview-markdown="previewMarkdown" />
+ </div>
+ <toolbar-button
+ v-show="!previewMarkdown"
+ tag="**"
+ :button-title="
+ /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
+ sprintf(s__('MarkdownEditor|Add bold text (%{modifierKey}B)'), {
+ modifierKey,
+ }) /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */
+ "
+ :shortcuts="$options.shortcuts.bold"
+ icon="bold"
+ tracking-property="bold"
+ />
<toolbar-button
- ref="suggestButton"
- :tag="mdSuggestion"
+ v-show="!previewMarkdown"
+ tag="_"
+ :button-title="
+ /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
+ sprintf(s__('MarkdownEditor|Add italic text (%{modifierKey}I)'), {
+ modifierKey,
+ }) /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */
+ "
+ :shortcuts="$options.shortcuts.italic"
+ icon="italic"
+ tracking-property="italic"
+ />
+ <div class="gl-display-flex gl-row-gap-2">
+ <toolbar-button
+ v-if="!restrictedToolBarItems.includes('strikethrough')"
+ v-show="!previewMarkdown"
+ tag="~~"
+ :button-title="
+ /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
+ sprintf(s__('MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)'), {
+ modifierKey,
+ shiftKey /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */,
+ })
+ "
+ :shortcuts="$options.shortcuts.strikethrough"
+ icon="strikethrough"
+ tracking-property="strike"
+ />
+ <header-divider :preview-markdown="previewMarkdown" />
+ </div>
+ <toolbar-button
+ v-if="!restrictedToolBarItems.includes('quote')"
+ v-show="!previewMarkdown"
:prepend="true"
- :button-title="__('Insert suggestion')"
- :cursor-offset="4"
- :tag-content="lineContent"
- tracking-property="codeSuggestion"
- icon="doc-code"
- data-testid="suggestion-button"
- class="js-suggestion-btn"
- @click="handleSuggestDismissed"
+ :tag="tag"
+ :button-title="__('Insert a quote')"
+ icon="quote"
+ tracking-property="blockquote"
+ @click="handleQuote"
/>
- <gl-popover
- v-if="suggestPopoverVisible"
- :target="$refs.suggestButton.$el"
- :css-classes="['diff-suggest-popover']"
- placement="bottom"
- :show="suggestPopoverVisible"
- triggers=""
- >
- <strong>{{ __('New! Suggest changes directly') }}</strong>
- <p class="mb-2">
- {{
- __(
- 'Suggest code changes which can be immediately applied in one click. Try it out!',
- )
- }}
- </p>
- <gl-button
- variant="confirm"
- category="primary"
- size="small"
- data-testid="dismiss-suggestion-popover-button"
- @click="handleSuggestDismissed"
- >
- {{ __('Got it') }}
- </gl-button>
- </gl-popover>
- </template>
- <ai-actions-dropdown
- v-if="!previewMarkdown && editorAiActions.length"
- :actions="editorAiActions"
- @input="insertAIAction"
- @replace="replaceTextarea"
- />
- <toolbar-button
- v-show="!previewMarkdown"
- tag="**"
- :button-title="
- /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
- sprintf(s__('MarkdownEditor|Add bold text (%{modifierKey}B)'), {
- modifierKey,
- }) /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */
- "
- :shortcuts="$options.shortcuts.bold"
- icon="bold"
- tracking-property="bold"
- />
- <toolbar-button
- v-show="!previewMarkdown"
- tag="_"
- :button-title="
- /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
- sprintf(s__('MarkdownEditor|Add italic text (%{modifierKey}I)'), {
- modifierKey,
- }) /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */
- "
- :shortcuts="$options.shortcuts.italic"
- icon="italic"
- tracking-property="italic"
- />
- <toolbar-button
- v-if="!restrictedToolBarItems.includes('strikethrough')"
- v-show="!previewMarkdown"
- tag="~~"
- :button-title="
- /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
- sprintf(s__('MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)'), {
- modifierKey,
- shiftKey /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */,
- })
- "
- :shortcuts="$options.shortcuts.strikethrough"
- icon="strikethrough"
- tracking-property="strike"
- />
- <toolbar-button
- v-if="!restrictedToolBarItems.includes('quote')"
- v-show="!previewMarkdown"
- :prepend="true"
- :tag="tag"
- :button-title="__('Insert a quote')"
- icon="quote"
- tracking-property="blockquote"
- @click="handleQuote"
- />
- <toolbar-button
- v-show="!previewMarkdown"
- tag="`"
- tag-block="```"
- :button-title="__('Insert code')"
- icon="code"
- tracking-property="code"
- />
- <toolbar-button
- v-show="!previewMarkdown"
- tag="[{text}](url)"
- tag-select="url"
- :button-title="
- /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
- sprintf(s__('MarkdownEditor|Add a link (%{modifierKey}K)'), {
- modifierKey,
- }) /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */
- "
- :shortcuts="$options.shortcuts.link"
- icon="link"
- tracking-property="link"
- />
- <toolbar-button
- v-if="!restrictedToolBarItems.includes('bullet-list')"
- v-show="!previewMarkdown"
- :prepend="true"
- tag="- "
- :button-title="__('Add a bullet list')"
- icon="list-bulleted"
- tracking-property="bulletList"
- />
- <toolbar-button
- v-if="!restrictedToolBarItems.includes('numbered-list')"
- v-show="!previewMarkdown"
- :prepend="true"
- tag="1. "
- :button-title="__('Add a numbered list')"
- icon="list-numbered"
- tracking-property="orderedList"
- />
- <toolbar-button
- v-if="!restrictedToolBarItems.includes('task-list')"
- v-show="!previewMarkdown"
- :prepend="true"
- tag="- [ ] "
- :button-title="__('Add a checklist')"
- icon="list-task"
- tracking-property="taskList"
- />
- <toolbar-button
- v-if="!restrictedToolBarItems.includes('indent')"
- v-show="!previewMarkdown"
- class="gl-display-none"
- :button-title="
- /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
- sprintf(s__('MarkdownEditor|Indent line (%{modifierKey}])'), {
- modifierKey /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */,
- })
- "
- :shortcuts="$options.shortcuts.indent"
- command="indentLines"
- icon="list-indent"
- tracking-property="indent"
- />
- <toolbar-button
- v-if="!restrictedToolBarItems.includes('outdent')"
- v-show="!previewMarkdown"
- class="gl-display-none"
- :button-title="
- /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
- sprintf(s__('MarkdownEditor|Outdent line (%{modifierKey}[)'), {
- modifierKey /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */,
- })
- "
- :shortcuts="$options.shortcuts.outdent"
- command="outdentLines"
- icon="list-outdent"
- tracking-property="outdent"
- />
- <toolbar-button
- v-if="!restrictedToolBarItems.includes('collapsible-section')"
- v-show="!previewMarkdown"
- :tag="mdCollapsibleSection"
- :prepend="true"
- tag-select="Click to expand"
- :button-title="__('Add a collapsible section')"
- icon="details-block"
- tracking-property="details"
- />
- <toolbar-button
- v-if="!restrictedToolBarItems.includes('table')"
- v-show="!previewMarkdown"
- :tag="mdTable"
- :prepend="true"
- :button-title="__('Add a table')"
- icon="table"
- tracking-property="table"
- />
- <toolbar-button
- v-if="!previewMarkdown && !restrictedToolBarItems.includes('attach-file')"
- data-testid="button-attach-file"
- data-button-type="attach-file"
- :button-title="__('Attach a file or image')"
- icon="paperclip"
- class="gl-mr-3"
- tracking-property="upload"
- @click="handleAttachFile"
- />
- <drawio-toolbar-button
- v-if="!previewMarkdown && drawioEnabled"
- :uploads-path="uploadsPath"
- :markdown-preview-path="markdownPreviewPath"
- />
- <!-- TODO Add icon and trigger functionality from here -->
- <toolbar-button
- v-if="supportsQuickActions"
- v-show="!previewMarkdown"
- :prepend="true"
- tag="/"
- :button-title="__('Add a quick action')"
- icon="quick-actions"
- tracking-property="quickAction"
- />
- <comment-templates-dropdown
- v-if="!previewMarkdown && newCommentTemplatePath"
- :new-comment-template-path="newCommentTemplatePath"
- @select="insertSavedReply"
- />
- <div v-if="!previewMarkdown" class="full-screen">
+ <toolbar-button
+ v-show="!previewMarkdown"
+ tag="`"
+ tag-block="```"
+ :button-title="__('Insert code')"
+ icon="code"
+ tracking-property="code"
+ />
+ <toolbar-button
+ v-show="!previewMarkdown"
+ tag="[{text}](url)"
+ tag-select="url"
+ :button-title="
+ /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
+ sprintf(s__('MarkdownEditor|Add a link (%{modifierKey}K)'), {
+ modifierKey,
+ }) /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */
+ "
+ :shortcuts="$options.shortcuts.link"
+ icon="link"
+ tracking-property="link"
+ />
+ <toolbar-button
+ v-if="!restrictedToolBarItems.includes('bullet-list')"
+ v-show="!previewMarkdown"
+ :prepend="true"
+ tag="- "
+ :button-title="__('Add a bullet list')"
+ icon="list-bulleted"
+ tracking-property="bulletList"
+ />
+ <toolbar-button
+ v-if="!restrictedToolBarItems.includes('numbered-list')"
+ v-show="!previewMarkdown"
+ :prepend="true"
+ tag="1. "
+ :button-title="__('Add a numbered list')"
+ icon="list-numbered"
+ tracking-property="orderedList"
+ />
+ <toolbar-button
+ v-if="!restrictedToolBarItems.includes('task-list')"
+ v-show="!previewMarkdown"
+ :prepend="true"
+ tag="- [ ] "
+ :button-title="__('Add a checklist')"
+ icon="list-task"
+ tracking-property="taskList"
+ />
+ <toolbar-button
+ v-if="!restrictedToolBarItems.includes('indent')"
+ v-show="!previewMarkdown"
+ class="gl-display-none"
+ :button-title="
+ /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
+ sprintf(s__('MarkdownEditor|Indent line (%{modifierKey}])'), {
+ modifierKey /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */,
+ })
+ "
+ :shortcuts="$options.shortcuts.indent"
+ command="indentLines"
+ icon="list-indent"
+ tracking-property="indent"
+ />
+ <toolbar-button
+ v-if="!restrictedToolBarItems.includes('outdent')"
+ v-show="!previewMarkdown"
+ class="gl-display-none"
+ :button-title="
+ /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
+ sprintf(s__('MarkdownEditor|Outdent line (%{modifierKey}[)'), {
+ modifierKey /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */,
+ })
+ "
+ :shortcuts="$options.shortcuts.outdent"
+ command="outdentLines"
+ icon="list-outdent"
+ tracking-property="outdent"
+ />
+ <div class="gl-display-flex gl-row-gap-2">
+ <toolbar-button
+ v-if="!restrictedToolBarItems.includes('collapsible-section')"
+ v-show="!previewMarkdown"
+ :tag="mdCollapsibleSection"
+ :prepend="true"
+ tag-select="Click to expand"
+ :button-title="__('Add a collapsible section')"
+ icon="details-block"
+ tracking-property="details"
+ />
+ <header-divider :preview-markdown="previewMarkdown" />
+ </div>
+ <toolbar-button
+ v-if="!restrictedToolBarItems.includes('table')"
+ v-show="!previewMarkdown"
+ :tag="mdTable"
+ :prepend="true"
+ :button-title="__('Add a table')"
+ icon="table"
+ tracking-property="table"
+ />
+ <toolbar-button
+ v-if="!previewMarkdown && !restrictedToolBarItems.includes('attach-file')"
+ data-testid="button-attach-file"
+ data-button-type="attach-file"
+ :button-title="__('Attach a file or image')"
+ icon="paperclip"
+ class="gl-mr-2"
+ tracking-property="upload"
+ @click="handleAttachFile"
+ />
+ <drawio-toolbar-button
+ v-if="!previewMarkdown && drawioEnabled"
+ :uploads-path="uploadsPath"
+ :markdown-preview-path="markdownPreviewPath"
+ />
+ <!-- TODO Add icon and trigger functionality from here -->
+ <toolbar-button
+ v-if="supportsQuickActions"
+ v-show="!previewMarkdown"
+ :prepend="true"
+ tag="/"
+ :button-title="__('Add a quick action')"
+ icon="quick-actions"
+ tracking-property="quickAction"
+ />
+ <comment-templates-dropdown
+ v-if="!previewMarkdown && newCommentTemplatePath"
+ :new-comment-template-path="newCommentTemplatePath"
+ @select="insertSavedReply"
+ />
+ </div>
+ <div
+ v-if="!previewMarkdown"
+ class="full-screen gl-flex-grow-1 gl-justify-content-end gl-display-flex"
+ >
<toolbar-button
v-if="!restrictedToolBarItems.includes('full-screen')"
- class="js-zen-enter"
+ class="js-zen-enter gl-mr-0!"
icon="maximize"
:button-title="__('Go full screen')"
:prepend="true"
diff --git a/app/assets/javascripts/vue_shared/components/markdown/header_divider.vue b/app/assets/javascripts/vue_shared/components/markdown/header_divider.vue
new file mode 100644
index 00000000000..d08a3d4cd34
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/markdown/header_divider.vue
@@ -0,0 +1,16 @@
+<script>
+export default {
+ props: {
+ previewMarkdown: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+};
+</script>
+<template>
+ <div v-if="!previewMarkdown" class="md-toolbar-divider gl-display-flex gl-py-2">
+ <div class="gl-border-l gl-pl-3 gl-ml-2"></div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue b/app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue
index cf484443c07..182da7945ff 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue
@@ -111,7 +111,7 @@ export default {
type="button"
category="tertiary"
size="small"
- class="js-md gl-mr-3"
+ class="js-md gl-mr-2"
data-container="body"
@click="$emit('click', $event)"
/>
diff --git a/app/assets/stylesheets/_page_specific_files.scss b/app/assets/stylesheets/_page_specific_files.scss
index be9a06d7bb5..129a9f207f8 100644
--- a/app/assets/stylesheets/_page_specific_files.scss
+++ b/app/assets/stylesheets/_page_specific_files.scss
@@ -5,7 +5,6 @@
@import './pages/hierarchy';
@import './pages/issues';
@import './pages/note_form';
-@import './pages/notes';
@import './pages/pipelines';
@import './pages/profile';
@import './pages/registry';
diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss
index b21504a6e31..0ae88f579e6 100644
--- a/app/assets/stylesheets/framework/dropdowns.scss
+++ b/app/assets/stylesheets/framework/dropdowns.scss
@@ -836,95 +836,6 @@
}
}
-.frequent-items-dropdown-container {
- display: flex;
- flex-direction: row;
- height: $grid-size * 40;
-
- .frequent-items-dropdown-content {
- @include gl-pt-3;
- }
-
- .loading-animation {
- color: $gray-950;
- }
-
- .frequent-items-dropdown-content {
- position: relative;
- width: 70%;
- }
-
- .section-header,
- .frequent-items-list-container li.section-empty {
- color: $gl-text-color-secondary;
- font-size: $gl-font-size;
- }
-
- .frequent-items-list-container {
- padding: 8px 0;
- overflow-y: auto;
-
- li.section-empty.section-failure {
- color: $red-700;
- }
-
- .frequent-items-list-item-container .gl-button {
- &:active,
- &:focus,
- &:focus:active,
- &.is-focused {
- @include gl-focus($inset: true);
- }
- }
- }
-
- .section-header {
- font-weight: 700;
- margin-top: 8px;
- }
-}
-
-.frequent-items-list-item-container {
- .frequent-items-item-metadata-container {
- display: flex;
- flex-shrink: 0;
- flex-direction: column;
- justify-content: center;
- }
-
- .frequent-items-item-title,
- .frequent-items-item-namespace {
- max-width: 220px;
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
- }
-
- .frequent-items-item-title {
- font-size: $gl-font-size;
- font-weight: 400;
- line-height: 16px;
- }
-
- .frequent-items-item-namespace {
- margin-top: 4px;
- font-size: 12px;
- line-height: 12px;
- color: $gl-text-color-secondary;
- }
-
- @include media-breakpoint-down(xs) {
- .frequent-items-item-metadata-container {
- float: none;
- }
-
- .frequent-items-item-title,
- .frequent-items-item-namespace {
- max-width: 250px;
- }
- }
-}
-
.dropdown-content-faded-mask {
position: relative;
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index 9cb7e5584f0..8de29bd82ce 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -249,10 +249,6 @@
font-size: 10px;
}
- .frequent-items-item-select-holder {
- display: inline;
- }
-
.impersonation i {
color: $red-500;
}
@@ -523,16 +519,6 @@
}
}
-.top-nav-container-view {
- .gl-dropdown & .gl-search-box-by-type {
- @include gl-m-0;
- }
-
- .frequent-items-list-item-container > a:hover {
- background-color: $nav-active-bg !important;
- }
-}
-
.top-nav-toggle {
.dropdown-chevron {
top: 0;
diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/page_bundles/notes.scss
index eb2061081ae..1c03cb6a20e 100644
--- a/app/assets/stylesheets/pages/notes.scss
+++ b/app/assets/stylesheets/page_bundles/notes.scss
@@ -1,3 +1,7 @@
+@import 'mixins_and_variables_and_functions';
+@import 'framework/notes';
+@import 'framework/buttons';
+
$avatar-icon-size: 2rem;
$avatar-m-top: 0.5rem;
$avatar-m-ratio: 2;
@@ -985,7 +989,7 @@ $system-note-icon-m-left: $avatar-m-left + $icon-size-diff / $avatar-m-ratio;
.disabled-comment {
background-color: $gray-light;
- border-radius: $border-radius-base;
+ border-radius: $gl-border-radius-base;
border: 1px solid $border-gray-normal;
color: $note-disabled-comment-color;
padding: $gl-padding-8 0;
diff --git a/app/finders/concerns/packages/finder_helper.rb b/app/finders/concerns/packages/finder_helper.rb
index 585b35981a6..3f0e849d7ef 100644
--- a/app/finders/concerns/packages/finder_helper.rb
+++ b/app/finders/concerns/packages/finder_helper.rb
@@ -13,6 +13,21 @@ module Packages
project.packages.installable
end
+ # /!\ This function doesn't check user permissions
+ # at the package level.
+ def packages_for(user, within_group:)
+ return ::Packages::Package.none unless within_group
+ return ::Packages::Package.none unless Ability.allowed?(user, :read_group, within_group)
+
+ projects = if user.is_a?(DeployToken)
+ user.accessible_projects
+ else
+ within_group.all_projects
+ end
+
+ ::Packages::Package.for_projects(projects).installable
+ end
+
def packages_visible_to_user(user, within_group:, with_package_registry_enabled: false)
return ::Packages::Package.none unless within_group
return ::Packages::Package.none unless Ability.allowed?(user, :read_group, within_group)
diff --git a/app/finders/packages/maven/package_finder.rb b/app/finders/packages/maven/package_finder.rb
index 03855afb6e4..b288611914f 100644
--- a/app/finders/packages/maven/package_finder.rb
+++ b/app/finders/packages/maven/package_finder.rb
@@ -3,6 +3,8 @@
module Packages
module Maven
class PackageFinder < ::Packages::GroupOrProjectPackageFinder
+ extend ::Gitlab::Utils::Override
+
def execute
packages
end
@@ -15,6 +17,15 @@ module Packages
matching_packages
end
+
+ override :group_packages
+ def group_packages
+ if Feature.enabled?(:maven_remove_permissions_check_from_finder, @project_or_group)
+ packages_for(@current_user, within_group: @project_or_group)
+ else
+ super
+ end
+ end
end
end
end
diff --git a/app/helpers/json_helper.rb b/app/helpers/json_helper.rb
deleted file mode 100644
index 2a1a6272cc9..00000000000
--- a/app/helpers/json_helper.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module JsonHelper
- # These two JSON helpers are short-form wrappers for the Gitlab::Json
- # class, which should be used in place of .to_json calls or calls to
- # the JSON class.
- def json_generate(...)
- Gitlab::Json.generate(...)
- end
-
- def json_parse(...)
- Gitlab::Json.parse(...)
- end
-end
diff --git a/app/views/groups/work_items/index.html.haml b/app/views/groups/work_items/index.html.haml
index 299a90b362d..a586826967c 100644
--- a/app/views/groups/work_items/index.html.haml
+++ b/app/views/groups/work_items/index.html.haml
@@ -1,4 +1,5 @@
- page_title s_('WorkItem|Work items')
- add_page_specific_style 'page_bundles/issuable_list'
+- add_page_specific_style 'page_bundles/notes'
.js-work-items-list-root{ data: work_items_list_data(@group) }
diff --git a/app/views/import/bulk_imports/details.html.haml b/app/views/import/bulk_imports/details.html.haml
index 511bf2c38a1..871ea65f6d6 100644
--- a/app/views/import/bulk_imports/details.html.haml
+++ b/app/views/import/bulk_imports/details.html.haml
@@ -1,5 +1,8 @@
- add_to_breadcrumbs _('New group'), new_group_path
- add_to_breadcrumbs _('Import group'), new_group_path(anchor: 'import-group-pane')
-- page_title s_('Import|GitLab Migration details')
+- add_to_breadcrumbs s_('BulkImport|Direct transfer history'), history_import_bulk_imports_path
+- if params[:id].present?
+ - add_to_breadcrumbs params[:id], history_import_bulk_imports_path(bulk_import_id: params[:id])
+- page_title format(s_('Import|Failures for %{id}'), id: params[:entity_id])
.js-bulk-import-details
diff --git a/app/views/import/bulk_imports/history.html.haml b/app/views/import/bulk_imports/history.html.haml
index 57e3e60a702..483cdc1485f 100644
--- a/app/views/import/bulk_imports/history.html.haml
+++ b/app/views/import/bulk_imports/history.html.haml
@@ -1,6 +1,9 @@
- add_to_breadcrumbs _('New group'), new_group_path
- add_to_breadcrumbs _('Import group'), new_group_path(anchor: 'import-group-pane')
+- if params[:bulk_import_id].present?
+ - add_to_breadcrumbs s_('BulkImport|Direct transfer history'), history_import_bulk_imports_path
+ - breadcrumb_title params[:bulk_import_id]
+- page_title s_('BulkImport|Direct transfer history')
- add_page_specific_style 'page_bundles/import'
-- page_title _('Import history')
#import-history-mount-element{ data: { details_path: details_import_bulk_imports_path, realtime_changes_path: realtime_changes_import_bulk_imports_path(format: :json) } }
diff --git a/app/views/import/bulk_imports/status.html.haml b/app/views/import/bulk_imports/status.html.haml
index e1547920708..7a9dabcc902 100644
--- a/app/views/import/bulk_imports/status.html.haml
+++ b/app/views/import/bulk_imports/status.html.haml
@@ -1,6 +1,8 @@
- add_to_breadcrumbs _('New group'), new_group_path
+- add_to_breadcrumbs _('Import group'), new_group_path(anchor: 'import-group-pane')
+- breadcrumb_title s_('BulkImport|Direct transfer')
+- page_title s_('BulkImport|Import groups by direct transfer')
- add_page_specific_style 'page_bundles/import'
-- page_title _('Import groups')
#import-groups-mount-element{ data: { status_path: status_import_bulk_imports_path(format: :json),
default_target_namespace: @namespace&.id,
diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml
index 2c97df90110..b7e485ac0d7 100644
--- a/app/views/layouts/_head.html.haml
+++ b/app/views/layouts/_head.html.haml
@@ -2,6 +2,10 @@
- site_name = _('GitLab')
- omit_og = sign_in_with_redirect?
+-# This is a temporary place for the page specific style migrations to be included on all pages like page_specific_files
+- if Feature.disabled?(:page_specific_styles, current_user)
+ - add_page_specific_style('page_bundles/notes')
+
%head{ omit_og ? { } : { prefix: "og: http://ogp.me/ns#" } }
%meta{ charset: "utf-8" }
%meta{ 'http-equiv' => 'X-UA-Compatible', content: 'IE=edge' }
diff --git a/app/views/projects/_service_desk_settings.html.haml b/app/views/projects/_service_desk_settings.html.haml
index aee61624f69..115788e7764 100644
--- a/app/views/projects/_service_desk_settings.html.haml
+++ b/app/views/projects/_service_desk_settings.html.haml
@@ -4,7 +4,7 @@
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Service Desk')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
- - link_start = "<a href='#{help_page_path('user/project/service_desk')}' target='_blank' rel='noopener noreferrer'>".html_safe
+ - link_start = "<a href='#{help_page_path('user/project/service_desk/index')}' target='_blank' rel='noopener noreferrer'>".html_safe
%p.gl-text-secondary= _('Enable and disable Service Desk. Some additional configuration might be required. %{link_start}Learn more%{link_end}.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
.settings-content
- if ::Gitlab::ServiceDesk.supported?
diff --git a/app/views/projects/commit/show.html.haml b/app/views/projects/commit/show.html.haml
index 0868475c49f..5708eacc801 100644
--- a/app/views/projects/commit/show.html.haml
+++ b/app/views/projects/commit/show.html.haml
@@ -6,6 +6,7 @@
- page_title "#{@commit.title} (#{@commit.short_id})", _('Commits')
- page_description @commit.description
- add_page_specific_style 'page_bundles/pipelines'
+- add_page_specific_style 'page_bundles/notes'
.container-fluid{ class: [container_class] }
= render "commit_box"
diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml
index be2bf43cbb9..09efc2b9c82 100644
--- a/app/views/projects/commits/show.html.haml
+++ b/app/views/projects/commits/show.html.haml
@@ -2,6 +2,7 @@
- add_page_specific_style 'page_bundles/tree'
- add_page_specific_style 'page_bundles/merge_request'
- add_page_specific_style 'page_bundles/projects'
+- add_page_specific_style 'page_bundles/notes'
- page_title _("Commits"), @ref
= content_for :meta_tags do
diff --git a/app/views/projects/issues/service_desk/_alert_moved_from_service_desk.html.haml b/app/views/projects/issues/service_desk/_alert_moved_from_service_desk.html.haml
index b087a1d0151..3af8bbafa0f 100644
--- a/app/views/projects/issues/service_desk/_alert_moved_from_service_desk.html.haml
+++ b/app/views/projects/issues/service_desk/_alert_moved_from_service_desk.html.haml
@@ -1,5 +1,5 @@
- return unless show_moved_service_desk_issue_warning?(issue)
-- service_desk_link_url = help_page_path('user/project/service_desk')
+- service_desk_link_url = help_page_path('user/project/service_desk/index')
- service_desk_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: service_desk_link_url }
= render Pajamas::AlertComponent.new(variant: :warning,
diff --git a/app/views/projects/issues/service_desk/_service_desk_empty_state.html.haml b/app/views/projects/issues/service_desk/_service_desk_empty_state.html.haml
index 831bd107961..919810413cd 100644
--- a/app/views/projects/issues/service_desk/_service_desk_empty_state.html.haml
+++ b/app/views/projects/issues/service_desk/_service_desk_empty_state.html.haml
@@ -17,7 +17,7 @@
%code= @project.service_desk_address
%span= s_("ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation.")
- = link_to _('Learn more.'), help_page_path('user/project/service_desk')
+ = link_to _('Learn more.'), help_page_path('user/project/service_desk/index')
- if can_edit_project_settings && !service_desk_enabled
.text-center
diff --git a/app/views/projects/issues/service_desk/_service_desk_info_content.html.haml b/app/views/projects/issues/service_desk/_service_desk_info_content.html.haml
index 093a47e63be..97bfb2f9f62 100644
--- a/app/views/projects/issues/service_desk/_service_desk_info_content.html.haml
+++ b/app/views/projects/issues/service_desk/_service_desk_info_content.html.haml
@@ -17,7 +17,7 @@
%code= @project.service_desk_address
%span= s_("ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation.")
- = link_to _('Learn more.'), help_page_path('user/project/service_desk')
+ = link_to _('Learn more.'), help_page_path('user/project/service_desk/index')
- if can_edit_project_settings && !service_desk_enabled
.gl-mt-3
diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml
index 457eaf5e194..e5ede7f1546 100644
--- a/app/views/projects/issues/show.html.haml
+++ b/app/views/projects/issues/show.html.haml
@@ -12,6 +12,7 @@
- add_page_specific_style 'page_bundles/issuable'
- add_page_specific_style 'page_bundles/issues_show'
- add_page_specific_style 'page_bundles/work_items'
+- add_page_specific_style 'page_bundles/notes'
- @content_class = "limit-container-width" unless fluid_layout
diff --git a/app/views/projects/merge_requests/creations/new.html.haml b/app/views/projects/merge_requests/creations/new.html.haml
index f2c2700b012..3c51e826092 100644
--- a/app/views/projects/merge_requests/creations/new.html.haml
+++ b/app/views/projects/merge_requests/creations/new.html.haml
@@ -4,6 +4,7 @@
- add_page_specific_style 'page_bundles/pipelines'
- add_page_specific_style 'page_bundles/ci_status'
- add_page_specific_style 'page_bundles/merge_request'
+- add_page_specific_style 'page_bundles/notes'
- conflicting_mr = @merge_request.existing_mrs_targeting_same_branch.first
diff --git a/app/views/projects/merge_requests/diffs.html.haml b/app/views/projects/merge_requests/diffs.html.haml
index 03306e98407..5391d2d28ca 100644
--- a/app/views/projects/merge_requests/diffs.html.haml
+++ b/app/views/projects/merge_requests/diffs.html.haml
@@ -1,3 +1,4 @@
- add_page_specific_style 'page_bundles/merge_request'
+- add_page_specific_style 'page_bundles/notes'
= render 'page'
diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml
index e2d3e082289..d3c9709d59b 100644
--- a/app/views/projects/merge_requests/index.html.haml
+++ b/app/views/projects/merge_requests/index.html.haml
@@ -7,6 +7,7 @@
- new_merge_request_email = @project.new_issuable_address(current_user, 'merge_request')
- add_page_specific_style 'page_bundles/issuable_list'
- add_page_specific_style 'page_bundles/merge_request'
+- add_page_specific_style 'page_bundles/notes'
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, safe_params.merge(rss_url_options).to_h, title: "#{@project.name} merge requests")
diff --git a/app/views/projects/merge_requests/show.html.haml b/app/views/projects/merge_requests/show.html.haml
index 03306e98407..5391d2d28ca 100644
--- a/app/views/projects/merge_requests/show.html.haml
+++ b/app/views/projects/merge_requests/show.html.haml
@@ -1,3 +1,4 @@
- add_page_specific_style 'page_bundles/merge_request'
+- add_page_specific_style 'page_bundles/notes'
= render 'page'
diff --git a/app/views/projects/work_items/show.html.haml b/app/views/projects/work_items/show.html.haml
index 7e0bddf1b5d..3fee9a73f17 100644
--- a/app/views/projects/work_items/show.html.haml
+++ b/app/views/projects/work_items/show.html.haml
@@ -1,6 +1,7 @@
- page_title "##{request.params['iid']}"
- add_to_breadcrumbs _("Issues"), project_issues_path(@project)
- add_page_specific_style 'page_bundles/work_items'
+- add_page_specific_style 'page_bundles/notes'
- @gfm_form = true
- @noteable_type = 'WorkItem'
diff --git a/app/views/snippets/edit.html.haml b/app/views/snippets/edit.html.haml
index 2b2035e362b..1effa0de4d9 100644
--- a/app/views/snippets/edit.html.haml
+++ b/app/views/snippets/edit.html.haml
@@ -1,5 +1,6 @@
- breadcrumb_title _("Edit Snippet")
- page_title _("Edit"), "#{@snippet.title} (#{@snippet.to_reference})", _("Snippets")
+- add_page_specific_style 'page_bundles/notes'
- content_for :prefetch_asset_tags do
- webpack_preload_asset_tag('monaco')
diff --git a/app/views/snippets/new.html.haml b/app/views/snippets/new.html.haml
index da2245432ce..224dd519f6a 100644
--- a/app/views/snippets/new.html.haml
+++ b/app/views/snippets/new.html.haml
@@ -1,4 +1,5 @@
- page_title _("New Snippet")
+- add_page_specific_style 'page_bundles/notes'
.page-title-holder.d-flex.align-items-center
%h1.page-title.gl-font-size-h-display= _('New Snippet')
diff --git a/app/views/snippets/show.html.haml b/app/views/snippets/show.html.haml
index fe05a3de13a..225789cb3e9 100644
--- a/app/views/snippets/show.html.haml
+++ b/app/views/snippets/show.html.haml
@@ -9,6 +9,7 @@
- add_to_breadcrumbs _("Snippets"), explore_snippets_path
- breadcrumb_title @snippet.to_reference
- page_title "#{@snippet.title} (#{@snippet.to_reference})", _("Snippets")
+- add_page_specific_style 'page_bundles/notes'
- content_for :prefetch_asset_tags do
- webpack_preload_asset_tag('monaco', prefetch: true)
diff --git a/config/application.rb b/config/application.rb
index 7fd209b1191..ee7c0f9c178 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -362,6 +362,7 @@ module Gitlab
config.assets.precompile << "page_bundles/work_items.css"
config.assets.precompile << "page_bundles/xterm.css"
config.assets.precompile << "page_bundles/labels.css"
+ config.assets.precompile << "page_bundles/notes.css"
config.assets.precompile << "lazy_bundles/cropper.css"
config.assets.precompile << "lazy_bundles/gridstack.css"
config.assets.precompile << "performance_bar.css"
diff --git a/config/events/20210915205107_default_click_link.yml b/config/events/20210915205107_default_click_link.yml
deleted file mode 100644
index 80081cc150b..00000000000
--- a/config/events/20210915205107_default_click_link.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-description: "Open frequent items dropdown"
-category: default
-action: click_link
-label_description: "`[dropdown_type]_dropdown_frequent_items_list_item`"
-property_description: ""
-value_description: ""
-extra_properties:
-identifiers:
-product_section: dev
-product_stage: create
-product_group: group::editor
-milestone: "13.7"
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47589
-distributions:
-- ce
-- ee
-tiers:
-- free
-- premium
-- ultimate
diff --git a/config/feature_flags/development/maven_remove_permissions_check_from_finder.yml b/config/feature_flags/development/maven_remove_permissions_check_from_finder.yml
new file mode 100644
index 00000000000..6fb3eaf05b6
--- /dev/null
+++ b/config/feature_flags/development/maven_remove_permissions_check_from_finder.yml
@@ -0,0 +1,8 @@
+---
+name: maven_remove_permissions_check_from_finder
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/135494
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/430267
+milestone: '16.7'
+type: development
+group: group::package registry
+default_enabled: false
diff --git a/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml
index 1847eaf86a7..35a727f09dc 100755
--- a/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml
@@ -181,6 +181,7 @@ options:
- p_ci_templates_terraform_module_base
- p_ci_templates_terraform_module
- p_ci_templates_pages_zola
+ - p_ci_templates_diffblue_cover
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20231116002424_p_ci_templates_diffblue_cover_monthly.yml b/config/metrics/counts_28d/20231116002424_p_ci_templates_diffblue_cover_monthly.yml
new file mode 100644
index 00000000000..521ae02f6c4
--- /dev/null
+++ b/config/metrics/counts_28d/20231116002424_p_ci_templates_diffblue_cover_monthly.yml
@@ -0,0 +1,24 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_diffblue_cover_monthly
+description: Count of pipelines using the Diffblue Cover template
+product_section: ci
+product_stage: pipeline_authoring
+product_group: pipeline_authoring
+value_type: number
+status: active
+milestone: "16.7"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/137047
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_diffblue_cover
diff --git a/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml
index 3925f242efc..61fa197656b 100755
--- a/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml
@@ -182,6 +182,7 @@ options:
- p_ci_templates_terraform_module_base
- p_ci_templates_terraform_module
- p_ci_templates_pages_zola
+ - p_ci_templates_diffblue_cover
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20231116002421_p_ci_templates_diffblue_cover_weekly.yml b/config/metrics/counts_7d/20231116002421_p_ci_templates_diffblue_cover_weekly.yml
new file mode 100644
index 00000000000..b9586f213a5
--- /dev/null
+++ b/config/metrics/counts_7d/20231116002421_p_ci_templates_diffblue_cover_weekly.yml
@@ -0,0 +1,24 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_diffblue_cover_weekly
+description: Count of pipelines using the Diffblue Cover template
+product_section: ci
+product_stage: pipeline_authoring
+product_group: pipeline_authoring
+value_type: number
+status: active
+milestone: "16.7"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/137047
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_diffblue_cover
diff --git a/doc/administration/admin_area.md b/doc/administration/admin_area.md
index feb874279f5..be752635fce 100644
--- a/doc/administration/admin_area.md
+++ b/doc/administration/admin_area.md
@@ -22,8 +22,7 @@ You can administer all projects in the GitLab instance from the Admin Area's Pro
To access the Projects page:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Projects**.
1. Select the **All**, **Private**, **Internal**, or **Public** tab to list only
projects of that criteria.
@@ -74,8 +73,7 @@ You can combine the filter options. For example, to list only public projects wi
You can administer all users in the GitLab instance from the Admin Area's Users page:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
To list users matching a specific criteria, select one of the following tabs on the **Users** page:
@@ -138,8 +136,7 @@ By default, impersonation is enabled. GitLab can be configured to [disable imper
When using authentication providers, administrators can see the identities for a user:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. From the list of users, select a user.
1. Select **Identities**.
@@ -185,8 +182,7 @@ GitLab billing is based on the number of [**Billable users**](../subscriptions/s
You must be an administrator to manually add emails to users:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Locate the user and select them.
1. Select **Edit**.
@@ -202,8 +198,7 @@ The [Cohorts](user_cohorts.md) tab displays the monthly cohorts of new users and
By default, users can create top level groups. To prevent a user from creating a top level group:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Locate the user and select them.
1. Select **Edit**.
@@ -218,8 +213,7 @@ You can administer all groups in the GitLab instance from the Admin Area's Group
To access the Groups page:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Groups**.
For each group, the page displays their name, description, size, number of projects in the group,
@@ -244,16 +238,14 @@ To [Create a new group](../user/group/index.md#create-a-group) select **New grou
To view all topics in the GitLab instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Topics**.
For each topic, the page displays its name and the number of projects labeled with the topic.
### Search for topics
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Topics**.
1. In the search box, enter your search criteria.
The topic search is case-insensitive and applies partial matching.
@@ -262,8 +254,7 @@ For each topic, the page displays its name and the number of projects labeled wi
To create a topic:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Topics**.
1. Select **New topic**.
1. Enter the **Topic slug (name)** and **Topic title**.
@@ -282,8 +273,7 @@ Do not include sensitive information in the name of a topic.
You can edit a topic's name, title, description, and avatar at any time.
To edit a topic:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Topics**.
1. Select **Edit** in that topic's row.
1. Edit the topic slug (name), title, description, or avatar.
@@ -294,8 +284,7 @@ To edit a topic:
If you no longer need a topic, you can permanently remove it.
To remove a topic:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Topics**.
1. To remove a topic, select **Remove** in that topic's row.
@@ -307,8 +296,7 @@ After a merged topic is deleted, you cannot restore it.
To merge topics:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Topics**.
1. Select **Merge topics**.
1. From the **Source topic** dropdown list, select the topic you want to merge and remove.
@@ -322,8 +310,7 @@ page. For more details, see [Gitaly](gitaly/index.md).
To access the **Gitaly Servers** page:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Gitaly Servers**.
For each Gitaly server, the following details are listed:
@@ -347,8 +334,7 @@ You can administer all runners in the GitLab instance from the Admin Area's **Ru
To access the **Runners** page:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Runners**.
#### Search and filter runners
@@ -374,8 +360,7 @@ You can also filter runners by status, type, and tag. To filter:
You can delete multiple runners at the same time.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Runners**.
1. To the left of the runners you want to delete, select the checkbox.
To select all of the runners on the page, select the checkbox above
@@ -405,8 +390,7 @@ You can administer all jobs in the GitLab instance from the Admin Area's Jobs pa
To access the Jobs page:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **CI/CD > Jobs**. All jobs are listed, in descending order of job ID.
1. Select the **All** tab to list all jobs. Select the **Pending**, **Running**, or **Finished**
tab to list only jobs of that status.
diff --git a/doc/administration/analytics/dev_ops_reports.md b/doc/administration/analytics/dev_ops_reports.md
index a5a3120489d..296e22ce58a 100644
--- a/doc/administration/analytics/dev_ops_reports.md
+++ b/doc/administration/analytics/dev_ops_reports.md
@@ -12,8 +12,7 @@ from planning to monitoring.
To see DevOps Reports:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Analytics > DevOps Reports**.
## DevOps Score
diff --git a/doc/administration/analytics/index.md b/doc/administration/analytics/index.md
index de113a79f73..2dafed5617e 100644
--- a/doc/administration/analytics/index.md
+++ b/doc/administration/analytics/index.md
@@ -18,8 +18,7 @@ Prerequisites:
To view instance-level analytics:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Analytics**, then one of the available analytics:
- [DevOps Reports](dev_ops_reports.md): Provides an overview of your entire instance's feature usage.
diff --git a/doc/administration/analytics/usage_trends.md b/doc/administration/analytics/usage_trends.md
index 20b732d028d..2f8be95ac0f 100644
--- a/doc/administration/analytics/usage_trends.md
+++ b/doc/administration/analytics/usage_trends.md
@@ -19,8 +19,7 @@ Usage Trends data refreshes daily.
To view Usage Trends:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Analytics > Usage Trends**.
## Total counts
diff --git a/doc/administration/appearance.md b/doc/administration/appearance.md
index ceb4a4a30e9..9f2626ed559 100644
--- a/doc/administration/appearance.md
+++ b/doc/administration/appearance.md
@@ -9,8 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Several options are available for customizing the appearance of a self-managed instance
of GitLab. To access these settings:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Appearance**.
## Navigation bar
@@ -83,8 +82,7 @@ description, and icon.
To configure the PWA settings:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Appearance**.
1. Scroll to the **Progressive Web App (PWA)** section.
1. Complete the fields.
diff --git a/doc/administration/audit_event_streaming/index.md b/doc/administration/audit_event_streaming/index.md
index c345400da83..2c3ec2aafc3 100644
--- a/doc/administration/audit_event_streaming/index.md
+++ b/doc/administration/audit_event_streaming/index.md
@@ -357,8 +357,7 @@ Prerequisites:
To add a streaming destination for an instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select **Streams** tab.
1. Select **Add streaming destination** and select **HTTP endpoint** to show the section for adding destinations.
@@ -377,8 +376,7 @@ Prerequisites:
To list the streaming destinations for an instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select **Streams** tab.
1. Select the stream to expand it and see all the custom HTTP headers.
@@ -391,8 +389,7 @@ Prerequisites:
To update a instance streaming destination's name:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select **Streams** tab.
1. Select the stream to expand.
@@ -401,8 +398,7 @@ To update a instance streaming destination's name:
To update a instance streaming destination's custom HTTP headers:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select **Streams** tab.
1. Select the stream to expand.
@@ -424,8 +420,7 @@ Prerequisites:
To delete the streaming destinations for an instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select the **Streams** tab.
1. Select the stream to expand.
@@ -434,8 +429,7 @@ To delete the streaming destinations for an instance:
To delete only the custom HTTP headers for a streaming destination:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select the **Streams** tab.
1. To the right of the item, **Edit** (**{pencil}**).
@@ -462,8 +456,7 @@ Prerequisites:
To list streaming destinations for an instance and see the verification tokens:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select the **Streams** tab.
1. View the verification token on the right side of each item.
@@ -479,8 +472,7 @@ A streaming destination that has an event type filter set has a **filtered** (**
To update a streaming destination's event filters:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select the **Streams** tab.
1. Select the stream to expand.
@@ -521,8 +513,7 @@ Prerequisites:
To add Google Cloud Logging streaming destinations to an instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select **Streams** tab.
1. Select **Add streaming destination** and select **Google Cloud Logging** to show the section for adding destinations.
@@ -539,8 +530,7 @@ Prerequisites:
To list Google Cloud Logging streaming destinations for an instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select **Streams** tab.
1. Select the Google Cloud Logging stream to expand and see all the fields.
@@ -553,8 +543,7 @@ Prerequisites:
To update Google Cloud Logging streaming destinations to an instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select **Streams** tab.
1. Select the Google Cloud Logging stream to expand.
@@ -572,8 +561,7 @@ Prerequisites:
To delete Google Cloud Logging streaming destinations to an instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select **Streams** tab.
1. Select the Google Cloud Logging stream to expand.
diff --git a/doc/administration/audit_events.md b/doc/administration/audit_events.md
index ba1a4ca05c4..c4b0816492a 100644
--- a/doc/administration/audit_events.md
+++ b/doc/administration/audit_events.md
@@ -55,8 +55,7 @@ Project audit events can also be accessed using the [Project Audit Events API](.
You can view audit events from user actions across an entire GitLab instance.
To view instance audit events:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. Filter by the following:
- Member of the project (user) who performed the action
@@ -82,8 +81,7 @@ After upgrading to a paid tier, you can also see successful sign-in events on au
You can export the current view (including filters) of your instance audit events as a
CSV(comma-separated values) file. To export the instance audit events to CSV:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. Select the available search filters.
1. Select **Export as CSV**.
diff --git a/doc/administration/auditor_users.md b/doc/administration/auditor_users.md
index 09d68e82782..0355f7a3661 100644
--- a/doc/administration/auditor_users.md
+++ b/doc/administration/auditor_users.md
@@ -34,8 +34,7 @@ To create a new user account with auditor access (or change an existing user):
To create a user account with auditor access:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Overview > Users**.
1. Create a new user or edit an existing one. Set **Access Level** to **Auditor**.
1. If you created a user, select **Create user**. For an existing user, select **Save changes**.
diff --git a/doc/administration/auth/ldap/ldap-troubleshooting.md b/doc/administration/auth/ldap/ldap-troubleshooting.md
index 0a96e904f24..4435512f80f 100644
--- a/doc/administration/auth/ldap/ldap-troubleshooting.md
+++ b/doc/administration/auth/ldap/ldap-troubleshooting.md
@@ -225,8 +225,7 @@ field contains no data:
To resolve this:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, go to **Settings > General**.
1. Expand both of the following:
- **Account and limit**.
diff --git a/doc/administration/auth/ldap/ldap_synchronization.md b/doc/administration/auth/ldap/ldap_synchronization.md
index 0a1c0bd9689..ae05abf5a82 100644
--- a/doc/administration/auth/ldap/ldap_synchronization.md
+++ b/doc/administration/auth/ldap/ldap_synchronization.md
@@ -501,8 +501,7 @@ When global group memberships lock is enabled:
To enable global group memberships lock:
1. [Configure LDAP](index.md#configure-ldap).
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand the **Visibility and access controls** section.
1. Ensure the **Lock memberships to LDAP synchronization** checkbox is selected.
@@ -514,8 +513,7 @@ By default, group members with the Owner role can manage [LDAP group synchroniza
GitLab administrators can remove this permission from group Owners:
1. [Configure LDAP](index.md#configure-ldap).
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **Visibility and access controls**.
1. Ensure the **Allow group owners to manage LDAP-related settings** checkbox is not checked.
diff --git a/doc/administration/backup_restore/index.md b/doc/administration/backup_restore/index.md
index 580189e8752..cf7c5c3db9a 100644
--- a/doc/administration/backup_restore/index.md
+++ b/doc/administration/backup_restore/index.md
@@ -25,208 +25,8 @@ For detailed information on restoring GitLab, see [Restore GitLab](restore_gitla
## Migrate to a new server
-<!-- some details borrowed from GitLab.com move from Azure to GCP detailed at https://gitlab.com/gitlab-com/migration/-/blob/master/.gitlab/issue_templates/failover.md -->
-
-You can use GitLab backup and restore to migrate your instance to a new server. This section outlines a typical procedure for a GitLab deployment running on a single server.
-If you're running GitLab Geo, an alternative option is [Geo disaster recovery for planned failover](../geo/disaster_recovery/planned_failover.md).
-
-WARNING:
-Avoid uncoordinated data processing by both the new and old servers, where multiple
-servers could connect concurrently and process the same data. For example, when using
-[incoming email](../incoming_email.md), if both GitLab instances are
-processing email at the same time, then both instances miss some data.
-This type of problem can occur with other services as well, such as a
-[non-packaged database](https://docs.gitlab.com/omnibus/settings/database.html#using-a-non-packaged-postgresql-database-management-server),
-a non-packaged Redis instance, or non-packaged Sidekiq.
-
-Prerequisites:
-
-- Some time before your migration, consider notifying your users of upcoming
- scheduled maintenance with a [broadcast message banner](../broadcast_messages.md).
-- Ensure your backups are complete and current. Create a complete system-level backup, or
- take a snapshot of all servers involved in the migration, in case destructive commands
- (like `rm`) are run incorrectly.
-
-### Prepare the new server
-
-To prepare the new server:
-
-1. Copy the
- [SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079)
- from the old server to avoid man-in-the-middle attack warnings.
- See [Manually replicate the primary site's SSH host keys](../geo/replication/configuration.md#step-2-manually-replicate-the-primary-sites-ssh-host-keys) for example steps.
-1. [Install and configure GitLab](https://about.gitlab.com/install/) except
- [incoming email](../incoming_email.md):
- 1. Install GitLab.
- 1. Configure by copying `/etc/gitlab` files from the old server to the new server, and update as necessary.
- Read the
- [Linux package installation backup and restore instructions](https://docs.gitlab.com/omnibus/settings/backups.html) for more detail.
- 1. If applicable, disable [incoming email](../incoming_email.md).
- 1. Block new CI/CD jobs from starting upon initial startup after the backup and restore.
- Edit `/etc/gitlab/gitlab.rb` and set the following:
-
- ```ruby
- nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n"
- ```
-
- 1. Reconfigure GitLab:
-
- ```shell
- sudo gitlab-ctl reconfigure
- ```
-
-1. Stop GitLab to avoid any potential unnecessary and unintentional data processing:
-
- ```shell
- sudo gitlab-ctl stop
- ```
-
-1. Configure the new server to allow receiving the Redis database and GitLab backup files:
-
- ```shell
- sudo rm -f /var/opt/gitlab/redis/dump.rdb
- sudo chown <your-linux-username> /var/opt/gitlab/redis /var/opt/gitlab/backups
- ```
-
-### Prepare and transfer content from the old server
-
-1. Ensure you have an up-to-date system-level backup or snapshot of the old server.
-1. Enable [maintenance mode](../maintenance_mode/index.md),
- if supported by your GitLab edition.
-1. Block new CI/CD jobs from starting:
- 1. Edit `/etc/gitlab/gitlab.rb`, and set the following:
-
- ```ruby
- nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n"
- ```
-
- 1. Reconfigure GitLab:
-
- ```shell
- sudo gitlab-ctl reconfigure
- ```
-
-1. Disable periodic background jobs:
- 1. On the left sidebar, select **Search or go to**.
- 1. Select **Admin Area**.
- 1. On the left sidebar, select **Monitoring > Background Jobs**.
- 1. Under the Sidekiq dashboard, select **Cron** tab and then
- **Disable All**.
-1. Wait for the currently running CI/CD jobs to finish, or accept that jobs that have not completed may be lost.
- To view jobs currently running, on the left sidebar, select **Overviews > Jobs**,
- and then select **Running**.
-1. Wait for Sidekiq jobs to finish:
- 1. On the left sidebar, select **Monitoring > Background Jobs**.
- 1. Under the Sidekiq dashboard, select **Queues** and then **Live Poll**.
- Wait for **Busy** and **Enqueued** to drop to 0.
- These queues contain work that has been submitted by your users;
- shutting down before these jobs complete may cause the work to be lost.
- Make note of the numbers shown in the Sidekiq dashboard for post-migration verification.
-1. Flush the Redis database to disk, and stop GitLab other than the services needed for migration:
-
- ```shell
- sudo /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket save && sudo gitlab-ctl stop && sudo gitlab-ctl start postgresql && sudo gitlab-ctl start gitaly
- ```
-
-1. Create a GitLab backup:
-
- ```shell
- sudo gitlab-backup create
- ```
-
-1. Disable the following GitLab services and prevent unintentional restarts by adding the following to the bottom of `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- alertmanager['enable'] = false
- gitlab_exporter['enable'] = false
- gitlab_pages['enable'] = false
- gitlab_workhorse['enable'] = false
- grafana['enable'] = false
- logrotate['enable'] = false
- gitlab_rails['incoming_email_enabled'] = false
- nginx['enable'] = false
- node_exporter['enable'] = false
- postgres_exporter['enable'] = false
- postgresql['enable'] = false
- prometheus['enable'] = false
- puma['enable'] = false
- redis['enable'] = false
- redis_exporter['enable'] = false
- registry['enable'] = false
- sidekiq['enable'] = false
- ```
-
-1. Reconfigure GitLab:
-
- ```shell
- sudo gitlab-ctl reconfigure
- ```
-
-1. Verify everything is stopped, and confirm no services are running:
-
- ```shell
- sudo gitlab-ctl status
- ```
-
-1. Stop Redis on the **new server** before transferring the Redis database backup:
-
- ```shell
- sudo gitlab-ctl stop redis
- ```
-
-1. Transfer the Redis database and GitLab backups to the new server:
-
- ```shell
- sudo scp /var/opt/gitlab/redis/dump.rdb <your-linux-username>@new-server:/var/opt/gitlab/redis
- sudo scp /var/opt/gitlab/backups/your-backup.tar <your-linux-username>@new-server:/var/opt/gitlab/backups
- ```
-
-### Restore data on the new server
-
-1. Restore appropriate file system permissions:
-
- ```shell
- sudo chown gitlab-redis /var/opt/gitlab/redis
- sudo chown gitlab-redis:gitlab-redis /var/opt/gitlab/redis/dump.rdb
- sudo chown git:root /var/opt/gitlab/backups
- sudo chown git:git /var/opt/gitlab/backups/your-backup.tar
- ```
-
-1. Start Redis:
-
- ```shell
- sudo gitlab-ctl start redis
- ```
-
-1. [Restore the GitLab backup](#restore-gitlab).
-1. Verify that the Redis database restored correctly:
- 1. On the left sidebar, select **Search or go to**.
- 1. Select **Admin Area**.
- 1. On the left sidebar, select **Monitoring > Background Jobs**.
- 1. Under the Sidekiq dashboard, verify that the numbers
- match with what was shown on the old server.
- 1. While still under the Sidekiq dashboard, select **Cron** and then **Enable All**
- to re-enable periodic background jobs.
-1. Test that read-only operations on the GitLab instance work as expected. For example, browse through project repository files, merge requests, and issues.
-1. Disable [Maintenance Mode](../maintenance_mode/index.md), if previously enabled.
-1. Test that the GitLab instance is working as expected.
-1. If applicable, re-enable [incoming email](../incoming_email.md) and test it is working as expected.
-1. Update your DNS or load balancer to point at the new server.
-1. Unblock new CI/CD jobs from starting by removing the custom NGINX configuration
- you added previously:
-
- ```ruby
- # The following line must be removed
- nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n"
- ```
-
-1. Reconfigure GitLab:
-
- ```shell
- sudo gitlab-ctl reconfigure
- ```
-
-1. Remove the scheduled maintenance [broadcast message banner](../broadcast_messages.md).
+For detailed information on using back up and restore to migrate to a new server, see
+[Migrate to a new server](migrate_to_new_server.md).
## Additional notes
diff --git a/doc/administration/backup_restore/migrate_to_new_server.md b/doc/administration/backup_restore/migrate_to_new_server.md
new file mode 100644
index 00000000000..756368c5834
--- /dev/null
+++ b/doc/administration/backup_restore/migrate_to_new_server.md
@@ -0,0 +1,210 @@
+---
+stage: Systems
+group: Geo
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Migrate to a new server
+
+<!-- some details borrowed from GitLab.com move from Azure to GCP detailed at https://gitlab.com/gitlab-com/migration/-/blob/master/.gitlab/issue_templates/failover.md -->
+
+You can use GitLab backup and restore to migrate your instance to a new server. This section outlines a typical procedure for a GitLab deployment running on a single server.
+If you're running GitLab Geo, an alternative option is [Geo disaster recovery for planned failover](../geo/disaster_recovery/planned_failover.md).
+
+WARNING:
+Avoid uncoordinated data processing by both the new and old servers, where multiple
+servers could connect concurrently and process the same data. For example, when using
+[incoming email](../incoming_email.md), if both GitLab instances are
+processing email at the same time, then both instances miss some data.
+This type of problem can occur with other services as well, such as a
+[non-packaged database](https://docs.gitlab.com/omnibus/settings/database.html#using-a-non-packaged-postgresql-database-management-server),
+a non-packaged Redis instance, or non-packaged Sidekiq.
+
+Prerequisites:
+
+- Some time before your migration, consider notifying your users of upcoming
+ scheduled maintenance with a [broadcast message banner](../broadcast_messages.md).
+- Ensure your backups are complete and current. Create a complete system-level backup, or
+ take a snapshot of all servers involved in the migration, in case destructive commands
+ (like `rm`) are run incorrectly.
+
+## Prepare the new server
+
+To prepare the new server:
+
+1. Copy the
+ [SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079)
+ from the old server to avoid man-in-the-middle attack warnings.
+ See [Manually replicate the primary site's SSH host keys](../geo/replication/configuration.md#step-2-manually-replicate-the-primary-sites-ssh-host-keys) for example steps.
+1. [Install and configure GitLab](https://about.gitlab.com/install/) except
+ [incoming email](../incoming_email.md):
+ 1. Install GitLab.
+ 1. Configure by copying `/etc/gitlab` files from the old server to the new server, and update as necessary.
+ Read the
+ [Linux package installation backup and restore instructions](https://docs.gitlab.com/omnibus/settings/backups.html) for more detail.
+ 1. If applicable, disable [incoming email](../incoming_email.md).
+ 1. Block new CI/CD jobs from starting upon initial startup after the backup and restore.
+ Edit `/etc/gitlab/gitlab.rb` and set the following:
+
+ ```ruby
+ nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n"
+ ```
+
+ 1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Stop GitLab to avoid any potential unnecessary and unintentional data processing:
+
+ ```shell
+ sudo gitlab-ctl stop
+ ```
+
+1. Configure the new server to allow receiving the Redis database and GitLab backup files:
+
+ ```shell
+ sudo rm -f /var/opt/gitlab/redis/dump.rdb
+ sudo chown <your-linux-username> /var/opt/gitlab/redis /var/opt/gitlab/backups
+ ```
+
+## Prepare and transfer content from the old server
+
+1. Ensure you have an up-to-date system-level backup or snapshot of the old server.
+1. Enable [maintenance mode](../maintenance_mode/index.md),
+ if supported by your GitLab edition.
+1. Block new CI/CD jobs from starting:
+ 1. Edit `/etc/gitlab/gitlab.rb`, and set the following:
+
+ ```ruby
+ nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n"
+ ```
+
+ 1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Disable periodic background jobs:
+ 1. On the left sidebar, select **Search or go to**.
+ 1. Select **Admin Area**.
+ 1. On the left sidebar, select **Monitoring > Background Jobs**.
+ 1. Under the Sidekiq dashboard, select **Cron** tab and then
+ **Disable All**.
+1. Wait for the currently running CI/CD jobs to finish, or accept that jobs that have not completed may be lost.
+ To view jobs currently running, on the left sidebar, select **Overviews > Jobs**,
+ and then select **Running**.
+1. Wait for Sidekiq jobs to finish:
+ 1. On the left sidebar, select **Monitoring > Background Jobs**.
+ 1. Under the Sidekiq dashboard, select **Queues** and then **Live Poll**.
+ Wait for **Busy** and **Enqueued** to drop to 0.
+ These queues contain work that has been submitted by your users;
+ shutting down before these jobs complete may cause the work to be lost.
+ Make note of the numbers shown in the Sidekiq dashboard for post-migration verification.
+1. Flush the Redis database to disk, and stop GitLab other than the services needed for migration:
+
+ ```shell
+ sudo /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket save && sudo gitlab-ctl stop && sudo gitlab-ctl start postgresql && sudo gitlab-ctl start gitaly
+ ```
+
+1. Create a GitLab backup:
+
+ ```shell
+ sudo gitlab-backup create
+ ```
+
+1. Disable the following GitLab services and prevent unintentional restarts by adding the following to the bottom of `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ alertmanager['enable'] = false
+ gitlab_exporter['enable'] = false
+ gitlab_pages['enable'] = false
+ gitlab_workhorse['enable'] = false
+ grafana['enable'] = false
+ logrotate['enable'] = false
+ gitlab_rails['incoming_email_enabled'] = false
+ nginx['enable'] = false
+ node_exporter['enable'] = false
+ postgres_exporter['enable'] = false
+ postgresql['enable'] = false
+ prometheus['enable'] = false
+ puma['enable'] = false
+ redis['enable'] = false
+ redis_exporter['enable'] = false
+ registry['enable'] = false
+ sidekiq['enable'] = false
+ ```
+
+1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Verify everything is stopped, and confirm no services are running:
+
+ ```shell
+ sudo gitlab-ctl status
+ ```
+
+1. Stop Redis on the **new server** before transferring the Redis database backup:
+
+ ```shell
+ sudo gitlab-ctl stop redis
+ ```
+
+1. Transfer the Redis database and GitLab backups to the new server:
+
+ ```shell
+ sudo scp /var/opt/gitlab/redis/dump.rdb <your-linux-username>@new-server:/var/opt/gitlab/redis
+ sudo scp /var/opt/gitlab/backups/your-backup.tar <your-linux-username>@new-server:/var/opt/gitlab/backups
+ ```
+
+## Restore data on the new server
+
+1. Restore appropriate file system permissions:
+
+ ```shell
+ sudo chown gitlab-redis /var/opt/gitlab/redis
+ sudo chown gitlab-redis:gitlab-redis /var/opt/gitlab/redis/dump.rdb
+ sudo chown git:root /var/opt/gitlab/backups
+ sudo chown git:git /var/opt/gitlab/backups/your-backup.tar
+ ```
+
+1. Start Redis:
+
+ ```shell
+ sudo gitlab-ctl start redis
+ ```
+
+1. [Restore the GitLab backup](restore_gitlab.md).
+1. Verify that the Redis database restored correctly:
+ 1. On the left sidebar, select **Search or go to**.
+ 1. Select **Admin Area**.
+ 1. On the left sidebar, select **Monitoring > Background Jobs**.
+ 1. Under the Sidekiq dashboard, verify that the numbers
+ match with what was shown on the old server.
+ 1. While still under the Sidekiq dashboard, select **Cron** and then **Enable All**
+ to re-enable periodic background jobs.
+1. Test that read-only operations on the GitLab instance work as expected. For example, browse through project repository files, merge requests, and issues.
+1. Disable [Maintenance Mode](../maintenance_mode/index.md), if previously enabled.
+1. Test that the GitLab instance is working as expected.
+1. If applicable, re-enable [incoming email](../incoming_email.md) and test it is working as expected.
+1. Update your DNS or load balancer to point at the new server.
+1. Unblock new CI/CD jobs from starting by removing the custom NGINX configuration
+ you added previously:
+
+ ```ruby
+ # The following line must be removed
+ nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n"
+ ```
+
+1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Remove the scheduled maintenance [broadcast message banner](../broadcast_messages.md).
diff --git a/doc/administration/broadcast_messages.md b/doc/administration/broadcast_messages.md
index 4ed80010220..1d18d5e480f 100644
--- a/doc/administration/broadcast_messages.md
+++ b/doc/administration/broadcast_messages.md
@@ -57,8 +57,7 @@ To display messages to users on your GitLab instance, add a broadcast message.
To add a broadcast message:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Messages**.
1. Select **Add new message**.
1. Add the text for the message to the **Message** field. You can style a message's content using Markdown, emoji, and the `a` and `br` HTML tags.
@@ -86,8 +85,7 @@ If you must make changes to a broadcast message, you can edit it.
To edit a broadcast message:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Messages**.
1. From the list of broadcast messages, select the edit button for the message.
1. After making the required changes, select **Update broadcast message**.
@@ -101,8 +99,7 @@ You can delete a broadcast message while it's active.
To delete a broadcast message:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Messages**.
1. From the list of broadcast messages, select the delete button for the message.
diff --git a/doc/administration/credentials_inventory.md b/doc/administration/credentials_inventory.md
index d7b67dfd703..34819780420 100644
--- a/doc/administration/credentials_inventory.md
+++ b/doc/administration/credentials_inventory.md
@@ -37,8 +37,7 @@ You can also [revoke](#revoke-a-users-personal-access-token), [delete](#delete-a
You can revoke a user's personal access token.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Credentials**.
1. By the personal access token, select **Revoke**.
@@ -58,8 +57,7 @@ When a PAT is revoked from the credentials inventory, the instance notifies the
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/243833) in GitLab 14.8.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Credentials**.
1. Select the **Project Access Tokens** tab.
1. By the project access token, select **Revoke**.
@@ -72,8 +70,7 @@ The project access token is revoked and a background worker is queued to delete
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/225248) in GitLab 13.5.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Credentials**.
1. Select the **SSH Keys** tab.
1. By the SSH key, select **Delete**.
diff --git a/doc/administration/custom_project_templates.md b/doc/administration/custom_project_templates.md
index 2c1289905c7..c89ee3a028f 100644
--- a/doc/administration/custom_project_templates.md
+++ b/doc/administration/custom_project_templates.md
@@ -24,8 +24,7 @@ might modify the template projects without understanding the side effects.
To select the group to manage the project templates for your instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Templates**.
1. Expand **Custom project templates**.
1. Select a group to use.
diff --git a/doc/administration/diff_limits.md b/doc/administration/diff_limits.md
index dcf5a2b1b32..636b6fc1211 100644
--- a/doc/administration/diff_limits.md
+++ b/doc/administration/diff_limits.md
@@ -33,8 +33,7 @@ set values are presented as **Too large** are cannot be expanded in the UI.
To configure these values:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Diff limits**.
1. Enter a value for the diff limit.
diff --git a/doc/administration/email_from_gitlab.md b/doc/administration/email_from_gitlab.md
index 2b4ca07a8ab..8982552c689 100644
--- a/doc/administration/email_from_gitlab.md
+++ b/doc/administration/email_from_gitlab.md
@@ -25,8 +25,7 @@ You can send email notifications once every 10 minutes.
To send an email:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. In the upper-right corner, select **Send email to users** (**{mail}**).
1. Complete the fields. The email body supports only plain text and does not support HTML, Markdown, or other rich text formats.
diff --git a/doc/administration/external_users.md b/doc/administration/external_users.md
index c84de481020..cb2d28f833d 100644
--- a/doc/administration/external_users.md
+++ b/doc/administration/external_users.md
@@ -56,8 +56,7 @@ Additionally, users can be set as external users using:
By default, new users are not set as external users. This behavior can be changed
by an administrator:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Account and limit** section.
diff --git a/doc/administration/geo/disaster_recovery/background_verification.md b/doc/administration/geo/disaster_recovery/background_verification.md
index 8aec77d9d88..c3fc66284a6 100644
--- a/doc/administration/geo/disaster_recovery/background_verification.md
+++ b/doc/administration/geo/disaster_recovery/background_verification.md
@@ -27,8 +27,7 @@ the site more time before scheduling a planned failover.
On the **primary** site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Sites**.
1. Expand **Verification information** tab for that site to view automatic checksumming
status for repositories and wikis. Successes are shown in green, pending work
@@ -38,8 +37,7 @@ On the **primary** site:
On the **secondary** site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Sites**.
1. Expand **Verification information** tab for that site to view automatic checksumming
status for repositories and wikis. Successes are shown in green, pending work
@@ -67,8 +65,7 @@ increase load and vice versa.
On the **primary** site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Sites**.
1. Select **Edit** for the **primary** site to customize the minimum
re-verification interval:
diff --git a/doc/administration/geo/disaster_recovery/planned_failover.md b/doc/administration/geo/disaster_recovery/planned_failover.md
index 58c9f3413a7..a273cb4971b 100644
--- a/doc/administration/geo/disaster_recovery/planned_failover.md
+++ b/doc/administration/geo/disaster_recovery/planned_failover.md
@@ -154,8 +154,7 @@ ensure these processes are close to 100% as possible during active use.
On the **secondary** site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Sites**.
Replicated objects (shown in green) should be close to 100%,
and there should be no failures (shown in red). If a large proportion of
@@ -183,8 +182,7 @@ This [content was moved to another location](background_verification.md).
On the **primary** site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Messages**.
1. Add a message notifying users on the maintenance window.
You can check under **Geo > Sites** to estimate how long it
@@ -197,8 +195,7 @@ To ensure that all data is replicated to a secondary site, updates (write reques
be disabled on the **primary** site:
1. Enable [maintenance mode](../../maintenance_mode/index.md) on the **primary** site.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Background Jobs**.
1. On the Sidekiq dashboard, select **Cron**.
1. Select `Disable All` to disable non-Geo periodic background jobs.
diff --git a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md
index 787e7c4669e..0b20606cb96 100644
--- a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md
+++ b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md
@@ -65,8 +65,7 @@ promote a Geo replica and perform a failover.
On the **secondary** site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Sites** to see its status.
Replicated objects (shown in green) should be close to 100%,
and there should be no failures (shown in red). If a large proportion of
diff --git a/doc/administration/geo/index.md b/doc/administration/geo/index.md
index 171670b05bf..65c54d85704 100644
--- a/doc/administration/geo/index.md
+++ b/doc/administration/geo/index.md
@@ -159,8 +159,7 @@ public URL of the primary site is used.
To update the internal URL of the primary Geo site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Sites**.
1. Select **Edit** on the primary site.
1. Change the **Internal URL**, then select **Save changes**.
@@ -249,6 +248,8 @@ Pausing and resuming replication is done through a command-line tool from the no
If `postgresql` is on a standalone database node, ensure that `gitlab.rb` on that node contains the configuration line `gitlab_rails['geo_node_name'] = 'node_name'`, where `node_name` is the same as the `geo_node_name` on the application node.
+Also, be aware that if PostgreSQL is restarted after pausing replication (either by restarting the VM or restarting the service with `gitlab-ctl restart postgresql`), PostgreSQL automatically resumes replication, which is something you wouldn't want during an upgrade or in a planned failover scenario.
+
**To Pause: (from secondary)**
```shell
diff --git a/doc/administration/geo/replication/configuration.md b/doc/administration/geo/replication/configuration.md
index 8722ab574c3..4ddd3d09068 100644
--- a/doc/administration/geo/replication/configuration.md
+++ b/doc/administration/geo/replication/configuration.md
@@ -327,8 +327,7 @@ method to be enabled. This is enabled by default, but if converting an existing
On the **primary** site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **Visibility and access controls**.
1. If using Git over SSH, then:
@@ -341,8 +340,7 @@ On the **primary** site:
You can sign in to the **secondary** site with the same credentials you used with
the **primary** site. After you sign in:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Sites**.
1. Verify that it's correctly identified as a **secondary** Geo site, and that
Geo is enabled.
diff --git a/doc/administration/geo/replication/container_registry.md b/doc/administration/geo/replication/container_registry.md
index 51cdf0e05e1..d8f3d86556e 100644
--- a/doc/administration/geo/replication/container_registry.md
+++ b/doc/administration/geo/replication/container_registry.md
@@ -166,8 +166,7 @@ For each application and Sidekiq node on the **secondary** site:
To verify container registry replication is working, on the **secondary** site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Nodes**.
The initial replication, or "backfill", is probably still in progress.
diff --git a/doc/administration/geo/replication/disable_geo.md b/doc/administration/geo/replication/disable_geo.md
index 42c37a79ec2..4cbd934e881 100644
--- a/doc/administration/geo/replication/disable_geo.md
+++ b/doc/administration/geo/replication/disable_geo.md
@@ -36,8 +36,7 @@ to do that.
To remove the **primary** site:
1. [Remove all secondary Geo sites](remove_geo_site.md)
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Nodes**.
1. Select **Remove** for the **primary** node.
1. Confirm by selecting **Remove** when the prompt appears.
diff --git a/doc/administration/geo/replication/object_storage.md b/doc/administration/geo/replication/object_storage.md
index 3b6b214d9e3..11b52ffca42 100644
--- a/doc/administration/geo/replication/object_storage.md
+++ b/doc/administration/geo/replication/object_storage.md
@@ -43,8 +43,7 @@ whether they are stored on the local file system or in object storage.
To enable GitLab replication:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Nodes**.
1. Select **Edit** on the **secondary** site.
1. In the **Synchronization Settings** section, find the **Allow this secondary node to replicate content on Object Storage**
diff --git a/doc/administration/geo/replication/remove_geo_site.md b/doc/administration/geo/replication/remove_geo_site.md
index a55c05050a0..08ff66ce0da 100644
--- a/doc/administration/geo/replication/remove_geo_site.md
+++ b/doc/administration/geo/replication/remove_geo_site.md
@@ -9,8 +9,7 @@ type: howto
**Secondary** sites can be removed from the Geo cluster using the Geo administration page of the **primary** site. To remove a **secondary** site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Nodes**.
1. For the **secondary** site you want to remove, select **Remove**.
1. Confirm by selecting **Remove** when the prompt appears.
diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md
index b2c2b2ebe22..82ba5a4181f 100644
--- a/doc/administration/geo/replication/troubleshooting.md
+++ b/doc/administration/geo/replication/troubleshooting.md
@@ -27,8 +27,7 @@ Before attempting more advanced troubleshooting:
On the **primary** site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Sites**.
We perform the following health checks on each **secondary** site
@@ -1463,8 +1462,7 @@ If you have updated the value of `external_url` in `/etc/gitlab/gitlab.rb` for t
In this case, make sure to update the changed URL on all your sites:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Sites**.
1. Change the URL and save the change.
@@ -1569,8 +1567,7 @@ site's URL matches its external URL.
On the **primary** site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Sites**.
1. Find the affected **secondary** site and select **Edit**.
1. Ensure the **URL** field matches the value found in `/etc/gitlab/gitlab.rb`
diff --git a/doc/administration/geo/replication/tuning.md b/doc/administration/geo/replication/tuning.md
index 3a4366cfd63..f08b53ece50 100644
--- a/doc/administration/geo/replication/tuning.md
+++ b/doc/administration/geo/replication/tuning.md
@@ -14,8 +14,7 @@ in the background.
On the **primary** site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Geo > Sites**.
1. Select **Edit** of the secondary site you want to tune.
1. Under **Tuning settings**, there are several variables that can be tuned to
diff --git a/doc/administration/geo/setup/two_single_node_external_services.md b/doc/administration/geo/setup/two_single_node_external_services.md
index 405a791fedc..f272673d06a 100644
--- a/doc/administration/geo/setup/two_single_node_external_services.md
+++ b/doc/administration/geo/setup/two_single_node_external_services.md
@@ -38,7 +38,7 @@ Prerequisites:
```ruby
##
## The unique identifier for the Geo site. See
- ## https://docs.gitlab.com/ee/user/admin_area/geo_nodes.html#common-settings
+ ## https://docs.gitlab.com/ee/administration/geo_sites.html#common-settings
##
gitlab_rails['geo_node_name'] = '<site_name_here>'
```
@@ -292,7 +292,7 @@ secondary site is a read-only copy.
```ruby
##
## The unique identifier for the Geo site. See
- ## https://docs.gitlab.com/ee/user/admin_area/geo_nodes.html#common-settings
+ ## https://docs.gitlab.com/ee/administration/geo_sites.html#common-settings
##
gitlab_rails['geo_node_name'] = '<secondary_site_name_here>'
```
@@ -362,8 +362,7 @@ If you convert an existing site to Geo, you should check that the clone method i
On the primary site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Visibility and access controls**.
1. If you use Git over SSH:
@@ -378,8 +377,7 @@ the primary site.
After you sign in:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Geo > Sites**.
1. Verify that the site is correctly identified as a secondary Geo site, and that
Geo is enabled.
diff --git a/doc/administration/geo/setup/two_single_node_sites.md b/doc/administration/geo/setup/two_single_node_sites.md
index da7ec455c6a..ad234e0bf54 100644
--- a/doc/administration/geo/setup/two_single_node_sites.md
+++ b/doc/administration/geo/setup/two_single_node_sites.md
@@ -38,7 +38,7 @@ Prerequisites:
```ruby
##
## The unique identifier for the Geo site. See
- ## https://docs.gitlab.com/ee/user/admin_area/geo_nodes.html#common-settings
+ ## https://docs.gitlab.com/ee/administration/geo_sites.html#common-settings
##
gitlab_rails['geo_node_name'] = '<site_name_here>'
```
@@ -538,7 +538,7 @@ You must manually replicate the secret file across all of your secondary sites,
```ruby
##
## The unique identifier for the Geo site. See
- ## https://docs.gitlab.com/ee/user/admin_area/geo_nodes.html#common-settings
+ ## https://docs.gitlab.com/ee/administration/geo_sites.html#common-settings
##
gitlab_rails['geo_node_name'] = '<site_name_here>'
```
@@ -608,8 +608,7 @@ If you convert an existing site to Geo, you should check that the clone method i
On the primary site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Visibility and access controls**.
1. If you use Git over SSH:
@@ -624,8 +623,7 @@ the primary site.
After you sign in:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Geo > Sites**.
1. Verify that the site is correctly identified as a secondary Geo site, and that
Geo is enabled.
diff --git a/doc/administration/geo_sites.md b/doc/administration/geo_sites.md
index f0c3e24f643..a207aa7a30b 100644
--- a/doc/administration/geo_sites.md
+++ b/doc/administration/geo_sites.md
@@ -11,8 +11,7 @@ You can configure various settings for GitLab Geo sites. For more information, s
On either the primary or secondary site:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Geo > Sites**.
## Common settings
@@ -72,8 +71,7 @@ the primary uses the secondary's internal URL to contact it directly.
The internal URL defaults to external URL. To change it:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Geo > Sites**.
1. Select **Edit** on the site you want to customize.
1. Edit the internal URL.
diff --git a/doc/administration/gitaly/troubleshooting.md b/doc/administration/gitaly/troubleshooting.md
index 681da6079f3..b8d3d38d71e 100644
--- a/doc/administration/gitaly/troubleshooting.md
+++ b/doc/administration/gitaly/troubleshooting.md
@@ -20,8 +20,7 @@ and our advice on [parsing the `gitaly/current` file](../logs/log_parsing.md#par
When using standalone Gitaly servers, you must make sure they are the same version
as GitLab to ensure full compatibility:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Overview > Gitaly Servers**.
1. Confirm all Gitaly servers indicate that they are up to date.
diff --git a/doc/administration/housekeeping.md b/doc/administration/housekeeping.md
index f4815e0f04f..bf28e169d78 100644
--- a/doc/administration/housekeeping.md
+++ b/doc/administration/housekeeping.md
@@ -76,8 +76,7 @@ frequently.
You can change how often Gitaly is asked to optimize a repository.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Repository**.
1. Expand **Repository maintenance**.
1. In the **Housekeeping** section, configure the housekeeping options.
diff --git a/doc/administration/inactive_project_deletion.md b/doc/administration/inactive_project_deletion.md
index 5fb6939d924..0e1ab1eb0bd 100644
--- a/doc/administration/inactive_project_deletion.md
+++ b/doc/administration/inactive_project_deletion.md
@@ -23,8 +23,7 @@ For the default setting on GitLab.com, see the [GitLab.com settings page](../use
To configure deletion of inactive projects:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Repository**.
1. Expand **Repository maintenance**.
1. In the **Inactive project deletion** section, select **Delete inactive projects**.
diff --git a/doc/administration/integration/diagrams_net.md b/doc/administration/integration/diagrams_net.md
index 13be572d524..356c361fcb8 100644
--- a/doc/administration/integration/diagrams_net.md
+++ b/doc/administration/integration/diagrams_net.md
@@ -46,8 +46,7 @@ For more information, see [Run your own diagrams.net server with Docker](https:/
## Enable Diagrams.net integration
1. Sign in to GitLab as an [Administrator](../../user/permissions.md) user.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **Diagrams.net**.
1. Select the **Enable Diagrams.net** checkbox.
diff --git a/doc/administration/integration/kroki.md b/doc/administration/integration/kroki.md
index 926833cfa1a..55a54f03b41 100644
--- a/doc/administration/integration/kroki.md
+++ b/doc/administration/integration/kroki.md
@@ -61,8 +61,7 @@ read the [Kroki installation](https://docs.kroki.io/kroki/setup/install/#_images
You need to enable Kroki integration from Settings under Admin Area.
To do that, sign in with an administrator account and follow these steps:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Go to **Settings > General**.
1. Expand the **Kroki** section.
1. Select **Enable Kroki** checkbox.
diff --git a/doc/administration/integration/mailgun.md b/doc/administration/integration/mailgun.md
index 4fe846e99a6..aa08a2cbd6b 100644
--- a/doc/administration/integration/mailgun.md
+++ b/doc/administration/integration/mailgun.md
@@ -43,8 +43,7 @@ After configuring your Mailgun domain for the webhook endpoints,
you're ready to enable the Mailgun integration:
1. Sign in to GitLab as an [Administrator](../../user/permissions.md) user.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, go to **Settings > General** and expand the **Mailgun** section.
1. Select the **Enable Mailgun** checkbox.
1. Enter the Mailgun HTTP webhook signing key as described in
diff --git a/doc/administration/integration/plantuml.md b/doc/administration/integration/plantuml.md
index dae400ff755..3b7b96d583f 100644
--- a/doc/administration/integration/plantuml.md
+++ b/doc/administration/integration/plantuml.md
@@ -316,8 +316,7 @@ stop;
After configuring your local PlantUML server, you're ready to enable the PlantUML integration:
1. Sign in to GitLab as an [Administrator](../../user/permissions.md) user.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, go to **Settings > General** and expand the **PlantUML** section.
1. Select the **Enable PlantUML** checkbox.
1. Set the PlantUML instance as `https://gitlab.example.com/-/plantuml/`,
diff --git a/doc/administration/integration/terminal.md b/doc/administration/integration/terminal.md
index baeabdc6964..105e0db9f30 100644
--- a/doc/administration/integration/terminal.md
+++ b/doc/administration/integration/terminal.md
@@ -112,7 +112,6 @@ they receive a `Connection failed` message.
By default, terminal sessions do not expire. To limit the terminal session
lifetime in your GitLab instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Web terminal**.
1. Set a `max session time`.
diff --git a/doc/administration/license.md b/doc/administration/license.md
index e0fa320d584..d6ac8d23d8f 100644
--- a/doc/administration/license.md
+++ b/doc/administration/license.md
@@ -28,8 +28,7 @@ To activate your instance with an activation code:
- Your subscription confirmation email.
- The [Customers Portal](https://customers.gitlab.com/customers/sign_in), on the **Manage Purchases** page.
1. Sign in to your GitLab self-managed instance.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Subscription**.
1. Paste the activation code in **Activation code**.
1. Read and accept the terms of service.
diff --git a/doc/administration/license_file.md b/doc/administration/license_file.md
index 2086e4888a7..900dad3a369 100644
--- a/doc/administration/license_file.md
+++ b/doc/administration/license_file.md
@@ -18,8 +18,7 @@ link to the **Add license** page should be displayed.
Otherwise, to add your license:
1. Sign in to GitLab as an administrator.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. In the **Add License** area, add a license by either uploading the file or entering the key.
1. Select the **Terms of Service** checkbox.
@@ -96,8 +95,7 @@ To go back to Free features, [delete all expired licenses](#remove-a-license).
To remove a license from a self-managed instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Subscription**.
1. Select **Remove license**.
@@ -107,8 +105,7 @@ Repeat these steps to remove all licenses, including those applied in the past.
To view your license details:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Subscription**.
You can add and view more than one license, but only the latest license in
diff --git a/doc/administration/maintenance_mode/index.md b/doc/administration/maintenance_mode/index.md
index f915d1a8903..5f5a11ecf0b 100644
--- a/doc/administration/maintenance_mode/index.md
+++ b/doc/administration/maintenance_mode/index.md
@@ -181,8 +181,7 @@ you should disable all cron jobs except for those related to Geo.
To monitor queues and disable jobs:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Background Jobs**.
1. In the Sidekiq dashboard, select **Cron** and disable jobs individually or all at once by selecting **Disable All**.
diff --git a/doc/administration/merge_requests_approvals.md b/doc/administration/merge_requests_approvals.md
index 8c554b00048..58bcb2620f4 100644
--- a/doc/administration/merge_requests_approvals.md
+++ b/doc/administration/merge_requests_approvals.md
@@ -19,8 +19,7 @@ and can no longer be changed:
To enable merge request approval settings for an instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Push Rules**.
1. Expand **Merge request approvals**.
1. Choose the required options.
diff --git a/doc/administration/moderate_users.md b/doc/administration/moderate_users.md
index e4b7e6f096a..57c2b6e0b3a 100644
--- a/doc/administration/moderate_users.md
+++ b/doc/administration/moderate_users.md
@@ -42,8 +42,7 @@ sign in.
To view user sign ups pending approval:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Select the **Pending approval** tab.
@@ -53,8 +52,7 @@ A user sign up pending approval can be approved or rejected from the Admin Area.
To approve or reject a user sign up:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Select the **Pending approval** tab.
1. For the user sign up you want to approve or reject, select the vertical ellipsis (**{ellipsis_v}**), then **Approve** or **Reject**.
@@ -86,8 +84,7 @@ You can block a user's access to the instance.
To block a user:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. For the user you want to block, select the vertical ellipsis (**{ellipsis_v}**), then **Block**.
@@ -99,8 +96,7 @@ To report abuse from other users, see [report abuse](../user/report_abuse.md). F
A blocked user can be unblocked from the Admin Area. To do this:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Select the **Blocked** tab.
1. For the user you want to unblock, select the vertical ellipsis (**{ellipsis_v}**), then **Unblock**.
@@ -114,8 +110,7 @@ Users can also be unblocked using the [GitLab API](../api/users.md#unblock-user)
The unblock option may be unavailable for LDAP users. To enable the unblock option,
the LDAP identity first needs to be deleted:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Select the **Blocked** tab.
1. Select a user.
@@ -147,8 +142,7 @@ Prerequisites:
To deactivate a user:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. For the user you want to deactivate, select the vertical ellipsis (**{ellipsis_v}**) and then **Deactivate**.
1. On the dialog, select **Deactivate**.
@@ -172,8 +166,7 @@ Administrators can enable automatic deactivation of users who either:
To do this:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Account and limit** section.
1. Under **Dormant users**, check **Deactivate dormant users after a period of inactivity**.
@@ -223,8 +216,7 @@ A deactivated user can be activated from the Admin Area.
To do this:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Select the **Deactivated** tab.
1. For the user you want to activate, select the vertical ellipsis (**{ellipsis_v}**), then **Activate**.
@@ -258,8 +250,7 @@ To block a user and hide their contributions, administrators can ban the user.
Users can be banned using the Admin Area. To do this:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. For the user you want to ban, select the vertical ellipsis (**{ellipsis_v}**), then **Ban user**.
@@ -267,8 +258,7 @@ Users can be banned using the Admin Area. To do this:
A banned user can be unbanned using the Admin Area. To do this:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Select the **Banned** tab.
1. For the user you want to unban, select the vertical ellipsis (**{ellipsis_v}**), then **Unban user**.
@@ -280,8 +270,7 @@ The user's state is set to active and they consume a
Use the Admin Area to delete users.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. For the user you want to delete, select the vertical ellipsis (**{ellipsis_v}**), then **Delete user**.
1. Type the username.
@@ -292,8 +281,7 @@ You can only delete a user if there are inherited or direct owners of a group. Y
You can also delete a user and their contributions, such as merge requests, issues, and groups of which they are the only group owner.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. For the user you want to delete, select the vertical ellipsis (**{ellipsis_v}**), then **Delete user and contributions**.
1. Type the username.
@@ -318,8 +306,7 @@ Prerequisites:
:::TabTitle Trust a user
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Select a user.
1. From the **User administration** dropdown list, select **Trust user**.
@@ -329,8 +316,7 @@ The user is trusted.
:::TabTitle Untrust a user
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Select the **Trusted** tab.
1. Select a user.
diff --git a/doc/administration/monitoring/performance/gitlab_configuration.md b/doc/administration/monitoring/performance/gitlab_configuration.md
index 858c94f3671..3b565117470 100644
--- a/doc/administration/monitoring/performance/gitlab_configuration.md
+++ b/doc/administration/monitoring/performance/gitlab_configuration.md
@@ -9,8 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
GitLab Performance Monitoring is disabled by default. To enable it and change any of its
settings:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Metrics and profiling**
(`/admin/application_settings/metrics_and_profiling`).
1. Add the necessary configuration changes.
diff --git a/doc/administration/monitoring/performance/grafana_configuration.md b/doc/administration/monitoring/performance/grafana_configuration.md
index 15ccc2094c8..cc882d56ca8 100644
--- a/doc/administration/monitoring/performance/grafana_configuration.md
+++ b/doc/administration/monitoring/performance/grafana_configuration.md
@@ -34,8 +34,7 @@ see the [GitLab Grafana dashboards](https://gitlab.com/gitlab-org/grafana-dashbo
After setting up Grafana, you can enable a link to access it from the
GitLab sidebar:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Metrics and profiling**
and expand **Metrics - Grafana**.
1. Select the **Add a link to Grafana** checkbox.
diff --git a/doc/administration/monitoring/performance/performance_bar.md b/doc/administration/monitoring/performance/performance_bar.md
index 95717f0c54f..f940d2176e1 100644
--- a/doc/administration/monitoring/performance/performance_bar.md
+++ b/doc/administration/monitoring/performance/performance_bar.md
@@ -107,8 +107,7 @@ The performance bar is disabled by default for non-administrators. To enable it
for a given group:
1. Sign in as a user with administrator access.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Metrics and profiling**
(`admin/application_settings/metrics_and_profiling`), and expand
**Profiling - Performance bar**.
diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md
index 2eb482cae69..1ec7a9c6bc5 100644
--- a/doc/administration/monitoring/prometheus/gitlab_metrics.md
+++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md
@@ -9,8 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
To enable the GitLab Prometheus metrics:
1. Log in to GitLab as a user with administrator access.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Metrics and profiling**.
1. Find the **Metrics - Prometheus** section, and select **Enable GitLab Prometheus metrics endpoint**.
1. [Restart GitLab](../../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
diff --git a/doc/administration/operations/fast_ssh_key_lookup.md b/doc/administration/operations/fast_ssh_key_lookup.md
index 888ec79d4b6..a8216f9cf70 100644
--- a/doc/administration/operations/fast_ssh_key_lookup.md
+++ b/doc/administration/operations/fast_ssh_key_lookup.md
@@ -121,8 +121,7 @@ users as long as a large file exists.
To disable writes to the `authorized_keys` file:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Network**.
1. Expand **Performance optimization**.
1. Clear the **Use authorized_keys file to authenticate SSH keys** checkbox.
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index 13e3714fcc1..96c06437592 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -345,8 +345,7 @@ the container registry by themselves, follow the steps below.
In GitLab, tokens for the container registry expire every five minutes.
To increase the token duration:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > CI/CD**.
1. Expand **Container Registry**.
1. For the **Authorization token duration (minutes)**, update the value.
diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md
index 4ddfe18cd37..d37469a076a 100644
--- a/doc/administration/pages/index.md
+++ b/doc/administration/pages/index.md
@@ -407,8 +407,7 @@ domain as a custom domain to their project.
If your user base is private or otherwise trusted, you can disable the
verification requirement:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Preferences**.
1. Expand **Pages**.
1. Clear the **Require users to prove ownership of custom domains** checkbox.
@@ -425,8 +424,7 @@ sites served under a custom domain.
To enable it:
1. Choose an email address on which you want to receive notifications about expiring domains.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Preferences**.
1. Expand **Pages**.
1. Enter the email address for receiving notifications and accept Let's Encrypt's Terms of Service.
@@ -479,8 +477,7 @@ pre-existing applications must modify the GitLab Pages OAuth application. Follow
this:
1. Enable [access control](#access-control).
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Applications**.
1. Expand **GitLab Pages**.
1. Clear the `api` scope's checkbox and select the desired scope's checkbox (for example,
@@ -499,8 +496,7 @@ This can be helpful to restrict information published with Pages websites to the
of your instance only.
To do that:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Preferences**.
1. Expand **Pages**.
1. Select the **Disable public access to Pages sites** checkbox.
@@ -690,8 +686,7 @@ Prerequisites:
To set the global maximum pages size for a project:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Preferences**.
1. Expand **Pages**.
1. In **Maximum size of pages**, enter a value. The default is `100`.
@@ -732,8 +727,7 @@ Prerequisites:
To set the maximum number of GitLab Pages custom domains for a project:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Preferences**, and expand **Pages**.
1. Enter a value for **Maximum number of custom domains per project**. Use `0` for unlimited domains.
1. Select **Save changes**.
diff --git a/doc/administration/pages/source.md b/doc/administration/pages/source.md
index fcbc04ed0c3..c3c729c9c62 100644
--- a/doc/administration/pages/source.md
+++ b/doc/administration/pages/source.md
@@ -479,8 +479,7 @@ The default for the maximum size of unpacked archives per project is 100 MB.
To change this value:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Preferences**.
1. Expand **Pages**.
1. Update the value for **Maximum size of pages (MB)**.
diff --git a/doc/administration/pages/troubleshooting.md b/doc/administration/pages/troubleshooting.md
index 08dcc270176..695939b4ef5 100644
--- a/doc/administration/pages/troubleshooting.md
+++ b/doc/administration/pages/troubleshooting.md
@@ -170,8 +170,7 @@ Upgrading to an [officially supported operating system](https://about.gitlab.com
This problem comes from the permissions of the GitLab Pages OAuth application. To fix it:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Applications > GitLab Pages**.
1. Edit the application.
1. Under **Scopes**, ensure that the `api` scope is selected.
diff --git a/doc/administration/polling.md b/doc/administration/polling.md
index b27613663da..eabcff0e474 100644
--- a/doc/administration/polling.md
+++ b/doc/administration/polling.md
@@ -26,8 +26,7 @@ The default value (`1`) is recommended for the majority of GitLab installations.
To adjust the polling interval multiplier:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Preferences**.
1. Expand **Polling interval multiplier**.
1. Set a value for the polling interval multiplier. This multiplier is applied to all resources at
diff --git a/doc/administration/reporting/git_abuse_rate_limit.md b/doc/administration/reporting/git_abuse_rate_limit.md
index 7e2c340f20d..416b1b405df 100644
--- a/doc/administration/reporting/git_abuse_rate_limit.md
+++ b/doc/administration/reporting/git_abuse_rate_limit.md
@@ -21,8 +21,7 @@ GitLab team members can view more information in this confidential epic:
## Configure Git abuse rate limiting
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Reporting**.
1. Expand **Git abuse rate limit**.
1. Update the Git abuse rate limit settings:
@@ -41,8 +40,7 @@ If automatic banning is enabled, an email notification is sent when a user is ab
## Unban a user
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Select the **Banned** tab and search for the account you want to unban.
1. From the **User administration** dropdown list select **Unban user**.
diff --git a/doc/administration/reporting/ip_addr_restrictions.md b/doc/administration/reporting/ip_addr_restrictions.md
index 2e152b0b176..7ef73713a70 100644
--- a/doc/administration/reporting/ip_addr_restrictions.md
+++ b/doc/administration/reporting/ip_addr_restrictions.md
@@ -19,8 +19,7 @@ unique IP addresses. Therefore, the IP addresses per user limit should take into
## Configure IP address restrictions
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Reporting**.
1. Expand **Spam and Anti-bot Protection**.
1. Update the IP address restrictions settings:
diff --git a/doc/administration/reporting/spamcheck.md b/doc/administration/reporting/spamcheck.md
index c92336a39b9..0ea8aa8bf46 100644
--- a/doc/administration/reporting/spamcheck.md
+++ b/doc/administration/reporting/spamcheck.md
@@ -40,8 +40,7 @@ Spamcheck is only available for package-based installations:
## Configure GitLab to use Spamcheck
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Reporting**.
1. Expand **Spam and Anti-bot Protection**.
1. Update the Spam Check settings:
diff --git a/doc/administration/repository_checks.md b/doc/administration/repository_checks.md
index 241f88793ff..4d4f427dcc7 100644
--- a/doc/administration/repository_checks.md
+++ b/doc/administration/repository_checks.md
@@ -20,8 +20,7 @@ committed to a repository. GitLab administrators can:
To check a project's repository using GitLab UI:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Overview > Projects**.
1. Select the project to check.
1. In the **Repository check** section, select **Trigger repository check**.
@@ -33,8 +32,7 @@ project page in the Admin Area. If the checks fail, see [what to do](#what-to-do
Instead of checking repositories manually, GitLab can be configured to run the checks periodically:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Repository** (`/admin/application_settings/repository`).
1. Expand the **Repository maintenance** section.
1. Enable **Enable repository checks**.
@@ -87,8 +85,7 @@ If a repository check fails, locate the error in the [`repocheck.log` file](logs
If periodic repository checks cause false alarms, you can clear all repository check states:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Repository** (`/admin/application_settings/repository`).
1. Expand the **Repository maintenance** section.
1. Select **Clear all repository checks**.
diff --git a/doc/administration/repository_storage_paths.md b/doc/administration/repository_storage_paths.md
index a3e0158fd24..80871ecd478 100644
--- a/doc/administration/repository_storage_paths.md
+++ b/doc/administration/repository_storage_paths.md
@@ -66,8 +66,7 @@ Administrators can look up a project's hashed path from its name or ID using:
To look up a project's hash path in the Admin Area:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Overview > Projects** and select the project.
1. Locate the **Relative path** field. The value is similar to:
@@ -205,8 +204,7 @@ LFS objects are also [S3-compatible](lfs/index.md#storing-lfs-objects-in-remote-
After you configure multiple repository storages, you can choose where new repositories are stored:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Repository** and expand the **Repository storage**
section.
1. Enter values in the **Storage nodes for new repositories** fields.
diff --git a/doc/administration/review_abuse_reports.md b/doc/administration/review_abuse_reports.md
index 84bb7ab219f..ac31f233bbd 100644
--- a/doc/administration/review_abuse_reports.md
+++ b/doc/administration/review_abuse_reports.md
@@ -16,8 +16,7 @@ reports in the Admin Area.
To receive notifications of new abuse reports by email:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Reporting**.
1. Expand the **Abuse reports** section.
1. Provide an email address and select **Save changes**.
@@ -36,8 +35,7 @@ To find out more about reporting abuse, see
To access abuse reports:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Abuse Reports**.
There are four ways to resolve an abuse report, with a button for each method:
diff --git a/doc/administration/review_spam_logs.md b/doc/administration/review_spam_logs.md
index e3b96cdae95..ff39c024a17 100644
--- a/doc/administration/review_spam_logs.md
+++ b/doc/administration/review_spam_logs.md
@@ -19,8 +19,7 @@ View and resolve spam logs to moderate user activity in your instance.
To view spam logs:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Spam Logs**.
1. Optional. To resolve a spam log, select a log and then select **Remove user**, **Block user**, **Remove log**, or **Trust user**.
diff --git a/doc/administration/server_hooks.md b/doc/administration/server_hooks.md
index 4d8377b4117..a999ed23876 100644
--- a/doc/administration/server_hooks.md
+++ b/doc/administration/server_hooks.md
@@ -71,8 +71,7 @@ If you implemented the server hook code correctly, it should execute when the Gi
To create server hooks for a repository:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Go to **Overview > Projects** and select the project you want to add a server hook to.
1. On the page that appears, locate the value of **Relative path**. This path is where server
hooks must be located.
diff --git a/doc/administration/settings/account_and_limit_settings.md b/doc/administration/settings/account_and_limit_settings.md
index 041b7821999..2d64c6b1470 100644
--- a/doc/administration/settings/account_and_limit_settings.md
+++ b/doc/administration/settings/account_and_limit_settings.md
@@ -16,8 +16,7 @@ the [project limits for existing users](#projects-limit-for-a-user).
To configure the maximum number of projects in personal namespaces for new users:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Account and limit**.
1. Increase or decrease that **Default projects limit** value.
@@ -30,8 +29,7 @@ in their users personal namespace. However, projects can still be created in a g
You can edit a specific user, and change the maximum number of projects this user
can create in their personal namespace:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview** > **Users**.
1. From the list of users, select a user.
1. Select **Edit**.
@@ -44,8 +42,7 @@ can create in their personal namespace:
The maximum file size for attachments in GitLab comments and replies is 100 MB.
To change the maximum attachment size:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Account and limit**.
1. Increase or decrease by changing the value in **Maximum attachment size (MiB)**.
@@ -60,8 +57,7 @@ For GitLab.com repository size limits, read [accounts and limit settings](../../
You can change the maximum push size for your instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Account and limit**.
1. Increase or decrease by changing the value in **Maximum push size (MiB)**.
@@ -92,8 +88,7 @@ The default prefix is `glpat-` but administrators can change it.
To change the default global prefix:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Account and limit** section.
1. Fill in the **Personal Access Token prefix** field.
@@ -162,8 +157,7 @@ For details on manually purging files, see [reducing the repository size using G
You can change how long users can remain signed in without activity.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Account and limit**. The set duration is in **Session duration (minutes)**.
@@ -177,8 +171,7 @@ For details, see [cookies used for sign-in](../../user/profile/index.md#cookies-
Users can select the **Remember me** checkbox on sign-in, and their session will remain active for an indefinite period of time when accessed from that specific browser. You can turn off this setting if you need sessions to expire for security or compliance purposes. Turning off this setting will ensure users' sessions expire after the number of minutes of inactivity set when you [customize your session duration](#customize-the-default-session-duration).
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Account and limit**.
1. Select or clear the **Remember me** checkbox to turn this setting on or off.
@@ -195,8 +188,7 @@ GitLab administrators can choose to customize the session duration (in minutes)
To set a limit on how long these sessions are valid:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Account and limit** section.
1. Fill in the **Session duration for Git operations when 2FA is enabled (minutes)** field.
@@ -223,8 +215,7 @@ there are no restrictions.
To set a lifetime on how long SSH keys are valid:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Account and limit** section.
1. Fill in the **Maximum allowable lifetime for SSH keys (days)** field.
@@ -260,8 +251,7 @@ there are no restrictions.
To set a lifetime on how long access tokens are valid:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Account and limit** section.
1. Fill in the **Maximum allowable lifetime for access tokens (days)** field.
@@ -283,8 +273,7 @@ To maintain integrity of user details in [Audit Events](../../administration/aud
To do this:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Account and limit**.
1. Select the **Prevent users from changing their profile name** checkbox.
@@ -303,8 +292,7 @@ On self-managed GitLab, by default this feature is not available. To make it ava
By default, users can create organizations. GitLab administrators can prevent users from creating organizations.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Account and limit**.
1. Clear the **Allow users to create organizations** checkbox.
@@ -320,8 +308,7 @@ By default, new users can create top-level groups. GitLab administrators can pre
- The [application setting API](../../api/settings.md#change-application-settings).
- In GitLab 15.4 and earlier, a [configuration file](../../administration/user_settings.md#use-configuration-files-to-prevent-new-users-from-creating-top-level-groups).
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Account and limit**.
1. Clear the **Allow new users to create top-level groups** checkbox.
@@ -332,8 +319,7 @@ By default, new users can create top-level groups. GitLab administrators can pre
By default, newly created users have a public profile. GitLab administrators can set new users to have a private profile by default:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Account and limit**.
1. Select the **Make new users' profiles private by default** checkbox.
@@ -345,8 +331,7 @@ By default, newly created users have a public profile. GitLab administrators can
By default, users can delete their own accounts. GitLab administrators can prevent
users from deleting their own accounts:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Account and limit**.
1. Clear the **Allows users to delete their own accounts** checkbox.
diff --git a/doc/administration/settings/continuous_integration.md b/doc/administration/settings/continuous_integration.md
index 8f0698148f8..8ddc4cf47ef 100644
--- a/doc/administration/settings/continuous_integration.md
+++ b/doc/administration/settings/continuous_integration.md
@@ -15,8 +15,7 @@ job artifacts.
To enable (or disable) [Auto DevOps](../../topics/autodevops/index.md)
for all projects:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Check (or uncheck to disable) the box that says **Default to Auto DevOps pipeline for all projects**.
1. Optionally, set up the [Auto DevOps base domain](../../topics/autodevops/requirements.md#auto-devops-base-domain)
@@ -33,8 +32,7 @@ If you want to disable it for a specific project, you can do so in
You can set all new projects to have the instance's shared runners available by default.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand **Continuous Integration and Deployment**.
1. Select the **Enable shared runners for new projects** checkbox.
@@ -53,8 +51,7 @@ you can assign that runner to other projects.
To enable a project runner for more than one project:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. From the left sidebar, select **CI/CD > Runners**.
1. Select the runner you want to edit.
1. In the upper-right corner, select **Edit** (**{pencil}**).
@@ -67,8 +64,7 @@ To enable a project runner for more than one project:
To display details about the instance's shared runners in all projects'
runner settings:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand **Continuous Integration and Deployment**.
1. Enter text, including Markdown if you want, in the **Shared runner details** field. For example:
@@ -122,8 +118,7 @@ can be set in the Admin Area of your GitLab instance. The syntax of duration is
described in [`artifacts:expire_in`](../../ci/yaml/index.md#artifactsexpire_in)
and the default value is `30 days`.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Change the value of default expiration time.
1. Select **Save changes** for the changes to take effect.
@@ -154,8 +149,7 @@ If disabled at the instance level, you cannot enable this per-project.
To disable the setting:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand **Continuous Integration and Deployment**.
1. Clear the **Keep the latest artifacts for all jobs in the latest successful pipelines** checkbox.
@@ -178,8 +172,7 @@ blueprint for more details.
To set the duration for which the jobs are considered as old and expired:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand the **Continuous Integration and Deployment** section.
1. Set the value of **Archive jobs**.
@@ -196,8 +189,7 @@ For the value set for GitLab.com, see [Scheduled job archiving](../../user/gitla
To set all new [CI/CD variables](../../ci/variables/index.md) as
[protected](../../ci/variables/index.md#protect-a-cicd-variable) by default:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Select **Protect CI/CD variables by default**.
@@ -208,8 +200,7 @@ To set all new [CI/CD variables](../../ci/variables/index.md) as
The maximum number of [includes](../../ci/yaml/includes.md) per pipeline can be set at the instance level.
The default is `150`.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Change the value of **Maximum includes**.
1. Select **Save changes** for the changes to take effect.
@@ -221,8 +212,7 @@ The default is `150`.
The default CI/CD configuration file and path for new projects can be set in the Admin Area
of your GitLab instance (`.gitlab-ci.yml` if not set):
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Input the new file and path in the **Default CI/CD configuration file** field.
1. Select **Save changes** for the changes to take effect.
@@ -237,8 +227,7 @@ It is also possible to specify a [custom CI/CD configuration file for a specific
You can configure some [CI/CD limits](../../administration/instance_limits.md#cicd-limits)
from the Admin Area:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand the **Continuous Integration and Deployment** section.
1. In the **CI/CD limits** section, you can set the following limits:
@@ -260,8 +249,7 @@ walkthrough on how to add one.
To enable or disable the banner:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Select or clear the **Enable pipeline suggestion banner** checkbox.
1. Select **Save changes**.
@@ -276,8 +264,7 @@ malicious user-generated content, as described in
Self-managed administrators can disable the external redirect warning page,
so you can view job artifact pages directly:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand **Continuous Integration and Deployment**.
1. Deselect **Enable the external redirect page for job artifacts**.
@@ -313,8 +300,7 @@ in the pipeline editor.
To select a CI/CD template for the required pipeline configuration:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand the **Required pipeline configuration** section.
1. Select a CI/CD template from the dropdown list.
@@ -328,8 +314,7 @@ GitLab administrators can disable the forwarding of Maven requests to [Maven Cen
To disable forwarding Maven requests:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand the **Package Registry** section.
1. Clear the checkbox **Forward Maven package requests to the Maven Registry if the packages are not found in the GitLab Package Registry**.
@@ -341,8 +326,7 @@ GitLab administrators can disable the forwarding of npm requests to [npmjs.com](
To disable it:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand the **Package Registry** section.
1. Clear the checkbox **Forward npm package requests to the npm Registry if the packages are not found in the GitLab Package Registry**.
@@ -354,8 +338,7 @@ GitLab administrators can disable the forwarding of PyPI requests to [pypi.org](
To disable it:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand the **Package Registry** section.
1. Clear the checkbox **Forward PyPI package requests to the PyPI Registry if the packages are not found in the GitLab Package Registry**.
@@ -367,8 +350,7 @@ GitLab administrators can adjust the maximum allowed file size for each package
To set the maximum file size:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand the **Package Registry** section.
1. Find the package type you would like to adjust.
@@ -388,8 +370,7 @@ By default, all members of a project and group are able to register runners.
To restrict all users in an instance from registering runners:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand **Runners**.
1. In the **Runner registration** section, clear the **Members of the project can register runners** and
@@ -411,8 +392,7 @@ GitLab administrators can adjust group permissions to restrict runner registrati
To restrict runner registration by members in a specific group:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Groups** and find your group.
1. Select **Edit**.
1. Clear the **New group runners can be registered** checkbox if you want to disable runner registration by all members in the group. If the setting is read-only, you must enable runner registration for the [instance](#restrict-runner-registration-by-all-users-in-an-instance).
@@ -426,8 +406,7 @@ By default, GitLab instances periodically fetch official runner version data fro
To disable your instance fetching this data:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand **Runners**.
1. In the **Runner version management** section, clear the **Fetch GitLab Runner release version data from GitLab.com** checkbox.
diff --git a/doc/administration/settings/deprecated_api_rate_limits.md b/doc/administration/settings/deprecated_api_rate_limits.md
index 445c8f97298..b8bac82bc31 100644
--- a/doc/administration/settings/deprecated_api_rate_limits.md
+++ b/doc/administration/settings/deprecated_api_rate_limits.md
@@ -34,8 +34,7 @@ Prerequisites:
To override the general user and IP rate limits for requests to deprecated API endpoints:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Deprecated API Rate Limits**.
1. Select the checkboxes for the types of rate limits you want to enable:
diff --git a/doc/administration/settings/email.md b/doc/administration/settings/email.md
index bcf4bab6fc5..6680c5aa495 100644
--- a/doc/administration/settings/email.md
+++ b/doc/administration/settings/email.md
@@ -21,8 +21,7 @@ address in the body of the email instead.
To include the author's email address in the email body:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Email**.
1. Select the **Include author name in email notification email body** checkbox.
@@ -34,8 +33,7 @@ GitLab can send email in multipart format (HTML and plain text) or plain text on
To enable multipart email:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Email**.
1. Select **Enable multipart email**.
@@ -50,8 +48,7 @@ This configuration option sets the email hostname for [private commit emails](..
To change the hostname used in private commit emails:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Email**.
1. Enter the desired hostname in the **Custom hostname (for private commit emails)** field.
@@ -69,8 +66,7 @@ can be used for legal, auditing, or compliance reasons, for example.
To add additional text to emails:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Email**.
1. Enter your text in the **Additional text** field.
@@ -82,8 +78,7 @@ GitLab sends email notifications to users when their account has been deactivate
To disable these notifications:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Email**.
1. Clear the **Enable user deactivation emails** checkbox.
@@ -106,8 +101,7 @@ setting.
To add additional text to deactivation emails:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Email**.
1. Enter your text in the **Additional text for deactivation email** field.
diff --git a/doc/administration/settings/external_authorization.md b/doc/administration/settings/external_authorization.md
index 3ddebeb983c..3f1d0323aed 100644
--- a/doc/administration/settings/external_authorization.md
+++ b/doc/administration/settings/external_authorization.md
@@ -45,8 +45,7 @@ Alternatively, learn where to install custom certificates by using
The external authorization service can be enabled by an administrator:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **External authorization**.
1. Complete the fields.
@@ -66,8 +65,7 @@ Prerequisites:
To allow authorization with deploy tokens and keys:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **External authorization**, and:
- Leave the service URL field empty.
diff --git a/doc/administration/settings/files_api_rate_limits.md b/doc/administration/settings/files_api_rate_limits.md
index aa6a3337fdb..0d9738dc4c1 100644
--- a/doc/administration/settings/files_api_rate_limits.md
+++ b/doc/administration/settings/files_api_rate_limits.md
@@ -30,8 +30,7 @@ Prerequisites:
To override the general user and IP rate limits for requests to the Repository files API:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Files API Rate Limits**.
1. Select the checkboxes for the types of rate limits you want to enable:
diff --git a/doc/administration/settings/floc.md b/doc/administration/settings/floc.md
index f461472bfe7..7a48ab86004 100644
--- a/doc/administration/settings/floc.md
+++ b/doc/administration/settings/floc.md
@@ -22,8 +22,7 @@ Permissions-Policy: interest-cohort=()
To enable it:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Federated Learning of Cohorts (FLoC)**.
1. Select the **Participate in FLoC** checkbox.
diff --git a/doc/administration/settings/git_lfs_rate_limits.md b/doc/administration/settings/git_lfs_rate_limits.md
index acd3945750f..ac0fcfa7936 100644
--- a/doc/administration/settings/git_lfs_rate_limits.md
+++ b/doc/administration/settings/git_lfs_rate_limits.md
@@ -21,8 +21,7 @@ rate limits.
Git LFS rate limits are disabled by default. If enabled and configured, these limits
supersede the [general user and IP rate limits](../settings/user_and_ip_rate_limits.md):
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Git LFS Rate Limits**.
1. Select **Enable authenticated Git LFS request rate limit**.
diff --git a/doc/administration/settings/gitaly_timeouts.md b/doc/administration/settings/gitaly_timeouts.md
index 1cab1e9fd01..b60cf141cf6 100644
--- a/doc/administration/settings/gitaly_timeouts.md
+++ b/doc/administration/settings/gitaly_timeouts.md
@@ -11,8 +11,7 @@ configured to make sure that long-running Gitaly calls don't needlessly take up
To access Gitaly timeout settings:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand the **Gitaly timeouts** section.
diff --git a/doc/administration/settings/help_page.md b/doc/administration/settings/help_page.md
index 23ca7d55cde..592a3d68fde 100644
--- a/doc/administration/settings/help_page.md
+++ b/doc/administration/settings/help_page.md
@@ -16,8 +16,7 @@ the GitLab sign-in page.
You can add a help message, which is shown at the top of the GitLab `/help` page (for example,
<https://gitlab.com/help>):
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Sign-in and Help page**.
1. In **Additional text to show on the Help page**, enter the information you want to display on `/help`.
@@ -34,8 +33,7 @@ is restricted, `/help` is visible only to authenticated users.
You can add a help message, which is shown on the GitLab sign-in page. The message appears on the sign-in page:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Sign-in and Help page**.
1. In **Additional text to show on the sign-in page**, enter the information you want to
@@ -48,8 +46,7 @@ You can now see the message on the sign-in page.
GitLab marketing-related entries are occasionally shown on the Help page. To hide these entries:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Sign-in and Help page**.
1. Select the **Hide marketing-related entries from the Help page** checkbox.
@@ -62,8 +59,7 @@ You can specify a custom URL to which users are directed when they:
- Select **Support** from the Help dropdown list.
- Select **See our website for help** on the Help page.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Sign-in and Help page**.
1. In the **Support page URL** field, enter the URL.
@@ -77,8 +73,7 @@ You can specify a custom URL to which users are directed when they:
You can redirect all `/help` links to a destination that meets the [necessary requirements](#destination-requirements).
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Sign-in and Help page**.
1. In the **Documentation pages URL** field, enter the URL.
diff --git a/doc/administration/settings/import_and_export_settings.md b/doc/administration/settings/import_and_export_settings.md
index 8d191ea661c..9cdd7ca782a 100644
--- a/doc/administration/settings/import_and_export_settings.md
+++ b/doc/administration/settings/import_and_export_settings.md
@@ -15,8 +15,7 @@ Before you can import projects from other systems, you must enable the
[import source](../../user/gitlab_com/index.md#default-import-sources) for that system.
1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Import and export settings** section.
1. Select each of **Import sources** to allow.
@@ -28,8 +27,7 @@ To enable the export of
[projects and their data](../../user/project/settings/import_export.md#export-a-project-and-its-data):
1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Import and export settings** section.
1. Scroll to **Project export**.
@@ -51,8 +49,7 @@ Migration of groups and projects by direct transfer is disabled by default.
To enable migration of groups and projects by direct transfer:
1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Import and export settings** section.
1. Scroll to **Allow migrating GitLab groups and projects by direct transfer**.
@@ -69,8 +66,7 @@ The same setting
To modify the maximum file size for exports in GitLab:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**, then expand **Import and export settings**.
1. Increase or decrease by changing the value in **Maximum export size (MiB)**.
@@ -80,8 +76,7 @@ To modify the maximum file size for exports in GitLab:
To modify the maximum file size for imports in GitLab:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Import and export settings**.
1. Increase or decrease by changing the value in **Maximum import size (MiB)**.
@@ -103,8 +98,7 @@ By default, the maximum remote file size for imports from external object storag
To modify this setting:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Import and export settings**.
1. Increase or decrease by changing the value in **Maximum import remote file size (MiB)**. Set to `0` to set no file size limit.
@@ -117,8 +111,7 @@ By default, the maximum download file size for imports by direct transfer is 5 G
To modify this setting:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Import and export settings**.
1. Increase or decrease by changing the value in **Direct transfer maximum download file size (MiB)**. Set to `0` to set no download file size limit.
@@ -141,8 +134,7 @@ Decompressed archive size validation failed.
To modify this setting:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Import and export settings**.
1. Set another value for **Maximum decompressed file size for archives from imports (MiB)**.
@@ -155,8 +147,7 @@ When you [import a project](../../user/project/settings/import_export.md), you c
To modify the maximum decompressed file size for imports in GitLab:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Import and export settings**.
1. Set another value for **Timeout for decompressing archived files (seconds)**.
diff --git a/doc/administration/settings/import_export_rate_limits.md b/doc/administration/settings/import_export_rate_limits.md
index dad72ffdf44..815189f2e63 100644
--- a/doc/administration/settings/import_export_rate_limits.md
+++ b/doc/administration/settings/import_export_rate_limits.md
@@ -12,8 +12,7 @@ You can configure the rate limits for imports and exports of projects and groups
To change a rate limit:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Import and export rate limits**.
1. Change the value of any rate limit. The rate limits are per minute per user, not per IP address.
diff --git a/doc/administration/settings/incident_management_rate_limits.md b/doc/administration/settings/incident_management_rate_limits.md
index ef646b5e219..7ed455c01ee 100644
--- a/doc/administration/settings/incident_management_rate_limits.md
+++ b/doc/administration/settings/incident_management_rate_limits.md
@@ -30,8 +30,7 @@ Requests that exceed the limit are logged into `auth.log`.
To set inbound incident management alert limits:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Incident Management Limits**.
1. Select the **Enable Incident Management inbound alert limit** checkbox.
diff --git a/doc/administration/settings/index.md b/doc/administration/settings/index.md
index 1c601df7814..5988b2d15a8 100644
--- a/doc/administration/settings/index.md
+++ b/doc/administration/settings/index.md
@@ -17,5 +17,4 @@ Use **Settings** to control settings across the instance.
To access the **Admin Area**:
1. Sign in to your GitLab instance as an administrator.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
diff --git a/doc/administration/settings/instance_template_repository.md b/doc/administration/settings/instance_template_repository.md
index 510c88e7738..55e4591358e 100644
--- a/doc/administration/settings/instance_template_repository.md
+++ b/doc/administration/settings/instance_template_repository.md
@@ -20,8 +20,7 @@ while the project remains secure.
To select a project to serve as the custom template repository:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Templates**.
1. Expand **Templates**
1. From the dropdown list, select the project to use as the template repository.
diff --git a/doc/administration/settings/jira_cloud_app.md b/doc/administration/settings/jira_cloud_app.md
index 8ff2a9acdb8..3748cc2f558 100644
--- a/doc/administration/settings/jira_cloud_app.md
+++ b/doc/administration/settings/jira_cloud_app.md
@@ -29,8 +29,7 @@ You must set up OAuth authentication to:
To create an OAuth application on your self-managed instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Applications**.
1. Select **New application**.
1. In **Redirect URI**:
@@ -109,8 +108,7 @@ With this method:
To set up your self-managed instance for the GitLab for Jira Cloud app in GitLab 15.7 and later:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **GitLab for Jira App**.
1. In **Jira Connect Proxy URL**, enter `https://gitlab.com`.
@@ -231,8 +229,7 @@ You might want to use a proxy if you're managing multiple GitLab instances but o
To configure your GitLab instance to serve as a proxy:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **GitLab for Jira App**.
1. Select **Enable public key storage**.
diff --git a/doc/administration/settings/localization.md b/doc/administration/settings/localization.md
index a86e9c75a4e..d3666aea491 100644
--- a/doc/administration/settings/localization.md
+++ b/doc/administration/settings/localization.md
@@ -15,8 +15,7 @@ deployment.
You can change the [Default first day of the week](../../user/profile/preferences.md)
for the entire GitLab instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Scroll to the **Localization** section, and select your desired first day of the week.
@@ -25,7 +24,6 @@ for the entire GitLab instance:
You can change the [Default language](../../user/profile/preferences.md)
for the entire GitLab instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Scroll to the **Localization** section, and select your desired default language.
diff --git a/doc/administration/settings/package_registry_rate_limits.md b/doc/administration/settings/package_registry_rate_limits.md
index 0c098bb1749..c23bdcfa9f7 100644
--- a/doc/administration/settings/package_registry_rate_limits.md
+++ b/doc/administration/settings/package_registry_rate_limits.md
@@ -30,8 +30,7 @@ no difference in functionality compared to the general user and IP rate limits.
To enable the unauthenticated request rate limit:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Package registry rate limits**.
1. Select **Enable unauthenticated request rate limit**.
@@ -45,8 +44,7 @@ To enable the unauthenticated request rate limit:
To enable the authenticated API request rate limit:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**
1. Expand **Package registry rate limits**.
1. Select **Enable authenticated API request rate limit**.
diff --git a/doc/administration/settings/project_integration_management.md b/doc/administration/settings/project_integration_management.md
index 94eaa0233a2..b20693f5c5d 100644
--- a/doc/administration/settings/project_integration_management.md
+++ b/doc/administration/settings/project_integration_management.md
@@ -29,8 +29,7 @@ Prerequisites:
To manage instance-level default settings for a project integration:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Integrations**.
1. Select an integration.
1. Complete the fields.
@@ -71,8 +70,7 @@ Prerequisites:
To remove an instance-level default setting:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Integrations**.
1. Select an integration.
1. Select **Reset** and confirm.
@@ -89,8 +87,7 @@ Prerequisites:
To view projects in your instance that [use custom settings](../../user/project/integrations/index.md#use-custom-settings-for-a-project-or-group-integration):
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Integrations**.
1. Select an integration.
1. Select the **Projects using custom settings** tab.
diff --git a/doc/administration/settings/protected_paths.md b/doc/administration/settings/protected_paths.md
index 3244c25e906..ce1e6c6d66c 100644
--- a/doc/administration/settings/protected_paths.md
+++ b/doc/administration/settings/protected_paths.md
@@ -34,8 +34,7 @@ See also:
Throttling of protected paths is enabled by default and can be disabled or
customized.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Protected paths**.
diff --git a/doc/administration/settings/rate_limit_on_issues_creation.md b/doc/administration/settings/rate_limit_on_issues_creation.md
index 14d484d91b1..f8bba5737d9 100644
--- a/doc/administration/settings/rate_limit_on_issues_creation.md
+++ b/doc/administration/settings/rate_limit_on_issues_creation.md
@@ -18,8 +18,7 @@ action blocks requests that exceed a rate of 300 per minute. Access to the endpo
To limit the number of requests made to the issue and epic creation endpoints:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Issues Rate Limits**.
1. Under **Max requests per minute**, enter the new value.
diff --git a/doc/administration/settings/rate_limit_on_notes_creation.md b/doc/administration/settings/rate_limit_on_notes_creation.md
index 3bd6eee8303..a5bdb4cde8f 100644
--- a/doc/administration/settings/rate_limit_on_notes_creation.md
+++ b/doc/administration/settings/rate_limit_on_notes_creation.md
@@ -13,8 +13,7 @@ You can configure the per-user rate limit for requests to the note creation endp
To change the note creation rate limit:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Notes rate limit**.
1. In the **Maximum requests per minute** box, enter the new value.
diff --git a/doc/administration/settings/rate_limit_on_pipelines_creation.md b/doc/administration/settings/rate_limit_on_pipelines_creation.md
index d083acb190e..45949b300b8 100644
--- a/doc/administration/settings/rate_limit_on_pipelines_creation.md
+++ b/doc/administration/settings/rate_limit_on_pipelines_creation.md
@@ -26,8 +26,7 @@ Requests that exceed the limit are logged in the `application_json.log` file.
To limit the number of pipeline requests:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Pipelines Rate Limits**.
1. Under **Max requests per minute**, enter a value greater than `0`.
diff --git a/doc/administration/settings/rate_limit_on_projects_api.md b/doc/administration/settings/rate_limit_on_projects_api.md
index 33304e4f088..bbb7d1fec61 100644
--- a/doc/administration/settings/rate_limit_on_projects_api.md
+++ b/doc/administration/settings/rate_limit_on_projects_api.md
@@ -16,8 +16,7 @@ You can configure the rate limit per IP address for unauthenticated requests to
To change the rate limit:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Projects API rate limit**.
1. In the **Maximum requests per 10 minutes per IP address** text box, enter the new value.
diff --git a/doc/administration/settings/rate_limit_on_users_api.md b/doc/administration/settings/rate_limit_on_users_api.md
index 533bfe0b000..c56f56baee4 100644
--- a/doc/administration/settings/rate_limit_on_users_api.md
+++ b/doc/administration/settings/rate_limit_on_users_api.md
@@ -13,8 +13,7 @@ You can configure the per user rate limit for requests to [Users API](../../api/
To change the rate limit:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Users API rate limit**.
1. In the **Maximum requests per 10 minutes** text box, enter the new value.
diff --git a/doc/administration/settings/rate_limits_on_git_ssh_operations.md b/doc/administration/settings/rate_limits_on_git_ssh_operations.md
index 4e60fd55b19..42cb834b510 100644
--- a/doc/administration/settings/rate_limits_on_git_ssh_operations.md
+++ b/doc/administration/settings/rate_limits_on_git_ssh_operations.md
@@ -26,8 +26,7 @@ Because the same commands are shared by `git-upload-pack`, `git pull`, and `git
`Git operations using SSH` is enabled by default. Defaults to 600 per user per minute.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Git SSH operations rate limit**.
1. Enter a value for **Maximum number of Git operations per minute**.
diff --git a/doc/administration/settings/rate_limits_on_raw_endpoints.md b/doc/administration/settings/rate_limits_on_raw_endpoints.md
index 237b57f4436..be81963bb2b 100644
--- a/doc/administration/settings/rate_limits_on_raw_endpoints.md
+++ b/doc/administration/settings/rate_limits_on_raw_endpoints.md
@@ -11,8 +11,7 @@ type: reference
This setting defaults to `300` requests per minute, and allows you to rate limit the requests to raw endpoints:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **Performance optimization**.
diff --git a/doc/administration/settings/scim_setup.md b/doc/administration/settings/scim_setup.md
index 45020fdfb59..a08ffe0a682 100644
--- a/doc/administration/settings/scim_setup.md
+++ b/doc/administration/settings/scim_setup.md
@@ -27,8 +27,7 @@ Prerequisites:
To configure GitLab SCIM:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **SCIM Token** section and select **Generate a SCIM token**.
1. For configuration of your identity provider, save the:
diff --git a/doc/administration/settings/security_and_compliance.md b/doc/administration/settings/security_and_compliance.md
index 78923b19b04..e3708912b45 100644
--- a/doc/administration/settings/security_and_compliance.md
+++ b/doc/administration/settings/security_and_compliance.md
@@ -13,8 +13,7 @@ The settings for package metadata synchronization are located in the [Admin Area
To choose the packages you want to synchronize with the GitLab Package Metadata Database for [License Compliance](../../user/compliance/license_scanning_of_cyclonedx_files/index.md) and [Continuous Vulnerability Scanning](../../user/application_security/continuous_vulnerability_scanning/index.md):
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Security and Compliance**.
1. Expand **License Compliance**.
1. Select or clear checkboxes for the package registries that you want to sync.
diff --git a/doc/administration/settings/sidekiq_job_limits.md b/doc/administration/settings/sidekiq_job_limits.md
index 6c5ff29e96b..32c1cc25276 100644
--- a/doc/administration/settings/sidekiq_job_limits.md
+++ b/doc/administration/settings/sidekiq_job_limits.md
@@ -17,8 +17,7 @@ Redis. To avoid excessive memory for Redis, we:
To access Sidekiq job size limits:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Sidekiq job size limits**.
1. Adjust the compression threshold or size limit. The compression can
diff --git a/doc/administration/settings/sign_in_restrictions.md b/doc/administration/settings/sign_in_restrictions.md
index cb78f4d3415..0d93aaa8186 100644
--- a/doc/administration/settings/sign_in_restrictions.md
+++ b/doc/administration/settings/sign_in_restrictions.md
@@ -12,8 +12,7 @@ You can use **Sign-in restrictions** to customize authentication restrictions fo
To access sign-in restriction settings:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Sign-in restrictions** section.
@@ -76,8 +75,7 @@ Open the [Rails console](../operations/rails_console.md) and run the following:
To enable Admin Mode through the UI:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Sign-in restrictions**.
1. Select **Enable Admin Mode**.
@@ -182,8 +180,7 @@ For example, if you include the following information in the noted text box:
To access this text box:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Sign-in restrictions** section.
```
diff --git a/doc/administration/settings/sign_up_restrictions.md b/doc/administration/settings/sign_up_restrictions.md
index 99e78d89051..d97f1af7af5 100644
--- a/doc/administration/settings/sign_up_restrictions.md
+++ b/doc/administration/settings/sign_up_restrictions.md
@@ -22,8 +22,7 @@ you do not expect public users to sign up for an account.
To disable sign ups:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Sign-up restrictions**.
1. Clear the **Sign-up enabled** checkbox, then select **Save changes**.
@@ -40,8 +39,7 @@ enabled by default for new GitLab instances. It is only applicable if sign ups a
To require administrator approval for new sign ups:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Sign-up restrictions**.
1. Select the **Require admin approval for new sign-ups** checkbox, then select **Save changes**.
@@ -66,8 +64,7 @@ their email address before they are allowed to sign in.
To enforce confirmation of the email address used for new sign ups:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Sign-up restrictions**.
1. Under **Email confirmation settings**, select **Hard**.
@@ -107,8 +104,7 @@ Prerequisites:
To set a user cap:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Sign-up restrictions**.
1. Enter a number in **User cap**.
@@ -127,8 +123,7 @@ Prerequisites:
To remove the user cap:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Sign-up restrictions**.
1. Remove the number from **User cap**.
@@ -153,8 +148,7 @@ You can add additional complexity requirements. Changes to password complexity r
Existing passwords are unaffected. To change password complexity requirements:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Sign-up restrictions**.
1. Under **Minimum password length (number of characters)**, select additional password complexity requirements. You can require numbers, uppercase letters, lowercase letters,
@@ -183,8 +177,7 @@ reduce the risk of malicious users creating spam accounts with disposable email
To create an email domain allowlist or denylist:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Sign-up restrictions**.
1. For the allowlist, you must enter the list manually. For the denylist, you can enter the list
diff --git a/doc/administration/settings/slack_app.md b/doc/administration/settings/slack_app.md
index fbc0f7cf251..c9fea7a56a0 100644
--- a/doc/administration/settings/slack_app.md
+++ b/doc/administration/settings/slack_app.md
@@ -46,8 +46,7 @@ You're then redirected to Slack for the next steps.
After you've [created a GitLab for Slack app](#create-a-gitlab-for-slack-app), you can configure the settings in GitLab:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **GitLab for Slack app**.
1. Select the **Enable GitLab for Slack app** checkbox.
diff --git a/doc/administration/settings/terms.md b/doc/administration/settings/terms.md
index 12678b6416a..58f86722863 100644
--- a/doc/administration/settings/terms.md
+++ b/doc/administration/settings/terms.md
@@ -17,8 +17,7 @@ for example `https://gitlab.example.com/-/users/terms`.
To enforce acceptance of a Terms of Service and Privacy Policy:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Terms of Service and Privacy Policy** section.
1. Check the **All users must accept the Terms of Service and Privacy Policy to access GitLab** checkbox.
diff --git a/doc/administration/settings/terraform_limits.md b/doc/administration/settings/terraform_limits.md
index 7f744b0a4e5..873c4a1ed9c 100644
--- a/doc/administration/settings/terraform_limits.md
+++ b/doc/administration/settings/terraform_limits.md
@@ -15,8 +15,7 @@ state file version, and is checked whenever a new version is created.
To add a storage limit:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Preferences**.
1. Expand **Terraform limits**.
1. Enter a size limit in bytes. Set to `0` to allow files of unlimited size.
diff --git a/doc/administration/settings/third_party_offers.md b/doc/administration/settings/third_party_offers.md
index b91f13a6a30..65fa816ed33 100644
--- a/doc/administration/settings/third_party_offers.md
+++ b/doc/administration/settings/third_party_offers.md
@@ -18,8 +18,7 @@ questions when creating a group.
To toggle the display of customer experience improvement content and third-party offers:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Customer experience improvement and third-party offers**.
1. Select **Do not display content for customer experience improvement and offers from third parties**.
diff --git a/doc/administration/settings/usage_statistics.md b/doc/administration/settings/usage_statistics.md
index 76404c7ef63..51a6fa153d1 100644
--- a/doc/administration/settings/usage_statistics.md
+++ b/doc/administration/settings/usage_statistics.md
@@ -78,8 +78,7 @@ In the following table, you can see:
### Enable registration features
1. Sign in as a user with administrator access.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Metrics and profiling**.
1. Expand the **Usage statistics** section.
1. If not enabled, select the **Enable Service Ping** checkbox.
@@ -110,8 +109,7 @@ If you disable version check, this information isn't collected.
### Enable or disable version check
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Metrics and profiling**.
1. Expand **Usage statistics**.
1. Select or clear the **Enable version check** checkbox.
@@ -147,8 +145,7 @@ If your GitLab instance is behind a proxy, set the appropriate
To enable or disable Service Ping:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Metrics and profiling**.
1. Expand **Usage statistics**.
1. Select or clear the **Enable Service Ping** checkbox.
@@ -210,8 +207,7 @@ the Admin Area.
You can view the exact JSON payload sent to GitLab Inc. in the Admin Area. To view the payload:
1. Sign in as a user with administrator access.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Metrics and profiling > Usage statistics**.
1. Select **Preview payload**.
@@ -228,8 +224,7 @@ or if the Service Ping [cron job](../../development/internal_analytics/service_p
To upload the payload manually:
1. Sign in as a user with administrator access.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Metrics and profiling > Usage statistics**.
1. Select **Download payload**.
1. Save the JSON file.
diff --git a/doc/administration/settings/user_and_ip_rate_limits.md b/doc/administration/settings/user_and_ip_rate_limits.md
index 22b16d01394..e1283208f57 100644
--- a/doc/administration/settings/user_and_ip_rate_limits.md
+++ b/doc/administration/settings/user_and_ip_rate_limits.md
@@ -31,8 +31,7 @@ counted as web traffic.
To enable the unauthenticated request rate limit:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **User and IP rate limits**.
1. Select **Enable unauthenticated API request rate limit**.
@@ -46,8 +45,7 @@ To enable the unauthenticated request rate limit:
To enable the unauthenticated request rate limit:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **User and IP rate limits**.
1. Select **Enable unauthenticated web request rate limit**.
@@ -61,8 +59,7 @@ To enable the unauthenticated request rate limit:
To enable the authenticated API request rate limit:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **User and IP rate limits**.
1. Select **Enable authenticated API request rate limit**.
@@ -76,8 +73,7 @@ To enable the authenticated API request rate limit:
To enable the unauthenticated request rate limit:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **User and IP rate limits**.
1. Select **Enable authenticated web request rate limit**.
@@ -96,8 +92,7 @@ plain-text body, which by default is `Retry later`.
To use a custom response:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **User and IP rate limits**.
1. In the **Plain-text response to send to clients that hit a rate limit** text box,
@@ -111,8 +106,7 @@ To reduce timeouts, the `project/:id/jobs` endpoint has a default [rate limit](.
To modify the maximum number of requests:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Network**.
1. Expand **User and IP rate limits**.
1. Update the **Maximum authenticated requests to `project/:id/jobs` per minute** value.
diff --git a/doc/administration/settings/visibility_and_access_controls.md b/doc/administration/settings/visibility_and_access_controls.md
index 03c104e27fc..c506eac45a6 100644
--- a/doc/administration/settings/visibility_and_access_controls.md
+++ b/doc/administration/settings/visibility_and_access_controls.md
@@ -13,8 +13,7 @@ specific controls on branches, projects, snippets, groups, and more.
To access the visibility and access control options:
1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Visibility and access controls** section.
@@ -25,8 +24,7 @@ Instance-level protections for project creation define which roles can
on the instance. To alter which roles have permission to create projects:
1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Visibility and access controls** section.
1. For **Default project creation protection**, select the desired roles:
@@ -42,8 +40,7 @@ on the instance. To alter which roles have permission to create projects:
By default both administrators and anyone with the **Owner** role can delete a project. To restrict project deletion to only administrators:
1. Sign in to GitLab as a user with administrator access.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Visibility and access controls** section.
1. Scroll to:
@@ -80,8 +77,7 @@ then it gets automatically changed to `1` while also disabling deletion protecti
To configure delayed project deletion:
1. Sign in to GitLab as a user with administrator access.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Visibility and access controls** section.
1. Scroll to:
@@ -122,8 +118,7 @@ Alternatively, projects that are marked for removal can be deleted immediately.
To set the default [visibility levels for new projects](../../user/public_access.md):
1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Visibility and access controls** section.
1. Select the desired default project visibility:
@@ -141,8 +136,7 @@ For more details on project visibility, see
To set the default visibility levels for new [snippets](../../user/snippets.md):
1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Visibility and access controls** section.
1. Select the desired default snippet visibility.
@@ -156,8 +150,7 @@ For more details on snippet visibility, read
To set the default visibility levels for new groups:
1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Visibility and access controls** section.
1. Select the desired default group visibility:
@@ -181,8 +174,7 @@ the item you're changing.
To restrict visibility levels for groups, projects, snippets, and selected pages:
1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Visibility and access controls** section.
1. In the **Restricted visibility levels** section, select the desired visibility levels to restrict.
@@ -211,8 +203,7 @@ The GitLab restrictions apply at the application level.
To specify the enabled Git access protocols:
1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Visibility and access controls** section.
1. Select the desired Git access protocols:
@@ -298,8 +289,7 @@ include the `10.0.0.0/24` range.
To add a IP address range to the group-level allowlist:
1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Visibility and access controls** section.
1. In **Globally-allowed IP ranges**, provide a list of IP address ranges. This list:
diff --git a/doc/administration/sidekiq/extra_sidekiq_processes.md b/doc/administration/sidekiq/extra_sidekiq_processes.md
index 89de4cd6cf3..5a768dfbf6d 100644
--- a/doc/administration/sidekiq/extra_sidekiq_processes.md
+++ b/doc/administration/sidekiq/extra_sidekiq_processes.md
@@ -48,8 +48,7 @@ to all available queues:
To view the Sidekiq processes in GitLab:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Monitoring > Background Jobs**.
## Concurrency
diff --git a/doc/administration/static_objects_external_storage.md b/doc/administration/static_objects_external_storage.md
index 203f59b60f7..6c353509ad0 100644
--- a/doc/administration/static_objects_external_storage.md
+++ b/doc/administration/static_objects_external_storage.md
@@ -16,8 +16,7 @@ storage such as a content delivery network (CDN).
To configure external storage for static objects:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Repository**.
1. Expand the **External storage for repository static objects** section.
1. Enter the base URL and an arbitrary token. When you [set up external storage](#set-up-external-storage),
diff --git a/doc/administration/system_hooks.md b/doc/administration/system_hooks.md
index daee7b61670..ca4039a4f7c 100644
--- a/doc/administration/system_hooks.md
+++ b/doc/administration/system_hooks.md
@@ -53,8 +53,7 @@ For push and tag events, the same structure and deprecations are followed as [pr
To create a system hook:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **System Hooks**.
1. Select **Add new webhook**.
1. Provide the **URL** and **Secret Token**.
diff --git a/doc/administration/troubleshooting/index.md b/doc/administration/troubleshooting/index.md
index 8be6abc180d..1fbeb600b46 100644
--- a/doc/administration/troubleshooting/index.md
+++ b/doc/administration/troubleshooting/index.md
@@ -14,7 +14,7 @@ for in this list, you should search the documentation.
## Troubleshooting guides
-- [SSL](ssl.md)
+- [SSL](https://docs.gitlab.com/omnibus/settings/ssl/ssl_troubleshooting.html)
- [Geo](../geo/replication/troubleshooting.md)
- [SAML](../../user/group/saml_sso/troubleshooting.md)
- [Kubernetes cheat sheet](https://docs.gitlab.com/charts/troubleshooting/kubernetes_cheat_sheet.html)
@@ -47,7 +47,7 @@ who are aware of the risks.
- [Troubleshooting Kubernetes](https://docs.gitlab.com/charts/troubleshooting/kubernetes_cheat_sheet.html)
- [Troubleshooting PostgreSQL](postgresql.md)
- [Guide to test environments](test_environments.md) (for Support Engineers)
-- [Troubleshooting SSL](ssl.md)
+- [Troubleshooting SSL](https://docs.gitlab.com/omnibus/settings/ssl/ssl_troubleshooting.html)
- Related links:
- [Repairing and recovering broken Git repositories](https://git.seveas.net/repairing-and-recovering-broken-git-repositories.html)
- [Testing with OpenSSL](https://www.feistyduck.com/library/openssl-cookbook/online/testing-with-openssl/index.html)
diff --git a/doc/administration/troubleshooting/ssl.md b/doc/administration/troubleshooting/ssl.md
deleted file mode 100644
index bf8e6b45fde..00000000000
--- a/doc/administration/troubleshooting/ssl.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'https://docs.gitlab.com/omnibus/settings/ssl/ssl_troubleshooting.html'
-remove_date: '2023-10-27'
----
-
-This document was moved to [another location](https://docs.gitlab.com/omnibus/settings/ssl/ssl_troubleshooting.html).
-
-<!-- This redirect file can be deleted after <2023-01-25>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/administration/user_cohorts.md b/doc/administration/user_cohorts.md
index c849d3115d2..ea6a7ea01da 100644
--- a/doc/administration/user_cohorts.md
+++ b/doc/administration/user_cohorts.md
@@ -34,7 +34,6 @@ How do we measure the activity of users? GitLab considers a user active if:
To view user cohorts:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Select the **Cohorts** tab.
diff --git a/doc/administration/whats-new.md b/doc/administration/whats-new.md
index 6d186ef0af5..15b4bd5813e 100644
--- a/doc/administration/whats-new.md
+++ b/doc/administration/whats-new.md
@@ -31,8 +31,7 @@ To access the **What's new** feature:
You can configure **What's new** to display features based on the tier,
or you can hide it. To configure it:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Preferences**.
1. Expand **What's new**, and choose one of the following options:
diff --git a/doc/api/system_hooks.md b/doc/api/system_hooks.md
index 446c91d7971..12f395b0378 100644
--- a/doc/api/system_hooks.md
+++ b/doc/api/system_hooks.md
@@ -10,8 +10,7 @@ All methods require administrator authorization.
You can configure the URL endpoint of the system hooks from the GitLab user interface:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **System Hooks** (`/admin/hooks`).
Read more about [system hooks](../administration/system_hooks.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-admin-area.md b/doc/architecture/blueprints/cells/cells-feature-admin-area.md
deleted file mode 100644
index 3f23e56c3af..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-admin-area.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/admin-area.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/admin-area.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-agent-for-kubernetes.md b/doc/architecture/blueprints/cells/cells-feature-agent-for-kubernetes.md
deleted file mode 100644
index 050b3a922b1..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-agent-for-kubernetes.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/agent-for-kubernetes.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/agent-for-kubernetes.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-backups.md b/doc/architecture/blueprints/cells/cells-feature-backups.md
deleted file mode 100644
index a0c38171ce6..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-backups.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/backups.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/backups.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-ci-runners.md b/doc/architecture/blueprints/cells/cells-feature-ci-runners.md
deleted file mode 100644
index a14f2a47237..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-ci-runners.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/ci-runners.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/ci-runners.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-container-registry.md b/doc/architecture/blueprints/cells/cells-feature-container-registry.md
deleted file mode 100644
index d9ff6da7f62..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-container-registry.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/container-registry.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/container-registry.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-contributions-forks.md b/doc/architecture/blueprints/cells/cells-feature-contributions-forks.md
deleted file mode 100644
index a87e4ba3391..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-contributions-forks.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/contributions-forks.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/contributions-forks.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-data-migration.md b/doc/architecture/blueprints/cells/cells-feature-data-migration.md
deleted file mode 100644
index 5638bb29dc5..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-data-migration.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/data-migration.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/data-migration.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-database-sequences.md b/doc/architecture/blueprints/cells/cells-feature-database-sequences.md
deleted file mode 100644
index 9b426ed80a4..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-database-sequences.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/database-sequences.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/database-sequences.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-explore.md b/doc/architecture/blueprints/cells/cells-feature-explore.md
deleted file mode 100644
index 95924e3d1e8..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-explore.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/explore.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/explore.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-git-access.md b/doc/architecture/blueprints/cells/cells-feature-git-access.md
deleted file mode 100644
index 18fc2b61b1f..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-git-access.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/git-access.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/git-access.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-gitlab-pages.md b/doc/architecture/blueprints/cells/cells-feature-gitlab-pages.md
deleted file mode 100644
index 964423334c1..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-gitlab-pages.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/gitlab-pages.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/gitlab-pages.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-global-search.md b/doc/architecture/blueprints/cells/cells-feature-global-search.md
deleted file mode 100644
index 0a2a89b2d45..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-global-search.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/global-search.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/global-search.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-graphql.md b/doc/architecture/blueprints/cells/cells-feature-graphql.md
deleted file mode 100644
index 69ce2128484..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-graphql.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/graphql.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/graphql.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-organizations.md b/doc/architecture/blueprints/cells/cells-feature-organizations.md
deleted file mode 100644
index 6b589307404..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-organizations.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/organizations.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/organizations.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-personal-access-tokens.md b/doc/architecture/blueprints/cells/cells-feature-personal-access-tokens.md
deleted file mode 100644
index 115af11e3a6..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-personal-access-tokens.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/personal-access-tokens.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/personal-access-tokens.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-personal-namespaces.md b/doc/architecture/blueprints/cells/cells-feature-personal-namespaces.md
deleted file mode 100644
index 6d5ec0c9dd6..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-personal-namespaces.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/personal-namespaces.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/personal-namespaces.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-router-endpoints-classification.md b/doc/architecture/blueprints/cells/cells-feature-router-endpoints-classification.md
deleted file mode 100644
index 0143ac6ffd9..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-router-endpoints-classification.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/router-endpoints-classification.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/router-endpoints-classification.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-schema-changes.md b/doc/architecture/blueprints/cells/cells-feature-schema-changes.md
deleted file mode 100644
index bf78a4eae41..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-schema-changes.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/schema-changes.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/schema-changes.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-secrets.md b/doc/architecture/blueprints/cells/cells-feature-secrets.md
deleted file mode 100644
index 1c4c79d96fc..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-secrets.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/secrets.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/secrets.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-snippets.md b/doc/architecture/blueprints/cells/cells-feature-snippets.md
deleted file mode 100644
index 2963bbdec2c..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-snippets.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/snippets.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/snippets.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-template.md b/doc/architecture/blueprints/cells/cells-feature-template.md
deleted file mode 100644
index c75cc88f46c..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-template.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/template.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/template.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-uploads.md b/doc/architecture/blueprints/cells/cells-feature-uploads.md
deleted file mode 100644
index eab7a8a4fcd..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-uploads.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/uploads.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/uploads.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-user-profile.md b/doc/architecture/blueprints/cells/cells-feature-user-profile.md
deleted file mode 100644
index 73f312f3762..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-user-profile.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/user-profile.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/user-profile.md).
diff --git a/doc/architecture/blueprints/cells/cells-feature-your-work.md b/doc/architecture/blueprints/cells/cells-feature-your-work.md
deleted file mode 100644
index 344037f2a76..00000000000
--- a/doc/architecture/blueprints/cells/cells-feature-your-work.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'impacted_features/your-work.md'
-remove_date: '2023-11-17'
----
-
-This document was moved to [another location](impacted_features/your-work.md).
diff --git a/doc/architecture/blueprints/cells/glossary.md b/doc/architecture/blueprints/cells/glossary.md
deleted file mode 100644
index 69824663867..00000000000
--- a/doc/architecture/blueprints/cells/glossary.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: 'goals.md#glossary'
-remove_date: '2023-11-24'
----
-
-This document was moved to [another location](goals.md#glossary).
diff --git a/doc/architecture/blueprints/cells/impact.md b/doc/architecture/blueprints/cells/impact.md
deleted file mode 100644
index 1f77b9056be..00000000000
--- a/doc/architecture/blueprints/cells/impact.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2023-11-22'
----
-
-This document was removed due to being outdated.
-Go to [index page](index.md) for the most recent content.
diff --git a/doc/ci/index.md b/doc/ci/index.md
index c0c63d13d3a..7af8de6351f 100644
--- a/doc/ci/index.md
+++ b/doc/ci/index.md
@@ -105,6 +105,6 @@ A CI/CD component is a reusable single pipeline configuration unit. Use them to
- [Five teams that made the switch to GitLab CI/CD](https://about.gitlab.com/blog/2019/04/25/5-teams-that-made-the-switch-to-gitlab-ci-cd/).
- [Make the case for CI/CD in your organization](https://about.gitlab.com/why-gitlab/).
- Learn how [Verizon reduced rebuilds](https://about.gitlab.com/blog/2019/02/14/verizon-customer-story/) from 30 days to under 8 hours with GitLab.
-- Use the [GitLab Workflow VS Code extension](../user/project/repository/vscode.md) to
+- Use the [GitLab Workflow VS Code extension](../editor_extensions/visual_studio_code/index.md) to
[validate your configuration](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#validate-gitlab-ci-configuration)
and [view your pipeline status](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#information-about-your-branch-pipelines-mr-closing-issue).
diff --git a/doc/ci/introduction/index.md b/doc/ci/introduction/index.md
deleted file mode 100644
index 57731a96a90..00000000000
--- a/doc/ci/introduction/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../index.md'
-remove_date: '2023-11-24'
----
-
-This document was moved to [another location](../index.md).
-
-<!-- This redirect file can be deleted after <2023-11-24>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/ci/lint.md b/doc/ci/lint.md
index 2b54c645807..f3d30bc29ad 100644
--- a/doc/ci/lint.md
+++ b/doc/ci/lint.md
@@ -15,7 +15,7 @@ If you use the [pipeline editor](pipeline_editor/index.md), it verifies configur
syntax automatically.
If you use VS Code, you can validate your CI/CD configuration with the
-[GitLab Workflow VS Code extension](../user/project/repository/vscode.md).
+[GitLab Workflow VS Code extension](../editor_extensions/visual_studio_code/index.md).
## Check CI/CD syntax
diff --git a/doc/ci/migration/circleci.md b/doc/ci/migration/circleci.md
index 5b171a646f5..984191108bd 100644
--- a/doc/ci/migration/circleci.md
+++ b/doc/ci/migration/circleci.md
@@ -7,7 +7,7 @@ type: index, howto
# Migrating from CircleCI **(FREE ALL)**
-If you are currently using CircleCI, you can migrate your CI/CD pipelines to [GitLab CI/CD](../introduction/index.md),
+If you are currently using CircleCI, you can migrate your CI/CD pipelines to [GitLab CI/CD](../index.md),
and start making use of all its powerful features.
We have collected several resources that you may find useful before starting to migrate.
diff --git a/doc/ci/pipelines/cicd_minutes.md b/doc/ci/pipelines/cicd_minutes.md
index c5b9b27511a..d93ee8b8aba 100644
--- a/doc/ci/pipelines/cicd_minutes.md
+++ b/doc/ci/pipelines/cicd_minutes.md
@@ -59,8 +59,7 @@ Prerequisites:
To change the default quota that applies to all namespaces:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > CI/CD**.
1. Expand **Continuous Integration and Deployment**.
1. In the **Compute quota** box, enter a limit.
@@ -81,8 +80,7 @@ Prerequisites:
To set a compute quota for a namespace:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Overview > Groups**.
1. For the group you want to update, select **Edit**.
1. In the **Compute quota** box, enter the maximum number of compute minutes.
diff --git a/doc/ci/pipelines/index.md b/doc/ci/pipelines/index.md
index f0f0f6d29d2..80a416059e8 100644
--- a/doc/ci/pipelines/index.md
+++ b/doc/ci/pipelines/index.md
@@ -126,7 +126,7 @@ you can filter the pipeline list by:
pipeline column to display the pipeline ID or the pipeline IID.
If you use VS Code to edit your GitLab CI/CD configuration, the
-[GitLab Workflow VS Code extension](../../user/project/repository/vscode.md) helps you
+[GitLab Workflow VS Code extension](../../editor_extensions/visual_studio_code/index.md) helps you
[validate your configuration](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#validate-gitlab-ci-configuration)
and [view your pipeline status](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#information-about-your-branch-pipelines-mr-closing-issue).
diff --git a/doc/ci/pipelines/pipeline_efficiency.md b/doc/ci/pipelines/pipeline_efficiency.md
index 3d24be0f8e1..471699707ff 100644
--- a/doc/ci/pipelines/pipeline_efficiency.md
+++ b/doc/ci/pipelines/pipeline_efficiency.md
@@ -19,7 +19,7 @@ and improve their configuration over time through trial and error. A better proc
to use pipeline features that improve efficiency right away, and get a faster software
development lifecycle earlier.
-First ensure you are familiar with [GitLab CI/CD fundamentals](../introduction/index.md)
+First ensure you are familiar with [GitLab CI/CD fundamentals](../index.md)
and understand the [quick start guide](../quick_start/index.md).
## Identify bottlenecks and common failures
diff --git a/doc/ci/runners/configure_runners.md b/doc/ci/runners/configure_runners.md
index bca0b50563a..a981d6050e9 100644
--- a/doc/ci/runners/configure_runners.md
+++ b/doc/ci/runners/configure_runners.md
@@ -940,8 +940,7 @@ Prerequisites:
To automatically rotate runner authentication tokens:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > CI/CD**.
1. Expand **Continuous Integration and Deployment**
1. Set a **Runners expiration** time for runners, leave empty for no expiration.
diff --git a/doc/ci/runners/runners_scope.md b/doc/ci/runners/runners_scope.md
index 46108931757..ec8671c7b0c 100644
--- a/doc/ci/runners/runners_scope.md
+++ b/doc/ci/runners/runners_scope.md
@@ -48,8 +48,7 @@ When you create a runner, it is assigned a runner authentication token that you
To create a shared runner:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **CI/CD > Runners**.
1. Select **New instance runner**.
1. Select the operating system where GitLab Runner is installed.
@@ -84,8 +83,7 @@ Prerequisites:
To create a shared runner:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **CI/CD > Runners**.
1. Select **Register an instance runner**.
1. Copy the registration token.
@@ -99,8 +97,7 @@ Prerequisites:
You can pause a runner so that it does not accept jobs from groups and projects in the GitLab instance.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **CI/CD > Runners**.
1. In the search box, enter the runner description or filter the runner list.
1. In the runner list, to the right of the runner:
@@ -119,8 +116,7 @@ jobs, you can [pause](#pause-or-resume-a-shared-runner) the runner instead.
To delete a single or multiple shared runners:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **CI/CD > Runners**.
1. In the search box, enter the runner description or filter the list of runners.
1. Delete the shared runner:
@@ -588,8 +584,7 @@ runners are considered.
queued for longer than the median value, and half of the jobs queued for less than the
median value.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **CI/CD > Runners**.
1. Select **View metrics**.
@@ -637,8 +632,7 @@ Prerequisites:
To determine the IP address of a shared runner:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **CI/CD > Runners**.
1. Find the runner in the table and view the **IP Address** column.
diff --git a/doc/ci/variables/index.md b/doc/ci/variables/index.md
index 9dc32c65803..d20ba33eb99 100644
--- a/doc/ci/variables/index.md
+++ b/doc/ci/variables/index.md
@@ -194,8 +194,7 @@ Prerequisites:
To add an instance variable:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD** and expand the **Variables** section.
1. Select **Add variable** and fill in the details:
- **Key**: Must be one line, with no spaces, using only letters, numbers, or `_`.
diff --git a/doc/development/ai_features/duo_chat.md b/doc/development/ai_features/duo_chat.md
index e6f38bea205..dbccb6c9800 100644
--- a/doc/development/ai_features/duo_chat.md
+++ b/doc/development/ai_features/duo_chat.md
@@ -119,6 +119,7 @@ The following CI jobs for GitLab project run the rspecs tagged with `real_ai_req
The job runs the QA evaluation tests in
`ee/spec/lib/gitlab/llm/chain/agents/zero_shot/qa_evaluation_spec.rb`.
The job is optionally triggered and allowed to fail.
+ Read about [GitLab Duo Chat QA Evaluation Test](#gitlab-duo-chat-qa-evaluation-test).
- `rspec-ee unit gitlab-duo-chat-qa-fast`:
The job runs a single QA evaluation test from `ee/spec/lib/gitlab/llm/chain/agents/zero_shot/qa_evaluation_spec.rb`.
@@ -140,6 +141,64 @@ and must be added as a regular CI variable.
For security, the GCP credentials and the associated project added to
GitLab project's CI must not be able to access any production infrastructure and sandboxed.
+### GitLab Duo Chat QA Evaluation Test
+
+Evaluation of a natural language generation (NLG) system such as
+GitLab Duo Chat is a rapidly evolving area with many unanswered questions and ambiguities.
+
+A practical working assumption is LLMs can generate a reasonable answer when given a clear question and a context.
+With the assumption, we are exploring using LLMs as evaluators
+to determine the correctness of a sample of questions
+to track the overall accuracy of GitLab Duo Chat's responses and detect regressions in the feature.
+
+For the discussions related to the topic,
+see [the merge request](https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist/-/merge_requests/431)
+and [the issue](https://gitlab.com/gitlab-org/gitlab/-/issues/427251).
+
+The current QA evaluation test consists of the following components.
+
+#### Epic and issue fixtures
+
+The fixtures are the replicas of the _public_ issues and epics from projects and groups _owned by_ GitLab.
+The internal notes were excluded when they were sampled. The fixtures have been commited into the canonical `gitlab` repository.
+See [the snippet](https://gitlab.com/gitlab-org/gitlab/-/snippets/3613745) used to create the fixtures.
+
+#### RSpec and helpers
+
+1. [The RSpec file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/spec/lib/gitlab/llm/chain/agents/zero_shot/qa_evaluation_spec.rb)
+ and the included helpers invoke the Chat service, an internal interface with the question.
+
+1. After collecting the Chat service's answer,
+ the answer is injected into a prompt, also known as an "evaluation prompt", that instructs
+ a LLM to grade the correctness of the answer based on the question and a context.
+ The context is simply a JSON serialization of the issue or epic being asked about in each question.
+
+1. The evaluation prompt is sent to two LLMs, Claude and Vertex.
+
+1. The evaluation responses of the LLMs are saved as JSON files.
+
+1. For each question, RSpec will regex-match for `CORRECT` or `INCORRECT`.
+
+#### Collection and tracking of QA evaluations via CI/CD automation
+
+The `gitlab` project's CI configurations have been setup to
+run the RSpec,
+collect the evaluation response as artifacts
+and execute [a reporter script](https://gitlab.com/gitlab-org/gitlab/-/blob/master/scripts/duo_chat/reporter.rb)
+that automates collection and tracking of evaluations.
+
+When `rspec-ee unit gitlab-duo-chat-qa` job runs in a pipeline for a merge request,
+the reporter script uses the evaluations saved as CI artifacts
+to generate a Markdown report and posts it as a note in the merge request.
+
+When `rspec-ee unit gitlab-duo-chat-qa` is run in a pipeline for a commit on `master` branch,
+the reporter script instead
+posts the generated report as an issue,
+saves the evaluations artfacts as a snippet,
+and updates the tracking issue in
+[`gitlab-org/ai-powered/ai-framework/qa-evaluation#1`](https://gitlab.com/gitlab-org/ai-powered/ai-framework/qa-evaluation/-/issues/1)
+in the project [`gitlab-org/ai-powered/ai-framework/qa-evaluation`](https://gitlab.com/gitlab-org/ai-powered/ai-framework/qa-evaluation).
+
## GraphQL Subscription
The GraphQL Subscription for Chat behaves slightly different because it's user-centric. A user could have Chat open on multiple browser tabs, or also on their IDE.
diff --git a/doc/development/database/background_migrations.md b/doc/development/database/background_migrations.md
deleted file mode 100644
index be121cc0bfe..00000000000
--- a/doc/development/database/background_migrations.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2023-10-11'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after <2023-10-11>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/development/documentation/contribute.md b/doc/development/documentation/contribute.md
deleted file mode 100644
index 2b166266ddb..00000000000
--- a/doc/development/documentation/contribute.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2023-10-27'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after <2023-10-27>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/development/documentation/site_architecture/index.md b/doc/development/documentation/site_architecture/index.md
index 4a8d441066a..d2de745a8b7 100644
--- a/doc/development/documentation/site_architecture/index.md
+++ b/doc/development/documentation/site_architecture/index.md
@@ -61,7 +61,7 @@ Then you can use one of these approaches:
[to the global navigation](global_nav.md#add-a-navigation-entry), but keep the rest
of the documentation in the external repository. The landing page is indexed and
searchable on <https://docs.gitlab.com>, but the rest of the documentation is not.
- For example, the [GitLab Workflow extension for VS Code](../../../user/project/repository/vscode.md).
+ For example, the [GitLab Workflow extension for VS Code](../../../editor_extensions/visual_studio_code/index.md).
We do not encourage the use of [pages with lists of links](../topic_types/index.md#pages-and-topics-to-avoid),
so only use this option if the recommended options are not feasible.
diff --git a/doc/development/documentation/styleguide/index.md b/doc/development/documentation/styleguide/index.md
index 0ae842e62ad..33e10e2144c 100644
--- a/doc/development/documentation/styleguide/index.md
+++ b/doc/development/documentation/styleguide/index.md
@@ -1009,8 +1009,7 @@ To create a group:
To open the Admin Area:
```markdown
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
```
To open the **Your work** menu item:
diff --git a/doc/development/integrations/jenkins.md b/doc/development/integrations/jenkins.md
index 2ad3553c29f..5400acd5655 100644
--- a/doc/development/integrations/jenkins.md
+++ b/doc/development/integrations/jenkins.md
@@ -24,8 +24,7 @@ brew services start jenkins
GitLab does not allow requests to localhost or the local network by default. When running Jenkins on your local machine, you need to enable local access.
1. Log into your GitLab instance as an administrator.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Network**.
1. Expand **Outbound requests**, and select the following checkboxes:
diff --git a/doc/development/internal_analytics/internal_event_instrumentation/local_setup_and_debugging.md b/doc/development/internal_analytics/internal_event_instrumentation/local_setup_and_debugging.md
index 729e6492321..cfb6e4e1f55 100644
--- a/doc/development/internal_analytics/internal_event_instrumentation/local_setup_and_debugging.md
+++ b/doc/development/internal_analytics/internal_event_instrumentation/local_setup_and_debugging.md
@@ -54,8 +54,7 @@ On GitLab.com events are sent to a collector configured by GitLab. By default, s
You can configure your self-managed GitLab instance to use a custom Snowplow collector.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **Snowplow**.
1. Select **Enable Snowplow tracking** and enter your Snowplow configuration information. For example:
diff --git a/doc/development/internal_analytics/internal_events/index.md b/doc/development/internal_analytics/internal_events/index.md
deleted file mode 100644
index d987317a2b0..00000000000
--- a/doc/development/internal_analytics/internal_events/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_event_tracking/quick_start.md'
-remove_date: '2023-10-27'
----
-
-This document was moved to [another location](../internal_event_tracking/quick_start.md).
-
-<!-- This redirect file can be deleted after <2023-10-27>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/development/runner_fleet_dashboard.md b/doc/development/runner_fleet_dashboard.md
index 737ee751b7f..1c87d2397d7 100644
--- a/doc/development/runner_fleet_dashboard.md
+++ b/doc/development/runner_fleet_dashboard.md
@@ -33,8 +33,7 @@ Prerequisites:
To view the runner fleet dashboard:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Runners**.
1. Click **Fleet dashboard**.
diff --git a/doc/development/testing_guide/end_to_end/package_and_test_pipeline.md b/doc/development/testing_guide/end_to_end/package_and_test_pipeline.md
deleted file mode 100644
index 240db2cbfe5..00000000000
--- a/doc/development/testing_guide/end_to_end/package_and_test_pipeline.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'test_pipelines.md'
-remove_date: '2023-11-08'
----
-
-This document was moved to [another location](test_pipelines.md).
-
-<!-- This redirect file can be deleted after <2023-11-08>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/install/azure/index.md b/doc/install/azure/index.md
index 60591991ea7..ea7de10c12a 100644
--- a/doc/install/azure/index.md
+++ b/doc/install/azure/index.md
@@ -248,8 +248,7 @@ in this section whenever you need to update GitLab.
To determine the version of GitLab you're currently running:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Overview > Dashboard**.
1. Find the version under the **Components** table.
diff --git a/doc/install/migrate/compare_sm_to_saas.md b/doc/install/migrate/compare_sm_to_saas.md
deleted file mode 100644
index b2fcbd5578e..00000000000
--- a/doc/install/migrate/compare_sm_to_saas.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../subscriptions/choosing_subscription.md'
-remove_date: '2023-10-10'
----
-
-This document was moved to [another location](../../subscriptions/choosing_subscription.md).
-
-<!-- This redirect file can be deleted after <2023-10-10>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/integration/advanced_search/elasticsearch.md b/doc/integration/advanced_search/elasticsearch.md
index ddbfb3de63c..4acb6e6762c 100644
--- a/doc/integration/advanced_search/elasticsearch.md
+++ b/doc/integration/advanced_search/elasticsearch.md
@@ -168,8 +168,7 @@ Prerequisites:
To enable advanced search:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Advanced Search**.
NOTE:
@@ -212,8 +211,7 @@ You can only use the **Index all projects** setting to perform
initial indexing, not to re-create an index from scratch.
To enable advanced search with **Index all projects**:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Advanced Search**.
1. Select the **Elasticsearch indexing** checkbox, then select **Save changes**.
1. Select **Index all projects**.
@@ -404,8 +402,7 @@ You can improve the language support for Chinese and Japanese languages by utili
To enable languages support:
1. Install the desired plugins, refer to [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/plugins/7.9/installation.html) for plugins installation instructions. The plugins must be installed on every node in the cluster, and each node must be restarted after installation. For a list of plugins, see the table later in this section.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Advanced Search**.
1. Locate **Custom analyzers: language support**.
1. Enable plugins support for **Indexing**.
@@ -426,8 +423,7 @@ For guidance on what to install, see the following Elasticsearch language plugin
To disable the Elasticsearch integration:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Advanced Search**.
1. Clear the **Elasticsearch indexing** and **Search with Elasticsearch enabled** checkboxes.
1. Select **Save changes**.
@@ -443,8 +439,7 @@ To disable the Elasticsearch integration:
## Unpause Indexing
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Advanced Search**.
1. Expand **Advanced Search**.
1. Clear the **Pause Elasticsearch indexing** checkbox.
@@ -467,8 +462,7 @@ You can use zero-downtime reindexing to configure index settings or mappings tha
To trigger the reindexing process:
1. Sign in to your GitLab instance as an administrator.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Advanced Search**.
1. Expand **Elasticsearch zero-downtime reindexing**.
1. Select **Trigger cluster reindexing**.
@@ -483,8 +477,7 @@ While the reindexing is running, you can follow its progress under that same sec
#### Elasticsearch zero-downtime reindexing
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Advanced Search**.
1. Expand **Elasticsearch zero-downtime reindexing**, and you'll
find the following options:
@@ -532,8 +525,7 @@ Sometimes, you might want to abandon the unfinished reindex job and resume the i
bundle exec rake gitlab:elastic:mark_reindex_failed RAILS_ENV=production
```
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Advanced Search**.
1. Expand **Advanced Search**.
1. Clear the **Pause Elasticsearch indexing** checkbox.
diff --git a/doc/integration/akismet.md b/doc/integration/akismet.md
index 94c25a0547b..118279e3da0 100644
--- a/doc/integration/akismet.md
+++ b/doc/integration/akismet.md
@@ -30,8 +30,7 @@ To use Akismet:
1. Sign in or create a new account.
1. Select **Show** to reveal the API key, and copy the API key's value.
1. Sign in to GitLab as an administrator.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Reporting**.
1. Expand **Spam and Anti-bot Protection**.
1. Select the **Enable Akismet** checkbox.
diff --git a/doc/integration/glab/index.md b/doc/integration/glab/index.md
deleted file mode 100644
index 29cec231d51..00000000000
--- a/doc/integration/glab/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../editor_extensions/gitlab_cli/index.md'
-remove_date: '2023-10-31'
----
-
-This document was moved to [another location](../../editor_extensions/gitlab_cli/index.md).
-
-<!-- This redirect file can be deleted after <2023-10-31>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/integration/kerberos.md b/doc/integration/kerberos.md
index a01d31421ec..c7e5dd00d8f 100644
--- a/doc/integration/kerberos.md
+++ b/doc/integration/kerberos.md
@@ -106,8 +106,7 @@ set up GitLab to create a new account when a Kerberos user tries to sign in.
If you're an administrator, you can link a Kerberos account to an
existing GitLab account. To do so:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Overview > Users**.
1. Select a user, then select the **Identities** tab.
1. From the **Provider** dropdown list, select **Kerberos**.
diff --git a/doc/integration/oauth_provider.md b/doc/integration/oauth_provider.md
index 67a453f7109..63c4f28a15e 100644
--- a/doc/integration/oauth_provider.md
+++ b/doc/integration/oauth_provider.md
@@ -75,8 +75,7 @@ To create a new application for a group:
To create an application for your GitLab instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Applications**.
1. Select **New application**.
diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md
index 15019c93902..b028aa4b686 100644
--- a/doc/integration/omniauth.md
+++ b/doc/integration/omniauth.md
@@ -257,8 +257,7 @@ By default, sign-in is enabled for all the OAuth providers configured in `config
To enable or disable an OmniAuth provider:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **Sign-in restrictions**.
1. In the **Enabled OAuth authentication sources** section, select or clear the checkbox for each provider you want to enable or disable.
diff --git a/doc/integration/recaptcha.md b/doc/integration/recaptcha.md
index 1158ab8135f..faedd8635b9 100644
--- a/doc/integration/recaptcha.md
+++ b/doc/integration/recaptcha.md
@@ -17,8 +17,7 @@ To use reCAPTCHA, first create a site and private key.
1. Go to the [Google reCAPTCHA page](https://www.google.com/recaptcha/admin).
1. To get reCAPTCHA v2 keys, fill in the form and select **Submit**.
1. Sign in to your GitLab server as an administrator.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Reporting**.
1. Expand **Spam and Anti-bot Protection**.
1. In the reCAPTCHA fields, enter the keys you obtained in the previous steps.
diff --git a/doc/integration/sourcegraph.md b/doc/integration/sourcegraph.md
index 729dbade1d1..3fc98cc588c 100644
--- a/doc/integration/sourcegraph.md
+++ b/doc/integration/sourcegraph.md
@@ -49,8 +49,7 @@ You can skip this step if you already have your GitLab repositories searchable i
### Configure your GitLab instance with Sourcegraph
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand the **Sourcegraph** configuration section.
1. Check **Enable Sourcegraph**.
diff --git a/doc/raketasks/migrate_snippets.md b/doc/raketasks/migrate_snippets.md
deleted file mode 100644
index c845d9bed73..00000000000
--- a/doc/raketasks/migrate_snippets.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/security/hardening_application_recommendations.md b/doc/security/hardening_application_recommendations.md
index 9c1b47c94aa..521e8a41b11 100644
--- a/doc/security/hardening_application_recommendations.md
+++ b/doc/security/hardening_application_recommendations.md
@@ -14,8 +14,7 @@ web interface.
## System hooks
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **System Hooks**.
In a typical hardened environment, internal information is not transmitted or stored
@@ -33,8 +32,7 @@ encouraged for communications through system hooks.
## Push rules
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Push Rules**.
Ensure that the following items are selected:
@@ -48,8 +46,7 @@ The adjustments help limit pushes to established and authorized users.
## Deploy keys
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Deploy Keys**.
Public deploy keys at are used to give read or read/write access to
@@ -61,8 +58,7 @@ the documentation on [deploy keys](../user/project/deploy_keys/index.md) and
## General
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
Hardening adjustments can be made in 4 sections.
@@ -180,8 +176,7 @@ For more detailed information, see
## Integrations
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Integrations**.
In general, as long as administrators control and monitor usage, integrations
@@ -192,8 +187,7 @@ process or authenticated user.
## Metrics and profiling
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Metrics and profiling**.
The main focus for hardening is **Usage statistics**:
@@ -210,8 +204,7 @@ help you make an informed decision, see
## Network
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Network**.
For any setting that enables rate limiting, make sure it is selected. Default values
diff --git a/doc/security/password_length_limits.md b/doc/security/password_length_limits.md
index 9503ad4098a..665456ed5a0 100644
--- a/doc/security/password_length_limits.md
+++ b/doc/security/password_length_limits.md
@@ -24,8 +24,7 @@ The user password length is set to a minimum of 8 characters by default.
To change the minimum password length using GitLab UI:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **Sign-up restrictions**.
1. Enter a **Minimum password length** value greater than or equal to `8`.
diff --git a/doc/security/project_import_decompressed_archive_size_limits.md b/doc/security/project_import_decompressed_archive_size_limits.md
deleted file mode 100644
index a4749d0e5f9..00000000000
--- a/doc/security/project_import_decompressed_archive_size_limits.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../administration/settings/import_and_export_settings.md#maximum-decompressed-file-size-for-imported-archives'
-remove_date: '2023-11-02'
----
-
-This document was moved to [another location](../administration/settings/import_and_export_settings.md#maximum-decompressed-file-size-for-imported-archives).
-
-<!-- This redirect file can be deleted after <2023-11-02>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/security/reset_user_password.md b/doc/security/reset_user_password.md
index 9835509897e..ee89412f10f 100644
--- a/doc/security/reset_user_password.md
+++ b/doc/security/reset_user_password.md
@@ -20,8 +20,7 @@ The user's new password must meet all [password requirements](../user/profile/us
To reset a user's password in the UI:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Overview > Users**.
1. For the user whose password you want to update, select **Edit**.
1. In the **Password** area, type a password and password confirmation.
diff --git a/doc/security/ssh_keys_restrictions.md b/doc/security/ssh_keys_restrictions.md
index 3d520d24929..afc515e14f3 100644
--- a/doc/security/ssh_keys_restrictions.md
+++ b/doc/security/ssh_keys_restrictions.md
@@ -20,8 +20,7 @@ limit the allowed SSH key algorithms.
GitLab allows you to restrict the allowed SSH key technology as well as specify
the minimum key length for each technology:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General** .
1. Expand the **Visibility and access controls** section:
diff --git a/doc/security/two_factor_authentication.md b/doc/security/two_factor_authentication.md
index 41844256510..a0faad359c8 100644
--- a/doc/security/two_factor_authentication.md
+++ b/doc/security/two_factor_authentication.md
@@ -34,8 +34,7 @@ You can use the UI or the API to enforce 2FA for all users.
### Use the UI
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand the **Sign-in restrictions** section:
- Select **Enforce two-factor authentication** to enable this feature.
diff --git a/doc/security/unlock_user.md b/doc/security/unlock_user.md
index 8184bdfdd8c..e0f6fa783bd 100644
--- a/doc/security/unlock_user.md
+++ b/doc/security/unlock_user.md
@@ -38,8 +38,7 @@ If 2FA is enabled, users are locked after three failed sign-in attempts. Account
## Unlock a user from the Admin Area
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Overview > Users**.
1. Use the search bar to find the locked user.
1. From the **User administration** dropdown list, select **Unlock**.
diff --git a/doc/security/user_email_confirmation.md b/doc/security/user_email_confirmation.md
index 0d061411b35..e2965977e5f 100644
--- a/doc/security/user_email_confirmation.md
+++ b/doc/security/user_email_confirmation.md
@@ -11,8 +11,7 @@ GitLab can be configured to require confirmation of a user's email address when
the user signs up. When this setting is enabled, the user is unable to sign in until
they confirm their email address.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **Sign-up restrictions** and look for the **Email confirmation settings** options.
diff --git a/doc/security/webhooks.md b/doc/security/webhooks.md
index bcef2684fcf..2946d93dd0d 100644
--- a/doc/security/webhooks.md
+++ b/doc/security/webhooks.md
@@ -50,8 +50,7 @@ To prevent exploitation of insecure internal web services, all webhook and integ
To allow access to these addresses:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Network**.
1. Expand **Outbound requests**.
1. Select the **Allow requests to the local network from webhooks and integrations** checkbox.
@@ -64,8 +63,7 @@ Prerequisites:
[System hooks](../administration/system_hooks.md) can make requests to the local network by default. To prevent system hook requests to the local network:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Network**.
1. Expand **Outbound requests**.
1. Clear the **Allow requests to the local network from system hooks** checkbox.
@@ -80,8 +78,7 @@ Prerequisites:
To filter requests by blocking many requests:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Network**.
1. Expand **Outbound requests**.
1. Select the **Block all requests, except for IP addresses, IP ranges, and domain names defined in the allowlist** checkbox.
@@ -106,8 +103,7 @@ Prerequisites:
To allow outbound requests to certain IP addresses and domains:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > Network**.
1. Expand **Outbound requests**.
1. In **Local IP addresses and domain names that hooks and integrations can access**, enter your IP addresses and domains.
diff --git a/doc/subscriptions/index.md b/doc/subscriptions/index.md
index 8577fdb460d..5e6baef7e09 100644
--- a/doc/subscriptions/index.md
+++ b/doc/subscriptions/index.md
@@ -10,7 +10,7 @@ type: index, reference
Choose and manage the subscription that's right for you and your organization.
- [Choose a subscription](choosing_subscription.md)
-- [Compare self-managed to SaaS](../install/migrate/compare_sm_to_saas.md)
+- [Compare self-managed to SaaS](choosing_subscription.md)
- [GitLab SaaS](gitlab_com/index.md)
- [GitLab self-managed](self_managed/index.md)
- [GitLab Dedicated](gitlab_dedicated/index.md)
diff --git a/doc/subscriptions/self_managed/index.md b/doc/subscriptions/self_managed/index.md
index e5523003a3b..f50ba6fcd5a 100644
--- a/doc/subscriptions/self_managed/index.md
+++ b/doc/subscriptions/self_managed/index.md
@@ -37,8 +37,7 @@ Prorated charges are not possible without a quarterly usage report.
View the amount of users in your instance to determine if they exceed the amount
paid for in your subscription.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Users**.
The lists of users are displayed.
@@ -218,8 +217,7 @@ Example of a license sync request:
You can manually synchronize your subscription details at any time.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Subscription**.
1. In the **Subscription details** section, select **Sync subscription details**.
@@ -229,8 +227,7 @@ A job is queued. When the job finishes, the subscription details are updated.
If you are an administrator, you can view the status of your subscription:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Subscription**.
The **Subscription** page includes the following details:
@@ -254,8 +251,7 @@ It also displays the following information:
If you are an administrator, you can export your license usage into a CSV:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Subscription**.
1. In the upper-right corner, select **Export license usage file**.
diff --git a/doc/topics/autodevops/index.md b/doc/topics/autodevops/index.md
index 3a91c3dc08d..f23aa64aceb 100644
--- a/doc/topics/autodevops/index.md
+++ b/doc/topics/autodevops/index.md
@@ -164,8 +164,7 @@ Prerequisites:
To enable Auto DevOps for your instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand **Auto DevOps**.
1. Select the **Default to Auto DevOps pipeline** checkbox.
@@ -220,7 +219,7 @@ installation pods at runtime.
## Related topics
-- [Continuous methodologies](../../ci/introduction/index.md)
+- [Continuous methodologies](../../ci/index.md)
- [Docker](https://docs.docker.com)
- [GitLab Runner](https://docs.gitlab.com/runner/)
- [Helm](https://helm.sh/docs/)
diff --git a/doc/topics/autodevops/prepare_deployment.md b/doc/topics/autodevops/prepare_deployment.md
index 1dced373461..12ea7a3809a 100644
--- a/doc/topics/autodevops/prepare_deployment.md
+++ b/doc/topics/autodevops/prepare_deployment.md
@@ -12,10 +12,8 @@ recommend that you prepare them before enabling Auto DevOps.
## Deployment strategy
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/38542) in GitLab 11.0.
-
When using Auto DevOps to deploy your applications, choose the
-[continuous deployment strategy](../../ci/introduction/index.md)
+[continuous deployment strategy](../../ci/index.md)
that works best for your needs:
| Deployment strategy | Setup | Methodology |
diff --git a/doc/topics/autodevops/requirements.md b/doc/topics/autodevops/requirements.md
index a0aaba99a59..f3fb3bf0c67 100644
--- a/doc/topics/autodevops/requirements.md
+++ b/doc/topics/autodevops/requirements.md
@@ -30,7 +30,7 @@ To prepare the deployment:
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/38542) in GitLab 11.0.
When using Auto DevOps to deploy your applications, choose the
-[continuous deployment strategy](../../ci/introduction/index.md)
+[continuous deployment strategy](../../ci/index.md)
that works best for your needs:
| Deployment strategy | Setup | Methodology |
diff --git a/doc/topics/gitlab_flow.md b/doc/topics/gitlab_flow.md
deleted file mode 100644
index e9feb75dd5c..00000000000
--- a/doc/topics/gitlab_flow.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'https://about.gitlab.com/blog/2023/07/27/gitlab-flow-duo/'
-remove_date: '2023-10-27'
----
-
-This document was moved to [another location](https://about.gitlab.com/blog/2023/07/27/gitlab-flow-duo/).
-
-<!-- This redirect file can be deleted after <2023-10-27>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/tutorials/automate_runner_creation/index.md b/doc/tutorials/automate_runner_creation/index.md
index 461809997bd..95cd89b1559 100644
--- a/doc/tutorials/automate_runner_creation/index.md
+++ b/doc/tutorials/automate_runner_creation/index.md
@@ -212,8 +212,7 @@ runners to Google Compute Engine:
Now that you've automated your runner creation and automation, you can view
the runners that use the same configuration in the GitLab UI.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **CI/CD > Runners**.
1. In the search box, enter the runner description or search the list of runners.
1. To view the runners that use the same configuration, in the **Details** tab,
diff --git a/doc/tutorials/manage_user/index.md b/doc/tutorials/manage_user/index.md
index 37e565be476..e1c7afd8ab7 100644
--- a/doc/tutorials/manage_user/index.md
+++ b/doc/tutorials/manage_user/index.md
@@ -106,8 +106,7 @@ for the organization.
You will now manually create the users for your organization. These are test
users. To create the first test user, Alex Smith:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Overview > Users**.
1. Select **New user**.
1. Complete the required fields:
diff --git a/doc/update/background_migrations.md b/doc/update/background_migrations.md
index db9cce3ddc2..2b7fc81e0e3 100644
--- a/doc/update/background_migrations.md
+++ b/doc/update/background_migrations.md
@@ -67,8 +67,7 @@ Prerequisites:
To check the status of batched background migrations:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Monitoring > Background Migrations**.
1. Select **Queued** or **Finalizing** to see incomplete migrations,
and **Failed** for failed migrations.
@@ -226,8 +225,7 @@ Prerequisites:
- You must have administrator access to the instance.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Monitoring > Background Migrations**.
1. Select the **Failed** tab. This displays a list of failed batched background migrations.
1. Select the failed **Migration** to see the migration parameters and the jobs that failed.
@@ -242,8 +240,7 @@ Prerequisites:
- You must have administrator access to the instance.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Monitoring > Background Migrations**.
1. Select the **Failed** tab. This displays a list of failed batched background migrations.
1. Select a failed batched background migration to retry by clicking on the retry button (**{retry}**).
diff --git a/doc/user/admin_area/custom_project_templates.md b/doc/user/admin_area/custom_project_templates.md
deleted file mode 100644
index dc773b0aaca..00000000000
--- a/doc/user/admin_area/custom_project_templates.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../administration/custom_project_templates.md'
-remove_date: '2023-10-10'
----
-
-This document was moved to [another location](../../administration/custom_project_templates.md).
-
-<!-- This redirect file can be deleted after <2023-10-10>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/diff_limits.md b/doc/user/admin_area/diff_limits.md
deleted file mode 100644
index 54d7d82af98..00000000000
--- a/doc/user/admin_area/diff_limits.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../administration/diff_limits.md'
-remove_date: '2023-10-10'
----
-
-This document was moved to [another location](../../administration/diff_limits.md).
-
-<!-- This redirect file can be deleted after <2023-10-10>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/email_from_gitlab.md b/doc/user/admin_area/email_from_gitlab.md
deleted file mode 100644
index e5194f05381..00000000000
--- a/doc/user/admin_area/email_from_gitlab.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../administration/email_from_gitlab.md'
-remove_date: '2023-10-10'
----
-
-This document was moved to [another location](../../administration/email_from_gitlab.md).
-
-<!-- This redirect file can be deleted after <2023-10-10>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/external_users.md b/doc/user/admin_area/external_users.md
deleted file mode 100644
index ec28f109384..00000000000
--- a/doc/user/admin_area/external_users.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../administration/external_users.md'
-remove_date: '2023-10-10'
----
-
-This document was moved to [another location](../../administration/external_users.md).
-
-<!-- This redirect file can be deleted after <2023-10-10>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/geo_sites.md b/doc/user/admin_area/geo_sites.md
deleted file mode 100644
index cd0f2f5646a..00000000000
--- a/doc/user/admin_area/geo_sites.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../administration/geo_sites.md'
-remove_date: '2023-10-10'
----
-
-This document was moved to [another location](../../administration/geo_sites.md).
-
-<!-- This redirect file can be deleted after <2023-10-10>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/index.md b/doc/user/admin_area/index.md
deleted file mode 100644
index a729cefa7b8..00000000000
--- a/doc/user/admin_area/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../administration/admin_area.md'
-remove_date: '2023-10-11'
----
-
-This document was moved to [another location](../../administration/admin_area.md).
-
-<!-- This redirect file can be deleted after <2023-10-11>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/license.md b/doc/user/admin_area/license.md
deleted file mode 100644
index 636f5cb2831..00000000000
--- a/doc/user/admin_area/license.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../administration/license.md'
-remove_date: '2023-10-11'
----
-
-This document was moved to [another location](../../administration/license.md).
-
-<!-- This redirect file can be deleted after <2023-10-11>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/license_file.md b/doc/user/admin_area/license_file.md
deleted file mode 100644
index 4835d656cfa..00000000000
--- a/doc/user/admin_area/license_file.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../administration/license_file.md'
-remove_date: '2023-10-11'
----
-
-This document was moved to [another location](../../administration/license_file.md).
-
-<!-- This redirect file can be deleted after <2023-10-11>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/merge_requests_approvals.md b/doc/user/admin_area/merge_requests_approvals.md
deleted file mode 100644
index de079d08d3a..00000000000
--- a/doc/user/admin_area/merge_requests_approvals.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../administration/merge_requests_approvals.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../administration/merge_requests_approvals.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/moderate_users.md b/doc/user/admin_area/moderate_users.md
deleted file mode 100644
index 3390c4791be..00000000000
--- a/doc/user/admin_area/moderate_users.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../administration/moderate_users.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../administration/moderate_users.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/monitoring/health_check.md b/doc/user/admin_area/monitoring/health_check.md
deleted file mode 100644
index bda326d4daf..00000000000
--- a/doc/user/admin_area/monitoring/health_check.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/monitoring/health_check.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/monitoring/health_check.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/reporting/git_abuse_rate_limit.md b/doc/user/admin_area/reporting/git_abuse_rate_limit.md
deleted file mode 100644
index 0e607b03b82..00000000000
--- a/doc/user/admin_area/reporting/git_abuse_rate_limit.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/reporting/git_abuse_rate_limit.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/reporting/git_abuse_rate_limit.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/reporting/ip_addr_restrictions.md b/doc/user/admin_area/reporting/ip_addr_restrictions.md
deleted file mode 100644
index 85783640b28..00000000000
--- a/doc/user/admin_area/reporting/ip_addr_restrictions.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/reporting/ip_addr_restrictions.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](../../../administration/reporting/ip_addr_restrictions.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/reporting/spamcheck.md b/doc/user/admin_area/reporting/spamcheck.md
deleted file mode 100644
index 043481b6255..00000000000
--- a/doc/user/admin_area/reporting/spamcheck.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/reporting/spamcheck.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](../../../administration/reporting/spamcheck.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/review_abuse_reports.md b/doc/user/admin_area/review_abuse_reports.md
deleted file mode 100644
index 0e01025896e..00000000000
--- a/doc/user/admin_area/review_abuse_reports.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../administration/review_abuse_reports.md'
-remove_date: '2023-10-11'
----
-
-This document was moved to [another location](../../administration/review_abuse_reports.md).
-
-<!-- This redirect file can be deleted after <2023-10-11>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/account_and_limit_settings.md b/doc/user/admin_area/settings/account_and_limit_settings.md
deleted file mode 100644
index 2deed61388b..00000000000
--- a/doc/user/admin_area/settings/account_and_limit_settings.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/account_and_limit_settings.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/settings/account_and_limit_settings.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md
deleted file mode 100644
index 72cf369146e..00000000000
--- a/doc/user/admin_area/settings/continuous_integration.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/continuous_integration.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](../../../administration/settings/continuous_integration.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/deprecated_api_rate_limits.md b/doc/user/admin_area/settings/deprecated_api_rate_limits.md
deleted file mode 100644
index 984eeb24bd1..00000000000
--- a/doc/user/admin_area/settings/deprecated_api_rate_limits.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/deprecated_api_rate_limits.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](../../../administration/settings/deprecated_api_rate_limits.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/email.md b/doc/user/admin_area/settings/email.md
deleted file mode 100644
index f90aa7cc865..00000000000
--- a/doc/user/admin_area/settings/email.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/email.md'
-remove_date: '2023-10-14'
----
-
-This document was moved to [another location](../../../administration/settings/email.md).
-
-<!-- This redirect file can be deleted after <2023-10-14>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/external_authorization.md b/doc/user/admin_area/settings/external_authorization.md
deleted file mode 100644
index 02b1ebadc9b..00000000000
--- a/doc/user/admin_area/settings/external_authorization.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/external_authorization.md'
-remove_date: '2023-10-14'
----
-
-This document was moved to [another location](../../../administration/settings/external_authorization.md).
-
-<!-- This redirect file can be deleted after <2023-10-14>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/files_api_rate_limits.md b/doc/user/admin_area/settings/files_api_rate_limits.md
deleted file mode 100644
index c87cac2b8ac..00000000000
--- a/doc/user/admin_area/settings/files_api_rate_limits.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/files_api_rate_limits.md'
-remove_date: '2023-10-14'
----
-
-This document was moved to [another location](../../../administration/settings/files_api_rate_limits.md).
-
-<!-- This redirect file can be deleted after <2023-10-14>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/incident_management_rate_limits.md b/doc/user/admin_area/settings/incident_management_rate_limits.md
deleted file mode 100644
index ad11d6f7f36..00000000000
--- a/doc/user/admin_area/settings/incident_management_rate_limits.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/incident_management_rate_limits.md'
-remove_date: '2023-10-10'
----
-
-This document was moved to [another location](../../../administration/settings/incident_management_rate_limits.md).
-
-<!-- This redirect file can be deleted after <2023-10-10>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/index.md b/doc/user/admin_area/settings/index.md
deleted file mode 100644
index 37112e6897f..00000000000
--- a/doc/user/admin_area/settings/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/index.md'
-remove_date: '2023-10-10'
----
-
-This document was moved to [another location](../../../administration/settings/index.md).
-
-<!-- This redirect file can be deleted after <2023-10-10>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/instance_template_repository.md b/doc/user/admin_area/settings/instance_template_repository.md
deleted file mode 100644
index 752630ea922..00000000000
--- a/doc/user/admin_area/settings/instance_template_repository.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/instance_template_repository.md'
-remove_date: '2023-10-11'
----
-
-This document was moved to [another location](../../../administration/settings/instance_template_repository.md).
-
-<!-- This redirect file can be deleted after <2023-10-11>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/package_registry_rate_limits.md b/doc/user/admin_area/settings/package_registry_rate_limits.md
deleted file mode 100644
index 269864bdd49..00000000000
--- a/doc/user/admin_area/settings/package_registry_rate_limits.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/package_registry_rate_limits.md'
-remove_date: '2023-10-11'
----
-
-This document was moved to [another location](../../../administration/settings/package_registry_rate_limits.md).
-
-<!-- This redirect file can be deleted after <2023-10-11>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/project_integration_management.md b/doc/user/admin_area/settings/project_integration_management.md
deleted file mode 100644
index eff19caabbe..00000000000
--- a/doc/user/admin_area/settings/project_integration_management.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/project_integration_management.md'
-remove_date: '2023-10-11'
----
-
-This document was moved to [another location](../../../administration/settings/project_integration_management.md).
-
-<!-- This redirect file can be deleted after <2023-10-11>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/protected_paths.md b/doc/user/admin_area/settings/protected_paths.md
deleted file mode 100644
index 519d035244a..00000000000
--- a/doc/user/admin_area/settings/protected_paths.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/protected_paths.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/settings/protected_paths.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/push_event_activities_limit.md b/doc/user/admin_area/settings/push_event_activities_limit.md
deleted file mode 100644
index b7e059cf820..00000000000
--- a/doc/user/admin_area/settings/push_event_activities_limit.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/push_event_activities_limit.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/settings/push_event_activities_limit.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/rate_limit_on_issues_creation.md b/doc/user/admin_area/settings/rate_limit_on_issues_creation.md
deleted file mode 100644
index aca30177c54..00000000000
--- a/doc/user/admin_area/settings/rate_limit_on_issues_creation.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/rate_limit_on_issues_creation.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/settings/rate_limit_on_issues_creation.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/rate_limit_on_notes_creation.md b/doc/user/admin_area/settings/rate_limit_on_notes_creation.md
deleted file mode 100644
index 6d5c93f8554..00000000000
--- a/doc/user/admin_area/settings/rate_limit_on_notes_creation.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/rate_limit_on_notes_creation.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/settings/rate_limit_on_notes_creation.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md b/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md
deleted file mode 100644
index c469a77f7d2..00000000000
--- a/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/rate_limit_on_pipelines_creation.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/settings/rate_limit_on_pipelines_creation.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/rate_limit_on_projects_api.md b/doc/user/admin_area/settings/rate_limit_on_projects_api.md
deleted file mode 100644
index 12577ba44b1..00000000000
--- a/doc/user/admin_area/settings/rate_limit_on_projects_api.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/rate_limit_on_projects_api.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/settings/rate_limit_on_projects_api.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/rate_limit_on_users_api.md b/doc/user/admin_area/settings/rate_limit_on_users_api.md
deleted file mode 100644
index 80acbf21023..00000000000
--- a/doc/user/admin_area/settings/rate_limit_on_users_api.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/rate_limit_on_users_api.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/settings/rate_limit_on_users_api.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/rate_limits_on_git_ssh_operations.md b/doc/user/admin_area/settings/rate_limits_on_git_ssh_operations.md
deleted file mode 100644
index b60a78d1f49..00000000000
--- a/doc/user/admin_area/settings/rate_limits_on_git_ssh_operations.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/rate_limits_on_git_ssh_operations.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/settings/rate_limits_on_git_ssh_operations.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/rate_limits_on_raw_endpoints.md b/doc/user/admin_area/settings/rate_limits_on_raw_endpoints.md
deleted file mode 100644
index 5cfee536a58..00000000000
--- a/doc/user/admin_area/settings/rate_limits_on_raw_endpoints.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/rate_limits_on_raw_endpoints.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/settings/rate_limits_on_raw_endpoints.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/scim_setup.md b/doc/user/admin_area/settings/scim_setup.md
deleted file mode 100644
index 4ebd8a84f8a..00000000000
--- a/doc/user/admin_area/settings/scim_setup.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/scim_setup.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../../../administration/settings/scim_setup.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/security_and_compliance.md b/doc/user/admin_area/settings/security_and_compliance.md
deleted file mode 100644
index 8c1e514c575..00000000000
--- a/doc/user/admin_area/settings/security_and_compliance.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/security_and_compliance.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](../../../administration/settings/security_and_compliance.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/sidekiq_job_limits.md b/doc/user/admin_area/settings/sidekiq_job_limits.md
deleted file mode 100644
index 81be26ec8e0..00000000000
--- a/doc/user/admin_area/settings/sidekiq_job_limits.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/sidekiq_job_limits.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](../../../administration/settings/sidekiq_job_limits.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/sign_in_restrictions.md b/doc/user/admin_area/settings/sign_in_restrictions.md
deleted file mode 100644
index c3957ed97eb..00000000000
--- a/doc/user/admin_area/settings/sign_in_restrictions.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/sign_in_restrictions.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](../../../administration/settings/sign_in_restrictions.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/sign_up_restrictions.md b/doc/user/admin_area/settings/sign_up_restrictions.md
deleted file mode 100644
index 553caa9ff0d..00000000000
--- a/doc/user/admin_area/settings/sign_up_restrictions.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/sign_up_restrictions.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](../../../administration/settings/sign_up_restrictions.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/slack_app.md b/doc/user/admin_area/settings/slack_app.md
deleted file mode 100644
index 86762edd1a9..00000000000
--- a/doc/user/admin_area/settings/slack_app.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/slack_app.md'
-remove_date: '2023-10-14'
----
-
-This document was moved to [another location](../../../administration/settings/slack_app.md).
-
-<!-- This redirect file can be deleted after <2023-10-14>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/terms.md b/doc/user/admin_area/settings/terms.md
deleted file mode 100644
index 444eeeb15ea..00000000000
--- a/doc/user/admin_area/settings/terms.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/terms.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](../../../administration/settings/terms.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/terraform_limits.md b/doc/user/admin_area/settings/terraform_limits.md
deleted file mode 100644
index 8fed7589bb7..00000000000
--- a/doc/user/admin_area/settings/terraform_limits.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/terraform_limits.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](../../../administration/settings/terraform_limits.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/third_party_offers.md b/doc/user/admin_area/settings/third_party_offers.md
deleted file mode 100644
index 54c5b36bbc0..00000000000
--- a/doc/user/admin_area/settings/third_party_offers.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/third_party_offers.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](../../../administration/settings/third_party_offers.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/usage_statistics.md b/doc/user/admin_area/settings/usage_statistics.md
deleted file mode 100644
index 5b2afd3ad90..00000000000
--- a/doc/user/admin_area/settings/usage_statistics.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/usage_statistics.md'
-remove_date: '2023-10-13'
----
-
-This document was moved to [another location](../../../administration/settings/usage_statistics.md).
-
-<!-- This redirect file can be deleted after <2023-10-13>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/user_and_ip_rate_limits.md b/doc/user/admin_area/settings/user_and_ip_rate_limits.md
deleted file mode 100644
index fae47358879..00000000000
--- a/doc/user/admin_area/settings/user_and_ip_rate_limits.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/user_and_ip_rate_limits.md'
-remove_date: '2023-10-14'
----
-
-This document was moved to [another location](../../../administration/settings/user_and_ip_rate_limits.md).
-
-<!-- This redirect file can be deleted after <2023-10-14>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/settings/visibility_and_access_controls.md b/doc/user/admin_area/settings/visibility_and_access_controls.md
deleted file mode 100644
index c9ff105f8c9..00000000000
--- a/doc/user/admin_area/settings/visibility_and_access_controls.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../administration/settings/visibility_and_access_controls.md'
-remove_date: '2023-10-14'
----
-
-This document was moved to [another location](../../../administration/settings/visibility_and_access_controls.md).
-
-<!-- This redirect file can be deleted after <2023-10-14>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/user_cohorts.md b/doc/user/admin_area/user_cohorts.md
deleted file mode 100644
index b0b4facd7db..00000000000
--- a/doc/user/admin_area/user_cohorts.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../administration/user_cohorts.md'
-remove_date: '2023-10-11'
----
-
-This document was moved to [another location](../../administration/user_cohorts.md).
-
-<!-- This redirect file can be deleted after <2023-10-11>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/application_security/generate_test_vulnerabilities/index.md b/doc/user/application_security/generate_test_vulnerabilities/index.md
deleted file mode 100644
index f9f93b97baf..00000000000
--- a/doc/user/application_security/generate_test_vulnerabilities/index.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-redirect_to: '../../../development/sec/generate_test_vulnerabilities.md'
-remove_date: '2023-11-01'
----
-
-This document was moved to [another location](../../../development/sec/generate_test_vulnerabilities.md).
diff --git a/doc/user/clusters/agent/gitops/flux.md b/doc/user/clusters/agent/gitops/flux.md
deleted file mode 100644
index 13fcfeb28e9..00000000000
--- a/doc/user/clusters/agent/gitops/flux.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../gitops.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../gitops.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/clusters/agent/gitops/helm.md b/doc/user/clusters/agent/gitops/helm.md
deleted file mode 100644
index 22587cd0e5d..00000000000
--- a/doc/user/clusters/agent/gitops/helm.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../gitops.md'
-remove_date: '2023-10-22'
----
-
-This document was moved to [another location](../gitops.md).
-
-<!-- This redirect file can be deleted after 2023-10-22. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/custom_roles.md b/doc/user/custom_roles.md
index 445717da80d..aa854b492ad 100644
--- a/doc/user/custom_roles.md
+++ b/doc/user/custom_roles.md
@@ -77,8 +77,7 @@ Prerequisites:
- You must be an administrator for the self-managed instance you are creating the custom role in.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Roles and Permissions**.
1. From the top dropdown list, select the group you want to create a custom role in.
1. Select **Add new role**.
diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md
index f339c58e4cd..f3567344485 100644
--- a/doc/user/gitlab_com/index.md
+++ b/doc/user/gitlab_com/index.md
@@ -390,7 +390,7 @@ user confirmation, user sign in, and password reset.
[User and IP rate limits](../../administration/settings/user_and_ip_rate_limits.md#response-headers)
includes a list of the headers responded to blocked requests.
-See [Protected Paths](../admin_area/settings/protected_paths.md) for more details.
+See [Protected Paths](../../administration/settings/protected_paths.md) for more details.
### IP blocks
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index d120f626944..4c565aa0c32 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -621,8 +621,7 @@ Prerequisites:
To enable import and export for a group:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **Visibility and access controls**.
1. In the **Import sources** section, select the checkboxes for the sources you want.
@@ -664,7 +663,7 @@ NOTE:
The maximum import file size can be set by the administrator, default is `0` (unlimited).
As an administrator, you can modify the maximum import file size. To do so, use the `max_import_size` option in the
[Application settings API](../../../api/settings.md#change-application-settings) or the
-[Admin Area](../../admin_area/settings/account_and_limit_settings.md).
+[Admin Area](../../../administration/settings/account_and_limit_settings.md).
Default [modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50 MB to 0 in GitLab 13.8.
### Rate limits
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index f2f9603c263..e49f528c3d1 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -286,7 +286,7 @@ Members that are not automatically added are displayed on the **Invited** tab.
This tab includes users who:
- Have not yet accepted the invitation.
-- Are waiting for [approval from an administrator](../admin_area/moderate_users.md).
+- Are waiting for [approval from an administrator](../../administration/moderate_users.md).
- [Exceed the group user cap](manage.md#user-cap-for-groups).
## Remove a member from the group
diff --git a/doc/user/group/manage.md b/doc/user/group/manage.md
index 76bb2da15b4..749ac3234fd 100644
--- a/doc/user/group/manage.md
+++ b/doc/user/group/manage.md
@@ -322,7 +322,7 @@ User cap doesn’t consider whether users are billable or not (e.g., Free Guest
Use group file templates to share a set of templates for common file
types with every project in a group. It is analogous to the
-[instance template repository](../admin_area/settings/instance_template_repository.md).
+[instance template repository](../../administration/settings/instance_template_repository.md).
The selected project should follow the same naming conventions as
are documented on that page.
diff --git a/doc/user/group/reporting/git_abuse_rate_limit.md b/doc/user/group/reporting/git_abuse_rate_limit.md
index d32524b8f5f..1d2e64204fb 100644
--- a/doc/user/group/reporting/git_abuse_rate_limit.md
+++ b/doc/user/group/reporting/git_abuse_rate_limit.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
FLAG:
On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `limit_unique_project_downloads_per_namespace_user`. On GitLab.com, this feature is available.
-This is the group-level documentation. For self-managed instances, see the [administration documentation](../../admin_area/reporting/git_abuse_rate_limit.md).
+This is the group-level documentation. For self-managed instances, see the [administration documentation](../../../administration/reporting/git_abuse_rate_limit.md).
Git abuse rate limiting is a feature to automatically ban users who download, clone, pull, fetch, or fork more than a specified number of repositories of a group in a given time frame. Banned users cannot access the top-level group or any of its non-public subgroups via HTTP or SSH. The rate limit also applies to users who authenticate with [personal](../../../user/profile/personal_access_tokens.md) or [group access tokens](../../../user/group/settings/group_access_tokens.md), as well as [CI/CD job tokens](../../../ci/jobs/ci_job_token.md). Access to unrelated groups is unaffected.
diff --git a/doc/user/group/saml_sso/group_sync.md b/doc/user/group/saml_sso/group_sync.md
index 0ec6b60ac61..3d814e67790 100644
--- a/doc/user/group/saml_sso/group_sync.md
+++ b/doc/user/group/saml_sso/group_sync.md
@@ -182,8 +182,7 @@ To configure for a GitLab.com group:
To configure for self-managed:
1. Configure [SAML SSO for the instance](../../../integration/saml.md).
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. In the **Microsoft Azure integration** section, select the **Enable Microsoft Azure integration for this group** checkbox.
1. Enter the **Tenant ID**, **Client ID**, and **Client secret** obtained earlier when configuring Azure Active Directory in the Azure Portal.
@@ -213,8 +212,7 @@ When global group memberships lock is enabled:
To enable global group memberships lock:
1. [Configure SAML](../../../integration/saml.md) for your self-managed GitLab instance.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand the **Visibility and access controls** section.
1. Ensure that **Lock memberships to SAML Group Links synchronization** is selected.
diff --git a/doc/user/group/saml_sso/troubleshooting.md b/doc/user/group/saml_sso/troubleshooting.md
index 82f2bd6b000..7d8466d009a 100644
--- a/doc/user/group/saml_sso/troubleshooting.md
+++ b/doc/user/group/saml_sso/troubleshooting.md
@@ -323,8 +323,7 @@ This message might indicate that you must add or remove a domain from your domai
To implement this workaround:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings** > **General**.
1. Expand **Sign-up restrictions**.
1. Add or remove a domain as appropriate to **Allowed domains for sign-ups** and **Denied domains for sign-ups**.
diff --git a/doc/user/infrastructure/clusters/connect/index.md b/doc/user/infrastructure/clusters/connect/index.md
index 961914aac9c..6a2071ff209 100644
--- a/doc/user/infrastructure/clusters/connect/index.md
+++ b/doc/user/infrastructure/clusters/connect/index.md
@@ -44,8 +44,7 @@ your cluster's level.
**Instance-level clusters:**
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Kubernetes**.
## Security implications for clusters connected with certificates
diff --git a/doc/user/instance/clusters/index.md b/doc/user/instance/clusters/index.md
index 5787051a2c2..d0cf1162e1d 100644
--- a/doc/user/instance/clusters/index.md
+++ b/doc/user/instance/clusters/index.md
@@ -21,8 +21,7 @@ projects.
To view the instance level Kubernetes clusters:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Kubernetes**.
## Cluster precedence
diff --git a/doc/user/packages/container_registry/authenticate_with_container_registry.md b/doc/user/packages/container_registry/authenticate_with_container_registry.md
index f238369624c..c5773ba4fe3 100644
--- a/doc/user/packages/container_registry/authenticate_with_container_registry.md
+++ b/doc/user/packages/container_registry/authenticate_with_container_registry.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
<!--- start_remove The following content will be removed on remove_date: '2023-11-22' -->
WARNING:
-In GitLab 16.0 and later, [external authorization](../../admin_area/settings/external_authorization.md) prevents personal access tokens and deploy tokens from accessing container and package registries and affects all users who use these tokens to access the registries. You can disable external authorization if you want to use personal access tokens and deploy tokens with the container or package registries.
+In GitLab 16.0 and later, [external authorization](../../../administration/settings/external_authorization.md) prevents personal access tokens and deploy tokens from accessing container and package registries and affects all users who use these tokens to access the registries. You can disable external authorization if you want to use personal access tokens and deploy tokens with the container or package registries.
<!--- end_remove -->
To authenticate with the container registry, you can use a:
diff --git a/doc/user/packages/container_registry/reduce_container_registry_storage.md b/doc/user/packages/container_registry/reduce_container_registry_storage.md
index 1734fc27f21..f0ae6929033 100644
--- a/doc/user/packages/container_registry/reduce_container_registry_storage.md
+++ b/doc/user/packages/container_registry/reduce_container_registry_storage.md
@@ -279,10 +279,9 @@ For self-managed instances, those settings can be updated in the [Rails console]
ApplicationSetting.last.update(container_registry_expiration_policies_worker_capacity: 3)
```
-They are also available in the [administrator area](../../admin_area/index.md):
+They are also available in the [administrator area](../../../administration/admin_area.md):
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > CI/CD**
1. Expand **Container Registry**.
diff --git a/doc/user/packages/maven_repository/index.md b/doc/user/packages/maven_repository/index.md
index e4c92acb6d5..e3abde02734 100644
--- a/doc/user/packages/maven_repository/index.md
+++ b/doc/user/packages/maven_repository/index.md
@@ -466,6 +466,9 @@ group, or namespace.
If multiple packages have the same name and version, when you install
a package, the most recently-published package is retrieved.
+In case there are not enough permissions to read the most recently-published
+package than `403 Forbidden` is returning.
+
::Tabs
:::TabTitle `mvn`
@@ -596,7 +599,7 @@ When a Maven package is not found in the package registry, the request is forwar
to [Maven Central](https://search.maven.org/).
When the feature flag is enabled, administrators can disable this behavior in the
-[Continuous Integration settings](../../admin_area/settings/continuous_integration.md).
+[Continuous Integration settings](../../../administration/settings/continuous_integration.md).
Maven forwarding is restricted to only the project level and
group level [endpoints](#naming-convention). The instance level endpoint
diff --git a/doc/user/packages/npm_registry/index.md b/doc/user/packages/npm_registry/index.md
index 9b85e9d4b35..d2d9464b6db 100644
--- a/doc/user/packages/npm_registry/index.md
+++ b/doc/user/packages/npm_registry/index.md
@@ -271,7 +271,7 @@ npm deprecate @scope/package ""
When an npm package is not found in the package registry, the request is forwarded to [npmjs.com](https://www.npmjs.com/). The forward is performed by sending an HTTP redirect back to the requesting client.
-Administrators can disable this behavior in the [Continuous Integration settings](../../admin_area/settings/continuous_integration.md).
+Administrators can disable this behavior in the [Continuous Integration settings](../../../administration/settings/continuous_integration.md).
Group owners can disable this behavior in the group Packages and Registries settings.
diff --git a/doc/user/packages/package_registry/index.md b/doc/user/packages/package_registry/index.md
index 96d8220ef85..e5e9cdf5c18 100644
--- a/doc/user/packages/package_registry/index.md
+++ b/doc/user/packages/package_registry/index.md
@@ -45,7 +45,7 @@ For information on how to create and upload a package, view the GitLab documenta
<!--- start_remove The following content will be removed on remove_date: '2023-11-22' -->
WARNING:
-In GitLab 16.0 and later, [external authorization](../../admin_area/settings/external_authorization.md) prevents personal access tokens and deploy tokens from accessing container and package registries and affects all users who use these tokens to access the registries. You can disable external authorization if you want to use personal access tokens and deploy tokens with the container or package registries.
+In GitLab 16.0 and later, [external authorization](../../../administration/settings/external_authorization.md) prevents personal access tokens and deploy tokens from accessing container and package registries and affects all users who use these tokens to access the registries. You can disable external authorization if you want to use personal access tokens and deploy tokens with the container or package registries.
<!--- end_remove -->
Authentication depends on the package manager being used. For more information, see the docs on the
diff --git a/doc/user/packages/pypi_repository/index.md b/doc/user/packages/pypi_repository/index.md
index a2fbee1edc4..b91e32acde4 100644
--- a/doc/user/packages/pypi_repository/index.md
+++ b/doc/user/packages/pypi_repository/index.md
@@ -205,7 +205,7 @@ more than once, a `400 Bad Request` error occurs.
In [GitLab 14.2 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/233413),
when a PyPI package is not found in the package registry, the request is forwarded to [pypi.org](https://pypi.org/).
-Administrators can disable this behavior in the [Continuous Integration settings](../../admin_area/settings/continuous_integration.md).
+Administrators can disable this behavior in the [Continuous Integration settings](../../../administration/settings/continuous_integration.md).
WARNING:
When you use the `--index-url` option, do not specify the port if it is a default
diff --git a/doc/user/product_analytics/index.md b/doc/user/product_analytics/index.md
index db52f9e51cc..2319b7a5185 100644
--- a/doc/user/product_analytics/index.md
+++ b/doc/user/product_analytics/index.md
@@ -78,8 +78,7 @@ Prerequisites:
- You must be an administrator of a self-managed GitLab instance.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand the **Analytics** tab and find the **Product analytics** section.
1. Select **Enable product analytics** and enter the configuration values.
diff --git a/doc/user/profile/account/create_accounts.md b/doc/user/profile/account/create_accounts.md
index cced4ae110a..135928dd362 100644
--- a/doc/user/profile/account/create_accounts.md
+++ b/doc/user/profile/account/create_accounts.md
@@ -18,7 +18,7 @@ You can create users:
Prerequisites:
-- [Sign-up must be enabled](../../admin_area/settings/sign_up_restrictions.md).
+- [Sign-up must be enabled](../../../administration/settings/sign_up_restrictions.md).
Users can create their own accounts by either:
@@ -33,8 +33,7 @@ Prerequisites:
To create a user manually:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Select **New user**.
1. Complete the required fields, such as name, username, and email.
diff --git a/doc/user/profile/account/delete_account.md b/doc/user/profile/account/delete_account.md
index 70c12cbcf00..e653971d149 100644
--- a/doc/user/profile/account/delete_account.md
+++ b/doc/user/profile/account/delete_account.md
@@ -36,8 +36,7 @@ On GitLab.com, there is a seven day delay between a user deleting their own acco
As an administrator, to delete a user account:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Overview > Users**.
1. Select a user.
1. Under the **Account** tab, select:
diff --git a/doc/user/profile/personal_access_tokens.md b/doc/user/profile/personal_access_tokens.md
index 6700d28de8b..4684cbd070b 100644
--- a/doc/user/profile/personal_access_tokens.md
+++ b/doc/user/profile/personal_access_tokens.md
@@ -128,7 +128,7 @@ A personal access token can perform actions based on the assigned scopes.
| `k8s_proxy` | Grants permission to perform Kubernetes API calls using the agent for Kubernetes. |
WARNING:
-If you enabled [external authorization](../admin_area/settings/external_authorization.md), personal access tokens cannot access container or package registries. If you use personal access tokens to access these registries, this measure breaks this use of these tokens. Disable external authorization to use personal access tokens with container or package registries.
+If you enabled [external authorization](../../administration/settings/external_authorization.md), personal access tokens cannot access container or package registries. If you use personal access tokens to access these registries, this measure breaks this use of these tokens. Disable external authorization to use personal access tokens with container or package registries.
## When personal access tokens expire
@@ -168,8 +168,7 @@ Prerequisites:
- You must be an administrator for your self-managed instance.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Account and limit**.
1. Clear the **Service account token expiration** checkbox.
diff --git a/doc/user/project/changelogs.md b/doc/user/project/changelogs.md
index 1f251565d3f..13132e44f5d 100644
--- a/doc/user/project/changelogs.md
+++ b/doc/user/project/changelogs.md
@@ -72,7 +72,7 @@ in the API documentation.
Prerequisites:
-- You have installed and configured the [GitLab CLI](../../integration/glab/index.md),
+- You have installed and configured the [GitLab CLI](../../editor_extensions/gitlab_cli/index.md),
version 1.30.0 or later.
- Your repository's tag naming schema matches
[the expected tag naming format](#customize-the-tag-format-when-extracting-versions).
diff --git a/doc/user/project/clusters/add_eks_clusters.md b/doc/user/project/clusters/add_eks_clusters.md
index d8b1b6fd413..32617b1d074 100644
--- a/doc/user/project/clusters/add_eks_clusters.md
+++ b/doc/user/project/clusters/add_eks_clusters.md
@@ -248,8 +248,7 @@ For example, the following policy document allows assuming a role whose name sta
To configure Amazon authentication in GitLab, generate an access key for the
IAM user in the Amazon AWS console, and follow these steps:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Amazon EKS**.
1. Check **Enable Amazon EKS integration**.
diff --git a/doc/user/project/deploy_keys/index.md b/doc/user/project/deploy_keys/index.md
index 73d3d97be4a..ebb2eb58a49 100644
--- a/doc/user/project/deploy_keys/index.md
+++ b/doc/user/project/deploy_keys/index.md
@@ -17,7 +17,7 @@ Depending on your needs, you might want to use a [deploy token](../deploy_tokens
| Source | Public SSH key generated on an external host. | Generated on your GitLab instance, and is provided to users only at creation time. |
| Accessible resources | Git repository over SSH | Git repository over HTTP, package registry, and container registry. |
-Deploy keys can't be used for Git operations if [external authorization](../../admin_area/settings/external_authorization.md) is enabled.
+Deploy keys can't be used for Git operations if [external authorization](../../../administration/settings/external_authorization.md) is enabled.
## Scope
@@ -111,8 +111,7 @@ Prerequisites:
To create a public deploy key:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Deploy Keys**.
1. Select **New deploy key**.
1. Complete the fields.
diff --git a/doc/user/project/deploy_tokens/index.md b/doc/user/project/deploy_tokens/index.md
index 8459ffdde86..fab98492c42 100644
--- a/doc/user/project/deploy_tokens/index.md
+++ b/doc/user/project/deploy_tokens/index.md
@@ -38,7 +38,7 @@ it. Expiry occurs at midnight UTC on that date.
WARNING:
You cannot use new or existing deploy tokens for Git operations and package registry operations if
-[external authorization](../../admin_area/settings/external_authorization.md) is enabled.
+[external authorization](../../../administration/settings/external_authorization.md) is enabled.
## Scope
diff --git a/doc/user/project/description_templates.md b/doc/user/project/description_templates.md
index 97b350c8692..4587d84e0e0 100644
--- a/doc/user/project/description_templates.md
+++ b/doc/user/project/description_templates.md
@@ -107,10 +107,10 @@ your merge request template with their values:
### Set instance-level description templates **(PREMIUM SELF)**
You can set a description template at the **instance level** for issues
-and merge requests by using an [instance template repository](../admin_area/settings/instance_template_repository.md).
+and merge requests by using an [instance template repository](../../administration/settings/instance_template_repository.md).
You can also use the instance template repository for file templates.
-You might also be interested in [project templates](../admin_area/custom_project_templates.md)
+You might also be interested in [project templates](../../administration/custom_project_templates.md)
that you can use when creating a new project in the instance.
### Set group-level description templates **(PREMIUM ALL)**
diff --git a/doc/user/project/import/index.md b/doc/user/project/import/index.md
index e47e9715980..bd2a554607e 100644
--- a/doc/user/project/import/index.md
+++ b/doc/user/project/import/index.md
@@ -41,8 +41,7 @@ with a malicious `.gitlab-ci.yml` file could allow an attacker to exfiltrate gro
GitLab self-managed administrators can reduce their attack surface by disabling import sources they don't need:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Visibility and access controls**.
1. Scroll to **Import sources**.
diff --git a/doc/user/project/integrations/gitlab_slack_application.md b/doc/user/project/integrations/gitlab_slack_application.md
index abfd4243e07..be6aad4b166 100644
--- a/doc/user/project/integrations/gitlab_slack_application.md
+++ b/doc/user/project/integrations/gitlab_slack_application.md
@@ -20,7 +20,7 @@ you run in Slack is run by your linked GitLab user.
Prerequisites:
- You must have the [appropriate permissions to add apps to your Slack workspace](https://slack.com/help/articles/202035138-Add-apps-to-your-Slack-workspace).
-- On self-managed GitLab, an administrator must [enable the integration](../../admin_area/settings/slack_app.md).
+- On self-managed GitLab, an administrator must [enable the integration](../../../administration/settings/slack_app.md).
In GitLab 15.0 and later, the GitLab for Slack app uses
[granular permissions](https://medium.com/slack-developer-blog/more-precision-less-restrictions-a3550006f9c3).
diff --git a/doc/user/project/integrations/mattermost_slash_commands.md b/doc/user/project/integrations/mattermost_slash_commands.md
index 619d9a21e6d..8838ea5a49f 100644
--- a/doc/user/project/integrations/mattermost_slash_commands.md
+++ b/doc/user/project/integrations/mattermost_slash_commands.md
@@ -67,8 +67,7 @@ To get configuration values from GitLab:
1. In a different browser tab, sign in to
GitLab as a user with administrator access.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Integrations**.
1. Select **Mattermost slash commands**. GitLab displays potential values for Mattermost settings.
1. Copy the **Request URL** value. All other values are suggestions.
diff --git a/doc/user/project/integrations/mlflow_client.md b/doc/user/project/integrations/mlflow_client.md
deleted file mode 100644
index ce092d10d20..00000000000
--- a/doc/user/project/integrations/mlflow_client.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../ml/experiment_tracking/mlflow_client.md'
-remove_date: '2023-10-12'
----
-
-This document was moved to [another location](../ml/experiment_tracking/mlflow_client.md).
-
-<!-- This redirect file can be deleted after <2023-10-12>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/project/merge_requests/approvals/index.md b/doc/user/project/merge_requests/approvals/index.md
index bace1dfb8b5..614ecb45cb5 100644
--- a/doc/user/project/merge_requests/approvals/index.md
+++ b/doc/user/project/merge_requests/approvals/index.md
@@ -26,7 +26,7 @@ group-level settings for merge request approval rules is tracked in this
[GitLab Premium](https://about.gitlab.com/pricing/) and
[GitLab Ultimate](https://about.gitlab.com/pricing/) self-managed GitLab instances
can also configure approvals
-[for the entire instance](../../../admin_area/merge_requests_approvals.md).
+[for the entire instance](../../../../administration/admin_area.md).
## How approvals work
@@ -129,7 +129,7 @@ Invalid approval rules created through a scan result policy are presented with
## Related topics
- [Merge request approvals API](../../../../api/merge_request_approvals.md)
-- [Instance-level approval rules](../../../admin_area/merge_requests_approvals.md) for self-managed installations
+- [Instance-level approval rules](../../../../administration/admin_area.md) for self-managed installations
<!-- ## Troubleshooting
diff --git a/doc/user/project/merge_requests/approvals/rules.md b/doc/user/project/merge_requests/approvals/rules.md
index 87ff6376ebd..6e8fe055880 100644
--- a/doc/user/project/merge_requests/approvals/rules.md
+++ b/doc/user/project/merge_requests/approvals/rules.md
@@ -16,7 +16,7 @@ You can define approval rules:
- [As project defaults](#add-an-approval-rule).
- [Per merge request](#edit-or-override-merge-request-approval-rules).
-- [At the instance level](../../../admin_area/merge_requests_approvals.md)
+- [At the instance level](../../../../administration/admin_area.md)
If you don't define a [default approval rule](#add-an-approval-rule),
any user can approve a merge request. Even if you don't define a rule, you can still
diff --git a/doc/user/project/merge_requests/approvals/settings.md b/doc/user/project/merge_requests/approvals/settings.md
index 226e2670543..1fc64107a0a 100644
--- a/doc/user/project/merge_requests/approvals/settings.md
+++ b/doc/user/project/merge_requests/approvals/settings.md
@@ -57,7 +57,7 @@ this setting, unless you configure one of these options:
- [Prevent overrides of default approvals](#prevent-editing-approval-rules-in-merge-requests) at
the project level.
- *(Self-managed instances only)* Prevent overrides of default approvals
- [at the instance level](../../../admin_area/merge_requests_approvals.md). When configured
+ [at the instance level](../../../../administration/admin_area.md). When configured
at the instance level, you can't edit this setting at the project or individual
merge request levels.
@@ -68,7 +68,7 @@ this setting, unless you configure one of these options:
> - [Feature flag `keep_merge_commits_for_approvals`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/131778) removed in GitLab 16.5. This check now includes merge commits.
By default, users who commit to a merge request can still approve it. At both
-the project level or [instance level](../../../admin_area/merge_requests_approvals.md),
+the project level or [instance level](../../../../administration/admin_area.md),
you can prevent committers from approving merge requests that are partially
their own. To do this:
@@ -76,7 +76,7 @@ their own. To do this:
1. In the **Merge request approvals** section, scroll to **Approval settings** and
select **Prevent approvals by users who add commits**.
If this checkbox is cleared, an administrator has disabled it
- [at the instance level](../../../admin_area/merge_requests_approvals.md), and
+ [at the instance level](../../../../administration/admin_area.md), and
it can't be changed at the project level.
1. Select **Save changes**.
@@ -168,7 +168,7 @@ To do this:
You can also enforce merge request approval settings:
-- At the [instance level](../../../admin_area/merge_requests_approvals.md), which apply to all groups
+- At the [instance level](../../../../administration/admin_area.md), which apply to all groups
on an instance and, therefore, all projects.
- On a [top-level group](../../../group/manage.md#group-merge-request-approval-settings), which apply to all subgroups
and projects.
@@ -178,6 +178,6 @@ that inherited them.
## Related topics
-- [Instance-level merge request approval settings](../../../admin_area/merge_requests_approvals.md)
+- [Instance-level merge request approval settings](../../../../administration/admin_area.md)
- [Compliance center](../../../compliance/compliance_center/index.md)
- [Merge request approvals API](../../../../api/merge_request_approvals.md)
diff --git a/doc/user/project/merge_requests/reviews/index.md b/doc/user/project/merge_requests/reviews/index.md
index d3124b716da..cfe8803b665 100644
--- a/doc/user/project/merge_requests/reviews/index.md
+++ b/doc/user/project/merge_requests/reviews/index.md
@@ -15,7 +15,7 @@ from the user interface. When your work is reviewed, your team members can choos
to accept or reject it.
You can review merge requests from the GitLab interface. If you install the
-[GitLab Workflow VS Code extension](../../repository/vscode.md), you can also
+[GitLab Workflow VS Code extension](../../../../editor_extensions/visual_studio_code/index.md), you can also
review merge requests in Visual Studio Code.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
diff --git a/doc/user/project/repository/branches/default.md b/doc/user/project/repository/branches/default.md
index fdc822ca49f..42f58e9d171 100644
--- a/doc/user/project/repository/branches/default.md
+++ b/doc/user/project/repository/branches/default.md
@@ -68,8 +68,7 @@ GitLab [administrators](../../../permissions.md) of self-managed instances can
customize the initial branch for projects hosted on that instance. Individual
groups and subgroups can override this instance-wide setting for their projects.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Repository**.
1. Expand **Default branch**.
1. For **Initial default branch name**, select a new default branch.
@@ -128,8 +127,7 @@ you must either:
Administrators of self-managed instances can customize the initial default branch protection for projects hosted on that instance. Individual
groups and subgroups can override this instance-wide setting for their projects.
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Repository**.
1. Expand **Default branch**.
1. Select [**Initial default branch protection**](#protect-initial-default-branches).
@@ -146,8 +144,7 @@ can be overridden on a per-group basis by the group's owner. In
[GitLab Premium or Ultimate](https://about.gitlab.com/pricing/), GitLab administrators can
disable this privilege for group owners, enforcing the instance-level protection rule:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Repository**.
1. Expand the **Default branch** section.
1. Clear the **Allow owners to manage default branch protection per group** checkbox.
diff --git a/doc/user/project/repository/code_suggestions/index.md b/doc/user/project/repository/code_suggestions/index.md
index cf2cf510b8e..e1edd49c3d0 100644
--- a/doc/user/project/repository/code_suggestions/index.md
+++ b/doc/user/project/repository/code_suggestions/index.md
@@ -46,7 +46,7 @@ Prerequisites:
- If you are a **SaaS** user, you must enable Code Suggestions for:
- [The top-level group](../../../group/manage.md#enable-code-suggestions) (you must have the Owner role for that group).
- [Your own account](../../../profile/preferences.md#enable-code-suggestions).
- - If you are a **self-managed** user, you must enable Code Suggestions [for your instance](self_managed.md#enable-code-suggestions-on-self-managed-gitlab). How you enable Code Suggestions differs depending on your version of GitLab.
+- If you are a **self-managed** user, you must enable Code Suggestions [for your instance](self_managed.md#enable-code-suggestions-on-self-managed-gitlab). How you enable Code Suggestions differs depending on your version of GitLab.
To use Code Suggestions:
diff --git a/doc/user/project/repository/code_suggestions/self_managed.md b/doc/user/project/repository/code_suggestions/self_managed.md
index 80a89f41b11..0db9644c3a5 100644
--- a/doc/user/project/repository/code_suggestions/self_managed.md
+++ b/doc/user/project/repository/code_suggestions/self_managed.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: index, reference
---
-# Code Suggestions on self-managed GitLab **(PREMIUM SELF BETA)**
+# Code Suggestions on self-managed GitLab **(SELF BETA)**
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/10653) in GitLab 16.1 as [Beta](../../../../policy/experiment-beta-support.md#beta) on self-managed GitLab.
> - [Introduced support for Google Vertex AI Codey APIs](https://gitlab.com/groups/gitlab-org/-/epics/10562) in GitLab 16.1.
@@ -15,17 +15,18 @@ type: index, reference
Write code more efficiently by using generative AI to suggest code while you're developing.
GitLab Duo Code Suggestions are available on GitLab Enterprise Edition.
-Cloud licensing is required for Premium and Ultimate subscription tiers.
Code Suggestions are not available for GitLab Community Edition.
-WARNING:
-In GitLab 16.3 and later, only Premium and Ultimate customers can participate in the free trial of Code Suggestions on self-managed GitLab.
+> In GitLab 16.3 and later, to participate in the free trial of Code Suggestions on self-managed GitLab, you must:
+>
+> - Be a Premium or Ultimate customer.
+> - Have activated cloud licensing.
Usage of Code Suggestions is governed by the [GitLab Testing Agreement](https://about.gitlab.com/handbook/legal/testing-agreement/).
Learn about [data usage when using Code Suggestions](index.md#code-suggestions-data-usage).
-## Enable Code Suggestions on self-managed GitLab **(FREE SELF)**
+## Enable Code Suggestions on self-managed GitLab
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/10653) in GitLab 16.1 as [Beta](../../../../policy/experiment-beta-support.md#beta).
@@ -36,7 +37,7 @@ When you enable Code Suggestions for your self-managed instance, you:
How you enable Code Suggestions differs depending on your version of GitLab.
-### GitLab 16.3 and later
+### GitLab 16.3 and later **(PREMIUM)**
Prerequisites:
@@ -46,8 +47,7 @@ Prerequisites:
To enable Code Suggestions for your self-managed GitLab instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **Code Suggestions** and select **Turn on Code Suggestions for this instance**.
In GitLab 16.3, you do not need to enter anything into the **Personal access token** field.
@@ -95,8 +95,7 @@ To enable Code Suggestions for your GitLab SaaS account:
To enable Code Suggestions for your self-managed GitLab instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. On the left sidebar, select **Settings > General**.
1. Expand **Code Suggestions** and:
- Select **Turn on Code Suggestions for this instance**.
@@ -130,7 +129,7 @@ the server is configured to allow outbound connections, including the
In GitLab 16.3 and later, GitLab is enforcing the cloud licensing requirement for Code Suggestions:
-- The Premium and Ultimate subscription tiers support cloud Licensing.
+- The Premium and Ultimate subscription tiers support cloud licensing.
- GitLab Free does not have cloud licensing support.
If you have a GitLab Free subscription and upgrade to GitLab 16.3 or later,
diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md
index 58d5216a3d6..870cfbc9148 100644
--- a/doc/user/project/repository/index.md
+++ b/doc/user/project/repository/index.md
@@ -96,7 +96,7 @@ prompted to open Xcode.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/220957) in GitLab 13.10.
All projects can be cloned into Visual Studio Code from the GitLab user interface, but you
-can also install the [GitLab Workflow VS Code extension](vscode.md) to clone from
+can also install the [GitLab Workflow VS Code extension](../../../editor_extensions/visual_studio_code/index.md) to clone from
Visual Studio Code:
- From the GitLab interface:
@@ -106,7 +106,7 @@ Visual Studio Code:
1. Select a folder to clone the project into.
After Visual Studio Code clones your project, it opens the folder.
-- From Visual Studio Code, with the [extension](vscode.md) installed, use the
+- From Visual Studio Code, with the [extension](../../../editor_extensions/visual_studio_code/index.md) installed, use the
extension's [`Git: Clone` command](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#clone-gitlab-projects).
### Clone and open in IntelliJ IDEA
@@ -253,7 +253,7 @@ updated, at most, every 15 minutes. The file size includes repository files, art
The size can differ slightly from one instance to another due to compression, housekeeping, and other factors.
-Administrators can set a [repository size limit](../../admin_area/settings/account_and_limit_settings.md).
+Administrators can set a [repository size limit](../../../administration/settings/account_and_limit_settings.md).
[GitLab sets the size limits for GitLab.com](../../gitlab_com/index.md#account-and-limit-settings).
## Repository contributor statistics
@@ -298,7 +298,7 @@ because they can't follow redirects:
## Related topics
-- [GitLab Workflow VS Code extension](vscode.md)
+- [GitLab Workflow VS Code extension](../../../editor_extensions/visual_studio_code/index.md)
- [Lock files and prevent change conflicts](../file_lock.md)
- [Repository API](../../../api/repositories.md)
- [Find files](file_finder.md)
diff --git a/doc/user/project/repository/push_rules.md b/doc/user/project/repository/push_rules.md
index ab9039f6206..40110c3525d 100644
--- a/doc/user/project/repository/push_rules.md
+++ b/doc/user/project/repository/push_rules.md
@@ -39,8 +39,7 @@ Prerequisites:
To create global push rules:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Push Rules**.
1. Expand **Push rules**.
1. Set the rule you want.
diff --git a/doc/user/project/repository/vscode.md b/doc/user/project/repository/vscode.md
deleted file mode 100644
index 476cfc55298..00000000000
--- a/doc/user/project/repository/vscode.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../../../editor_extensions/visual_studio_code/index.md'
-remove_date: '2023-10-31'
----
-
-This document was moved to [another location](../../../editor_extensions/visual_studio_code/index.md).
-
-<!-- This redirect file can be deleted after <2023-10-31>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/project/repository/web_editor.md b/doc/user/project/repository/web_editor.md
index 51c4a8eb7b7..daee005fe0b 100644
--- a/doc/user/project/repository/web_editor.md
+++ b/doc/user/project/repository/web_editor.md
@@ -11,8 +11,6 @@ To make changes to multiple files, see [Web IDE](../web_ide/index.md).
Your [primary email address](../../profile/index.md#change-the-email-displayed-on-your-commits)
is used by default for any change you commit with the Web Editor.
-When you create or edit a file in the Web Editor, you can use the same
-[keyboard shortcuts](../../shortcuts.md#web-ide) for the Web IDE.
## Create a file
diff --git a/doc/user/project/service_desk.md b/doc/user/project/service_desk.md
deleted file mode 100644
index cd09f84641e..00000000000
--- a/doc/user/project/service_desk.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'service_desk/index.md'
-remove_date: '2023-10-24'
----
-
-This document was moved to [another location](service_desk/index.md).
-
-<!-- This redirect file can be deleted after <2023-10-24>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md
index cd780928d93..c71b640a351 100644
--- a/doc/user/project/settings/import_export.md
+++ b/doc/user/project/settings/import_export.md
@@ -86,8 +86,7 @@ Before you can migrate projects on a self-managed GitLab instance using file exp
To enable file exports as an import source for the destination instance:
-1. On the left sidebar, select **Search or go to**.
-1. Select **Admin Area**.
+1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**.
1. Expand **Visibility and access controls**.
1. Scroll to **Import sources**.
diff --git a/doc/user/public_access.md b/doc/user/public_access.md
index 5f2c70cccba..f2629cdc824 100644
--- a/doc/user/public_access.md
+++ b/doc/user/public_access.md
@@ -35,7 +35,7 @@ For internal projects, **any authenticated user**, including users with the Gues
Only internal members can view internal content.
-[External users](admin_area/external_users.md) cannot clone the project.
+[External users](../administration/external_users.md) cannot clone the project.
Internal groups can have internal or private subgroups.
diff --git a/doc/user/snippets.md b/doc/user/snippets.md
index fe782227701..fd4e044d782 100644
--- a/doc/user/snippets.md
+++ b/doc/user/snippets.md
@@ -15,7 +15,7 @@ You can [comment on](#comment-on-snippets), [clone](#clone-snippets), and
and you can maintain your snippets with the [snippets API](../api/snippets.md).
You can create and manage your snippets through the GitLab user interface, or by
-using the [GitLab Workflow VS Code extension](project/repository/vscode.md).
+using the [GitLab Workflow VS Code extension](../editor_extensions/visual_studio_code/index.md).
![Example of a snippet](img/snippet_sample_v16_6.png)
@@ -43,7 +43,7 @@ You can create snippets in multiple ways, depending on whether you want to creat
**New snippet**.
- From a project: On the left sidebar, select **Create new** (**{plus}**). Below **In GitLab**, select **New snippet**.
- From any other page: On the left sidebar, select **Create new** (**{plus}**) and then **New snippet**.
- - If you installed the [GitLab Workflow VS Code extension](project/repository/vscode.md),
+ - If you installed the [GitLab Workflow VS Code extension](../editor_extensions/visual_studio_code/index.md),
use the [`Gitlab: Create snippet` command](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#create-snippet).
- **To create a project snippet**: Go to your project's page. Select
**Create new** (**{plus}**). Below **In this project**, select **New snippet**.
diff --git a/lib/gitlab/ci/templates/Diffblue-Cover.gitlab-ci.yml b/lib/gitlab/ci/templates/Diffblue-Cover.gitlab-ci.yml
new file mode 100644
index 00000000000..c8b3aa1d705
--- /dev/null
+++ b/lib/gitlab/ci/templates/Diffblue-Cover.gitlab-ci.yml
@@ -0,0 +1,88 @@
+# This template is provided and maintained by Diffblue.
+# You can copy and paste this template into a new `.gitlab-ci.yml` file.
+# This template is designed to be used with the Cover Pipeline for GitLab integration from Diffblue.
+# It will download the latest version of Diffblue Cover, build the associated project, and
+# automatically write Java unit tests for the project.
+# Note that additional config is required:
+# https://docs.diffblue.com/features/cover-pipeline/cover-pipeline-for-gitlab
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Diffblue-Cover.gitlab-ci.yml
+
+variables:
+ # Configure the following via the Diffblue Cover integration config for your project, or by
+ # using CI/CD masked Variables.
+ # For details, see https://docs.diffblue.com/features/cover-pipeline/cover-pipeline-for-gitlab
+
+ # Diffblue Cover license key: DIFFBLUE_LICENSE_KEY
+ # Refer to your welcome email or you can obtain a free trial key from
+ # https://www.diffblue.com/try-cover/gitlab
+
+ # GitLab access token: DIFFBLUE_ACCESS_TOKEN, DIFFBLUE_ACCESS_TOKEN_NAME
+ # The access token should have a role of Developer or better and should have
+ # api and write_repository permissions.
+
+ # Diffblue Cover requires a minimum of 4GB of memory.
+ JVM_ARGS: -Xmx4g
+
+stages:
+ - build
+
+diffblue-cover:
+ stage: build
+
+ # Select the Cover CLI docker image to use with your CI tool.
+ # Tag variations are produced for each supported JDK version.
+ # Go to https://hub.docker.com/r/diffblue/cover-cli for details.
+ # Note: To use the latest version of Diffblue Cover, use one of the latest-jdk<nn> tags.
+ # To use a specific release version, use one of the yyyy.mm.dd-jdk<nn> tags.
+ image: diffblue/cover-cli:latest-jdk17
+
+ # Diffblue Cover currently only supports running on merge_request_events.
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+
+ # Diffblue Cover log files are saved to a .diffblue/ directory in the pipeline artifacts,
+ # and are available for download once the pipeline completes.
+ artifacts:
+ paths:
+ - "**/.diffblue/"
+
+ script:
+
+ # Diffblue Cover requires the project to be built before creating any tests.
+ # Either specify the build command here (one of the following), or provide
+ # prebuilt artifacts via a job dependency.
+
+ # Maven project example (comment out the Gradle version if used):
+ - mvn test-compile --batch-mode --no-transfer-progress
+
+ # Gradle project example (comment out the Maven version if used):
+ # - gradle testClasses
+
+ # Diffblue Cover commands and options to run.
+ # dcover – the core Diffblue Cover command
+ # ci – enable the GitLab CI/CD integration via environment variables
+ # activate - activate the license key
+ # validate - remove non-compiling and failing tests
+ # create - create new tests for your project
+ # --maven – use the maven build tool
+ # For detailed information on Cover CLI commands and options, see
+ # https://docs.diffblue.com/features/cover-cli/commands-and-arguments
+ - dcover
+ ci
+ activate
+ validate --maven
+ create --maven
+
+ # Diffblue Cover will also respond to specific project labels:
+ # Diffblue Cover: Baseline
+ # Used to mark a merge request as requiring a full suite of tests to be written.
+ # This overrides the default behaviour where Cover will only write tests related
+ # to the code changes already in the merge request. This is useful when running Diffblue
+ # Cover for the first time on a project and when new product enhancements are released.
+ # Diffblue Cover: Skip
+ # Used to mark a merge request as requiring no tests to be written.
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index b2f358fa500..c9bb7063c54 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -9020,6 +9020,12 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Direct transfer"
+msgstr ""
+
+msgid "BulkImport|Direct transfer history"
+msgstr ""
+
msgid "BulkImport|Direct transfer maximum download file size (MiB)"
msgstr ""
@@ -9029,9 +9035,6 @@ msgstr ""
msgid "BulkImport|Following data will not be migrated: %{bullets} Contact system administrator of %{host} to upgrade GitLab if you need this data in your migration"
msgstr ""
-msgid "BulkImport|GitLab Migration history"
-msgstr ""
-
msgid "BulkImport|Group import disabled on source or destination instance. Ask an administrator to enable it on both instances and try again."
msgstr ""
@@ -9050,7 +9053,7 @@ msgstr ""
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
-msgid "BulkImport|Import groups from GitLab"
+msgid "BulkImport|Import groups by direct transfer"
msgstr ""
msgid "BulkImport|Import is finished. Pick another name for re-import"
@@ -9071,6 +9074,9 @@ msgstr ""
msgid "BulkImport|Invalid source URL. Enter only the base URL of the source GitLab instance."
msgstr ""
+msgid "BulkImport|Items that failed to be imported for %{id}"
+msgstr ""
+
msgid "BulkImport|Last imported to %{link}"
msgstr ""
@@ -9125,7 +9131,7 @@ msgstr ""
msgid "BulkImport|Source group"
msgstr ""
-msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgid "BulkImport|Template / File-based import / Direct transfer"
msgstr ""
msgid "BulkImport|Unsupported GitLab version. Minimum supported version is '%{version}'."
@@ -23492,30 +23498,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "GroupsDropdown|Frequently visited"
-msgstr ""
-
-msgid "GroupsDropdown|Groups you visit often will appear here"
-msgstr ""
-
-msgid "GroupsDropdown|Loading groups"
-msgstr ""
-
-msgid "GroupsDropdown|Search your groups"
-msgstr ""
-
-msgid "GroupsDropdown|Something went wrong on our end."
-msgstr ""
-
-msgid "GroupsDropdown|Sorry, no groups matched your search"
-msgstr ""
-
-msgid "GroupsDropdown|This feature requires browser localStorage support"
-msgstr ""
-
-msgid "GroupsDropdown|Toggle edit mode"
-msgstr ""
-
msgid "GroupsEmptyState|A group is a collection of several projects"
msgstr ""
@@ -24725,9 +24707,6 @@ msgstr ""
msgid "Import group from file"
msgstr ""
-msgid "Import groups"
-msgstr ""
-
msgid "Import history"
msgstr ""
@@ -24904,10 +24883,10 @@ msgstr ""
msgid "Import|An error occurred while fetching import details."
msgstr ""
-msgid "Import|GitHub import details"
+msgid "Import|Failures for %{id}"
msgstr ""
-msgid "Import|GitLab Migration details"
+msgid "Import|GitHub import details"
msgstr ""
msgid "Import|Maximum decompressed file size for archives from imports (MiB)"
@@ -38365,30 +38344,6 @@ msgstr ""
msgid "Projects with write access"
msgstr ""
-msgid "ProjectsDropdown|Frequently visited"
-msgstr ""
-
-msgid "ProjectsDropdown|Loading projects"
-msgstr ""
-
-msgid "ProjectsDropdown|Projects you visit often will appear here"
-msgstr ""
-
-msgid "ProjectsDropdown|Search your projects"
-msgstr ""
-
-msgid "ProjectsDropdown|Something went wrong on our end."
-msgstr ""
-
-msgid "ProjectsDropdown|Sorry, no projects matched your search"
-msgstr ""
-
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
-msgstr ""
-
-msgid "ProjectsDropdown|Toggle edit mode"
-msgstr ""
-
msgid "ProjectsNew|Allows you to immediately clone this project’s repository. Skip this if you plan to push up an existing repository."
msgstr ""
diff --git a/package.json b/package.json
index d4f37deea8a..c30d00e8b77 100644
--- a/package.json
+++ b/package.json
@@ -54,7 +54,7 @@
"@cubejs-client/core": "^0.34.24",
"@cubejs-client/vue": "^0.34.24",
"@floating-ui/dom": "^1.2.9",
- "@gitlab/application-sdk-browser": "^0.2.10",
+ "@gitlab/application-sdk-browser": "^0.2.11",
"@gitlab/at.js": "1.5.7",
"@gitlab/cluster-client": "^2.1.0",
"@gitlab/favicon-overlay": "2.0.0",
diff --git a/scripts/duo_chat/reporter.rb b/scripts/duo_chat/reporter.rb
index e72a393694f..0136c39ccb1 100755
--- a/scripts/duo_chat/reporter.rb
+++ b/scripts/duo_chat/reporter.rb
@@ -5,6 +5,9 @@ require 'gitlab'
require 'json'
class Reporter
+ GITLAB_COM_API_V4_ENDPOINT = "https://gitlab.com/api/v4"
+ QA_EVALUATION_PROJECT_ID = 52020045 # https://gitlab.com/gitlab-org/ai-powered/ai-framework/qa-evaluation
+ AGGREGATED_REPORT_ISSUE_IID = 1 # https://gitlab.com/gitlab-org/ai-powered/ai-framework/qa-evaluation/-/issues/1
IDENTIFIABLE_NOTE_TAG = 'gitlab-org/ai-powered/ai-framework:duo-chat-qa-evaluation'
GRADE_TO_EMOJI_MAPPING = {
@@ -14,55 +17,18 @@ class Reporter
}.freeze
def run
- merge_request_iid = ENV['CI_MERGE_REQUEST_IID']
- ci_project_id = ENV['CI_PROJECT_ID']
-
- puts "Saving #{artifact_path}"
- File.write(artifact_path, report_note)
-
- # Look for an existing note
- report_notes = com_gitlab_client
- .merge_request_notes(ci_project_id, merge_request_iid)
- .auto_paginate
- .select do |note|
- note.body.include? IDENTIFIABLE_NOTE_TAG
- end
-
- note = report_notes.max_by { |note| Time.parse(note.created_at) }
-
- if note && note.type != 'DiscussionNote'
- # The latest note has not led to a discussion. Update it.
- com_gitlab_client.edit_merge_request_note(ci_project_id, merge_request_iid, note.id, report_note)
-
- puts "Updated comment."
+ if pipeline_running_on_master_branch?
+ snippet_web_url = upload_data_as_snippet
+ report_issue_url = create_report_issue
+ update_aggregation_issue(report_issue_url, snippet_web_url)
else
- # This is the first note or the latest note has been discussed on the MR.
- # Don't update, create new note instead.
- com_gitlab_client.create_merge_request_note(ci_project_id, merge_request_iid, report_note)
-
- puts "Posted comment."
+ save_report_as_artifact
+ post_or_update_report_note
end
end
- private
-
- def report_filename
- ENV['QA_EVAL_REPORT_FILENAME']
- end
-
- def artifact_path
- File.join(ENV['CI_PROJECT_DIR'], report_filename)
- end
-
- def com_gitlab_client
- @com_gitlab_client ||= Gitlab.client(
- endpoint: "https://gitlab.com/api/v4",
- private_token: ENV['PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE']
- )
- end
-
- def report_note
- report = <<~MARKDOWN
+ def markdown_report
+ @report ||= <<~MARKDOWN
<!-- #{IDENTIFIABLE_NOTE_TAG} -->
## GitLab Duo Chat QA evaluation
@@ -89,7 +55,7 @@ class Reporter
- Note: if an evaluation request failed or its response was not parsable, it was ignored. For example, :x: :warning: would count as `INCORRECT`.
- - The number of evaluations in which LLMs disagreed: #{summary_numbers[:disagreed]} (#{summary_numbers[:disagreed_ratio]}%)
+ - The number of evaluations in which LLMs disagreed: #{summary_numbers[:disagreed]} (#{summary_numbers[:disagreed_ratio]}%)
### Evaluations
@@ -99,28 +65,136 @@ class Reporter
MARKDOWN
- if report.length > 1000000
- return <<~MARKDOWN
- <!-- #{IDENTIFIABLE_NOTE_TAG} -->
+ # Do this to avoid pinging users in notes/issues.
+ quote_usernames(@report)
+ end
+
+ private
- ## GitLab Duo Chat QA evaluation
+ def quote_usernames(text)
+ text.gsub(/(@\w+)/, '`\\1`')
+ end
- Report generated for "#{ENV['CI_JOB_NAME']}". This report is generated and refreshed automatically. Do not edit.
+ def pipeline_running_on_master_branch?
+ ENV['CI_COMMIT_BRANCH'] == ENV['CI_DEFAULT_BRANCH']
+ end
- **:warning: the evaluation report is too long (> `1000000`) and cannot be posted as a note.**
+ def utc_timestamp
+ @utc_timestamp ||= Time.now.utc
+ end
- Please check out the artifact for the CI job "#{ENV['CI_JOB_NAME']}":
+ def upload_data_as_snippet
+ filename = "#{utc_timestamp.to_i}.json"
+ title = utc_timestamp.to_s
+ snippet_content = ::JSON.pretty_generate({
+ commit: ENV["CI_COMMIT_SHA"],
+ pipeline_url: ENV["CI_PIPELINE_URL"],
+ data: report_data
+ })
+
+ puts "Creating a snippet #{filename}."
+ snippet = qa_evaluation_project_client.create_snippet(
+ QA_EVALUATION_PROJECT_ID,
+ {
+ title: title,
+ files: [{ file_path: filename, content: snippet_content }],
+ visibility: 'private'
+ }
+ )
- https://gitlab.com/gitlab-org/gitlab/-/jobs/#{ENV['CI_JOB_ID']}/artifacts/file/#{report_filename}
+ snippet.web_url
+ end
- MARKDOWN
+ def create_report_issue
+ puts "Creating a report issue."
+ issue_title = "Report #{utc_timestamp}"
+ new_issue = qa_evaluation_project_client.create_issue(
+ QA_EVALUATION_PROJECT_ID, issue_title, { description: markdown_report }
+ )
+
+ new_issue.web_url
+ end
+
+ def update_aggregation_issue(report_issue_url, snippet_web_url)
+ puts "Updating the aggregated report issue."
+
+ new_line = ["\n|"]
+ new_line << "#{utc_timestamp} |"
+ new_line << "#{summary_numbers[:total]} |"
+ new_line << "#{summary_numbers[:correct_ratio]}% |"
+ new_line << "#{summary_numbers[:incorrect_ratio]}% |"
+ new_line << "#{summary_numbers[:disagreed_ratio]}% |"
+ new_line << "#{report_issue_url} |"
+ new_line << "#{snippet_web_url} |"
+ new_line = new_line.join(' ')
+
+ aggregated_report_issue = qa_evaluation_project_client.issue(QA_EVALUATION_PROJECT_ID, AGGREGATED_REPORT_ISSUE_IID)
+ updated_description = aggregated_report_issue.description + new_line
+ qa_evaluation_project_client.edit_issue(
+ QA_EVALUATION_PROJECT_ID, AGGREGATED_REPORT_ISSUE_IID, { description: updated_description }
+ )
+ end
+
+ def save_report_as_artifact
+ artifact_path = File.join(base_dir, ENV['QA_EVAL_REPORT_FILENAME'])
+
+ puts "Saving #{artifact_path}"
+ File.write(artifact_path, markdown_report)
+ end
+
+ def post_or_update_report_note
+ note = existing_report_note
+ if note && note.type != 'DiscussionNote'
+ # The latest note has not led to a discussion. Update it.
+ gitlab_project_client.edit_merge_request_note(ci_project_id, merge_request_iid, note.id, markdown_report)
+
+ puts "Updated comment."
+ else
+ # This is the first note or the latest note has been discussed on the MR.
+ # Don't update, create new note instead.
+ gitlab_project_client.create_merge_request_note(ci_project_id, merge_request_iid, markdown_report)
+
+ puts "Posted comment."
end
+ end
+
+ def existing_report_note
+ # Look for an existing note using `IDENTIFIABLE_NOTE_TAG`
+ gitlab_project_client
+ .merge_request_notes(ci_project_id, merge_request_iid)
+ .auto_paginate
+ .select { |note| note.body.include? IDENTIFIABLE_NOTE_TAG }
+ .max_by { |note| Time.parse(note.created_at) }
+ end
+
+ def gitlab_project_client
+ @gitlab_project_client ||= Gitlab.client(
+ endpoint: GITLAB_COM_API_V4_ENDPOINT,
+ private_token: ENV['PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE']
+ )
+ end
+
+ def qa_evaluation_project_client
+ @qa_evaluation_project_client ||= Gitlab.client(
+ endpoint: GITLAB_COM_API_V4_ENDPOINT,
+ private_token: ENV['CHAT_QA_EVALUATION_PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE']
+ )
+ end
+
+ def base_dir
+ ENV['CI_PROJECT_DIR'] || "./"
+ end
+
+ def merge_request_iid
+ ENV['CI_MERGE_REQUEST_IID']
+ end
- report
+ def ci_project_id
+ ENV['CI_PROJECT_ID']
end
def report_data
- @report_data ||= Dir[File.join(ENV['CI_PROJECT_DIR'], "tmp/duo_chat/qa*.json")]
+ @report_data ||= Dir[File.join(base_dir, "tmp/duo_chat/qa*.json")]
.flat_map { |file| JSON.parse(File.read(file)) }
end
@@ -164,7 +238,9 @@ class Reporter
end
def summary_numbers
- @graded_evaluations ||= report_data.map { |data| data["evaluations"].map { |eval| parse_grade(eval) } }
+ @graded_evaluations ||= report_data
+ .map { |data| data["evaluations"].map { |eval| parse_grade(eval) } }
+ .reject { |grades| !(grades.include? :correct) && !(grades.include? :incorrect) }
total = @graded_evaluations.size
correct = @graded_evaluations.count { |grades| !(grades.include? :incorrect) }
@@ -226,4 +302,4 @@ class Reporter
end
end
-Reporter.new.run
+Reporter.new.run if $PROGRAM_NAME == __FILE__
diff --git a/spec/features/groups/import_export/migration_history_spec.rb b/spec/features/groups/import_export/migration_history_spec.rb
index 9fc9c7898d1..87b38221ad6 100644
--- a/spec/features/groups/import_export/migration_history_spec.rb
+++ b/spec/features/groups/import_export/migration_history_spec.rb
@@ -26,7 +26,7 @@ RSpec.describe 'Import/Export - GitLab migration history', :js, feature_category
wait_for_requests
- expect(page).to have_content 'GitLab Migration history'
+ expect(page).to have_content 'Direct transfer history'
expect(page.find('tbody')).to have_css('tr', count: 2)
end
end
diff --git a/spec/features/issues/service_desk_spec.rb b/spec/features/issues/service_desk_spec.rb
index 8662f0f98f5..3a2074b9b13 100644
--- a/spec/features/issues/service_desk_spec.rb
+++ b/spec/features/issues/service_desk_spec.rb
@@ -52,7 +52,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_des
aggregate_failures do
expect(page).to have_css('.empty-state')
expect(page).to have_text('Use Service Desk to connect with your users')
- expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk'))
+ expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk/index'))
expect(page).not_to have_link('Enable Service Desk')
expect(page).to have_content(project.service_desk_address)
end
@@ -71,7 +71,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_des
aggregate_failures do
expect(page).to have_css('.empty-state')
expect(page).to have_text('Use Service Desk to connect with your users')
- expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk'))
+ expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk/index'))
expect(page).not_to have_link('Enable Service Desk')
expect(page).not_to have_content(project.service_desk_address)
end
@@ -93,7 +93,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_des
it 'displays the small info box, documentation, a button to configure service desk, and the address' do
aggregate_failures do
- expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk'))
+ expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk/index'))
expect(page).not_to have_link('Enable Service Desk')
expect(page).to have_content(project.service_desk_address)
end
diff --git a/spec/finders/concerns/packages/finder_helper_spec.rb b/spec/finders/concerns/packages/finder_helper_spec.rb
index f81e940c7ed..4145e1e2a54 100644
--- a/spec/finders/concerns/packages/finder_helper_spec.rb
+++ b/spec/finders/concerns/packages/finder_helper_spec.rb
@@ -27,6 +27,115 @@ RSpec.describe ::Packages::FinderHelper, feature_category: :package_registry do
it { is_expected.to eq [package1] }
end
+ describe '#packages_for' do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be_with_reload(:group) { create(:group) }
+ let_it_be_with_reload(:subgroup) { create(:group, parent: group) }
+ let_it_be(:project) { create(:project, namespace: group) }
+ let_it_be(:project2) { create(:project, namespace: subgroup) }
+ let_it_be(:package1) { create(:package, project: project) }
+ let_it_be(:package2) { create(:package, project: project2) }
+ let_it_be(:package3) { create(:package, :error, project: project2) }
+
+ let(:finder_class) do
+ Class.new do
+ include ::Packages::FinderHelper
+
+ def initialize(user)
+ @current_user = user
+ end
+
+ def execute(group)
+ packages_for(@current_user, within_group: group)
+ end
+ end
+ end
+
+ let(:finder) { finder_class.new(user) }
+
+ subject { finder.execute(group) }
+
+ shared_examples 'returning both packages' do
+ it { is_expected.to contain_exactly(package1, package2) }
+ end
+
+ shared_examples 'returning no packages' do
+ it { is_expected.to be_empty }
+ end
+
+ shared_examples 'returning package2' do
+ it { is_expected.to contain_exactly(package2) }
+ end
+
+ context 'with an user' do
+ let_it_be(:user) { create(:user) }
+
+ where(:group_visibility, :subgroup_visibility, :shared_example_name) do
+ 'public' | 'public' | 'returning both packages'
+ # All packages are returned because of the parent group visibility set to `public`
+ # and all users will have `read_group` permission.
+ 'public' | 'private' | 'returning both packages'
+ # No packages are returned because of the parent group visibility set to `private`
+ # and non-members won't have `read_group` permission.
+ 'private' | 'private' | 'returning no packages'
+ end
+
+ with_them do
+ before do
+ subgroup.update!(visibility: subgroup_visibility)
+ group.update!(visibility: group_visibility)
+ end
+
+ it_behaves_like params[:shared_example_name]
+ end
+
+ context 'without a group' do
+ subject { finder.execute(nil) }
+
+ it_behaves_like 'returning no packages'
+ end
+
+ context 'with a subgroup' do
+ subject { finder.execute(subgroup) }
+
+ it_behaves_like 'returning package2'
+ end
+ end
+
+ context 'with a deploy token' do
+ let_it_be(:user) { create(:deploy_token, :group, read_package_registry: true) }
+ let_it_be(:group_deploy_token) { create(:group_deploy_token, deploy_token: user, group: group) }
+
+ where(:group_visibility, :subgroup_visibility, :shared_example_name) do
+ 'public' | 'public' | 'returning both packages'
+ 'public' | 'private' | 'returning both packages'
+ 'private' | 'private' | 'returning both packages'
+ end
+
+ with_them do
+ before do
+ subgroup.update!(visibility: subgroup_visibility)
+ group.update!(visibility: group_visibility)
+ end
+
+ it_behaves_like params[:shared_example_name]
+ end
+
+ context 'without a group' do
+ subject { finder.execute(nil) }
+
+ it_behaves_like 'returning no packages'
+ end
+
+ context 'with a subgroup' do
+ subject { finder.execute(subgroup) }
+
+ it_behaves_like 'returning both packages'
+ end
+ end
+ end
+
describe '#packages_visible_to_user' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/finders/packages/maven/package_finder_spec.rb b/spec/finders/packages/maven/package_finder_spec.rb
index f769471fcc7..e5ece42baaa 100644
--- a/spec/finders/packages/maven/package_finder_spec.rb
+++ b/spec/finders/packages/maven/package_finder_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Packages::Maven::PackageFinder do
+RSpec.describe ::Packages::Maven::PackageFinder, feature_category: :package_registry do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, namespace: group) }
@@ -13,10 +13,6 @@ RSpec.describe ::Packages::Maven::PackageFinder do
let(:param_order_by_package_file) { false }
let(:finder) { described_class.new(user, project_or_group, path: param_path, order_by_package_file: param_order_by_package_file) }
- before do
- group.add_developer(user)
- end
-
describe '#execute' do
subject { finder.execute }
@@ -58,6 +54,24 @@ RSpec.describe ::Packages::Maven::PackageFinder do
let(:project_or_group) { group }
it_behaves_like 'handling valid and invalid paths'
+
+ context 'when the FF maven_remove_permissions_check_from_finder disabled' do
+ before do
+ stub_feature_flags(maven_remove_permissions_check_from_finder: false)
+ end
+
+ it 'returns an empty array' do
+ is_expected.to be_empty
+ end
+
+ context 'when an user assigned the developer role' do
+ before do
+ group.add_developer(user)
+ end
+
+ it_behaves_like 'handling valid and invalid paths'
+ end
+ end
end
context 'across all projects' do
diff --git a/spec/frontend/ci/job_details/store/actions_spec.js b/spec/frontend/ci/job_details/store/actions_spec.js
index 1a24bec092f..3e3e872f698 100644
--- a/spec/frontend/ci/job_details/store/actions_spec.js
+++ b/spec/frontend/ci/job_details/store/actions_spec.js
@@ -15,7 +15,6 @@ import {
fetchJobLog,
startPollingJobLog,
stopPollingJobLog,
- receiveJobLogSuccess,
receiveJobLogError,
toggleCollapsibleLine,
requestJobsForStage,
@@ -27,11 +26,15 @@ import {
toggleSidebar,
receiveTestSummarySuccess,
} from '~/ci/job_details/store/actions';
+import { isScrolledToBottom } from '~/lib/utils/scroll_utils';
+
import * as types from '~/ci/job_details/store/mutation_types';
import state from '~/ci/job_details/store/state';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
+jest.mock('~/lib/utils/scroll_utils');
+
describe('Job State actions', () => {
let mockedState;
@@ -212,42 +215,39 @@ describe('Job State actions', () => {
});
describe('success', () => {
- it('dispatches requestJobLog, receiveJobLogSuccess and stopPollingJobLog when job is complete', () => {
- mock.onGet(`${TEST_HOST}/endpoint/trace.json`).replyOnce(HTTP_STATUS_OK, {
- html: 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- :',
- complete: true,
+ let jobLogPayload;
+
+ beforeEach(() => {
+ isScrolledToBottom.mockReturnValue(false);
+ });
+
+ describe('when job is complete', () => {
+ beforeEach(() => {
+ jobLogPayload = {
+ html: 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- :',
+ complete: true,
+ };
+
+ mock.onGet(`${TEST_HOST}/endpoint/trace.json`).replyOnce(HTTP_STATUS_OK, jobLogPayload);
});
- return testAction(
- fetchJobLog,
- null,
- mockedState,
- [],
- [
- {
- type: 'toggleScrollisInBottom',
- payload: true,
- },
- {
- payload: {
- html: 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- :',
- complete: true,
+ it('commits RECEIVE_JOB_LOG_SUCCESS, dispatches stopPollingJobLog and requestTestSummary', () => {
+ return testAction(
+ fetchJobLog,
+ null,
+ mockedState,
+ [
+ {
+ type: types.RECEIVE_JOB_LOG_SUCCESS,
+ payload: jobLogPayload,
},
- type: 'receiveJobLogSuccess',
- },
- {
- type: 'stopPollingJobLog',
- },
- {
- type: 'requestTestSummary',
- },
- ],
- );
+ ],
+ [{ type: 'stopPollingJobLog' }, { type: 'requestTestSummary' }],
+ );
+ });
});
describe('when job is incomplete', () => {
- let jobLogPayload;
-
beforeEach(() => {
jobLogPayload = {
html: 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- :',
@@ -262,12 +262,13 @@ describe('Job State actions', () => {
fetchJobLog,
null,
mockedState,
- [],
[
- { type: 'toggleScrollisInBottom', payload: true },
- { type: 'receiveJobLogSuccess', payload: jobLogPayload },
- { type: 'startPollingJobLog' },
+ {
+ type: types.RECEIVE_JOB_LOG_SUCCESS,
+ payload: jobLogPayload,
+ },
],
+ [{ type: 'startPollingJobLog' }],
);
});
@@ -278,10 +279,44 @@ describe('Job State actions', () => {
fetchJobLog,
null,
mockedState,
+ [
+ {
+ type: types.RECEIVE_JOB_LOG_SUCCESS,
+ payload: jobLogPayload,
+ },
+ ],
[],
+ );
+ });
+ });
+
+ describe('when user scrolled to the bottom', () => {
+ beforeEach(() => {
+ isScrolledToBottom.mockReturnValue(true);
+
+ jobLogPayload = {
+ html: 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- :',
+ complete: true,
+ };
+
+ mock.onGet(`${TEST_HOST}/endpoint/trace.json`).replyOnce(HTTP_STATUS_OK, jobLogPayload);
+ });
+
+ it('should auto scroll to bottom by dispatching scrollBottom', () => {
+ return testAction(
+ fetchJobLog,
+ null,
+ mockedState,
[
- { type: 'toggleScrollisInBottom', payload: true },
- { type: 'receiveJobLogSuccess', payload: jobLogPayload },
+ {
+ type: types.RECEIVE_JOB_LOG_SUCCESS,
+ payload: jobLogPayload,
+ },
+ ],
+ [
+ { type: 'stopPollingJobLog' },
+ { type: 'requestTestSummary' },
+ { type: 'scrollBottom' },
],
);
});
@@ -393,18 +428,6 @@ describe('Job State actions', () => {
});
});
- describe('receiveJobLogSuccess', () => {
- it('should commit RECEIVE_JOB_LOG_SUCCESS mutation', () => {
- return testAction(
- receiveJobLogSuccess,
- 'hello world',
- mockedState,
- [{ type: types.RECEIVE_JOB_LOG_SUCCESS, payload: 'hello world' }],
- [],
- );
- });
- });
-
describe('receiveJobLogError', () => {
it('should commit stop polling job log', () => {
return testAction(receiveJobLogError, null, mockedState, [], [{ type: 'stopPollingJobLog' }]);
diff --git a/spec/frontend/frequent_items/components/app_spec.js b/spec/frontend/frequent_items/components/app_spec.js
deleted file mode 100644
index 122155a5d3f..00000000000
--- a/spec/frontend/frequent_items/components/app_spec.js
+++ /dev/null
@@ -1,286 +0,0 @@
-import { GlButton, GlIcon } from '@gitlab/ui';
-import MockAdapter from 'axios-mock-adapter';
-import Vue, { nextTick } from 'vue';
-// eslint-disable-next-line no-restricted-imports
-import Vuex from 'vuex';
-import { useLocalStorageSpy } from 'helpers/local_storage_helper';
-import { mountExtended } from 'helpers/vue_test_utils_helper';
-import waitForPromises from 'helpers/wait_for_promises';
-import App from '~/frequent_items/components/app.vue';
-import FrequentItemsList from '~/frequent_items/components/frequent_items_list.vue';
-import { FREQUENT_ITEMS, FIFTEEN_MINUTES_IN_MS } from '~/frequent_items/constants';
-import eventHub from '~/frequent_items/event_hub';
-import { createStore } from '~/frequent_items/store';
-import { getTopFrequentItems } from '~/frequent_items/utils';
-import axios from '~/lib/utils/axios_utils';
-import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
-import { currentSession, mockFrequentProjects, mockSearchedProjects } from '../mock_data';
-
-Vue.use(Vuex);
-
-useLocalStorageSpy();
-
-const TEST_NAMESPACE = 'projects';
-const TEST_VUEX_MODULE = 'frequentProjects';
-const TEST_PROJECT = currentSession[TEST_NAMESPACE].project;
-const TEST_STORAGE_KEY = currentSession[TEST_NAMESPACE].storageKey;
-const TEST_SEARCH_CLASS = 'test-search-class';
-
-describe('Frequent Items App Component', () => {
- let wrapper;
- let mock;
- let store;
-
- const createComponent = (props = {}) => {
- const session = currentSession[TEST_NAMESPACE];
- gon.api_version = session.apiVersion;
-
- wrapper = mountExtended(App, {
- store,
- propsData: {
- namespace: TEST_NAMESPACE,
- currentUserName: session.username,
- currentItem: session.project,
- ...props,
- },
- provide: {
- vuexModule: TEST_VUEX_MODULE,
- },
- });
- };
-
- const triggerDropdownOpen = () => eventHub.$emit(`${TEST_NAMESPACE}-dropdownOpen`);
- const getStoredProjects = () => JSON.parse(localStorage.getItem(TEST_STORAGE_KEY));
- const findSearchInput = () => wrapper.findByTestId('frequent-items-search-input');
- const findLoading = () => wrapper.findByTestId('loading');
- const findSectionHeader = () => wrapper.findByTestId('header');
- const findFrequentItemsList = () => wrapper.findComponent(FrequentItemsList);
- const findFrequentItems = () => findFrequentItemsList().findAll('li');
- const setSearch = (search) => {
- const searchInput = wrapper.find('input');
-
- searchInput.setValue(search);
- };
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- store = createStore();
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- describe('default', () => {
- beforeEach(() => {
- jest.spyOn(store, 'dispatch');
-
- createComponent();
- });
-
- it('should fetch frequent items', () => {
- triggerDropdownOpen();
-
- expect(store.dispatch).toHaveBeenCalledWith(`${TEST_VUEX_MODULE}/fetchFrequentItems`);
- });
-
- it('should not fetch frequent items if detroyed', () => {
- wrapper.destroy();
- triggerDropdownOpen();
-
- expect(store.dispatch).not.toHaveBeenCalledWith(`${TEST_VUEX_MODULE}/fetchFrequentItems`);
- });
-
- it('should render search input', () => {
- expect(findSearchInput().classes()).toEqual(['search-input-container']);
- });
-
- it('should render loading animation', async () => {
- triggerDropdownOpen();
- store.state[TEST_VUEX_MODULE].isLoadingItems = true;
-
- await nextTick();
-
- const loading = findLoading();
-
- expect(loading.exists()).toBe(true);
- expect(loading.find('[aria-label="Loading projects"]').exists()).toBe(true);
- expect(findSectionHeader().exists()).toBe(false);
- });
-
- it('should render frequent projects list header', () => {
- const sectionHeader = findSectionHeader();
-
- expect(sectionHeader.exists()).toBe(true);
- expect(sectionHeader.text()).toBe('Frequently visited');
- });
-
- it('should render searched projects list', async () => {
- mock
- .onGet(/\/api\/v4\/projects.json(.*)$/)
- .replyOnce(HTTP_STATUS_OK, mockSearchedProjects.data);
-
- setSearch('gitlab');
- await nextTick();
-
- expect(findLoading().exists()).toBe(true);
-
- await waitForPromises();
-
- expect(findFrequentItems().length).toBe(mockSearchedProjects.data.length);
- expect(findFrequentItemsList().props()).toEqual(
- expect.objectContaining({
- items: mockSearchedProjects.data.map(
- ({
- avatar_url: avatarUrl,
- web_url: webUrl,
- name_with_namespace: namespace,
- ...item
- }) => ({
- ...item,
- avatarUrl,
- webUrl,
- namespace,
- }),
- ),
- namespace: TEST_NAMESPACE,
- hasSearchQuery: true,
- isFetchFailed: false,
- matcher: 'gitlab',
- }),
- );
- });
-
- describe('with frequent items list', () => {
- const expectedResult = getTopFrequentItems(mockFrequentProjects);
-
- beforeEach(async () => {
- localStorage.setItem(TEST_STORAGE_KEY, JSON.stringify(mockFrequentProjects));
- triggerDropdownOpen();
- await nextTick();
- });
-
- it('should render edit button within header', () => {
- const itemEditButton = findSectionHeader().findComponent(GlButton);
-
- expect(itemEditButton.exists()).toBe(true);
- expect(itemEditButton.attributes('title')).toBe('Toggle edit mode');
- expect(itemEditButton.findComponent(GlIcon).props('name')).toBe('pencil');
- });
-
- it('should render frequent projects list', () => {
- expect(findFrequentItems().length).toBe(expectedResult.length);
- expect(findFrequentItemsList().props()).toEqual({
- items: expectedResult,
- namespace: TEST_NAMESPACE,
- hasSearchQuery: false,
- isFetchFailed: false,
- isItemRemovalFailed: false,
- matcher: '',
- });
- });
-
- it('dispatches action `toggleItemsListEditablity` when edit button is clicked', async () => {
- const itemEditButton = findSectionHeader().findComponent(GlButton);
- itemEditButton.vm.$emit('click');
-
- await nextTick();
-
- expect(store.dispatch).toHaveBeenCalledWith(
- `${TEST_VUEX_MODULE}/toggleItemsListEditablity`,
- );
- });
- });
- });
-
- describe('with searchClass', () => {
- beforeEach(() => {
- createComponent({ searchClass: TEST_SEARCH_CLASS });
- });
-
- it('should render search input with searchClass', () => {
- expect(findSearchInput().classes()).toEqual(['search-input-container', TEST_SEARCH_CLASS]);
- });
- });
-
- describe('logging', () => {
- it('when created, it should create a project storage entry and adds a project', () => {
- createComponent();
-
- expect(getStoredProjects()).toEqual([
- expect.objectContaining({
- frequency: 1,
- lastAccessedOn: Date.now(),
- }),
- ]);
- });
-
- describe('when created multiple times', () => {
- beforeEach(() => {
- createComponent();
- wrapper.destroy();
- createComponent();
- wrapper.destroy();
- });
-
- it('should only log once', () => {
- expect(getStoredProjects()).toEqual([
- expect.objectContaining({
- lastAccessedOn: Date.now(),
- frequency: 1,
- }),
- ]);
- });
-
- it('should increase frequency, when created 15 minutes later', () => {
- const fifteenMinutesLater = Date.now() + FIFTEEN_MINUTES_IN_MS + 1;
-
- jest.spyOn(Date, 'now').mockReturnValue(fifteenMinutesLater);
- createComponent({ currentItem: { ...TEST_PROJECT, lastAccessedOn: fifteenMinutesLater } });
-
- expect(getStoredProjects()).toEqual([
- expect.objectContaining({
- lastAccessedOn: fifteenMinutesLater,
- frequency: 2,
- }),
- ]);
- });
- });
-
- it('should always update project metadata', () => {
- const oldProject = {
- ...TEST_PROJECT,
- };
-
- const newProject = {
- ...oldProject,
- name: 'New Name',
- avatarUrl: 'new/avatar.png',
- namespace: 'New / Namespace',
- webUrl: 'http://localhost/new/web/url',
- };
-
- createComponent({ currentItem: oldProject });
- wrapper.destroy();
- expect(getStoredProjects()).toEqual([expect.objectContaining(oldProject)]);
-
- createComponent({ currentItem: newProject });
- wrapper.destroy();
-
- expect(getStoredProjects()).toEqual([expect.objectContaining(newProject)]);
- });
-
- it('should not add more than 20 projects in store', () => {
- for (let id = 0; id < FREQUENT_ITEMS.MAX_COUNT + 10; id += 1) {
- const project = {
- ...TEST_PROJECT,
- id,
- };
- createComponent({ currentItem: project });
- wrapper.destroy();
- }
-
- expect(getStoredProjects().length).toBe(FREQUENT_ITEMS.MAX_COUNT);
- });
- });
-});
diff --git a/spec/frontend/frequent_items/components/frequent_items_list_item_spec.js b/spec/frontend/frequent_items/components/frequent_items_list_item_spec.js
deleted file mode 100644
index 55d20ad603c..00000000000
--- a/spec/frontend/frequent_items/components/frequent_items_list_item_spec.js
+++ /dev/null
@@ -1,161 +0,0 @@
-import { GlIcon } from '@gitlab/ui';
-import Vue, { nextTick } from 'vue';
-// eslint-disable-next-line no-restricted-imports
-import Vuex from 'vuex';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import { trimText } from 'helpers/text_helper';
-import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
-import frequentItemsListItemComponent from '~/frequent_items/components/frequent_items_list_item.vue';
-import { createStore } from '~/frequent_items/store';
-import ProjectAvatar from '~/vue_shared/components/project_avatar.vue';
-import { mockProject } from '../mock_data';
-
-Vue.use(Vuex);
-
-describe('FrequentItemsListItemComponent', () => {
- const TEST_VUEX_MODULE = 'frequentProjects';
- let wrapper;
- let trackingSpy;
- let store;
-
- const findTitle = () => wrapper.findByTestId('frequent-items-item-title');
- const findAvatar = () => wrapper.findComponent(ProjectAvatar);
- const findAllTitles = () => wrapper.findAllByTestId('frequent-items-item-title');
- const findNamespace = () => wrapper.findByTestId('frequent-items-item-namespace');
- const findAllFrequentItems = () => wrapper.findAllByTestId('frequent-item-link');
- const findAllNamespace = () => wrapper.findAllByTestId('frequent-items-item-namespace');
- const findAllAvatars = () => wrapper.findAllComponents(ProjectAvatar);
- const findAllMetadataContainers = () =>
- wrapper.findAllByTestId('frequent-items-item-metadata-container');
- const findRemoveButton = () => wrapper.findByTestId('item-remove');
-
- const toggleItemsListEditablity = async () => {
- store.dispatch(`${TEST_VUEX_MODULE}/toggleItemsListEditablity`);
-
- await nextTick();
- };
-
- const createComponent = (props = {}) => {
- wrapper = shallowMountExtended(frequentItemsListItemComponent, {
- store,
- propsData: {
- itemId: mockProject.id,
- itemName: mockProject.name,
- namespace: mockProject.namespace,
- webUrl: mockProject.webUrl,
- avatarUrl: mockProject.avatarUrl,
- ...props,
- },
- provide: {
- vuexModule: TEST_VUEX_MODULE,
- },
- });
- };
-
- beforeEach(() => {
- store = createStore();
- trackingSpy = mockTracking('_category_', document, jest.spyOn);
- trackingSpy.mockImplementation(() => {});
- });
-
- afterEach(() => {
- unmockTracking();
- });
-
- describe('computed', () => {
- describe('highlightedItemName', () => {
- it('should enclose part of project name in <b> & </b> which matches with `matcher` prop', () => {
- createComponent({ matcher: 'lab' });
-
- expect(findTitle().element.innerHTML).toContain('<b>L</b><b>a</b><b>b</b>');
- });
-
- it('should return project name as it is if `matcher` is not available', () => {
- createComponent({ matcher: null });
-
- expect(trimText(findTitle().text())).toBe(mockProject.name);
- });
- });
-
- describe('truncatedNamespace', () => {
- it('should truncate project name from namespace string', () => {
- createComponent({ namespace: 'platform / nokia-3310' });
-
- expect(trimText(findNamespace().text())).toBe('platform');
- });
-
- it('should truncate namespace string from the middle if it includes more than two groups in path', () => {
- createComponent({
- namespace: 'platform / hardware / broadcom / Wifi Group / Mobile Chipset / nokia-3310',
- });
-
- expect(trimText(findNamespace().text())).toBe('platform / ... / Mobile Chipset');
- });
- });
- });
-
- describe('template', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('renders avatar', () => {
- expect(findAvatar().exists()).toBe(true);
- });
-
- it('renders root element with the right classes', () => {
- expect(wrapper.classes('frequent-items-list-item-container')).toBe(true);
- });
-
- it.each`
- name | selector | expected
- ${'list item'} | ${findAllFrequentItems} | ${1}
- ${'avatar container'} | ${findAllAvatars} | ${1}
- ${'metadata container'} | ${findAllMetadataContainers} | ${1}
- ${'title'} | ${findAllTitles} | ${1}
- ${'namespace'} | ${findAllNamespace} | ${1}
- `('should render $expected $name', ({ selector, expected }) => {
- expect(selector()).toHaveLength(expected);
- });
-
- it('renders remove button within item when `isItemsListEditable` is true', async () => {
- await toggleItemsListEditablity();
-
- const removeButton = findRemoveButton();
- expect(removeButton.exists()).toBe(true);
- expect(removeButton.attributes('title')).toBe('Remove');
- expect(removeButton.findComponent(GlIcon).props('name')).toBe('close');
- });
-
- it('dispatches action `removeFrequentItem` when remove button is clicked', async () => {
- await toggleItemsListEditablity();
-
- jest.spyOn(store, 'dispatch');
-
- const removeButton = findRemoveButton();
- removeButton.vm.$emit(
- 'click',
- { stopPropagation: jest.fn(), preventDefault: jest.fn() },
- mockProject.id,
- );
-
- await nextTick();
-
- expect(store.dispatch).toHaveBeenCalledWith(
- `${TEST_VUEX_MODULE}/removeFrequentItem`,
- mockProject.id,
- );
- });
-
- it('tracks when item link is clicked', () => {
- const link = wrapper.findByTestId('frequent-item-link');
-
- link.vm.$emit('click');
-
- expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_link', {
- label: 'projects_dropdown_frequent_items_list_item',
- property: 'navigation_top',
- });
- });
- });
-});
diff --git a/spec/frontend/frequent_items/components/frequent_items_list_spec.js b/spec/frontend/frequent_items/components/frequent_items_list_spec.js
deleted file mode 100644
index 8055b7a9c13..00000000000
--- a/spec/frontend/frequent_items/components/frequent_items_list_spec.js
+++ /dev/null
@@ -1,121 +0,0 @@
-import Vue, { nextTick } from 'vue';
-// eslint-disable-next-line no-restricted-imports
-import Vuex from 'vuex';
-import { mountExtended } from 'helpers/vue_test_utils_helper';
-import frequentItemsListComponent from '~/frequent_items/components/frequent_items_list.vue';
-import frequentItemsListItemComponent from '~/frequent_items/components/frequent_items_list_item.vue';
-import { createStore } from '~/frequent_items/store';
-import { mockFrequentProjects } from '../mock_data';
-
-Vue.use(Vuex);
-
-describe('FrequentItemsListComponent', () => {
- let wrapper;
-
- const createComponent = (props = {}) => {
- wrapper = mountExtended(frequentItemsListComponent, {
- store: createStore(),
- propsData: {
- namespace: 'projects',
- items: mockFrequentProjects,
- isFetchFailed: false,
- isItemRemovalFailed: false,
- hasSearchQuery: false,
- matcher: 'lab',
- ...props,
- },
- provide: {
- vuexModule: 'frequentProjects',
- },
- });
- };
-
- describe('computed', () => {
- describe('isListEmpty', () => {
- it('should return `true` or `false` representing whether if `items` is empty or not with projects', async () => {
- createComponent({
- items: [],
- });
-
- expect(wrapper.vm.isListEmpty).toBe(true);
-
- wrapper.setProps({
- items: mockFrequentProjects,
- });
- await nextTick();
-
- expect(wrapper.vm.isListEmpty).toBe(false);
- });
- });
-
- describe('fetched item messages', () => {
- it('should show default empty list message', () => {
- createComponent({
- items: [],
- });
-
- expect(wrapper.findByTestId('frequent-items-list-empty').text()).toContain(
- 'Projects you visit often will appear here',
- );
- });
-
- it.each`
- isFetchFailed | isItemRemovalFailed
- ${true} | ${false}
- ${false} | ${true}
- `(
- 'should show failure message when `isFetchFailed` is $isFetchFailed or `isItemRemovalFailed` is $isItemRemovalFailed',
- ({ isFetchFailed, isItemRemovalFailed }) => {
- createComponent({
- items: [],
- isFetchFailed,
- isItemRemovalFailed,
- });
-
- expect(wrapper.findByTestId('frequent-items-list-empty').text()).toContain(
- 'This feature requires browser localStorage support',
- );
- },
- );
- });
-
- describe('searched item messages', () => {
- it('should return appropriate empty list message based on value of `searchFailed` prop with projects', async () => {
- createComponent({
- hasSearchQuery: true,
- isFetchFailed: true,
- });
-
- expect(wrapper.vm.listEmptyMessage).toBe('Something went wrong on our end.');
-
- wrapper.setProps({
- isFetchFailed: false,
- });
- await nextTick();
-
- expect(wrapper.vm.listEmptyMessage).toBe('Sorry, no projects matched your search');
- });
- });
- });
-
- describe('template', () => {
- it('should render component element with list of projects', async () => {
- createComponent();
-
- await nextTick();
- expect(wrapper.classes('frequent-items-list-container')).toBe(true);
- expect(wrapper.findAllByTestId('frequent-items-list')).toHaveLength(1);
- expect(wrapper.findAllComponents(frequentItemsListItemComponent)).toHaveLength(5);
- });
-
- it('should render component element with empty message', async () => {
- createComponent({
- items: [],
- });
-
- await nextTick();
- expect(wrapper.vm.$el.querySelectorAll('li.section-empty')).toHaveLength(1);
- expect(wrapper.findAllComponents(frequentItemsListItemComponent)).toHaveLength(0);
- });
- });
-});
diff --git a/spec/frontend/frequent_items/components/frequent_items_search_input_spec.js b/spec/frontend/frequent_items/components/frequent_items_search_input_spec.js
deleted file mode 100644
index d6aa0f4e221..00000000000
--- a/spec/frontend/frequent_items/components/frequent_items_search_input_spec.js
+++ /dev/null
@@ -1,74 +0,0 @@
-import { GlSearchBoxByType } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import Vue, { nextTick } from 'vue';
-// eslint-disable-next-line no-restricted-imports
-import Vuex from 'vuex';
-import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
-import searchComponent from '~/frequent_items/components/frequent_items_search_input.vue';
-import { createStore } from '~/frequent_items/store';
-
-Vue.use(Vuex);
-
-describe('FrequentItemsSearchInputComponent', () => {
- let wrapper;
- let trackingSpy;
- let vm;
- let store;
-
- const createComponent = (namespace = 'projects') =>
- shallowMount(searchComponent, {
- store,
- propsData: { namespace },
- provide: {
- vuexModule: 'frequentProjects',
- },
- });
-
- const findSearchBoxByType = () => wrapper.findComponent(GlSearchBoxByType);
-
- beforeEach(() => {
- store = createStore();
- jest.spyOn(store, 'dispatch').mockImplementation(() => {});
-
- trackingSpy = mockTracking('_category_', document, jest.spyOn);
- trackingSpy.mockImplementation(() => {});
-
- wrapper = createComponent();
-
- ({ vm } = wrapper);
- });
-
- afterEach(() => {
- unmockTracking();
- vm.$destroy();
- });
-
- describe('template', () => {
- it('should render component element', () => {
- expect(wrapper.classes()).toContain('search-input-container');
- expect(findSearchBoxByType().exists()).toBe(true);
- expect(findSearchBoxByType().attributes()).toMatchObject({
- placeholder: 'Search your projects',
- });
- });
- });
-
- describe('tracking', () => {
- it('tracks when search query is entered', async () => {
- expect(trackingSpy).not.toHaveBeenCalled();
- expect(store.dispatch).not.toHaveBeenCalled();
-
- const value = 'my project';
-
- findSearchBoxByType().vm.$emit('input', value);
-
- await nextTick();
-
- expect(trackingSpy).toHaveBeenCalledWith(undefined, 'type_search_query', {
- label: 'projects_dropdown_frequent_items_search_input',
- property: 'navigation_top',
- });
- expect(store.dispatch).toHaveBeenCalledWith('frequentProjects/setSearchQuery', value);
- });
- });
-});
diff --git a/spec/frontend/frequent_items/mock_data.js b/spec/frontend/frequent_items/mock_data.js
deleted file mode 100644
index 6563daee6c3..00000000000
--- a/spec/frontend/frequent_items/mock_data.js
+++ /dev/null
@@ -1,169 +0,0 @@
-import { TEST_HOST } from 'helpers/test_constants';
-
-export const currentSession = {
- groups: {
- username: 'root',
- storageKey: 'root/frequent-groups',
- apiVersion: 'v4',
- group: {
- id: 1,
- name: 'dummy-group',
- full_name: 'dummy-parent-group',
- webUrl: `${TEST_HOST}/dummy-group`,
- avatarUrl: null,
- lastAccessedOn: Date.now(),
- },
- },
- projects: {
- username: 'root',
- storageKey: 'root/frequent-projects',
- apiVersion: 'v4',
- project: {
- id: 1,
- name: 'dummy-project',
- namespace: 'SampleGroup / Dummy-Project',
- webUrl: `${TEST_HOST}/samplegroup/dummy-project`,
- avatarUrl: null,
- lastAccessedOn: Date.now(),
- },
- },
-};
-
-export const mockNamespace = 'projects';
-export const mockStorageKey = 'test-user/frequent-projects';
-
-export const mockGroup = {
- id: 1,
- name: 'Sub451',
- namespace: 'Commit451 / Sub451',
- webUrl: `${TEST_HOST}/Commit451/Sub451`,
- avatarUrl: null,
-};
-
-export const mockRawGroup = {
- id: 1,
- name: 'Sub451',
- full_name: 'Commit451 / Sub451',
- web_url: `${TEST_HOST}/Commit451/Sub451`,
- avatar_url: null,
-};
-
-export const mockFrequentGroups = [
- {
- id: 3,
- name: 'Subgroup451',
- full_name: 'Commit451 / Subgroup451',
- webUrl: '/Commit451/Subgroup451',
- avatarUrl: null,
- frequency: 7,
- lastAccessedOn: 1497979281815,
- },
- {
- id: 1,
- name: 'Commit451',
- full_name: 'Commit451',
- webUrl: '/Commit451',
- avatarUrl: null,
- frequency: 3,
- lastAccessedOn: 1497979281815,
- },
-];
-
-export const mockSearchedGroups = { data: [mockRawGroup] };
-export const mockProcessedSearchedGroups = [mockGroup];
-
-export const mockProject = {
- id: 1,
- name: 'GitLab Community Edition',
- namespace: 'gitlab-org / gitlab-ce',
- webUrl: `${TEST_HOST}/gitlab-org/gitlab-foss`,
- avatarUrl: null,
-};
-
-export const mockRawProject = {
- id: 1,
- name: 'GitLab Community Edition',
- name_with_namespace: 'gitlab-org / gitlab-ce',
- web_url: `${TEST_HOST}/gitlab-org/gitlab-foss`,
- avatar_url: null,
-};
-
-export const mockFrequentProjects = [
- {
- id: 1,
- name: 'GitLab Community Edition',
- namespace: 'gitlab-org / gitlab-ce',
- webUrl: `${TEST_HOST}/gitlab-org/gitlab-foss`,
- avatarUrl: null,
- frequency: 1,
- lastAccessedOn: Date.now(),
- },
- {
- id: 2,
- name: 'GitLab CI',
- namespace: 'gitlab-org / gitlab-ci',
- webUrl: `${TEST_HOST}/gitlab-org/gitlab-ci`,
- avatarUrl: null,
- frequency: 9,
- lastAccessedOn: Date.now(),
- },
- {
- id: 3,
- name: 'Typeahead.Js',
- namespace: 'twitter / typeahead-js',
- webUrl: `${TEST_HOST}/twitter/typeahead-js`,
- avatarUrl: '/uploads/-/system/project/avatar/7/TWBS.png',
- frequency: 2,
- lastAccessedOn: Date.now(),
- },
- {
- id: 4,
- name: 'Intel',
- namespace: 'platform / hardware / bsp / intel',
- webUrl: `${TEST_HOST}/platform/hardware/bsp/intel`,
- avatarUrl: null,
- frequency: 3,
- lastAccessedOn: Date.now(),
- },
- {
- id: 5,
- name: 'v4.4',
- namespace: 'platform / hardware / bsp / kernel / common / v4.4',
- webUrl: `${TEST_HOST}/platform/hardware/bsp/kernel/common/v4.4`,
- avatarUrl: null,
- frequency: 8,
- lastAccessedOn: Date.now(),
- },
-];
-
-export const mockSearchedProjects = { data: [mockRawProject] };
-export const mockProcessedSearchedProjects = [mockProject];
-
-export const unsortedFrequentItems = [
- { id: 1, frequency: 12, lastAccessedOn: 1491400843391 },
- { id: 2, frequency: 14, lastAccessedOn: 1488240890738 },
- { id: 3, frequency: 44, lastAccessedOn: 1497675908472 },
- { id: 4, frequency: 8, lastAccessedOn: 1497979281815 },
- { id: 5, frequency: 34, lastAccessedOn: 1488089211943 },
- { id: 6, frequency: 14, lastAccessedOn: 1493517292488 },
- { id: 7, frequency: 42, lastAccessedOn: 1486815299875 },
- { id: 8, frequency: 33, lastAccessedOn: 1500762279114 },
- { id: 10, frequency: 46, lastAccessedOn: 1483251641543 },
-];
-
-/**
- * This const has a specific order which tests authenticity
- * of `getTopFrequentItems` method so
- * DO NOT change order of items in this const.
- */
-export const sortedFrequentItems = [
- { id: 10, frequency: 46, lastAccessedOn: 1483251641543 },
- { id: 3, frequency: 44, lastAccessedOn: 1497675908472 },
- { id: 7, frequency: 42, lastAccessedOn: 1486815299875 },
- { id: 5, frequency: 34, lastAccessedOn: 1488089211943 },
- { id: 8, frequency: 33, lastAccessedOn: 1500762279114 },
- { id: 6, frequency: 14, lastAccessedOn: 1493517292488 },
- { id: 2, frequency: 14, lastAccessedOn: 1488240890738 },
- { id: 1, frequency: 12, lastAccessedOn: 1491400843391 },
- { id: 4, frequency: 8, lastAccessedOn: 1497979281815 },
-];
diff --git a/spec/frontend/frequent_items/store/actions_spec.js b/spec/frontend/frequent_items/store/actions_spec.js
deleted file mode 100644
index 2feb488da2c..00000000000
--- a/spec/frontend/frequent_items/store/actions_spec.js
+++ /dev/null
@@ -1,304 +0,0 @@
-import MockAdapter from 'axios-mock-adapter';
-import testAction from 'helpers/vuex_action_helper';
-import * as actions from '~/frequent_items/store/actions';
-import * as types from '~/frequent_items/store/mutation_types';
-import state from '~/frequent_items/store/state';
-import AccessorUtilities from '~/lib/utils/accessor';
-import axios from '~/lib/utils/axios_utils';
-import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
-import { useLocalStorageSpy } from 'helpers/local_storage_helper';
-import {
- mockNamespace,
- mockStorageKey,
- mockFrequentProjects,
- mockSearchedProjects,
-} from '../mock_data';
-
-describe('Frequent Items Dropdown Store Actions', () => {
- useLocalStorageSpy();
- let mockedState;
- let mock;
-
- beforeEach(() => {
- mockedState = state();
- mock = new MockAdapter(axios);
-
- mockedState.namespace = mockNamespace;
- mockedState.storageKey = mockStorageKey;
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- describe('setNamespace', () => {
- it('should set namespace', () => {
- return testAction(
- actions.setNamespace,
- mockNamespace,
- mockedState,
- [{ type: types.SET_NAMESPACE, payload: mockNamespace }],
- [],
- );
- });
- });
-
- describe('setStorageKey', () => {
- it('should set storage key', () => {
- return testAction(
- actions.setStorageKey,
- mockStorageKey,
- mockedState,
- [{ type: types.SET_STORAGE_KEY, payload: mockStorageKey }],
- [],
- );
- });
- });
-
- describe('toggleItemsListEditablity', () => {
- it('should toggle items list editablity', () => {
- return testAction(
- actions.toggleItemsListEditablity,
- null,
- mockedState,
- [{ type: types.TOGGLE_ITEMS_LIST_EDITABILITY }],
- [],
- );
- });
- });
-
- describe('requestFrequentItems', () => {
- it('should request frequent items', () => {
- return testAction(
- actions.requestFrequentItems,
- null,
- mockedState,
- [{ type: types.REQUEST_FREQUENT_ITEMS }],
- [],
- );
- });
- });
-
- describe('receiveFrequentItemsSuccess', () => {
- it('should set frequent items', () => {
- return testAction(
- actions.receiveFrequentItemsSuccess,
- mockFrequentProjects,
- mockedState,
- [{ type: types.RECEIVE_FREQUENT_ITEMS_SUCCESS, payload: mockFrequentProjects }],
- [],
- );
- });
- });
-
- describe('receiveFrequentItemsError', () => {
- it('should set frequent items error state', () => {
- return testAction(
- actions.receiveFrequentItemsError,
- null,
- mockedState,
- [{ type: types.RECEIVE_FREQUENT_ITEMS_ERROR }],
- [],
- );
- });
- });
-
- describe('fetchFrequentItems', () => {
- it('should dispatch `receiveFrequentItemsSuccess`', () => {
- mockedState.namespace = mockNamespace;
- mockedState.storageKey = mockStorageKey;
-
- return testAction(
- actions.fetchFrequentItems,
- null,
- mockedState,
- [],
- [{ type: 'requestFrequentItems' }, { type: 'receiveFrequentItemsSuccess', payload: [] }],
- );
- });
-
- it('should dispatch `receiveFrequentItemsError`', () => {
- jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(false);
- mockedState.namespace = mockNamespace;
- mockedState.storageKey = mockStorageKey;
-
- return testAction(
- actions.fetchFrequentItems,
- null,
- mockedState,
- [],
- [{ type: 'requestFrequentItems' }, { type: 'receiveFrequentItemsError' }],
- );
- });
- });
-
- describe('requestSearchedItems', () => {
- it('should request searched items', () => {
- return testAction(
- actions.requestSearchedItems,
- null,
- mockedState,
- [{ type: types.REQUEST_SEARCHED_ITEMS }],
- [],
- );
- });
- });
-
- describe('receiveSearchedItemsSuccess', () => {
- it('should set searched items', () => {
- return testAction(
- actions.receiveSearchedItemsSuccess,
- mockSearchedProjects,
- mockedState,
- [{ type: types.RECEIVE_SEARCHED_ITEMS_SUCCESS, payload: mockSearchedProjects }],
- [],
- );
- });
- });
-
- describe('receiveSearchedItemsError', () => {
- it('should set searched items error state', () => {
- return testAction(
- actions.receiveSearchedItemsError,
- null,
- mockedState,
- [{ type: types.RECEIVE_SEARCHED_ITEMS_ERROR }],
- [],
- );
- });
- });
-
- describe('fetchSearchedItems', () => {
- beforeEach(() => {
- gon.api_version = 'v4';
- });
-
- it('should dispatch `receiveSearchedItemsSuccess`', () => {
- mock
- .onGet(/\/api\/v4\/projects.json(.*)$/)
- .replyOnce(HTTP_STATUS_OK, mockSearchedProjects, {});
-
- return testAction(
- actions.fetchSearchedItems,
- null,
- mockedState,
- [],
- [
- { type: 'requestSearchedItems' },
- {
- type: 'receiveSearchedItemsSuccess',
- payload: { data: mockSearchedProjects, headers: {} },
- },
- ],
- );
- });
-
- it('should dispatch `receiveSearchedItemsError`', () => {
- gon.api_version = 'v4';
- mock.onGet(/\/api\/v4\/projects.json(.*)$/).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
-
- return testAction(
- actions.fetchSearchedItems,
- null,
- mockedState,
- [],
- [{ type: 'requestSearchedItems' }, { type: 'receiveSearchedItemsError' }],
- );
- });
- });
-
- describe('setSearchQuery', () => {
- it('should commit query and dispatch `fetchSearchedItems` when query is present', () => {
- return testAction(
- actions.setSearchQuery,
- { query: 'test' },
- mockedState,
- [{ type: types.SET_SEARCH_QUERY, payload: { query: 'test' } }],
- [{ type: 'fetchSearchedItems', payload: { query: 'test' } }],
- );
- });
-
- it('should commit query and dispatch `fetchFrequentItems` when query is empty', () => {
- return testAction(
- actions.setSearchQuery,
- null,
- mockedState,
- [{ type: types.SET_SEARCH_QUERY, payload: null }],
- [{ type: 'fetchFrequentItems' }],
- );
- });
- });
-
- describe('removeFrequentItemSuccess', () => {
- it('should remove frequent item on success', () => {
- return testAction(
- actions.removeFrequentItemSuccess,
- { itemId: 1 },
- mockedState,
- [
- {
- type: types.RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS,
- payload: { itemId: 1 },
- },
- ],
- [],
- );
- });
- });
-
- describe('removeFrequentItemError', () => {
- it('should should not remove frequent item on failure', () => {
- return testAction(
- actions.removeFrequentItemError,
- null,
- mockedState,
- [{ type: types.RECEIVE_REMOVE_FREQUENT_ITEM_ERROR }],
- [],
- );
- });
- });
-
- describe('removeFrequentItem', () => {
- beforeEach(() => {
- mockedState.items = [...mockFrequentProjects];
- window.localStorage.setItem(mockStorageKey, JSON.stringify(mockFrequentProjects));
- });
-
- it('should remove provided itemId from localStorage', () => {
- jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(true);
-
- actions.removeFrequentItem(
- { commit: jest.fn(), dispatch: jest.fn(), state: mockedState },
- mockFrequentProjects[0].id,
- );
-
- expect(window.localStorage.getItem(mockStorageKey)).toBe(
- JSON.stringify(mockFrequentProjects.slice(1)), // First item was removed
- );
- });
-
- it('should dispatch `removeFrequentItemSuccess` on localStorage update success', () => {
- jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(true);
-
- return testAction(
- actions.removeFrequentItem,
- mockFrequentProjects[0].id,
- mockedState,
- [],
- [{ type: 'removeFrequentItemSuccess', payload: mockFrequentProjects[0].id }],
- );
- });
-
- it('should dispatch `removeFrequentItemError` on localStorage update failure', () => {
- jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(false);
-
- return testAction(
- actions.removeFrequentItem,
- mockFrequentProjects[0].id,
- mockedState,
- [],
- [{ type: 'removeFrequentItemError' }],
- );
- });
- });
-});
diff --git a/spec/frontend/frequent_items/store/getters_spec.js b/spec/frontend/frequent_items/store/getters_spec.js
deleted file mode 100644
index 97732cd95fc..00000000000
--- a/spec/frontend/frequent_items/store/getters_spec.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import * as getters from '~/frequent_items/store/getters';
-import state from '~/frequent_items/store/state';
-
-describe('Frequent Items Dropdown Store Getters', () => {
- let mockedState;
-
- beforeEach(() => {
- mockedState = state();
- });
-
- describe('hasSearchQuery', () => {
- it('should return `true` when search query is present', () => {
- mockedState.searchQuery = 'test';
-
- expect(getters.hasSearchQuery(mockedState)).toBe(true);
- });
-
- it('should return `false` when search query is empty', () => {
- mockedState.searchQuery = '';
-
- expect(getters.hasSearchQuery(mockedState)).toBe(false);
- });
- });
-});
diff --git a/spec/frontend/frequent_items/store/mutations_spec.js b/spec/frontend/frequent_items/store/mutations_spec.js
deleted file mode 100644
index 1e1878c3377..00000000000
--- a/spec/frontend/frequent_items/store/mutations_spec.js
+++ /dev/null
@@ -1,152 +0,0 @@
-import * as types from '~/frequent_items/store/mutation_types';
-import mutations from '~/frequent_items/store/mutations';
-import state from '~/frequent_items/store/state';
-import {
- mockNamespace,
- mockStorageKey,
- mockFrequentProjects,
- mockSearchedProjects,
- mockProcessedSearchedProjects,
- mockSearchedGroups,
- mockProcessedSearchedGroups,
-} from '../mock_data';
-
-describe('Frequent Items dropdown mutations', () => {
- let stateCopy;
-
- beforeEach(() => {
- stateCopy = state();
- });
-
- describe('SET_NAMESPACE', () => {
- it('should set namespace', () => {
- mutations[types.SET_NAMESPACE](stateCopy, mockNamespace);
-
- expect(stateCopy.namespace).toEqual(mockNamespace);
- });
- });
-
- describe('SET_STORAGE_KEY', () => {
- it('should set storage key', () => {
- mutations[types.SET_STORAGE_KEY](stateCopy, mockStorageKey);
-
- expect(stateCopy.storageKey).toEqual(mockStorageKey);
- });
- });
-
- describe('SET_SEARCH_QUERY', () => {
- it('should set search query', () => {
- const searchQuery = 'gitlab-ce';
-
- mutations[types.SET_SEARCH_QUERY](stateCopy, searchQuery);
-
- expect(stateCopy.searchQuery).toEqual(searchQuery);
- });
- });
-
- describe('TOGGLE_ITEMS_LIST_EDITABILITY', () => {
- it('should toggle items list editablity', () => {
- mutations[types.TOGGLE_ITEMS_LIST_EDITABILITY](stateCopy);
-
- expect(stateCopy.isItemsListEditable).toEqual(true);
-
- mutations[types.TOGGLE_ITEMS_LIST_EDITABILITY](stateCopy);
-
- expect(stateCopy.isItemsListEditable).toEqual(false);
- });
- });
-
- describe('REQUEST_FREQUENT_ITEMS', () => {
- it('should set view states when requesting frequent items', () => {
- mutations[types.REQUEST_FREQUENT_ITEMS](stateCopy);
-
- expect(stateCopy.isLoadingItems).toEqual(true);
- expect(stateCopy.hasSearchQuery).toEqual(false);
- });
- });
-
- describe('RECEIVE_FREQUENT_ITEMS_SUCCESS', () => {
- it('should set view states when receiving frequent items', () => {
- mutations[types.RECEIVE_FREQUENT_ITEMS_SUCCESS](stateCopy, mockFrequentProjects);
-
- expect(stateCopy.items).toEqual(mockFrequentProjects);
- expect(stateCopy.isLoadingItems).toEqual(false);
- expect(stateCopy.hasSearchQuery).toEqual(false);
- expect(stateCopy.isFetchFailed).toEqual(false);
- });
- });
-
- describe('RECEIVE_FREQUENT_ITEMS_ERROR', () => {
- it('should set items and view states when error occurs retrieving frequent items', () => {
- mutations[types.RECEIVE_FREQUENT_ITEMS_ERROR](stateCopy);
-
- expect(stateCopy.items).toEqual([]);
- expect(stateCopy.isLoadingItems).toEqual(false);
- expect(stateCopy.hasSearchQuery).toEqual(false);
- expect(stateCopy.isFetchFailed).toEqual(true);
- });
- });
-
- describe('REQUEST_SEARCHED_ITEMS', () => {
- it('should set view states when requesting searched items', () => {
- mutations[types.REQUEST_SEARCHED_ITEMS](stateCopy);
-
- expect(stateCopy.isLoadingItems).toEqual(true);
- expect(stateCopy.hasSearchQuery).toEqual(true);
- });
- });
-
- describe('RECEIVE_SEARCHED_ITEMS_SUCCESS', () => {
- it('should set items and view states when receiving searched items', () => {
- mutations[types.RECEIVE_SEARCHED_ITEMS_SUCCESS](stateCopy, mockSearchedProjects);
-
- expect(stateCopy.items).toEqual(mockProcessedSearchedProjects);
- expect(stateCopy.isLoadingItems).toEqual(false);
- expect(stateCopy.hasSearchQuery).toEqual(true);
- expect(stateCopy.isFetchFailed).toEqual(false);
- });
-
- it('should also handle the different `full_name` key for namespace in groups payload', () => {
- mutations[types.RECEIVE_SEARCHED_ITEMS_SUCCESS](stateCopy, mockSearchedGroups);
-
- expect(stateCopy.items).toEqual(mockProcessedSearchedGroups);
- expect(stateCopy.isLoadingItems).toEqual(false);
- expect(stateCopy.hasSearchQuery).toEqual(true);
- expect(stateCopy.isFetchFailed).toEqual(false);
- });
- });
-
- describe('RECEIVE_SEARCHED_ITEMS_ERROR', () => {
- it('should set view states when error occurs retrieving searched items', () => {
- mutations[types.RECEIVE_SEARCHED_ITEMS_ERROR](stateCopy);
-
- expect(stateCopy.items).toEqual([]);
- expect(stateCopy.isLoadingItems).toEqual(false);
- expect(stateCopy.hasSearchQuery).toEqual(true);
- expect(stateCopy.isFetchFailed).toEqual(true);
- });
- });
-
- describe('RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS', () => {
- it('should remove item with provided itemId from the items', () => {
- stateCopy.isItemRemovalFailed = true;
- stateCopy.items = mockFrequentProjects;
-
- mutations[types.RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS](stateCopy, mockFrequentProjects[0].id);
-
- expect(stateCopy.items).toHaveLength(mockFrequentProjects.length - 1);
- expect(stateCopy.items).toEqual([...mockFrequentProjects.slice(1)]);
- expect(stateCopy.isItemRemovalFailed).toBe(false);
- });
- });
-
- describe('RECEIVE_REMOVE_FREQUENT_ITEM_ERROR', () => {
- it('should remove item with provided itemId from the items', () => {
- stateCopy.isItemRemovalFailed = false;
-
- mutations[types.RECEIVE_REMOVE_FREQUENT_ITEM_ERROR](stateCopy);
-
- expect(stateCopy.isItemRemovalFailed).toBe(true);
- });
- });
-});
diff --git a/spec/frontend/frequent_items/utils_spec.js b/spec/frontend/frequent_items/utils_spec.js
deleted file mode 100644
index 8d4c89bd48f..00000000000
--- a/spec/frontend/frequent_items/utils_spec.js
+++ /dev/null
@@ -1,131 +0,0 @@
-import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
-import { FIFTEEN_MINUTES_IN_MS, FREQUENT_ITEMS } from '~/frequent_items/constants';
-import {
- isMobile,
- getTopFrequentItems,
- updateExistingFrequentItem,
- sanitizeItem,
-} from '~/frequent_items/utils';
-import { mockProject, unsortedFrequentItems, sortedFrequentItems } from './mock_data';
-
-describe('Frequent Items utils spec', () => {
- describe('isMobile', () => {
- it('returns true when the screen is medium', () => {
- jest.spyOn(bp, 'getBreakpointSize').mockReturnValue('md');
-
- expect(isMobile()).toBe(true);
- });
-
- it('returns true when the screen is small', () => {
- jest.spyOn(bp, 'getBreakpointSize').mockReturnValue('sm');
-
- expect(isMobile()).toBe(true);
- });
-
- it('returns true when the screen is extra-small', () => {
- jest.spyOn(bp, 'getBreakpointSize').mockReturnValue('xs');
-
- expect(isMobile()).toBe(true);
- });
-
- it('returns false when the screen is larger than medium', () => {
- jest.spyOn(bp, 'getBreakpointSize').mockReturnValue('lg');
-
- expect(isMobile()).toBe(false);
- });
- });
-
- describe('getTopFrequentItems', () => {
- it('returns empty array if no items provided', () => {
- const result = getTopFrequentItems();
-
- expect(result.length).toBe(0);
- });
-
- it('returns correct amount of items for mobile', () => {
- jest.spyOn(bp, 'getBreakpointSize').mockReturnValue('md');
- const result = getTopFrequentItems(unsortedFrequentItems);
-
- expect(result.length).toBe(FREQUENT_ITEMS.LIST_COUNT_MOBILE);
- });
-
- it('returns correct amount of items for desktop', () => {
- jest.spyOn(bp, 'getBreakpointSize').mockReturnValue('xl');
- const result = getTopFrequentItems(unsortedFrequentItems);
-
- expect(result.length).toBe(FREQUENT_ITEMS.LIST_COUNT_DESKTOP);
- });
-
- it('sorts frequent items in order of frequency and lastAccessedOn', () => {
- jest.spyOn(bp, 'getBreakpointSize').mockReturnValue('xl');
- const result = getTopFrequentItems(unsortedFrequentItems);
- const expectedResult = sortedFrequentItems.slice(0, FREQUENT_ITEMS.LIST_COUNT_DESKTOP);
-
- expect(result).toEqual(expectedResult);
- });
- });
-
- describe('updateExistingFrequentItem', () => {
- const LAST_ACCESSED = 1497979281815;
- const WITHIN_FIFTEEN_MINUTES = LAST_ACCESSED + FIFTEEN_MINUTES_IN_MS;
- const OVER_FIFTEEN_MINUTES = WITHIN_FIFTEEN_MINUTES + 1;
- const EXISTING_ITEM = Object.freeze({
- ...mockProject,
- frequency: 1,
- lastAccessedOn: 1497979281815,
- });
-
- it.each`
- desc | existingProps | newProps | expected
- ${'updates item if accessed over 15 minutes ago'} | ${{}} | ${{ lastAccessedOn: OVER_FIFTEEN_MINUTES }} | ${{ lastAccessedOn: Date.now(), frequency: 2 }}
- ${'does not update is accessed with 15 minutes'} | ${{}} | ${{ lastAccessedOn: WITHIN_FIFTEEN_MINUTES }} | ${{ lastAccessedOn: EXISTING_ITEM.lastAccessedOn, frequency: 1 }}
- ${'updates if lastAccessedOn not found'} | ${{ lastAccessedOn: undefined }} | ${{ lastAccessedOn: WITHIN_FIFTEEN_MINUTES }} | ${{ lastAccessedOn: Date.now(), frequency: 2 }}
- `('$desc', ({ existingProps, newProps, expected }) => {
- const newItem = {
- ...EXISTING_ITEM,
- ...newProps,
- };
- const existingItem = {
- ...EXISTING_ITEM,
- ...existingProps,
- };
-
- const result = updateExistingFrequentItem(existingItem, newItem);
-
- expect(result).toEqual({
- ...newItem,
- ...expected,
- });
- });
- });
-
- describe('sanitizeItem', () => {
- it('strips HTML tags for name and namespace', () => {
- const input = {
- name: '<br><b>test</b>',
- namespace: '<br>test',
- id: 1,
- };
-
- expect(sanitizeItem(input)).toEqual({ name: 'test', namespace: 'test', id: 1 });
- });
-
- it("skips `name` key if it doesn't exist on the item", () => {
- const input = {
- namespace: '<br>test',
- id: 1,
- };
-
- expect(sanitizeItem(input)).toEqual({ namespace: 'test', id: 1 });
- });
-
- it("skips `namespace` key if it doesn't exist on the item", () => {
- const input = {
- name: '<br><b>test</b>',
- id: 1,
- };
-
- expect(sanitizeItem(input)).toEqual({ name: 'test', id: 1 });
- });
- });
-});
diff --git a/spec/frontend/import/details/components/bulk_import_details_app_spec.js b/spec/frontend/import/details/components/bulk_import_details_app_spec.js
index d32afb7ddcb..18b03ed9802 100644
--- a/spec/frontend/import/details/components/bulk_import_details_app_spec.js
+++ b/spec/frontend/import/details/components/bulk_import_details_app_spec.js
@@ -1,18 +1,30 @@
import { shallowMount } from '@vue/test-utils';
+import { getParameterValues } from '~/lib/utils/url_utility';
+
import BulkImportDetailsApp from '~/import/details/components/bulk_import_details_app.vue';
+jest.mock('~/lib/utils/url_utility');
+
describe('Bulk import details app', () => {
let wrapper;
+ const mockId = 151;
+
const createComponent = () => {
wrapper = shallowMount(BulkImportDetailsApp);
};
+ beforeEach(() => {
+ getParameterValues.mockReturnValueOnce([mockId]);
+ });
+
describe('template', () => {
it('renders heading', () => {
createComponent();
- expect(wrapper.find('h1').text()).toBe('GitLab Migration details');
+ const headingText = wrapper.find('h1').text();
+
+ expect(headingText).toBe(`Items that failed to be imported for ${mockId}`);
});
});
});
diff --git a/spec/frontend/import_entities/import_groups/utils_spec.js b/spec/frontend/import_entities/import_groups/utils_spec.js
index 2892c5c217b..3db57170ed3 100644
--- a/spec/frontend/import_entities/import_groups/utils_spec.js
+++ b/spec/frontend/import_entities/import_groups/utils_spec.js
@@ -5,7 +5,7 @@ const FINISHED_STATUSES = [STATUSES.FINISHED, STATUSES.FAILED, STATUSES.TIMEOUT]
const OTHER_STATUSES = Object.values(STATUSES).filter(
(status) => !FINISHED_STATUSES.includes(status),
);
-describe('gitlab migration status utils', () => {
+describe('Direct transfer status utils', () => {
describe('isFinished', () => {
it.each(FINISHED_STATUSES.map((s) => [s]))(
'reports group as finished when import status is %s',
diff --git a/spec/frontend/lib/utils/vuex_module_mappers_spec.js b/spec/frontend/lib/utils/vuex_module_mappers_spec.js
deleted file mode 100644
index 9070903728b..00000000000
--- a/spec/frontend/lib/utils/vuex_module_mappers_spec.js
+++ /dev/null
@@ -1,133 +0,0 @@
-import { mount } from '@vue/test-utils';
-import Vue from 'vue';
-// eslint-disable-next-line no-restricted-imports
-import Vuex from 'vuex';
-import {
- mapVuexModuleActions,
- mapVuexModuleGetters,
- mapVuexModuleState,
- REQUIRE_STRING_ERROR_MESSAGE,
-} from '~/lib/utils/vuex_module_mappers';
-
-const TEST_MODULE_NAME = 'testModuleName';
-
-Vue.use(Vuex);
-
-// setup test component and store ----------------------------------------------
-//
-// These are used to indirectly test `vuex_module_mappers`.
-const TestComponent = {
- props: {
- vuexModule: {
- type: String,
- required: true,
- },
- },
- computed: {
- ...mapVuexModuleState((vm) => vm.vuexModule, { name: 'name', value: 'count' }),
- ...mapVuexModuleGetters((vm) => vm.vuexModule, ['hasValue', 'hasName']),
- stateJson() {
- return JSON.stringify({
- name: this.name,
- value: this.value,
- });
- },
- gettersJson() {
- return JSON.stringify({
- hasValue: this.hasValue,
- hasName: this.hasName,
- });
- },
- },
- methods: {
- ...mapVuexModuleActions((vm) => vm.vuexModule, ['increment']),
- },
- template: `
-<div>
- <pre data-testid="state">{{ stateJson }}</pre>
- <pre data-testid="getters">{{ gettersJson }}</pre>
-</div>`,
-};
-
-const createTestStore = () => {
- return new Vuex.Store({
- modules: {
- [TEST_MODULE_NAME]: {
- namespaced: true,
- state: {
- name: 'Lorem',
- count: 0,
- },
- mutations: {
- INCREMENT: (state, amount) => {
- state.count += amount;
- },
- },
- actions: {
- increment({ commit }, amount) {
- commit('INCREMENT', amount);
- },
- },
- getters: {
- hasValue: (state) => state.count > 0,
- hasName: (state) => Boolean(state.name.length),
- },
- },
- },
- });
-};
-
-describe('~/lib/utils/vuex_module_mappers', () => {
- let store;
- let wrapper;
-
- const getJsonInTemplate = (testId) =>
- JSON.parse(wrapper.find(`[data-testid="${testId}"]`).text());
- const getMappedState = () => getJsonInTemplate('state');
- const getMappedGetters = () => getJsonInTemplate('getters');
-
- beforeEach(() => {
- store = createTestStore();
-
- wrapper = mount(TestComponent, {
- propsData: {
- vuexModule: TEST_MODULE_NAME,
- },
- store,
- });
- });
-
- describe('from module defined by prop', () => {
- it('maps state', () => {
- expect(getMappedState()).toEqual({
- name: store.state[TEST_MODULE_NAME].name,
- value: store.state[TEST_MODULE_NAME].count,
- });
- });
-
- it('maps getters', () => {
- expect(getMappedGetters()).toEqual({
- hasName: true,
- hasValue: false,
- });
- });
-
- it('maps action', () => {
- jest.spyOn(store, 'dispatch');
-
- expect(store.dispatch).not.toHaveBeenCalled();
-
- wrapper.vm.increment(10);
-
- expect(store.dispatch).toHaveBeenCalledWith(`${TEST_MODULE_NAME}/increment`, 10);
- });
- });
-
- describe('with non-string object value', () => {
- it('throws helpful error', () => {
- expect(() => mapVuexModuleActions((vm) => vm.bogus, { foo: () => {} })).toThrow(
- REQUIRE_STRING_ERROR_MESSAGE,
- );
- });
- });
-});
diff --git a/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js b/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
index f6ad304f790..fca3a14d82f 100644
--- a/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
+++ b/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
@@ -84,7 +84,7 @@ describe('ServiceDeskRoot', () => {
const alertBodyLink = alertEl.findComponent(GlLink);
expect(alertBodyLink.exists()).toBe(true);
expect(alertBodyLink.attributes('href')).toBe(
- '/help/user/project/service_desk.html#use-an-additional-service-desk-alias-email',
+ '/help/user/project/service_desk/configure.html#use-an-additional-service-desk-alias-email',
);
expect(alertBodyLink.text()).toBe('How do I create a custom email address?');
});
diff --git a/spec/frontend/super_sidebar/mock_data.js b/spec/frontend/super_sidebar/mock_data.js
index f5e7a7507ea..fc264ad5e0a 100644
--- a/spec/frontend/super_sidebar/mock_data.js
+++ b/spec/frontend/super_sidebar/mock_data.js
@@ -305,3 +305,32 @@ export const cachedFrequentGroups = JSON.stringify([
frequency: 3,
},
]);
+
+export const unsortedFrequentItems = [
+ { id: 1, frequency: 12, lastAccessedOn: 1491400843391 },
+ { id: 2, frequency: 14, lastAccessedOn: 1488240890738 },
+ { id: 3, frequency: 44, lastAccessedOn: 1497675908472 },
+ { id: 4, frequency: 8, lastAccessedOn: 1497979281815 },
+ { id: 5, frequency: 34, lastAccessedOn: 1488089211943 },
+ { id: 6, frequency: 14, lastAccessedOn: 1493517292488 },
+ { id: 7, frequency: 42, lastAccessedOn: 1486815299875 },
+ { id: 8, frequency: 33, lastAccessedOn: 1500762279114 },
+ { id: 10, frequency: 46, lastAccessedOn: 1483251641543 },
+];
+
+/**
+ * This const has a specific order which tests authenticity
+ * of `getTopFrequentItems` method so
+ * DO NOT change order of items in this const.
+ */
+export const sortedFrequentItems = [
+ { id: 10, frequency: 46, lastAccessedOn: 1483251641543 },
+ { id: 3, frequency: 44, lastAccessedOn: 1497675908472 },
+ { id: 7, frequency: 42, lastAccessedOn: 1486815299875 },
+ { id: 5, frequency: 34, lastAccessedOn: 1488089211943 },
+ { id: 8, frequency: 33, lastAccessedOn: 1500762279114 },
+ { id: 6, frequency: 14, lastAccessedOn: 1493517292488 },
+ { id: 2, frequency: 14, lastAccessedOn: 1488240890738 },
+ { id: 1, frequency: 12, lastAccessedOn: 1491400843391 },
+ { id: 4, frequency: 8, lastAccessedOn: 1497979281815 },
+];
diff --git a/spec/frontend/super_sidebar/utils_spec.js b/spec/frontend/super_sidebar/utils_spec.js
index 3e99099b663..a9e4345f9cc 100644
--- a/spec/frontend/super_sidebar/utils_spec.js
+++ b/spec/frontend/super_sidebar/utils_spec.js
@@ -4,10 +4,10 @@ import { getTopFrequentItems, trackContextAccess, ariaCurrent } from '~/super_si
import axios from '~/lib/utils/axios_utils';
import { useLocalStorageSpy } from 'helpers/local_storage_helper';
import AccessorUtilities from '~/lib/utils/accessor';
-import { FREQUENT_ITEMS, FIFTEEN_MINUTES_IN_MS } from '~/frequent_items/constants';
+import { FREQUENT_ITEMS, FIFTEEN_MINUTES_IN_MS } from '~/super_sidebar/constants';
import { HTTP_STATUS_OK, HTTP_STATUS_INTERNAL_SERVER_ERROR } from '~/lib/utils/http_status';
import waitForPromises from 'helpers/wait_for_promises';
-import { unsortedFrequentItems, sortedFrequentItems } from '../frequent_items/mock_data';
+import { unsortedFrequentItems, sortedFrequentItems } from './mock_data';
jest.mock('~/sentry/sentry_browser_wrapper');
diff --git a/spec/helpers/json_helper_spec.rb b/spec/helpers/json_helper_spec.rb
deleted file mode 100644
index b9dfabb1b23..00000000000
--- a/spec/helpers/json_helper_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-RSpec.describe JsonHelper do
- let(:hash) { { "foo" => "bar" } }
- let(:json) { '{"foo":"bar"}' }
-
- describe ".json_generate" do
- subject { helper.json_generate(hash) }
-
- it "generates JSON" do
- expect(subject).to eq(json)
- end
-
- it "calls the Gitlab::Json class" do
- expect(Gitlab::Json).to receive(:generate).with(hash)
-
- subject
- end
- end
-
- describe ".json_parse" do
- subject { helper.json_parse(json) }
-
- it "parses JSON" do
- expect(subject).to eq(hash)
- end
-
- it "calls the Gitlab::Json class" do
- expect(Gitlab::Json).to receive(:parse).with(json)
-
- subject
- end
- end
-end
diff --git a/spec/lib/gitlab/ci/templates/Diffblue_Cover_spec.rb b/spec/lib/gitlab/ci/templates/Diffblue_Cover_spec.rb
new file mode 100644
index 00000000000..c16356bfda7
--- /dev/null
+++ b/spec/lib/gitlab/ci/templates/Diffblue_Cover_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Diffblue-Cover.gitlab-ci.yml', feature_category: :continuous_integration do
+ subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Diffblue-Cover') }
+
+ describe 'the created pipeline' do
+ let(:pipeline_branch) { 'patch-1' }
+ let_it_be(:project) { create(:project, :repository, create_branch: 'patch-1') }
+ let(:user) { project.first_owner }
+
+ let(:mr_service) { MergeRequests::CreatePipelineService.new(project: project, current_user: user) }
+ let(:merge_request) { create(:merge_request, :simple, source_project: project, source_branch: pipeline_branch) }
+ let(:mr_pipeline) { mr_service.execute(merge_request).payload }
+ let(:mr_build_names) { mr_pipeline.builds.pluck(:name) }
+
+ before do
+ stub_ci_pipeline_yaml_file(template.content)
+ end
+
+ it 'creates diffblue-cover jobs' do
+ expect(mr_build_names).to include('diffblue-cover')
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/templates/templates_spec.rb b/spec/lib/gitlab/ci/templates/templates_spec.rb
index 36c6e805bdf..98f0d32960b 100644
--- a/spec/lib/gitlab/ci/templates/templates_spec.rb
+++ b/spec/lib/gitlab/ci/templates/templates_spec.rb
@@ -20,6 +20,7 @@ RSpec.describe 'CI YML Templates' do
context 'that support autodevops' do
exceptions = [
+ 'Diffblue-Cover.gitlab-ci.yml', # no auto-devops
'Security/DAST.gitlab-ci.yml', # DAST stage is defined inside AutoDevops yml
'Security/DAST-API.gitlab-ci.yml', # no auto-devops
'Security/API-Fuzzing.gitlab-ci.yml', # no auto-devops
diff --git a/spec/requests/api/maven_packages_spec.rb b/spec/requests/api/maven_packages_spec.rb
index 578a4821b5e..2110e4a077d 100644
--- a/spec/requests/api/maven_packages_spec.rb
+++ b/spec/requests/api/maven_packages_spec.rb
@@ -43,7 +43,7 @@ RSpec.describe API::MavenPackages, feature_category: :package_registry do
project.add_developer(user)
end
- shared_examples 'handling groups and subgroups for' do |shared_example_name, visibilities: { public: :redirect }|
+ shared_examples 'handling groups and subgroups for' do |shared_example_name, shared_example_args = {}, visibilities: { public: :redirect }|
context 'within a group' do
visibilities.each do |visibility, not_found_response|
context "that is #{visibility}" do
@@ -51,7 +51,7 @@ RSpec.describe API::MavenPackages, feature_category: :package_registry do
group.update!(visibility_level: Gitlab::VisibilityLevel.level_value(visibility.to_s))
end
- it_behaves_like shared_example_name, not_found_response
+ it_behaves_like shared_example_name, not_found_response, shared_example_args
end
end
end
@@ -70,7 +70,7 @@ RSpec.describe API::MavenPackages, feature_category: :package_registry do
group.update!(visibility_level: Gitlab::VisibilityLevel.level_value(visibility.to_s))
end
- it_behaves_like shared_example_name, not_found_response
+ it_behaves_like shared_example_name, not_found_response, shared_example_args
end
end
end
@@ -621,7 +621,15 @@ RSpec.describe API::MavenPackages, feature_category: :package_registry do
it_behaves_like 'rejecting request with invalid params'
- it_behaves_like 'handling groups and subgroups for', 'getting a file for a group', visibilities: { internal: :unauthorized, public: :redirect }
+ it_behaves_like 'handling groups and subgroups for', 'getting a file for a group', visibilities: { internal: :unauthorized, public: :unauthorized }
+
+ context 'when the FF maven_remove_permissions_check_from_finder disabled' do
+ before do
+ stub_feature_flags(maven_remove_permissions_check_from_finder: false)
+ end
+
+ it_behaves_like 'handling groups and subgroups for', 'getting a file for a group', visibilities: { internal: :unauthorized, public: :redirect }
+ end
end
context 'private project' do
@@ -631,7 +639,7 @@ RSpec.describe API::MavenPackages, feature_category: :package_registry do
subject { download_file_with_token(file_name: package_file.file_name) }
- shared_examples 'getting a file for a group' do |not_found_response|
+ shared_examples 'getting a file for a group' do |not_found_response, download_denied_status: :forbidden|
it_behaves_like 'tracking the file download event'
it_behaves_like 'bumping the package last downloaded at field'
it_behaves_like 'successfully returning the file'
@@ -641,7 +649,7 @@ RSpec.describe API::MavenPackages, feature_category: :package_registry do
subject
- expect(response).to have_gitlab_http_status(:redirect)
+ expect(response).to have_gitlab_http_status(download_denied_status)
end
it 'denies download when no private token' do
@@ -682,7 +690,43 @@ RSpec.describe API::MavenPackages, feature_category: :package_registry do
end
end
- it_behaves_like 'handling groups and subgroups for', 'getting a file for a group', visibilities: { private: :unauthorized, internal: :unauthorized, public: :redirect }
+ context 'with the duplicate packages in the two projects' do
+ let_it_be(:recent_project) { create(:project, :private, namespace: group) }
+
+ let!(:package_dup) { create(:maven_package, project: recent_project, name: package.name, version: package.version) }
+
+ before do
+ group.add_guest(user)
+ project.add_developer(user)
+ end
+
+ context 'when user does not have enough permission for the recent project' do
+ it 'tries to download the recent package' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'when the FF maven_remove_permissions_check_from_finder disabled' do
+ before do
+ stub_feature_flags(maven_remove_permissions_check_from_finder: false)
+ end
+
+ it_behaves_like 'bumping the package last downloaded at field'
+ it_behaves_like 'successfully returning the file'
+ end
+ end
+
+ it_behaves_like 'handling groups and subgroups for', 'getting a file for a group', visibilities: { private: :unauthorized, internal: :unauthorized, public: :unauthorized }
+
+ context 'when the FF maven_remove_permissions_check_from_finder disabled' do
+ before do
+ stub_feature_flags(maven_remove_permissions_check_from_finder: false)
+ end
+
+ it_behaves_like 'handling groups and subgroups for', 'getting a file for a group', { download_denied_status: :redirect }, visibilities: { private: :unauthorized, internal: :unauthorized, public: :redirect }
+ end
context 'with a reporter from a subgroup accessing the root group' do
let_it_be(:root_group) { create(:group, :private) }
diff --git a/spec/scripts/duo_chat/reporter_spec.rb b/spec/scripts/duo_chat/reporter_spec.rb
new file mode 100644
index 00000000000..836c41273e8
--- /dev/null
+++ b/spec/scripts/duo_chat/reporter_spec.rb
@@ -0,0 +1,270 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require 'gitlab'
+require 'json'
+require_relative '../../../scripts/duo_chat/reporter'
+
+RSpec.describe Reporter, feature_category: :ai_abstraction_layer do
+ subject(:reporter) { described_class.new }
+
+ describe '#run', :freeze_time do
+ let(:ci_commit_sha) { 'commitsha' }
+ let(:ci_pipeline_url) { 'https://gitlab.com/pipeline/url' }
+ let(:client) { double }
+
+ before do
+ stub_env('CI_COMMIT_SHA', ci_commit_sha)
+ stub_env('CI_PIPELINE_URL', ci_pipeline_url)
+ stub_env('CI_COMMIT_BRANCH', ci_commit_branch)
+ stub_env('CI_DEFAULT_BRANCH', ci_default_branch)
+
+ allow(Gitlab).to receive(:client).and_return(client)
+ end
+
+ context 'when the CI pipeline is running with the commit in `master` branch' do
+ let(:ci_commit_branch) { 'master' }
+ let(:ci_default_branch) { 'master' }
+ let(:snippet_web_url) { 'https://gitlab.com/snippet/url' }
+ let(:issue_web_url) { 'https://gitlab.com/issue/url' }
+
+ let(:mock_data) do
+ [
+ {
+ "question" => "question1",
+ "resource" => "resource",
+ "answer" => "answer1",
+ "tools_used" => ["foobar tool"],
+ "evaluations" => [
+ { "model" => "claude-2", "response" => "Grade: CORRECT" },
+ { "model" => "text-bison", "response" => "Grade: CORRECT" }
+ ]
+ }
+ ]
+ end
+
+ before do
+ allow(reporter).to receive(:report_data).and_return(mock_data)
+ end
+
+ it 'uploads snippet, creates a report issue and updates the tracking issue' do
+ # Uploads the test data as a snippet along with commit sha and pipeline url
+ snippet = double(web_url: snippet_web_url) # rubocop: disable RSpec/VerifiedDoubles -- an internal detail of Gitlab gem.
+ snippet_content = ::JSON.pretty_generate({
+ commit: ci_commit_sha,
+ pipeline_url: ci_pipeline_url,
+ data: mock_data
+ })
+
+ expect(client).to receive(:create_snippet).with(
+ described_class::QA_EVALUATION_PROJECT_ID,
+ {
+ title: Time.now.utc.to_s,
+ files: [{ file_path: "#{Time.now.utc.to_i}.json", content: snippet_content }],
+ visibility: 'private'
+ }
+ ).and_return(snippet)
+
+ # Create a new issue for the report
+ issue_title = "Report #{Time.now.utc}"
+ issue = double(web_url: issue_web_url) # rubocop: disable RSpec/VerifiedDoubles -- an internal detail of Gitlab gem.
+
+ expect(client).to receive(:create_issue).with(
+ described_class::QA_EVALUATION_PROJECT_ID,
+ issue_title,
+ { description: reporter.markdown_report }
+ ).and_return(issue)
+
+ # Updates the tracking issue by adding a row that links to the snippet and the issue just created.
+ aggregated_report_issue = double(description: "") # rubocop: disable RSpec/VerifiedDoubles -- an internal detail of Gitlab gem.
+ allow(client).to receive(:issue).with(
+ described_class::QA_EVALUATION_PROJECT_ID,
+ described_class::AGGREGATED_REPORT_ISSUE_IID
+ ).and_return(aggregated_report_issue)
+ row = "\n| #{Time.now.utc} | 1 | 100.0% | 0.0% | 0.0%"
+ row << " | #{issue_web_url} | #{snippet_web_url} |"
+
+ expect(client).to receive(:edit_issue).with(
+ described_class::QA_EVALUATION_PROJECT_ID,
+ described_class::AGGREGATED_REPORT_ISSUE_IID,
+ { description: aggregated_report_issue.description + row }
+ )
+
+ reporter.run
+ end
+ end
+
+ context 'when the CI pipeline is not running with the commit in `master` branch' do
+ let(:ci_commit_branch) { 'foobar' }
+ let(:ci_default_branch) { 'master' }
+ let(:qa_eval_report_filename) { 'report.md' }
+ let(:merge_request_iid) { "123" }
+ let(:ci_project_id) { "456" }
+ let(:ci_project_dir) { "/builds/gitlab-org/gitlab" }
+ let(:base_dir) { "#{ci_project_dir}/#{qa_eval_report_filename}" }
+
+ before do
+ stub_env('QA_EVAL_REPORT_FILENAME', qa_eval_report_filename)
+ stub_env('CI_MERGE_REQUEST_IID', merge_request_iid)
+ stub_env('CI_PROJECT_ID', ci_project_id)
+ stub_env('CI_PROJECT_DIR', ci_project_dir)
+ end
+
+ context 'when a note does not already exist' do
+ let(:note) { nil } # rubocop: disable RSpec/VerifiedDoubles -- an internal detail of Gitlab gem.
+
+ it 'saves the report as a markdown file and creates a new MR note containing the report content' do
+ expect(File).to receive(:write).with(base_dir, reporter.markdown_report)
+
+ allow(reporter).to receive(:existing_report_note).and_return(note)
+ expect(client).to receive(:create_merge_request_note).with(
+ ci_project_id,
+ merge_request_iid,
+ reporter.markdown_report
+ )
+
+ reporter.run
+ end
+ end
+
+ context 'when a note exists' do
+ let(:note_id) { "1" }
+ let(:note) { double(id: note_id, type: "Note") } # rubocop: disable RSpec/VerifiedDoubles -- an internal detail of Gitlab gem.
+
+ it 'saves the report as a markdown file and updates the existing MR note containing the report content' do
+ expect(File).to receive(:write).with(base_dir, reporter.markdown_report)
+
+ allow(reporter).to receive(:existing_report_note).and_return(note)
+ expect(client).to receive(:edit_merge_request_note).with(
+ ci_project_id,
+ merge_request_iid,
+ note_id,
+ reporter.markdown_report
+ )
+
+ reporter.run
+ end
+ end
+ end
+ end
+
+ describe '#markdown_report' do
+ let(:mock_data) do
+ [
+ {
+ "question" => "question1",
+ "resource" => "resource",
+ "answer" => "answer1",
+ "tools_used" => ["foobar tool"],
+ "evaluations" => [
+ { "model" => "claude-2", "response" => "Grade: CORRECT" },
+ { "model" => "text-bison", "response" => "Grade: CORRECT" }
+ ]
+ },
+ {
+ "question" => "question2",
+ "resource" => "resource",
+ "answer" => "answer2",
+ "tools_used" => [],
+ "evaluations" => [
+ { "model" => "claude-2", "response" => " Grade: INCORRECT" },
+ { "model" => "text-bison", "response" => "Grade: INCORRECT" }
+ ]
+ },
+ {
+ "question" => "question3",
+ "resource" => "resource",
+ "answer" => "answer3",
+ "tools_used" => [],
+ "evaluations" => [
+ { "model" => "claude-2", "response" => " Grade: CORRECT" },
+ { "model" => "text-bison", "response" => "Grade: INCORRECT" }
+ ]
+ },
+ {
+ "question" => "question4",
+ "resource" => "resource",
+ "answer" => "answer4",
+ "tools_used" => [],
+ # Note: The first evaluation (claude-2) is considered invalid and ignored.
+ "evaluations" => [
+ { "model" => "claude-2", "response" => "???" },
+ { "model" => "text-bison", "response" => "Grade: CORRECT" }
+ ]
+ },
+ {
+ "question" => "question5",
+ "resource" => "resource",
+ "answer" => "answer5",
+ "tools_used" => [],
+ # Note: The second evaluation (text-bison) is considered invalid and ignored.
+ "evaluations" => [
+ { "model" => "claude-2", "response" => " Grade: INCORRECT" },
+ { "model" => "text-bison", "response" => "???" }
+ ]
+ },
+ {
+ "question" => "question6",
+ "resource" => "resource",
+ "answer" => "answer6",
+ "tools_used" => [],
+ # Note: Both evaluations are invalid as they contain neither `CORRECT` nor `INCORRECT`.
+ # It should be ignored in the report.
+ "evaluations" => [
+ { "model" => "claude-2", "response" => "???" },
+ { "model" => "text-bison", "response" => "???" }
+ ]
+ }
+ ]
+ end
+
+ before do
+ allow(reporter).to receive(:report_data).and_return(mock_data)
+ end
+
+ it "generates the correct summary stats and uses the correct emoji indicators" do
+ expect(reporter.markdown_report).to include "The total number of evaluations: 5"
+
+ expect(reporter.markdown_report).to include "all LLMs graded `CORRECT`: 2 (40.0%)"
+ expect(reporter.markdown_report).to include ":white_check_mark: :white_check_mark:"
+ expect(reporter.markdown_report).to include ":warning: :white_check_mark:"
+
+ expect(reporter.markdown_report).to include "all LLMs graded `INCORRECT`: 2 (40.0%)"
+ expect(reporter.markdown_report).to include ":x: :x:"
+ expect(reporter.markdown_report).to include ":x: :warning:"
+
+ expect(reporter.markdown_report).to include "in which LLMs disagreed: 1 (20.0%)"
+ expect(reporter.markdown_report).to include ":white_check_mark: :x:"
+ end
+
+ it "includes the tools used" do
+ expect(reporter.markdown_report).to include "[\"foobar tool\"]"
+ end
+
+ context 'when usernames are present' do
+ let(:mock_data) do
+ [
+ {
+ "question" => "@user's @root?",
+ "resource" => "resource",
+ "answer" => "@user2 and @user3",
+ "tools_used" => ["foobar tool"],
+ "evaluations" => [
+ { "model" => "claude-2", "response" => "Grade: CORRECT\n\n@user4" },
+ { "model" => "text-bison", "response" => "Grade: CORRECT\n\n@user5" }
+ ]
+ }
+ ]
+ end
+
+ it 'quotes the usernames with backticks' do
+ expect(reporter.markdown_report).to include "`@root`"
+ expect(reporter.markdown_report).to include "`@user`"
+ expect(reporter.markdown_report).to include "`@user2`"
+ expect(reporter.markdown_report).to include "`@user3`"
+ expect(reporter.markdown_report).to include "`@user4`"
+ expect(reporter.markdown_report).to include "`@user5`"
+ end
+ end
+ end
+end
diff --git a/yarn.lock b/yarn.lock
index 826d724b2aa..b0a4773952b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1211,10 +1211,10 @@
dependencies:
"@floating-ui/core" "^1.2.6"
-"@gitlab/application-sdk-browser@^0.2.10":
- version "0.2.10"
- resolved "https://registry.yarnpkg.com/@gitlab/application-sdk-browser/-/application-sdk-browser-0.2.10.tgz#d569f1d931680b16b26e5d7f151381479dde2ac4"
- integrity sha512-4WkjaInONtHstlKkOPU8wnJK6kasFUuhc4JyJtvaGiM9qmFOgYTvUM76Ru9N0f48YsSPw1ndVi14tzSfe8mSMg==
+"@gitlab/application-sdk-browser@^0.2.11":
+ version "0.2.11"
+ resolved "https://registry.yarnpkg.com/@gitlab/application-sdk-browser/-/application-sdk-browser-0.2.11.tgz#f061f6aed5b75927b2150b5021a77e7c602675b6"
+ integrity sha512-ThPgw7waDoF7tqlkYlTmPwLCe1h5qa3QuXwsNEVma4abdeuxxW3vwOPlRdZaUgZ0tmoSMefYgeUdjZQ/huqZ+w==
dependencies:
"@snowplow/browser-plugin-client-hints" "^3.9.0"
"@snowplow/browser-plugin-error-tracking" "^3.9.0"