Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
f4d5fa8ccc
commit
66b78786e8
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
# Cop supports --autocorrect.
|
||||
GraphQL/FieldDefinitions:
|
||||
Exclude:
|
||||
- 'app/graphql/types/resolvable_interface.rb'
|
||||
- 'ee/app/graphql/types/vulnerability_type.rb'
|
||||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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')"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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'),
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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.'),
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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"
|
||||
>
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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') }}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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">·</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"
|
||||
>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
>
|
||||
|
|
|
|||
|
|
@ -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}')">
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
= 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
|
||||
·
|
||||
- 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
|
||||
|
||||
= 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') }
|
||||
|
||||
= 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') }
|
||||
|
|
|
|||
|
|
@ -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') }
|
||||
|
||||
= sprite_icon('timer', css_class: 'issue-estimate-icon')
|
||||
= Gitlab::TimeTrackingFormatter.output(issue.time_estimate)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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|
|
||||
|
|
|
|||
|
|
@ -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') }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
·
|
||||
%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?
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
|
|
|
|||
|
|
@ -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') }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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' } }
|
||||
|
|
|
|||
|
|
@ -9,6 +9,10 @@
|
|||
Gitlab::Database::Partitioning.register_models(
|
||||
[
|
||||
AuditEvent,
|
||||
AuditEvents::UserAuditEvent,
|
||||
AuditEvents::GroupAuditEvent,
|
||||
AuditEvents::ProjectAuditEvent,
|
||||
AuditEvents::InstanceAuditEvent,
|
||||
BatchedGitRefUpdates::Deletion,
|
||||
Ci::BuildMetadata,
|
||||
Ci::BuildExecutionConfig,
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
table_name: group_audit_events
|
||||
classes:
|
||||
- GroupAuditEvent
|
||||
- AuditEvents::GroupAuditEvent
|
||||
feature_categories:
|
||||
- audit_events
|
||||
description: Stores audit events scoped to group
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
table_name: instance_audit_events
|
||||
classes:
|
||||
- InstanceAuditEvent
|
||||
- AuditEvents::InstanceAuditEvent
|
||||
feature_categories:
|
||||
- audit_events
|
||||
description: Stores audit events scoped to instance
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
table_name: project_audit_events
|
||||
classes:
|
||||
- ProjectAuditEvent
|
||||
- AuditEvents::ProjectAuditEvent
|
||||
feature_categories:
|
||||
- audit_events
|
||||
description: Stores audit events scoped to project
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
table_name: user_audit_events
|
||||
classes:
|
||||
- UserAuditEvent
|
||||
- AuditEvents::UserAuditEvent
|
||||
feature_categories:
|
||||
- audit_events
|
||||
description: Stores audit events scoped to user
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -0,0 +1 @@
|
|||
d34f9b01b64ed4dd43a4858cc32b0a56a290bc9704db1ae90b9bb97340f6ef45
|
||||
180
db/structure.sql
180
db/structure.sql
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 [
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
Loading…
Reference in New Issue