diff --git a/app/assets/javascripts/vue_merge_request_widget/components/checks/constants.js b/app/assets/javascripts/vue_merge_request_widget/components/checks/constants.js
index 5ef64aa7c005b29d1d0cde9ad0eda6af0602375c..6bf25edc3d30cffb8579097b0a22f4a6062ff196 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/checks/constants.js
+++ b/app/assets/javascripts/vue_merge_request_widget/components/checks/constants.js
@@ -6,6 +6,7 @@ export const COMPONENTS = {
draft_status: () => import('./draft.vue'),
merge_time: () => import('./merge_time.vue'),
need_rebase: () => import('./rebase.vue'),
+ title_regex: () => import('./title_regex.vue'),
default: () => import('./message.vue'),
requested_changes: () =>
import('ee_component/vue_merge_request_widget/components/checks/requested_changes.vue'),
@@ -39,7 +40,7 @@ export const FAILURE_REASONS = {
locked_lfs_files: __('All LFS files must be unlocked.'),
security_policy_violations: __('All policy rules must be satisfied.'),
merge_time: __('Cannot merge until this date and time.'),
- title_regex: __('The title must match the required regex.'),
+ title_regex: __('Merge request title must match expected format.'),
};
export const ICON_NAMES = Object.freeze({
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue b/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue
new file mode 100644
index 0000000000000000000000000000000000000000..70f3e2397b50fc65c75cac087f200cb8cd66dd73
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index e2ea2447d0023a1b068f1983788d98d0a168fda2..00a377d2d373ed6ec34eed2468863ad8bbf65656 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -38373,6 +38373,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request title must match expected format."
+msgstr ""
+
msgid "Merge request was set to auto-merge"
msgstr ""
@@ -62185,9 +62188,6 @@ msgstr ""
msgid "The time period in seconds that the maximum requests per project limit applies to."
msgstr ""
-msgid "The title must match the required regex."
-msgstr ""
-
msgid "The update action will time out after %{number_of_minutes} minutes. For big repositories, use a clone/push combination."
msgstr ""
@@ -73729,6 +73729,9 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Edit merge request"
+msgstr ""
+
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
diff --git a/spec/frontend/vue_merge_request_widget/components/checks/message_spec.js b/spec/frontend/vue_merge_request_widget/components/checks/message_spec.js
index 85e241449121bec539050c03deb733729d448bc1..87f2f69422a23d2103790df8cddef6657137e5af 100644
--- a/spec/frontend/vue_merge_request_widget/components/checks/message_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/checks/message_spec.js
@@ -29,7 +29,7 @@ describe('Merge request merge checks message component', () => {
${'locked_paths'} | ${'All paths must be unlocked'}
${'locked_lfs_files'} | ${'All LFS files must be unlocked.'}
${'security_policy_violations'} | ${'All policy rules must be satisfied.'}
- ${'title_regex'} | ${'The title must match the required regex.'}
+ ${'title_regex'} | ${'Merge request title must match expected format.'}
`('renders failure reason text', ({ identifier, expectedText }) => {
factory({ check: { status: 'success', identifier } });
diff --git a/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js b/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..77def46c4f7b1eb77c7aa02c5aa25fd64e9ebff2
--- /dev/null
+++ b/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js
@@ -0,0 +1,40 @@
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import MergeChecksTitleRegex from '~/vue_merge_request_widget/components/checks/title_regex.vue';
+import MergeChecksMessage from '~/vue_merge_request_widget/components/checks/message.vue';
+
+describe('MergeChecksTitleRegex component', () => {
+ let wrapper;
+
+ function createComponent(
+ propsData = {
+ check: {
+ status: 'FAILED',
+ identifier: 'title_regex',
+ },
+ },
+ ) {
+ wrapper = mountExtended(MergeChecksTitleRegex, {
+ propsData,
+ });
+ }
+
+ it('passes check down to the MergeChecksMessage', () => {
+ const check = {
+ status: 'failed',
+ identifier: 'title_regex',
+ };
+ createComponent({ check });
+
+ expect(wrapper.findComponent(MergeChecksMessage).props('check')).toEqual(check);
+ });
+
+ it('has a link to the edit page', () => {
+ const editPath = `${document.location.pathname.replace(/\/$/, '')}/edit`;
+
+ createComponent();
+
+ const editLink = wrapper.findByTestId('extension-actions-button');
+
+ expect(editLink.attributes('href')).toBe(editPath);
+ });
+});