Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2025-04-18 21:12:14 +00:00
parent 5f176a4c91
commit f13c38c456
47 changed files with 324 additions and 176 deletions

View File

@ -18,7 +18,7 @@ variables:
# Helm chart ref used by test-on-cng pipeline # Helm chart ref used by test-on-cng pipeline
GITLAB_HELM_CHART_REF: "074bb942c9c65613c2576ce418f59b8577fff37c" GITLAB_HELM_CHART_REF: "074bb942c9c65613c2576ce418f59b8577fff37c"
# Specific ref for cng-mirror project to trigger builds for # Specific ref for cng-mirror project to trigger builds for
GITLAB_CNG_MIRROR_REF: "a200886cbfb7e1f5a7642838f8f8fac9f26c6a97" GITLAB_CNG_MIRROR_REF: "4be44c2267f0c2322d6efbe98a664b418ff1a22c"
# Makes sure some of the common scripts from pipeline-common use bundler to execute commands # Makes sure some of the common scripts from pipeline-common use bundler to execute commands
RUN_WITH_BUNDLE: "true" RUN_WITH_BUNDLE: "true"
# Makes sure reporting script defined in .gitlab-qa-report from pipeline-common is executed from correct folder # Makes sure reporting script defined in .gitlab-qa-report from pipeline-common is executed from correct folder

View File

@ -2163,7 +2163,6 @@ Gitlab/BoundedContexts:
- 'ee/app/graphql/ee/resolvers/board_item_filterable.rb' - 'ee/app/graphql/ee/resolvers/board_item_filterable.rb'
- 'ee/app/graphql/ee/resolvers/bulk_labels_resolver.rb' - 'ee/app/graphql/ee/resolvers/bulk_labels_resolver.rb'
- 'ee/app/graphql/ee/resolvers/group_issues_resolver.rb' - 'ee/app/graphql/ee/resolvers/group_issues_resolver.rb'
- 'ee/app/graphql/ee/resolvers/groups_resolver.rb'
- 'ee/app/graphql/ee/resolvers/issues/base_parent_resolver.rb' - 'ee/app/graphql/ee/resolvers/issues/base_parent_resolver.rb'
- 'ee/app/graphql/ee/resolvers/issues/base_resolver.rb' - 'ee/app/graphql/ee/resolvers/issues/base_resolver.rb'
- 'ee/app/graphql/ee/resolvers/issues_resolver.rb' - 'ee/app/graphql/ee/resolvers/issues_resolver.rb'

View File

@ -62,7 +62,6 @@ RSpec/BeEq:
- 'ee/spec/helpers/ee/groups/group_members_helper_spec.rb' - 'ee/spec/helpers/ee/groups/group_members_helper_spec.rb'
- 'ee/spec/helpers/ee/groups_helper_spec.rb' - 'ee/spec/helpers/ee/groups_helper_spec.rb'
- 'ee/spec/helpers/ee/merge_requests_helper_spec.rb' - 'ee/spec/helpers/ee/merge_requests_helper_spec.rb'
- 'ee/spec/helpers/ee/namespace_user_cap_reached_alert_helper_spec.rb'
- 'ee/spec/helpers/ee/protected_branches_helper_spec.rb' - 'ee/spec/helpers/ee/protected_branches_helper_spec.rb'
- 'ee/spec/helpers/ee/security_orchestration_helper_spec.rb' - 'ee/spec/helpers/ee/security_orchestration_helper_spec.rb'
- 'ee/spec/helpers/ee/users/callouts_helper_spec.rb' - 'ee/spec/helpers/ee/users/callouts_helper_spec.rb'

View File

@ -32,7 +32,6 @@ RSpec/FactoryBot/AvoidCreate:
- 'ee/spec/helpers/ee/issues_helper_spec.rb' - 'ee/spec/helpers/ee/issues_helper_spec.rb'
- 'ee/spec/helpers/ee/labels_helper_spec.rb' - 'ee/spec/helpers/ee/labels_helper_spec.rb'
- 'ee/spec/helpers/ee/lock_helper_spec.rb' - 'ee/spec/helpers/ee/lock_helper_spec.rb'
- 'ee/spec/helpers/ee/namespace_user_cap_reached_alert_helper_spec.rb'
- 'ee/spec/helpers/ee/namespaces_helper_spec.rb' - 'ee/spec/helpers/ee/namespaces_helper_spec.rb'
- 'ee/spec/helpers/ee/operations_helper_spec.rb' - 'ee/spec/helpers/ee/operations_helper_spec.rb'
- 'ee/spec/helpers/ee/projects/pipeline_helper_spec.rb' - 'ee/spec/helpers/ee/projects/pipeline_helper_spec.rb'
@ -207,7 +206,6 @@ RSpec/FactoryBot/AvoidCreate:
- 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb' - 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
- 'ee/spec/views/projects/security/policies/index.html.haml_spec.rb' - 'ee/spec/views/projects/security/policies/index.html.haml_spec.rb'
- 'ee/spec/views/projects/security/sast_configuration/show.html.haml_spec.rb' - 'ee/spec/views/projects/security/sast_configuration/show.html.haml_spec.rb'
- 'ee/spec/views/projects/settings/subscriptions/_index.html.haml_spec.rb'
- 'ee/spec/views/registrations/groups/new.html.haml_spec.rb' - 'ee/spec/views/registrations/groups/new.html.haml_spec.rb'
- 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb' - 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb'
- 'ee/spec/views/shared/_kerberos_clone_button.html.haml_spec.rb' - 'ee/spec/views/shared/_kerberos_clone_button.html.haml_spec.rb'

View File

@ -354,7 +354,6 @@ RSpec/FeatureCategory:
- 'ee/spec/helpers/ee/hooks_helper_spec.rb' - 'ee/spec/helpers/ee/hooks_helper_spec.rb'
- 'ee/spec/helpers/ee/labels_helper_spec.rb' - 'ee/spec/helpers/ee/labels_helper_spec.rb'
- 'ee/spec/helpers/ee/lock_helper_spec.rb' - 'ee/spec/helpers/ee/lock_helper_spec.rb'
- 'ee/spec/helpers/ee/namespace_user_cap_reached_alert_helper_spec.rb'
- 'ee/spec/helpers/ee/operations_helper_spec.rb' - 'ee/spec/helpers/ee/operations_helper_spec.rb'
- 'ee/spec/helpers/ee/profiles_helper_spec.rb' - 'ee/spec/helpers/ee/profiles_helper_spec.rb'
- 'ee/spec/helpers/ee/projects/incidents_helper_spec.rb' - 'ee/spec/helpers/ee/projects/incidents_helper_spec.rb'
@ -1021,7 +1020,6 @@ RSpec/FeatureCategory:
- 'ee/spec/views/projects/security/sast_configuration/show.html.haml_spec.rb' - 'ee/spec/views/projects/security/sast_configuration/show.html.haml_spec.rb'
- 'ee/spec/views/projects/settings/merge_requests/_merge_request_approvals.html.haml_spec.rb' - 'ee/spec/views/projects/settings/merge_requests/_merge_request_approvals.html.haml_spec.rb'
- 'ee/spec/views/projects/settings/merge_requests/_merge_request_status_checks_settings.html.haml_spec.rb' - 'ee/spec/views/projects/settings/merge_requests/_merge_request_status_checks_settings.html.haml_spec.rb'
- 'ee/spec/views/projects/settings/subscriptions/_index.html.haml_spec.rb'
- 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb' - 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb'
- 'ee/spec/views/shared/_kerberos_clone_button.html.haml_spec.rb' - 'ee/spec/views/shared/_kerberos_clone_button.html.haml_spec.rb'
- 'ee/spec/views/shared/_mirror_status.html.haml_spec.rb' - 'ee/spec/views/shared/_mirror_status.html.haml_spec.rb'

View File

@ -23,5 +23,6 @@ reporters:
formatter: formatter:
rubocop: # formatting rubocop: # formatting
require_paths: [] require_paths: []
plugins: [] plugins:
- solargraph-rspec
max_files: 20000 max_files: 20000

View File

@ -478,7 +478,9 @@ gem 'warning', '~> 1.5.0', feature_category: :shared
group :development do group :development do
gem 'lefthook', '~> 1.11.0', require: false, feature_category: :tooling gem 'lefthook', '~> 1.11.0', require: false, feature_category: :tooling
gem 'rubocop', feature_category: :tooling gem 'rubocop', feature_category: :tooling
gem 'solargraph', '~> 0.47.2', require: false, feature_category: :shared
gem 'solargraph', '~> 0.54.0', require: false, feature_category: :shared
gem 'solargraph-rspec', '~> 0.5.1', require: false, feature_category: :shared
gem 'letter_opener_web', '~> 3.0.0', feature_category: :shared gem 'letter_opener_web', '~> 3.0.0', feature_category: :shared
gem 'lookbook', '~> 2.3', feature_category: :shared gem 'lookbook', '~> 2.3', feature_category: :shared

View File

