Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-06-07 09:23:25 +00:00
parent f4d5fa8ccc
commit 66b78786e8
124 changed files with 1122 additions and 544 deletions

View File

@ -543,7 +543,7 @@ lib/gitlab/checks/**
/doc/administration/external_pipeline_validation.md @marcel.amirault @lyspin
/doc/administration/external_users.md @jglassman1
/doc/administration/feature_flags.md @axil
/doc/administration/file_hooks.md @eread @ashrafkhamis
/doc/administration/file_hooks.md @eread
/doc/administration/geo/ @axil
/doc/administration/geo_sites.md @axil
/doc/administration/get_started.md @kpaizee
@ -560,7 +560,7 @@ lib/gitlab/checks/**
/doc/administration/issue_closing_pattern.md @aqualls
/doc/administration/job_artifacts.md @marcel.amirault
/doc/administration/job_artifacts_troubleshooting.md @marcel.amirault
/doc/administration/job_logs.md @fneill
/doc/administration/job_logs.md @ashrafkhamis
/doc/administration/labels.md @msedlakjakubowski
/doc/administration/lfs/ @msedlakjakubowski
/doc/administration/libravatar.md @axil
@ -572,7 +572,7 @@ lib/gitlab/checks/**
/doc/administration/merge_request_diffs.md @msedlakjakubowski
/doc/administration/merge_requests_approvals.md @msedlakjakubowski
/doc/administration/moderate_users.md @jglassman1
/doc/administration/monitoring/github_imports.md @eread @ashrafkhamis
/doc/administration/monitoring/github_imports.md @eread
/doc/administration/monitoring/ip_allowlist.md @jglassman1
/doc/administration/monitoring/performance/ @jglassman1
/doc/administration/monitoring/prometheus/gitlab_exporter.md @jglassman1
@ -612,13 +612,13 @@ lib/gitlab/checks/**
/doc/administration/settings/git_http_rate_limits.md @msedlakjakubowski
/doc/administration/settings/git_lfs_rate_limits.md @msedlakjakubowski
/doc/administration/settings/gitaly_timeouts.md @eread
/doc/administration/settings/import_and_export_settings.md @eread @ashrafkhamis
/doc/administration/settings/import_export_rate_limits.md @eread @ashrafkhamis
/doc/administration/settings/import_and_export_settings.md @eread
/doc/administration/settings/import_export_rate_limits.md @eread
/doc/administration/settings/instance_template_repository.md @msedlakjakubowski
/doc/administration/settings/jira_cloud_app.md @eread @ashrafkhamis
/doc/administration/settings/jira_cloud_app_troubleshooting.md @eread @ashrafkhamis
/doc/administration/settings/jira_cloud_app.md @eread
/doc/administration/settings/jira_cloud_app_troubleshooting.md @eread
/doc/administration/settings/package_registry_rate_limits.md @phillipwells
/doc/administration/settings/project_integration_management.md @eread @ashrafkhamis
/doc/administration/settings/project_integration_management.md @eread
/doc/administration/settings/push_event_activities_limit.md @msedlakjakubowski
/doc/administration/settings/rate_limit_on_groups_api.md @lciutacu
/doc/administration/settings/rate_limit_on_issues_creation.md @msedlakjakubowski
@ -631,7 +631,7 @@ lib/gitlab/checks/**
/doc/administration/settings/scim_setup.md @jglassman1
/doc/administration/settings/security_and_compliance.md @rdickenson @phillipwells
/doc/administration/settings/security_contact_information.md @eread
/doc/administration/settings/slack_app.md @eread @ashrafkhamis
/doc/administration/settings/slack_app.md @eread
/doc/administration/settings/terraform_limits.md @phillipwells
/doc/administration/settings/third_party_offers.md @lciutacu
/doc/administration/settings/visibility_and_access_controls.md @msedlakjakubowski
@ -641,7 +641,7 @@ lib/gitlab/checks/**
/doc/administration/smime_signing_email.md @axil
/doc/administration/snippets/ @msedlakjakubowski
/doc/administration/static_objects_external_storage.md @ashrafkhamis
/doc/administration/system_hooks.md @eread @ashrafkhamis
/doc/administration/system_hooks.md @eread
/doc/administration/terraform_state.md @phillipwells
/doc/administration/timezone.md @axil
/doc/administration/troubleshooting/ @axil
@ -649,14 +649,14 @@ lib/gitlab/checks/**
/doc/administration/user_settings.md @jglassman1
/doc/api/access_requests.md @jglassman1
/doc/api/admin_sidekiq_queues.md @axil
/doc/api/api_resources.md @eread @ashrafkhamis
/doc/api/api_resources.md @eread
/doc/api/appearance.md @jglassman1
/doc/api/applications.md @jglassman1
/doc/api/audit_events.md @eread
/doc/api/avatar.md @jglassman1
/doc/api/boards.md @msedlakjakubowski
/doc/api/branches.md @msedlakjakubowski
/doc/api/bulk_imports.md @eread @ashrafkhamis
/doc/api/bulk_imports.md @eread
/doc/api/cluster_agents.md @phillipwells
/doc/api/code_suggestions.md @jglassman1
/doc/api/commits.md @msedlakjakubowski
@ -684,15 +684,9 @@ lib/gitlab/checks/**
/doc/api/geo_nodes.md @axil
/doc/api/geo_sites.md @axil
/doc/api/google_cloud_integration.md @jglassman1
/doc/api/graphql/audit_event_streaming_groups.md @eread
/doc/api/graphql/audit_event_streaming_instances.md @eread
/doc/api/graphql/audit_report.md @eread
/doc/api/graphql/ @eread
/doc/api/graphql/branch_rules.md @msedlakjakubowski
/doc/api/graphql/custom_emoji.md @msedlakjakubowski
/doc/api/graphql/getting_started.md @eread @ashrafkhamis
/doc/api/graphql/index.md @eread @ashrafkhamis
/doc/api/graphql/reference/ @eread @ashrafkhamis
/doc/api/graphql/removed_items.md @eread @ashrafkhamis
/doc/api/graphql/sample_issue_boards.md @msedlakjakubowski
/doc/api/graphql/users_example.md @jglassman1
/doc/api/group_access_tokens.md @jglassman1
@ -701,23 +695,23 @@ lib/gitlab/checks/**
/doc/api/group_boards.md @msedlakjakubowski
/doc/api/group_clusters.md @phillipwells
/doc/api/group_epic_boards.md @msedlakjakubowski
/doc/api/group_import_export.md @eread @ashrafkhamis
/doc/api/group_import_export.md @eread
/doc/api/group_iterations.md @msedlakjakubowski
/doc/api/group_labels.md @msedlakjakubowski
/doc/api/group_level_variables.md @marcel.amirault
/doc/api/group_milestones.md @msedlakjakubowski
/doc/api/group_protected_branches.md @msedlakjakubowski
/doc/api/group_protected_environments.md @phillipwells
/doc/api/group_relations_export.md @eread @ashrafkhamis
/doc/api/group_relations_export.md @eread
/doc/api/group_releases.md @phillipwells
/doc/api/group_repository_storage_moves.md @ashrafkhamis
/doc/api/group_ssh_certificates.md @msedlakjakubowski
/doc/api/groups.md @lciutacu
/doc/api/import.md @eread @ashrafkhamis
/doc/api/index.md @eread @ashrafkhamis
/doc/api/import.md @eread
/doc/api/index.md @eread
/doc/api/instance_clusters.md @phillipwells
/doc/api/instance_level_ci_variables.md @marcel.amirault
/doc/api/integrations.md @eread @ashrafkhamis
/doc/api/integrations.md @eread
/doc/api/issue_links.md @msedlakjakubowski
/doc/api/issues.md @msedlakjakubowski
/doc/api/issues_statistics.md @msedlakjakubowski
@ -742,7 +736,7 @@ lib/gitlab/checks/**
/doc/api/notes.md @msedlakjakubowski
/doc/api/notification_settings.md @msedlakjakubowski
/doc/api/oauth2.md @jglassman1
/doc/api/openapi/ @eread @ashrafkhamis
/doc/api/openapi/ @eread
/doc/api/packages.md @phillipwells
/doc/api/packages/ @phillipwells
/doc/api/personal_access_tokens.md @eread
@ -755,11 +749,11 @@ lib/gitlab/checks/**
/doc/api/project_aliases.md @msedlakjakubowski
/doc/api/project_badges.md @msedlakjakubowski
/doc/api/project_clusters.md @phillipwells
/doc/api/project_import_export.md @eread @ashrafkhamis
/doc/api/project_import_export.md @eread
/doc/api/project_job_token_scopes.md @marcel.amirault
/doc/api/project_level_variables.md @marcel.amirault
/doc/api/project_packages_protection_rules.md @phillipwells
/doc/api/project_relations_export.md @eread @ashrafkhamis
/doc/api/project_relations_export.md @eread
/doc/api/project_repository_storage_moves.md @eread
/doc/api/project_snippets.md @msedlakjakubowski
/doc/api/project_statistics.md @msedlakjakubowski
@ -780,8 +774,8 @@ lib/gitlab/checks/**
/doc/api/resource_milestone_events.md @msedlakjakubowski
/doc/api/resource_state_events.md @msedlakjakubowski
/doc/api/resource_weight_events.md @msedlakjakubowski
/doc/api/rest/ @eread @ashrafkhamis
/doc/api/runners.md @fneill
/doc/api/rest/ @eread
/doc/api/runners.md @ashrafkhamis
/doc/api/saml.md @jglassman1
/doc/api/scim.md @jglassman1
/doc/api/search.md @ashrafkhamis
@ -794,7 +788,7 @@ lib/gitlab/checks/**
/doc/api/statistics.md @jglassman1
/doc/api/status_checks.md @rdickenson
/doc/api/suggestions.md @msedlakjakubowski
/doc/api/system_hooks.md @eread @ashrafkhamis
/doc/api/system_hooks.md @eread
/doc/api/tags.md @msedlakjakubowski
/doc/api/templates/dockerfiles.md @msedlakjakubowski
/doc/api/templates/gitignores.md @msedlakjakubowski
@ -809,31 +803,31 @@ lib/gitlab/checks/**
/doc/api/vulnerability_findings.md @rdickenson
/doc/architecture/blueprints/autoflow/ @phillipwells
/doc/architecture/blueprints/cells/ @lciutacu
/doc/architecture/blueprints/ci_builds_runner_fleet_metrics/ @fneill
/doc/architecture/blueprints/ci_builds_runner_fleet_metrics/ @ashrafkhamis
/doc/architecture/blueprints/google_artifact_registry_integration/ @marcel.amirault
/doc/architecture/blueprints/organization/ @lciutacu
/doc/ci/ @marcel.amirault @lyspin
/doc/ci/chatops/ @phillipwells
/doc/ci/cloud_deployment/ @phillipwells
/doc/ci/cloud_services/ @marcel.amirault
/doc/ci/docker/using_docker_images.md @fneill
/doc/ci/docker/using_docker_images.md @ashrafkhamis
/doc/ci/environments/ @phillipwells
/doc/ci/examples/authenticating-with-hashicorp-vault/ @marcel.amirault
/doc/ci/examples/deployment/ @phillipwells
/doc/ci/examples/semantic-release.md @phillipwells
/doc/ci/gitlab_google_cloud_integration/ @marcel.amirault
/doc/ci/interactive_web_terminal/ @fneill
/doc/ci/interactive_web_terminal/ @ashrafkhamis
/doc/ci/jobs/ci_job_token.md @marcel.amirault
/doc/ci/jobs/job_artifacts.md @marcel.amirault
/doc/ci/jobs/job_artifacts_troubleshooting.md @marcel.amirault
/doc/ci/pipelines/pipeline_security.md @marcel.amirault
/doc/ci/resource_groups/ @phillipwells
/doc/ci/runners/ @fneill
/doc/ci/runners/ @ashrafkhamis
/doc/ci/secrets/ @marcel.amirault
/doc/ci/secure_files/ @marcel.amirault
/doc/ci/services/ @fneill
/doc/ci/services/ @ashrafkhamis
/doc/ci/ssh_keys/ @marcel.amirault
/doc/ci/steps/ @fneill
/doc/ci/steps/ @ashrafkhamis
/doc/ci/test_cases/ @msedlakjakubowski
/doc/ci/testing/code_quality.md @rdickenson @phillipwells
/doc/ci/testing/code_quality_troubleshooting.md @rdickenson @phillipwells
@ -877,19 +871,20 @@ lib/gitlab/checks/**
/doc/install/ @axil
/doc/integration/ @jglassman1
/doc/integration/advanced_search/ @ashrafkhamis
/doc/integration/datadog.md @fneill
/doc/integration/datadog.md @ashrafkhamis
/doc/integration/diffblue_cover.md @marcel.amirault @lyspin
/doc/integration/external-issue-tracker.md @eread @ashrafkhamis
/doc/integration/exact_code_search/ @ashrafkhamis
/doc/integration/external-issue-tracker.md @eread
/doc/integration/gitpod.md @ashrafkhamis
/doc/integration/gmail_action_buttons_for_gitlab.md @eread @ashrafkhamis
/doc/integration/index.md @eread @ashrafkhamis
/doc/integration/gmail_action_buttons_for_gitlab.md @eread
/doc/integration/index.md @eread
/doc/integration/jenkins.md @marcel.amirault @lyspin
/doc/integration/jira/ @eread @ashrafkhamis
/doc/integration/jira/ @eread
/doc/integration/mattermost/ @axil
/doc/integration/partner_marketplace.md @fneill
/doc/integration/snowflake.md @eread
/doc/integration/sourcegraph.md @msedlakjakubowski
/doc/integration/trello_power_up.md @eread @ashrafkhamis
/doc/integration/trello_power_up.md @eread
/doc/integration/vault.md @phillipwells
/doc/operations/ @phillipwells
/doc/policy/ @axil
@ -900,18 +895,16 @@ lib/gitlab/checks/**
/doc/solutions/ @jfullam @brianwald @Darwinjs
/doc/subscriptions/ @fneill
/doc/subscriptions/gitlab_dedicated/ @lyspin
/doc/topics/ @msedlakjakubowski
/doc/topics/autodevops/ @phillipwells
/doc/topics/data_seeder.md @sselhorn
/doc/topics/git/ @msedlakjakubowski
/doc/topics/offline/ @axil
/doc/topics/plan_and_track.md @msedlakjakubowski
/doc/tutorials/ @kpaizee
/doc/tutorials/boards_for_teams/ @msedlakjakubowski
/doc/tutorials/compliance_pipeline/ @eread
/doc/tutorials/configure_gitlab_runner_to_use_gke/ @fneill
/doc/tutorials/configure_gitlab_runner_to_use_gke/ @ashrafkhamis
/doc/tutorials/container_scanning/ @rdickenson @phillipwells
/doc/tutorials/convert_personal_namespace_to_group/ @lciutacu
/doc/tutorials/create_register_first_runner/ @fneill
/doc/tutorials/create_register_first_runner/ @ashrafkhamis
/doc/tutorials/dependency_scanning.md @rdickenson @phillipwells
/doc/tutorials/export_sbom.md @rdickenson @phillipwells
/doc/tutorials/fuzz_testing/ @rdickenson @phillipwells
@ -925,7 +918,7 @@ lib/gitlab/checks/**
/doc/tutorials/scan_execution_policy/ @rdickenson
/doc/tutorials/scan_result_policy/ @rdickenson
/doc/tutorials/scrum_events/ @msedlakjakubowski
/doc/tutorials/setup_steps/ @fneill
/doc/tutorials/setup_steps/ @ashrafkhamis
/doc/tutorials/update_commit_messages/ @msedlakjakubowski
/doc/tutorials/website_project_with_analytics/ @lciutacu
/doc/update/ @axil
@ -956,6 +949,7 @@ lib/gitlab/checks/**
/doc/user/get_started/get_started_planning_work.md @msedlakjakubowski
/doc/user/get_started/get_started_projects.md @lciutacu
/doc/user/gitlab_duo_chat.md @sselhorn @jglassman1
/doc/user/gitlab_duo_chat/ @sselhorn @jglassman1
/doc/user/gitlab_duo_chat_enable.md @sselhorn @jglassman1
/doc/user/gitlab_duo_chat_examples.md @sselhorn @jglassman1
/doc/user/gitlab_duo_chat_troubleshooting.md @sselhorn @jglassman1
@ -968,7 +962,7 @@ lib/gitlab/checks/**
/doc/user/group/custom_project_templates.md @msedlakjakubowski
/doc/user/group/devops_adoption/ @lciutacu
/doc/user/group/epics/ @msedlakjakubowski
/doc/user/group/import/ @eread @ashrafkhamis
/doc/user/group/import/ @eread
/doc/user/group/index.md @lciutacu
/doc/user/group/issues_analytics/ @lciutacu
/doc/user/group/iterations/ @msedlakjakubowski
@ -984,7 +978,7 @@ lib/gitlab/checks/**
/doc/user/group/value_stream_analytics/ @lciutacu
/doc/user/infrastructure/ @phillipwells
/doc/user/infrastructure/clusters/manage/management_project_applications/ @phillipwells
/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md @fneill
/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md @ashrafkhamis
/doc/user/markdown.md @msedlakjakubowski
/doc/user/namespace/ @lciutacu
/doc/user/okrs.md @msedlakjakubowski
@ -1011,18 +1005,18 @@ lib/gitlab/checks/**
/doc/user/project/deploy_boards.md @phillipwells
/doc/user/project/deploy_keys/ @phillipwells
/doc/user/project/deploy_tokens/ @phillipwells
/doc/user/project/import/ @eread @ashrafkhamis
/doc/user/project/import/ @eread
/doc/user/project/import/jira.md @msedlakjakubowski
/doc/user/project/index.md @lciutacu
/doc/user/project/insights/ @lciutacu
/doc/user/project/integrations/ @eread @ashrafkhamis
/doc/user/project/integrations/ @eread
/doc/user/project/integrations/bamboo.md @marcel.amirault @lyspin
/doc/user/project/integrations/beyond_identity.md @msedlakjakubowski
/doc/user/project/integrations/git_guardian.md @msedlakjakubowski
/doc/user/project/integrations/github.md @marcel.amirault @lyspin
/doc/user/project/integrations/google_artifact_management.md @marcel.amirault
/doc/user/project/integrations/harbor.md @marcel.amirault
/doc/user/project/issues/csv_import.md @eread @ashrafkhamis
/doc/user/project/issues/csv_import.md @eread
/doc/user/project/members/ @lciutacu
/doc/user/project/merge_requests/ @aqualls
/doc/user/project/merge_requests/approvals/ @msedlakjakubowski
@ -1044,8 +1038,8 @@ lib/gitlab/checks/**
/doc/user/project/repository/file_finder.md @ashrafkhamis
/doc/user/project/repository/monorepos/ @eread
/doc/user/project/repository/web_editor.md @ashrafkhamis
/doc/user/project/settings/import_export.md @eread @ashrafkhamis
/doc/user/project/settings/import_export_troubleshooting.md @eread @ashrafkhamis
/doc/user/project/settings/import_export.md @eread
/doc/user/project/settings/import_export_troubleshooting.md @eread
/doc/user/project/settings/index.md @lciutacu
/doc/user/project/settings/migrate_projects.md @lciutacu
/doc/user/project/settings/project_access_tokens.md @jglassman1

View File

@ -97,7 +97,6 @@ GraphQL/ExtractType:
- 'ee/app/graphql/types/member_roles/customizable_permission_type.rb'
- 'ee/app/graphql/types/metric_image_type.rb'
- 'ee/app/graphql/types/pipeline_security_report_finding_type.rb'
- 'ee/app/graphql/types/remote_development/workspace_type.rb'
- 'ee/app/graphql/types/requirements_management/requirement_type.rb'
- 'ee/app/graphql/types/security/finding_reports_comparer/report_type.rb'
- 'ee/app/graphql/types/security_report_summary_section_type.rb'

View File

@ -1,6 +0,0 @@
---
# Cop supports --autocorrect.
GraphQL/FieldDefinitions:
Exclude:
- 'app/graphql/types/resolvable_interface.rb'
- 'ee/app/graphql/types/vulnerability_type.rb'

View File

@ -328,8 +328,6 @@ Layout/ClassStructure:
- 'ee/lib/gitlab/vulnerability_scanning/possibly_affected_component.rb'
- 'ee/lib/langsmith/client.rb'
- 'ee/lib/omni_auth/strategies/group_saml.rb'
- 'ee/lib/remote_development/workspaces/reconcile/output/devfile_parser.rb'
- 'ee/lib/remote_development/workspaces/reconcile/output/devfile_parser_v2.rb'
- 'ee/lib/system_check/app/advanced_search_migrations_check.rb'
- 'ee/lib/system_check/geo/license_check.rb'
- 'lib/api/support/git_access_actor.rb'

View File

@ -68,7 +68,6 @@ Layout/LineBreakAfterFinalMixin:
- 'db/post_migrate/20240514081440_swap_vulnerability_occurrence_pipelines_pipeline_id_convert_to_bigint.rb'
- 'ee/app/controllers/explore/dependencies_controller.rb'
- 'ee/app/finders/security/pipeline_vulnerabilities_finder.rb'
- 'ee/app/graphql/resolvers/remote_development/workspaces_for_query_root_resolver.rb'
- 'ee/app/graphql/subscriptions/ai_completion_response.rb'
- 'ee/app/models/approval_project_rules_protected_branch.rb'
- 'ee/app/models/approval_rules/approval_group_rule.rb'
@ -86,8 +85,6 @@ Layout/LineBreakAfterFinalMixin:
- 'ee/app/services/incident_management/oncall_rotations/remove_participant_service.rb'
- 'ee/app/services/llm/generate_description_service.rb'
- 'ee/app/services/product_analytics/initialize_stack_service.rb'
- 'ee/app/services/remote_development/workspaces/update_service.rb'
- 'ee/app/services/vulnerabilities/bulk_dismiss_service.rb'
- 'ee/app/workers/active_user_count_threshold_worker.rb'
- 'ee/app/workers/analytics/cycle_analytics/consistency_worker.rb'
- 'ee/app/workers/analytics/cycle_analytics/incremental_worker.rb'
@ -118,12 +115,6 @@ Layout/LineBreakAfterFinalMixin:
- 'ee/lib/gitlab/llm/chain/tools/explain_code/prompts/anthropic.rb'
- 'ee/lib/gitlab/search/zoekt/client.rb'
- 'ee/lib/gitlab/status_page/storage/s3_multipart_upload.rb'
- 'ee/lib/remote_development/agent_config/main.rb'
- 'ee/lib/remote_development/agent_config/updater.rb'
- 'ee/lib/remote_development/settings/main.rb'
- 'ee/lib/remote_development/workspaces/create/main.rb'
- 'ee/lib/remote_development/workspaces/reconcile/main.rb'
- 'ee/lib/remote_development/workspaces/update/main.rb'
- 'ee/lib/search/zoekt/query.rb'
- 'lib/api/discussions.rb'
- 'lib/api/events.rb'

View File

@ -280,8 +280,6 @@ Layout/LineEndStringConcatenationIndentation:
- 'ee/lib/gitlab/llm/completions/resolve_vulnerability.rb'
- 'ee/lib/gitlab/status_page/storage.rb'
- 'ee/lib/google_cloud/base_client.rb'
- 'ee/lib/remote_development/unmatched_result_error.rb'
- 'ee/lib/remote_development/workspaces/reconcile/input/agent_infos_observer.rb'
- 'ee/lib/security/scan_result_policies/detailed_policy_violation_comment.rb'
- 'ee/lib/security/scan_result_policies/policy_violation_details.rb'
- 'ee/lib/system_check/geo/clocks_synchronization_check.rb'
@ -347,11 +345,7 @@ Layout/LineEndStringConcatenationIndentation:
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/protected_environment_approval_rules_required_approvals_average_metric_spec.rb'
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/protected_environments_required_approvals_average_metric_spec.rb'
- 'ee/spec/lib/gitlab/vulnerability_scanning/security_report_builder_spec.rb'
- 'ee/spec/lib/remote_development/namespace_cluster_agent_mappings/create/main_integration_spec.rb'
- 'ee/spec/lib/remote_development/rd_fast_spec_helper.rb'
- 'ee/spec/lib/remote_development/workspaces/create/devfile_flattener_spec.rb'
- 'ee/spec/lib/remote_development/workspaces/create/workspace_creator_spec.rb'
- 'ee/spec/lib/remote_development/workspaces/reconcile/input/agent_infos_observer_spec.rb'
- 'ee/spec/lib/security/scan_result_policies/detailed_policy_violation_comment_spec.rb'
- 'ee/spec/lib/security/scan_result_policies/policy_violation_details_spec.rb'
- 'ee/spec/mailers/emails/abandoned_trial_notification_spec.rb'
@ -406,8 +400,6 @@ Layout/LineEndStringConcatenationIndentation:
- 'ee/spec/requests/api/graphql/mutations/projects/product_analytics_project_settings_update_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/projects/set_compliance_framework_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/quality_management/test_cases/create_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/remote_development/namespace_cluster_agent_mappings/create_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/remote_development/namespace_cluster_agent_mappings/delete_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/requirements_management/create_requirement_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/security/finding/create_issue_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/users/abuse/namespace_bans/destroy_spec.rb'

View File

@ -58,7 +58,6 @@ Style/HashEachMethods:
- 'ee/lib/gitlab/checks/secrets_check.rb'
- 'ee/lib/gitlab/code_owners/file.rb'
- 'ee/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate.rb'
- 'ee/lib/remote_development/workspaces/create/post_flatten_devfile_validator.rb'
- 'ee/spec/controllers/projects_controller_spec.rb'
- 'ee/spec/factories/vulnerabilities.rb'
- 'ee/spec/factories/vulnerabilities/findings.rb'

View File

@ -58,7 +58,7 @@ export default {
<div class="gl-display-flex gl-align-items-center gl-gap-3">
<gl-badge :variant="badgeVariant" :aria-label="badgeText">
<gl-icon :name="badgeIcon" class="gl-badge-icon" />
<span class="gl-display-none gl-sm-display-block gl-ml-2">{{ badgeText }}</span>
<span class="gl-hidden sm:gl-block gl-ml-2">{{ badgeText }}</span>
</gl-badge>
<gl-avatar :size="48" :src="user.avatarUrl" />
<h1 class="gl-font-size-h-display gl-my-0">

View File

@ -96,13 +96,7 @@ export default {
</script>
<template>
<gl-form
ref="form"
class="gl-sm-display-inline-block"
method="post"
:action="action"
@submit.prevent
>
<gl-form ref="form" class="sm:gl-inline-block" method="post" :action="action" @submit.prevent>
<input type="hidden" name="_method" data-testid="test-2fa-method-field" :value="method" />
<input :value="$options.csrf.token" type="hidden" name="authenticity_token" />

View File

@ -135,9 +135,9 @@ export default {
:size="24"
:src="avatarUrl"
:label="user.name"
class="gl-display-none gl-sm-display-inline-flex gl-mx-1"
class="gl-hidden sm:gl-inline-flex gl-mx-1"
/>
<strong class="author gl-display-inline gl-sm-display-none!">@{{ user.username }}</strong>
<strong class="author gl-inline sm:gl-hidden">@{{ user.username }}</strong>
<gl-tooltip v-if="message" :target="() => $refs[$options.EMOJI_REF]">
{{ message }}
</gl-tooltip>

View File

@ -193,7 +193,7 @@ export default {
<template>
<div class="top-bar gl-display-flex gl-align-items-center gl-justify-content-space-between">
<!-- truncated log information -->
<div class="gl-display-none gl-sm-display-block gl-text-truncate" data-testid="showing-last">
<div class="gl-hidden sm:gl-block gl-text-truncate" data-testid="showing-last">
<template v-if="isJobLogSizeVisible">
{{ jobLogSize }}
<gl-sprintf

View File

@ -24,11 +24,11 @@ export default {
render(h, { props }) {
const { line, path, isHighlighted } = props;
const chars = line.content.map((content) => {
const parts = line.content.map((content) => {
return h(
'span',
{
class: ['gl-white-space-pre-wrap', content.style],
class: [content.style],
},
// Simple "tokenization": Split text in chunks of text
// which alternate between text and urls.
@ -90,7 +90,13 @@ export default {
),
]
: []),
...chars,
h(
'span',
{
class: 'gl-flex-grow-1 gl-white-space-pre-wrap',
},
parts,
),
],
);
},

View File

@ -76,14 +76,11 @@ export default {
<gl-icon :name="iconName" class="arrow gl-absolute gl-top-2" />
<line-number :line-number="line.lineNumber" :path="path" />
<span v-if="line.time" class="job-log-time">{{ line.time }}</span>
<span
v-for="(content, i) in line.content"
:key="i"
class="gl-flex-grow-1 gl-white-space-pre-wrap"
:class="content.style"
>{{ content.text }}</span
>
<span class="gl-flex-grow-1 gl-white-space-pre-wrap">
<span v-for="(content, i) in line.content" :key="i" :class="content.style">{{
content.text
}}</span>
</span>
<duration-badge v-if="duration && !hideDuration" :duration="duration" />
</div>
</template>

View File

@ -52,14 +52,14 @@ export default {
<template>
<div v-if="canUpdate || canDelete">
<!-- sm and up screens -->
<div class="gl-display-none gl-sm-display-flex gl-gap-3">
<div class="gl-hidden sm:gl-flex gl-gap-3">
<runner-edit-button v-if="canUpdate" :href="editPath" />
<runner-pause-button v-if="canUpdate" :runner="runner" />
<runner-delete-button v-if="canDelete" :runner="runner" @deleted="onDeleted" />
</div>
<!-- xs screens -->
<div class="gl-sm-display-none">
<div class="sm:gl-hidden">
<gl-disclosure-dropdown
icon="ellipsis_v"
:toggle-text="s__('Runner|Runner actions')"

View File

@ -153,7 +153,7 @@ export default {
data-testid="bullet-list"
content-type="bulletList"
icon-name="list-bulleted"
class="gl-display-none gl-sm-display-inline"
class="gl-hidden sm:gl-inline"
editor-command="toggleBulletList"
:label="i18n.bulletList"
@execute="trackToolbarControlExecution"
@ -162,7 +162,7 @@ export default {
data-testid="ordered-list"
content-type="orderedList"
icon-name="list-numbered"
class="gl-display-none gl-sm-display-inline"
class="gl-hidden sm:gl-inline"
editor-command="toggleOrderedList"
:label="i18n.numberedList"
@execute="trackToolbarControlExecution"
@ -172,12 +172,12 @@ export default {
data-testid="task-list"
content-type="taskList"
icon-name="list-task"
class="gl-display-none gl-sm-display-inline"
class="gl-hidden sm:gl-inline"
editor-command="toggleTaskList"
:label="i18n.taskList"
@execute="trackToolbarControlExecution"
/>
<div class="gl-display-none gl-sm-display-flex">
<div class="gl-hidden sm:gl-flex">
<header-divider />
</div>
</div>
@ -194,7 +194,7 @@ export default {
data-testid="quick-actions"
content-type="quickAction"
icon-name="quick-actions"
class="gl-display-none gl-sm-display-inline"
class="gl-hidden sm:gl-inline"
editor-command="insertQuickAction"
:label="__('Add a quick action')"
@execute="trackToolbarControlExecution"

View File

@ -25,17 +25,17 @@ export default {
{
text: __('Bullet list'),
action: () => this.insertList('bulletList', 'listItem'),
wrapperClass: 'gl-sm-display-none!',
wrapperClass: 'sm:!gl-hidden',
},
{
text: __('Ordered list'),
action: () => this.insertList('orderedList', 'listItem'),
wrapperClass: 'gl-sm-display-none!',
wrapperClass: 'sm:!gl-hidden',
},
{
text: __('Task list'),
action: () => this.insertList('taskList', 'taskItem'),
wrapperClass: 'gl-sm-display-none!',
wrapperClass: 'sm:!gl-hidden',
},
{
text: __('Horizontal rule'),

View File

@ -1572,7 +1572,7 @@ export default class Notes {
<div class="note-header">
<div class="note-header-info">
<a href="/${escape(currentUsername)}">
<span class="gl-display-none gl-sm-display-inline-block bold">${escape(
<span class="gl-hidden sm:gl-inline-block bold">${escape(
currentUsername,
)}</span>
<span class="note-headline-light">${escape(currentUsername)}</span>
@ -1589,7 +1589,7 @@ export default class Notes {
</li>`,
);
$tempNote.find('.gl-display-none.gl-sm-display-inline-block').text(escape(currentUserFullname));
$tempNote.find('.gl-hidden.sm:gl-inline-block').text(escape(currentUserFullname));
$tempNote.find('.note-headline-light').text(`@${escape(currentUsername)}`);
return $tempNote;

View File

@ -141,7 +141,7 @@ export default {
this.isEditing = true;
},
extraAttrs: {
class: 'gl-sm-display-none!',
class: 'sm:!gl-hidden',
},
},
{
@ -321,7 +321,7 @@ export default {
<gl-button
v-if="isEditingAndHasPermissions"
v-gl-tooltip
class="gl-display-none gl-sm-display-inline-flex!"
class="gl-hidden sm:!gl-flex"
:aria-label="$options.i18n.editCommentLabel"
:title="$options.i18n.editCommentLabel"
category="tertiary"

View File

@ -54,7 +54,7 @@ export default {
class="diff-stats"
:class="{
'is-compare-versions-header gl-hidden lg:gl-inline-flex': isCompareVersionsHeader,
'gl-display-none gl-sm-display-inline-flex': !isCompareVersionsHeader,
'gl-hidden sm:!gl-inline-flex': !isCompareVersionsHeader,
}"
>
<div v-if="notDiffable" :class="fileStats.classes">

View File

@ -28,3 +28,49 @@ export const NEW_NAME_FIELD = 'newName';
export const TARGET_NAMESPACE_FIELD = 'targetNamespace';
export const ROOT_NAMESPACE = { fullPath: '', id: null };
const PLACEHOLDER_STATUS_PENDING_ASSIGNMENT = 'pending_assignment';
const PLACEHOLDER_STATUS_AWAITING_APPROVAL = 'awaiting_approval';
const PLACEHOLDER_STATUS_REJECTED = 'rejected';
const PLACEHOLDER_STATUS_REASSIGNING = 'reassigning'; // backend state still pending
const PLACEHOLDER_STATUS_FAILED = 'failed';
const PLACEHOLDER_STATUS_SAVED = 'saved'; // backend state still pending
const PLACEHOLDER_STATUS_COMPLETED = 'completed';
export const placeholderUserBadges = {
[PLACEHOLDER_STATUS_PENDING_ASSIGNMENT]: {
text: __('Not started'),
variant: 'muted',
tooltip: s__('UserMapping|Reassignment has not started.'),
},
[PLACEHOLDER_STATUS_AWAITING_APPROVAL]: {
text: s__('UserMapping|Pending approval'),
variant: 'warning',
tooltip: s__('UserMapping|Reassignment waiting on user approval.'),
},
[PLACEHOLDER_STATUS_REJECTED]: {
text: s__('UserMapping|Rejected'),
variant: 'danger',
tooltip: s__('UserMapping|Reassignment was rejected by user.'),
},
[PLACEHOLDER_STATUS_REASSIGNING]: {
text: s__('UserMapping|Reassigning'),
variant: 'info',
tooltip: s__('UserMapping|Reassignment in progress.'),
},
[PLACEHOLDER_STATUS_FAILED]: {
text: __('Failed'),
variant: 'danger',
tooltip: s__('UserMapping|Reassignment failed.'),
},
[PLACEHOLDER_STATUS_SAVED]: {
text: s__('UserMapping|Kept as placeholder'),
variant: 'success',
tooltip: s__('UserMapping|Placeholder user was made permanent.'),
},
[PLACEHOLDER_STATUS_COMPLETED]: {
text: __('Success'),
variant: 'success',
tooltip: s__('UserMapping|Reassignment succeeded.'),
},
};

View File

@ -93,6 +93,6 @@ export default {
<template>
<gl-badge :variant="badgeProperties.variant" :aria-label="badgeProperties.text">
<gl-icon :name="badgeProperties.icon" />
<span class="gl-display-none gl-sm-display-block gl-ml-2">{{ badgeProperties.text }}</span>
<span class="gl-hidden sm:gl-block gl-ml-2">{{ badgeProperties.text }}</span>
</gl-badge>
</template>

View File

@ -24,7 +24,7 @@ export default {
<li
v-if="issue.upvotes"
v-gl-tooltip
class="gl-hidden gl-sm-display-block"
class="gl-hidden sm:gl-block"
:title="$options.i18n.upvotes"
data-testid="issuable-upvotes"
>
@ -34,7 +34,7 @@ export default {
<li
v-if="issue.downvotes"
v-gl-tooltip
class="gl-hidden gl-sm-display-block"
class="gl-hidden sm:gl-block"
:title="$options.i18n.downvotes"
data-testid="issuable-downvotes"
>
@ -44,7 +44,7 @@ export default {
<li
v-if="issue.mergeRequestsCount"
v-gl-tooltip
class="gl-hidden gl-sm-display-block"
class="gl-hidden sm:gl-block"
:title="__('Related merge requests')"
data-testid="merge-requests"
>

View File

@ -38,7 +38,7 @@ export default {
<template>
<div class="gl-border-b gl-pb-3 gl-display-flex gl-align-items-flex-start">
<!-- eslint-disable @gitlab/vue-require-i18n-attribute-strings -->
<img :src="serviceDeskCalloutSvgPath" alt="" class="gl-hidden gl-sm-display-block gl-p-5" />
<img :src="serviceDeskCalloutSvgPath" alt="" class="gl-hidden sm:gl-block gl-p-5" />
<!-- eslint-enable @gitlab/vue-require-i18n-attribute-strings -->
<div class="gl-mt-3 gl-ml-3">
<h5>{{ $options.i18n.infoBannerTitle }}</h5>

View File

@ -87,7 +87,7 @@ export default {
>
<gl-badge :variant="statusVariant">
<gl-icon :name="statusIcon" />
<span class="gl-hidden gl-sm-display-block gl-ml-2">{{ statusText }}</span>
<span class="gl-hidden sm:gl-block gl-ml-2">{{ statusText }}</span>
</gl-badge>
<confidentiality-badge
v-if="isConfidential"

View File

@ -1,6 +1,6 @@
<script>
import { GlBadge, GlTab, GlTabs } from '@gitlab/ui';
import { s__ } from '~/locale';
import PlaceholdersTable from './placeholders_table.vue';
export default {
name: 'PlaceholdersTabApp',
@ -8,22 +8,18 @@ export default {
GlBadge,
GlTab,
GlTabs,
PlaceholdersTable,
},
TABS: [
{
title: s__('UserMapping|Awaiting reassignment'),
},
{
title: s__('UserMapping|Reassigned'),
},
],
data() {
return {
selectedTabIndex: 0,
};
},
methods: {
computed: {
tabCount() {
// WIP: https://gitlab.com/groups/gitlab-org/-/epics/12378
return 0;
},
},
@ -32,11 +28,22 @@ export default {
<template>
<gl-tabs v-model="selectedTabIndex" class="gl-mt-3">
<gl-tab v-for="(tab, index) in $options.TABS" :key="index">
<gl-tab>
<template #title>
<span>{{ tab.title }}</span>
<gl-badge size="sm" class="gl-tab-counter-badge">{{ tabCount() }}</gl-badge>
<span>{{ s__('UserMapping|Awaiting reassignment') }}</span>
<gl-badge size="sm" class="gl-tab-counter-badge">{{ tabCount }}</gl-badge>
</template>
<placeholders-table key="unassigned" />
</gl-tab>
<gl-tab>
<template #title>
<span>{{ s__('UserMapping|Reassigned') }}</span>
<gl-badge size="sm" class="gl-tab-counter-badge">{{ tabCount }}</gl-badge>
</template>
<placeholders-table key="assigned" reassigned />
</gl-tab>
</gl-tabs>
</template>

View File

@ -0,0 +1,89 @@
<script>
import { GlAvatarLabeled, GlBadge, GlTableLite, GlTooltipDirective } from '@gitlab/ui';
import { s__ } from '~/locale';
import { placeholderUserBadges } from '~/import_entities/import_groups/constants';
export default {
name: 'PlaceholdersTable',
components: {
GlAvatarLabeled,
GlBadge,
GlTableLite,
},
directives: {
GlTooltip: GlTooltipDirective,
},
props: {
items: {
type: Array,
required: false,
default: () => [],
},
reassigned: {
type: Boolean,
required: false,
default: false,
},
},
computed: {
fields() {
return [
{
key: 'user',
label: s__('UserMapping|Placeholder user'),
},
{
key: 'source',
label: s__('BulkImport|Source'),
},
{
key: 'status',
label: s__('UserMapping|Reassignment status'),
},
{
key: 'actions',
label: this.reassigned
? s__('UserMapping|Reassigned to')
: s__('UserMapping|Reassign placeholder to'),
thClass: 'gl-w-4/10',
},
];
},
},
methods: {
statusBadge(item) {
return placeholderUserBadges[item.status];
},
},
};
</script>
<template>
<gl-table-lite :items="items" :fields="fields">
<template #cell(user)="{ item }">
<gl-avatar-labeled
:size="32"
:src="item.avatar_url"
:label="item.name"
:sub-label="item.username"
/>
</template>
<template #cell(source)="{ item }">
<div>{{ item.source_hostname }}</div>
<div class="gl-mt-2">{{ item.source_username }}</div>
</template>
<template #cell(status)="{ item }">
<gl-badge
v-gl-tooltip="statusBadge(item).tooltip"
:variant="statusBadge(item).variant"
tabindex="0"
>{{ statusBadge(item).text }}</gl-badge
>
</template>
</gl-table-lite>
</template>

View File

@ -24,7 +24,7 @@ export default {
<li
v-if="mergeRequest.upvotes"
v-gl-tooltip
class="gl-display-none gl-sm-display-block"
class="gl-hidden sm:gl-block"
:title="$options.i18n.upvotes"
data-testid="issuable-upvotes"
>
@ -34,7 +34,7 @@ export default {
<li
v-if="mergeRequest.downvotes"
v-gl-tooltip
class="gl-display-none gl-sm-display-block"
class="gl-hidden sm:gl-block"
:title="$options.i18n.downvotes"
data-testid="issuable-downvotes"
>

View File

@ -77,7 +77,7 @@ export default {
text: this.$options.i18n.close,
href: this.closeUrl,
extraAttrs: {
class: { 'gl-sm-display-none!': this.isDetailPage },
class: { 'sm:!gl-hidden': this.isDetailPage },
'data-testid': 'milestone-close-item',
'data-method': 'put',
rel: 'nofollow',
@ -89,7 +89,7 @@ export default {
text: this.$options.i18n.reopen,
href: this.reopenUrl,
extraAttrs: {
class: { 'gl-sm-display-none!': this.isDetailPage },
class: { 'sm:!gl-hidden': this.isDetailPage },
'data-testid': 'milestone-reopen-item',
'data-method': 'put',
rel: 'nofollow',

View File

@ -272,7 +272,7 @@ export default {
<user-access-role-badge
v-if="isAuthor"
v-gl-tooltip
class="gl-mr-3 gl-display-none gl-sm-display-block"
class="gl-mr-3 gl-hidden sm:gl-block"
:title="displayAuthorBadgeText"
>
{{ __('Author') }}
@ -280,7 +280,7 @@ export default {
<user-access-role-badge
v-if="accessLevel"
v-gl-tooltip
class="gl-mr-3 gl-display-none gl-sm-display-block"
class="gl-mr-3 gl-hidden sm:gl-block"
:title="displayMemberBadgeText"
>
{{ accessLevel }}
@ -288,7 +288,7 @@ export default {
<user-access-role-badge
v-else-if="isContributor"
v-gl-tooltip
class="gl-mr-3 gl-display-none gl-sm-display-block"
class="gl-mr-3 gl-hidden sm:gl-block"
:title="displayContributorBadgeText"
>
{{ __('Contributor') }}

View File

@ -113,7 +113,7 @@ export default {
<div class="gl-display-flex">
<span>{{ packageEntity.version }}</span>
<div v-if="hasPipeline" class="gl-display-none gl-sm-display-flex gl-ml-2">
<div v-if="hasPipeline" class="gl-hidden sm:g-flex gl-ml-2">
<gl-sprintf :message="s__('PackageRegistry|published by %{author}')">
<template #author>{{ packageEntity.pipeline.user.name }}</template>
</gl-sprintf>

View File

@ -21,7 +21,7 @@ export default {
<template>
<div>
<div class="gl-flex-direction-column gl-sm-display-none" data-testid="mobile-loader">
<div class="gl-flex-direction-column sm:gl-hidden" data-testid="mobile-loader">
<gl-skeleton-loader
v-for="index in $options.rowsToRender.mobile"
:key="index"
@ -36,10 +36,7 @@ export default {
<rect width="500" height="10" x="0" y="135" rx="4" />
</gl-skeleton-loader>
</div>
<div
class="gl-display-none gl-sm-display-flex gl-flex-direction-column"
data-testid="desktop-loader"
>
<div class="gl-hidden sm:gl-flex gl-flex-direction-column" data-testid="desktop-loader">
<gl-skeleton-loader
v-for="index in $options.rowsToRender.desktop"
:key="index"

View File

@ -43,7 +43,7 @@ export default {
<h2 class="gl-font-base gl-mt-0">
{{ revisionText }}
</h2>
<div class="gl-sm-display-flex gl-align-items-center gl-gap-3">
<div class="sm:gl-flex gl-align-items-center gl-gap-3">
<repo-dropdown
class="gl-sm-w-half"
:params-name="paramsName"

View File

@ -287,7 +287,7 @@ export default {
</script>
<template>
<div class="info-well gl-sm-display-flex gl-flex-direction-column">
<div class="info-well sm:gl-flex gl-flex-direction-column">
<div class="well-segment gl-p-5 gl-w-full gl-display-flex">
<gl-icon name="fork" :size="16" class="gl-display-block gl-m-4 gl-text-center" />
<div
@ -315,7 +315,7 @@ export default {
>
{{ $options.i18n.inaccessibleProject }}
</div>
<div class="gl-display-none gl-sm-display-flex">
<div class="gl-hidden sm:gl-flex">
<gl-button
v-if="hasCreateMrButton"
class="gl-ml-4"

View File

@ -158,7 +158,7 @@ export default {
<template v-if="isLoading">
<tr v-for="i in 5" :key="i" aria-hidden="true">
<td><gl-skeleton-loader :lines="1" /></td>
<td class="gl-display-none gl-sm-display-block">
<td class="gl-hidden sm:gl-block">
<gl-skeleton-loader :lines="1" />
</td>
<td>

View File

@ -193,7 +193,7 @@ export default {
v-gl-tooltip.hover
:title="$options.i18n.label"
:aria-label="$options.i18n.label"
class="gl-sm-display-block gl-display-none gl-ml-2"
class="gl-hidden sm:gl-block gl-ml-2"
:class="regexButtonHighlightClass"
category="secondary"
variant="default"

View File

@ -106,7 +106,7 @@ export default {
? __('Snippets with non-text files can only be edited via Git.')
: undefined,
extraAttrs: {
class: 'gl-sm-display-none!',
class: 'sm:!gl-hidden',
},
};
},
@ -285,7 +285,7 @@ export default {
:href="editItem.href"
:title="editItem.title"
:disabled="editItem.disabled"
class="gl-display-none gl-sm-display-inline-block"
class="gl-hidden sm:gl-inline-block"
data-testid="snippet-action-button"
:data-qa-action="editItem.text"
>
@ -311,7 +311,7 @@ export default {
<template #toggle>
<div class="gl-w-full gl-min-h-7">
<gl-button
class="gl-sm-display-none! gl-new-dropdown-toggle gl-w-full"
class="sm:!gl-hidden gl-new-dropdown-toggle gl-w-full"
button-text-classes="gl-flex gl-justify-content-space-between gl-w-full"
category="secondary"
tabindex="0"
@ -321,7 +321,7 @@ export default {
</gl-button>
<gl-button
v-gl-tooltip="showDropdownTooltip"
class="gl-hidden sm:gl-flex gl-new-dropdown-toggle gl-new-dropdown-icon-only gl-new-dropdown-toggle-no-caret"
class="gl-hidden sm:!gl-flex gl-new-dropdown-toggle gl-new-dropdown-icon-only gl-new-dropdown-toggle-no-caret"
category="tertiary"
icon="ellipsis_v"
:aria-label="$options.i18n.snippetAction"

View File

@ -23,7 +23,7 @@ export default {
<slot></slot>
</span>
<span
class="show-hover-layover-hint gl-opacity-0 gl-justify-content-end gl-align-items-center gl-display-none gl-sm-display-flex"
class="show-hover-layover-hint gl-opacity-0 gl-justify-content-end gl-align-items-center gl-hidden sm:gl-flex"
>
<span class="gl-text-gray-700 gl-whitespace-nowrap" data-testid="overlay-message">
<gl-sprintf :message="textMessage">

View File

@ -31,7 +31,7 @@ export default {
},
confidentialTextClass() {
return {
'gl-display-none gl-sm-display-block': this.hideTextInSmallScreens,
'gl-hidden sm:gl-block': this.hideTextInSmallScreens,
'gl-ml-2': true,
};
},

View File

@ -239,7 +239,7 @@ export default {
<template #toggle>
<div class="gl-min-h-7 gl-mb-2 gl-sm-mb-0!">
<gl-button
class="gl-sm-display-none! gl-new-dropdown-toggle gl-w-full"
class="sm:!gl-hidden gl-new-dropdown-toggle gl-w-full"
button-text-classes="gl-display-flex gl-justify-content-space-between gl-w-full"
category="secondary"
tabindex="0"
@ -249,7 +249,7 @@ export default {
<gl-icon class="dropdown-chevron" name="chevron-down" />
</gl-button>
<gl-button
class="gl-display-none gl-sm-display-flex! gl-new-dropdown-toggle gl-new-dropdown-icon-only gl-new-dropdown-toggle-no-caret"
class="gl-hidden sm:!gl-flex gl-new-dropdown-toggle gl-new-dropdown-icon-only gl-new-dropdown-toggle-no-caret"
category="tertiary"
icon="ellipsis_v"
tabindex="0"
@ -275,7 +275,7 @@ export default {
>
<gl-disclosure-dropdown-item
v-if="canUpdateMergeRequest"
class="gl-sm-display-none!"
class="sm:!gl-hidden"
data-testid="edit-merge-request"
:item="editItem"
/>

View File

@ -85,9 +85,7 @@ export default {
<div class="note-header">
<div class="note-header-info">
<a :href="getUserData.path">
<span class="gl-display-none gl-sm-display-inline-block bold">{{
getUserData.name
}}</span>
<span class="gl-hidden sm:gl-inline-block bold">{{ getUserData.name }}</span>
<span class="note-headline-light">@{{ getUserData.username }}</span>
</a>
</div>

View File

@ -88,7 +88,7 @@ export default {
:selected="isDetailsShown"
icon="ellipsis_h"
size="small"
class="gl-ml-2 gl-display-none gl-sm-display-block"
class="gl-ml-2 gl-hidden sm:gl-block"
:title="$options.i18n.toggleDetailsLabel"
:aria-label="$options.i18n.toggleDetailsLabel"
:aria-expanded="isDetailsShown"

View File

@ -109,7 +109,7 @@ export default {
</h5>
<gl-collapsible-listbox v-model="selectedArchName" class="gl-mb-3" :items="listboxItems" />
<div class="gl-sm-display-flex gl-align-items-center gl-mb-3">
<div class="sm:gl-flex gl-align-items-center gl-mb-3">
<h5>{{ $options.i18n.downloadInstallBinary }}</h5>
<gl-button
v-if="binaryUrl"

View File

@ -300,7 +300,7 @@ export default {
<slot v-if="hasSlotContents('title-icons')" name="title-icons"></slot>
<span
v-if="taskStatus"
class="task-status gl-display-none gl-sm-display-inline-block! gl-ml-2 gl-font-sm"
class="task-status gl-hidden sm:!gl-inline-block gl-ml-2 gl-font-sm"
data-testid="task-status"
>
{{ taskStatus }}
@ -311,7 +311,7 @@ export default {
<span v-else data-testid="issuable-reference" class="issuable-reference">
{{ reference }}
</span>
<span class="gl-display-none gl-sm-display-inline">
<span class="gl-hidden sm:gl-inline">
<span aria-hidden="true">&middot;</span>
<span class="issuable-authored gl-mr-3">
<gl-sprintf v-if="author.name" :message="__('created %{timeAgo} by %{author}')">
@ -395,7 +395,7 @@ export default {
</li>
<li
v-if="showDiscussions && notesCount"
class="gl-display-none gl-sm-display-block gl-mr-0!"
class="gl-hidden sm:gl-block gl-mr-0!"
data-testid="issuable-comments"
>
<div
@ -411,7 +411,7 @@ export default {
</ul>
<div
v-gl-tooltip.bottom
class="gl-text-gray-500 gl-display-none gl-sm-display-inline-block"
class="gl-text-gray-500 gl-hidden sm:gl-inline-block"
:title="tooltipTitle(timestamp)"
data-testid="issuable-timestamp"
>

View File

@ -166,7 +166,7 @@ export default {
<div class="detail-page-header-body gl-flex-wrap gl-gap-x-2">
<gl-badge :variant="badgeVariant" data-testid="issue-state-badge">
<gl-icon v-if="statusIcon" :name="statusIcon" :class="statusIconClass" />
<span class="gl-display-none gl-sm-display-block" :class="{ 'gl-ml-2': statusIcon }">
<span class="gl-hidden sm:gl-block" :class="{ 'gl-ml-2': statusIcon }">
<slot name="status-badge">{{ badgeText }}</slot>
</span>
</gl-badge>
@ -193,7 +193,7 @@ export default {
</template>
<template #author>
<gl-link class="gl-font-bold js-user-link" :href="author.webUrl" :data-user-id="authorId">
<span :class="[{ 'gl-display-none': !isAuthorExternal }, 'gl-sm-display-inline']">
<span :class="[{ 'gl-hidden': !isAuthorExternal }, 'sm:gl-inline']">
{{ author.name }}
</span>
<gl-icon
@ -201,7 +201,7 @@ export default {
name="external-link"
:aria-label="__('external link')"
/>
<strong v-if="author.username" class="author gl-display-inline gl-sm-display-none!"
<strong v-if="author.username" class="author gl-inline sm:!gl-hidden"
>@{{ author.username }}</strong
>
</gl-link>
@ -221,7 +221,7 @@ export default {
>
<gl-button
icon="chevron-double-lg-left"
class="gl-ml-auto gl-display-block gl-sm-display-none! js-sidebar-toggle"
class="gl-ml-auto gl-block sm:!gl-hidden js-sidebar-toggle"
:aria-label="__('Expand sidebar')"
@click="handleRightSidebarToggleClick"
/>

View File

@ -95,8 +95,8 @@ export default {
class="gl-whitespace-nowrap gl-mr-3 gl-align-self-center"
:variant="badgeVariant"
>
<gl-icon v-if="statusIcon" class="gl-sm-display-none" :name="statusIcon" />
<span class="gl-display-none gl-sm-display-block">
<gl-icon v-if="statusIcon" class="sm:gl-hidden" :name="statusIcon" />
<span class="gl-hidden sm:gl-block">
<slot name="status-badge"></slot>
</span>
</gl-badge>

View File

@ -176,7 +176,7 @@ export default {
v-if="isWorkItemAuthor"
v-gl-tooltip
:title="displayAuthorBadgeText"
class="gl-mr-3 gl-display-none gl-sm-display-block"
class="gl-mr-3 gl-hidden sm:gl-block"
data-testid="author-badge"
>
{{ __('Author') }}
@ -184,7 +184,7 @@ export default {
<user-access-role-badge
v-if="maxAccessLevelOfAuthor"
v-gl-tooltip
class="gl-mr-3 gl-display-none gl-sm-display-block"
class="gl-mr-3 gl-hidden sm:gl-block"
:title="displayMemberBadgeText"
data-testid="max-access-level-badge"
>
@ -193,7 +193,7 @@ export default {
<user-access-role-badge
v-else-if="isAuthorContributor"
v-gl-tooltip
class="gl-mr-3 gl-display-none gl-sm-display-block"
class="gl-mr-3 gl-hidden sm:gl-block"
:title="displayContributorBadgeText"
data-testid="contributor-badge"
>

View File

@ -134,7 +134,7 @@ export default {
<span
v-if="updatedAt"
class="gl-ml-5 gl-display-none gl-sm-display-inline-block gl-align-middle"
class="gl-ml-5 gl-hidden sm:gl-inline-block gl-align-middle"
data-testid="work-item-updated"
>
<gl-sprintf :message="__('Updated %{timeAgo}')">

View File

@ -269,16 +269,16 @@ export default {
},
titleClassHeader() {
return {
'gl-sm-display-none! gl-mt-3': this.parentWorkItem,
'gl-sm-display-block!': !this.parentWorkItem,
'sm:!gl-hidden gl-mt-3': this.parentWorkItem,
'sm:!gl-block': !this.parentWorkItem,
'gl-w-full': !this.parentWorkItem && !this.editMode,
'editable-wi-title': this.editMode && !this.parentWorkItem,
};
},
titleClassComponent() {
return {
'gl-sm-display-block!': !this.parentWorkItem,
'gl-display-none gl-sm-display-block! gl-mt-3': this.parentWorkItem,
'sm:!gl-block': !this.parentWorkItem,
'gl-display-none sm:!gl-block gl-mt-3': this.parentWorkItem,
'editable-wi-title': this.workItemsMvc2Enabled,
};
},
@ -494,7 +494,7 @@ export default {
/>
<div v-else data-testid="detail-wrapper">
<div
class="gl-display-block gl-sm-display-flex! gl-align-items-flex-start gl-flex-direction-row gl-gap-3 gl-pt-3"
class="gl-block sm:!gl-flex gl-align-items-flex-start gl-flex-direction-row gl-gap-3 gl-pt-3"
>
<work-item-ancestors v-if="parentWorkItem" :work-item="workItem" class="gl-mb-1" />
<div v-if="!error" :class="titleClassHeader" data-testid="work-item-type">
@ -560,7 +560,7 @@ export default {
</div>
<gl-button
v-if="isModal"
class="gl-display-none gl-sm-display-block!"
class="gl-display-none sm:!gl-block"
category="tertiary"
data-testid="work-item-close"
icon="close"

View File

@ -34,6 +34,6 @@ export default {
<template>
<gl-badge :variant="workItemStateVariant" class="gl-align-middle">
<gl-icon :name="workItemStateIcon" :size="16" />
<span class="gl-display-none gl-sm-display-block gl-ml-2">{{ stateText }}</span>
<span class="gl-hidden sm:gl-block gl-ml-2">{{ stateText }}</span>
</gl-badge>
</template>

View File

@ -2,7 +2,7 @@
%section.gl-display-flex.gl-empty-state{ **@empty_state_options, class: empty_state_class }
- if @svg_path.present?
- image_class = @compact ? 'gl-display-none gl-sm-display-block gl-px-4' : 'gl-max-w-full'
- image_class = @compact ? 'gl-hidden sm:gl-block gl-px-4' : 'gl-max-w-full'
%div{ class: image_class }
= image_tag @svg_path, alt: "", class: 'gl-dark-invert-keep-hue'

View File

@ -10,19 +10,21 @@ module Types
null: true,
description: 'User who resolved the object.'
field :resolved, GraphQL::Types::Boolean, null: false,
description: 'Indicates if the object is resolved.',
method: :resolved?
field :resolvable, GraphQL::Types::Boolean, null: false,
description: 'Indicates if the object can be resolved.',
method: :resolvable?
field :resolved_at, Types::TimeType, null: true,
description: 'Timestamp of when the object was resolved.'
def resolved_by
return unless object.resolved_by_id
Gitlab::Graphql::Loaders::BatchModelLoader.new(User, object.resolved_by_id).find
end
field :resolved, GraphQL::Types::Boolean, null: false,
description: 'Indicates if the object is resolved.',
method: :resolved?
field :resolvable, GraphQL::Types::Boolean, null: false,
description: 'Indicates if the object can be resolved.',
method: :resolvable?
field :resolved_at, Types::TimeType, null: true,
description: 'Timestamp of when the object was resolved.'
end
end

View File

@ -57,7 +57,7 @@ module AvatarsHelper
end
def author_avatar(commit_or_event, options = {})
options[:css_class] ||= "gl-display-none gl-sm-display-inline-block"
options[:css_class] ||= "gl-hidden sm:gl-inline-block"
if Feature.enabled?(:cached_author_avatar_helper, options.delete(:project))
Gitlab::AvatarCache.by_email(commit_or_event.author_email, commit_or_event.author_name, options) do

View File

@ -22,7 +22,7 @@ module CommitsHelper
user: committer,
user_name: committer.name,
user_email: committer.email,
css_class: 'gl-display-none gl-sm-display-inline-block float-none gl-mr-0! gl-vertical-align-text-bottom'
css_class: 'gl-hidden sm:gl-inline-block float-none gl-mr-0! gl-vertical-align-text-bottom'
}))
end

View File

@ -129,7 +129,7 @@ module IssuablesHelper
count = issuables_count_for_state(issuable_type, state)
if count != -1
html << " " << gl_badge_tag(format_count(issuable_type, count, Gitlab::IssuablesCountForState::THRESHOLD), { variant: :muted, size: :sm }, { class: "gl-tab-counter-badge gl-display-none gl-sm-display-inline-flex" })
html << " " << gl_badge_tag(format_count(issuable_type, count, Gitlab::IssuablesCountForState::THRESHOLD), { variant: :muted, size: :sm }, { class: "gl-tab-counter-badge gl-hidden sm:gl-inline-flex" })
end
html.html_safe

View File

@ -30,7 +30,7 @@ module ProfilesHelper
def middle_dot_divider_classes(stacking, breakpoint)
['gl-mb-3'].tap do |classes|
if stacking
classes.concat(%w[middle-dot-divider-sm gl-display-block gl-sm-display-inline-block])
classes.concat(%w[middle-dot-divider-sm gl-block sm:gl-inline-block])
else
classes << 'gl-display-inline-block'
classes << if breakpoint.nil?

View File

@ -0,0 +1,11 @@
# frozen_string_literal: true
module AuditEvents
class GroupAuditEvent < ApplicationRecord
self.table_name = "group_audit_events"
include PartitionedTable
self.primary_key = :id
partitioned_by :created_at, strategy: :monthly
end
end

View File

@ -0,0 +1,11 @@
# frozen_string_literal: true
module AuditEvents
class InstanceAuditEvent < ApplicationRecord
self.table_name = "instance_audit_events"
include PartitionedTable
self.primary_key = :id
partitioned_by :created_at, strategy: :monthly
end
end

View File

@ -0,0 +1,11 @@
# frozen_string_literal: true
module AuditEvents
class ProjectAuditEvent < ApplicationRecord
self.table_name = "project_audit_events"
include PartitionedTable
self.primary_key = :id
partitioned_by :created_at, strategy: :monthly
end
end

View File

@ -0,0 +1,11 @@
# frozen_string_literal: true
module AuditEvents
class UserAuditEvent < ApplicationRecord
self.table_name = "user_audit_events"
include PartitionedTable
self.primary_key = :id
partitioned_by :created_at, strategy: :monthly
end
end

View File

@ -12,7 +12,7 @@
.description
= markdown_field(group, :description)
.stats.gl-text-gray-500.gl-flex-shrink-0.gl-display-none.gl-sm-display-flex
.stats.gl-text-gray-500.gl-flex-shrink-0.gl-hidden.sm:gl-flex
= gl_badge_tag storage_counter(group.storage_size), size: :sm
= render_if_exists 'admin/namespace_plan_badge', namespace: group, css_class: 'gl-ml-5 gl-mr-0'

View File

@ -19,7 +19,7 @@
.description
= markdown_field(project, :description)
= render_if_exists 'shared/projects/badges', project: project, css_class: 'gl-mr-3'
.stats.gl-text-gray-500.gl-flex-shrink-0.gl-display-none.gl-sm-display-flex
.stats.gl-text-gray-500.gl-flex-shrink-0.gl-hidden.sm:gl-flex
= gl_badge_tag storage_counter(project.statistics&.storage_size)
.controls.gl-flex-shrink-0.gl-ml-5

View File

@ -10,7 +10,7 @@
%div
= topic.name
.stats.gl-text-gray-500.gl-flex-shrink-0.gl-display-none.gl-sm-display-flex
.stats.gl-text-gray-500.gl-flex-shrink-0.gl-hidden.sm:gl-flex
%span.gl-ml-5.has-tooltip{ title: n_('%d project', '%d projects', topic.total_projects_count) % topic.total_projects_count }
= sprite_icon('bookmark', css_class: 'gl-vertical-align-text-bottom')
= number_with_delimiter(topic.total_projects_count)

View File

@ -1,7 +1,7 @@
.nav-block.activities
= render 'shared/event_filter'
.controls
= render Pajamas::ButtonComponent.new(href: dashboard_projects_path(rss_url_options), icon: 'rss', button_options: { title: _('Subscribe'), aria: { label: _('Subscribe') }, class: 'gl-display-none gl-sm-display-inline-flex' })
= render Pajamas::ButtonComponent.new(href: dashboard_projects_path(rss_url_options), icon: 'rss', button_options: { title: _('Subscribe'), aria: { label: _('Subscribe') }, class: 'gl-hidden sm:gl-inline-flex' })
.content_list
.loading

View File

@ -21,7 +21,7 @@
= _("(removed)")
.todo-body.gl-mb-2.gl-px-2.gl-display-flex.gl-align-items-flex-start
.todo-avatar.gl-display-none.gl-sm-display-inline-block
.todo-avatar.gl-hidden.sm:gl-inline-block
= author_avatar(todo, size: 24)
.todo-note
- if todo_author_display?(todo)

View File

@ -38,7 +38,7 @@
= render 'shared/projects/badges', project: project, css_class: 'gl-mr-3'
.stats.gl-text-gray-500.gl-flex-shrink-0.gl-display-none.gl-sm-display-flex.gl-gap-3
.stats.gl-text-gray-500.gl-flex-shrink-0.gl-hidden.sm:gl-flex.gl-gap-3
= gl_badge_tag storage_counter(project.statistics&.storage_size)
.controls.gl-flex-shrink-0.gl-ml-5
= render Pajamas::ButtonComponent.new(href: project_project_members_path(project),

View File

@ -9,7 +9,7 @@
.nav-block.gl-display-flex.gl-flex-direction-column.gl-sm-flex-direction-row.gl-align-items-stretch
= render 'projects/tree/tree_header', tree: @tree
.info-well.gl-display-none.gl-sm-display-flex.project-last-commit.gl-flex-direction-column.gl-mt-5
.info-well.gl-hidden.sm:gl-flex.project-last-commit.gl-flex-direction-column.gl-mt-5
#js-last-commit.gl-m-auto{ data: {ref_type: @ref_type.to_s} }
= gl_loading_icon(size: 'md')
- if project.licensed_feature_available?(:code_owners)

View File

@ -10,27 +10,27 @@
= link_to issue.title, issue_path(issue), class: 'js-prefetch-document'
= render_if_exists 'projects/issues/subepic_flag', issue: issue
- if issue.tasks?
%span.task-status.gl-display-none.gl-sm-display-inline-block
%span.task-status.gl-hidden.sm:gl-inline-block
&nbsp;
= issue.task_status
.issuable-info
%span.issuable-reference
#{issuable_reference(issue)}
%span.issuable-authored.gl-display-none.gl-sm-display-inline-block
%span.issuable-authored.gl-hidden.sm:gl-inline-block
&middot;
- if issue.service_desk_reply_to
#{_('created %{timeAgoString} by %{email} via %{user}').html_safe % { timeAgoString: time_ago_with_tooltip(issue.created_at, placement: 'bottom'), email: issue.present(current_user: current_user).service_desk_reply_to, user: link_to_member(@project, issue.author, avatar: false) }}
- else
#{s_('IssueList|created %{timeAgoString} by %{user}').html_safe % { timeAgoString: time_ago_with_tooltip(issue.created_at, placement: 'bottom'), user: link_to_member(@project, issue.author, avatar: false) }}
- if issue.milestone
%span.issuable-milestone.gl-display-none.gl-sm-display-inline-block
%span.issuable-milestone.gl-hidden.sm:gl-inline-block
&nbsp;
= link_to project_issues_path(issue.project, milestone_title: issue.milestone.title), data: { html: 'true', toggle: 'tooltip', title: milestone_tooltip_due_date(issue.milestone) } do
= sprite_icon('milestone', css_class: 'gl-vertical-align-text-bottom')
= issue.milestone.title
- if issue.due_date
%span.issuable-due-date.gl-display-none.gl-sm-display-inline-block.has-tooltip{ class: "#{'cred' if issue.overdue? && !issue.closed?}", title: _('Due date') }
%span.issuable-due-date.gl-hidden.sm:gl-inline-block.has-tooltip{ class: "#{'cred' if issue.overdue? && !issue.closed?}", title: _('Due date') }
&nbsp;
= sprite_icon('calendar')
= issue.due_date.to_fs(:medium)
@ -59,7 +59,7 @@
= render 'shared/issuable_meta_data', issuable: issue
.gl-float-right.issuable-timestamp.gl-display-none.gl-sm-display-inline-block
.gl-float-right.issuable-timestamp.gl-hidden.sm:gl-inline-block
%span
- if issue.closed? && issue.closed_at
= _('closed %{timeago}').html_safe % { timeago: time_ago_with_tooltip(issue.closed_at, placement: 'bottom') }

View File

@ -1,7 +1,7 @@
- issue = local_assigns.fetch(:issue)
- if issue.time_estimate > 0
%span.issuable-estimate.gl-display-none.gl-sm-display-inline-block.has-tooltip{ data: { container: 'body' }, title: _('Estimate') }
%span.issuable-estimate.gl-hidden.sm:gl-inline-block.has-tooltip{ data: { container: 'body' }, title: _('Estimate') }
&nbsp;
= sprite_icon('timer', css_class: 'issue-estimate-icon')
= Gitlab::TimeTrackingFormatter.output(issue.time_estimate)

View File

@ -15,11 +15,11 @@
= link_button_to _('Expand all'), url_for(safe_params.merge(expanded: 1, format: nil))
- if show_whitespace_toggle
- if current_controller?(:commit)
= commit_diff_whitespace_link(diffs.project, @commit, class: 'gl-display-none gl-sm-display-inline-block')
= commit_diff_whitespace_link(diffs.project, @commit, class: 'gl-hidden sm:gl-inline-block')
- elsif current_controller?(:compare)
= diff_compare_whitespace_link(diffs.project, params[:from], params[:to], class: 'gl-display-none gl-sm-display-inline-block')
= diff_compare_whitespace_link(diffs.project, params[:from], params[:to], class: 'gl-hidden sm:gl-inline-block')
- elsif current_controller?(:wikis)
= toggle_whitespace_link(url_for(params_with_whitespace), class: 'gl-display-none gl-sm-display-inline-block')
= toggle_whitespace_link(url_for(params_with_whitespace), class: 'gl-hidden sm:gl-inline-block')
.btn-group.gl-ml-3
= inline_diff_btn
= parallel_diff_btn

View File

@ -18,7 +18,7 @@
.project-clone-holder.d-block.d-sm-none
= render "shared/mobile_clone_panel"
.project-clone-holder.gl-display-none.gl-sm-display-flex.gl-justify-content-end.gl-w-full
.project-clone-holder.gl-hidden.sm:gl-flex.gl-justify-content-end.gl-w-full
= render "projects/buttons/code", ref: @ref
= render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-new-card-body gl-bg-gray-10 gl-p-5' }) do |c|

View File

@ -67,6 +67,6 @@
= render 'shared/merge_request_pipeline_status', merge_request: merge_request
- if merge_request.updated_at != merge_request.created_at
.issuable-updated-at.gl-align-self-end.gl-display-none.gl-sm-display-inline-block.gl-text-gray-500
.issuable-updated-at.gl-align-self-end.gl-hidden.sm:gl-inline-block.gl-text-gray-500
%span
= _('updated %{time_ago}').html_safe % { time_ago: time_ago_with_tooltip(merge_request.updated_at, placement: 'bottom', html_class: 'merge_request_updated_ago') }

View File

@ -12,21 +12,21 @@
- c.with_body do
= _('The source project of this merge request has been removed.')
.detail-page-header.border-bottom-0.gl-display-block.gl-pt-5{ class: "gl-sm-display-flex! #{'is-merge-request' if !fluid_layout}" }
.detail-page-header.border-bottom-0.gl-display-block.gl-pt-5{ class: "sm:!gl-flex #{'is-merge-request' if !fluid_layout}" }
.detail-page-header-body
%h1.title.page-title.gl-font-size-h-display.gl-my-0.gl-display-inline-block.gl-flex-grow-1.gl-break-anywhere{ data: { testid: 'title-content' } }
= markdown_field(@merge_request, :title)
- unless hide_gutter_toggle
%div
= render Pajamas::ButtonComponent.new(icon: "chevron-double-lg-left", button_options: { class: "btn-icon gl-float-right gl-display-block gutter-toggle issuable-gutter-toggle js-sidebar-toggle gl-sm-display-none!" })
= render Pajamas::ButtonComponent.new(icon: "chevron-double-lg-left", button_options: { class: "btn-icon gl-float-right gl-display-block gutter-toggle issuable-gutter-toggle js-sidebar-toggle sm:!gl-hidden" })
.detail-page-header-actions.gl-align-self-start.is-merge-request.js-issuable-actions.gl-display-flex
- if can_update_merge_request
- edit_action_description = _('Edit merge request')
- edit_action_shortcut = 'e'
- edit_button_title = "#{edit_action_description} <kbd class='flat ml-1' aria-hidden=true>#{edit_action_shortcut}</kbd>"
= render Pajamas::ButtonComponent.new(href: edit_project_merge_request_path(@project, @merge_request), button_options: { aria: {label: edit_action_description, keyshortcuts: edit_action_shortcut}, class: "gl-display-none gl-sm-display-block gl-align-self-start has-tooltip js-issuable-edit", data: { html: "true", testid: "edit-title-button" }, title: edit_button_title }) do
= render Pajamas::ButtonComponent.new(href: edit_project_merge_request_path(@project, @merge_request), button_options: { aria: {label: edit_action_description, keyshortcuts: edit_action_shortcut}, class: "gl-hidden sm:gl-block gl-align-self-start has-tooltip js-issuable-edit", data: { html: "true", testid: "edit-title-button" }, title: edit_button_title }) do
= _('Edit')
.gl-display-flex.gl-flex-direction-column.gl-sm-flex-direction-row.gl-gap-3.gl-w-full.gl-sm-w-auto.gl-mt-2.gl-sm-mt-0

View File

@ -18,7 +18,7 @@
.gl-ml-0
= render Pajamas::ButtonComponent.new(category: :tertiary,
icon: 'pencil',
button_options: { class: 'gl-display-none gl-sm-display-inline-block note-action-button js-note-edit has-tooltip', data: { testid: 'edit-comment-button' }, title: _('Edit comment'), 'aria-label': _('Edit comment') })
button_options: { class: 'gl-hidden sm:gl-inline-block note-action-button js-note-edit has-tooltip', data: { testid: 'edit-comment-button' }, title: _('Edit comment'), 'aria-label': _('Edit comment') })
= render 'projects/notes/more_actions_dropdown', note: note, note_editable: note_editable

View File

@ -5,7 +5,7 @@
= render Pajamas::ButtonComponent.new(icon: 'ellipsis_v', category: :tertiary, button_options: { class: 'note-action-button more-actions-toggle', data: { title: 'More actions', toggle: 'dropdown', container: 'body', testid: 'more-actions-dropdown' }})
%ul.dropdown-menu.more-actions-dropdown.dropdown-menu-right
- if note_editable
%li{ class: "gl-sm-display-none!" }
%li{ class: "sm:!gl-hidden" }
= render Pajamas::ButtonComponent.new(category: :tertiary, button_options: { class: 'menu-item note-action-button js-note-edit', data: { container: 'body', testid: 'edit-comment-button' } }) do
= _("Edit comment")
%li

View File

@ -17,9 +17,9 @@
= render 'projects/find_file_link'
= render 'shared/web_ide_button', blob: nil, css_classes: 'gl-w-full gl-sm-w-auto'
.project-code-holder.gl-display-none.gl-sm-display-inline-block
.project-code-holder.gl-hidden.sm:gl-inline-block
= render "projects/buttons/code", dropdown_class: 'dropdown-menu-right', ref: @ref
.project-code-holder.gl-display-flex.gl-gap-3{ class: 'gl-sm-display-none!' }
.project-code-holder.gl-display-flex.gl-gap-3{ class: 'sm:!gl-hidden' }
= render 'projects/buttons/download', project: @project, ref: @ref
= render "shared/mobile_clone_panel", ref: @ref

View File

@ -1,4 +1,4 @@
.search-results-status.gl-sm-display-flex.gl-items-start.gl-justify-content-space-between.gl-my-4{ class: ('lg:gl-hidden' if @search_objects.to_a.empty?) }
.search-results-status.sm:gl-flex.gl-items-start.gl-justify-content-space-between.gl-my-4{ class: ('lg:gl-hidden' if @search_objects.to_a.empty?) }
- unless @search_objects.to_a.empty?
%div
- unless @search_service_presenter.without_count?

View File

@ -1,4 +1,4 @@
- count_badge_classes = 'gl-display-none gl-sm-display-inline-flex'
- count_badge_classes = 'gl-hidden sm:gl-inline-flex'
= gl_tabs_nav({class: 'gl-border-b-0 gl-flex-grow-1', data: { testid: 'milestones-filter' } }) do
= gl_tab_link_to milestones_filter_path(state: 'opened'), { item_active: params[:state].blank? || params[:state] == 'opened' } do

View File

@ -13,7 +13,7 @@
- if params[:search].present?
= hidden_field_tag :search, params[:search]
- if @can_bulk_update
.check-all-holder.gl-display-none.gl-sm-display-block.hidden.gl-float-left.gl-mr-3.gl-leading-36
.check-all-holder.gl-hidden.sm:gl-block.hidden.gl-float-left.gl-mr-3.gl-leading-36
= render Pajamas::CheckboxTagComponent.new(name: 'check-all-issues', value: nil) do |c|
- c.with_label do
%span.gl-sr-only

View File

@ -8,7 +8,7 @@
= _('Milestone')
- if milestone.due_date || milestone.start_date
= milestone_date_range(milestone)
= render Pajamas::ButtonComponent.new(icon: 'chevron-double-lg-left', button_options: { 'aria-label' => _('Toggle sidebar'), class: 'btn-grouped !gl-float-right gl-sm-display-none js-sidebar-toggle' })
= render Pajamas::ButtonComponent.new(icon: 'chevron-double-lg-left', button_options: { 'aria-label' => _('Toggle sidebar'), class: 'btn-grouped !gl-float-right sm:gl-hidden js-sidebar-toggle' })
- if can?(current_user, :admin_milestone, @group || @project)
- can_promote = @project && can_admin_group_milestones? && milestone.project

View File

@ -42,7 +42,7 @@
%span.system-note-message
= markdown_field(note, :note)
- if note.created_at
%span.system-note-separator.gl-display-none.gl-sm-display-inline
%span.system-note-separator.gl-hidden.sm:gl-inline
&middot;
%a.system-note-separator{ href: "##{dom_id(note)}" }= time_ago_with_tooltip(note.created_at, placement: 'bottom', html_class: 'note-created-ago')
- if note.imported?

View File

@ -9,7 +9,7 @@
- use_creator_avatar = local_assigns[:use_creator_avatar]
- show_last_commit_as_description = false unless local_assigns[:show_last_commit_as_description] == true && can_show_last_commit_in_list?(project)
- access = max_project_member_access(project)
- css_class = "gl-sm-display-flex gl-align-items-center !gl-align-middle" if project.description.blank? && !show_last_commit_as_description
- css_class = "sm:gl-flex gl-align-items-center !gl-align-middle" if project.description.blank? && !show_last_commit_as_description
- updated_tooltip = time_ago_with_tooltip(project.last_activity_at || project.updated_at)
- show_pipeline_status_icon = pipeline_status && can?(current_user, :read_cross_project) && project.pipeline_status.has_status? && can?(current_user, :read_build, project)
- last_pipeline = last_pipeline_from_status_cache(project) if show_pipeline_status_icon
@ -59,10 +59,10 @@
= render_if_exists 'compliance_management/compliance_framework/compliance_framework_badge', project: project, additional_classes: 'gl-ml-2!'
- if show_last_commit_as_description
.description.gl-display-none.gl-sm-display-block.gl-overflow-hidden.gl-mr-3.gl-mt-2.gl-font-sm
.description.gl-hidden.sm:gl-block.gl-overflow-hidden.gl-mr-3.gl-mt-2.gl-font-sm
= link_to_markdown(project.commit.title, project_commit_path(project, project.commit), class: "commit-row-message")
- elsif project.description.present?
.description.gl-display-none.gl-sm-display-block.gl-overflow-hidden.gl-mr-3.gl-mt-2.gl-font-sm
.description.gl-hidden.sm:gl-block.gl-overflow-hidden.gl-mr-3.gl-mt-2.gl-font-sm
= markdown_field(project, :description)
- if project.topics.any?
@ -71,7 +71,7 @@
= render_if_exists 'shared/projects/removed', project: project
.gl-display-flex.gl-align-items-center.gl-mt-3{ class: "#{css_class} gl-sm-display-none!" }
.gl-display-flex.gl-align-items-center.gl-mt-3{ class: "#{css_class} sm:!gl-hidden" }
.controls.gl-display-flex.gl-align-items-center
- if show_pipeline_status_icon && last_pipeline.present?
- pipeline_path = pipelines_project_commit_path(project.pipeline_status.project, project.pipeline_status.sha, ref: project.pipeline_status.ref)

View File

@ -38,10 +38,10 @@
= visibility_level_content(project)
- if show_last_commit_as_description
.description.gl-display-none.gl-sm-display-block.gl-mt-2.gl-font-sm
.description.gl-hidden.sm:gl-block.gl-mt-2.gl-font-sm
= link_to_markdown(project.commit.title, project_commit_path(project, project.commit), class: "commit-row-message")
- elsif project.description.present?
.description.gl-display-none.gl-sm-display-block.gl-mt-2.gl-font-sm
.description.gl-hidden.sm:gl-block.gl-mt-2.gl-font-sm
= markdown_field(project, :description)
- if project.topics.any?

View File

@ -1,12 +1,12 @@
- link_project = local_assigns.fetch(:link_project, false)
- notes_count = @noteable_meta_data[snippet.id].user_notes_count
%li.gl-py-4.gl-sm-display-flex.gl-align-items-center.gl-justify-content-space-between.gl-border-b{ data: { testid: 'snippet-link', qa_snippet_title: snippet.title } }
%li.gl-py-4.sm:gl-flex.gl-align-items-center.gl-justify-content-space-between.gl-border-b{ data: { testid: 'snippet-link', qa_snippet_title: snippet.title } }
- unless current_path?('users#snippets')
.gl-display-none.gl-sm-display-block.gl-sm-mr-3
.gl-hidden.sm:gl-block.gl-sm-mr-3
= render Pajamas::AvatarComponent.new(snippet.author, size: 32, alt: "")
.gl-sm-display-flex.gl-justify-content-space-between.gl-align-items-center.gl-flex-grow-1
.sm:gl-flex.gl-justify-content-space-between.gl-align-items-center.gl-flex-grow-1
%div
= link_to gitlab_snippet_path(snippet), class: "title gl-text-black-normal gl-font-bold" do
= snippet.title
@ -25,7 +25,7 @@
- else
= _('created %{timeAgo} by %{author}').html_safe % { timeAgo: created_at, author: author }
.gl-sm-display-flex.gl-flex-direction-column.gl-align-items-flex-end{ data: { testid: 'snippet-file-count-content', qa_snippet_files: snippet.statistics&.file_count } }
.sm:gl-flex.gl-flex-direction-column.gl-align-items-flex-end{ data: { testid: 'snippet-file-count-content', qa_snippet_files: snippet.statistics&.file_count } }
.gl-display-flex.gl-gap-4.gl-align-items-center
- if notes_count > 0
%span.has-tooltip{ title: _('Comments') }

View File

@ -7,6 +7,6 @@
- if note_editable
.gl-ml-0
= render Pajamas::ButtonComponent.new(category: :tertiary, icon: 'pencil', button_options: { title: _('Edit comment'), class: 'note-action-button js-note-edit has-tooltip gl-display-none gl-sm-display-block', data: { container: 'body', testid: 'edit-comment-button' } })
= render Pajamas::ButtonComponent.new(category: :tertiary, icon: 'pencil', button_options: { title: _('Edit comment'), class: 'note-action-button js-note-edit has-tooltip gl-hidden sm:gl-block', data: { container: 'body', testid: 'edit-comment-button' } })
= render 'projects/notes/more_actions_dropdown', note: note, note_editable: note_editable

View File

@ -1,4 +1,4 @@
- icon_classes = 'settings-list-icon gl-display-none gl-sm-display-block'
- icon_classes = 'settings-list-icon gl-hidden sm:gl-block'
%tr.key-list-item
%td{ data: { label: _('Title'), testid: 'title' } }

View File

@ -9,6 +9,10 @@
Gitlab::Database::Partitioning.register_models(
[
AuditEvent,
AuditEvents::UserAuditEvent,
AuditEvents::GroupAuditEvent,
AuditEvents::ProjectAuditEvent,
AuditEvents::InstanceAuditEvent,
BatchedGitRefUpdates::Deletion,
Ci::BuildMetadata,
Ci::BuildExecutionConfig,

View File

@ -1,7 +1,7 @@
---
table_name: group_audit_events
classes:
- GroupAuditEvent
- AuditEvents::GroupAuditEvent
feature_categories:
- audit_events
description: Stores audit events scoped to group

View File

@ -1,7 +1,7 @@
---
table_name: instance_audit_events
classes:
- InstanceAuditEvent
- AuditEvents::InstanceAuditEvent
feature_categories:
- audit_events
description: Stores audit events scoped to instance

View File

@ -1,7 +1,7 @@
---
table_name: project_audit_events
classes:
- ProjectAuditEvent
- AuditEvents::ProjectAuditEvent
feature_categories:
- audit_events
description: Stores audit events scoped to project

View File

@ -1,7 +1,7 @@
---
table_name: user_audit_events
classes:
- UserAuditEvent
- AuditEvents::UserAuditEvent
feature_categories:
- audit_events
description: Stores audit events scoped to user

View File

@ -0,0 +1,65 @@
# frozen_string_literal: true
class CreatePartitionsForAuditEventTables < Gitlab::Database::Migration[2.2]
milestone '17.1'
disable_ddl_transaction!
include Gitlab::Database::PartitioningMigrationHelpers::TableManagementHelpers
FROM_TO_REGEXP = /FOR VALUES FROM \('?(?<from>.+)'?\) TO \('?(?<to>.+)'?\)/
def up
partitions = current_partitions
max_date = Date.today.next_month.beginning_of_month
min_date = find_min_date(partitions.to_a)
drop_partitions(:user_audit_events)
drop_partitions(:group_audit_events)
drop_partitions(:project_audit_events)
drop_partitions(:instance_audit_events)
create_daterange_partitions(:user_audit_events, "created_at", min_date, max_date)
create_daterange_partitions(:group_audit_events, "created_at", min_date, max_date)
create_daterange_partitions(:project_audit_events, "created_at", min_date, max_date)
create_daterange_partitions(:instance_audit_events, "created_at", min_date, max_date)
end
def down
drop_partitions(:user_audit_events)
drop_partitions(:group_audit_events)
drop_partitions(:project_audit_events)
drop_partitions(:instance_audit_events)
end
private
def current_partitions
execute <<~SQL
SELECT *
FROM postgres_partitions
WHERE parent_identifier = (SELECT current_schema() || '.audit_events');
SQL
end
def find_min_date(partitions)
minvalue_record = partitions.find { |partition| partition["condition"].include?('MINVALUE') }
if minvalue_record
matches = minvalue_record["condition"].match(FROM_TO_REGEXP)
matches[:to].to_date
else
Date.today.beginning_of_month
end
end
def drop_partitions(table_name)
result = execute <<-SQL
SELECT * FROM postgres_partitions
WHERE parent_identifier = (SELECT current_schema() || '.#{table_name}');
SQL
result.to_a.each do |partition|
execute("DROP TABLE #{partition['identifier']}")
end
end
end

View File

@ -0,0 +1 @@
d34f9b01b64ed4dd43a4858cc32b0a56a290bc9704db1ae90b9bb97340f6ef45

View File

@ -1656,6 +1656,34 @@ CREATE TABLE p_ci_stages (
)
PARTITION BY LIST (partition_id);
CREATE SEQUENCE shared_audit_event_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
CREATE TABLE group_audit_events (
id bigint DEFAULT nextval('shared_audit_event_id_seq'::regclass) NOT NULL,
created_at timestamp with time zone NOT NULL,
group_id bigint NOT NULL,
author_id bigint NOT NULL,
target_id bigint,
event_name text,
details text,
ip_address inet,
author_name text,
entity_path text,
target_details text,
target_type text,
CONSTRAINT group_audit_events_author_name_check CHECK ((char_length(author_name) <= 255)),
CONSTRAINT group_audit_events_entity_path_check CHECK ((char_length(entity_path) <= 5500)),
CONSTRAINT group_audit_events_event_name_check CHECK ((char_length(event_name) <= 255)),
CONSTRAINT group_audit_events_target_details_check CHECK ((char_length(target_details) <= 5500)),
CONSTRAINT group_audit_events_target_type_check CHECK ((char_length(target_type) <= 255))
)
PARTITION BY RANGE (created_at);
CREATE TABLE groups_visits (
id bigint NOT NULL,
entity_id bigint NOT NULL,
@ -1684,6 +1712,26 @@ CREATE TABLE incident_management_pending_issue_escalations (
)
PARTITION BY RANGE (process_at);
CREATE TABLE instance_audit_events (
id bigint DEFAULT nextval('shared_audit_event_id_seq'::regclass) NOT NULL,
created_at timestamp with time zone NOT NULL,
author_id bigint NOT NULL,
target_id bigint,
event_name text,
details text,
ip_address inet,
author_name text,
entity_path text,
target_details text,
target_type text,
CONSTRAINT instance_audit_events_author_name_check CHECK ((char_length(author_name) <= 255)),
CONSTRAINT instance_audit_events_entity_path_check CHECK ((char_length(entity_path) <= 5500)),
CONSTRAINT instance_audit_events_event_name_check CHECK ((char_length(event_name) <= 255)),
CONSTRAINT instance_audit_events_target_details_check CHECK ((char_length(target_details) <= 5500)),
CONSTRAINT instance_audit_events_target_type_check CHECK ((char_length(target_type) <= 255))
)
PARTITION BY RANGE (created_at);
CREATE TABLE loose_foreign_keys_deleted_records (
id bigint NOT NULL,
partition bigint DEFAULT 1 NOT NULL,
@ -1770,6 +1818,27 @@ CREATE TABLE p_ci_finished_build_ch_sync_events (
)
PARTITION BY LIST (partition);
CREATE TABLE project_audit_events (
id bigint DEFAULT nextval('shared_audit_event_id_seq'::regclass) NOT NULL,
created_at timestamp with time zone NOT NULL,
project_id bigint NOT NULL,
author_id bigint NOT NULL,
target_id bigint,
event_name text,
details text,
ip_address inet,
author_name text,
entity_path text,
target_details text,
target_type text,
CONSTRAINT project_audit_events_author_name_check CHECK ((char_length(author_name) <= 255)),
CONSTRAINT project_audit_events_entity_path_check CHECK ((char_length(entity_path) <= 5500)),
CONSTRAINT project_audit_events_event_name_check CHECK ((char_length(event_name) <= 255)),
CONSTRAINT project_audit_events_target_details_check CHECK ((char_length(target_details) <= 5500)),
CONSTRAINT project_audit_events_target_type_check CHECK ((char_length(target_type) <= 255))
)
PARTITION BY RANGE (created_at);
CREATE TABLE projects_visits (
id bigint NOT NULL,
entity_id bigint NOT NULL,
@ -1795,6 +1864,27 @@ CREATE TABLE security_findings (
)
PARTITION BY LIST (partition_number);
CREATE TABLE user_audit_events (
id bigint DEFAULT nextval('shared_audit_event_id_seq'::regclass) NOT NULL,
created_at timestamp with time zone NOT NULL,
user_id bigint NOT NULL,
author_id bigint NOT NULL,
target_id bigint,
event_name text,
details text,
ip_address inet,
author_name text,
entity_path text,
target_details text,
target_type text,
CONSTRAINT user_audit_events_author_name_check CHECK ((char_length(author_name) <= 255)),
CONSTRAINT user_audit_events_entity_path_check CHECK ((char_length(entity_path) <= 5500)),
CONSTRAINT user_audit_events_event_name_check CHECK ((char_length(event_name) <= 255)),
CONSTRAINT user_audit_events_target_details_check CHECK ((char_length(target_details) <= 5500)),
CONSTRAINT user_audit_events_target_type_check CHECK ((char_length(target_type) <= 255))
)
PARTITION BY RANGE (created_at);
CREATE TABLE value_stream_dashboard_counts (
id bigint NOT NULL,
namespace_id bigint NOT NULL,
@ -10051,34 +10141,6 @@ CREATE SEQUENCE grafana_integrations_id_seq
ALTER SEQUENCE grafana_integrations_id_seq OWNED BY grafana_integrations.id;
CREATE SEQUENCE shared_audit_event_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
CREATE TABLE group_audit_events (
id bigint DEFAULT nextval('shared_audit_event_id_seq'::regclass) NOT NULL,
created_at timestamp with time zone NOT NULL,
group_id bigint NOT NULL,
author_id bigint NOT NULL,
target_id bigint,
event_name text,
details text,
ip_address inet,
author_name text,
entity_path text,
target_details text,
target_type text,
CONSTRAINT group_audit_events_author_name_check CHECK ((char_length(author_name) <= 255)),
CONSTRAINT group_audit_events_entity_path_check CHECK ((char_length(entity_path) <= 5500)),
CONSTRAINT group_audit_events_event_name_check CHECK ((char_length(event_name) <= 255)),
CONSTRAINT group_audit_events_target_details_check CHECK ((char_length(target_details) <= 5500)),
CONSTRAINT group_audit_events_target_type_check CHECK ((char_length(target_type) <= 255))
)
PARTITION BY RANGE (created_at);
CREATE TABLE group_crm_settings (
group_id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@ -10712,26 +10774,6 @@ CREATE SEQUENCE insights_id_seq
ALTER SEQUENCE insights_id_seq OWNED BY insights.id;
CREATE TABLE instance_audit_events (
id bigint DEFAULT nextval('shared_audit_event_id_seq'::regclass) NOT NULL,
created_at timestamp with time zone NOT NULL,
author_id bigint NOT NULL,
target_id bigint,
event_name text,
details text,
ip_address inet,
author_name text,
entity_path text,
target_details text,
target_type text,
CONSTRAINT instance_audit_events_author_name_check CHECK ((char_length(author_name) <= 255)),
CONSTRAINT instance_audit_events_entity_path_check CHECK ((char_length(entity_path) <= 5500)),
CONSTRAINT instance_audit_events_event_name_check CHECK ((char_length(event_name) <= 255)),
CONSTRAINT instance_audit_events_target_details_check CHECK ((char_length(target_details) <= 5500)),
CONSTRAINT instance_audit_events_target_type_check CHECK ((char_length(target_type) <= 255))
)
PARTITION BY RANGE (created_at);
CREATE TABLE instance_audit_events_streaming_headers (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@ -14692,27 +14734,6 @@ CREATE SEQUENCE project_aliases_id_seq
ALTER SEQUENCE project_aliases_id_seq OWNED BY project_aliases.id;
CREATE TABLE project_audit_events (
id bigint DEFAULT nextval('shared_audit_event_id_seq'::regclass) NOT NULL,
created_at timestamp with time zone NOT NULL,
project_id bigint NOT NULL,
author_id bigint NOT NULL,
target_id bigint,
event_name text,
details text,
ip_address inet,
author_name text,
entity_path text,
target_details text,
target_type text,
CONSTRAINT project_audit_events_author_name_check CHECK ((char_length(author_name) <= 255)),
CONSTRAINT project_audit_events_entity_path_check CHECK ((char_length(entity_path) <= 5500)),
CONSTRAINT project_audit_events_event_name_check CHECK ((char_length(event_name) <= 255)),
CONSTRAINT project_audit_events_target_details_check CHECK ((char_length(target_details) <= 5500)),
CONSTRAINT project_audit_events_target_type_check CHECK ((char_length(target_type) <= 255))
)
PARTITION BY RANGE (created_at);
CREATE TABLE project_authorizations (
user_id integer NOT NULL,
project_id integer NOT NULL,
@ -17622,27 +17643,6 @@ CREATE SEQUENCE user_agent_details_id_seq
ALTER SEQUENCE user_agent_details_id_seq OWNED BY user_agent_details.id;
CREATE TABLE user_audit_events (
id bigint DEFAULT nextval('shared_audit_event_id_seq'::regclass) NOT NULL,
created_at timestamp with time zone NOT NULL,
user_id bigint NOT NULL,
author_id bigint NOT NULL,
target_id bigint,
event_name text,
details text,
ip_address inet,
author_name text,
entity_path text,
target_details text,
target_type text,
CONSTRAINT user_audit_events_author_name_check CHECK ((char_length(author_name) <= 255)),
CONSTRAINT user_audit_events_entity_path_check CHECK ((char_length(entity_path) <= 5500)),
CONSTRAINT user_audit_events_event_name_check CHECK ((char_length(event_name) <= 255)),
CONSTRAINT user_audit_events_target_details_check CHECK ((char_length(target_details) <= 5500)),
CONSTRAINT user_audit_events_target_type_check CHECK ((char_length(target_type) <= 255))
)
PARTITION BY RANGE (created_at);
CREATE TABLE user_broadcast_message_dismissals (
id bigint NOT NULL,
user_id bigint NOT NULL,

View File

@ -397,6 +397,9 @@ control over how the Pages daemon runs and serves content in your environment.
| `artifacts_server_url` | API URL to proxy artifact requests to. Defaults to GitLab `external URL` + `/api/v4`, for example `https://gitlab.com/api/v4`. When running a [separate Pages server](#running-gitlab-pages-on-a-separate-server), this URL must point to the main GitLab server's API. |
| `auth_redirect_uri` | Callback URL for authenticating with GitLab. Defaults to project's subdomain of `pages_external_url` + `/auth`, for example `https://projects.example.io/auth`. When `namespace_in_path` is enabled, defaults to `pages_external_url` + `/projects/auth`, for example `https://example.io/projects/auth`. |
| `auth_secret` | Secret key for signing authentication requests. Leave blank to pull automatically from GitLab during OAuth registration. |
| `client_cert` | Client certificate used for mutual TLS with the GitLab API. See [Support mutual TLS when calling the GitLab API](#support-mutual-tls-when-calling-the-gitlab-api) for details. |
| `client_key` | Client key used for mutual TLS with the GitLab API. See [Support mutual TLS when calling the GitLab API](#support-mutual-tls-when-calling-the-gitlab-api) for details. |
| `client_ca_certs` | Root CA certificates used to sign client certificate used for mutual TLS with the GitLab API. See [Support mutual TLS when calling the GitLab API](#support-mutual-tls-when-calling-the-gitlab-api) for details. |
| `dir` | Working directory for configuration and secrets files. |
| `enable` | Enable or disable GitLab Pages on the current system. |
| `external_http` | Configure Pages to bind to one or more secondary IP addresses, serving HTTP requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_http`. |
@ -683,6 +686,55 @@ For Linux package installations, this is fixed by [installing a custom CA](https
For self-compiled installations, this can be fixed by installing the custom Certificate
Authority (CA) in the system certificate store.
### Support mutual TLS when calling the GitLab API
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/-/issues/548) in GitLab 17.1.
Prerequisites:
- Your instance must use the Linux package installation method.
If GitLab is [configured to require mutual TLS](https://docs.gitlab.com/omnibus/settings/ssl/#enable-2-way-ssl-client-authentication),
you must add client certificates to your GitLab Pages configuration.
Certificates have these requirements:
- The certificate must specify the hostname or IP address as a Subject Alternative Name.
- The full certificate chain is required, including the end-user certificate, intermediate certificates,
and the root certificate, in that order.
The certificate's Common Name field is ignored.
To configure the certificates in your GitLab Pages server:
1. On the GitLab Pages nodes, create the `/etc/gitlab/ssl` directory and copy your key and full certificate chain there:
```shell
sudo mkdir -p /etc/gitlab/ssl
sudo chmod 755 /etc/gitlab/ssl
sudo cp key.pem cert.pem /etc/gitlab/ssl/
sudo chmod 644 key.pem cert.pem
```
1. Edit `/etc/gitlab/gitlab.rb`:
```ruby
gitlab_pages['client_cert'] = ['/etc/gitlab/ssl/cert.pem']
gitlab_pages['client_key'] = ['/etc/gitlab/ssl/key.pem']
```
1. If you used a custom Certificate Authority (CA), you must copy the root CA certificate to `/etc/gitlab/ssl`
and edit `/etc/gitlab/gitlab.rb`:
```ruby
gitlab_pages['client_ca_certs'] = ['/etc/gitlab/ssl/ca.pem']
```
File paths for multiple custom Certificate Authority (CA)s are separated by commas.
1. If you have a multi-node GitLab Pages installation, repeat these steps in all the nodes.
1. Save a copy of the full certificate chain files in the `/etc/gitlab/trusted-certs` directory on all your GitLab Nodes.
### ZIP serving and cache configuration
WARNING:

View File

@ -87,6 +87,7 @@ GET /projects
| `with_issues_enabled` | boolean | No | Limit by enabled issues feature. |
| `with_merge_requests_enabled` | boolean | No | Limit by enabled merge requests feature. |
| `with_programming_language` | string | No | Limit by projects which use the given programming language. |
| `marked_for_deletion_on` | date | No | Filter by date when project was marked for deletion. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/463939) in GitLab 17.1. Premium and Ultimate only. |
This endpoint supports [keyset pagination](rest/index.md#keyset-based-pagination)
for selected `order_by` options.

View File

@ -29,20 +29,18 @@ This should enable everyone to see locally any change in an IDE being sent to th
1. Inside the new window, in the built in terminal select the "Output" tab then "GitLab Language Server" from the drop down menu on the right.
1. Open a new file inside of this VS Code window and begin typing to see code suggestions in action.
1. You will see completion request URLs being fetched that match the Git remote URL for your GDK.
1. Main Application (GDK):
1. Install the [GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/index.md#one-line-installation).
1. Enable Feature Flag ```ai_duo_code_suggestions_switch```:
1. In your terminal, go to your `gitlab-development-kit` > `gitlab` directory.
1. Run `gdk rails console` or `bundle exec rails c` to start a Rails console.
1. [Enable the Feature Flag](../../administration/feature_flags.md#enable-or-disable-the-feature) for the code suggestions tokens API by calling `Feature.enable(:ai_duo_code_suggestions_switch)` from the console.
1. Set the AI Gateway URL environmental variable by running `export AI_GATEWAY_URL=http://localhost:5052`.
1. Run your GDK server with `gdk start` if it's not already running.
1. [Setup AI Gateway](https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist):
1. Run the AI Gateway as part of your GDK
1. Follow the "How to set up and validate locally" steps in [this MR](https://gitlab.com/gitlab-org/gitlab-development-kit/-/merge_requests/3646#how-to-set-up-and-validate-locally)
1. Be sure to add your `ANTHROPIC_API_KEY` to your GDK's `gitlab-ai-gateway/.env` file
1. Run the AI Gateway externally
1. Complete the steps to [run the server locally](https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist#how-to-run-the-server-locally).
1. [Set up AI Gateway](https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist). You can do this in two ways:
- [Run the AI Gateway as part of your GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/gitlab_ai_gateway.md).
- Run the AI Gateway externally:
1. [Run the server locally](https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist#how-to-run-the-server-locally).
1. Uncomment or add the following variables in the `.env` file for all debugging insights.
You may need to adjust the filepath (remove `..`) for this log to show in the `ai-assist` root directory.
@ -58,6 +56,12 @@ This should enable everyone to see locally any change in an IDE being sent to th
tail -f modelgateway_debug.log | fblog -a prefix -a suffix -a current_file_name -a suggestion -a language -a input -a parameters -a score -a exception
```
1. Update the main application (GDK) to reference the AI Gateway URL.
1. Set the `AI_GATEWAY_URL` environment variable.
- If you set up the AI Gateway externally, run `export AI_GATEWAY_URL=http://localhost:5052`.
- If you set up the AI Gateway through GDK, you can get the AI Gateway URL by running `gdk status`, afterwards run `export AI_GATEWAY_URL=<the address set by gdk>`.
1. Start or restart GDK (`gdk start` or `gdk restart`).
### Setup instructions to use staging AI Gateway
When testing interactions with the AI Gateway, you might want to integrate your local GDK

View File

@ -44,6 +44,9 @@ GitLab can help you with a vulnerability by using a large language model to:
- Help developers and security analysts to understand the vulnerability, how it could be exploited, and how to fix it.
- Provide a suggested mitigation.
For a click-through demo, see [Resolving vulnerabilities with GitLab Duo (AI)](https://tech-marketing.gitlab.io/static-demos/pt-explain-vulnerability.html).
<!-- Demo published on 2024-02-24 -->
### Vulnerability explanation
Explain a vulnerability with GitLab Duo Vulnerability explanation. Use the explanation to better

View File

@ -8,10 +8,6 @@
# https://docs.gitlab.com/ee/user/packages/npm_registry/
#
# Technical debt: https://gitlab.com/gitlab-org/gitlab/issues/35798
#
# Caution: This Concern has to be included at the end of the API class
# The last route of this Concern has a globbing wildcard that will match all urls.
# As such, routes declared after the last route of this Concern will not match any url.
module API
module Concerns
module Packages
@ -180,80 +176,6 @@ module API
end
end
desc 'NPM registry metadata endpoint' do
detail 'This feature was introduced in GitLab 11.8'
success [
{ code: 200, model: ::API::Entities::NpmPackage, message: 'Ok' },
{ code: 302, message: 'Found (redirect)' }
]
failure [
{ code: 400, message: 'Bad Request' },
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not Found' }
]
tags %w[npm_packages]
end
params do
use :package_name
end
route_setting :authentication, job_token_allowed: true, deploy_token_allowed: true,
authenticate_non_public: true
get '*package_name', format: false, requirements: ::API::Helpers::Packages::Npm::NPM_ENDPOINT_REQUIREMENTS do
package_name = params[:package_name]
available_packages =
if endpoint_scope != :project &&
Feature.enabled?(:npm_allow_packages_in_multiple_projects, group_or_namespace)
finder_for_endpoint_scope(package_name).execute
else
::Packages::Npm::PackageFinder.new(package_name, project: project_or_nil)
.execute
end
# In order to redirect a request, packages should not exist (without taking the user into account).
redirect_request = project_or_nil.blank? || available_packages.empty?
redirect_registry_request(
forward_to_registry: redirect_request,
package_type: :npm,
target: project_or_nil,
package_name: package_name
) do
if endpoint_scope != :project &&
Feature.enabled?(:npm_allow_packages_in_multiple_projects, group_or_namespace)
available_packages_to_user = ::Packages::Npm::PackagesForUserFinder.new(
current_user,
group_or_namespace,
package_name: params[:package_name]
).execute
if available_packages.any? && available_packages_to_user.empty?
current_user ? forbidden! : unauthorized!
end
available_packages = available_packages_to_user
else
authorize_read_package!(project)
end
not_found!('Packages') if available_packages.empty?
if endpoint_scope == :project
if metadata_cache&.file&.exists?
metadata_cache.touch_last_downloaded_at
present_carrierwave_file!(metadata_cache.file)
break
end
enqueue_sync_metadata_cache_worker(project, package_name)
end
metadata = generate_metadata_service(available_packages).execute.payload
present metadata, with: ::API::Entities::NpmPackage
end
end
desc 'NPM registry bulk advisory endpoint' do
detail 'This feature was introduced in GitLab 15.6'
success [

View File

@ -0,0 +1,76 @@
# frozen_string_literal: true
# Caution: This Concern has to be included at the end of the API class
# The last route of this Concern has a globbing wildcard that will match all GET urls.
# As such, GET routes declared after the last route of this Concern will not match any url.
module API
module Concerns
module Packages
module NpmNamespaceEndpoints
extend ActiveSupport::Concern
included do
desc 'NPM registry metadata endpoint' do
detail 'This feature was introduced in GitLab 11.8'
success [
{ code: 200, model: ::API::Entities::NpmPackage, message: 'Ok' },
{ code: 302, message: 'Found (redirect)' }
]
failure [
{ code: 400, message: 'Bad Request' },
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not Found' }
]
tags %w[npm_packages]
end
params do
use :package_name
end
route_setting :authentication, job_token_allowed: true, deploy_token_allowed: true,
authenticate_non_public: true
get '*package_name', format: false, requirements: ::API::Helpers::Packages::Npm::NPM_ENDPOINT_REQUIREMENTS do
package_name = declared_params[:package_name]
packages =
if Feature.enabled?(:npm_allow_packages_in_multiple_projects, group_or_namespace)
finder_for_endpoint_scope(package_name).execute
else
::Packages::Npm::PackageFinder.new(package_name, project: project_or_nil).execute
end
# In order to redirect a request, packages should not exist (without taking the user into account).
redirect_request = project_or_nil.blank? || packages.empty?
redirect_registry_request(
forward_to_registry: redirect_request,
package_type: :npm,
target: project_or_nil,
package_name: package_name
) do
if Feature.enabled?(:npm_allow_packages_in_multiple_projects, group_or_namespace)
available_packages_to_user = ::Packages::Npm::PackagesForUserFinder.new(
current_user,
group_or_namespace,
package_name: package_name
).execute
if packages.any? && available_packages_to_user.empty?
current_user ? forbidden! : unauthorized!
end
packages = available_packages_to_user
else
authorize_read_package!(project)
end
not_found!('Packages') if packages.empty?
metadata = generate_metadata_service(packages).execute.payload
present metadata, with: ::API::Entities::NpmPackage
end
end
end
end
end
end
end

View File

@ -23,6 +23,7 @@ module API
resource :groups, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
namespace ':id/-/packages/npm' do
include ::API::Concerns::Packages::NpmEndpoints
include ::API::Concerns::Packages::NpmNamespaceEndpoints
end
end
end

Some files were not shown because too many files have changed in this diff Show More