diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION
index 77ca19723f5..58221198648 100644
--- a/GITLAB_KAS_VERSION
+++ b/GITLAB_KAS_VERSION
@@ -1 +1 @@
-2f4d621924f60a44b1367f4a7d3bc4a1a9292cce
+d640111e807a3551540e72a1b79b381f33b9105b
diff --git a/Gemfile.checksum b/Gemfile.checksum
index df0f973df85..a76298177c6 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -587,7 +587,7 @@
{"name":"rest-client","version":"2.1.0","platform":"x86-mswin32","checksum":"a35a3bb8d16ca39d110a946a2c805267f98ce07a0ae890e4512a45eadea47a6e"},
{"name":"retriable","version":"3.1.2","platform":"ruby","checksum":"0a5a5d0ca4ba61a76fb31a17ab8f7f80281beb040c329d34dfc137a1398688e0"},
{"name":"reverse_markdown","version":"1.4.0","platform":"ruby","checksum":"a3305da1509ac8388fa84a28745621113e121383402a2e8e9350ba649034e870"},
-{"name":"rexml","version":"3.3.2","platform":"ruby","checksum":"4513686f858d0ff2e5a412d734c8a192e16cb1df4cb2063f56b72a8ad4c5257f"},
+{"name":"rexml","version":"3.3.8","platform":"ruby","checksum":"f68fd96345330a1062896d0d0401324b0dae0ee20f784791b0843db96b212167"},
{"name":"rinku","version":"2.0.0","platform":"ruby","checksum":"3e695aaf9f24baba3af45823b5c427b58a624582132f18482320e2737f9f8a85"},
{"name":"rotp","version":"6.3.0","platform":"ruby","checksum":"75d40087e65ed0d8022c33055a6306c1c400d1c12261932533b5d6cbcd868854"},
{"name":"rouge","version":"4.3.0","platform":"ruby","checksum":"9ee3d9ec53338e78c03fff0cbcd08881d80d69152349b046761e48ccf2de581c"},
@@ -699,8 +699,6 @@
{"name":"state_machines-activerecord","version":"0.8.0","platform":"ruby","checksum":"072fb701b8ab03de0608297f6c55dc34ed096e556fa8f77e556f3c461c71aab6"},
{"name":"strings","version":"0.2.1","platform":"ruby","checksum":"933293b3c95cf85b81eb44b3cf673e3087661ba739bbadfeadf442083158d6fb"},
{"name":"strings-ansi","version":"0.2.0","platform":"ruby","checksum":"90262d760ea4a94cc2ae8d58205277a343409c288cbe7c29416b1826bd511c88"},
-{"name":"strscan","version":"3.1.0","platform":"java","checksum":"8645aa76e017e21764c6df572d2d79fcc1672284014f5bdbd806278cdbcd11b0"},
-{"name":"strscan","version":"3.1.0","platform":"ruby","checksum":"01b8a81d214fbf7b5308c6fb51b5972bbfc4a6aa1f166fd3618ba97e0fcd5555"},
{"name":"swd","version":"2.0.3","platform":"ruby","checksum":"4cdbe2a4246c19f093fce22e967ec3ebdd4657d37673672e621bf0c7eb770655"},
{"name":"sync","version":"0.5.0","platform":"ruby","checksum":"668356cc07c59ac7ed9ecf34fec3929831f179c07adb1f3e1c3b7a1609a638fd"},
{"name":"sys-filesystem","version":"1.4.3","platform":"ruby","checksum":"390919de89822ad6d3ba3daf694d720be9d83ed95cdf7adf54d4573c98b17421"},
diff --git a/Gemfile.lock b/Gemfile.lock
index 3888a3574a1..4bec0c8babf 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1568,8 +1568,7 @@ GEM
retriable (3.1.2)
reverse_markdown (1.4.0)
nokogiri
- rexml (3.3.2)
- strscan
+ rexml (3.3.8)
rinku (2.0.0)
rotp (6.3.0)
rouge (4.3.0)
@@ -1792,7 +1791,6 @@ GEM
unicode-display_width (>= 1.5, < 3.0)
unicode_utils (~> 1.4)
strings-ansi (0.2.0)
- strscan (3.1.0)
swd (2.0.3)
activesupport (>= 3)
attr_required (>= 0.0.5)
diff --git a/Gemfile.next.checksum b/Gemfile.next.checksum
index 2f41e6455c1..0a4a89226bf 100644
--- a/Gemfile.next.checksum
+++ b/Gemfile.next.checksum
@@ -600,7 +600,7 @@
{"name":"rest-client","version":"2.1.0","platform":"x86-mswin32","checksum":"a35a3bb8d16ca39d110a946a2c805267f98ce07a0ae890e4512a45eadea47a6e"},
{"name":"retriable","version":"3.1.2","platform":"ruby","checksum":"0a5a5d0ca4ba61a76fb31a17ab8f7f80281beb040c329d34dfc137a1398688e0"},
{"name":"reverse_markdown","version":"1.4.0","platform":"ruby","checksum":"a3305da1509ac8388fa84a28745621113e121383402a2e8e9350ba649034e870"},
-{"name":"rexml","version":"3.3.2","platform":"ruby","checksum":"4513686f858d0ff2e5a412d734c8a192e16cb1df4cb2063f56b72a8ad4c5257f"},
+{"name":"rexml","version":"3.3.8","platform":"ruby","checksum":"f68fd96345330a1062896d0d0401324b0dae0ee20f784791b0843db96b212167"},
{"name":"rinku","version":"2.0.0","platform":"ruby","checksum":"3e695aaf9f24baba3af45823b5c427b58a624582132f18482320e2737f9f8a85"},
{"name":"rotp","version":"6.3.0","platform":"ruby","checksum":"75d40087e65ed0d8022c33055a6306c1c400d1c12261932533b5d6cbcd868854"},
{"name":"rouge","version":"4.3.0","platform":"ruby","checksum":"9ee3d9ec53338e78c03fff0cbcd08881d80d69152349b046761e48ccf2de581c"},
@@ -714,8 +714,6 @@
{"name":"stringio","version":"3.1.1","platform":"ruby","checksum":"53456e14175c594e0e8eb2206a1be33f3974d4fe21c131e628908b05c8c2ae1e"},
{"name":"strings","version":"0.2.1","platform":"ruby","checksum":"933293b3c95cf85b81eb44b3cf673e3087661ba739bbadfeadf442083158d6fb"},
{"name":"strings-ansi","version":"0.2.0","platform":"ruby","checksum":"90262d760ea4a94cc2ae8d58205277a343409c288cbe7c29416b1826bd511c88"},
-{"name":"strscan","version":"3.1.0","platform":"java","checksum":"8645aa76e017e21764c6df572d2d79fcc1672284014f5bdbd806278cdbcd11b0"},
-{"name":"strscan","version":"3.1.0","platform":"ruby","checksum":"01b8a81d214fbf7b5308c6fb51b5972bbfc4a6aa1f166fd3618ba97e0fcd5555"},
{"name":"swd","version":"2.0.3","platform":"ruby","checksum":"4cdbe2a4246c19f093fce22e967ec3ebdd4657d37673672e621bf0c7eb770655"},
{"name":"sync","version":"0.5.0","platform":"ruby","checksum":"668356cc07c59ac7ed9ecf34fec3929831f179c07adb1f3e1c3b7a1609a638fd"},
{"name":"sys-filesystem","version":"1.4.3","platform":"ruby","checksum":"390919de89822ad6d3ba3daf694d720be9d83ed95cdf7adf54d4573c98b17421"},
diff --git a/Gemfile.next.lock b/Gemfile.next.lock
index 32a076b82bf..ad21cdea93e 100644
--- a/Gemfile.next.lock
+++ b/Gemfile.next.lock
@@ -1594,8 +1594,7 @@ GEM
retriable (3.1.2)
reverse_markdown (1.4.0)
nokogiri
- rexml (3.3.2)
- strscan
+ rexml (3.3.8)
rinku (2.0.0)
rotp (6.3.0)
rouge (4.3.0)
@@ -1819,7 +1818,6 @@ GEM
unicode-display_width (>= 1.5, < 3.0)
unicode_utils (~> 1.4)
strings-ansi (0.2.0)
- strscan (3.1.0)
swd (2.0.3)
activesupport (>= 3)
attr_required (>= 0.0.5)
diff --git a/app/assets/javascripts/content_editor/components/wrappers/code_block.vue b/app/assets/javascripts/content_editor/components/wrappers/code_block.vue
index 3193b8c830f..c160e113d8e 100644
--- a/app/assets/javascripts/content_editor/components/wrappers/code_block.vue
+++ b/app/assets/javascripts/content_editor/components/wrappers/code_block.vue
@@ -278,6 +278,7 @@ export default {
ref="nodeViewContent"
as="code"
class="gl-relative gl-z-1 !gl-break-words"
+ data-testid="suggestion-field"
/>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue b/app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue
index faca0afc50f..559ce97adf9 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue
@@ -394,17 +394,13 @@ export default {
:editable="!disabled"
:disable-attachments="disableAttachments"
:code-suggestions-config="codeSuggestionsConfig"
+ :data-testid="formFieldProps['data-testid'] || 'markdown-editor-form-field'"
@initialized="setEditorAsAutofocused"
@change="updateMarkdownFromContentEditor"
@keydown="onKeydown"
@enableMarkdownEditor="onEditingModeChange('markdownField')"
/>
-
+
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index 877fbd02b51..ade5160b5d2 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -1340,7 +1340,7 @@ The GitLab registry is what users use to store their own Docker images.
Because of that the Registry is client facing, meaning that we expose it directly
on the web server (or load balancers, LB for short).
-
+
The flow described by the diagram above:
diff --git a/gems/activerecord-gitlab/Gemfile.lock b/gems/activerecord-gitlab/Gemfile.lock
index 9ee91e06a0b..1099dd1fb2b 100644
--- a/gems/activerecord-gitlab/Gemfile.lock
+++ b/gems/activerecord-gitlab/Gemfile.lock
@@ -39,7 +39,7 @@ GEM
rack (3.0.8)
rainbow (3.1.1)
regexp_parser (2.8.1)
- rexml (3.2.5)
+ rexml (3.3.8)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
@@ -102,4 +102,4 @@ DEPENDENCIES
sqlite3 (~> 1.6)
BUNDLED WITH
- 2.4.14
+ 2.5.21
diff --git a/gems/click_house-client/Gemfile.lock b/gems/click_house-client/Gemfile.lock
index d9d672240d2..5c89079d224 100644
--- a/gems/click_house-client/Gemfile.lock
+++ b/gems/click_house-client/Gemfile.lock
@@ -41,7 +41,7 @@ GEM
rainbow (3.1.1)
rake (13.0.6)
regexp_parser (2.8.1)
- rexml (3.2.5)
+ rexml (3.3.8)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
@@ -103,4 +103,4 @@ DEPENDENCIES
rubocop-rspec
BUNDLED WITH
- 2.4.16
+ 2.5.21
diff --git a/gems/csv_builder/Gemfile.lock b/gems/csv_builder/Gemfile.lock
index 04992abc4d6..eeb22e02d23 100644
--- a/gems/csv_builder/Gemfile.lock
+++ b/gems/csv_builder/Gemfile.lock
@@ -37,7 +37,7 @@ GEM
rack (3.0.8)
rainbow (3.1.1)
regexp_parser (2.8.1)
- rexml (3.2.6)
+ rexml (3.3.8)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
@@ -97,4 +97,4 @@ DEPENDENCIES
rubocop-rspec (~> 2.22)
BUNDLED WITH
- 2.4.17
+ 2.5.21
diff --git a/gems/gitlab-backup-cli/Gemfile.lock b/gems/gitlab-backup-cli/Gemfile.lock
index a05c7d91ecd..f8ebc5a6de2 100644
--- a/gems/gitlab-backup-cli/Gemfile.lock
+++ b/gems/gitlab-backup-cli/Gemfile.lock
@@ -133,7 +133,7 @@ GEM
rainbow (3.1.1)
rake (13.2.1)
regexp_parser (2.9.2)
- rexml (3.3.7)
+ rexml (3.3.8)
rspec (3.13.0)
rspec-core (~> 3.13.0)
rspec-expectations (~> 3.13.0)
@@ -209,4 +209,4 @@ DEPENDENCIES
rubocop-rspec (~> 2.27.1)
BUNDLED WITH
- 2.5.18
+ 2.5.21
diff --git a/gems/gitlab-database-load_balancing/Gemfile.lock b/gems/gitlab-database-load_balancing/Gemfile.lock
index 73b153671d2..d430e86e0f1 100644
--- a/gems/gitlab-database-load_balancing/Gemfile.lock
+++ b/gems/gitlab-database-load_balancing/Gemfile.lock
@@ -205,7 +205,7 @@ GEM
regexp_parser (2.7.0)
request_store (1.5.1)
rack (>= 1.4)
- rexml (3.2.5)
+ rexml (3.3.8)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
@@ -300,4 +300,4 @@ DEPENDENCIES
rubocop-rspec (~> 2.22)
BUNDLED WITH
- 2.4.16
+ 2.5.21
diff --git a/gems/gitlab-database-lock_retries/Gemfile.lock b/gems/gitlab-database-lock_retries/Gemfile.lock
index 36618f6f5ae..1d3abf97bc1 100644
--- a/gems/gitlab-database-lock_retries/Gemfile.lock
+++ b/gems/gitlab-database-lock_retries/Gemfile.lock
@@ -43,7 +43,7 @@ GEM
rack (3.0.8)
rainbow (3.1.1)
regexp_parser (2.8.2)
- rexml (3.2.6)
+ rexml (3.3.8)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
@@ -102,4 +102,4 @@ DEPENDENCIES
rspec (~> 3.0)
BUNDLED WITH
- 2.4.22
+ 2.5.21
diff --git a/gems/gitlab-housekeeper/Gemfile.lock b/gems/gitlab-housekeeper/Gemfile.lock
index 292bfdd6eeb..fedfad0cd50 100644
--- a/gems/gitlab-housekeeper/Gemfile.lock
+++ b/gems/gitlab-housekeeper/Gemfile.lock
@@ -67,7 +67,7 @@ GEM
rainbow (3.1.1)
rake (13.1.0)
regexp_parser (2.8.3)
- rexml (3.2.6)
+ rexml (3.3.8)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
@@ -139,4 +139,4 @@ DEPENDENCIES
webmock
BUNDLED WITH
- 2.4.21
+ 2.5.21
diff --git a/gems/gitlab-http/Gemfile.lock b/gems/gitlab-http/Gemfile.lock
index 91cd6eca94f..f0aaf7c6b21 100644
--- a/gems/gitlab-http/Gemfile.lock
+++ b/gems/gitlab-http/Gemfile.lock
@@ -119,7 +119,7 @@ GEM
rainbow (3.1.1)
rake (13.0.6)
regexp_parser (2.8.1)
- rexml (3.2.5)
+ rexml (3.3.8)
rouge (4.3.0)
rspec (3.12.0)
rspec-core (~> 3.12.0)
@@ -214,4 +214,4 @@ DEPENDENCIES
webrick (~> 1.8)
BUNDLED WITH
- 2.4.14
+ 2.5.21
diff --git a/gems/gitlab-rspec/Gemfile.lock b/gems/gitlab-rspec/Gemfile.lock
index d375d858b01..f359420c4b8 100644
--- a/gems/gitlab-rspec/Gemfile.lock
+++ b/gems/gitlab-rspec/Gemfile.lock
@@ -94,7 +94,7 @@ GEM
rainbow (3.1.1)
rake (13.0.6)
regexp_parser (2.8.1)
- rexml (3.2.5)
+ rexml (3.3.8)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
@@ -185,4 +185,4 @@ DEPENDENCIES
rubocop-rspec (~> 2.22)
BUNDLED WITH
- 2.4.4
+ 2.5.21
diff --git a/gems/gitlab-rspec_flaky/Gemfile.lock b/gems/gitlab-rspec_flaky/Gemfile.lock
index 7b5817b91e4..6b540b10c78 100644
--- a/gems/gitlab-rspec_flaky/Gemfile.lock
+++ b/gems/gitlab-rspec_flaky/Gemfile.lock
@@ -67,7 +67,7 @@ GEM
rack (3.0.8)
rainbow (3.1.1)
regexp_parser (2.8.1)
- rexml (3.2.5)
+ rexml (3.3.8)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
@@ -143,4 +143,4 @@ DEPENDENCIES
rubocop-rspec (~> 2.22)
BUNDLED WITH
- 2.4.14
+ 2.5.21
diff --git a/gems/gitlab-safe_request_store/Gemfile.lock b/gems/gitlab-safe_request_store/Gemfile.lock
index d26bab2f4f0..1d391108299 100644
--- a/gems/gitlab-safe_request_store/Gemfile.lock
+++ b/gems/gitlab-safe_request_store/Gemfile.lock
@@ -41,7 +41,7 @@ GEM
regexp_parser (2.7.0)
request_store (1.5.1)
rack (>= 1.4)
- rexml (3.2.5)
+ rexml (3.3.8)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
@@ -101,4 +101,4 @@ DEPENDENCIES
rubocop-rspec (~> 2.22)
BUNDLED WITH
- 2.4.16
+ 2.5.21
diff --git a/gems/gitlab-schema-validation/Gemfile.lock b/gems/gitlab-schema-validation/Gemfile.lock
index 124e03422e9..8b2f39657f9 100644
--- a/gems/gitlab-schema-validation/Gemfile.lock
+++ b/gems/gitlab-schema-validation/Gemfile.lock
@@ -54,7 +54,7 @@ GEM
rack (3.0.8)
rainbow (3.1.1)
regexp_parser (2.8.1)
- rexml (3.2.5)
+ rexml (3.3.8)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
@@ -136,4 +136,4 @@ DEPENDENCIES
rubocop-rspec (~> 2.22)
BUNDLED WITH
- 2.4.14
+ 2.5.21
diff --git a/gems/gitlab-secret_detection/Gemfile.lock b/gems/gitlab-secret_detection/Gemfile.lock
index 029ad5d778e..7f2d1bc478e 100644
--- a/gems/gitlab-secret_detection/Gemfile.lock
+++ b/gems/gitlab-secret_detection/Gemfile.lock
@@ -62,7 +62,7 @@ GEM
re2 (2.4.3)
mini_portile2 (~> 2.8.5)
regexp_parser (2.8.2)
- rexml (3.2.6)
+ rexml (3.3.8)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
@@ -148,4 +148,4 @@ DEPENDENCIES
rubocop-rspec (~> 2.22)
BUNDLED WITH
- 2.4.22
+ 2.5.21
diff --git a/gems/gitlab-utils/Gemfile.lock b/gems/gitlab-utils/Gemfile.lock
index 76c6c1e2110..ad049978b13 100644
--- a/gems/gitlab-utils/Gemfile.lock
+++ b/gems/gitlab-utils/Gemfile.lock
@@ -108,7 +108,7 @@ GEM
rainbow (3.1.1)
rake (13.0.6)
regexp_parser (2.8.1)
- rexml (3.2.5)
+ rexml (3.3.8)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
@@ -201,4 +201,4 @@ DEPENDENCIES
rubocop-rspec (~> 2.22)
BUNDLED WITH
- 2.4.4
+ 2.5.21
diff --git a/gems/ipynbdiff/Gemfile.lock b/gems/ipynbdiff/Gemfile.lock
index 1d7f985ffe3..d924d895e62 100644
--- a/gems/ipynbdiff/Gemfile.lock
+++ b/gems/ipynbdiff/Gemfile.lock
@@ -53,7 +53,7 @@ GEM
rainbow (3.1.1)
rake (13.0.6)
regexp_parser (2.8.1)
- rexml (3.2.5)
+ rexml (3.3.8)
rspec (3.11.0)
rspec-core (~> 3.11.0)
rspec-expectations (~> 3.11.0)
@@ -136,4 +136,4 @@ DEPENDENCIES
simplecov (~> 0.22.0)
BUNDLED WITH
- 2.3.16
+ 2.5.21
diff --git a/gems/openbao_client/Gemfile.lock b/gems/openbao_client/Gemfile.lock
index 948090fcf95..4c23141171f 100644
--- a/gems/openbao_client/Gemfile.lock
+++ b/gems/openbao_client/Gemfile.lock
@@ -58,8 +58,7 @@ GEM
rack (3.1.7)
rainbow (3.1.1)
regexp_parser (2.9.2)
- rexml (3.3.2)
- strscan
+ rexml (3.3.8)
rspec (3.13.0)
rspec-core (~> 3.13.0)
rspec-expectations (~> 3.13.0)
@@ -105,7 +104,6 @@ GEM
rubocop-capybara (~> 2.17)
rubocop-factory_bot (~> 2.22)
ruby-progressbar (1.13.0)
- strscan (3.1.0)
typhoeus (1.4.1)
ethon (>= 0.9.0)
tzinfo (2.0.6)
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 45eaff0c789..07e6d676437 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -5665,6 +5665,9 @@ msgstr ""
msgid "All protected branches"
msgstr ""
+msgid "All required approvals given"
+msgstr ""
+
msgid "All required approvals must be given."
msgstr ""
diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock
index 2e2dbd779d1..4586f5c5d9e 100644
--- a/qa/Gemfile.lock
+++ b/qa/Gemfile.lock
@@ -266,8 +266,7 @@ GEM
mime-types (>= 1.16, < 4.0)
netrc (~> 0.8)
retriable (3.1.2)
- rexml (3.3.1)
- strscan
+ rexml (3.3.8)
rotp (6.3.0)
rspec (3.13.0)
rspec-core (~> 3.13.0)
@@ -317,7 +316,6 @@ GEM
jwt (>= 1.5, < 3.0)
multi_json (~> 1.10)
slack-notifier (2.4.0)
- strscan (3.1.0)
sync (0.5.0)
table_print (1.5.7)
terminal-table (3.0.2)
diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb
index 998cd969393..7f80a4730c1 100644
--- a/qa/qa/page/base.rb
+++ b/qa/qa/page/base.rb
@@ -276,6 +276,21 @@ module QA
find_element(name).set(content)
end
+ # fill in editor element, whether plain text or rich text
+ def fill_editor_element(name, content)
+ element = find_element name
+
+ if element.tag_name == 'textarea'
+ element.set content
+ else
+ mod = page.driver.browser.capabilities.platform_name.include?("mac") ? :command : :control
+ prosemirror = element.find '[contenteditable].ProseMirror'
+ prosemirror.send_keys [mod, 'a']
+ prosemirror.send_keys :delete
+ prosemirror.send_keys content
+ end
+ end
+
def select_element(name, value)
element = find_element(name)
diff --git a/qa/qa/page/component/design_management.rb b/qa/qa/page/component/design_management.rb
index a43c9f95ae4..d924e332503 100644
--- a/qa/qa/page/component/design_management.rb
+++ b/qa/qa/page/component/design_management.rb
@@ -47,7 +47,8 @@ module QA
def add_annotation(note)
click_element('design-image-button')
- fill_element('note-textarea', note)
+ fill_editor_element('note-textarea', note)
+ has_active_element?('save-comment-button', wait: 0.5)
click_element('save-comment-button')
# It takes a moment for the annotation to be saved.
diff --git a/qa/qa/page/component/dropzone.rb b/qa/qa/page/component/dropzone.rb
index 2efb96a02bc..bd7290b21ae 100644
--- a/qa/qa/page/component/dropzone.rb
+++ b/qa/qa/page/component/dropzone.rb
@@ -17,14 +17,24 @@ module QA
# instantiated on one page because there is no distinguishing
# attribute per dropzone file field.
def attach_file(attachment)
- filename = ::File.basename(attachment)
+ if QA::Page::Base.perform { |d| d.has_element?('content-editor', wait: 0.5) } # Rich text editor
+ filename = attachment.match(%r{([^/]+$)})[1]
+ page.find('[data-testid="file-upload-field"]', visible: 'false').set attachment
- field_style = { visibility: 'visible', height: '', width: '' }
- page.attach_file(attachment, class: 'dz-hidden-input', make_visible: field_style)
+ # Wait for link to be appended to dropzone text
+ page.wait_until(reload: false) do
+ page.find("#{container} img")['alt'].match?(filename)
+ end
+ else # Plain text editor
+ filename = ::File.basename(attachment)
- # Wait for link to be appended to dropzone text
- page.wait_until(reload: false) do
- page.find("#{container} textarea").value.match(filename)
+ field_style = { visibility: 'visible', height: '', width: '' }
+ page.attach_file(attachment, class: 'dz-hidden-input', make_visible: field_style)
+
+ # Wait for link to be appended to dropzone text
+ page.wait_until(reload: false) do
+ page.find("#{container} textarea").value.match(filename)
+ end
end
end
end
diff --git a/qa/qa/page/component/note.rb b/qa/qa/page/component/note.rb
index 89409c41802..8cba760edee 100644
--- a/qa/qa/page/component/note.rb
+++ b/qa/qa/page/component/note.rb
@@ -73,19 +73,21 @@ module QA
# Attachment option should be an absolute path
def comment(text, attachment: nil, filter: :all_activities)
method("select_#{filter}_filter").call
- fill_element 'comment-field', "#{text}\n"
+ fill_editor_element 'comment-field', "#{text}\n"
unless attachment.nil?
QA::Page::Component::Dropzone.new(self, '.new-note')
.attach_file(attachment)
end
+ has_active_element?('comment-button', wait: 0.5)
click_element 'comment-button'
end
def edit_comment(text)
click_element 'note-edit-button'
- fill_element 'reply-field', text
+ fill_editor_element 'reply-field', text
+ has_active_element?('reply-comment-button', wait: 0.5)
click_element 'reply-comment-button'
end
@@ -111,6 +113,7 @@ module QA
def reply_to_discussion(position, reply_text)
type_reply_to_discussion(position, reply_text)
+ has_active_element?('reply-comment-button', wait: 0.5)
click_element 'reply-comment-button'
end
@@ -145,7 +148,7 @@ module QA
end
def start_discussion(text)
- fill_element 'comment-field', text
+ fill_editor_element 'comment-field', text
within_element('comment-button') { click_button(class: 'gl-new-dropdown-toggle') }
click_element 'discussion-menu-item'
click_element 'comment-button'
@@ -159,7 +162,7 @@ module QA
def type_reply_to_discussion(position, reply_text)
all_elements('discussion-reply-tab', minimum: position)[position - 1].click
- fill_element 'reply-field', reply_text
+ fill_editor_element 'reply-field', reply_text
end
private
diff --git a/qa/qa/page/component/wiki_page_form.rb b/qa/qa/page/component/wiki_page_form.rb
index 3398086eee7..87f28550971 100644
--- a/qa/qa/page/component/wiki_page_form.rb
+++ b/qa/qa/page/component/wiki_page_form.rb
@@ -42,7 +42,7 @@ module QA
end
def set_content(content)
- fill_element('markdown-editor-form-field', content)
+ fill_editor_element('markdown-editor-form-field', content)
end
def set_message(message)
@@ -67,6 +67,8 @@ module QA
end
def use_new_editor
+ return if has_element?('content-editor')
+
click_element('editing-mode-switcher')
wait_until(reload: false) do
diff --git a/qa/qa/page/group/milestone/new.rb b/qa/qa/page/group/milestone/new.rb
index 50965769c9e..d83788b8abe 100644
--- a/qa/qa/page/group/milestone/new.rb
+++ b/qa/qa/page/group/milestone/new.rb
@@ -16,7 +16,7 @@ module QA
end
def set_description(description)
- fill_element('milestone-description-field', description)
+ fill_editor_element('milestone-description-field', description)
end
def set_title(title)
diff --git a/qa/qa/page/issuable/new.rb b/qa/qa/page/issuable/new.rb
index d5b41e0399f..6bdd9d05abc 100644
--- a/qa/qa/page/issuable/new.rb
+++ b/qa/qa/page/issuable/new.rb
@@ -37,7 +37,7 @@ module QA
end
def fill_description(description)
- fill_element('issuable-form-description-field', description)
+ fill_editor_element('issuable-form-description-field', description)
end
def choose_milestone(milestone)
diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb
index bb82d624952..dee0ba2e824 100644
--- a/qa/qa/page/merge_request/show.rb
+++ b/qa/qa/page/merge_request/show.rb
@@ -103,6 +103,10 @@ module QA
element 'artifacts-dropdown'
end
+ view 'app/assets/javascripts/content_editor/components/formatting_toolbar.vue' do
+ element 'code-suggestion'
+ end
+
view 'app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue' do
element 'apply-suggestion-dropdown'
element 'commit-message-field'
@@ -149,6 +153,7 @@ module QA
end
def start_review
+ has_active_element?('start-review-button', wait: 0.5)
click_element('start-review-button')
# After clicking the button, wait for it to disappear
@@ -198,7 +203,7 @@ module QA
click_element('dismiss-suggestion-popover-button') if has_element?('dismiss-suggestion-popover-button',
wait: 1)
- fill_element('reply-field', text)
+ fill_editor_element('reply-field', text)
end
def click_discussions_tab
@@ -445,10 +450,20 @@ module QA
def add_suggestion_to_diff(suggestion, line)
find("a[data-linenumber='#{line}']").hover
click_element('left-comment-button')
- click_element('suggestion-button')
- initial_content = find_element('reply-field').value
- fill_element('reply-field', '')
- fill_element('reply-field', initial_content.gsub(/(```suggestion:-0\+0\n).*(\n```)/, "\\1#{suggestion}\\2"))
+
+ if has_element?('suggestion-button', wait: 0.5)
+ click_element('suggestion-button')
+ initial_content = find_element('reply-field').value
+ fill_editor_element('reply-field', '')
+ fill_editor_element('reply-field',
+ initial_content.gsub(/(```suggestion:-0\+0\n).*(\n```)/, "\\1#{suggestion}\\2"))
+ else
+ click_element('code-suggestion')
+ suggestion_field = find_element('suggestion-field')
+ suggestion_field.set(suggestion)
+ has_active_element?('comment-now-button', wait: 0.5)
+ end
+
click_element('comment-now-button')
wait_for_requests
end
diff --git a/qa/qa/page/project/milestone/new.rb b/qa/qa/page/project/milestone/new.rb
index a14e1e6b071..92b715fd847 100644
--- a/qa/qa/page/project/milestone/new.rb
+++ b/qa/qa/page/project/milestone/new.rb
@@ -20,7 +20,7 @@ module QA
end
def set_description(description)
- fill_element('milestone-description-field', description)
+ fill_editor_element('milestone-description-field', description)
end
end
end