@ -138,7 +138,6 @@
{"name":"dry-types","version":"1.7.1","platform":"ruby","checksum":"12165841145a18dd22151f143707b90c8093f71e5ae06ee0f2301f5321f8cdb8"}, {"name":"dry-types","version":"1.7.1","platform":"ruby","checksum":"12165841145a18dd22151f143707b90c8093f71e5ae06ee0f2301f5321f8cdb8"},
{"name":"dumb_delegator","version":"1.0.0","platform":"ruby","checksum":"ff5e411816d2d8ad8e260b269e712ae3839dddb0f9f8e18d3b1a3fe08f6d2e94"}, {"name":"dumb_delegator","version":"1.0.0","platform":"ruby","checksum":"ff5e411816d2d8ad8e260b269e712ae3839dddb0f9f8e18d3b1a3fe08f6d2e94"},
{"name":"duo_api","version":"1.4.0","platform":"ruby","checksum":"06a6b406184e6e4b14af7389ac3990e667fb8509a1feba7de3af2f78d98c0877"}, {"name":"duo_api","version":"1.4.0","platform":"ruby","checksum":"06a6b406184e6e4b14af7389ac3990e667fb8509a1feba7de3af2f78d98c0877"},
{"name":"e2mmap","version":"0.1.0","platform":"ruby","checksum":"45ee6bba2d97a7d91ee0885774261feee87e28c598355df31e93b56196ec0f59"},
{"name":"ed25519","version":"1.3.0","platform":"java","checksum":"8e5d2f8a5325c7a463d61d1a48406ce54074c610f3dccd889e6532c9527a3894"}, {"name":"ed25519","version":"1.3.0","platform":"java","checksum":"8e5d2f8a5325c7a463d61d1a48406ce54074c610f3dccd889e6532c9527a3894"},
{"name":"ed25519","version":"1.3.0","platform":"ruby","checksum":"514a5584f84d39daac568a17ec93a4e7261e140c52c562ed8c382c18456e627d"}, {"name":"ed25519","version":"1.3.0","platform":"ruby","checksum":"514a5584f84d39daac568a17ec93a4e7261e140c52c562ed8c382c18456e627d"},
{"name":"elasticsearch","version":"7.17.11","platform":"ruby","checksum":"ed080f085d939f21d07f424ebcea95326e4bdb5f770a8f33aac699374f2ffc86"}, {"name":"elasticsearch","version":"7.17.11","platform":"ruby","checksum":"ed080f085d939f21d07f424ebcea95326e4bdb5f770a8f33aac699374f2ffc86"},
@ -340,8 +339,8 @@
{"name":"io-event","version":"1.9.0","platform":"ruby","checksum":"4c262b6610ad643a2be75e892135aca4fa67edc67d1944c0ae6b6e5dd73f4fc1"}, {"name":"io-event","version":"1.9.0","platform":"ruby","checksum":"4c262b6610ad643a2be75e892135aca4fa67edc67d1944c0ae6b6e5dd73f4fc1"},
{"name":"ipaddress","version":"0.8.3","platform":"ruby","checksum":"85640c4f9194c26937afc8c78e3074a8e7c97d5d1210358d1440f01034d006f5"}, {"name":"ipaddress","version":"0.8.3","platform":"ruby","checksum":"85640c4f9194c26937afc8c78e3074a8e7c97d5d1210358d1440f01034d006f5"},
{"name":"jaeger-client","version":"1.1.0","platform":"ruby","checksum":"cb5e9b9bbee6ee8d6a82d03d947a5b04543d8c0a949c22e484254f18d8a458a8"}, {"name":"jaeger-client","version":"1.1.0","platform":"ruby","checksum":"cb5e9b9bbee6ee8d6a82d03d947a5b04543d8c0a949c22e484254f18d8a458a8"},
{"name":"jaro_winkler","version":"1.5.6","platform":"java","checksum":"3262aea433861fec3179184e9adc1933cca8bc15665957a143b56816f1a22f74"}, {"name":"jaro_winkler","version":"1.6.0","platform":"java","checksum":"6cbb36eb4c2649834124d8b92957e577890e8157dd41be8252fde5b02b63b42b"},
{"name":"jaro_winkler","version":"1.5.6","platform":"ruby","checksum":"007db7805527ada1cc12f2547676181d63b0a504ec4dd7a9a2eb2424521ccd81"}, {"name":"jaro_winkler","version":"1.6.0","platform":"ruby","checksum":"8b081ab4ba7da5d16b438e62c4be58b87724bfeeb1527e62603f05ab0a2cc424"},
{"name":"jira-ruby","version":"2.3.0","platform":"ruby","checksum":"abf26e6bff4a8ea40bae06f7df6276a5776905c63fb2070934823ca54f62eb62"}, {"name":"jira-ruby","version":"2.3.0","platform":"ruby","checksum":"abf26e6bff4a8ea40bae06f7df6276a5776905c63fb2070934823ca54f62eb62"},
{"name":"jmespath","version":"1.6.2","platform":"ruby","checksum":"238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1"}, {"name":"jmespath","version":"1.6.2","platform":"ruby","checksum":"238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1"},
{"name":"js_regex","version":"3.8.0","platform":"ruby","checksum":"7934bcdd5a0e6d5af4a520288fd4684a02a472ae55831d9178ccaf82356344b5"}, {"name":"js_regex","version":"3.8.0","platform":"ruby","checksum":"7934bcdd5a0e6d5af4a520288fd4684a02a472ae55831d9178ccaf82356344b5"},
@ -442,6 +441,7 @@
{"name":"numerizer","version":"0.2.0","platform":"ruby","checksum":"e58076d5ee5370417b7e52d9cb25836d62acd1b8d9a194c308707986c1705d7b"}, {"name":"numerizer","version":"0.2.0","platform":"ruby","checksum":"e58076d5ee5370417b7e52d9cb25836d62acd1b8d9a194c308707986c1705d7b"},
{"name":"oauth","version":"0.5.6","platform":"ruby","checksum":"4085fe28e0c5e2434135e00a6555294fd2a4ff96a98d1bdecdcd619fc6368dff"}, {"name":"oauth","version":"0.5.6","platform":"ruby","checksum":"4085fe28e0c5e2434135e00a6555294fd2a4ff96a98d1bdecdcd619fc6368dff"},
{"name":"oauth2","version":"2.0.9","platform":"ruby","checksum":"b21f9defcf52dc1610e0dfab4c868342173dcd707fd15c777d9f4f04e153f7fb"}, {"name":"oauth2","version":"2.0.9","platform":"ruby","checksum":"b21f9defcf52dc1610e0dfab4c868342173dcd707fd15c777d9f4f04e153f7fb"},
{"name":"observer","version":"0.1.2","platform":"ruby","checksum":"d8a3107131ba661138d748e7be3dbafc0d82e732fffba9fccb3d7829880950ac"},
{"name":"octokit","version":"9.2.0","platform":"ruby","checksum":"4fa47ff35ce654127edf2c836ab9269bcc8829f5542dc1e86871f697ce7f4316"}, {"name":"octokit","version":"9.2.0","platform":"ruby","checksum":"4fa47ff35ce654127edf2c836ab9269bcc8829f5542dc1e86871f697ce7f4316"},
{"name":"ohai","version":"18.1.18","platform":"ruby","checksum":"42ee8196945cb935fdeec93ba7aaee757d1d552f7b933912a1f25863c3cc1ff0"}, {"name":"ohai","version":"18.1.18","platform":"ruby","checksum":"42ee8196945cb935fdeec93ba7aaee757d1d552f7b933912a1f25863c3cc1ff0"},
{"name":"oj","version":"3.16.10","platform":"ruby","checksum":"7f26bed974e331e16d579b470b0865010757f6fe6ee30ea9b67df653fbe13d7c"}, {"name":"oj","version":"3.16.10","platform":"ruby","checksum":"7f26bed974e331e16d579b470b0865010757f6fe6ee30ea9b67df653fbe13d7c"},
@ -601,7 +601,7 @@
{"name":"rest-client","version":"2.1.0","platform":"x86-mingw32","checksum":"fb543caf36cb555c05c6186aeb1273c6a1b059896e4cfd394e7269b20c40ca01"}, {"name":"rest-client","version":"2.1.0","platform":"x86-mingw32","checksum":"fb543caf36cb555c05c6186aeb1273c6a1b059896e4cfd394e7269b20c40ca01"},
{"name":"rest-client","version":"2.1.0","platform":"x86-mswin32","checksum":"a35a3bb8d16ca39d110a946a2c805267f98ce07a0ae890e4512a45eadea47a6e"}, {"name":"rest-client","version":"2.1.0","platform":"x86-mswin32","checksum":"a35a3bb8d16ca39d110a946a2c805267f98ce07a0ae890e4512a45eadea47a6e"},
{"name":"retriable","version":"3.1.2","platform":"ruby","checksum":"0a5a5d0ca4ba61a76fb31a17ab8f7f80281beb040c329d34dfc137a1398688e0"}, {"name":"retriable","version":"3.1.2","platform":"ruby","checksum":"0a5a5d0ca4ba61a76fb31a17ab8f7f80281beb040c329d34dfc137a1398688e0"},
{"name":"reverse_markdown","version":"1.4.0","platform":"ruby","checksum":"a3305da1509ac8388fa84a28745621113e121383402a2e8e9350ba649034e870"}, {"name":"reverse_markdown","version":"2.1.1","platform":"ruby","checksum":"b2206466b682ac1177b6b8ec321d00a84fca02d096c5d676a7a0cc5838dc0701"},
{"name":"rexml","version":"3.4.1","platform":"ruby","checksum":"c74527a9a0a04b4ec31dbe0dc4ed6004b960af943d8db42e539edde3a871abca"}, {"name":"rexml","version":"3.4.1","platform":"ruby","checksum":"c74527a9a0a04b4ec31dbe0dc4ed6004b960af943d8db42e539edde3a871abca"},
{"name":"rinku","version":"2.0.0","platform":"ruby","checksum":"3e695aaf9f24baba3af45823b5c427b58a624582132f18482320e2737f9f8a85"}, {"name":"rinku","version":"2.0.0","platform":"ruby","checksum":"3e695aaf9f24baba3af45823b5c427b58a624582132f18482320e2737f9f8a85"},
{"name":"rotp","version":"6.3.0","platform":"ruby","checksum":"75d40087e65ed0d8022c33055a6306c1c400d1c12261932533b5d6cbcd868854"}, {"name":"rotp","version":"6.3.0","platform":"ruby","checksum":"75d40087e65ed0d8022c33055a6306c1c400d1c12261932533b5d6cbcd868854"},
@ -698,7 +698,8 @@
{"name":"slack-messenger","version":"2.3.6","platform":"ruby","checksum":"58581e587debcbb769336cc7ebe4eb6ae411947fccf347e967a17ac9813e66d8"}, {"name":"slack-messenger","version":"2.3.6","platform":"ruby","checksum":"58581e587debcbb769336cc7ebe4eb6ae411947fccf347e967a17ac9813e66d8"},
{"name":"snaky_hash","version":"2.0.0","platform":"ruby","checksum":"fe8b2e39e8ff69320f7812af73ea06401579e29ff1734a7009567391600687de"}, {"name":"snaky_hash","version":"2.0.0","platform":"ruby","checksum":"fe8b2e39e8ff69320f7812af73ea06401579e29ff1734a7009567391600687de"},
{"name":"snowplow-tracker","version":"0.8.0","platform":"ruby","checksum":"7ba6f4f1443a829845fd28e63eda72d9d3d247f485310ddcccaebbc52b734a38"}, {"name":"snowplow-tracker","version":"0.8.0","platform":"ruby","checksum":"7ba6f4f1443a829845fd28e63eda72d9d3d247f485310ddcccaebbc52b734a38"},
{"name":"solargraph","version":"0.47.2","platform":"ruby","checksum":"87ca4b799b9155c2c31c15954c483e952fdacd800f52d6709b901dd447bcac6a"}, {"name":"solargraph","version":"0.54.0","platform":"ruby","checksum":"3fd13f381e6428b3c593716ee6d3d5aa802ac647b8b13692d760ab7ac3e1fdc1"},
{"name":"solargraph-rspec","version":"0.5.1","platform":"ruby","checksum":"0dfc9124f17b23e95c30acb82c1f799c865408a56b17099b2d6d7b23a76bface"},
{"name":"sorbet-runtime","version":"0.5.11647","platform":"ruby","checksum":"64b65112f2e6a5323310ca9ac0d7d9a6be63aade5a62a6225fe066042ff4fdb6"}, {"name":"sorbet-runtime","version":"0.5.11647","platform":"ruby","checksum":"64b65112f2e6a5323310ca9ac0d7d9a6be63aade5a62a6225fe066042ff4fdb6"},
{"name":"spamcheck","version":"1.3.3","platform":"ruby","checksum":"3a29ba9dfcd59543d88054d38c657f79e0a6cf44d763df08ad47680abed50ec7"}, {"name":"spamcheck","version":"1.3.3","platform":"ruby","checksum":"3a29ba9dfcd59543d88054d38c657f79e0a6cf44d763df08ad47680abed50ec7"},
{"name":"spring","version":"4.3.0","platform":"ruby","checksum":"0aaaf3bcce38e8528275854881d1922660d76cbd19a9a3af4a419d95b7fe7122"}, {"name":"spring","version":"4.3.0","platform":"ruby","checksum":"0aaaf3bcce38e8528275854881d1922660d76cbd19a9a3af4a419d95b7fe7122"},
@ -797,5 +798,6 @@
{"name":"xpath","version":"3.2.0","platform":"ruby","checksum":"6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e"}, {"name":"xpath","version":"3.2.0","platform":"ruby","checksum":"6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e"},
{"name":"yajl-ruby","version":"1.4.3","platform":"ruby","checksum":"8c974d9c11ae07b0a3b6d26efea8407269b02e4138118fbe3ef0d2ec9724d1d2"}, {"name":"yajl-ruby","version":"1.4.3","platform":"ruby","checksum":"8c974d9c11ae07b0a3b6d26efea8407269b02e4138118fbe3ef0d2ec9724d1d2"},
{"name":"yard","version":"0.9.37","platform":"ruby","checksum":"a6e910399e78e613f80ba9add9ba7c394b1a935f083cccbef82903a3d2a26992"}, {"name":"yard","version":"0.9.37","platform":"ruby","checksum":"a6e910399e78e613f80ba9add9ba7c394b1a935f083cccbef82903a3d2a26992"},
{"name":"yard-solargraph","version":"0.1.0","platform":"ruby","checksum":"a19a4619c942181a618fb9458970a9d2534cf7fda69fc43949629a7948a5930e"},
{"name":"zeitwerk","version":"2.6.7","platform":"ruby","checksum":"61767a6158480df290d0d2a3fd860d8ba3a28ba113837668ee94b657716a1409"} {"name":"zeitwerk","version":"2.6.7","platform":"ruby","checksum":"61767a6158480df290d0d2a3fd860d8ba3a28ba113837668ee94b657716a1409"}
] ]

