diff --git a/app/assets/javascripts/merge_requests/components/merge_schedule_input.vue b/app/assets/javascripts/merge_requests/components/merge_schedule_input.vue
new file mode 100644
index 0000000000000000000000000000000000000000..94f9c45b32578854e755efef7db875330ab9be27
--- /dev/null
+++ b/app/assets/javascripts/merge_requests/components/merge_schedule_input.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
diff --git a/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js b/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js
index 0e66c3521dd594d75492e5a7f89eb74526653cc3..0773b6aed5cc4410501a3cb2ba0d08ec1867a843 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js
@@ -7,6 +7,7 @@ import { addShortcutsExtension } from '~/behaviors/shortcuts';
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import LabelsSelect from '~/labels/labels_select';
import { mountMilestoneDropdown } from '~/sidebar/mount_sidebar';
+import mountMergeScheduleInput from './mount_merge_schedule_input';
export default () => {
addShortcutsExtension(ShortcutsNavigation);
@@ -14,4 +15,5 @@ export default () => {
IssuableLabelSelector();
new LabelsSelect();
mountMilestoneDropdown('[name="merge_request[milestone_id]"]');
+ mountMergeScheduleInput();
};
diff --git a/app/assets/javascripts/pages/projects/merge_requests/mount_merge_schedule_input.js b/app/assets/javascripts/pages/projects/merge_requests/mount_merge_schedule_input.js
new file mode 100644
index 0000000000000000000000000000000000000000..93b2a62488a73beafa992a4cab13583480e74e1e
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/merge_requests/mount_merge_schedule_input.js
@@ -0,0 +1,22 @@
+import Vue from 'vue';
+import MergeScheduleInput from '~/merge_requests/components/merge_schedule_input.vue';
+
+export default () => {
+ const el = document.querySelector('.js-merge-request-schedule-input');
+
+ if (!el) return false;
+
+ const { mergeAfter, paramKey } = el.dataset;
+
+ return new Vue({
+ el,
+ render(h) {
+ return h(MergeScheduleInput, {
+ props: {
+ mergeAfter,
+ paramKey,
+ },
+ });
+ },
+ });
+};
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 3995ccfca08b0bc7e1d9bdf2d3daf9f8c5877272..b6dbbea1add0221cfdeb8188f6a7ec20d9eb798a 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
@@ -4,6 +4,7 @@ export const COMPONENTS = {
conflict: () => import('./conflicts.vue'),
discussions_not_resolved: () => import('./unresolved_discussions.vue'),
draft_status: () => import('./draft.vue'),
+ merge_time: () => import('./merge_time.vue'),
need_rebase: () => import('./rebase.vue'),
default: () => import('./message.vue'),
requested_changes: () =>
@@ -38,4 +39,12 @@ export const FAILURE_REASONS = {
locked_lfs_files: __('All LFS files must be unlocked.'),
security_policy_evaluation: __('All security policies must be evaluated.'),
security_policy_violations: __('All policy rules must be satisfied.'),
+ merge_time: __('Cannot merge until this date and time.'),
};
+
+export const ICON_NAMES = Object.freeze({
+ failed: 'failed',
+ inactive: 'neutral',
+ success: 'success',
+ warning: 'warning',
+});
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/checks/merge_time.vue b/app/assets/javascripts/vue_merge_request_widget/components/checks/merge_time.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7b201b0dfb9bf26473bc066d4b097789f919184e
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/components/checks/merge_time.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/checks/message.vue b/app/assets/javascripts/vue_merge_request_widget/components/checks/message.vue
index bfd7c525ea9f4539bcdbf795715bd86c9ef41037..56c0f75248c8cb18c45e2b848b9241d130688829 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/checks/message.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/checks/message.vue
@@ -1,14 +1,7 @@