Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.eslintrc.yml2
-rw-r--r--.gitlab-ci.yml4
-rw-r--r--.gitlab/CODEOWNERS24
-rw-r--r--.gitlab/ci/gitlab-com/danger-review.gitlab-ci.yml23
-rw-r--r--.gitlab/ci/review.gitlab-ci.yml21
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new Git repository type.md2
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new blob type.md2
-rw-r--r--.rubocop_todo/layout/empty_line_after_magic_comment.yml7
-rw-r--r--.rubocop_todo/lint/missing_cop_enable_directive.yml18
-rw-r--r--Gemfile2
-rw-r--r--Gemfile.checksum2
-rw-r--r--Gemfile.lock6
-rw-r--r--app/assets/javascripts/batch_comments/components/submit_dropdown.vue172
-rw-r--r--app/assets/javascripts/content_editor/extensions/word_break.js2
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue7
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/publish_method.vue9
-rw-r--r--app/assets/stylesheets/page_bundles/merge_requests.scss25
-rw-r--r--app/assets/stylesheets/page_bundles/wiki.scss10
-rw-r--r--app/graphql/mutations/commits/create.rb2
-rw-r--r--app/graphql/resolvers/analytics/cycle_analytics/deployment_count_resolver.rb2
-rw-r--r--app/graphql/resolvers/analytics/cycle_analytics/issue_count_resolver.rb2
-rw-r--r--app/graphql/resolvers/concerns/caching_array_resolver.rb2
-rw-r--r--app/graphql/resolvers/group_issues_resolver.rb2
-rw-r--r--app/graphql/resolvers/namespaces/work_items_resolver.rb2
-rw-r--r--app/graphql/resolvers/project_issues_resolver.rb2
-rw-r--r--app/graphql/resolvers/project_members_resolver.rb4
-rw-r--r--app/graphql/resolvers/project_milestones_resolver.rb1
-rw-r--r--app/graphql/resolvers/projects/snippets_resolver.rb4
-rw-r--r--app/graphql/resolvers/snippets_resolver.rb4
-rw-r--r--app/graphql/resolvers/users/snippets_resolver.rb4
-rw-r--r--app/graphql/types/security/codequality_reports_comparer/degradation_type.rb2
-rw-r--r--app/graphql/types/security/codequality_reports_comparer/report_type.rb2
-rw-r--r--app/graphql/types/security/codequality_reports_comparer/summary_type.rb2
-rw-r--r--app/graphql/types/security/codequality_reports_comparer_type.rb2
-rw-r--r--app/helpers/projects_helper.rb4
-rw-r--r--app/models/deployment.rb3
-rw-r--r--app/policies/group_policy.rb1
-rw-r--r--app/services/merge_requests/update_service.rb5
-rw-r--r--app/views/projects/_home_panel.html.haml2
-rw-r--r--app/views/shared/_ci_catalog_badge.html.haml1
-rw-r--r--app/views/shared/projects/_list.html.haml1
-rw-r--r--app/views/shared/projects/_project.html.haml3
-rw-r--r--config/sidekiq_queues.yml2
-rw-r--r--db/post_migrate/20220902204048_move_security_findings_table_to_gitlab_partitions_dynamic_schema.rb2
-rw-r--r--doc/administration/incoming_email.md7
-rw-r--r--doc/architecture/blueprints/cdot_orders/index.md265
-rw-r--r--doc/user/profile/index.md2
-rw-r--r--lib/gitlab/checks/file_size_check/any_oversized_blobs.rb2
-rw-r--r--lib/gitlab/ci/config/entry/job.rb2
-rw-r--r--lib/tasks/gitlab/tw/codeowners.rake3
-rw-r--r--lib/unnested_in_filters/rewriter.rb3
-rw-r--r--locale/gitlab.pot7
-rw-r--r--package.json70
-rw-r--r--spec/frontend/__helpers__/dom_shims/clipboard_event.js1
-rw-r--r--spec/frontend/__helpers__/dom_shims/drag_event.js1
-rw-r--r--spec/frontend/__helpers__/dom_shims/index.js2
-rw-r--r--spec/frontend/batch_comments/components/submit_dropdown_spec.js4
-rw-r--r--spec/frontend/content_editor/extensions/horizontal_rule_spec.js2
-rw-r--r--spec/frontend/content_editor/extensions/word_break_spec.js8
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/publish_method_spec.js.snap2
-rw-r--r--spec/helpers/projects_helper_spec.rb18
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb12
-rw-r--r--spec/lib/gitlab/diff/formatters/file_formatter_spec.rb2
-rw-r--r--spec/policies/issue_policy_spec.rb68
-rw-r--r--spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb37
-rw-r--r--spec/scripts/lib/glfm/update_specification_spec.rb2
-rw-r--r--yarn.lock358
67 files changed, 821 insertions, 458 deletions
diff --git a/.eslintrc.yml b/.eslintrc.yml
index 494db5a9d92..595f4fc7b9a 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -132,6 +132,8 @@ rules:
message: 'Import { Mousetrap } from ~/lib/mousetrap instead.'
- name: vuex
message: 'See our documentation on "Migrating from VueX" for tips on how to avoid adding new VueX stores.'
+ - name: '@sentry/browser'
+ message: Use "import * as Sentry from '~/sentry/sentry_browser_wrapper';" instead
unicorn/prefer-dom-node-dataset:
- error
no-unsanitized/method:
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4559d7d43ba..d7759cdbedc 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -228,3 +228,7 @@ include:
- remote: 'https://gitlab.com/gitlab-org/frontend/untamper-my-lockfile/-/raw/main/templates/merge_request_pipelines.yml'
rules:
- <<: *if-not-security-canonical-sync
+ - local: .gitlab/ci/gitlab-com/*.gitlab-ci.yml
+ rules:
+ - if: '$CI_SERVER_HOST == "gitlab.com"'
+ - if: '$CI_SERVER_HOST == "jihulab.com"'
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index ea20717943d..20ee846e00a 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -537,6 +537,7 @@ lib/gitlab/checks/**
/doc/administration/repository_storage_paths.md @eread
/doc/administration/restart_gitlab.md @axil
/doc/administration/review_abuse_reports.md @phillipwells
+/doc/administration/review_spam_logs.md @phillipwells
/doc/administration/server_hooks.md @eread
/doc/administration/settings/account_and_limit_settings.md @msedlakjakubowski
/doc/administration/settings/continuous_integration.md @marcel.amirault
@@ -764,35 +765,34 @@ lib/gitlab/checks/**
/doc/development/audit_event_guide/ @eread
/doc/development/auto_devops.md @phillipwells
/doc/development/avoiding_required_stops.md @axil
-/doc/development/backend/ @sselhorn
/doc/development/backend/create_source_code_be/ @msedlakjakubowski
/doc/development/build_test_package.md @axil
/doc/development/bulk_import.md @eread @ashrafkhamis
/doc/development/cached_queries.md @jglassman1
/doc/development/cascading_settings.md @jglassman1
+/doc/development/cells/ @lciutacu
/doc/development/chatops_on_gitlabcom.md @phillipwells
/doc/development/cicd/ @marcel.amirault
/doc/development/cloud_connector/ @jglassman1
/doc/development/code_intelligence/ @aqualls
/doc/development/code_owners/ @msedlakjakubowski
/doc/development/code_suggestions/ @jglassman1
-/doc/development/contributing/ @sselhorn
+/doc/development/contributing/verify/ @marcel.amirault
/doc/development/database/ @aqualls
/doc/development/database/filtering_by_label.md @msedlakjakubowski
/doc/development/database/multiple_databases.md @lciutacu
/doc/development/database_review.md @aqualls
/doc/development/developing_with_solargraph.md @msedlakjakubowski
-/doc/development/development_processes.md @sselhorn
/doc/development/distribution/ @axil
/doc/development/documentation/ @sselhorn
/doc/development/export_csv.md @eread @ashrafkhamis
-/doc/development/fe_guide/ @sselhorn
/doc/development/fe_guide/customizable_dashboards.md @lciutacu
/doc/development/fe_guide/merge_request_widget_extensions.md @aqualls
+/doc/development/fe_guide/onboarding_course/ @sselhorn
/doc/development/fe_guide/source_editor.md @msedlakjakubowski
+/doc/development/fe_guide/style/ @aqualls
+/doc/development/fe_guide/view_component.md @sselhorn
/doc/development/feature_categorization/ @sselhorn
-/doc/development/feature_development.md @sselhorn
-/doc/development/feature_flags/ @sselhorn
/doc/development/fips_compliance.md @msedlakjakubowski
/doc/development/geo.md @axil
/doc/development/geo/ @axil
@@ -806,17 +806,14 @@ lib/gitlab/checks/**
/doc/development/identity_verification.md @phillipwells
/doc/development/image_scaling.md @lciutacu
/doc/development/import_export.md @eread @ashrafkhamis
-/doc/development/index.md @sselhorn
/doc/development/integrations/ @eread @ashrafkhamis
/doc/development/integrations/secure.md @rdickenson
/doc/development/integrations/secure_partner_integration.md @rdickenson
/doc/development/internal_analytics/ @lciutacu
/doc/development/internal_api/ @msedlakjakubowski
-/doc/development/internal_users.md @sselhorn
/doc/development/issuable-like-models.md @msedlakjakubowski
/doc/development/issue_types.md @msedlakjakubowski
/doc/development/kubernetes.md @phillipwells
-/doc/development/labels/ @sselhorn
/doc/development/lfs.md @msedlakjakubowski
/doc/development/maintenance_mode.md @axil
/doc/development/merge_request_concepts/ @aqualls
@@ -828,19 +825,18 @@ lib/gitlab/checks/**
/doc/development/packages/ @phillipwells
/doc/development/packages/cleanup_policies.md @marcel.amirault
/doc/development/packages/dependency_proxy.md @marcel.amirault
+/doc/development/packages/harbor_registry_development.md @marcel.amirault
/doc/development/permissions.md @jglassman1
/doc/development/permissions/ @jglassman1
/doc/development/policies.md @jglassman1
/doc/development/project_templates.md @msedlakjakubowski
+/doc/development/project_templates/ @msedlakjakubowski
/doc/development/rails_endpoints/ @msedlakjakubowski
/doc/development/real_time.md @jglassman1
-/doc/development/rubocop_development_guide.md @sselhorn
/doc/development/search/ @ashrafkhamis
/doc/development/sec/ @rdickenson
-/doc/development/secure_coding_guidelines.md @sselhorn
/doc/development/spam_protection_and_captcha/ @phillipwells
/doc/development/sql.md @aqualls
-/doc/development/testing_guide/ @sselhorn
/doc/development/value_stream_analytics.md @lciutacu
/doc/development/value_stream_analytics/ @lciutacu
/doc/development/work_items.md @msedlakjakubowski
@@ -917,6 +913,7 @@ lib/gitlab/checks/**
/doc/user/emoji_reactions.md @msedlakjakubowski
/doc/user/enterprise_user/ @jglassman1
/doc/user/feature_flags.md @sselhorn
+/doc/user/gitlab_duo_chat.md @sselhorn
/doc/user/group/ @lciutacu
/doc/user/group/clusters/ @phillipwells
/doc/user/group/compliance_frameworks.md @eread
@@ -982,7 +979,7 @@ lib/gitlab/checks/**
/doc/user/project/remote_development/ @ashrafkhamis
/doc/user/project/repository/code_suggestions/ @jglassman1
/doc/user/project/repository/file_finder.md @ashrafkhamis
-/doc/user/project/repository/managing_large_repositories.md @eread
+/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
@@ -995,7 +992,6 @@ lib/gitlab/checks/**
/doc/user/reserved_names.md @lciutacu
/doc/user/search/ @ashrafkhamis
/doc/user/search/command_palette.md @sselhorn
-/doc/user/shortcuts.md @ashrafkhamis
/doc/user/snippets.md @msedlakjakubowski
/doc/user/ssh.md @jglassman1
/doc/user/storage_management_automation.md @fneill
diff --git a/.gitlab/ci/gitlab-com/danger-review.gitlab-ci.yml b/.gitlab/ci/gitlab-com/danger-review.gitlab-ci.yml
new file mode 100644
index 00000000000..69bbbfa8da7
--- /dev/null
+++ b/.gitlab/ci/gitlab-com/danger-review.gitlab-ci.yml
@@ -0,0 +1,23 @@
+include:
+ - project: gitlab-org/quality/pipeline-common
+ ref: 7.5.2
+ file:
+ - /ci/danger-review.yml
+
+danger-review:
+ extends:
+ - .default-retry
+ - .ruby-node-cache
+ - .review:rules:danger
+ image: "${DEFAULT_CI_IMAGE}"
+ before_script:
+ - source scripts/utils.sh
+ - bundle_install_script "--with danger"
+ - yarn_install_script
+
+danger-review-local:
+ extends: danger-review
+ before_script:
+ - !reference ["danger-review", "before_script"]
+ # We unset DANGER_GITLAB_API_TOKEN so that Danger will run as local from `danger-review:script`
+ - unset DANGER_GITLAB_API_TOKEN
diff --git a/.gitlab/ci/review.gitlab-ci.yml b/.gitlab/ci/review.gitlab-ci.yml
index d4b199a9a81..1159bccb114 100644
--- a/.gitlab/ci/review.gitlab-ci.yml
+++ b/.gitlab/ci/review.gitlab-ci.yml
@@ -112,24 +112,3 @@ start-review-app-pipeline:
include:
- artifact: review-app-pipeline.yml
job: e2e-test-pipeline-generate
-
-include:
- - remote: 'https://gitlab.com/gitlab-org/quality/pipeline-common/-/raw/6.4.0/ci/danger-review.yml'
-
-danger-review:
- extends:
- - .default-retry
- - .ruby-node-cache
- - .review:rules:danger
- image: "${DEFAULT_CI_IMAGE}"
- before_script:
- - source scripts/utils.sh
- - bundle_install_script "--with danger"
- - yarn_install_script
-
-danger-review-local:
- extends: danger-review
- before_script:
- - !reference ["danger-review", "before_script"]
- # We unset DANGER_GITLAB_API_TOKEN so that Danger will run as local from `danger-review:script`
- - unset DANGER_GITLAB_API_TOKEN
diff --git a/.gitlab/issue_templates/Geo Replicate a new Git repository type.md b/.gitlab/issue_templates/Geo Replicate a new Git repository type.md
index 9e7d2634f3a..30a5b53ade6 100644
--- a/.gitlab/issue_templates/Geo Replicate a new Git repository type.md
+++ b/.gitlab/issue_templates/Geo Replicate a new Git repository type.md
@@ -687,7 +687,7 @@ The GraphQL API is used by `Admin > Geo > Replication Details` views, and is dir
module Types
module Geo
- # rubocop:disable Graphql/AuthorizeTypes because it is included
+ # rubocop:disable Graphql/AuthorizeTypes -- because it is included
class CoolWidgetRegistryType < BaseObject
graphql_name 'CoolWidgetRegistry'
diff --git a/.gitlab/issue_templates/Geo Replicate a new blob type.md b/.gitlab/issue_templates/Geo Replicate a new blob type.md
index 11ad6614bc2..228f19ea861 100644
--- a/.gitlab/issue_templates/Geo Replicate a new blob type.md
+++ b/.gitlab/issue_templates/Geo Replicate a new blob type.md
@@ -653,7 +653,7 @@ The GraphQL API is used by `Admin > Geo > Replication Details` views, and is dir
module Types
module Geo
- # rubocop:disable Graphql/AuthorizeTypes because it is included
+ # rubocop:disable Graphql/AuthorizeTypes -- because it is included
class CoolWidgetRegistryType < BaseObject
graphql_name 'CoolWidgetRegistry'
diff --git a/.rubocop_todo/layout/empty_line_after_magic_comment.yml b/.rubocop_todo/layout/empty_line_after_magic_comment.yml
index 2fbb94bf41b..16030ba4545 100644
--- a/.rubocop_todo/layout/empty_line_after_magic_comment.yml
+++ b/.rubocop_todo/layout/empty_line_after_magic_comment.yml
@@ -19,13 +19,8 @@ Layout/EmptyLineAfterMagicComment:
- 'app/graphql/resolvers/commit_pipelines_resolver.rb'
- 'app/graphql/resolvers/group_packages_resolver.rb'
- 'app/graphql/resolvers/merge_request_pipelines_resolver.rb'
- - 'app/graphql/resolvers/project_members_resolver.rb'
- - 'app/graphql/resolvers/project_milestones_resolver.rb'
- 'app/graphql/resolvers/project_packages_resolver.rb'
- 'app/graphql/resolvers/project_pipelines_resolver.rb'
- - 'app/graphql/resolvers/projects/snippets_resolver.rb'
- - 'app/graphql/resolvers/snippets_resolver.rb'
- - 'app/graphql/resolvers/users/snippets_resolver.rb'
- 'app/graphql/types/access_level_type.rb'
- 'app/graphql/types/ci/detailed_status_type.rb'
- 'app/graphql/types/ci/status_action_type.rb'
@@ -175,7 +170,6 @@ Layout/EmptyLineAfterMagicComment:
- 'ee/app/graphql/ee/types/repository/blob_type.rb'
- 'ee/app/graphql/types/analytics/devops_adoption/enabled_namespace_type.rb'
- 'ee/app/graphql/types/analytics/devops_adoption/snapshot_type.rb'
- - 'ee/app/graphql/types/compliance_management/compliance_framework_type.rb'
- 'ee/app/graphql/types/path_lock_type.rb'
- 'ee/app/graphql/types/product_analytics/panel_type.rb'
- 'ee/app/graphql/types/timebox_error_type.rb'
@@ -244,7 +238,6 @@ Layout/EmptyLineAfterMagicComment:
- 'ee/db/fixtures/development/25_downstream_pipelines.rb'
- 'ee/db/geo/migrate/20220617125507_create_ci_secure_file_registry.rb'
- 'ee/lib/compliance_management/merge_request_approval_settings/resolver.rb'
- - 'ee/lib/ee/api/internal/kubernetes.rb'
- 'ee/lib/ee/gitlab/ci/parsers/security/validators/schema_validator.rb'
- 'ee/lib/ee/gitlab/hook_data/group_member_builder.rb'
- 'ee/lib/ee/gitlab/hook_data/issue_builder.rb'
diff --git a/.rubocop_todo/lint/missing_cop_enable_directive.yml b/.rubocop_todo/lint/missing_cop_enable_directive.yml
index 1522d935008..5cd96255147 100644
--- a/.rubocop_todo/lint/missing_cop_enable_directive.yml
+++ b/.rubocop_todo/lint/missing_cop_enable_directive.yml
@@ -3,11 +3,6 @@ Lint/MissingCopEnableDirective:
Exclude:
- 'app/controllers/admin/users_controller.rb'
- 'app/controllers/projects/forks_controller.rb'
- - 'app/graphql/resolvers/project_members_resolver.rb'
- - 'app/graphql/resolvers/project_milestones_resolver.rb'
- - 'app/graphql/resolvers/projects/snippets_resolver.rb'
- - 'app/graphql/resolvers/snippets_resolver.rb'
- - 'app/graphql/resolvers/users/snippets_resolver.rb'
- 'app/graphql/types/access_level_type.rb'
- 'app/graphql/types/base_enum.rb'
- 'app/graphql/types/boards/board_issue_input_base_type.rb'
@@ -84,19 +79,7 @@ Lint/MissingCopEnableDirective:
- 'ee/app/graphql/types/ci/code_quality_degradation_type.rb'
- 'ee/app/graphql/types/ci/minutes/namespace_monthly_usage_type.rb'
- 'ee/app/graphql/types/ci/minutes/project_monthly_usage_type.rb'
- - 'ee/app/graphql/types/compliance_management/compliance_framework_type.rb'
- 'ee/app/graphql/types/dast/profile_cadence_type.rb'
- - 'ee/app/graphql/types/geo/ci_secure_file_registry_type.rb'
- - 'ee/app/graphql/types/geo/group_wiki_repository_registry_type.rb'
- - 'ee/app/graphql/types/geo/job_artifact_registry_type.rb'
- - 'ee/app/graphql/types/geo/lfs_object_registry_type.rb'
- - 'ee/app/graphql/types/geo/merge_request_diff_registry_type.rb'
- - 'ee/app/graphql/types/geo/package_file_registry_type.rb'
- - 'ee/app/graphql/types/geo/pages_deployment_registry_type.rb'
- - 'ee/app/graphql/types/geo/pipeline_artifact_registry_type.rb'
- - 'ee/app/graphql/types/geo/snippet_repository_registry_type.rb'
- - 'ee/app/graphql/types/geo/terraform_state_version_registry_type.rb'
- - 'ee/app/graphql/types/geo/upload_registry_type.rb'
- 'ee/app/graphql/types/network_policy_type.rb'
- 'ee/app/graphql/types/scan_type.rb'
- 'ee/app/graphql/types/scanned_resource_type.rb'
@@ -176,7 +159,6 @@ Lint/MissingCopEnableDirective:
- 'lib/gitlab/testing/request_inspector_middleware.rb'
- 'lib/gitlab/testing/robots_blocker_middleware.rb'
- 'lib/unnested_in_filters/dsl.rb'
- - 'lib/unnested_in_filters/rewriter.rb'
- 'qa/qa/scenario/test/integration/registry_with_cdn.rb'
- 'spec/benchmarks/banzai_benchmark.rb'
- 'spec/lib/gitlab/sidekiq_middleware/size_limiter/server_spec.rb'
diff --git a/Gemfile b/Gemfile
index 2107186fe15..3f9c49dcd53 100644
--- a/Gemfile
+++ b/Gemfile
@@ -449,7 +449,7 @@ group :development, :test do
end
group :development, :test, :danger do
- gem 'gitlab-dangerfiles', '~> 4.3.2', require: false, feature_category: :tooling
+ gem 'gitlab-dangerfiles', '~> 4.4.0', require: false, feature_category: :tooling
end
group :development, :test, :coverage do
diff --git a/Gemfile.checksum b/Gemfile.checksum
index 01ffbfa91bd..00d176e87e9 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -207,7 +207,7 @@
{"name":"gitaly","version":"16.5.0.pre.rc1","platform":"ruby","checksum":"ed17515ad04d4663a0efc15c8f2887b705f006133e8b10cc9321460eb0a38353"},
{"name":"gitlab","version":"4.19.0","platform":"ruby","checksum":"3f645e3e195dbc24f0834fbf83e8ccfb2056d8e9712b01a640aad418a6949679"},
{"name":"gitlab-chronic","version":"0.10.5","platform":"ruby","checksum":"f80f18dc699b708870a80685243331290bc10cfeedb6b99c92219722f729c875"},
-{"name":"gitlab-dangerfiles","version":"4.3.2","platform":"ruby","checksum":"978bd81e30faccc629f2cdbc6f320a1d225188fbc18f072b8a60abdb53e80a96"},
+{"name":"gitlab-dangerfiles","version":"4.4.0","platform":"ruby","checksum":"33e171e270bb943e0f012f4590fcf3571ea4be398fed4413cb7f5d108f878e68"},
{"name":"gitlab-experiment","version":"0.8.0","platform":"ruby","checksum":"b4e2f73e0af19cdd899a745f5a846c1318d44054e068a8f4ac887f6b1017d3f9"},
{"name":"gitlab-fog-azure-rm","version":"1.8.0","platform":"ruby","checksum":"e4f24b174b273b88849d12fbcfecb79ae1c09f56cbd614998714c7f0a81e6c28"},
{"name":"gitlab-labkit","version":"0.34.0","platform":"ruby","checksum":"ca5c504201390cd07ba1029e6ca3059f4e2e6005eb121ba8a103af1e166a3ecd"},
diff --git a/Gemfile.lock b/Gemfile.lock
index c5d2d2b1634..160bc37aba4 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -647,7 +647,7 @@ GEM
terminal-table (>= 1.5.1)
gitlab-chronic (0.10.5)
numerizer (~> 0.2)
- gitlab-dangerfiles (4.3.2)
+ gitlab-dangerfiles (4.4.0)
danger (>= 9.3.0)
danger-gitlab (>= 8.0.0)
rake (~> 13.0)
@@ -1814,7 +1814,7 @@ DEPENDENCIES
gettext_i18n_rails_js (~> 1.3)
gitaly (~> 16.5.0.pre.rc1)
gitlab-chronic (~> 0.10.5)
- gitlab-dangerfiles (~> 4.3.2)
+ gitlab-dangerfiles (~> 4.4.0)
gitlab-experiment (~> 0.8.0)
gitlab-fog-azure-rm (~> 1.8.0)
gitlab-http!
@@ -2041,4 +2041,4 @@ DEPENDENCIES
yajl-ruby (~> 1.4.3)
BUNDLED WITH
- 2.4.20
+ 2.4.21
diff --git a/app/assets/javascripts/batch_comments/components/submit_dropdown.vue b/app/assets/javascripts/batch_comments/components/submit_dropdown.vue
index fac45f32464..0527b56b464 100644
--- a/app/assets/javascripts/batch_comments/components/submit_dropdown.vue
+++ b/app/assets/javascripts/batch_comments/components/submit_dropdown.vue
@@ -1,5 +1,5 @@
<script>
-import { GlDropdown, GlButton, GlIcon, GlForm, GlFormCheckbox } from '@gitlab/ui';
+import { GlDisclosureDropdown, GlButton, GlIcon, GlForm, GlFormCheckbox } from '@gitlab/ui';
// eslint-disable-next-line no-restricted-imports
import { mapGetters, mapActions, mapState } from 'vuex';
import { __ } from '~/locale';
@@ -12,7 +12,7 @@ import { trackSavedUsingEditor } from '~/vue_shared/components/markdown/tracking
export default {
components: {
- GlDropdown,
+ GlDisclosureDropdown,
GlButton,
GlIcon,
GlForm,
@@ -64,17 +64,6 @@ export default {
mounted() {
this.noteData.noteable_type = this.noteableType;
this.noteData.noteable_id = this.getNoteableData.id;
-
- // We override the Bootstrap Vue click outside behaviour
- // to allow for clicking in the autocomplete dropdowns
- // without this override the submit dropdown will close
- // whenever a item in the autocomplete dropdown is clicked
- const originalClickOutHandler = this.$refs.submitDropdown.$refs.dropdown.clickOutHandler;
- this.$refs.submitDropdown.$refs.dropdown.clickOutHandler = (e) => {
- if (!e.target.closest('.atwho-container')) {
- originalClickOutHandler(e);
- }
- };
},
methods: {
...mapActions('batchComments', ['publishReview']),
@@ -113,86 +102,103 @@ export default {
updateNote(note) {
this.noteData.note = note;
},
+ onBeforeClose({ originalEvent: { target }, preventDefault }) {
+ if (
+ target &&
+ [document.querySelector('.atwho-container'), document.querySelector('.dz-hidden-input')]
+ .filter(Boolean)
+ .some((el) => el.contains(target))
+ ) {
+ preventDefault();
+ }
+ },
},
restrictedToolbarItems: ['full-screen'],
};
</script>
<template>
- <gl-dropdown
+ <gl-disclosure-dropdown
ref="submitDropdown"
- right
- dropup
+ placement="right"
class="submit-review-dropdown"
:class="{ 'submit-review-dropdown-animated': shouldAnimateReviewButton }"
data-testid="submit-review-dropdown"
- variant="info"
- category="primary"
+ fluid-width
+ @beforeClose="onBeforeClose"
>
- <template #button-content>
- {{ __('Finish review') }}
- <gl-icon class="dropdown-chevron" name="chevron-up" />
+ <template #toggle>
+ <gl-button variant="info" category="primary">
+ {{ __('Finish review') }}
+ <gl-icon class="dropdown-chevron" name="chevron-up" />
+ </gl-button>
+ </template>
+ <template #default>
+ <gl-form
+ class="submit-review-dropdown-form gl-p-4"
+ data-testid="submit-gl-form"
+ @submit.prevent="submitReview"
+ >
+ <div class="gl-display-flex gl-mb-4 gl-align-items-center">
+ <label for="review-note-body" class="gl-mb-0">
+ {{ __('Summary comment (optional)') }}
+ </label>
+ <summarize-my-review
+ v-if="canSummarize"
+ :id="getNoteableData.id"
+ class="gl-ml-auto"
+ @input="updateNote"
+ />
+ </div>
+ <div class="common-note-form gfm-form">
+ <markdown-editor
+ ref="markdownEditor"
+ v-model="noteData.note"
+ class="js-no-autosize"
+ :is-submitting="isSubmitting"
+ :render-markdown-path="getNoteableData.preview_note_path"
+ :markdown-docs-path="getNotesData.markdownDocsPath"
+ :form-field-props="formFieldProps"
+ enable-autocomplete
+ :autocomplete-data-sources="autocompleteDataSources"
+ :disabled="isSubmitting"
+ :restricted-tool-bar-items="$options.restrictedToolbarItems"
+ :force-autosize="false"
+ :autosave-key="autosaveKey"
+ supports-quick-actions
+ @input="$emit('input', $event)"
+ @keydown.meta.enter="submitReview"
+ @keydown.ctrl.enter="submitReview"
+ />
+ </div>
+ <template v-if="getNoteableData.current_user.can_approve">
+ <gl-form-checkbox
+ v-model="noteData.approve"
+ data-testid="approve_merge_request"
+ class="gl-mt-4"
+ >
+ {{ __('Approve merge request') }}
+ </gl-form-checkbox>
+ <approval-password
+ v-if="getNoteableData.require_password_to_approve"
+ v-show="noteData.approve"
+ v-model="noteData.approval_password"
+ class="gl-mt-3"
+ data-testid="approve_password"
+ />
+ </template>
+ <div class="gl-display-flex gl-justify-content-start gl-mt-4">
+ <gl-button
+ :loading="isSubmitting"
+ variant="confirm"
+ type="submit"
+ class="js-no-auto-disable"
+ data-testid="submit-review-button"
+ >
+ {{ __('Submit review') }}
+ </gl-button>
+ </div>
+ </gl-form>
</template>
- <gl-form data-testid="submit-gl-form" @submit.prevent="submitReview">
- <div class="gl-display-flex gl-mb-4 gl-align-items-center">
- <label for="review-note-body" class="gl-mb-0">
- {{ __('Summary comment (optional)') }}
- </label>
- <summarize-my-review
- v-if="canSummarize"
- :id="getNoteableData.id"
- class="gl-ml-auto"
- @input="updateNote"
- />
- </div>
- <div class="common-note-form gfm-form">
- <markdown-editor
- ref="markdownEditor"
- v-model="noteData.note"
- class="js-no-autosize"
- :is-submitting="isSubmitting"
- :render-markdown-path="getNoteableData.preview_note_path"
- :markdown-docs-path="getNotesData.markdownDocsPath"
- :form-field-props="formFieldProps"
- enable-autocomplete
- :autocomplete-data-sources="autocompleteDataSources"
- :disabled="isSubmitting"
- :restricted-tool-bar-items="$options.restrictedToolbarItems"
- :force-autosize="false"
- :autosave-key="autosaveKey"
- supports-quick-actions
- @input="$emit('input', $event)"
- @keydown.meta.enter="submitReview"
- @keydown.ctrl.enter="submitReview"
- />
- </div>
- <template v-if="getNoteableData.current_user.can_approve">
- <gl-form-checkbox
- v-model="noteData.approve"
- data-testid="approve_merge_request"
- class="gl-mt-4"
- >
- {{ __('Approve merge request') }}
- </gl-form-checkbox>
- <approval-password
- v-if="getNoteableData.require_password_to_approve"
- v-show="noteData.approve"
- v-model="noteData.approval_password"
- class="gl-mt-3"
- data-testid="approve_password"
- />
- </template>
- <div class="gl-display-flex gl-justify-content-start gl-mt-4">
- <gl-button
- :loading="isSubmitting"
- variant="confirm"
- type="submit"
- class="js-no-auto-disable"
- data-testid="submit-review-button"
- >
- {{ __('Submit review') }}
- </gl-button>
- </div>
- </gl-form>
- </gl-dropdown>
+ </gl-disclosure-dropdown>
</template>
diff --git a/app/assets/javascripts/content_editor/extensions/word_break.js b/app/assets/javascripts/content_editor/extensions/word_break.js
index 457b7c36564..01b19cbbd13 100644
--- a/app/assets/javascripts/content_editor/extensions/word_break.js
+++ b/app/assets/javascripts/content_editor/extensions/word_break.js
@@ -24,7 +24,7 @@ export default Node.create({
},
addInputRules() {
- const inputRegex = /^<wbr>$/;
+ const inputRegex = /<wbr>$/;
return [nodeInputRule({ find: inputRegex, type: this.type })];
},
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue
index a545ad1d09c..674683aa02f 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue
@@ -183,7 +183,12 @@ export default {
<span data-testid="right-secondary">
<gl-sprintf :message="publishedMessage">
<template v-if="isGroupPage" #projectName>
- <gl-link data-testid="root-link" :href="projectLink">{{ projectName }}</gl-link>
+ <gl-link
+ data-testid="root-link"
+ class="gl-text-decoration-underline"
+ :href="projectLink"
+ >{{ projectName }}</gl-link
+ >
</template>
<template #date>
<timeago-tooltip :time="packageEntity.createdAt" />
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/publish_method.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/publish_method.vue
index 8ecf433f3ab..2f74de9a615 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/list/publish_method.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/list/publish_method.vue
@@ -39,9 +39,12 @@ export default {
<span data-testid="pipeline-ref" class="gl-mr-2">{{ pipeline.ref }}</span>
<gl-icon name="commit" class="gl-mr-2" />
- <gl-link data-testid="pipeline-sha" :href="pipeline.commitPath" class="gl-mr-2">{{
- packageShaShort
- }}</gl-link>
+ <gl-link
+ data-testid="pipeline-sha"
+ :href="pipeline.commitPath"
+ class="gl-mr-2 gl-text-decoration-underline"
+ >{{ packageShaShort }}</gl-link
+ >
<clipboard-button
:text="pipeline.sha"
diff --git a/app/assets/stylesheets/page_bundles/merge_requests.scss b/app/assets/stylesheets/page_bundles/merge_requests.scss
index b00e1813696..440fc7ad586 100644
--- a/app/assets/stylesheets/page_bundles/merge_requests.scss
+++ b/app/assets/stylesheets/page_bundles/merge_requests.scss
@@ -994,24 +994,13 @@ $tabs-holder-z-index: 250;
}
}
-.submit-review-dropdown {
- &.show .dropdown-menu {
- width: calc(100vw - 20px);
- max-width: 680px;
- max-height: calc(100vh - 50px);
-
- .gl-dropdown-inner {
- max-height: none !important;
- }
- }
-
- .gl-dropdown-contents {
- padding: $gl-spacing-scale-4 !important;
- }
+.submit-review-dropdown .gl-new-dropdown-panel {
+ max-width: none;
+}
- .md-preview-holder {
- max-height: 182px;
- }
+.submit-review-dropdown-form {
+ width: calc(100vw - 20px);
+ max-width: 680px;
}
.submit-review-dropdown-animated {
@@ -1128,7 +1117,7 @@ $tabs-holder-z-index: 250;
padding-right: 0;
}
- .dropdown {
+ .submit-review-dropdown {
margin-left: $grid-size;
}
}
diff --git a/app/assets/stylesheets/page_bundles/wiki.scss b/app/assets/stylesheets/page_bundles/wiki.scss
index 4fb07328493..d87386f68ce 100644
--- a/app/assets/stylesheets/page_bundles/wiki.scss
+++ b/app/assets/stylesheets/page_bundles/wiki.scss
@@ -161,6 +161,16 @@
}
}
+.right-sidebar.wiki-sidebar {
+ .active > .wiki-list {
+ a,
+ .wiki-list-expand-button,
+ .wiki-list-collapse-button {
+ color: $white;
+ }
+ }
+}
+
ul.wiki-pages-list.content-list {
a {
color: var(--blue-600, $blue-600);
diff --git a/app/graphql/mutations/commits/create.rb b/app/graphql/mutations/commits/create.rb
index 02e1e4c78bf..cbe2c49e950 100644
--- a/app/graphql/mutations/commits/create.rb
+++ b/app/graphql/mutations/commits/create.rb
@@ -64,7 +64,7 @@ module Mutations
result = ::Files::MultiService.new(project, current_user, attributes).execute
{
- content: actions.pluck(:content), # rubocop:disable CodeReuse/ActiveRecord because actions is an Array, not a Relation
+ content: actions.pluck(:content), # rubocop:disable CodeReuse/ActiveRecord -- Array#pluck
commit: (project.repository.commit(result[:result]) if result[:status] == :success),
commit_pipeline_path: UrlHelpers.new.graphql_etag_pipeline_sha_path(result[:result]),
errors: Array.wrap(result[:message])
diff --git a/app/graphql/resolvers/analytics/cycle_analytics/deployment_count_resolver.rb b/app/graphql/resolvers/analytics/cycle_analytics/deployment_count_resolver.rb
index 51a1afdd5ab..2d722b02bf1 100644
--- a/app/graphql/resolvers/analytics/cycle_analytics/deployment_count_resolver.rb
+++ b/app/graphql/resolvers/analytics/cycle_analytics/deployment_count_resolver.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-# rubocop:disable Graphql/ResolverType (inherited from Resolvers::Analytics::CycleAnalytics::BaseCountResolver)
+# rubocop:disable Graphql/ResolverType -- inherited from Resolvers::Analytics::CycleAnalytics::BaseCountResolver
module Resolvers
module Analytics
module CycleAnalytics
diff --git a/app/graphql/resolvers/analytics/cycle_analytics/issue_count_resolver.rb b/app/graphql/resolvers/analytics/cycle_analytics/issue_count_resolver.rb
index fd20800ee16..32b884df84f 100644
--- a/app/graphql/resolvers/analytics/cycle_analytics/issue_count_resolver.rb
+++ b/app/graphql/resolvers/analytics/cycle_analytics/issue_count_resolver.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-# rubocop:disable Graphql/ResolverType (inherited from Resolvers::Analytics::CycleAnalytics::BaseIssueResolver)
+# rubocop:disable Graphql/ResolverType -- inherited from Resolvers::Analytics::CycleAnalytics::BaseIssueResolver
module Resolvers
module Analytics
module CycleAnalytics
diff --git a/app/graphql/resolvers/concerns/caching_array_resolver.rb b/app/graphql/resolvers/concerns/caching_array_resolver.rb
index 15bf9a90e46..f678e02533d 100644
--- a/app/graphql/resolvers/concerns/caching_array_resolver.rb
+++ b/app/graphql/resolvers/concerns/caching_array_resolver.rb
@@ -132,7 +132,7 @@ module CachingArrayResolver
model_class.arel_table[Arel.star]
end
- # rubocop: disable Graphql/Descriptions (false positive!)
+ # rubocop: disable Graphql/Descriptions -- false positive
def query_limit
field&.max_page_size.presence || context.schema.default_max_page_size
end
diff --git a/app/graphql/resolvers/group_issues_resolver.rb b/app/graphql/resolvers/group_issues_resolver.rb
index 5e0fb27bafa..5a6a3d678b9 100644
--- a/app/graphql/resolvers/group_issues_resolver.rb
+++ b/app/graphql/resolvers/group_issues_resolver.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-# rubocop:disable Graphql/ResolverType (inherited from Issues::BaseParentResolver)
+# rubocop:disable Graphql/ResolverType -- inherited from Issues::BaseParentResolver
module Resolvers
class GroupIssuesResolver < Issues::BaseParentResolver
def self.issuable_collection_name
diff --git a/app/graphql/resolvers/namespaces/work_items_resolver.rb b/app/graphql/resolvers/namespaces/work_items_resolver.rb
index 6985a7a898a..671788668b1 100644
--- a/app/graphql/resolvers/namespaces/work_items_resolver.rb
+++ b/app/graphql/resolvers/namespaces/work_items_resolver.rb
@@ -2,7 +2,7 @@
module Resolvers
module Namespaces
- # rubocop:disable Graphql/ResolverType (inherited from Resolvers::WorkItemsResolver)
+ # rubocop:disable Graphql/ResolverType -- inherited from Resolvers::WorkItemsResolver
class WorkItemsResolver < ::Resolvers::WorkItemsResolver
def ready?(**args)
return false if Feature.disabled?(:namespace_level_work_items, resource_parent)
diff --git a/app/graphql/resolvers/project_issues_resolver.rb b/app/graphql/resolvers/project_issues_resolver.rb
index f869d8f11c6..2bc610e8266 100644
--- a/app/graphql/resolvers/project_issues_resolver.rb
+++ b/app/graphql/resolvers/project_issues_resolver.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-# rubocop:disable Graphql/ResolverType (inherited from Issues::BaseParentResolver)
+# rubocop:disable Graphql/ResolverType -- inherited from Issues::BaseParentResolver
module Resolvers
class ProjectIssuesResolver < Issues::BaseParentResolver
accept_release_tag
diff --git a/app/graphql/resolvers/project_members_resolver.rb b/app/graphql/resolvers/project_members_resolver.rb
index e889b47c000..a27183438cd 100644
--- a/app/graphql/resolvers/project_members_resolver.rb
+++ b/app/graphql/resolvers/project_members_resolver.rb
@@ -1,5 +1,6 @@
# frozen_string_literal: true
-# rubocop:disable Graphql/ResolverType (inherited from MembersResolver)
+
+# rubocop:disable Graphql/ResolverType -- inherited from MembersResolver
module Resolvers
class ProjectMembersResolver < MembersResolver
@@ -17,3 +18,4 @@ module Resolvers
end
end
end
+# rubocop:enable Graphql/ResolverType
diff --git a/app/graphql/resolvers/project_milestones_resolver.rb b/app/graphql/resolvers/project_milestones_resolver.rb
index 567a55aa09b..cb4e9a5cdf7 100644
--- a/app/graphql/resolvers/project_milestones_resolver.rb
+++ b/app/graphql/resolvers/project_milestones_resolver.rb
@@ -1,5 +1,4 @@
# frozen_string_literal: true
-# rubocop:disable Graphql/ResolverType (inherited from MilestonesResolver)
module Resolvers
class ProjectMilestonesResolver < MilestonesResolver
diff --git a/app/graphql/resolvers/projects/snippets_resolver.rb b/app/graphql/resolvers/projects/snippets_resolver.rb
index 448918be2f5..9ab9db21e89 100644
--- a/app/graphql/resolvers/projects/snippets_resolver.rb
+++ b/app/graphql/resolvers/projects/snippets_resolver.rb
@@ -1,5 +1,6 @@
# frozen_string_literal: true
-# rubocop:disable Graphql/ResolverType (inherited from ResolvesSnippets)
+
+# rubocop:disable Graphql/ResolverType -- inherited from ResolvesSnippets
module Resolvers
module Projects
@@ -27,3 +28,4 @@ module Resolvers
end
end
end
+# rubocop:enable Graphql/ResolverType
diff --git a/app/graphql/resolvers/snippets_resolver.rb b/app/graphql/resolvers/snippets_resolver.rb
index 90f5f2cb534..759cc61a8a7 100644
--- a/app/graphql/resolvers/snippets_resolver.rb
+++ b/app/graphql/resolvers/snippets_resolver.rb
@@ -1,5 +1,6 @@
# frozen_string_literal: true
-# rubocop:disable Graphql/ResolverType (inherited from ResolvesSnippets)
+
+# rubocop:disable Graphql/ResolverType -- inherited from ResolvesSnippets
module Resolvers
class SnippetsResolver < BaseResolver
@@ -45,3 +46,4 @@ module Resolvers
end
end
end
+# rubocop:enable Graphql/ResolverType
diff --git a/app/graphql/resolvers/users/snippets_resolver.rb b/app/graphql/resolvers/users/snippets_resolver.rb
index 75bba8debab..ea5f6b7b8c9 100644
--- a/app/graphql/resolvers/users/snippets_resolver.rb
+++ b/app/graphql/resolvers/users/snippets_resolver.rb
@@ -1,5 +1,6 @@
# frozen_string_literal: true
-# rubocop:disable Graphql/ResolverType (inherited from ResolvesSnippets)
+
+# rubocop:disable Graphql/ResolverType -- inherited from ResolvesSnippets
module Resolvers
module Users
@@ -27,3 +28,4 @@ module Resolvers
end
end
end
+# rubocop:enable Graphql/ResolverType
diff --git a/app/graphql/types/security/codequality_reports_comparer/degradation_type.rb b/app/graphql/types/security/codequality_reports_comparer/degradation_type.rb
index fb7d722069f..e5fcd846190 100644
--- a/app/graphql/types/security/codequality_reports_comparer/degradation_type.rb
+++ b/app/graphql/types/security/codequality_reports_comparer/degradation_type.rb
@@ -3,7 +3,7 @@
module Types
module Security
module CodequalityReportsComparer
- # rubocop: disable Graphql/AuthorizeTypes (The resolver authorizes the request)
+ # rubocop: disable Graphql/AuthorizeTypes -- The resolver authorizes the request
class DegradationType < BaseObject
graphql_name 'CodequalityReportsComparerReportDegradation'
diff --git a/app/graphql/types/security/codequality_reports_comparer/report_type.rb b/app/graphql/types/security/codequality_reports_comparer/report_type.rb
index 8a41160141a..d20c9dd9ab6 100644
--- a/app/graphql/types/security/codequality_reports_comparer/report_type.rb
+++ b/app/graphql/types/security/codequality_reports_comparer/report_type.rb
@@ -3,7 +3,7 @@
module Types
module Security
module CodequalityReportsComparer
- # rubocop: disable Graphql/AuthorizeTypes (Parent node applies authorization)
+ # rubocop: disable Graphql/AuthorizeTypes -- Parent node applies authorization
class ReportType < BaseObject
graphql_name 'CodequalityReportsComparerReport'
diff --git a/app/graphql/types/security/codequality_reports_comparer/summary_type.rb b/app/graphql/types/security/codequality_reports_comparer/summary_type.rb
index cd4a594c193..43037be5245 100644
--- a/app/graphql/types/security/codequality_reports_comparer/summary_type.rb
+++ b/app/graphql/types/security/codequality_reports_comparer/summary_type.rb
@@ -3,7 +3,7 @@
module Types
module Security
module CodequalityReportsComparer
- # rubocop: disable Graphql/AuthorizeTypes (The resolver authorizes the request)
+ # rubocop: disable Graphql/AuthorizeTypes -- The resolver authorizes the request
class SummaryType < BaseObject
graphql_name 'CodequalityReportsComparerReportSummary'
diff --git a/app/graphql/types/security/codequality_reports_comparer_type.rb b/app/graphql/types/security/codequality_reports_comparer_type.rb
index 8088bf84627..c8c5a482830 100644
--- a/app/graphql/types/security/codequality_reports_comparer_type.rb
+++ b/app/graphql/types/security/codequality_reports_comparer_type.rb
@@ -2,7 +2,7 @@
module Types
module Security
- # rubocop: disable Graphql/AuthorizeTypes (The resolver authorizes the request)
+ # rubocop: disable Graphql/AuthorizeTypes -- The resolver authorizes the request
class CodequalityReportsComparerType < BaseObject
graphql_name 'CodequalityReportsComparer'
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index 04fe0a4450c..7dc0f63924f 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -200,6 +200,10 @@ module ProjectsHelper
.load_in_batch_for_projects(projects)
end
+ def load_catalog_resources(projects)
+ ActiveRecord::Associations::Preloader.new(records: projects, associations: :catalog_resource).call
+ end
+
def last_pipeline_from_status_cache(project)
if Feature.enabled?(:last_pipeline_from_pipeline_status, project)
pipeline_status = project.pipeline_status
diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index 0bdce18bab5..ae970ca9e6b 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -8,12 +8,15 @@ class Deployment < ApplicationRecord
include Importable
include Gitlab::Utils::StrongMemoize
include FastDestroyAll
+ include IgnorableColumns
StatusUpdateError = Class.new(StandardError)
StatusSyncError = Class.new(StandardError)
ARCHIVABLE_OFFSET = 50_000
+ ignore_column :cluster_id, remove_with: '16.8', remove_after: '2023-12-22'
+
belongs_to :project, optional: false
belongs_to :environment, optional: false
belongs_to :user
diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb
index 2ab59f5a34d..ca170133105 100644
--- a/app/policies/group_policy.rb
+++ b/app/policies/group_policy.rb
@@ -121,6 +121,7 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
enable :upload_file
enable :guest_access
enable :read_release
+ enable :award_emoji
end
rule { admin }.policy do
diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb
index 37a829e3014..fb6544a910a 100644
--- a/app/services/merge_requests/update_service.rb
+++ b/app/services/merge_requests/update_service.rb
@@ -168,6 +168,7 @@ module MergeRequests
merge_request.target_branch
)
+ delete_approvals_on_target_branch_change(merge_request)
refresh_pipelines_on_merge_requests(merge_request, allow_duplicate: true)
abort_auto_merge(merge_request, 'target branch was changed')
@@ -321,6 +322,10 @@ module MergeRequests
def trigger_merge_request_status_updated(merge_request)
GraphqlTriggers.merge_request_merge_status_updated(merge_request)
end
+
+ def delete_approvals_on_target_branch_change(_merge_request)
+ # Overridden in EE. No-op since we only want to delete approvals in EE.
+ end
end
end
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index 93f4fe62568..21004b7eb8a 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -12,6 +12,8 @@
= @project.name
= visibility_level_content(@project, css_class: 'visibility-icon gl-text-secondary gl-ml-2', icon_css_class: 'icon')
= render_if_exists 'compliance_management/compliance_framework/compliance_framework_badge', project: @project, additional_classes: 'gl-align-self-center gl-ml-2'
+ - if @project.catalog_resource
+ = render partial: 'shared/ci_catalog_badge', locals: { href: project_ci_catalog_resource_path(@project, @project.catalog_resource) }
- if @project.group
= render_if_exists 'shared/tier_badge', source: @project, source_type: 'Project'
.home-panel-metadata.gl-font-sm.gl-text-secondary.gl-font-base.gl-font-weight-normal.gl-line-height-normal{ data: { testid: 'project-id-content' }, itemprop: 'identifier' }
diff --git a/app/views/shared/_ci_catalog_badge.html.haml b/app/views/shared/_ci_catalog_badge.html.haml
new file mode 100644
index 00000000000..345bfb5e022
--- /dev/null
+++ b/app/views/shared/_ci_catalog_badge.html.haml
@@ -0,0 +1 @@
+= render Pajamas::BadgeComponent.new(s_('CiCatalog|CI/CD catalog resource'), variant: 'info', icon: 'catalog-checkmark', class: 'gl-mx-2', href: href)
diff --git a/app/views/shared/projects/_list.html.haml b/app/views/shared/projects/_list.html.haml
index 14785870dc0..74c325383a1 100644
--- a/app/views/shared/projects/_list.html.haml
+++ b/app/views/shared/projects/_list.html.haml
@@ -32,6 +32,7 @@
- if any_projects?(projects)
- load_pipeline_status(projects) if pipeline_status
- load_max_project_member_accesses(projects) # Prime cache used in shared/projects/project view rendered below
+ - load_catalog_resources(projects)
%ul.projects-list.gl-text-secondary.gl-w-full.gl-my-2{ class: css_classes }
- projects.each_with_index do |project, i|
- css_class = (i >= projects_limit) || project.pending_delete? ? 'hide' : nil
diff --git a/app/views/shared/projects/_project.html.haml b/app/views/shared/projects/_project.html.haml
index 2de4a9d7780..fc9522e3f32 100644
--- a/app/views/shared/projects/_project.html.haml
+++ b/app/views/shared/projects/_project.html.haml
@@ -37,6 +37,9 @@
= visibility_level_content(project, css_class: 'gl-mr-3')
+ - if project.catalog_resource
+ = render partial: 'shared/ci_catalog_badge', locals: { href: project_ci_catalog_resource_path(project, project.catalog_resource) }
+
- if explore_projects_tab? && project_license_name(project)
%span.gl-display-inline-flex.gl-align-items-center.gl-mr-3
= sprite_icon('scale', size: 14, css_class: 'gl-mr-2')
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index 1969bd0dc9a..87b3b7391c2 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -657,8 +657,6 @@
- 1
- - security_scan_result_policies_sync_any_merge_request_approval_rules
- 1
-- - security_scan_result_policies_sync_opened_merge_requests
- - 1
- - security_scan_result_policies_sync_project
- 1
- - security_scans
diff --git a/db/post_migrate/20220902204048_move_security_findings_table_to_gitlab_partitions_dynamic_schema.rb b/db/post_migrate/20220902204048_move_security_findings_table_to_gitlab_partitions_dynamic_schema.rb
index 7b80b6a15bd..62511e0e616 100644
--- a/db/post_migrate/20220902204048_move_security_findings_table_to_gitlab_partitions_dynamic_schema.rb
+++ b/db/post_migrate/20220902204048_move_security_findings_table_to_gitlab_partitions_dynamic_schema.rb
@@ -147,7 +147,6 @@ class MoveSecurityFindingsTableToGitlabPartitionsDynamicSchema < Gitlab::Databas
latest_partition.match(/security_findings_(\d+)/).captures.first
end
- # rubocop:disable Migration/DropTable (These methods are called from the `down` method)
def create_non_partitioned_security_findings_with_data
with_lock_retries do
lock_tables
@@ -227,6 +226,5 @@ class MoveSecurityFindingsTableToGitlabPartitionsDynamicSchema < Gitlab::Databas
SQL
end
end
- # rubocop:enable Migration/DropTable
end
# rubocop:enable Migration/WithLockRetriesDisallowedMethod
diff --git a/doc/administration/incoming_email.md b/doc/administration/incoming_email.md
index 6948009aab2..33afaf19220 100644
--- a/doc/administration/incoming_email.md
+++ b/doc/administration/incoming_email.md
@@ -68,7 +68,8 @@ this method only supports replies, and not the other features of [incoming email
## Accepted headers
-> Accepting `Received` headers [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81489) in GitLab 14.9.
+> - Accepting `Received` headers [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81489) in GitLab 14.9.
+> - Accepting `Cc` headers [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/348572) in GitLab 16.5.
Email is processed correctly when a configured email address is present in one of the following headers
(sorted in the order they are checked):
@@ -77,6 +78,7 @@ Email is processed correctly when a configured email address is present in one o
- `Delivered-To`
- `Envelope-To` or `X-Envelope-To`
- `Received`
+- `Cc`
The `References` header is also accepted, however it is used specifically to relate email responses to existing discussion threads. It is not used for creating issues by email.
@@ -86,8 +88,7 @@ also checks accepted headers.
Usually, the "To" field contains the email address of the primary receiver.
However, it might not include the configured GitLab email address if:
-- The address is in the "CC" field.
-- The address was included when using "Reply all".
+- The address is in the "BCC" field.
- The email was forwarded.
The `Received` header can contain multiple email addresses. These are checked in the order that they appear.
diff --git a/doc/architecture/blueprints/cdot_orders/index.md b/doc/architecture/blueprints/cdot_orders/index.md
new file mode 100644
index 00000000000..924a50d2b8a
--- /dev/null
+++ b/doc/architecture/blueprints/cdot_orders/index.md
@@ -0,0 +1,265 @@
+---
+status: proposed
+creation-date: "2023-10-12"
+authors: [ "@tyleramos" ]
+coach: "@fabiopitino"
+approvers: [ "@tgolubeva", "@jameslopez" ]
+owning-stage: "~devops::fulfillment"
+participating-stages: []
+---
+
+# Align CustomersDot Orders with Zuora Orders
+
+## Summary
+
+The [GitLab Customers Portal](https://customers.gitlab.com/) is an application separate from the GitLab product that allows GitLab Customers to manage their account and subscriptions, tasks like purchasing additional seats. More information about the Customers Portal can be found in [the GitLab docs](../../../subscriptions/customers_portal.md). Internally, the application is known as [CustomersDot](https://gitlab.com/gitlab-org/customers-gitlab-com) (also known as CDot).
+
+GitLab uses [Zuora's platform](https://about.gitlab.com/handbook/business-technology/enterprise-applications/guides/zuora/) to manage their subscription-based services. CustomersDot integrates directly with Zuora Billing and treats [Zuora Billing](https://about.gitlab.com/handbook/finance/accounting/finance-ops/billing-ops/zuora-billing/) as the single source of truth for subscription data.
+
+CustomersDot stores some subscription and order data locally, in the form of the `orders` database table, which at times can be out of sync with Zuora Billing. The main objective for this blueprint is to lay out a plan for improving the integration with Zuora Billing, making it more reliable, accurate, and performant.
+
+## Motivation
+
+Working with the `Order` model in CustomersDot has been a challenge for Fulfillment engineers. It is difficult to trust `Order` data as it can get out of sync with the single source of truth for subscription data, Zuora Billing. This has led to bugs, confusion and delays in feature development. An [epic exists for aligning CustomersDot Orders with Zuora objects](https://gitlab.com/groups/gitlab-org/-/epics/9748) which lists a variety of issues related to these data integrity problems. The motivation of this blueprint is to develop a better data architecture in CustomersDot for Subscriptions and associated data models which builds trust and reduces bugs.
+
+### Goals
+
+This re-architecture project has several multifaceted objectives.
+
+- Increase the accuracy of CustomersDot data pertaining to Subscriptions and its entitlements. This data is stored as `Order` records in CustomersDot - it is not granular enough to represent what the customer has purchased, and it is error prone as shown by the following issues:
+ - [Multiple order records for the same subscription](https://gitlab.com/gitlab-org/customers-gitlab-com/-/issues/6971)
+ - [Multiple subscriptions active for the same namespace](https://gitlab.com/gitlab-org/customers-gitlab-com/-/issues/6972)
+ - [Support Multiple Active Orders on a Namespace](https://gitlab.com/groups/gitlab-org/-/epics/9486)
+- Continue to align with Zuora Billing being the SSoT for Subscription and Order data.
+- Decrease dependency and reliance on Zuora Billing uptime.
+- Improve CustomersDot performance by storing relevant Subscription data locally and keeping it in sync with Zuora Billing. This could be a key piece to making Seat Link more efficient and reliable.
+- Eliminate confusion between CustomersDot Orders, which contain data more closely resembling a Subscription, and [Zuora Orders](https://knowledgecenter.zuora.com/Zuora_Billing/Manage_subscription_transactions/Orders), which represent a transaction between a customer and merchant and can apply to multiple Subscriptions.
+ - The CustomersDot `orders` table contains a mixture of Zuora Subscription and trials, along with GitLab-specific metadata like sync timestamps with GitLab.com. GitLab does not store trial subscriptions in Zuora at this time.
+
+## Proposal
+
+As the list of goals above shows, there are a good number of desired outcomes we would like to see at the end of implementation. To reach these goals, we will break this work up into smaller iterations.
+
+1. [Phase one: Zuora Subscription Cache](#phase-one-zuora-subscription-cache)
+
+ The first iteration focuses on adding a local cache for Zuora Subscription objects, including Rate Plans, Rate Plan Charges, and Rate Plan Charge Tiers, in CustomersDot.
+
+1. [Phase two: Utilize Zuora Cache Models](#phase-two-utilize-zuora-cache-models)
+
+ The second phase involves using the Zuora cache models introduced in phase one. Any code in CustomersDot that makes a read request to Zuora for Subscription data should be replaced with an ActiveRecord query. This should result in a big performance improvement.
+
+1. [Phase three: Transition from `Order` to `Subscription`](#phase-three-transition-from-order-to-subscription)
+
+ The next iteration focuses on transitioning away from the CustomersDot `Order` model to a new model for Subscription.
+
+## Design and implementation details
+
+### Phase one: Zuora Subscription Cache
+
+The first phase for this blueprint focuses on adding new models for caching Zuora Subscription data locally in CustomersDot. These local data models will allow CustomersDot to query the local database for Zuora Subscriptions. Currently, this requires querying directly to Zuora which can be problematic if Zuora is experiencing downtime. Zuora also has rate limits for API usage which we want to avoid as CustomersDot continues to scale.
+
+This phase will consist of creating the new data models, building the mechanisms to keep the local data in sync with Zuora, and backfilling the existing data. It will be important that the local cache models are read-only for most of the application to ensure the data is always in sync. Only the syncing mechanism should have the ability to write to these models.
+
+#### Proposed DB schema
+
+```mermaid
+erDiagram
+ "Zuora::Subscription" ||--|{ "Zuora::RatePlan" : "has many"
+ "Zuora::RatePlan" ||--|{ "Zuora::RatePlanCharge" : "has many"
+ "Zuora::RatePlanCharge" ||--|{ "Zuora::RatePlanChargeTier" : "has many"
+
+ "Zuora::Subscription" {
+ string(64) zuora_id PK "`id` field on Zuora Subscription"
+ string(64) account_id
+ string name
+ string(64) previous_subscription_id
+ string status
+ date term_start_date
+ date term_end_date
+ int version
+ boolean auto_renew "null:false default:false"
+ date cancelled_date
+ string(64) created_by_id
+ integer current_term
+ string current_term_period_type
+ string eoa_starter_bronze_offer_accepted__c
+ string external_subscription_id__c
+ string external_subscription_source__c
+ string git_lab_namespace_id__c
+ string git_lab_namespace_name__c
+ integer initial_term
+ string(64) invoice_owner_id
+ string notes
+ string opportunity_id__c
+ string(64) original_id
+ string(64) ramp_id
+ string renewal_subscription__c__c
+ integer renewal_term
+ date subscription_end_date
+ date subscription_start_date
+ string turn_on_auto_renew__c
+ string turn_on_cloud_licensing__c
+ string turn_on_operational_metrics__c
+ string turn_on_seat_reconciliation__c
+ datetime created_date
+ datetime updated_date
+ datetime created_at
+ datetime updated_at
+ }
+
+ "Zuora::RatePlan" {
+ string(64) zuora_id PK "`id` field on Zuora RatePlan"
+ string(64) subscription_id FK
+ string name
+ string(64) product_rate_plan_id
+ datetime created_date
+ datetime updated_date
+ datetime created_at
+ datetime updated_at
+ }
+
+ "Zuora::RatePlanCharge" {
+ string(64) zuora_id PK "`id` field on Zuora RatePlanCharge"
+ string(64) rate_plan_id FK
+ string(64) product_rate_plan_charge_id
+ int quantity
+ date effective_start_date
+ date effective_end_date
+ string price_change_option
+ string charge_number
+ string charge_type
+ boolean is_last_segment "null:false default:false"
+ int segment
+ int mrr
+ int tcv
+ int dmrc
+ int dtcv
+ string(64) subscription_id
+ string(64) subscription_owner_id
+ int version
+ datetime created_date
+ datetime updated_date
+ datetime created_at
+ datetime updated_at
+ }
+
+ "Zuora::RatePlanChargeTier" {
+ string zuora_id PK "`id` field on Zuora RatePlanChargeTier"
+ string rate_plan_charge_id FK
+ string price
+ datetime created_date
+ datetime updated_date
+ datetime created_at
+ datetime updated_at
+ }
+```
+
+#### Notes
+
+- The namespace `Zuora` is already taken by the classes used to extend `IronBank` resource classes. It was decided to move these to the namespace `Zuora::Remote` to indicate these are intended to reach out to Zuora. This frees up the `Zuora` namespace to be used to group the models related to Zuora cached data.
+- All versions of Zuora Subscriptions will be stored in this table to be able to support display of current as well as future purchases when Zuora is down. One of the guiding principles from the Architecture Review meeting on 2023-08-06 was "Customers should be able to view and access what they purchased even if Zuora is down". Given that customers can make future-dated purchases, CustomersDot needs to store current and future versions of Subscriptions.
+- `zuora_id` would be the primary key given we want to avoid the field name `id` which is magical in ActiveRecord.
+- The timezone for Zuora Billing is configured as Pacific Time. Let's account for this timezone as we sync data from Zuora into CDot's cached models to allow for more accurate comparisons.
+
+#### Keeping data in sync with Zuora
+
+CDot currently receives and processes `Order Processed` Zuora callouts for Order actions like `Update Product` ([full list](https://gitlab.com/gitlab-org/customers-gitlab-com/-/blob/64c5d17bac38bef1156e9a15008cc7d2b9aa46a9/lib/zuora/order.rb#L26)). These callouts help to keep CustomersDot in sync with Zuora and trigger provisioning events. These callouts will be important to keeping `Zuora::Subscription` and related cached models in sync with changes in Zuora.
+
+This existing callout would not be sufficient to cover all changes to a Zuora Subscription though. In particular, changes to custom fields may not be captured by these existing callouts. We will need to create custom events and callouts for any custom field cached in CustomersDot for any of these resources to ensure CDot is in sync with Zuora. This should only affect `Zuora::Subscription` though as no custom fields are used by CustomersDot on any of the other proposed cached resources at this time.
+
+#### Rollout of Zuora Cache models
+
+With the first iteration of introducing the cached Zuora data models, we will take an iterative approach to the rollout. There should be no impact to existing functionality as we build out the models, start populating the data through callouts, and backfill these models. Once this is in place, we will iteratively update existing features to use these cached data models instead of querying Zuora directly.
+
+We will make this transition using many small scoped feature flags, rather than one large feature flag to gate all of the new logic using these cache models. This will help us deliver more quickly and reduce the length with which feature flag logic is maintained and test cases are retained.
+
+Testing can be performed before the cached models are used in the codebase to ensure data integrity of the cached models.
+
+### Phase two: Utilize Zuora Cache Models
+
+This phase covers the second phase of work of the Orders re-architecture. In this phase, the focus will be utilizing the new Zuora cache data models introduced in phase one. Querying Zuora for Subscription data is fundamental to Customers so there are plenty of places that will need to be updated. In the places where CDot is reading from Zuora, it can be replaced by querying the local cache data models instead. This should result in a big performance boost by avoiding third party requests, particularly in components like the Seat Link Service.
+
+This transition will be completed using many small scoped feature flags, rather than one large feature flag to gate all of the new logic using these cache models. This will help to deliver more quickly and reduce the length with which feature flag logic is maintained and test cases are retained.
+
+### Phase three: Transition from `Order` to `Subscription`
+
+The second phase for this blueprint focuses on transitioning away from the CustomersDot `Order` model to a new model for `Subscription`. This phase will consist of creating a new model for `Subscription`, supporting both models during the transition period, updating existing code to use `Subscription` and finally removing the `Order` model once it is no longer needed.
+
+Replacing the `Order` model with a `Subscription` model should address the goal of eliminating confusion around the `Order` model. The data stored in the CustomersDot `Order` model does not correspond to a Zuora Order. It more closely resembles a Zuora Subscription with some additional metadata about syncing with GitLab.com. The transition to a `Subscription` model, along with the local cache layer in phase one, should address the goal of better data accuracy and building trust in CustomersDot data.
+
+#### Proposed DB schema
+
+```mermaid
+erDiagram
+ Subscription ||--|{ "Zuora::Subscription" : "has many"
+
+ Subscription {
+ bigint id PK
+ bigint billing_account_id
+ string(64) zuora_account_id
+ string(64) zuora_subscription_id
+ string zuora_subscription_name
+ string gitlab_namespace_id
+ string gitlab_namespace_name
+ datetime last_extra_ci_minutes_sync_at
+ datetime increased_billing_rate_notified_at
+ boolean reconciliation_accepted "null:false default:false"
+ datetime seat_overage_notified_at
+ datetime auto_renew_error_notified_at
+ date monthly_seat_digest_notified_on
+ datetime created_at
+ datetime updated_at
+ }
+
+ "Zuora::Subscription" {
+ string(64) zuora_id PK "`id` field on Zuora Subscription"
+ string(64) account_id
+ string name
+ }
+```
+
+#### Notes
+
+- The name for this model is up for debate given a `Subscription` model already exists. The existing model could be renamed with the hope of eventually replacing it with the new model.
+- This model serves as a record of the Subscription that is modifiable by the CDot application, whereas the `Zuora::Subscription` table below should be read-only.
+- `zuora_account_id` could be added as a convenience but could also be fetched via the `billing_account`.
+- There will be one `Subscription` record per actual subscription instead of a Subscription version.
+ - This has the advantage of avoiding duplication of fields like `gitlab_namespace_id` or `last_extra_ci_minutes_sync_at`.
+ - The `zuora_subscription_id` column could be removed or kept as a reference to the latest Zuora Subscription version.
+
+#### Keeping data in sync with Zuora
+
+The `Subscription` model should stay in sync with Zuora as subscriptions are created or updated. This model will be synced when we sync `Zuora::Subscription` records, similar to how the cached models are synced when processing Zuora callouts as described in phase one. When saving a new version of a `Zuora::Subscription`, an update could be made to the `Subscription` record with the matching `zuora_subscription_name`, or create a `Subscription` if one does not exist. The `zuora_subscription_id` would be set to the latest version on typical updates. Most of the data on `Subscription` is GitLab metadata (e.g. `last_extra_ci_minutes_sync_at`) so it wouldn't need to be updated.
+
+The exception to this update rule are the `zuora_account_id` and `billing_account_id` attributes. Let's consider the current behavior when processing an `Order Processed` callout in CDot if the `zuora_account_id` changes for a Zuora Subscription:
+
+1. The Billing Account Membership is updated to the new Billing Account for the CDot `Customer` matching the Sold To email address.
+1. CDot attempts to find the CDot `Order` with the new `billing_account_id` and `subscription_name`.
+1. If an `Order` isn't found matching this criteria, a new `Order` is created. This leads to two `Order` records for the same Zuora Subscription.
+
+This scenario should be avoided for the new `Subscription` model. One `Subscription` should exist for a unique `Zuora::Subscription` name. If the Zuora Subscription transfers Accounts, the `Subscription` should as well.
+
+#### Unknowns
+
+Several unknowns are outlined below. As we get further into implementation, these unknown should become clearer.
+
+##### Trial data in Subscription?
+
+The CDot `Order` model contains paid subscription data as well as trials. For `Subscription`, we could choose to continue to have paid subscription and trial data together in the same table, or break them into their own models.
+
+The `orders` table has fields for `customer_id` and `trial` which only really concern trials. Should these fields be added to the `Subscription` table? Should `Subscription` contain trial information if it doesn't exist in Zuora?
+
+If trial orders were broken out into their own table, these are the columns likely needed for a (SaaS) `trials` table:
+
+- `customer_id`
+- `product_rate_plan_id` (or rename to `plan_id` or use `plan_code`)
+- `quantity`
+- `start_date`
+- `end_date`
+- `gl_namespace_id`
+- `gl_namespace_name`
+
+### Resources
+
+- [FY24Q3 OKR - Create plan to align CustomersDot Orders to Zuora Orders](https://gitlab.com/gitlab-com/gitlab-OKRs/-/work_items/3378)
+- [Epic &9748 - Align CustomersDot Orders to Zuora objects](https://gitlab.com/groups/gitlab-org/-/epics/9748)
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index fea9bc491cf..f868bef8ece 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -128,7 +128,7 @@ to match your username.
## Add external accounts to your user profile page
-> Mastodon user account [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/132892) as a beta feature in 16.5 [with a flag](../feature_flags.md) named `mastodon_social_ui`. Disabled by default.
+> Mastodon user account [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/132892) in 16.6 [with a flag](../feature_flags.md) named `mastodon_social_ui`. Disabled by default. This feature is in [Beta](../../policy/experiment-beta-support.md#beta).
You can add links to certain other external accounts you might have, like Skype and Twitter.
They can help other users connect with you on other platforms.
diff --git a/lib/gitlab/checks/file_size_check/any_oversized_blobs.rb b/lib/gitlab/checks/file_size_check/any_oversized_blobs.rb
index 35f969dbb46..b8c6bdee1bb 100644
--- a/lib/gitlab/checks/file_size_check/any_oversized_blobs.rb
+++ b/lib/gitlab/checks/file_size_check/any_oversized_blobs.rb
@@ -6,7 +6,7 @@ module Gitlab
class AnyOversizedBlobs
def initialize(project:, changes:, file_size_limit_megabytes:)
@project = project
- @newrevs = changes.pluck(:newrev).compact # rubocop:disable CodeReuse/ActiveRecord just plucking from an array
+ @newrevs = changes.pluck(:newrev).compact # rubocop:disable CodeReuse/ActiveRecord -- Array#pluck
@file_size_limit_megabytes = file_size_limit_megabytes
end
diff --git a/lib/gitlab/ci/config/entry/job.rb b/lib/gitlab/ci/config/entry/job.rb
index bf8a99ef45e..f70afa2dad3 100644
--- a/lib/gitlab/ci/config/entry/job.rb
+++ b/lib/gitlab/ci/config/entry/job.rb
@@ -40,7 +40,7 @@ module Gitlab
if needs_value[:job].nil? && needs_value[:cross_dependency].present?
errors.add(:needs, "corresponding to dependencies must be from the same pipeline")
else
- missing_needs = dependencies - needs_value[:job].pluck(:name) # rubocop:disable CodeReuse/ActiveRecord (Array#pluck)
+ missing_needs = dependencies - needs_value[:job].pluck(:name) # rubocop:disable CodeReuse/ActiveRecord -- Array#pluck
errors.add(:dependencies, "the #{missing_needs.join(", ")} should be part of needs") if missing_needs.any?
end
diff --git a/lib/tasks/gitlab/tw/codeowners.rake b/lib/tasks/gitlab/tw/codeowners.rake
index 495d7a339b8..a4c1f18970d 100644
--- a/lib/tasks/gitlab/tw/codeowners.rake
+++ b/lib/tasks/gitlab/tw/codeowners.rake
@@ -26,7 +26,8 @@ namespace :tw do
CodeOwnerRule.new('Analytics Instrumentation', '@lciutacu'),
CodeOwnerRule.new('Anti-Abuse', '@phillipwells'),
CodeOwnerRule.new('Cloud Connector', '@jglassman1'),
- CodeOwnerRule.new('Authentication and Authorization', '@jglassman1'),
+ CodeOwnerRule.new('Authentication', '@jglassman1'),
+ CodeOwnerRule.new('Authorization', '@jglassman1'),
# CodeOwnerRule.new('Billing and Subscription Management', ''),
CodeOwnerRule.new('Code Creation', '@jglassman1'),
CodeOwnerRule.new('Code Review', '@aqualls'),
diff --git a/lib/unnested_in_filters/rewriter.rb b/lib/unnested_in_filters/rewriter.rb
index 9eb1c0b8273..2e334eb147b 100644
--- a/lib/unnested_in_filters/rewriter.rb
+++ b/lib/unnested_in_filters/rewriter.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-# rubocop:disable CodeReuse/ActiveRecord (This module is generating ActiveRecord relations therefore using AR methods is necessary)
+# rubocop:disable CodeReuse/ActiveRecord -- This module is generating ActiveRecord relations therefore using AR methods is necessary
module UnnestedInFilters
class Rewriter
include Gitlab::Utils::StrongMemoize
@@ -295,3 +295,4 @@ module UnnestedInFilters
end
end
end
+# rubocop:enable CodeReuse/ActiveRecord
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 3b245f8d3ed..31013cad5fa 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -10184,6 +10184,9 @@ msgstr ""
msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
+msgid "CiCatalog|CI/CD catalog resource"
+msgstr ""
+
msgid "CiCatalog|Component ID not found, or you do not have permission to access component."
msgstr ""
@@ -41830,7 +41833,7 @@ msgstr ""
msgid "ScanResultPolicy|Pre-existing"
msgstr ""
-msgid "ScanResultPolicy|Prevent approval by anyone who added a commit"
+msgid "ScanResultPolicy|Prevent approval by commit author"
msgstr ""
msgid "ScanResultPolicy|Prevent approval by merge request's author"
@@ -41845,7 +41848,7 @@ msgstr ""
msgid "ScanResultPolicy|Recommended setting"
msgstr ""
-msgid "ScanResultPolicy|Remove all approvals when commit is added"
+msgid "ScanResultPolicy|Remove all approvals with new commit"
msgstr ""
msgid "ScanResultPolicy|Require the user's password to approve"
diff --git a/package.json b/package.json
index 06437c6c6b3..6b699138a33 100644
--- a/package.json
+++ b/package.json
@@ -76,41 +76,41 @@
"@snowplow/browser-plugin-timezone": "^3.9.0",
"@snowplow/browser-tracker": "^3.9.0",
"@sourcegraph/code-host-integration": "0.0.91",
- "@tiptap/core": "^2.0.3",
- "@tiptap/extension-blockquote": "^2.0.3",
- "@tiptap/extension-bold": "^2.0.3",
- "@tiptap/extension-bubble-menu": "2.0.3",
- "@tiptap/extension-bullet-list": "^2.0.3",
- "@tiptap/extension-code": "^2.0.3",
- "@tiptap/extension-code-block": "^2.0.3",
- "@tiptap/extension-code-block-lowlight": "2.0.3",
- "@tiptap/extension-document": "^2.0.3",
- "@tiptap/extension-dropcursor": "^2.0.3",
- "@tiptap/extension-gapcursor": "^2.0.3",
- "@tiptap/extension-hard-break": "^2.0.3",
- "@tiptap/extension-heading": "^2.0.3",
- "@tiptap/extension-highlight": "^2.0.3",
- "@tiptap/extension-history": "^2.0.3",
- "@tiptap/extension-horizontal-rule": "^2.0.3",
- "@tiptap/extension-image": "^2.0.3",
- "@tiptap/extension-italic": "^2.0.3",
- "@tiptap/extension-link": "^2.0.3",
- "@tiptap/extension-list-item": "^2.0.3",
- "@tiptap/extension-ordered-list": "^2.0.3",
- "@tiptap/extension-paragraph": "^2.0.3",
- "@tiptap/extension-strike": "^2.0.3",
- "@tiptap/extension-subscript": "^2.0.3",
- "@tiptap/extension-superscript": "^2.0.3",
- "@tiptap/extension-table": "^2.0.3",
- "@tiptap/extension-table-cell": "^2.0.3",
- "@tiptap/extension-table-header": "^2.0.3",
- "@tiptap/extension-table-row": "^2.0.3",
- "@tiptap/extension-task-item": "^2.0.3",
- "@tiptap/extension-task-list": "^2.0.3",
- "@tiptap/extension-text": "^2.0.3",
- "@tiptap/pm": "^2.0.3",
- "@tiptap/suggestion": "^2.0.3",
- "@tiptap/vue-2": "2.0.3",
+ "@tiptap/core": "^2.1.12",
+ "@tiptap/extension-blockquote": "^2.1.12",
+ "@tiptap/extension-bold": "^2.1.12",
+ "@tiptap/extension-bubble-menu": "^2.1.12",
+ "@tiptap/extension-bullet-list": "^2.1.12",
+ "@tiptap/extension-code": "^2.1.12",
+ "@tiptap/extension-code-block": "^2.1.12",
+ "@tiptap/extension-code-block-lowlight": "^2.1.12",
+ "@tiptap/extension-document": "^2.1.12",
+ "@tiptap/extension-dropcursor": "^2.1.12",
+ "@tiptap/extension-gapcursor": "^2.1.12",
+ "@tiptap/extension-hard-break": "^2.1.12",
+ "@tiptap/extension-heading": "^2.1.12",
+ "@tiptap/extension-highlight": "^2.1.12",
+ "@tiptap/extension-history": "^2.1.12",
+ "@tiptap/extension-horizontal-rule": "^2.1.12",
+ "@tiptap/extension-image": "^2.1.12",
+ "@tiptap/extension-italic": "^2.1.12",
+ "@tiptap/extension-link": "^2.1.12",
+ "@tiptap/extension-list-item": "^2.1.12",
+ "@tiptap/extension-ordered-list": "^2.1.12",
+ "@tiptap/extension-paragraph": "^2.1.12",
+ "@tiptap/extension-strike": "^2.1.12",
+ "@tiptap/extension-subscript": "^2.1.12",
+ "@tiptap/extension-superscript": "^2.1.12",
+ "@tiptap/extension-table": "^2.1.12",
+ "@tiptap/extension-table-cell": "^2.1.12",
+ "@tiptap/extension-table-header": "^2.1.12",
+ "@tiptap/extension-table-row": "^2.1.12",
+ "@tiptap/extension-task-item": "^2.1.12",
+ "@tiptap/extension-task-list": "^2.1.12",
+ "@tiptap/extension-text": "^2.1.12",
+ "@tiptap/pm": "^2.1.12",
+ "@tiptap/suggestion": "^2.1.12",
+ "@tiptap/vue-2": "^2.1.12",
"@vue/apollo-components": "^4.0.0-beta.4",
"@vue/apollo-option": "^4.0.0-beta.4",
"apollo-upload-client": "15.0.0",
diff --git a/spec/frontend/__helpers__/dom_shims/clipboard_event.js b/spec/frontend/__helpers__/dom_shims/clipboard_event.js
new file mode 100644
index 00000000000..fbff61503f2
--- /dev/null
+++ b/spec/frontend/__helpers__/dom_shims/clipboard_event.js
@@ -0,0 +1 @@
+window.ClipboardEvent = class ClipboardEvent extends Event {};
diff --git a/spec/frontend/__helpers__/dom_shims/drag_event.js b/spec/frontend/__helpers__/dom_shims/drag_event.js
new file mode 100644
index 00000000000..cbfee0b71ec
--- /dev/null
+++ b/spec/frontend/__helpers__/dom_shims/drag_event.js
@@ -0,0 +1 @@
+window.DragEvent = class DragEvent extends Event {};
diff --git a/spec/frontend/__helpers__/dom_shims/index.js b/spec/frontend/__helpers__/dom_shims/index.js
index 3b41e2ca2a7..f2c34b8ca31 100644
--- a/spec/frontend/__helpers__/dom_shims/index.js
+++ b/spec/frontend/__helpers__/dom_shims/index.js
@@ -1,5 +1,7 @@
import './clipboard';
+import './clipboard_event';
import './create_object_url';
+import './drag_event';
import './element_scroll_into_view';
import './element_scroll_by';
import './element_scroll_to';
diff --git a/spec/frontend/batch_comments/components/submit_dropdown_spec.js b/spec/frontend/batch_comments/components/submit_dropdown_spec.js
index 19be3fb7d31..a2591635cf9 100644
--- a/spec/frontend/batch_comments/components/submit_dropdown_spec.js
+++ b/spec/frontend/batch_comments/components/submit_dropdown_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdown } from '@gitlab/ui';
+import { GlDisclosureDropdown } from '@gitlab/ui';
import Vue from 'vue';
// eslint-disable-next-line no-restricted-imports
import Vuex from 'vuex';
@@ -50,7 +50,7 @@ function factory({ canApprove = true, shouldAnimateReviewButton = false } = {})
const findCommentTextarea = () => wrapper.findByTestId('comment-textarea');
const findSubmitButton = () => wrapper.findByTestId('submit-review-button');
const findForm = () => wrapper.findByTestId('submit-gl-form');
-const findSubmitDropdown = () => wrapper.findComponent(GlDropdown);
+const findSubmitDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
describe('Batch comments submit dropdown', () => {
afterEach(() => {
diff --git a/spec/frontend/content_editor/extensions/horizontal_rule_spec.js b/spec/frontend/content_editor/extensions/horizontal_rule_spec.js
index 322c04a42e1..14241ae9cc6 100644
--- a/spec/frontend/content_editor/extensions/horizontal_rule_spec.js
+++ b/spec/frontend/content_editor/extensions/horizontal_rule_spec.js
@@ -22,7 +22,7 @@ describe('content_editor/extensions/horizontal_rule', () => {
it.each`
input | insertedNodes
- ${'---'} | ${() => [p(), horizontalRule()]}
+ ${'---'} | ${() => [horizontalRule(), p()]}
${'--'} | ${() => [p()]}
${'---x'} | ${() => [p()]}
${' ---x'} | ${() => [p()]}
diff --git a/spec/frontend/content_editor/extensions/word_break_spec.js b/spec/frontend/content_editor/extensions/word_break_spec.js
index 23167269d7d..5caca218702 100644
--- a/spec/frontend/content_editor/extensions/word_break_spec.js
+++ b/spec/frontend/content_editor/extensions/word_break_spec.js
@@ -22,11 +22,11 @@ describe('content_editor/extensions/word_break', () => {
it.each`
input | insertedNode
- ${'<wbr>'} | ${() => p(wordBreak())}
- ${'<wbr'} | ${() => p()}
- ${'wbr>'} | ${() => p()}
+ ${'<wbr>'} | ${() => [p(wordBreak()), p()]}
+ ${'<wbr'} | ${() => [p()]}
+ ${'wbr>'} | ${() => [p()]}
`('with input=$input, then should insert a $insertedNode', ({ input, insertedNode }) => {
- const expectedDoc = doc(insertedNode());
+ const expectedDoc = doc(...insertedNode());
triggerNodeInputRule({ tiptapEditor, inputRuleText: input });
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/publish_method_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/publish_method_spec.js.snap
index f202635d717..89cf5acdef3 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/publish_method_spec.js.snap
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/publish_method_spec.js.snap
@@ -21,7 +21,7 @@ exports[`publish_method renders 1`] = `
size="16"
/>
<gl-link-stub
- class="gl-mr-2"
+ class="gl-mr-2 gl-text-decoration-underline"
data-testid="pipeline-sha"
href="/namespace14/project14/-/commit/b83d6e391c22777fca1ed3012fce84f633d7fed0"
>
diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb
index 90d998e17c3..1e05cf6a7ac 100644
--- a/spec/helpers/projects_helper_spec.rb
+++ b/spec/helpers/projects_helper_spec.rb
@@ -128,6 +128,24 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
end
end
+ describe '#load_catalog_resources' do
+ before_all do
+ create_list(:project, 2)
+ end
+
+ let_it_be(:projects) { Project.all.to_a }
+
+ it 'does not execute a database query when project.catalog_resource is accessed' do
+ helper.load_catalog_resources(projects)
+
+ queries = ActiveRecord::QueryRecorder.new do
+ projects.each(&:catalog_resource)
+ end
+
+ expect(queries).not_to exceed_query_limit(0)
+ end
+ end
+
describe '#last_pipeline_from_status_cache' do
before do
# clear cross-example caches
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb
index 261d587506f..b2a267d42ec 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb
@@ -4,7 +4,6 @@ require 'spec_helper'
RSpec.describe Gitlab::Analytics::CycleAnalytics::Average, feature_category: :value_stream_management do
let_it_be(:project) { create(:project) }
-
let_it_be(:issue_1) do
# Duration: 10 days
create(:issue, project: project, created_at: 20.days.ago).tap do |issue|
@@ -30,8 +29,12 @@ RSpec.describe Gitlab::Analytics::CycleAnalytics::Average, feature_category: :va
let(:query) { Issue.joins(:metrics).in_projects(project.id) }
- around do |example|
- freeze_time { example.run }
+ before_all do
+ freeze_time
+ end
+
+ after :all do
+ unfreeze_time
end
subject(:average) { described_class.new(stage: stage, query: query) }
@@ -45,8 +48,7 @@ RSpec.describe Gitlab::Analytics::CycleAnalytics::Average, feature_category: :va
it { is_expected.to eq(nil) }
end
- context 'returns the average duration in seconds',
- quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/413223' do
+ context 'returns the average duration in seconds' do
it { is_expected.to be_within(0.5).of(7.5.days.to_f) }
end
end
diff --git a/spec/lib/gitlab/diff/formatters/file_formatter_spec.rb b/spec/lib/gitlab/diff/formatters/file_formatter_spec.rb
index 32e5f17f7eb..fc77ed5d763 100644
--- a/spec/lib/gitlab/diff/formatters/file_formatter_spec.rb
+++ b/spec/lib/gitlab/diff/formatters/file_formatter_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe Gitlab::Diff::Formatters::FileFormatter, feature_category: :code_
let(:attrs) { base_attrs.merge(old_path: 'path.rb', new_path: 'path.rb') }
it_behaves_like 'position formatter' do
- # rubocop:disable Fips/SHA1 (This is used to match the existing class method)
+ # rubocop:disable Fips/SHA1 -- This is used to match the existing class method
let(:key) do
[123, 456, 789,
Digest::SHA1.hexdigest(formatter.old_path), Digest::SHA1.hexdigest(formatter.new_path),
diff --git a/spec/policies/issue_policy_spec.rb b/spec/policies/issue_policy_spec.rb
index 743d96ee3dd..c19b7bcf9ea 100644
--- a/spec/policies/issue_policy_spec.rb
+++ b/spec/policies/issue_policy_spec.rb
@@ -8,16 +8,16 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
include ProjectHelpers
include UserHelpers
- let(:admin) { create(:user, :admin) }
- let(:guest) { create(:user) }
- let(:author) { create(:user) }
- let(:assignee) { create(:user) }
- let(:reporter) { create(:user) }
- let(:maintainer) { create(:user) }
- let(:owner) { create(:user) }
- let(:group) { create(:group, :public) }
- let(:reporter_from_group_link) { create(:user) }
- let(:non_member) { create(:user) }
+ let_it_be(:group) { create(:group, :public) }
+ let_it_be(:admin) { create(:user, :admin) }
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:author) { create(:user) }
+ let_it_be(:assignee) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
+ let_it_be(:maintainer) { create(:user) }
+ let_it_be(:owner) { create(:user) }
+ let_it_be(:reporter_from_group_link) { create(:user) }
+ let_it_be(:non_member) { create(:user) }
let(:support_bot) { Users::Internal.support_bot }
let(:alert_bot) { Users::Internal.alert_bot }
@@ -70,12 +70,12 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
end
context 'a private project' do
- let(:project) { create(:project, :private) }
- let(:issue) { create(:issue, project: project, assignees: [assignee], author: author) }
- let(:issue_no_assignee) { create(:issue, project: project) }
+ let_it_be(:project) { create(:project, :private) }
+ let_it_be_with_reload(:issue) { create(:issue, project: project, assignees: [assignee], author: author) }
+ let_it_be_with_reload(:issue_no_assignee) { create(:issue, project: project) }
let(:new_issue) { build(:issue, project: project, assignees: [assignee], author: author) }
- before do
+ before_all do
project.add_guest(guest)
project.add_guest(author)
project.add_guest(assignee)
@@ -86,6 +86,10 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
create(:project_group_link, group: group, project: project)
end
+ it 'allows guests to award emoji' do
+ expect(permissions(guest, issue)).to be_allowed(:award_emoji)
+ end
+
it 'allows guests to read issues' do
expect(permissions(guest, issue)).to be_allowed(:read_issue, :read_issue_iid, :admin_issue_relation)
expect(permissions(guest, issue)).to be_disallowed(:update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :mark_note_as_internal)
@@ -191,13 +195,13 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
end
context 'a public project' do
- let(:project) { create(:project, :public) }
- let(:issue) { create(:issue, project: project, assignees: [assignee], author: author) }
- let(:issue_no_assignee) { create(:issue, project: project) }
- let(:issue_locked) { create(:issue, :locked, project: project, author: author, assignees: [assignee]) }
+ let_it_be_with_reload(:project) { create(:project, :public) }
+ let_it_be_with_reload(:issue) { create(:issue, project: project, assignees: [assignee], author: author) }
+ let_it_be_with_reload(:issue_no_assignee) { create(:issue, project: project) }
+ let_it_be_with_reload(:issue_locked) { create(:issue, :locked, project: project, author: author, assignees: [assignee]) }
let(:new_issue) { build(:issue, project: project) }
- before do
+ before_all do
project.add_guest(guest)
project.add_reporter(reporter)
project.add_maintainer(maintainer)
@@ -208,6 +212,10 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
create(:project_group_link, group: group, project: project)
end
+ it 'allows guests to award emoji' do
+ expect(permissions(guest, issue)).to be_allowed(:award_emoji)
+ end
+
it 'does not allow anonymous user to create todos' do
expect(permissions(nil, issue)).to be_allowed(:read_issue)
expect(permissions(nil, issue)).to be_disallowed(:create_todo, :update_subscription, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
@@ -304,12 +312,12 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
it_behaves_like 'support bot with service desk enabled'
context 'when issues are private' do
- before do
+ before_all do
project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
end
- let(:issue) { create(:issue, project: project, author: author) }
- let(:visitor) { create(:user) }
+ let_it_be_with_reload(:issue) { create(:issue, project: project, author: author) }
+ let_it_be(:visitor) { create(:user) }
it 'forbids visitors from viewing issues' do
expect(permissions(visitor, issue)).to be_disallowed(:read_issue)
@@ -423,10 +431,8 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
end
context 'when accounting for notes widget' do
- let(:policy) { described_class.new(reporter, note) }
-
context 'and notes widget is disabled for issue' do
- before do
+ before_all do
WorkItems::Type.default_by_type(:issue).widget_definitions.find_by_widget_type(:notes).update!(disabled: true)
end
@@ -450,6 +456,18 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
end
end
+ context 'when issue belongs to a group' do
+ let_it_be_with_reload(:issue) { create(:issue, :group_level, namespace: group) }
+
+ before_all do
+ group.add_guest(guest)
+ end
+
+ it 'allows guests to award emoji' do
+ expect(permissions(guest, issue)).to be_allowed(:award_emoji)
+ end
+ end
+
context 'with external authorization enabled' do
let(:user) { create(:user) }
let(:project) { create(:project, :public) }
diff --git a/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb b/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb
index 65a5fb87f9a..e7e23304d81 100644
--- a/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb
+++ b/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb
@@ -6,9 +6,11 @@ RSpec.describe 'Toggling an AwardEmoji', feature_category: :shared do
include GraphqlHelpers
let_it_be(:current_user) { create(:user) }
- let_it_be(:project, reload: true) { create(:project) }
- let_it_be(:awardable) { create(:note, project: project) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project, reload: true) { create(:project, group: group) }
+ let_it_be(:issue_note) { create(:note, project: project) }
+ let(:awardable) { issue_note }
let(:emoji_name) { 'thumbsup' }
let(:mutation) do
variables = {
@@ -36,8 +38,8 @@ RSpec.describe 'Toggling an AwardEmoji', feature_category: :shared do
end
context 'when the user has permission' do
- before do
- project.add_developer(current_user)
+ before_all do
+ group.add_developer(current_user)
end
context 'when the given awardable is not an Awardable' do
@@ -60,6 +62,33 @@ RSpec.describe 'Toggling an AwardEmoji', feature_category: :shared do
end
context 'when the given awardable is an Awardable' do
+ context 'when the awardable is a work item' do
+ context 'when the work item is associated directly with a group' do
+ let_it_be(:group_work_item) { create(:work_item, :group_level, namespace: group) }
+ let(:awardable) { group_work_item }
+
+ context 'when no emoji has been awarded by the current_user yet' do
+ it 'creates an emoji' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ end.to change { AwardEmoji.count }.by(1)
+ end
+ end
+
+ context 'when an emoji has been awarded by the current_user' do
+ before do
+ create_award_emoji(current_user)
+ end
+
+ it 'removes the emoji' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ end.to change { AwardEmoji.count }.by(-1)
+ end
+ end
+ end
+ end
+
context 'when no emoji has been awarded by the current_user yet' do
# Create an award emoji for another user. This therefore tests that
# toggling is correctly scoped to the user's emoji only.
diff --git a/spec/scripts/lib/glfm/update_specification_spec.rb b/spec/scripts/lib/glfm/update_specification_spec.rb
index 92434b37515..500e8685e77 100644
--- a/spec/scripts/lib/glfm/update_specification_spec.rb
+++ b/spec/scripts/lib/glfm/update_specification_spec.rb
@@ -278,7 +278,7 @@ RSpec.describe Glfm::UpdateSpecification, '#process', feature_category: :team_pl
end
it 'includes header and all examples', :unlimited_max_formatted_output_length do
- # rubocop:disable Style/StringConcatenation (string contatenation is more readable)
+ # rubocop:disable Style/StringConcatenation -- string contatenation is more readable
expected = described_class::ES_SNAPSHOT_SPEC_MD_HEADER +
ghfm_spec_txt_examples +
"\n" +
diff --git a/yarn.lock b/yarn.lock
index 9cbcebc398e..002417af423 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2141,181 +2141,181 @@
dom-accessibility-api "^0.5.1"
pretty-format "^26.4.2"
-"@tiptap/core@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.3.tgz#dfd55124b3e7b0482e5ccb8be46eb9c3189167e2"
- integrity sha512-jLyVIWAdjjlNzrsRhSE2lVL/7N8228/1R1QtaVU85UlMIwHFAcdzhD8FeiKkqxpTnGpaDVaTy7VNEtEgaYdCyA==
-
-"@tiptap/extension-blockquote@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.0.3.tgz#3ee7aff66a2526501154ca69f3e91e153c58313c"
- integrity sha512-rkUcFv2iL6f86DBBHoa4XdKNG2StvkJ7tfY9GoMpT46k3nxOaMTqak9/qZOo79TWxMLYtXzoxtKIkmWsbbcj4A==
-
-"@tiptap/extension-bold@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.3.tgz#2a28816195562a39c33f50e626796d14a800784f"
- integrity sha512-OGT62fMRovSSayjehumygFWTg2Qn0IDbqyMpigg/RUAsnoOI2yBZFVrdM2gk1StyoSay7gTn2MLw97IUfr7FXg==
-
-"@tiptap/extension-bubble-menu@2.0.3", "@tiptap/extension-bubble-menu@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.3.tgz#44b3c4e35fd478c42467d8fb7dbc9532614e5b18"
- integrity sha512-lPt1ELrYCuoQrQEUukqjp9xt38EwgPUwaKHI3wwt2Rbv+C6q1gmRsK1yeO/KqCNmFxNqF2p9ZF9srOnug/RZDQ==
+"@tiptap/core@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.1.12.tgz#904fdf147e91b5e60561c76e7563c1b5a32f54ab"
+ integrity sha512-ZGc3xrBJA9KY8kln5AYTj8y+GDrKxi7u95xIl2eccrqTY5CQeRu6HRNM1yT4mAjuSaG9jmazyjGRlQuhyxCKxQ==
+
+"@tiptap/extension-blockquote@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.1.12.tgz#97b43419606acf9bfd93b9f482a1827dcac8c3e9"
+ integrity sha512-Qb3YRlCfugx9pw7VgLTb+jY37OY4aBJeZnqHzx4QThSm13edNYjasokbX0nTwL1Up4NPTcY19JUeHt6fVaVVGg==
+
+"@tiptap/extension-bold@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.1.12.tgz#5dbf41105fc0fbde8adbff629312187fbebc39b0"
+ integrity sha512-AZGxIxcGU1/y6V2YEbKsq6BAibL8yQrbRm6EdcBnby41vj1WziewEKswhLGmZx5IKM2r2ldxld03KlfSIlKQZg==
+
+"@tiptap/extension-bubble-menu@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.1.12.tgz#4103a21a6433e58690c8f742ece39fad78dc26eb"
+ integrity sha512-gAGi21EQ4wvLmT7klgariAc2Hf+cIjaNU2NWze3ut6Ku9gUo5ZLqj1t9SKHmNf4d5JG63O8GxpErqpA7lHlRtw==
dependencies:
tippy.js "^6.3.7"
-"@tiptap/extension-bullet-list@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.3.tgz#43c4c0c161d5c065f3f87e4bf54d13bd6c55b4c3"
- integrity sha512-RtaLiRvZbMTOje+FW5bn+mYogiIgNxOm065wmyLPypnTbLSeHeYkoqVSqzZeqUn+7GLnwgn1shirUe6csVE/BA==
-
-"@tiptap/extension-code-block-lowlight@2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.0.3.tgz#42cad47b048d4657cb0d554a890abd1bc7072451"
- integrity sha512-thFXcFdFyHF0/dr9sqBedjj0Vt14k3m52YVc4l65+d65wRuHp4f8suu8T2ZGRJwqLCE3NIrvwQTSHhzjIqJVxQ==
-
-"@tiptap/extension-code-block@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.0.3.tgz#4ce08b4f3c5af166d3cc00e91ba5b989f01fee63"
- integrity sha512-F4xMy18EwgpyY9f5Te7UuF7UwxRLptOtCq1p2c2DfxBvHDWhAjQqVqcW/sq/I/WuED7FwCnPLyyAasPiVPkLPw==
-
-"@tiptap/extension-code@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.0.3.tgz#74d88073faedd1fc52d6ed3de4eed8fde80ff4bf"
- integrity sha512-LsVCKVxgBtkstAr1FjxN8T3OjlC76a2X8ouoZpELMp+aXbjqyanCKzt+sjjUhE4H0yLFd4v+5v6UFoCv4EILiw==
-
-"@tiptap/extension-document@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.0.3.tgz#b58af5b4f71c0acea953a7ebe8b1d24341bfaf68"
- integrity sha512-PsYeNQQBYIU9ayz1R11Kv/kKNPFNIV8tApJ9pxelXjzcAhkjncNUazPN/dyho60mzo+WpsmS3ceTj/gK3bCtWA==
-
-"@tiptap/extension-dropcursor@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.3.tgz#205d02c70b200810572d0b7e264bbdb718343ad0"
- integrity sha512-McthMrfusn6PjcaynJLheZJcXto8TaIW5iVitYh8qQrDXr31MALC/5GvWuiswmQ8bAXiWPwlLDYE/OJfwtggaw==
-
-"@tiptap/extension-floating-menu@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.3.tgz#8d9943246aa3247442c1993f235617094fe705b5"
- integrity sha512-zN1vRGRvyK3pO2aHRmQSOTpl4UJraXYwKYM009n6WviYKUNm0LPGo+VD4OAtdzUhPXyccnlsTv2p6LIqFty6Bg==
+"@tiptap/extension-bullet-list@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.1.12.tgz#7c905a577ce30ef2cb335870a23f9d24fd26f6aa"
+ integrity sha512-vtD8vWtNlmAZX8LYqt2yU9w3mU9rPCiHmbp4hDXJs2kBnI0Ju/qAyXFx6iJ3C3XyuMnMbJdDI9ee0spAvFz7cQ==
+
+"@tiptap/extension-code-block-lowlight@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.1.12.tgz#ccbca5d0d92bee373dc8e2e2ae6c27f62f66437c"
+ integrity sha512-dtIbpI9QrWa9TzNO4v5q/zf7+d83wpy5i9PEccdJAVtRZ0yOI8JIZAWzG5ex3zAoCA0CnQFdsPSVykYSDdxtDA==
+
+"@tiptap/extension-code-block@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.1.12.tgz#20416baef1b5fc839490a8416e97fdcbb5fdf918"
+ integrity sha512-RXtSYCVsnk8D+K80uNZShClfZjvv1EgO42JlXLVGWQdIgaNyuOv/6I/Jdf+ZzhnpsBnHufW+6TJjwP5vJPSPHA==
+
+"@tiptap/extension-code@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.1.12.tgz#86d2eb5f63725af472c5fd858e5a9c7ccae06ef3"
+ integrity sha512-CRiRq5OTC1lFgSx6IMrECqmtb93a0ZZKujEnaRhzWliPBjLIi66va05f/P1vnV6/tHaC3yfXys6dxB5A4J8jxw==
+
+"@tiptap/extension-document@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.1.12.tgz#e19e4716dfad60cbeb6abaf2f362fed759963529"
+ integrity sha512-0QNfAkCcFlB9O8cUNSwTSIQMV9TmoEhfEaLz/GvbjwEq4skXK3bU+OQX7Ih07waCDVXIGAZ7YAZogbvrn/WbOw==
+
+"@tiptap/extension-dropcursor@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.1.12.tgz#9da0c275291c9d47497d3db41b4d70d96366b4ff"
+ integrity sha512-0tT/q8nL4NBCYPxr9T0Brck+RQbWuczm9nV0bnxgt0IiQXoRHutfPWdS7GA65PTuVRBS/3LOco30fbjFhkfz/A==
+
+"@tiptap/extension-floating-menu@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.1.12.tgz#68a658b2b9bdd3a0fc1afc5165231838061a8fde"
+ integrity sha512-uo0ydCJNg6AWwLT6cMUJYVChfvw2PY9ZfvKRhh9YJlGfM02jS4RUG/bJBts6R37f+a5FsOvAVwg8EvqPlNND1A==
dependencies:
tippy.js "^6.3.7"
-"@tiptap/extension-gapcursor@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.3.tgz#e098b78c4a169e1630dc6531d68b7f365de59c2f"
- integrity sha512-6I9EzzsYOyyqDvDvxIK6Rv3EXB+fHKFj8ntHO8IXmeNJ6pkhOinuXVsW6Yo7TcDYoTj4D5I2MNFAW2rIkgassw==
-
-"@tiptap/extension-hard-break@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.3.tgz#aa7805d825e5244bdccc508da18c781e231b2859"
- integrity sha512-RCln6ARn16jvKTjhkcAD5KzYXYS0xRMc0/LrHeV8TKdCd4Yd0YYHe0PU4F9gAgAfPQn7Dgt4uTVJLN11ICl8sQ==
-
-"@tiptap/extension-heading@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.0.3.tgz#5e9e779f33f366afcf729d9f68ef49721f825e11"
- integrity sha512-f0IEv5ms6aCzL80WeZ1qLCXTkRVwbpRr1qAETjg3gG4eoJN18+lZNOJYpyZy3P92C5KwF2T3Av00eFyVLIbb8Q==
-
-"@tiptap/extension-highlight@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-highlight/-/extension-highlight-2.0.3.tgz#4a52de6666dfe4a80b018aa43805d2d220e90219"
- integrity sha512-NrtibY8cZkIjZMQuHRrKd4php+plOvAoSo8g3uVFu275I/Ixt5HqJ53R4voCXs8W8BOBRs2HS2QX8Cjh79XhtA==
-
-"@tiptap/extension-history@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.0.3.tgz#8936c15aa46f2ddeada1c3d9abe2888d58d08c30"
- integrity sha512-00KHIcJ8kivn2ARI6NQYphv2LfllVCXViHGm0EhzDW6NQxCrriJKE3tKDcTFCu7LlC5doMpq9Z6KXdljc4oVeQ==
-
-"@tiptap/extension-horizontal-rule@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.3.tgz#5c67db2c0bf3bc14a8aab80df584bee5aa23fbeb"
- integrity sha512-SZRUSh07b/M0kJHNKnfBwBMWrZBEm/E2LrK1NbluwT3DBhE+gvwiEdBxgB32zKHNxaDEXUJwUIPNC3JSbKvPUA==
-
-"@tiptap/extension-image@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.0.3.tgz#048484b2e059d4bed78f97f08651bd57b41855a9"
- integrity sha512-hS9ZJwz0md07EHsC+o4NuuJkhCZsZn7TuRz/2CvRSj2fWFIz+40CyNAHf/2J0qNugG9ommXaemetsADeEZP9ag==
-
-"@tiptap/extension-italic@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.0.3.tgz#2d9d5d8ccf3c38266f745029c2ec0646c075c1fc"
- integrity sha512-cfS5sW0gu7qf4ihwnLtW/QMTBrBEXaT0sJl3RwkhjIBg/65ywJKE5Nz9ewnQHmDeT18hvMJJ1VIb4j4ze9jj9A==
-
-"@tiptap/extension-link@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.0.3.tgz#4714a4c23d04032e75b5b8364a9c532f7a385aba"
- integrity sha512-H72tXQ5rkVCkAhFaf08fbEU7EBUCK0uocsqOF+4th9sOlrhfgyJtc8Jv5EXPDpxNgG5jixSqWBo0zKXQm9s9eg==
+"@tiptap/extension-gapcursor@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.1.12.tgz#63844c3abd1a38af915839cf0c097b6d2e5a86fe"
+ integrity sha512-zFYdZCqPgpwoB7whyuwpc8EYLYjUE5QYKb8vICvc+FraBUDM51ujYhFSgJC3rhs8EjI+8GcK8ShLbSMIn49YOQ==
+
+"@tiptap/extension-hard-break@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.1.12.tgz#54d0c9996e1173594852394975a9356eec98bc9a"
+ integrity sha512-nqKcAYGEOafg9D+2cy1E4gHNGuL12LerVa0eS2SQOb+PT8vSel9OTKU1RyZldsWSQJ5rq/w4uIjmLnrSR2w6Yw==
+
+"@tiptap/extension-heading@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.1.12.tgz#05ae4684d6f29ae611495ab114038e14a5d1dff6"
+ integrity sha512-MoANP3POAP68Ko9YXarfDKLM/kXtscgp6m+xRagPAghRNujVY88nK1qBMZ3JdvTVN6b/ATJhp8UdrZX96TLV2w==
+
+"@tiptap/extension-highlight@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-highlight/-/extension-highlight-2.1.12.tgz#184efb75238c9cbc6c18d523b735de4329f78ecc"
+ integrity sha512-buen31cYPyiiHA2i0o2i/UcjRTg/42mNDCizGr1OJwvv3AELG3qOFc4Y58WJWIvWNv+1Dr4ZxHA3GNVn0ANWyg==
+
+"@tiptap/extension-history@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.1.12.tgz#03bcb9422e8ea2b82dc45207d1a1b0bc0241b055"
+ integrity sha512-6b7UFVkvPjq3LVoCTrYZAczt5sQrQUaoDWAieVClVZoFLfjga2Fwjcfgcie8IjdPt8YO2hG/sar/c07i9vM0Sg==
+
+"@tiptap/extension-horizontal-rule@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.1.12.tgz#2191d4ff68ed39381d65971ad8e2aa1be43e6d6b"
+ integrity sha512-RRuoK4KxrXRrZNAjJW5rpaxjiP0FJIaqpi7nFbAua2oHXgsCsG8qbW2Y0WkbIoS8AJsvLZ3fNGsQ8gpdliuq3A==
+
+"@tiptap/extension-image@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.1.12.tgz#ab035db82f0961b1d906c4d426bf68be563fdcd3"
+ integrity sha512-VCgOTeNLuoR89WoCESLverpdZpPamOd7IprQbDIeG14sUySt7RHNgf2AEfyTYJEHij12rduvAwFzerPldVAIJg==
+
+"@tiptap/extension-italic@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.1.12.tgz#e99480eb77f8b4e5444fc236add8a831d5aa2343"
+ integrity sha512-/XYrW4ZEWyqDvnXVKbgTXItpJOp2ycswk+fJ3vuexyolO6NSs0UuYC6X4f+FbHYL5VuWqVBv7EavGa+tB6sl3A==
+
+"@tiptap/extension-link@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.1.12.tgz#a18f83a0b54342e6274ff9e5a5907ef7f15aa723"
+ integrity sha512-Sti5hhlkCqi5vzdQjU/gbmr8kb578p+u0J4kWS+SSz3BknNThEm/7Id67qdjBTOQbwuN07lHjDaabJL0hSkzGQ==
dependencies:
linkifyjs "^4.1.0"
-"@tiptap/extension-list-item@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.0.3.tgz#2bca673b1ed83fdc00cb208f4d5c57d4d44ddb22"
- integrity sha512-p7cUsk0LpM1PfdAuFE8wYBNJ3gvA0UhNGR08Lo++rt9UaCeFLSN1SXRxg97c0oa5+Ski7SrCjIJ5Ynhz0viTjQ==
-
-"@tiptap/extension-ordered-list@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.3.tgz#d1e5d6fc240545dbba7f7e6666bebd658fc3b4ad"
- integrity sha512-ZB3MpZh/GEy1zKgw7XDQF4FIwycZWNof1k9WbDZOI063Ch4qHZowhVttH2mTCELuyvTMM/o9a8CS7qMqQB48bw==
-
-"@tiptap/extension-paragraph@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.0.3.tgz#88d332158c70622d36849256f90e43ca4d226dfe"
- integrity sha512-a+tKtmj4bU3GVCH1NE8VHWnhVexxX5boTVxsHIr4yGG3UoKo1c5AO7YMaeX2W5xB5iIA+BQqOPCDPEAx34dd2A==
-
-"@tiptap/extension-strike@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.0.3.tgz#4ec0001db5f51f86d06da22364114f20f073d4b3"
- integrity sha512-RO4/EYe2iPD6ifDHORT8fF6O9tfdtnzxLGwZIKZXnEgtweH+MgoqevEzXYdS+54Wraq4TUQGNcsYhe49pv7Rlw==
-
-"@tiptap/extension-subscript@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-subscript/-/extension-subscript-2.0.3.tgz#26be9609b52dcdc1ff0f0f00e9e3bc01dd464f78"
- integrity sha512-XFAEUaKxWRmTq7ePEF4aj7knelJPr2fTz0y/iSXydtS094LKwBHBzxatIZY3phrgfpDc+f51ycwarsgz27UJfg==
-
-"@tiptap/extension-superscript@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-superscript/-/extension-superscript-2.0.3.tgz#7d57b2517a2f2e1ffb603edba5f05c6631bfe3a7"
- integrity sha512-5EBjUvkw2SXL1e8C1i0UF26/GBNHxEbiNQKw7Shy88omVa4HTY+D8KWC/j29ZW/IomUbGPlbpXp1z+1TETzmyw==
-
-"@tiptap/extension-table-cell@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.0.3.tgz#44369bafdad3bb5b4f96296a8e93701673079b3a"
- integrity sha512-d0vpwQfRIOhqKJdoiOJybwWhjnug3QA4Mkgccp378moDRyOer3hPKavG1Ljgz087qHrN4WfdUlMGEvasYsWE7w==
-
-"@tiptap/extension-table-header@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.0.3.tgz#bb35953da353f757202efab6e0c0d5d390a70f51"
- integrity sha512-SnGl1U6usRRS6LyAjSdhaCYLF6NWbGhjVFSmiPrjb0pOzsiVeDOiUNCyUAIYaDNnjAF2pfK6+H+uHzYPqTi+/w==
-
-"@tiptap/extension-table-row@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.0.3.tgz#fb7fd381435b06942dfbc2ba475072c25bf0a478"
- integrity sha512-tyqeXmQLNSBsYyiNsnQuJMxNbz6dYt+P5W58+h10mjbt+hERA5+alQQyP06O2DggsT3Z0LPt7QRAlNmOBe7cyQ==
-
-"@tiptap/extension-table@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table/-/extension-table-2.0.3.tgz#780b946ca8526ac8a4044bdec4c9c720ad8ba89a"
- integrity sha512-8swHqm8vRM1w9WzaAhLmY24gGoTozctz4KHKBjvFY/Ka0yXabT0+hoCCdkZLnXWi15H3pbHs2HnDBaTGL9bZTw==
-
-"@tiptap/extension-task-item@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-task-item/-/extension-task-item-2.0.3.tgz#b3845b51af565dec4c2c30c73ddbbc2b9e0bd297"
- integrity sha512-13u1Q769WiSNcjFieYAMuJyWXNaY9yOdw6WFg9tQg4EZ5h6+2DaxB0qmu6I3pH+wwSn2UkCkXIirAo/k7wnzbw==
-
-"@tiptap/extension-task-list@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-task-list/-/extension-task-list-2.0.3.tgz#7e32dd518d7bd5359faab43fb48b37e2d83f5937"
- integrity sha512-NdW0RtMF2L96qy+j946mTB5Av6Qn5L3vGVWFmJA6/JPXr9Uj/grItCmqUQKHfPBSFow7UqBY82ODblP+GQFgew==
-
-"@tiptap/extension-text@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.0.3.tgz#12b6400a31ac6d35cbaf1822600f4c425457902f"
- integrity sha512-LvzChcTCcPSMNLUjZe/A9SHXWGDHtvk73fR7CBqAeNU0MxhBPEBI03GFQ6RzW3xX0CmDmjpZoDxFMB+hDEtW1A==
-
-"@tiptap/pm@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.0.3.tgz#e8bb47df765fc1b7acd52f2800c52d7ff945c5ec"
- integrity sha512-I9dsInD89Agdm1QjFRO9dmJtU1ldVSILNPW0pEhv9wYqYVvl4HUj/JMtYNqu2jWrCHNXQcaX/WkdSdvGJtmg5g==
+"@tiptap/extension-list-item@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.1.12.tgz#3eb28dc998490a98f14765783770b3cf6587d39e"
+ integrity sha512-Gk7hBFofAPmNQ8+uw8w5QSsZOMEGf7KQXJnx5B022YAUJTYYxO3jYVuzp34Drk9p+zNNIcXD4kc7ff5+nFOTrg==
+
+"@tiptap/extension-ordered-list@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.1.12.tgz#f41a45bc66b4d19e379d4833f303f2e0cd6b9d60"
+ integrity sha512-tF6VGl+D2avCgn9U/2YLJ8qVmV6sPE/iEzVAFZuOSe6L0Pj7SQw4K6AO640QBob/d8VrqqJFHCb6l10amJOnXA==
+
+"@tiptap/extension-paragraph@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.1.12.tgz#922447b2aa1c7184787d351ceec593a74d24ed03"
+ integrity sha512-hoH/uWPX+KKnNAZagudlsrr4Xu57nusGekkJWBcrb5MCDE91BS+DN2xifuhwXiTHxnwOMVFjluc0bPzQbkArsw==
+
+"@tiptap/extension-strike@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.1.12.tgz#2b049aedf2985e9c9e3c3f1cc0b203a574c85bd8"
+ integrity sha512-HlhrzIjYUT8oCH9nYzEL2QTTn8d1ECnVhKvzAe6x41xk31PjLMHTUy8aYjeQEkWZOWZ34tiTmslV1ce6R3Dt8g==
+
+"@tiptap/extension-subscript@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-subscript/-/extension-subscript-2.1.12.tgz#19f4114d779775bb772eee45dcf31b5ef9363f86"
+ integrity sha512-tb1jysEvf4SIiXwEOgDTXiyrG39RVNHvn/zsGMg5wy5t9qUp9m1k7kKYTH084ktuKDAPQonCcpn3hwc+ngTFzg==
+
+"@tiptap/extension-superscript@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-superscript/-/extension-superscript-2.1.12.tgz#6964d9c9b7591101bdc8e7058e88a75fe164d0a9"
+ integrity sha512-ek6L+DNsrjiJieArlgTvQt1VfJ56d8V19WAPW/ciRhq88YRlTEY9nSO3QuUCSUO1nGmE5OWQpgrsiW/XZbONVw==
+
+"@tiptap/extension-table-cell@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.1.12.tgz#b13938d345065a3750610c66a81ea107edbbcea7"
+ integrity sha512-hextcfVTdwX8G7s8Q/V6LW2aUhGvPgu1dfV+kVVO42AFHxG+6PIkDOUuHphGajG3Nrs129bjMDWb8jphj38dUg==
+
+"@tiptap/extension-table-header@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.1.12.tgz#87ac2efa073a212c6114e0b137cf4afc3d75c35f"
+ integrity sha512-a4WZ5Z7gqQ/QlK8cK2d1ONYdma/J5+yH/0SNtQhkfELoS45GsLJh89OyKO0W0FnY6Mg0RoH1FsoBD+cqm0yazA==
+
+"@tiptap/extension-table-row@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.1.12.tgz#27bee7d046b2bea4fe6bf46260e0d89305b75663"
+ integrity sha512-0kPr+zngQC1YQRcU6+Fl3CpIW/SdJhVJ5qOLpQleXrLPdjmZQd3Z1DXvOSDphYjXCowGPCxeUa++6bo7IoEMJw==
+
+"@tiptap/extension-table@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table/-/extension-table-2.1.12.tgz#173cc4eac75c650b440dfcae433d3c74e78aa1bc"
+ integrity sha512-q/DuKZ4j1ycRfuFdb9rBJ3MglGNxlM2BQ1csScX/BrVIsAQI5B8sdzy1BrIlepQ6DRu4DCzHcKMI8u4/edUSWA==
+
+"@tiptap/extension-task-item@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-task-item/-/extension-task-item-2.1.12.tgz#944eacf6f0ed1a430d807217d62b49ccef3956e1"
+ integrity sha512-uqrDTO4JwukZUt40GQdvB6S+oDhdp4cKNPMi0sbteWziQugkSMLlkYvxU0Hfb/YeziaWWwFI7ssPu/hahyk6dQ==
+
+"@tiptap/extension-task-list@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-task-list/-/extension-task-list-2.1.12.tgz#adbfb5a5b990d6f189c776b45de2d2c5bb77e963"
+ integrity sha512-BUpYlEWK+Q3kw9KIiOqvhd0tUPhMcOf1+fJmCkluJok+okAxMbP1umAtCEQ3QkoCwLr+vpHJov7h3yi9+dwgeQ==
+
+"@tiptap/extension-text@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.1.12.tgz#466e3244bdd9b2db2304c0c9a1d51ce59f5327d0"
+ integrity sha512-rCNUd505p/PXwU9Jgxo4ZJv4A3cIBAyAqlx/dtcY6cjztCQuXJhuQILPhjGhBTOLEEL4kW2wQtqzCmb7O8i2jg==
+
+"@tiptap/pm@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.1.12.tgz#88a4b19be0eabb13d42ddd540c19ba1bbe74b322"
+ integrity sha512-Q3MXXQABG4CZBesSp82yV84uhJh/W0Gag6KPm2HRWPimSFELM09Z9/5WK9RItAYE0aLhe4Krnyiczn9AAa1tQQ==
dependencies:
prosemirror-changeset "^2.2.0"
prosemirror-collab "^1.3.0"
@@ -2336,18 +2336,19 @@
prosemirror-transform "^1.7.0"
prosemirror-view "^1.28.2"
-"@tiptap/suggestion@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.0.3.tgz#3f25e20f50de6748f2b65a88e264d9b5887ca16a"
- integrity sha512-1y3palQStGZq13UtHjouZ50k4sotM+N56cIlFeygIv3gqdai2zGPaPQtqV9FOVVQizXpUbQMTlPSDC5Ej4SPnQ==
+"@tiptap/suggestion@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.1.12.tgz#a13782d1e625ec03b3f61b6839ecc95b6b685d3f"
+ integrity sha512-rhlLWwVkOodBGRMK0mAmE34l2a+BqM2Y7q1ViuQRBhs/6sZ8d83O4hARHKVwqT5stY4i1l7d7PoemV3uAGI6+g==
-"@tiptap/vue-2@2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.3.tgz#076778985d1e5ccbefb414b05c4c9804bb377258"
- integrity sha512-So2cl/W11Xt1MQqK47uNrddf08ruI2ScGHaBG2WZnYDtqJfwlAChRXi67fOeo/Y1vWy/69ekv5kLeQYWw9YJAg==
+"@tiptap/vue-2@^2.1.12":
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.1.12.tgz#1858057fb3bb2925228ac8d245e8e971c2b92e4f"
+ integrity sha512-QMalZecf10kXsug76zozaZGyDKMUBP4IKj5L4PP+KNHSLMHTHgZGpjs/l8G80+pCivYb9Ww4D1yz6ZWxLbwVxw==
dependencies:
- "@tiptap/extension-bubble-menu" "^2.0.3"
- "@tiptap/extension-floating-menu" "^2.0.3"
+ "@tiptap/extension-bubble-menu" "^2.1.12"
+ "@tiptap/extension-floating-menu" "^2.1.12"
+ vue-ts-types "^1.6.0"
"@tootallnate/once@2":
version "2.0.0"
@@ -13598,6 +13599,11 @@ vue-test-utils-compat@0.0.14:
resolved "https://registry.yarnpkg.com/vue-test-utils-compat/-/vue-test-utils-compat-0.0.14.tgz#c21556bba8bf605e7211ae094e8c9efd9ef83689"
integrity sha512-LtTdBGYOjByCy+XtpSK1rf2HPB0xo7L9jHP5v2BoE2iZ7IBnqIHliDQK/uPPfzXml79AxxB7XVGVu4zPxWki5A==
+vue-ts-types@^1.6.0:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/vue-ts-types/-/vue-ts-types-1.6.1.tgz#6d11c59faf2a9da6366858d82e10f43320164f26"
+ integrity sha512-Fee0nT2LSm/Drf7Gghpy8ssK4eGWtNgsPjgvC691lkMFWFtWRvgrD2+nFjRvd6aKJQhjcvY+SIPUCJpQpsyScA==
+
vue-virtual-scroll-list@^1.4.7:
version "1.4.7"
resolved "https://registry.yarnpkg.com/vue-virtual-scroll-list/-/vue-virtual-scroll-list-1.4.7.tgz#12ee26833885f5bb4d37dc058085ccf3ce5b5a74"