View File

@ -579,7 +579,6 @@ GEM
zeitwerk (~> 2.6) zeitwerk (~> 2.6)
dumb_delegator (1.0.0) dumb_delegator (1.0.0)
duo_api (1.4.0) duo_api (1.4.0)
e2mmap (0.1.0)
ed25519 (1.3.0) ed25519 (1.3.0)
elasticsearch (7.17.11) elasticsearch (7.17.11)
elasticsearch-api (= 7.17.11) elasticsearch-api (= 7.17.11)
@ -1043,7 +1042,7 @@ GEM
jaeger-client (1.1.0) jaeger-client (1.1.0)
opentracing (~> 0.3) opentracing (~> 0.3)
thrift thrift
jaro_winkler (1.5.6) jaro_winkler (1.6.0)
jira-ruby (2.3.0) jira-ruby (2.3.0)
activesupport activesupport
atlassian-jwt atlassian-jwt
@ -1232,6 +1231,7 @@ GEM
rack (>= 1.2, < 4) rack (>= 1.2, < 4)
snaky_hash (~> 2.0) snaky_hash (~> 2.0)
version_gem (~> 1.1) version_gem (~> 1.1)
observer (0.1.2)
octokit (9.2.0) octokit (9.2.0)
faraday (>= 1, < 3) faraday (>= 1, < 3)
sawyer (~> 0.9) sawyer (~> 0.9)
@ -1609,7 +1609,7 @@ GEM
mime-types (>= 1.16, < 4.0) mime-types (>= 1.16, < 4.0)
netrc (~> 0.8) netrc (~> 0.8)
retriable (3.1.2) retriable (3.1.2)
reverse_markdown (1.4.0) reverse_markdown (2.1.1)
nokogiri nokogiri
rexml (3.4.1) rexml (3.4.1)
rinku (2.0.0) rinku (2.0.0)
@ -1788,21 +1788,27 @@ GEM
hashie hashie
version_gem (~> 1.1) version_gem (~> 1.1)
snowplow-tracker (0.8.0) snowplow-tracker (0.8.0)
solargraph (0.47.2) solargraph (0.54.0)
backport (~> 1.2) backport (~> 1.2)
benchmark benchmark
bundler (>= 1.17.2) bundler (~> 2.0)
diff-lcs (~> 1.4) diff-lcs (~> 1.4)
e2mmap jaro_winkler (~> 1.6)
jaro_winkler (~> 1.5)
kramdown (~> 2.3) kramdown (~> 2.3)
kramdown-parser-gfm (~> 1.1) kramdown-parser-gfm (~> 1.1)
logger (~> 1.6)
observer (~> 0.1)
ostruct (~> 0.6)
parser (~> 3.0) parser (~> 3.0)
reverse_markdown (>= 1.0.5, < 3) rbs (~> 3.3)
rubocop (>= 0.52) reverse_markdown (>= 2.0, < 4)
rubocop (~> 1.38)
thor (~> 1.0) thor (~> 1.0)
tilt (~> 2.0) tilt (~> 2.0)
yard (~> 0.9, >= 0.9.24) yard (~> 0.9, >= 0.9.24)
yard-solargraph (~> 0.1)
solargraph-rspec (0.5.1)
solargraph (~> 0.52, >= 0.52.0)
sorbet-runtime (0.5.11647) sorbet-runtime (0.5.11647)
spamcheck (1.3.3) spamcheck (1.3.3)
grpc (~> 1.63) grpc (~> 1.63)
@ -2000,6 +2006,8 @@ GEM
nokogiri (~> 1.8) nokogiri (~> 1.8)
yajl-ruby (1.4.3) yajl-ruby (1.4.3)
yard (0.9.37) yard (0.9.37)
yard-solargraph (0.1.0)
yard (~> 0.9)
zeitwerk (2.6.7) zeitwerk (2.6.7)
PLATFORMS PLATFORMS
@ -2331,7 +2339,8 @@ DEPENDENCIES
simplecov-lcov (~> 0.8.0) simplecov-lcov (~> 0.8.0)
slack-messenger (~> 2.3.5) slack-messenger (~> 2.3.5)
snowplow-tracker (~> 0.8.0) snowplow-tracker (~> 0.8.0)
solargraph (~> 0.47.2) solargraph (~> 0.54.0)
solargraph-rspec (~> 0.5.1)
spamcheck (~> 1.3.0) spamcheck (~> 1.3.0)
spring (~> 4.3.0) spring (~> 4.3.0)
spring-commands-rspec (~> 1.0.4) spring-commands-rspec (~> 1.0.4)

View File

@ -138,7 +138,6 @@
{"name":"dry-types","version":"1.7.1","platform":"ruby","checksum":"12165841145a18dd22151f143707b90c8093f71e5ae06ee0f2301f5321f8cdb8"}, {"name":"dry-types","version":"1.7.1","platform":"ruby","checksum":"12165841145a18dd22151f143707b90c8093f71e5ae06ee0f2301f5321f8cdb8"},
{"name":"dumb_delegator","version":"1.0.0","platform":"ruby","checksum":"ff5e411816d2d8ad8e260b269e712ae3839dddb0f9f8e18d3b1a3fe08f6d2e94"}, {"name":"dumb_delegator","version":"1.0.0","platform":"ruby","checksum":"ff5e411816d2d8ad8e260b269e712ae3839dddb0f9f8e18d3b1a3fe08f6d2e94"},
{"name":"duo_api","version":"1.4.0","platform":"ruby","checksum":"06a6b406184e6e4b14af7389ac3990e667fb8509a1feba7de3af2f78d98c0877"}, {"name":"duo_api","version":"1.4.0","platform":"ruby","checksum":"06a6b406184e6e4b14af7389ac3990e667fb8509a1feba7de3af2f78d98c0877"},
{"name":"e2mmap","version":"0.1.0","platform":"ruby","checksum":"45ee6bba2d97a7d91ee0885774261feee87e28c598355df31e93b56196ec0f59"},
{"name":"ed25519","version":"1.3.0","platform":"java","checksum":"8e5d2f8a5325c7a463d61d1a48406ce54074c610f3dccd889e6532c9527a3894"}, {"name":"ed25519","version":"1.3.0","platform":"java","checksum":"8e5d2f8a5325c7a463d61d1a48406ce54074c610f3dccd889e6532c9527a3894"},
{"name":"ed25519","version":"1.3.0","platform":"ruby","checksum":"514a5584f84d39daac568a17ec93a4e7261e140c52c562ed8c382c18456e627d"}, {"name":"ed25519","version":"1.3.0","platform":"ruby","checksum":"514a5584f84d39daac568a17ec93a4e7261e140c52c562ed8c382c18456e627d"},
{"name":"elasticsearch","version":"7.17.11","platform":"ruby","checksum":"ed080f085d939f21d07f424ebcea95326e4bdb5f770a8f33aac699374f2ffc86"}, {"name":"elasticsearch","version":"7.17.11","platform":"ruby","checksum":"ed080f085d939f21d07f424ebcea95326e4bdb5f770a8f33aac699374f2ffc86"},
@ -343,8 +342,8 @@
{"name":"ipaddress","version":"0.8.3","platform":"ruby","checksum":"85640c4f9194c26937afc8c78e3074a8e7c97d5d1210358d1440f01034d006f5"}, {"name":"ipaddress","version":"0.8.3","platform":"ruby","checksum":"85640c4f9194c26937afc8c78e3074a8e7c97d5d1210358d1440f01034d006f5"},
{"name":"irb","version":"1.15.2","platform":"ruby","checksum":"222f32952e278da34b58ffe45e8634bf4afc2dc7aa9da23fed67e581aa50fdba"}, {"name":"irb","version":"1.15.2","platform":"ruby","checksum":"222f32952e278da34b58ffe45e8634bf4afc2dc7aa9da23fed67e581aa50fdba"},
{"name":"jaeger-client","version":"1.1.0","platform":"ruby","checksum":"cb5e9b9bbee6ee8d6a82d03d947a5b04543d8c0a949c22e484254f18d8a458a8"}, {"name":"jaeger-client","version":"1.1.0","platform":"ruby","checksum":"cb5e9b9bbee6ee8d6a82d03d947a5b04543d8c0a949c22e484254f18d8a458a8"},
{"name":"jaro_winkler","version":"1.5.6","platform":"java","checksum":"3262aea433861fec3179184e9adc1933cca8bc15665957a143b56816f1a22f74"}, {"name":"jaro_winkler","version":"1.6.0","platform":"java","checksum":"6cbb36eb4c2649834124d8b92957e577890e8157dd41be8252fde5b02b63b42b"},
{"name":"jaro_winkler","version":"1.5.6","platform":"ruby","checksum":"007db7805527ada1cc12f2547676181d63b0a504ec4dd7a9a2eb2424521ccd81"}, {"name":"jaro_winkler","version":"1.6.0","platform":"ruby","checksum":"8b081ab4ba7da5d16b438e62c4be58b87724bfeeb1527e62603f05ab0a2cc424"},
{"name":"jira-ruby","version":"2.3.0","platform":"ruby","checksum":"abf26e6bff4a8ea40bae06f7df6276a5776905c63fb2070934823ca54f62eb62"}, {"name":"jira-ruby","version":"2.3.0","platform":"ruby","checksum":"abf26e6bff4a8ea40bae06f7df6276a5776905c63fb2070934823ca54f62eb62"},
{"name":"jmespath","version":"1.6.2","platform":"ruby","checksum":"238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1"}, {"name":"jmespath","version":"1.6.2","platform":"ruby","checksum":"238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1"},
{"name":"js_regex","version":"3.8.0","platform":"ruby","checksum":"7934bcdd5a0e6d5af4a520288fd4684a02a472ae55831d9178ccaf82356344b5"}, {"name":"js_regex","version":"3.8.0","platform":"ruby","checksum":"7934bcdd5a0e6d5af4a520288fd4684a02a472ae55831d9178ccaf82356344b5"},
@ -445,6 +444,7 @@
{"name":"numerizer","version":"0.2.0","platform":"ruby","checksum":"e58076d5ee5370417b7e52d9cb25836d62acd1b8d9a194c308707986c1705d7b"}, {"name":"numerizer","version":"0.2.0","platform":"ruby","checksum":"e58076d5ee5370417b7e52d9cb25836d62acd1b8d9a194c308707986c1705d7b"},
{"name":"oauth","version":"0.5.6","platform":"ruby","checksum":"4085fe28e0c5e2434135e00a6555294fd2a4ff96a98d1bdecdcd619fc6368dff"}, {"name":"oauth","version":"0.5.6","platform":"ruby","checksum":"4085fe28e0c5e2434135e00a6555294fd2a4ff96a98d1bdecdcd619fc6368dff"},
{"name":"oauth2","version":"2.0.9","platform":"ruby","checksum":"b21f9defcf52dc1610e0dfab4c868342173dcd707fd15c777d9f4f04e153f7fb"}, {"name":"oauth2","version":"2.0.9","platform":"ruby","checksum":"b21f9defcf52dc1610e0dfab4c868342173dcd707fd15c777d9f4f04e153f7fb"},
{"name":"observer","version":"0.1.2","platform":"ruby","checksum":"d8a3107131ba661138d748e7be3dbafc0d82e732fffba9fccb3d7829880950ac"},
{"name":"octokit","version":"9.2.0","platform":"ruby","checksum":"4fa47ff35ce654127edf2c836ab9269bcc8829f5542dc1e86871f697ce7f4316"}, {"name":"octokit","version":"9.2.0","platform":"ruby","checksum":"4fa47ff35ce654127edf2c836ab9269bcc8829f5542dc1e86871f697ce7f4316"},
{"name":"ohai","version":"18.1.18","platform":"ruby","checksum":"42ee8196945cb935fdeec93ba7aaee757d1d552f7b933912a1f25863c3cc1ff0"}, {"name":"ohai","version":"18.1.18","platform":"ruby","checksum":"42ee8196945cb935fdeec93ba7aaee757d1d552f7b933912a1f25863c3cc1ff0"},
{"name":"oj","version":"3.16.10","platform":"ruby","checksum":"7f26bed974e331e16d579b470b0865010757f6fe6ee30ea9b67df653fbe13d7c"}, {"name":"oj","version":"3.16.10","platform":"ruby","checksum":"7f26bed974e331e16d579b470b0865010757f6fe6ee30ea9b67df653fbe13d7c"},
@ -611,7 +611,7 @@
{"name":"rest-client","version":"2.1.0","platform":"x86-mingw32","checksum":"fb543caf36cb555c05c6186aeb1273c6a1b059896e4cfd394e7269b20c40ca01"}, {"name":"rest-client","version":"2.1.0","platform":"x86-mingw32","checksum":"fb543caf36cb555c05c6186aeb1273c6a1b059896e4cfd394e7269b20c40ca01"},
{"name":"rest-client","version":"2.1.0","platform":"x86-mswin32","checksum":"a35a3bb8d16ca39d110a946a2c805267f98ce07a0ae890e4512a45eadea47a6e"}, {"name":"rest-client","version":"2.1.0","platform":"x86-mswin32","checksum":"a35a3bb8d16ca39d110a946a2c805267f98ce07a0ae890e4512a45eadea47a6e"},
{"name":"retriable","version":"3.1.2","platform":"ruby","checksum":"0a5a5d0ca4ba61a76fb31a17ab8f7f80281beb040c329d34dfc137a1398688e0"}, {"name":"retriable","version":"3.1.2","platform":"ruby","checksum":"0a5a5d0ca4ba61a76fb31a17ab8f7f80281beb040c329d34dfc137a1398688e0"},
{"name":"reverse_markdown","version":"1.4.0","platform":"ruby","checksum":"a3305da1509ac8388fa84a28745621113e121383402a2e8e9350ba649034e870"}, {"name":"reverse_markdown","version":"2.1.1","platform":"ruby","checksum":"b2206466b682ac1177b6b8ec321d00a84fca02d096c5d676a7a0cc5838dc0701"},
{"name":"rexml","version":"3.4.1","platform":"ruby","checksum":"c74527a9a0a04b4ec31dbe0dc4ed6004b960af943d8db42e539edde3a871abca"}, {"name":"rexml","version":"3.4.1","platform":"ruby","checksum":"c74527a9a0a04b4ec31dbe0dc4ed6004b960af943d8db42e539edde3a871abca"},
{"name":"rinku","version":"2.0.0","platform":"ruby","checksum":"3e695aaf9f24baba3af45823b5c427b58a624582132f18482320e2737f9f8a85"}, {"name":"rinku","version":"2.0.0","platform":"ruby","checksum":"3e695aaf9f24baba3af45823b5c427b58a624582132f18482320e2737f9f8a85"},
{"name":"rotp","version":"6.3.0","platform":"ruby","checksum":"75d40087e65ed0d8022c33055a6306c1c400d1c12261932533b5d6cbcd868854"}, {"name":"rotp","version":"6.3.0","platform":"ruby","checksum":"75d40087e65ed0d8022c33055a6306c1c400d1c12261932533b5d6cbcd868854"},
@ -709,7 +709,8 @@
{"name":"slack-messenger","version":"2.3.6","platform":"ruby","checksum":"58581e587debcbb769336cc7ebe4eb6ae411947fccf347e967a17ac9813e66d8"}, {"name":"slack-messenger","version":"2.3.6","platform":"ruby","checksum":"58581e587debcbb769336cc7ebe4eb6ae411947fccf347e967a17ac9813e66d8"},
{"name":"snaky_hash","version":"2.0.0","platform":"ruby","checksum":"fe8b2e39e8ff69320f7812af73ea06401579e29ff1734a7009567391600687de"}, {"name":"snaky_hash","version":"2.0.0","platform":"ruby","checksum":"fe8b2e39e8ff69320f7812af73ea06401579e29ff1734a7009567391600687de"},
{"name":"snowplow-tracker","version":"0.8.0","platform":"ruby","checksum":"7ba6f4f1443a829845fd28e63eda72d9d3d247f485310ddcccaebbc52b734a38"}, {"name":"snowplow-tracker","version":"0.8.0","platform":"ruby","checksum":"7ba6f4f1443a829845fd28e63eda72d9d3d247f485310ddcccaebbc52b734a38"},
{"name":"solargraph","version":"0.47.2","platform":"ruby","checksum":"87ca4b799b9155c2c31c15954c483e952fdacd800f52d6709b901dd447bcac6a"}, {"name":"solargraph","version":"0.54.0","platform":"ruby","checksum":"3fd13f381e6428b3c593716ee6d3d5aa802ac647b8b13692d760ab7ac3e1fdc1"},
{"name":"solargraph-rspec","version":"0.5.1","platform":"ruby","checksum":"0dfc9124f17b23e95c30acb82c1f799c865408a56b17099b2d6d7b23a76bface"},
{"name":"sorbet-runtime","version":"0.5.11647","platform":"ruby","checksum":"64b65112f2e6a5323310ca9ac0d7d9a6be63aade5a62a6225fe066042ff4fdb6"}, {"name":"sorbet-runtime","version":"0.5.11647","platform":"ruby","checksum":"64b65112f2e6a5323310ca9ac0d7d9a6be63aade5a62a6225fe066042ff4fdb6"},
{"name":"spamcheck","version":"1.3.3","platform":"ruby","checksum":"3a29ba9dfcd59543d88054d38c657f79e0a6cf44d763df08ad47680abed50ec7"}, {"name":"spamcheck","version":"1.3.3","platform":"ruby","checksum":"3a29ba9dfcd59543d88054d38c657f79e0a6cf44d763df08ad47680abed50ec7"},
{"name":"spring","version":"4.3.0","platform":"ruby","checksum":"0aaaf3bcce38e8528275854881d1922660d76cbd19a9a3af4a419d95b7fe7122"}, {"name":"spring","version":"4.3.0","platform":"ruby","checksum":"0aaaf3bcce38e8528275854881d1922660d76cbd19a9a3af4a419d95b7fe7122"},
@ -810,5 +811,6 @@
{"name":"xpath","version":"3.2.0","platform":"ruby","checksum":"6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e"}, {"name":"xpath","version":"3.2.0","platform":"ruby","checksum":"6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e"},
{"name":"yajl-ruby","version":"1.4.3","platform":"ruby","checksum":"8c974d9c11ae07b0a3b6d26efea8407269b02e4138118fbe3ef0d2ec9724d1d2"}, {"name":"yajl-ruby","version":"1.4.3","platform":"ruby","checksum":"8c974d9c11ae07b0a3b6d26efea8407269b02e4138118fbe3ef0d2ec9724d1d2"},
{"name":"yard","version":"0.9.37","platform":"ruby","checksum":"a6e910399e78e613f80ba9add9ba7c394b1a935f083cccbef82903a3d2a26992"}, {"name":"yard","version":"0.9.37","platform":"ruby","checksum":"a6e910399e78e613f80ba9add9ba7c394b1a935f083cccbef82903a3d2a26992"},
{"name":"yard-solargraph","version":"0.1.0","platform":"ruby","checksum":"a19a4619c942181a618fb9458970a9d2534cf7fda69fc43949629a7948a5930e"},
{"name":"zeitwerk","version":"2.6.7","platform":"ruby","checksum":"61767a6158480df290d0d2a3fd860d8ba3a28ba113837668ee94b657716a1409"} {"name":"zeitwerk","version":"2.6.7","platform":"ruby","checksum":"61767a6158480df290d0d2a3fd860d8ba3a28ba113837668ee94b657716a1409"}
] ]

View File

@ -591,7 +591,6 @@ GEM
zeitwerk (~> 2.6) zeitwerk (~> 2.6)
dumb_delegator (1.0.0) dumb_delegator (1.0.0)
duo_api (1.4.0) duo_api (1.4.0)
e2mmap (0.1.0)
ed25519 (1.3.0) ed25519 (1.3.0)
elasticsearch (7.17.11) elasticsearch (7.17.11)
elasticsearch-api (= 7.17.11) elasticsearch-api (= 7.17.11)
@ -1060,7 +1059,7 @@ GEM
jaeger-client (1.1.0) jaeger-client (1.1.0)
opentracing (~> 0.3) opentracing (~> 0.3)
thrift thrift
jaro_winkler (1.5.6) jaro_winkler (1.6.0)
jira-ruby (2.3.0) jira-ruby (2.3.0)
activesupport activesupport
atlassian-jwt atlassian-jwt
@ -1249,6 +1248,7 @@ GEM
rack (>= 1.2, < 4) rack (>= 1.2, < 4)
snaky_hash (~> 2.0) snaky_hash (~> 2.0)
version_gem (~> 1.1) version_gem (~> 1.1)
observer (0.1.2)
octokit (9.2.0) octokit (9.2.0)
faraday (>= 1, < 3) faraday (>= 1, < 3)
sawyer (~> 0.9) sawyer (~> 0.9)
@ -1641,7 +1641,7 @@ GEM
mime-types (>= 1.16, < 4.0) mime-types (>= 1.16, < 4.0)
netrc (~> 0.8) netrc (~> 0.8)
retriable (3.1.2) retriable (3.1.2)
reverse_markdown (1.4.0) reverse_markdown (2.1.1)
nokogiri nokogiri
rexml (3.4.1) rexml (3.4.1)
rinku (2.0.0) rinku (2.0.0)
@ -1821,21 +1821,27 @@ GEM
hashie hashie
version_gem (~> 1.1) version_gem (~> 1.1)
snowplow-tracker (0.8.0) snowplow-tracker (0.8.0)
solargraph (0.47.2) solargraph (0.54.0)
backport (~> 1.2) backport (~> 1.2)
benchmark benchmark
bundler (>= 1.17.2) bundler (~> 2.0)
diff-lcs (~> 1.4) diff-lcs (~> 1.4)
e2mmap jaro_winkler (~> 1.6)
jaro_winkler (~> 1.5)
kramdown (~> 2.3) kramdown (~> 2.3)
kramdown-parser-gfm (~> 1.1) kramdown-parser-gfm (~> 1.1)
logger (~> 1.6)
observer (~> 0.1)
ostruct (~> 0.6)
parser (~> 3.0) parser (~> 3.0)
reverse_markdown (>= 1.0.5, < 3) rbs (~> 3.3)
rubocop (>= 0.52) reverse_markdown (>= 2.0, < 4)
rubocop (~> 1.38)
thor (~> 1.0) thor (~> 1.0)
tilt (~> 2.0) tilt (~> 2.0)
yard (~> 0.9, >= 0.9.24) yard (~> 0.9, >= 0.9.24)
yard-solargraph (~> 0.1)
solargraph-rspec (0.5.1)
solargraph (~> 0.52, >= 0.52.0)
sorbet-runtime (0.5.11647) sorbet-runtime (0.5.11647)
spamcheck (1.3.3) spamcheck (1.3.3)
grpc (~> 1.63) grpc (~> 1.63)
@ -2034,6 +2040,8 @@ GEM
nokogiri (~> 1.8) nokogiri (~> 1.8)
yajl-ruby (1.4.3) yajl-ruby (1.4.3)
yard (0.9.37) yard (0.9.37)
yard-solargraph (0.1.0)
yard (~> 0.9)
zeitwerk (2.6.7) zeitwerk (2.6.7)
PLATFORMS PLATFORMS
@ -2365,7 +2373,8 @@ DEPENDENCIES
simplecov-lcov (~> 0.8.0) simplecov-lcov (~> 0.8.0)
slack-messenger (~> 2.3.5) slack-messenger (~> 2.3.5)
snowplow-tracker (~> 0.8.0) snowplow-tracker (~> 0.8.0)
solargraph (~> 0.47.2) solargraph (~> 0.54.0)
solargraph-rspec (~> 0.5.1)
spamcheck (~> 1.3.0) spamcheck (~> 1.3.0)
spring (~> 4.3.0) spring (~> 4.3.0)
spring-commands-rspec (~> 1.0.4) spring-commands-rspec (~> 1.0.4)

View File

@ -1,10 +1,8 @@
<script> <script>
import { GlIcon, GlTooltipDirective } from '@gitlab/ui'; import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
import { findAwardEmojiWidget } from '~/work_items/utils'; import { findAwardEmojiWidget, findDevelopmentWidget } from '~/work_items/utils';
import { i18n } from '../constants';
export default { export default {
i18n,
components: { components: {
GlIcon, GlIcon,
}, },
@ -18,6 +16,12 @@ export default {
}, },
}, },
computed: { computed: {
closingMergeRequestsCount() {
return (
this.issue.mergeRequestsCount ||
findDevelopmentWidget(this.issue)?.closingMergeRequests.count
);
},
downvotes() { downvotes() {
return this.issue.downvotes || findAwardEmojiWidget(this.issue)?.downvotes; return this.issue.downvotes || findAwardEmojiWidget(this.issue)?.downvotes;
}, },
@ -34,7 +38,7 @@ export default {
v-if="upvotes" v-if="upvotes"
v-gl-tooltip v-gl-tooltip
class="gl-hidden sm:gl-block" class="gl-hidden sm:gl-block"
:title="$options.i18n.upvotes" :title="__('Upvotes')"
data-testid="issuable-upvotes" data-testid="issuable-upvotes"
> >
<gl-icon name="thumb-up" /> <gl-icon name="thumb-up" />
@ -44,21 +48,21 @@ export default {
v-if="downvotes" v-if="downvotes"
v-gl-tooltip v-gl-tooltip
class="gl-hidden sm:gl-block" class="gl-hidden sm:gl-block"
:title="$options.i18n.downvotes" :title="__('Downvotes')"
data-testid="issuable-downvotes" data-testid="issuable-downvotes"
> >
<gl-icon name="thumb-down" /> <gl-icon name="thumb-down" />
{{ downvotes }} {{ downvotes }}
</li> </li>
<li <li
v-if="issue.mergeRequestsCount" v-if="closingMergeRequestsCount"
v-gl-tooltip v-gl-tooltip
class="gl-hidden sm:gl-block" class="gl-hidden sm:gl-block"
:title="__('Related merge requests')" :title="__('Related merge requests')"
data-testid="merge-requests" data-testid="merge-requests"
> >
<gl-icon name="merge-request" /> <gl-icon name="merge-request" />
{{ issue.mergeRequestsCount }} {{ closingMergeRequestsCount }}
</li> </li>
<slot></slot> <slot></slot>
</ul> </ul>

View File

@ -4,7 +4,11 @@ import { STATUS_CLOSED } from '~/issues/constants';
import { humanTimeframe, isInPast, localeDateFormat, newDate } from '~/lib/utils/datetime_utility'; import { humanTimeframe, isInPast, localeDateFormat, newDate } from '~/lib/utils/datetime_utility';
import { __ } from '~/locale'; import { __ } from '~/locale';
import { STATE_CLOSED } from '~/work_items/constants'; import { STATE_CLOSED } from '~/work_items/constants';
import { findMilestoneWidget, findStartAndDueDateWidget } from '~/work_items/utils'; import {
findMilestoneWidget,
findStartAndDueDateWidget,
findTimeTrackingWidget,
} from '~/work_items/utils';
import IssuableMilestone from '~/vue_shared/issuable/list/components/issuable_milestone.vue'; import IssuableMilestone from '~/vue_shared/issuable/list/components/issuable_milestone.vue';
import WorkItemAttribute from '~/vue_shared/components/work_item_attribute.vue'; import WorkItemAttribute from '~/vue_shared/components/work_item_attribute.vue';
@ -55,7 +59,11 @@ export default {
return findStartAndDueDateWidget(this.issue)?.startDate; return findStartAndDueDateWidget(this.issue)?.startDate;
}, },
timeEstimate() { timeEstimate() {
return this.issue.humanTimeEstimate || this.issue.timeStats?.humanTimeEstimate; return (
this.issue.humanTimeEstimate ||
this.issue.timeStats?.humanTimeEstimate ||
findTimeTrackingWidget(this.issue)?.humanReadableAttributes.timeEstimate
);
}, },
}, },
}; };

View File

@ -105,13 +105,11 @@ export const i18n = {
closedMoved: CLOSED_MOVED, closedMoved: CLOSED_MOVED,
confidentialNo: __('No'), confidentialNo: __('No'),
confidentialYes: __('Yes'), confidentialYes: __('Yes'),
downvotes: __('Downvotes'),
errorFetchingCounts: __('An error occurred while getting issue counts'), errorFetchingCounts: __('An error occurred while getting issue counts'),
errorFetchingIssues: __('An error occurred while loading issues'), errorFetchingIssues: __('An error occurred while loading issues'),
issueRepositioningMessage: __( issueRepositioningMessage: __(
'Issues are being rebalanced at the moment, so manual reordering is disabled.', 'Issues are being rebalanced at the moment, so manual reordering is disabled.',
), ),
upvotes: __('Upvotes'),
titles: __('Titles'), titles: __('Titles'),
descriptions: __('Descriptions'), descriptions: __('Descriptions'),
subscribedExplicitly: __('Explicitly subscribed'), subscribedExplicitly: __('Explicitly subscribed'),

View File

@ -239,7 +239,7 @@ export default {
</p> </p>
</div> </div>
<div class="gl-flex gl-items-center gl-gap-3" data-testid="crud-actions"> <div class="gl-flex gl-items-center gl-gap-3" data-testid="crud-actions">
<slot name="actions" :show-form="showForm"></slot> <slot name="actions" :show-form="showForm" :is-form-visible="isFormVisible"></slot>
<gl-button <gl-button
v-if="toggleText && !isFormUsedAndVisible" v-if="toggleText && !isFormUsedAndVisible"
size="small" size="small"

View File

@ -8,13 +8,13 @@ export default {
}; };
const data = () => ({ const data = () => ({
selected: ['option', 'option-two'], checked: ['option', 'option-two'],
}); });
const Template = () => ({ const Template = () => ({
components: { MultipleChoiceSelector, MultipleChoiceSelectorItem, GlBadge, GlIcon }, components: { MultipleChoiceSelector, MultipleChoiceSelectorItem, GlBadge, GlIcon },
data, data,
template: `<multiple-choice-selector :selected="selected"> template: `<multiple-choice-selector v-model="checked">
<multiple-choice-selector-item value="option" title="Option name" description="This is a description for this option. Descriptions are optional." :disabled="false"></multiple-choice-selector-item> <multiple-choice-selector-item value="option" title="Option name" description="This is a description for this option. Descriptions are optional." :disabled="false"></multiple-choice-selector-item>
<multiple-choice-selector-item value="option-two" title="Option name" description="This is a description for this option. Descriptions are optional." :disabled="false"></multiple-choice-selector-item> <multiple-choice-selector-item value="option-two" title="Option name" description="This is a description for this option. Descriptions are optional." :disabled="false"></multiple-choice-selector-item>
<multiple-choice-selector-item value="option-3" description="This is a description for this option. Descriptions are optional." :disabled="false"> <multiple-choice-selector-item value="option-3" description="This is a description for this option. Descriptions are optional." :disabled="false">

View File

@ -2,25 +2,27 @@
import { GlFormCheckboxGroup } from '@gitlab/ui'; import { GlFormCheckboxGroup } from '@gitlab/ui';
export default { export default {
name: 'MultipleChoiceSelector',
components: { GlFormCheckboxGroup }, components: { GlFormCheckboxGroup },
props: { model: {
selected: { prop: 'checked',
type: Array, event: 'input',
required: true,
},
}, },
data() { props: {
return { checked: {
selectedOptions: this.selected, type: Array,
}; required: false,
default: () => [],
},
}, },
}; };
</script> </script>
<template> <template>
<gl-form-checkbox-group <gl-form-checkbox-group
v-model="selectedOptions" :checked="checked"
class="multiple-choice-selector gl-border gl-block gl-rounded-base" class="multiple-choice-selector gl-border gl-block gl-rounded-base"
@input="$emit('input', $event)"
> >
<slot></slot> <slot></slot>
</gl-form-checkbox-group> </gl-form-checkbox-group>

View File

@ -403,6 +403,7 @@ export default {
<gl-icon <gl-icon
v-if="issuable.hidden" v-if="issuable.hidden"
v-gl-tooltip v-gl-tooltip
class="gl-mr-2"
name="spam" name="spam"
:title="hiddenIssuableTitle" :title="hiddenIssuableTitle"
:aria-label="__('Hidden')" :aria-label="__('Hidden')"

View File

@ -1,6 +1,5 @@
fragment BaseWorkItemWidgets on WorkItemWidget { fragment BaseWorkItemWidgets on WorkItemWidget {
... on WorkItemWidgetAssignees { ... on WorkItemWidgetAssignees {
type
assignees { assignees {
nodes { nodes {
id id
@ -12,8 +11,16 @@ fragment BaseWorkItemWidgets on WorkItemWidget {
} }
} }
} }
... on WorkItemWidgetAwardEmoji {
upvotes
downvotes
}
... on WorkItemWidgetDevelopment {
closingMergeRequests {
count
}
}
... on WorkItemWidgetLabels { ... on WorkItemWidgetLabels {
type
allowsScopedLabels allowsScopedLabels
labels { labels {
nodes { nodes {
@ -25,7 +32,6 @@ fragment BaseWorkItemWidgets on WorkItemWidget {
} }
} }
... on WorkItemWidgetMilestone { ... on WorkItemWidgetMilestone {
type
milestone { milestone {
id id
dueDate dueDate
@ -35,13 +41,12 @@ fragment BaseWorkItemWidgets on WorkItemWidget {
} }
} }
... on WorkItemWidgetStartAndDueDate { ... on WorkItemWidgetStartAndDueDate {
type
dueDate dueDate
startDate startDate
} }
... on WorkItemWidgetAwardEmoji { ... on WorkItemWidgetTimeTracking {
type humanReadableAttributes {
upvotes timeEstimate
downvotes }
} }
} }

View File

@ -75,6 +75,7 @@ query getWorkItems(
} }
nodes { nodes {
id id
iid
author { author {
id id
avatarUrl avatarUrl
@ -84,10 +85,9 @@ query getWorkItems(
webPath webPath
} }
closedAt closedAt
userDiscussionsCount
confidential confidential
createdAt createdAt
iid hidden
namespace { namespace {
id id
fullPath fullPath
@ -96,6 +96,7 @@ query getWorkItems(
state state
title title
updatedAt updatedAt
userDiscussionsCount
webUrl webUrl
widgets { widgets {
type type
@ -146,6 +147,7 @@ query getWorkItems(
} }
nodes { nodes {
id id
iid
author { author {
id id
avatarUrl avatarUrl
@ -155,10 +157,9 @@ query getWorkItems(
webPath webPath
} }
closedAt closedAt
userDiscussionsCount
confidential confidential
createdAt createdAt
iid hidden
namespace { namespace {
id id
fullPath fullPath
@ -167,6 +168,7 @@ query getWorkItems(
state state
title title
updatedAt updatedAt
userDiscussionsCount
webUrl webUrl
widgets { widgets {
type type

View File

@ -31,6 +31,7 @@ import {
DEFAULT_PAGE_SIZE_CHILD_ITEMS, DEFAULT_PAGE_SIZE_CHILD_ITEMS,
STATE_CLOSED, STATE_CLOSED,
NAME_TO_ENUM_MAP, NAME_TO_ENUM_MAP,
WIDGET_TYPE_DEVELOPMENT,
} from './constants'; } from './constants';
export const isAssigneesWidget = (widget) => widget.type === WIDGET_TYPE_ASSIGNEES; export const isAssigneesWidget = (widget) => widget.type === WIDGET_TYPE_ASSIGNEES;
@ -51,6 +52,9 @@ export const findCurrentUserTodosWidget = (workItem) =>
export const findDescriptionWidget = (workItem) => export const findDescriptionWidget = (workItem) =>
workItem?.widgets?.find((widget) => widget.type === WIDGET_TYPE_DESCRIPTION); workItem?.widgets?.find((widget) => widget.type === WIDGET_TYPE_DESCRIPTION);
export const findDevelopmentWidget = (workItem) =>
workItem?.widgets?.find((widget) => widget.type === WIDGET_TYPE_DEVELOPMENT);
export const findDesignsWidget = (workItem) => export const findDesignsWidget = (workItem) =>
workItem?.widgets?.find((widget) => widget.type === WIDGET_TYPE_DESIGNS); workItem?.widgets?.find((widget) => widget.type === WIDGET_TYPE_DESIGNS);

View File

@ -37,6 +37,7 @@ module Admin
feature_category :pages, [:lets_encrypt_terms_of_service] feature_category :pages, [:lets_encrypt_terms_of_service]
feature_category :observability, [:reset_error_tracking_access_token] feature_category :observability, [:reset_error_tracking_access_token]
feature_category :global_search, [:search] feature_category :global_search, [:search]
feature_category :environment_management, [:usage_quotas]
VALID_SETTING_PANELS = %w[general repository VALID_SETTING_PANELS = %w[general repository
ci_cd reporting metrics_and_profiling ci_cd reporting metrics_and_profiling

View File

@ -46,6 +46,10 @@ module Resolvers
Unauthenticated requests always return all public groups. The `owned_only` argument takes precedence. Unauthenticated requests always return all public groups. The `owned_only` argument takes precedence.
DESC DESC
argument :marked_for_deletion_on, ::Types::DateType,
required: false,
description: 'Date when the group was marked for deletion.'
private private
def resolve_groups(parent_path: nil, **args) def resolve_groups(parent_path: nil, **args)

View File

@ -7,8 +7,4 @@ module WikiPageVersionHelper
user = wiki_page_version.author user = wiki_page_version.author
user.nil? ? "mailto:#{wiki_page_version.author_email}" : Gitlab::UrlBuilder.build(user) user.nil? ? "mailto:#{wiki_page_version.author_email}" : Gitlab::UrlBuilder.build(user)
end end
def wiki_page_version_author_avatar(wiki_page_version)
image_tag(avatar_icon_for_email(wiki_page_version.author_email, 24), class: "avatar s24 float-none !gl-mr-0")
end
end end

View File

@ -5,26 +5,26 @@ module Namespaces
extend ActiveSupport::Concern extend ActiveSupport::Concern
def adjourned_deletion? def adjourned_deletion?
return false unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip) return false unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
adjourned_deletion_configured? adjourned_deletion_configured?
end end
def adjourned_deletion_configured? def adjourned_deletion_configured?
return false unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip) return false unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
return false if try(:personal?) return false if try(:personal?)
deletion_adjourned_period > 0 deletion_adjourned_period > 0
end end
def marked_for_deletion? def marked_for_deletion?
return false unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip) return false unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
marked_for_deletion_on.present? marked_for_deletion_on.present?
end end
def self_or_ancestor_marked_for_deletion def self_or_ancestor_marked_for_deletion
return unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip) return unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
return self if marked_for_deletion? return self if marked_for_deletion?
ancestors(hierarchy_order: :asc).joins(:deletion_schedule).first ancestors(hierarchy_order: :asc).joins(:deletion_schedule).first

View File

@ -45,7 +45,7 @@ module Groups # rubocop:disable Gitlab/BoundedContexts -- existing top-level mod
end end
def feature_downtiered? def feature_downtiered?
Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip) Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
end end
end end
end end

View File

@ -49,7 +49,7 @@ module Projects
end end
def feature_downtiered? def feature_downtiered?
Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip) Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
end end
end end
end end

View File

@ -1,3 +1,3 @@
- return unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip) - return unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
#js-admin-deletion-protection-settings{ data: deletion_protection_data } #js-admin-deletion-protection-settings{ data: deletion_protection_data }

View File

@ -0,0 +1 @@
= render 'admin/usage_quotas/index'

View File

@ -0,0 +1,7 @@
- content_for :usage_quotas_subtitle do
= s_('UsageQuota|Usage of shared resources across the projects in your instance')
- content_for :usage_quotas_tabs do
#js-pipeline-usage-app
= render 'shared/usage_quotas/index'

View File

@ -1,8 +0,0 @@
---
name: pipeline_subscriptions_vue
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/139405
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/434831
milestone: '16.7'
type: development
group: group::pipeline execution
default_enabled: false

View File

@ -2,8 +2,8 @@
name: downtier_delayed_deletion name: downtier_delayed_deletion
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/526403 feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/526403
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/185850 introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/185850
rollout_issue_url: rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/536634
milestone: '17.11' milestone: '17.11'
group: group::authorization group: group::authorization
type: wip type: gitlab_com_derisk
default_enabled: false default_enabled: false

View File

@ -168,7 +168,7 @@ namespace :admin do
put :reset_health_check_token put :reset_health_check_token
put :reset_error_tracking_access_token put :reset_error_tracking_access_token
put :clear_repository_check_states put :clear_repository_check_states
match :general, :integrations, :repository, :ci_cd, :reporting, :metrics_and_profiling, :network, :preferences, :search, via: [:get, :patch] match :general, :integrations, :repository, :ci_cd, :reporting, :metrics_and_profiling, :network, :preferences, :search, :usage_quotas, via: [:get, :patch]
get :lets_encrypt_terms_of_service get :lets_encrypt_terms_of_service
get :slack_app_manifest_download, format: :json get :slack_app_manifest_download, format: :json
get :slack_app_manifest_share get :slack_app_manifest_share

View File

@ -1055,17 +1055,17 @@ paths:
description: Only include top-level groups description: Only include top-level groups
type: boolean type: boolean
required: false required: false
- in: query
name: marked_for_deletion_on
description: Return groups that are marked for deletion on this date
type: string
format: date
required: false
- in: query - in: query
name: repository_storage name: repository_storage
description: Filter by repository storage used by the group description: Filter by repository storage used by the group
type: string type: string
required: false required: false
- in: query
name: marked_for_deletion_on
description: Date when the group was marked for deletion
type: string
format: date
required: false
- in: query - in: query
name: page name: page
description: Current page number description: Current page number
@ -1794,17 +1794,17 @@ paths:
description: Only include top-level groups description: Only include top-level groups
type: boolean type: boolean
required: false required: false
- in: query
name: marked_for_deletion_on
description: Return groups that are marked for deletion on this date
type: string
format: date
required: false
- in: query - in: query
name: repository_storage name: repository_storage
description: Filter by repository storage used by the group description: Filter by repository storage used by the group
type: string type: string
required: false required: false
- in: query
name: marked_for_deletion_on
description: Date when the group was marked for deletion
type: string
format: date
required: false
- in: query - in: query
name: page name: page
description: Current page number description: Current page number
@ -1931,17 +1931,17 @@ paths:
description: Only include top-level groups description: Only include top-level groups
type: boolean type: boolean
required: false required: false
- in: query
name: marked_for_deletion_on
description: Return groups that are marked for deletion on this date
type: string
format: date
required: false
- in: query - in: query
name: repository_storage name: repository_storage
description: Filter by repository storage used by the group description: Filter by repository storage used by the group
type: string type: string
required: false required: false
- in: query
name: marked_for_deletion_on
description: Date when the group was marked for deletion
type: string
format: date
required: false
- in: query - in: query
name: page name: page
description: Current page number description: Current page number

View File

@ -32,6 +32,7 @@ module API
optional :sort, type: String, values: %w[asc desc], default: 'asc', desc: 'Sort by asc (ascending) or desc (descending)' optional :sort, type: String, values: %w[asc desc], default: 'asc', desc: 'Sort by asc (ascending) or desc (descending)'
optional :min_access_level, type: Integer, values: Gitlab::Access.all_values, desc: 'Minimum access level of authenticated user' optional :min_access_level, type: Integer, values: Gitlab::Access.all_values, desc: 'Minimum access level of authenticated user'
optional :top_level_only, type: Boolean, desc: 'Only include top-level groups' optional :top_level_only, type: Boolean, desc: 'Only include top-level groups'
optional :marked_for_deletion_on, type: Date, desc: 'Return groups that are marked for deletion on this date'
use :optional_group_list_params_ee use :optional_group_list_params_ee
use :pagination use :pagination
end end
@ -60,7 +61,7 @@ module API
[:all_available, [:all_available,
:custom_attributes, :custom_attributes,
:owned, :min_access_level, :owned, :min_access_level,
:include_parent_descendants, :search, :visibility, :archived] :include_parent_descendants, :search, :visibility, :archived, :marked_for_deletion_on]
end end
# This is a separate method so that EE can extend its behaviour, without # This is a separate method so that EE can extend its behaviour, without

View File

@ -3681,9 +3681,6 @@ msgstr ""
msgid "Add new key" msgid "Add new key"
msgstr "" msgstr ""
msgid "Add new pipeline subscription"
msgstr ""
msgid "Add new pipeline trigger token" msgid "Add new pipeline trigger token"
msgstr "" msgstr ""
@ -20855,9 +20852,6 @@ msgstr ""
msgid "Delete source branch when merge request is accepted." msgid "Delete source branch when merge request is accepted."
msgstr "" msgstr ""
msgid "Delete subscription"
msgstr ""
msgid "Delete table" msgid "Delete table"
msgstr "" msgstr ""
@ -30802,6 +30796,9 @@ msgstr ""
msgid "Horizontal rule" msgid "Horizontal rule"
msgstr "" msgstr ""
msgid "Hosted runner usage"
msgstr ""
msgid "Hostname" msgid "Hostname"
msgstr "" msgstr ""
@ -40370,9 +40367,6 @@ msgstr ""
msgid "No project selected" msgid "No project selected"
msgstr "" msgstr ""
msgid "No project subscribes to the pipelines in this project."
msgstr ""
msgid "No projects" msgid "No projects"
msgstr "" msgstr ""
@ -44556,7 +44550,7 @@ msgstr ""
msgid "PipelineSubscriptions|Subscription for this project will be removed. Do you want to continue?" msgid "PipelineSubscriptions|Subscription for this project will be removed. Do you want to continue?"
msgstr "" msgstr ""
msgid "PipelineSubscriptions|Subscription successfully added." msgid "PipelineSubscriptions|Subscription successfully created."
msgstr "" msgstr ""
msgid "PipelineSubscriptions|Subscription successfully deleted." msgid "PipelineSubscriptions|Subscription successfully deleted."
@ -58932,9 +58926,6 @@ msgstr ""
msgid "Subscribed to notifications." msgid "Subscribed to notifications."
msgstr "" msgstr ""
msgid "Subscribed to this project"
msgstr ""
msgid "Subscribes to notifications." msgid "Subscribes to notifications."
msgstr "" msgstr ""
@ -58950,9 +58941,6 @@ msgstr ""
msgid "Subscription deletion failed." msgid "Subscription deletion failed."
msgstr "" msgstr ""
msgid "Subscription for %{subscription} will be removed. Do you want to continue?"
msgstr ""
msgid "Subscription for this instance cannot be synchronized. Contact GitLab customer support to obtain a license." msgid "Subscription for this instance cannot be synchronized. Contact GitLab customer support to obtain a license."
msgstr "" msgstr ""
@ -61990,9 +61978,6 @@ msgstr ""
msgid "This project is mirrored from %{link}." msgid "This project is mirrored from %{link}."
msgstr "" msgstr ""
msgid "This project is not subscribed to any project pipelines."
msgstr ""
msgid "This project is pending deletion, and will be deleted on %{date}. Repository and other project resources are read-only." msgid "This project is pending deletion, and will be deleted on %{date}. Repository and other project resources are read-only."
msgstr "" msgstr ""
@ -64611,12 +64596,18 @@ msgstr ""
msgid "Usage" msgid "Usage"
msgstr "" msgstr ""
msgid "Usage Quotas"
msgstr ""
msgid "Usage breakdown" msgid "Usage breakdown"
msgstr "" msgstr ""
msgid "Usage statistics" msgid "Usage statistics"
msgstr "" msgstr ""
msgid "Usage this month"
msgstr ""
msgid "Usage trends" msgid "Usage trends"
msgstr "" msgstr ""
@ -64695,9 +64686,18 @@ msgstr ""
msgid "UsageQuota|Excess storage usage" msgid "UsageQuota|Excess storage usage"
msgstr "" msgstr ""
msgid "UsageQuota|Filter by runner"
msgstr ""
msgid "UsageQuota|Filter chart by year"
msgstr ""
msgid "UsageQuota|Filter charts by year" msgid "UsageQuota|Filter charts by year"
msgstr "" msgstr ""
msgid "UsageQuota|Filter list by month"
msgstr ""
msgid "UsageQuota|Filter projects data by month" msgid "UsageQuota|Filter projects data by month"
msgstr "" msgstr ""
@ -64713,6 +64713,12 @@ msgstr ""
msgid "UsageQuota|Group settings %{gt} Usage quotas" msgid "UsageQuota|Group settings %{gt} Usage quotas"
msgstr "" msgstr ""
msgid "UsageQuota|Hosted runner duration"
msgstr ""
msgid "UsageQuota|Hosted runner pipeline duration by month"
msgstr ""
msgid "UsageQuota|How are limits applied?" msgid "UsageQuota|How are limits applied?"
msgstr "" msgstr ""
@ -64746,6 +64752,9 @@ msgstr ""
msgid "UsageQuota|Month" msgid "UsageQuota|Month"
msgstr "" msgstr ""
msgid "UsageQuota|Namespace"
msgstr ""
msgid "UsageQuota|Namespace entities" msgid "UsageQuota|Namespace entities"
msgstr "" msgstr ""
@ -64800,12 +64809,18 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text." msgid "UsageQuota|Shared bits of code and text."
msgstr "" msgstr ""
msgid "UsageQuota|Something went wrong while fetching compute usage"
msgstr ""
msgid "UsageQuota|Something went wrong while fetching pipeline statistics" msgid "UsageQuota|Something went wrong while fetching pipeline statistics"
msgstr "" msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics" msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr "" msgstr ""
msgid "UsageQuota|Something went wrong while fetching runner filters"
msgstr ""
msgid "UsageQuota|Something went wrong while loading Usage Quotas Tabs." msgid "UsageQuota|Something went wrong while loading Usage Quotas Tabs."
msgstr "" msgstr ""
@ -64878,6 +64893,9 @@ msgstr ""
msgid "UsageQuota|Usage by month" msgid "UsageQuota|Usage by month"
msgstr "" msgstr ""
msgid "UsageQuota|Usage by namespace"
msgstr ""
msgid "UsageQuota|Usage by project" msgid "UsageQuota|Usage by project"
msgstr "" msgstr ""
@ -64890,6 +64908,9 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects" msgid "UsageQuota|Usage of resources across your projects"
msgstr "" msgstr ""
msgid "UsageQuota|Usage of shared resources across the projects in your instance"
msgstr ""
msgid "UsageQuota|User settings %{gt} Usage quotas" msgid "UsageQuota|User settings %{gt} Usage quotas"
msgstr "" msgstr ""
@ -72042,6 +72063,9 @@ msgstr ""
msgid "milestone should belong either to a project or a group." msgid "milestone should belong either to a project or a group."
msgstr "" msgstr ""
msgid "minutes"
msgstr ""
msgid "missing" msgid "missing"
msgstr "" msgstr ""

View File

@ -7,7 +7,7 @@
require 'parallel' require 'parallel'
require 'rainbow' require 'rainbow'
UNUSED_METHODS = 57 UNUSED_METHODS = 56
print_output = %w[true 1].include? ENV["REPORT_ALL_UNUSED_METHODS"] print_output = %w[true 1].include? ENV["REPORT_ALL_UNUSED_METHODS"]

View File

@ -1,6 +1,7 @@
import { GlIcon } from '@gitlab/ui'; import { GlIcon } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import IssueCardStatistics from '~/issues/list/components/issue_card_statistics.vue'; import IssueCardStatistics from '~/issues/list/components/issue_card_statistics.vue';
import { WIDGET_TYPE_AWARD_EMOJI, WIDGET_TYPE_DEVELOPMENT } from '~/work_items/constants';
describe('IssueCardStatistics CE component', () => { describe('IssueCardStatistics CE component', () => {
let wrapper; let wrapper;
@ -59,14 +60,18 @@ describe('IssueCardStatistics CE component', () => {
}); });
describe('with work item object', () => { describe('with work item object', () => {
it('renders upvotes and downvotes', () => { it('renders upvotes, downvotes, and closing merge requests', () => {
const issue = { const issue = {
widgets: [{ type: 'AWARD_EMOJI', downvotes: '4', upvotes: '8' }], widgets: [
{ type: WIDGET_TYPE_AWARD_EMOJI, downvotes: '4', upvotes: '8' },
{ type: WIDGET_TYPE_DEVELOPMENT, closingMergeRequests: { count: 3 } },
],
}; };
mountComponent(issue); mountComponent(issue);
expect(findDownvotes().text()).toBe('4'); expect(findDownvotes().text()).toBe('4');
expect(findUpvotes().text()).toBe('8'); expect(findUpvotes().text()).toBe('8');
expect(findMergeRequests().text()).toBe('3');
}); });
}); });
}); });

View File

@ -1,18 +1,25 @@
import { GlIcon } from '@gitlab/ui'; import { GlIcon } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { useFakeDate } from 'helpers/fake_date';
import { STATUS_CLOSED } from '~/issues/constants'; import { STATUS_CLOSED } from '~/issues/constants';
import IssueCardTimeInfo from '~/issues/list/components/issue_card_time_info.vue'; import IssueCardTimeInfo from '~/issues/list/components/issue_card_time_info.vue';
import IssuableMilestone from '~/vue_shared/issuable/list/components/issuable_milestone.vue'; import IssuableMilestone from '~/vue_shared/issuable/list/components/issuable_milestone.vue';
import { WIDGET_TYPE_MILESTONE, WIDGET_TYPE_START_AND_DUE_DATE } from '~/work_items/constants'; import {
WIDGET_TYPE_MILESTONE,
WIDGET_TYPE_START_AND_DUE_DATE,
WIDGET_TYPE_TIME_TRACKING,
} from '~/work_items/constants';
import WorkItemAttribute from '~/vue_shared/components/work_item_attribute.vue'; import WorkItemAttribute from '~/vue_shared/components/work_item_attribute.vue';
describe('CE IssueCardTimeInfo component', () => { describe('CE IssueCardTimeInfo component', () => {
useFakeDate(2020, 11, 11); // 2020 Dec 11
let wrapper; let wrapper;
const issueObject = ({ milestoneStartDate, milestoneDueDate, dueDate, state } = {}) => ({ const issueObject = ({
milestoneStartDate,
milestoneDueDate,
dueDate,
state,
timeEstimate,
} = {}) => ({
milestone: { milestone: {
dueDate: milestoneDueDate, dueDate: milestoneDueDate,
startDate: milestoneStartDate, startDate: milestoneStartDate,
@ -20,7 +27,7 @@ describe('CE IssueCardTimeInfo component', () => {
webPath: '/milestone/webPath', webPath: '/milestone/webPath',
}, },
dueDate, dueDate,
humanTimeEstimate: '1w', humanTimeEstimate: timeEstimate,
state, state,
}); });
@ -30,6 +37,7 @@ describe('CE IssueCardTimeInfo component', () => {
startDate, startDate,
dueDate, dueDate,
state, state,
timeEstimate,
} = {}) => ({ } = {}) => ({
state, state,
widgets: [ widgets: [
@ -47,6 +55,12 @@ describe('CE IssueCardTimeInfo component', () => {
dueDate, dueDate,
startDate, startDate,
}, },
{
type: WIDGET_TYPE_TIME_TRACKING,
humanReadableAttributes: {
timeEstimate,
},
},
], ],
}); });
@ -93,7 +107,7 @@ describe('CE IssueCardTimeInfo component', () => {
describe('when in the past', () => { describe('when in the past', () => {
describe('when issue is open', () => { describe('when issue is open', () => {
it('renders in red with overdue icon', () => { it('renders in red with overdue icon', () => {
wrapper = mountComponent({ issue: object({ dueDate: '2020-10-10' }) }); wrapper = mountComponent({ issue: object({ dueDate: '2020-01-01' }) });
expect(findDueDateIcon().props()).toMatchObject({ expect(findDueDateIcon().props()).toMatchObject({
variant: 'danger', variant: 'danger',
name: 'calendar-overdue', name: 'calendar-overdue',
@ -104,7 +118,7 @@ describe('CE IssueCardTimeInfo component', () => {
describe('when issue is closed', () => { describe('when issue is closed', () => {
it('does not render in red with overdue icon', () => { it('does not render in red with overdue icon', () => {
wrapper = mountComponent({ wrapper = mountComponent({
issue: object({ dueDate: '2020-10-10', state: STATUS_CLOSED }), issue: object({ dueDate: '2020-01-01', state: STATUS_CLOSED }),
}); });
expect(findDueDateIcon().props()).toMatchObject({ expect(findDueDateIcon().props()).toMatchObject({
@ -137,14 +151,16 @@ describe('CE IssueCardTimeInfo component', () => {
}); });
}); });
}); });
});
it('renders time estimate', () => { describe('time estimate', () => {
wrapper = mountComponent(); it('renders time estimate', () => {
const timeEstimate = wrapper.findByTestId('time-estimate'); wrapper = mountComponent({ issue: object({ timeEstimate: '1w' }) });
const timeEstimate = wrapper.findByTestId('time-estimate');
expect(findWorkItemAttribute().props('title')).toBe('1w'); expect(findWorkItemAttribute().props('title')).toBe('1w');
expect(findWorkItemAttribute().props('tooltipText')).toBe('Estimate'); expect(findWorkItemAttribute().props('tooltipText')).toBe('Estimate');
expect(timeEstimate.findComponent(GlIcon).props('name')).toBe('timer'); expect(timeEstimate.findComponent(GlIcon).props('name')).toBe('timer');
});
});
}); });
}); });

View File

@ -5,16 +5,12 @@ import MultipleChoiceSelector from '~/vue_shared/components/multiple_choice_sele
describe('MultipleChoiceSelector', () => { describe('MultipleChoiceSelector', () => {
let wrapper; let wrapper;
const defaultPropsData = { function createComponent({ props, ...options } = {}) {
selected: ['option'],
};
function createComponent({ propsData = {} } = {}) {
wrapper = shallowMount(MultipleChoiceSelector, { wrapper = shallowMount(MultipleChoiceSelector, {
propsData: { propsData: {
...defaultPropsData, ...props,
...propsData,
}, },
...options,
}); });
} }
@ -25,4 +21,34 @@ describe('MultipleChoiceSelector', () => {
expect(findCheckboxGroup().exists()).toBe(true); expect(findCheckboxGroup().exists()).toBe(true);
}); });
it('checks options', () => {
createComponent({
props: {
checked: ['my-option', 'my-option-2'],
},
});
expect(findCheckboxGroup().attributes('checked')).toEqual('my-option,my-option-2');
});
it('emits checked options', () => {
createComponent();
findCheckboxGroup().vm.$emit('input', ['my-option-2']);
expect(wrapper.emitted()).toEqual({
input: [[['my-option-2']]],
});
});
it('renders slot', () => {
createComponent({
slots: {
default: 'content',
},
});
expect(wrapper.html()).toContain('content');
});
}); });

View File

@ -5403,6 +5403,7 @@ export const groupWorkItemsQueryResponse = {
closedAt: '', closedAt: '',
confidential: true, confidential: true,
createdAt: '2020-01-23T12:34:56Z', createdAt: '2020-01-23T12:34:56Z',
hidden: true,
namespace: { namespace: {
id: 'full-path-epic-id', id: 'full-path-epic-id',
fullPath: 'full-path', fullPath: 'full-path',
@ -5457,6 +5458,7 @@ export const groupWorkItemsQueryResponse = {
closedAt: '', closedAt: '',
confidential: true, confidential: true,
createdAt: '2020-01-23T12:34:56Z', createdAt: '2020-01-23T12:34:56Z',
hidden: true,
namespace: { namespace: {
id: 'full-path-epic-id', id: 'full-path-epic-id',
fullPath: 'full-path', fullPath: 'full-path',

View File

@ -130,5 +130,24 @@ RSpec.describe Resolvers::GroupsResolver, feature_category: :groups_and_projects
end end
end end
end end
context 'with marked_for_deletion_on filter', :freeze_time do
let_it_be(:marked_for_deletion_on) { Date.yesterday }
let_it_be(:group_marked_for_deletion) do
create(:group_with_deletion_schedule, marked_for_deletion_on: marked_for_deletion_on, owners: user)
end
context 'when a group has been marked for deletion on the given date' do
let(:params) { { marked_for_deletion_on: marked_for_deletion_on } }
it { is_expected.to contain_exactly(group_marked_for_deletion) }
end
context 'when no groups have been marked for deletion on the given date' do
let(:params) { { marked_for_deletion_on: (marked_for_deletion_on - 2.days) } }
it { is_expected.to be_empty }
end
end
end end
end end

View File

@ -29,18 +29,4 @@ RSpec.describe WikiPageVersionHelper, feature_category: :wiki do
end end
end end
end end
describe '#wiki_page_version_author_avatar' do
let(:commit) { commit_with_user }
subject { helper.wiki_page_version_author_avatar(wiki_page_version) }
it 'returns the user avatar', :aggregate_failures do
avatar = Nokogiri::HTML.parse(subject)
expect(avatar.css('img')[0].attr('class')).to eq('avatar s24 float-none !gl-mr-0 lazy')
expect(avatar.css('img')[0].attr('data-src')).not_to be_empty
expect(avatar.css('img')[0].attr('src')).not_to be_empty
end
end
end end

View File

@ -1018,6 +1018,31 @@ RSpec.describe API::Groups, :with_current_organization, feature_category: :group
end end
end end
end end
context 'when using the marked_for_deletion_on filter' do
let_it_be(:group_with_deletion_on) { create(:group_with_deletion_schedule, name: "group_with_deletion_on", marked_for_deletion_on: Date.parse('2024-01-01'), owners: user1) }
let_it_be(:group_without_deletion) { create(:group, name: "group_without_deletion", owners: user1) }
let(:response_groups) { json_response.map { |group| group['id'] } }
it 'returns groups marked for deletion on the specified date' do
get api("/groups", user1), params: { marked_for_deletion_on: Date.parse('2024-01-01') }
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
expect(response_groups).to contain_exactly(group_with_deletion_on.id)
expect(json_response.map { |group| group["marked_for_deletion_on"] }).to contain_exactly(Date.parse('2024-01-01').iso8601)
end
it 'returns all groups when marked_for_deletion_on is not specified' do
get api("/groups", user1)
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
expect(response_groups).to contain_exactly(group1.id, group_with_deletion_on.id, group_without_deletion.id)
end
end
end end
describe 'PUT /groups/:id' do describe 'PUT /groups/:id' do

View File

@ -667,7 +667,6 @@
- './ee/spec/helpers/ee/labels_helper_spec.rb' - './ee/spec/helpers/ee/labels_helper_spec.rb'
- './ee/spec/helpers/ee/lock_helper_spec.rb' - './ee/spec/helpers/ee/lock_helper_spec.rb'
- './ee/spec/helpers/ee/namespaces_helper_spec.rb' - './ee/spec/helpers/ee/namespaces_helper_spec.rb'
- './ee/spec/helpers/ee/namespace_user_cap_reached_alert_helper_spec.rb'
- './ee/spec/helpers/ee/operations_helper_spec.rb' - './ee/spec/helpers/ee/operations_helper_spec.rb'
- './ee/spec/helpers/ee/personal_access_tokens_helper_spec.rb' - './ee/spec/helpers/ee/personal_access_tokens_helper_spec.rb'
- './ee/spec/helpers/ee/profiles_helper_spec.rb' - './ee/spec/helpers/ee/profiles_helper_spec.rb'
@ -2311,7 +2310,6 @@
- './ee/spec/views/projects/security/policies/index.html.haml_spec.rb' - './ee/spec/views/projects/security/policies/index.html.haml_spec.rb'
- './ee/spec/views/projects/security/sast_configuration/show.html.haml_spec.rb' - './ee/spec/views/projects/security/sast_configuration/show.html.haml_spec.rb'
- './ee/spec/views/projects/settings/merge_requests/_merge_request_status_checks_settings.html.haml_spec.rb' - './ee/spec/views/projects/settings/merge_requests/_merge_request_status_checks_settings.html.haml_spec.rb'
- './ee/spec/views/projects/settings/subscriptions/_index.html.haml_spec.rb'
- './ee/spec/views/registrations/groups/new.html.haml_spec.rb' - './ee/spec/views/registrations/groups/new.html.haml_spec.rb'
- './ee/spec/views/shared/billings/_billing_plan_actions.html.haml_spec.rb' - './ee/spec/views/shared/billings/_billing_plan_actions.html.haml_spec.rb'
- './ee/spec/views/shared/billings/_billing_plan.html.haml_spec.rb' - './ee/spec/views/shared/billings/_billing_plan.html.haml_spec.rb'

View File

@ -100,6 +100,7 @@ RSpec.describe Tooling::Danger::FeatureFlag, feature_category: :tooling do
let(:yaml) do let(:yaml) do
{ {
'name' => name, 'name' => name,
'description' => 'feature flag description',
'default_enabled' => default_enabled, 'default_enabled' => default_enabled,
'feature_issue_url' => feature_issue_url, 'feature_issue_url' => feature_issue_url,
'rollout_issue_url' => rollout_issue_url, 'rollout_issue_url' => rollout_issue_url,

View File

@ -20,6 +20,7 @@ module Tooling
:path, :path,
:lines, :lines,
:name, :name,
:description,
:feature_issue_url, :feature_issue_url,
:introduced_by_url, :introduced_by_url,
:rollout_issue_url, :rollout_issue_url,