From 86caf930404a3ceb2792b0d9b5ed457e3333b07a Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Fri, 22 Jul 2016 22:58:39 +0100 Subject: [PATCH 01/12] Started removing inline widget refs --- app/assets/javascripts/dispatcher.js.coffee | 172 ++++++++++++++++++ .../merge_request_widget.js.coffee | 169 +++++++++++++++++ .../merge_requests/widget/_show.html.haml | 39 ++-- .../widget/open/_accept.html.haml | 105 +++++------ .../widget/open/_check.html.haml | 6 - 5 files changed, 396 insertions(+), 95 deletions(-) create mode 100644 app/assets/javascripts/dispatcher.js.coffee create mode 100644 app/assets/javascripts/merge_request_widget.js.coffee diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee new file mode 100644 index 000000000000..36d55fe88e6d --- /dev/null +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -0,0 +1,172 @@ +$ -> + new Dispatcher() + +class Dispatcher + constructor: () -> + @initSearch() + @initPageScripts() + + initPageScripts: -> + page = $('body').attr('data-page') + + unless page + return false + + path = page.split(':') + shortcut_handler = null + switch page + when 'projects:issues:index' + Issuable.init() + new IssuableBulkActions() + shortcut_handler = new ShortcutsNavigation() + when 'projects:issues:show' + new Issue() + shortcut_handler = new ShortcutsIssuable() + new ZenMode() + when 'projects:milestones:show', 'groups:milestones:show', 'dashboard:milestones:show' + new Milestone() + when 'dashboard:todos:index' + new Todos() + when 'projects:milestones:new', 'projects:milestones:edit' + new ZenMode() + new DueDateSelect() + new GLForm($('.milestone-form')) + when 'groups:milestones:new' + new ZenMode() + when 'projects:compare:show' + new Diff() + when 'projects:issues:new','projects:issues:edit' + shortcut_handler = new ShortcutsNavigation() + new GLForm($('.issue-form')) + new IssuableForm($('.issue-form')) + when 'projects:merge_requests:new', 'projects:merge_requests:edit' + new Diff() + shortcut_handler = new ShortcutsNavigation() + new GLForm($('.merge-request-form')) + new IssuableForm($('.merge-request-form')) + when 'projects:tags:new' + new ZenMode() + new GLForm($('.tag-form')) + when 'projects:releases:edit' + new ZenMode() + new GLForm($('.release-form')) + when 'projects:merge_requests:show' + new Diff() + shortcut_handler = new ShortcutsIssuable(true) + new ZenMode() + new MergedButtons() + new MergeRequestWidget() + when 'projects:merge_requests:commits', 'projects:merge_requests:builds' + new MergedButtons() + when "projects:merge_requests:diffs" + new Diff() + new ZenMode() + new MergedButtons() + when 'projects:merge_requests:index' + shortcut_handler = new ShortcutsNavigation() + Issuable.init() + when 'dashboard:activity' + new Activities() + when 'dashboard:projects:starred' + new Activities() + when 'projects:commit:show' + new Commit() + new Diff() + new ZenMode() + shortcut_handler = new ShortcutsNavigation() + when 'projects:commits:show', 'projects:activity' + shortcut_handler = new ShortcutsNavigation() + when 'projects:show' + shortcut_handler = new ShortcutsNavigation() + + new NotificationsForm() + new TreeView() if $('#tree-slider').length + when 'groups:activity' + new Activities() + when 'groups:show' + shortcut_handler = new ShortcutsNavigation() + new NotificationsForm() + new NotificationsDropdown() + when 'groups:group_members:index' + new GroupMembers() + new UsersSelect() + when 'projects:project_members:index' + new ProjectMembers() + new UsersSelect() + when 'groups:new', 'groups:edit', 'admin:groups:edit', 'admin:groups:new' + new GroupAvatar() + when 'projects:tree:show' + shortcut_handler = new ShortcutsNavigation() + new TreeView() + when 'projects:find_file:show' + shortcut_handler = true + when 'projects:blob:show', 'projects:blame:show' + new LineHighlighter() + shortcut_handler = new ShortcutsNavigation() + new ShortcutsBlob true + when 'projects:labels:new', 'projects:labels:edit' + new Labels() + when 'projects:labels:index' + new LabelManager() if $('.prioritized-labels').length + when 'projects:network:show' + # Ensure we don't create a particular shortcut handler here. This is + # already created, where the network graph is created. + shortcut_handler = true + when 'projects:forks:new' + new ProjectFork() + when 'projects:artifacts:browse' + new BuildArtifacts() + when 'projects:group_links:index' + new GroupsSelect() + when 'search:show' + new Search() + + switch path.first() + when 'admin' + new Admin() + switch path[1] + when 'groups' + new UsersSelect() + when 'projects' + new NamespaceSelects() + when 'dashboard', 'root' + shortcut_handler = new ShortcutsDashboardNavigation() + when 'profiles' + new NotificationsForm() + new NotificationsDropdown() + when 'projects' + new Project() + new ProjectAvatar() + switch path[1] + when 'compare' + new CompareAutocomplete() + when 'edit' + shortcut_handler = new ShortcutsNavigation() + new ProjectNew() + when 'new' + new ProjectNew() + when 'show' + new ProjectNew() + new ProjectShow() + new NotificationsDropdown() + when 'wikis' + new Wikis() + shortcut_handler = new ShortcutsNavigation() + new ZenMode() + new GLForm($('.wiki-form')) + when 'snippets' + shortcut_handler = new ShortcutsNavigation() + new ZenMode() if path[2] == 'show' + when 'labels', 'graphs', 'compare', 'pipelines', 'forks', \ + 'milestones', 'project_members', 'deploy_keys', 'builds', \ + 'hooks', 'services', 'protected_branches' + shortcut_handler = new ShortcutsNavigation() + + # If we haven't installed a custom shortcut handler, install the default one + if not shortcut_handler + new Shortcuts() + + initSearch: -> + + # Only when search form is present + new SearchAutocomplete() if $('.search').length diff --git a/app/assets/javascripts/merge_request_widget.js.coffee b/app/assets/javascripts/merge_request_widget.js.coffee new file mode 100644 index 000000000000..ac030767ba4b --- /dev/null +++ b/app/assets/javascripts/merge_request_widget.js.coffee @@ -0,0 +1,169 @@ +class @MergeRequestWidget + # Initialize MergeRequestWidget behavior + # + # check_enable - Boolean, whether to check automerge status + # merge_check_url - String, URL to use to check automerge status + # ci_status_url - String, URL to use to check CI status + # + + constructor: (opts) -> + @opts = opts || $('.js-merge-request-widget-options').data() + console.log @opts + @getMergeStatus() if @opts.check_status + + $('#modal_merge_info').modal(show: false) + @firstCICheck = true + @readyForCICheck = false + @cancel = false + clearInterval @fetchBuildStatusInterval + + @clearEventListeners() + @addEventListeners() + @getCIStatus(false) + @pollCIStatus() + notifyPermissions() + + clearEventListeners: -> + $(document).off 'page:change.merge_request' + $('.merge_when_build_succeeds').off 'click' + + cancelPolling: -> + @cancel = true + + addEventListeners: -> + allowedPages = ['show', 'commits', 'builds', 'changes'] + $(document).on 'page:change.merge_request', => + page = $('body').data('page').split(':').last() + if allowedPages.indexOf(page) < 0 + clearInterval @fetchBuildStatusInterval + @cancelPolling() + @clearEventListeners() + $('.merge_when_build_succeeds').on 'click', (e) => @setMergeWhenBuildSucceeds e + $('.accept_merge_request').on 'click', (e) => @acceptMergeRequest e + + mergeInProgress: (deleteSourceBranch = false)-> + $.ajax + type: 'GET' + url: $('.merge-request').data('url') + success: (data) -> + if data.state == "merged" + urlSuffix = if deleteSourceBranch then '?delete_source=true' else '' + + window.location.href = window.location.pathname + urlSuffix + else if data.merge_error + $('.mr-widget-body').html("

" + data.merge_error + "

") + else + callback = -> merge_request_widget.mergeInProgress(deleteSourceBranch) + setTimeout(callback, 2000) + dataType: 'json' + + getMergeStatus: -> + $.get @opts.merge_check_url, (data) -> + $('.mr-state-widget').replaceWith(data) + + ciLabelForStatus: (status) -> + switch status + when 'success' + 'passed' + when 'success_with_warnings' + 'passed with warnings' + else + status + + pollCIStatus: -> + @fetchBuildStatusInterval = setInterval ( => + return if not @readyForCICheck + + @getCIStatus(true) + + @readyForCICheck = false + ), 10000 + + getCIStatus: (showNotification) -> + _this = @ + $('.ci-widget-fetching').show() + + $.getJSON @opts.ci_status_url, (data) => + return if @cancel + @readyForCICheck = true + + if data.status is '' + return + + if @firstCICheck || data.status isnt @opts.ci_status and data.status? + @opts.ci_status = data.status + @showCIStatus data.status + if data.coverage + @showCICoverage data.coverage + + # The first check should only update the UI, a notification + # should only be displayed on status changes + if showNotification and not @firstCICheck + status = @ciLabelForStatus(data.status) + + if status is "preparing" + title = @opts.ci_title.preparing + status = status.charAt(0).toUpperCase() + status.slice(1) + message = @opts.ci_message.preparing.replace('{{status}}', status) + else + title = @opts.ci_title.normal + message = @opts.ci_message.normal.replace('{{status}}', status) + + title = title.replace('{{status}}', status) + message = message.replace('{{sha}}', data.sha) + message = message.replace('{{title}}', data.title) + + notify( + title, + message, + @opts.gitlab_icon, + -> + @close() + Turbolinks.visit _this.opts.builds_path + ) + @firstCICheck = false + + showCIStatus: (state) -> + return if not state? + $('.ci_widget').hide() + allowed_states = ["failed", "canceled", "running", "pending", "success", "success_with_warnings", "skipped", "not_found"] + if state in allowed_states + $('.ci_widget.ci-' + state).show() + switch state + when "failed", "canceled", "not_found" + @setMergeButtonClass('btn-danger') + when "running" + @setMergeButtonClass('btn-warning') + when "success", "success_with_warnings" + @setMergeButtonClass('btn-create') + else + $('.ci_widget.ci-error').show() + @setMergeButtonClass('btn-danger') + + showCICoverage: (coverage) -> + text = 'Coverage ' + coverage + '%' + $('.ci_widget:visible .ci-coverage').text(text) + + setMergeButtonClass: (css_class) -> + $('.js-merge-button,.accept-action .dropdown-toggle') + .removeClass('btn-danger btn-warning btn-create') + .addClass(css_class) + + setMergeWhenBuildSucceeds: (e) -> + e.preventDefault() + @whenBuildSucceedsInput ?= $("#merge_when_build_succeeds") + @whenBuildSucceedsInput.val '1' + + + acceptMergeRequest: (e) -> + e.preventDefault() + @acceptMergeRequestInput ?= $('.accept-mr-form :input') + @acceptMergeButton ?= $('.js-merge-button') + @acceptMergeRequestInput.disable() + @acceptMergeButton.html ' Merge in progress' + $.ajax + dataType: 'json' + method: 'POST' + url: @opts.merge_path + .done (res) -> + console.log 'accept MR res', res diff --git a/app/views/projects/merge_requests/widget/_show.html.haml b/app/views/projects/merge_requests/widget/_show.html.haml index ea618263a4a8..9c6c0b6dd21a 100644 --- a/app/views/projects/merge_requests/widget/_show.html.haml +++ b/app/views/projects/merge_requests/widget/_show.html.haml @@ -7,30 +7,15 @@ - elsif @merge_request.locked? = render 'projects/merge_requests/widget/locked' -:javascript - var opts = { - merge_check_url: "#{merge_check_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", - check_enable: #{@merge_request.unchecked? ? "true" : "false"}, - ci_status_url: "#{ci_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", - gitlab_icon: "#{asset_path 'gitlab_logo.png'}", - ci_status: "#{@merge_request.pipeline ? @merge_request.pipeline.status : ''}", - ci_message: { - normal: "Build {{status}} for \"{{title}}\"", - preparing: "{{status}} build for \"{{title}}\"" - }, - ci_enable: #{@project.ci_service ? "true" : "false"}, - ci_title: { - preparing: "{{status}} build", - normal: "Build {{status}}" - }, - builds_path: "#{builds_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", - pipelines_path: "#{pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}" - }; - - if (typeof merge_request_widget !== 'undefined') { - clearInterval(merge_request_widget.fetchBuildStatusInterval); - merge_request_widget.cancelPolling(); - merge_request_widget.clearEventListeners(); - } - - merge_request_widget = new MergeRequestWidget(opts); +.js-merge-request-widget-options{ data: { merge_check_url: merge_check_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), + check_enable: (@merge_request.unchecked? ? 'true' : 'false'), + ci_status_url: ci_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), + gitlab_icon: asset_path('gitlab_logo.png'), + ci_status: (@merge_request.pipeline ? @merge_request.pipeline.status : ''), + ci_message: { normal: 'Build {{status}} for "{{title}}"', preparing: '{{status}} build for "{{title}}"' }, + ci_enable: (@project.ci_service ? 'true' : 'false'), + ci_title: { preparing: "{{status}} build", normal: "Build {{status}}" }, + builds_path: builds_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), + pipelines_path: pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), + merge_path: merge_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), + check_status: (@merge_request.open? && @merge_request.unchecked?) } } diff --git a/app/views/projects/merge_requests/widget/open/_accept.html.haml b/app/views/projects/merge_requests/widget/open/_accept.html.haml index bf2e76f00838..65f70cd88de0 100644 --- a/app/views/projects/merge_requests/widget/open/_accept.html.haml +++ b/app/views/projects/merge_requests/widget/open/_accept.html.haml @@ -1,65 +1,46 @@ - status_class = @pipeline ? " ci-#{@pipeline.status}" : nil -= form_for [:merge, @project.namespace.becomes(Namespace), @project, @merge_request], remote: true, method: :post, html: { class: 'accept-mr-form js-quick-submit js-requires-input' } do |f| - = hidden_field_tag :authenticity_token, form_authenticity_token - = hidden_field_tag :sha, @merge_request.diff_head_sha - .accept-merge-holder.clearfix.js-toggle-container - .clearfix - .accept-action - - if @pipeline && @pipeline.active? - %span.btn-group - = button_tag class: "btn btn-create js-merge-button merge_when_build_succeeds" do - Merge When Build Succeeds - - unless @project.only_allow_merge_if_build_succeeds? - = button_tag class: "btn btn-success dropdown-toggle", 'data-toggle' => 'dropdown' do - %span.caret - %span.sr-only - Select Merge Moment - %ul.js-merge-dropdown.dropdown-menu.dropdown-menu-right{ role: 'menu' } - %li - = link_to "#", class: "merge_when_build_succeeds" do - = icon('check fw') - Merge When Build Succeeds - %li - = link_to "#", class: "accept_merge_request" do - = icon('warning fw') - Merge Immediately - - else - = f.button class: "btn btn-create btn-grouped js-merge-button accept_merge_request #{status_class}" do - Accept Merge Request - - if @merge_request.force_remove_source_branch? - .accept-control - The source branch will be removed. - - elsif @merge_request.can_remove_source_branch?(current_user) - .accept-control.checkbox - = label_tag :should_remove_source_branch, class: "remove_source_checkbox" do - = check_box_tag :should_remove_source_branch - Remove source branch - .accept-control.right - = link_to "#", class: "modify-merge-commit-link js-toggle-button" do - = icon('edit') - Modify commit message - .js-toggle-content.hide.prepend-top-default - = render 'shared/commit_message_container', params: params, - text: @merge_request.merge_commit_message, - rows: 14, hint: true += hidden_field_tag :authenticity_token, form_authenticity_token += hidden_field_tag :sha, @merge_request.diff_head_sha +.accept-merge-holder.clearfix.js-toggle-container + .clearfix + .accept-action + - if @pipeline && @pipeline.active? + %span.btn-group + = button_tag class: "btn btn-create js-merge-button merge_when_build_succeeds" do + Merge When Build Succeeds + - unless @project.only_allow_merge_if_build_succeeds? + = button_tag class: "btn btn-success dropdown-toggle", 'data-toggle' => 'dropdown' do + %span.caret + %span.sr-only + Select Merge Moment + %ul.js-merge-dropdown.dropdown-menu.dropdown-menu-right{ role: 'menu' } + %li + = link_to "#", class: "merge_when_build_succeeds" do + = icon('check fw') + Merge When Build Succeeds + %li + = link_to "#", class: "accept_merge_request" do + = icon('warning fw') + Merge Immediately + - else + = button_tag class: "btn btn-create btn-grouped js-merge-button accept_merge_request #{status_class}" do + Accept Merge Request + - if @merge_request.force_remove_source_branch? + .accept-control + The source branch will be removed. + - elsif @merge_request.can_remove_source_branch?(current_user) + .accept-control.checkbox + = label_tag :should_remove_source_branch, class: "remove_source_checkbox" do + = check_box_tag :should_remove_source_branch + Remove source branch + .accept-control.right + = link_to "#", class: "modify-merge-commit-link js-toggle-button" do + = icon('edit') + Modify commit message + .js-toggle-content.hide.prepend-top-default + = render 'shared/commit_message_container', params: params, + text: @merge_request.merge_commit_message, + rows: 14, hint: true - = hidden_field_tag :merge_when_build_succeeds, "", autocomplete: "off" - - :javascript - $('.accept-mr-form').on('ajax:send', function() { - $(".accept-mr-form :input").disable(); - }); - - $('.accept_merge_request').on('click', function() { - $('.js-merge-button').html(" Merge in progress"); - }); - - $('.merge_when_build_succeeds').on('click', function() { - $("#merge_when_build_succeeds").val("1"); - }); - - $('.js-merge-dropdown a').on('click', function(e) { - e.preventDefault(); - $(this).closest("form").submit(); - }); + = hidden_field_tag :merge_when_build_succeeds, "", autocomplete: "off" diff --git a/app/views/projects/merge_requests/widget/open/_check.html.haml b/app/views/projects/merge_requests/widget/open/_check.html.haml index e16878ba5138..1006bcd83818 100644 --- a/app/views/projects/merge_requests/widget/open/_check.html.haml +++ b/app/views/projects/merge_requests/widget/open/_check.html.haml @@ -1,9 +1,3 @@ %strong = icon("spinner spin") Checking ability to merge automatically… - -:javascript - $(function() { - merge_request_widget.getMergeStatus(); - }); - -- GitLab From 381a4261ec107c6a8dcdcdee7040c96923ee9613 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Sat, 23 Jul 2016 03:50:54 +0100 Subject: [PATCH 02/12] Removed a few widget remote: and implemented in JS --- .../merge_request_widget.js.coffee | 122 +++++++++++++----- .../projects/merge_requests_controller.rb | 14 ++ .../cancel_merge_when_build_succeeds.js.haml | 2 - .../projects/merge_requests/merge.js.haml | 6 - .../merge_requests/widget/_show.html.haml | 1 + .../open/_merge_when_build_succeeds.html.haml | 3 +- 6 files changed, 104 insertions(+), 44 deletions(-) delete mode 100644 app/views/projects/merge_requests/cancel_merge_when_build_succeeds.js.haml diff --git a/app/assets/javascripts/merge_request_widget.js.coffee b/app/assets/javascripts/merge_request_widget.js.coffee index ac030767ba4b..632f454759a9 100644 --- a/app/assets/javascripts/merge_request_widget.js.coffee +++ b/app/assets/javascripts/merge_request_widget.js.coffee @@ -1,15 +1,21 @@ class @MergeRequestWidget # Initialize MergeRequestWidget behavior # - # check_enable - Boolean, whether to check automerge status - # merge_check_url - String, URL to use to check automerge status - # ci_status_url - String, URL to use to check CI status + # checkEnable - Boolean, whether to check automerge status + # mergeCheckUrl - String, URL to use to check automerge status + # ciStatusUrl - String, URL to use to check CI status # constructor: (opts) -> + @mergeRequestWidget = $('.mr-state-widget') + @mergeRequestWidgetBody = $('.mr-widget-body') + @opts = opts || $('.js-merge-request-widget-options').data() + + @getInputs() + @getButtons() console.log @opts - @getMergeStatus() if @opts.check_status + @getMergeStatus() if @opts.checkStatus $('#modal_merge_info').modal(show: false) @firstCICheck = true @@ -23,9 +29,31 @@ class @MergeRequestWidget @pollCIStatus() notifyPermissions() + getInputs: -> + @acceptMergeRequestInput = $('.accept-mr-form :input') + @mergeWhenSucceedsInput = $('input[name=merge_when_build_succeeds]') + @removeSourceBranchInput = $('input[name=should_remove_source_branch]') + + @utfInput = $('input[name=utf8]', @mergeRequestWidget) + @authenticityTokenInput = $('input[name=authenticity_token]', @mergeRequestWidget) + @shaInput = $('input[name=sha]', @mergeRequestWidget) + @commitMessageInput = $('textarea[name=commit_message]', @mergeRequestWidget) + + getButtons: -> + @clearButtonEventListeners() + @dynamicMergeButton = $('.js-merge-button') + @acceptMergeRequestButton = $('.accept_merge_request') + @mergeWhenSucceedsButton = $('.merge_when_build_succeeds') + @cancelMergeOnSuccessButton = $('.js-cancel-automatic-merge') + @addButtonEventListeners() + clearEventListeners: -> $(document).off 'page:change.merge_request' - $('.merge_when_build_succeeds').off 'click' + + clearButtonEventListeners: -> + @mergeWhenSucceedsButton.off 'click' if @mergeWhenSucceedsButton + @acceptMergeRequestButton.off 'click' if @acceptMergeRequestButton + @cancelMergeOnSuccessButton.off 'click' if @cancelMergeOnSuccessButton cancelPolling: -> @cancel = true @@ -38,28 +66,34 @@ class @MergeRequestWidget clearInterval @fetchBuildStatusInterval @cancelPolling() @clearEventListeners() - $('.merge_when_build_succeeds').on 'click', (e) => @setMergeWhenBuildSucceeds e - $('.accept_merge_request').on 'click', (e) => @acceptMergeRequest e + + addButtonEventListeners: -> + @mergeWhenSucceedsButton.on 'click', (e) => + @setMergeWhenBuildSucceeds e + @acceptMergeRequest() + @acceptMergeRequestButton.on 'click', (e) => @acceptMergeRequest e + @cancelMergeOnSuccessButton.on 'click', (e) => @cancelMergeOnSuccess e mergeInProgress: (deleteSourceBranch = false)-> $.ajax type: 'GET' url: $('.merge-request').data('url') - success: (data) -> + dataType: 'json' + success: (data) => + console.log 'mergeInProgress', data if data.state == "merged" urlSuffix = if deleteSourceBranch then '?delete_source=true' else '' window.location.href = window.location.pathname + urlSuffix else if data.merge_error - $('.mr-widget-body').html("

" + data.merge_error + "

") + @mergeRequestWidgetBody.html("

" + data.merge_error + "

") else - callback = -> merge_request_widget.mergeInProgress(deleteSourceBranch) - setTimeout(callback, 2000) - dataType: 'json' + setTimeout @mergeInProgress(deleteSourceBranch), 2000 getMergeStatus: -> - $.get @opts.merge_check_url, (data) -> - $('.mr-state-widget').replaceWith(data) + $.get @opts.mergeCheckUrl, (data) => + @mergeRequestWidget.replaceWith(data) + console.log @mergeRequestWidget ciLabelForStatus: (status) -> switch status @@ -83,15 +117,15 @@ class @MergeRequestWidget _this = @ $('.ci-widget-fetching').show() - $.getJSON @opts.ci_status_url, (data) => + $.getJSON @opts.ciStatusUrl, (data) => return if @cancel @readyForCICheck = true if data.status is '' return - if @firstCICheck || data.status isnt @opts.ci_status and data.status? - @opts.ci_status = data.status + if @firstCICheck || data.status isnt @opts.ciStatus and data.status? + @opts.ciStatus = data.status @showCIStatus data.status if data.coverage @showCICoverage data.coverage @@ -102,12 +136,12 @@ class @MergeRequestWidget status = @ciLabelForStatus(data.status) if status is "preparing" - title = @opts.ci_title.preparing + title = @opts.ciTitle.preparing status = status.charAt(0).toUpperCase() + status.slice(1) - message = @opts.ci_message.preparing.replace('{{status}}', status) + message = @opts.ciMessage.preparing.replace('{{status}}', status) else - title = @opts.ci_title.normal - message = @opts.ci_message.normal.replace('{{status}}', status) + title = @opts.ciTitle.normal + message = @opts.ciMessage.normal.replace('{{status}}', status) title = title.replace('{{status}}', status) message = message.replace('{{sha}}', data.sha) @@ -116,10 +150,10 @@ class @MergeRequestWidget notify( title, message, - @opts.gitlab_icon, + @opts.gitlabIcon, -> @close() - Turbolinks.visit _this.opts.builds_path + Turbolinks.visit _this.opts.buildsPath ) @firstCICheck = false @@ -151,19 +185,39 @@ class @MergeRequestWidget setMergeWhenBuildSucceeds: (e) -> e.preventDefault() - @whenBuildSucceedsInput ?= $("#merge_when_build_succeeds") - @whenBuildSucceedsInput.val '1' - + @mergeWhenSucceedsInput.val '1' acceptMergeRequest: (e) -> - e.preventDefault() - @acceptMergeRequestInput ?= $('.accept-mr-form :input') - @acceptMergeButton ?= $('.js-merge-button') + e.preventDefault() if e @acceptMergeRequestInput.disable() - @acceptMergeButton.html ' Merge in progress' + @dynamicMergeButton.html ' Merge in progress' + + $.ajax + method: 'POST' + url: @opts.mergePath + data: + utf8: @utfInput.val() + authenticity_token: @authenticityTokenInput.val() + sha: @shaInput.val() + commit_message: @commitMessageInput.val() + merge_when_build_succeeds: @mergeWhenSucceedsInput.val() + should_remove_source_branch: @removeSourceBranchInput.val() + .done (res) => + console.log 'accept mr res', res + if res.merge_in_progress + @mergeInProgress res.merge_in_progress + else + @mergeRequestWidgetBody.html res + @getButtons() + @getInputs() + + + cancelMergeOnSuccess: -> $.ajax - dataType: 'json' method: 'POST' - url: @opts.merge_path - .done (res) -> - console.log 'accept MR res', res + url: @opts.cancelMergeOnSuccessPath + .done (res) => + console.log 'cancel merge on success res', res + @mergeRequestWidgetBody.html res + @getButtons() + @getInputs() diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 8895cb955bd4..1a70c5a1e480 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -301,6 +301,8 @@ def cancel_merge_when_build_succeeds return access_denied! unless @merge_request.can_cancel_merge_when_build_succeeds?(current_user) MergeRequests::MergeWhenBuildSucceedsService.new(@project, current_user).cancel(@merge_request) + + render partial: 'projects/merge_requests/widget/open/accept', layout: false end def merge @@ -344,6 +346,18 @@ def merge MergeWorker.perform_async(@merge_request.id, current_user.id, params) @status = :success end + case @status + when :success + render json: { merge_in_progress: (params[:should_remove_source_branch] == '1') } + when :merge_when_build_succeeds + render partial: 'projects/merge_requests/widget/open/merge_when_build_succeeds', layout: false + end + # - when :sha_mismatch + # :plain + # $('.mr-widget-body').html("#{escape_javascript(render('projects/merge_requests/widget/open/sha_mismatch'))}"); + # - else + # :plain + # $('.mr-widget-body').html("#{escape_javascript(render('projects/merge_requests/widget/open/reload'))}"); end def branch_from diff --git a/app/views/projects/merge_requests/cancel_merge_when_build_succeeds.js.haml b/app/views/projects/merge_requests/cancel_merge_when_build_succeeds.js.haml deleted file mode 100644 index eab5be488b5d..000000000000 --- a/app/views/projects/merge_requests/cancel_merge_when_build_succeeds.js.haml +++ /dev/null @@ -1,2 +0,0 @@ -:plain - $('.mr-widget-body').html("#{escape_javascript(render('projects/merge_requests/widget/open/accept'))}"); diff --git a/app/views/projects/merge_requests/merge.js.haml b/app/views/projects/merge_requests/merge.js.haml index 84b6c9ebc5cf..6e9b802a1581 100644 --- a/app/views/projects/merge_requests/merge.js.haml +++ b/app/views/projects/merge_requests/merge.js.haml @@ -1,10 +1,4 @@ - case @status -- when :success - :plain - merge_request_widget.mergeInProgress(#{params[:should_remove_source_branch] == '1'}); -- when :merge_when_build_succeeds - :plain - $('.mr-widget-body').html("#{escape_javascript(render('projects/merge_requests/widget/open/merge_when_build_succeeds'))}"); - when :sha_mismatch :plain $('.mr-widget-body').html("#{escape_javascript(render('projects/merge_requests/widget/open/sha_mismatch'))}"); diff --git a/app/views/projects/merge_requests/widget/_show.html.haml b/app/views/projects/merge_requests/widget/_show.html.haml index 9c6c0b6dd21a..cf977740a74a 100644 --- a/app/views/projects/merge_requests/widget/_show.html.haml +++ b/app/views/projects/merge_requests/widget/_show.html.haml @@ -18,4 +18,5 @@ builds_path: builds_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), pipelines_path: pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), merge_path: merge_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), + cancel_merge_on_success_path: cancel_merge_when_build_succeeds_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request), check_status: (@merge_request.open? && @merge_request.unchecked?) } } diff --git a/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml b/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml index 2b6b5e05e865..49e77bf6a094 100644 --- a/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml +++ b/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml @@ -21,5 +21,4 @@ Remove Source Branch When Merged - if user_can_cancel_automatic_merge - = link_to cancel_merge_when_build_succeeds_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request), remote: true, method: :post, class: "btn btn-grouped btn-warning btn-sm" do - Cancel Automatic Merge + = button_tag 'Cancel Automatic Merge', class: 'btn btn-grouped btn-warning btn-sm js-cancel-automatic-merge' -- GitLab From 7dc6e45f30dab2081285d69b9815c0cabff2fa67 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Sat, 23 Jul 2016 05:37:31 +0100 Subject: [PATCH 03/12] Finishing up widget partial implentation changes --- .../merge_request_widget.js.coffee | 28 +++++++++++-------- .../projects/merge_requests_controller.rb | 15 ++++++---- .../projects/merge_requests/merge.js.haml | 7 ----- .../open/_merge_when_build_succeeds.html.haml | 3 +- 4 files changed, 28 insertions(+), 25 deletions(-) delete mode 100644 app/views/projects/merge_requests/merge.js.haml diff --git a/app/assets/javascripts/merge_request_widget.js.coffee b/app/assets/javascripts/merge_request_widget.js.coffee index 632f454759a9..c532e1b94bbe 100644 --- a/app/assets/javascripts/merge_request_widget.js.coffee +++ b/app/assets/javascripts/merge_request_widget.js.coffee @@ -14,7 +14,6 @@ class @MergeRequestWidget @getInputs() @getButtons() - console.log @opts @getMergeStatus() if @opts.checkStatus $('#modal_merge_info').modal(show: false) @@ -34,17 +33,18 @@ class @MergeRequestWidget @mergeWhenSucceedsInput = $('input[name=merge_when_build_succeeds]') @removeSourceBranchInput = $('input[name=should_remove_source_branch]') - @utfInput = $('input[name=utf8]', @mergeRequestWidget) @authenticityTokenInput = $('input[name=authenticity_token]', @mergeRequestWidget) - @shaInput = $('input[name=sha]', @mergeRequestWidget) @commitMessageInput = $('textarea[name=commit_message]', @mergeRequestWidget) + @shaInput = $('input[name=sha]', @mergeRequestWidget) + @utfInput = $('input[name=utf8]', @mergeRequestWidget) getButtons: -> @clearButtonEventListeners() @dynamicMergeButton = $('.js-merge-button') @acceptMergeRequestButton = $('.accept_merge_request') - @mergeWhenSucceedsButton = $('.merge_when_build_succeeds') @cancelMergeOnSuccessButton = $('.js-cancel-automatic-merge') + @mergeWhenSucceedsButton = $('.merge_when_build_succeeds') + @removeSourceBranchButton = $('.remove_source_branch') @addButtonEventListeners() clearEventListeners: -> @@ -54,6 +54,7 @@ class @MergeRequestWidget @mergeWhenSucceedsButton.off 'click' if @mergeWhenSucceedsButton @acceptMergeRequestButton.off 'click' if @acceptMergeRequestButton @cancelMergeOnSuccessButton.off 'click' if @cancelMergeOnSuccessButton + @removeSourceBranchButton.off 'click' if @removeSourceBranchButton cancelPolling: -> @cancel = true @@ -73,6 +74,10 @@ class @MergeRequestWidget @acceptMergeRequest() @acceptMergeRequestButton.on 'click', (e) => @acceptMergeRequest e @cancelMergeOnSuccessButton.on 'click', (e) => @cancelMergeOnSuccess e + @removeSourceBranchButton.on 'click', (e) => + @setRemoveSourceBranch e + @setMergeWhenBuildSucceeds() + @acceptMergeRequest() mergeInProgress: (deleteSourceBranch = false)-> $.ajax @@ -80,7 +85,6 @@ class @MergeRequestWidget url: $('.merge-request').data('url') dataType: 'json' success: (data) => - console.log 'mergeInProgress', data if data.state == "merged" urlSuffix = if deleteSourceBranch then '?delete_source=true' else '' @@ -88,12 +92,11 @@ class @MergeRequestWidget else if data.merge_error @mergeRequestWidgetBody.html("

" + data.merge_error + "

") else - setTimeout @mergeInProgress(deleteSourceBranch), 2000 + setTimeout(@mergeInProgress(deleteSourceBranch), 2000) getMergeStatus: -> $.get @opts.mergeCheckUrl, (data) => @mergeRequestWidget.replaceWith(data) - console.log @mergeRequestWidget ciLabelForStatus: (status) -> switch status @@ -184,9 +187,13 @@ class @MergeRequestWidget .addClass(css_class) setMergeWhenBuildSucceeds: (e) -> - e.preventDefault() + e.preventDefault() if e @mergeWhenSucceedsInput.val '1' + setRemoveSourceBranch: (e) -> + e.preventDefault() if e + @removeSourceBranchInput.val '1' + acceptMergeRequest: (e) -> e.preventDefault() if e @acceptMergeRequestInput.disable() @@ -203,7 +210,6 @@ class @MergeRequestWidget merge_when_build_succeeds: @mergeWhenSucceedsInput.val() should_remove_source_branch: @removeSourceBranchInput.val() .done (res) => - console.log 'accept mr res', res if res.merge_in_progress @mergeInProgress res.merge_in_progress else @@ -212,12 +218,12 @@ class @MergeRequestWidget @getInputs() - cancelMergeOnSuccess: -> + cancelMergeOnSuccess: (e) -> + e.preventDefault() if e $.ajax method: 'POST' url: @opts.cancelMergeOnSuccessPath .done (res) => - console.log 'cancel merge on success res', res @mergeRequestWidgetBody.html res @getButtons() @getInputs() diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 1a70c5a1e480..07ccdb5ae84c 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -346,18 +346,21 @@ def merge MergeWorker.perform_async(@merge_request.id, current_user.id, params) @status = :success end + + render_merge_request_widget_partial + end + + def render_merge_request_widget_partial case @status when :success render json: { merge_in_progress: (params[:should_remove_source_branch] == '1') } when :merge_when_build_succeeds render partial: 'projects/merge_requests/widget/open/merge_when_build_succeeds', layout: false + when :sha_mismatch + render partial: 'projects/merge_requests/widget/open/sha_mismatch', layout: false + else + render partial: 'projects/merge_requests/widget/open/reload', layout: false end - # - when :sha_mismatch - # :plain - # $('.mr-widget-body').html("#{escape_javascript(render('projects/merge_requests/widget/open/sha_mismatch'))}"); - # - else - # :plain - # $('.mr-widget-body').html("#{escape_javascript(render('projects/merge_requests/widget/open/reload'))}"); end def branch_from diff --git a/app/views/projects/merge_requests/merge.js.haml b/app/views/projects/merge_requests/merge.js.haml deleted file mode 100644 index 6e9b802a1581..000000000000 --- a/app/views/projects/merge_requests/merge.js.haml +++ /dev/null @@ -1,7 +0,0 @@ -- case @status -- when :sha_mismatch - :plain - $('.mr-widget-body').html("#{escape_javascript(render('projects/merge_requests/widget/open/sha_mismatch'))}"); -- else - :plain - $('.mr-widget-body').html("#{escape_javascript(render('projects/merge_requests/widget/open/reload'))}"); diff --git a/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml b/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml index 49e77bf6a094..4d11260734ce 100644 --- a/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml +++ b/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml @@ -16,7 +16,8 @@ - if remove_source_branch_button || user_can_cancel_automatic_merge .clearfix.prepend-top-10 - if remove_source_branch_button - = link_to merge_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request, merge_when_build_succeeds: true, should_remove_source_branch: true, sha: @merge_request.diff_head_sha), remote: true, method: :post, class: "btn btn-grouped btn-primary btn-sm remove_source_branch" do + -# = link_to merge_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request, merge_when_build_succeeds: true, should_remove_source_branch: true, sha: @merge_request.diff_head_sha), remote: true, method: :post, class: "btn btn-grouped btn-primary btn-sm remove_source_branch" do + = button_tag class: 'btn btn-grouped btn-primary btn-sm remove_source_branch' do = icon('times') Remove Source Branch When Merged -- GitLab From 8c53985a7f8d29e6f936e1205255eb6008e06e18 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Sat, 23 Jul 2016 06:13:51 +0100 Subject: [PATCH 04/12] Fixed unloopable progress poll --- app/assets/javascripts/merge_request_widget.js.coffee | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/merge_request_widget.js.coffee b/app/assets/javascripts/merge_request_widget.js.coffee index c532e1b94bbe..07fa4b088d8e 100644 --- a/app/assets/javascripts/merge_request_widget.js.coffee +++ b/app/assets/javascripts/merge_request_widget.js.coffee @@ -79,7 +79,7 @@ class @MergeRequestWidget @setMergeWhenBuildSucceeds() @acceptMergeRequest() - mergeInProgress: (deleteSourceBranch = false)-> + mergeInProgress: (deleteSourceBranch = false) -> $.ajax type: 'GET' url: $('.merge-request').data('url') @@ -92,7 +92,9 @@ class @MergeRequestWidget else if data.merge_error @mergeRequestWidgetBody.html("

" + data.merge_error + "

") else - setTimeout(@mergeInProgress(deleteSourceBranch), 2000) + setTimeout => + @mergeInProgress(deleteSourceBranch) + , 2000 getMergeStatus: -> $.get @opts.mergeCheckUrl, (data) => -- GitLab From a23da26e4088d439c62ea8372486e0e224c7d04c Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Sat, 23 Jul 2016 06:47:15 +0100 Subject: [PATCH 05/12] removed old link --- .../widget/open/_merge_when_build_succeeds.html.haml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml b/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml index 4d11260734ce..efd91579cbcb 100644 --- a/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml +++ b/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml @@ -16,7 +16,6 @@ - if remove_source_branch_button || user_can_cancel_automatic_merge .clearfix.prepend-top-10 - if remove_source_branch_button - -# = link_to merge_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request, merge_when_build_succeeds: true, should_remove_source_branch: true, sha: @merge_request.diff_head_sha), remote: true, method: :post, class: "btn btn-grouped btn-primary btn-sm remove_source_branch" do = button_tag class: 'btn btn-grouped btn-primary btn-sm remove_source_branch' do = icon('times') Remove Source Branch When Merged -- GitLab From cb00afe380418ad975e8fbb881eb4e418b645b49 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Sat, 23 Jul 2016 07:15:44 +0100 Subject: [PATCH 06/12] added remove source branch button url --- .../merge_request_widget.js.coffee | 41 ++++++++----------- .../open/_merge_when_build_succeeds.html.haml | 2 +- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/app/assets/javascripts/merge_request_widget.js.coffee b/app/assets/javascripts/merge_request_widget.js.coffee index 07fa4b088d8e..326f72d6e0ac 100644 --- a/app/assets/javascripts/merge_request_widget.js.coffee +++ b/app/assets/javascripts/merge_request_widget.js.coffee @@ -13,7 +13,7 @@ class @MergeRequestWidget @opts = opts || $('.js-merge-request-widget-options').data() @getInputs() - @getButtons() + @getButtons true @getMergeStatus() if @opts.checkStatus $('#modal_merge_info').modal(show: false) @@ -22,7 +22,9 @@ class @MergeRequestWidget @cancel = false clearInterval @fetchBuildStatusInterval + @clearButtonEventListeners() @clearEventListeners() + @addButtonEventListeners() @addEventListeners() @getCIStatus(false) @pollCIStatus() @@ -38,23 +40,22 @@ class @MergeRequestWidget @shaInput = $('input[name=sha]', @mergeRequestWidget) @utfInput = $('input[name=utf8]', @mergeRequestWidget) - getButtons: -> - @clearButtonEventListeners() + getButtons: (skipListeners) -> @dynamicMergeButton = $('.js-merge-button') @acceptMergeRequestButton = $('.accept_merge_request') @cancelMergeOnSuccessButton = $('.js-cancel-automatic-merge') @mergeWhenSucceedsButton = $('.merge_when_build_succeeds') @removeSourceBranchButton = $('.remove_source_branch') - @addButtonEventListeners() + @addButtonEventListeners() unless skipListeners clearEventListeners: -> $(document).off 'page:change.merge_request' clearButtonEventListeners: -> - @mergeWhenSucceedsButton.off 'click' if @mergeWhenSucceedsButton - @acceptMergeRequestButton.off 'click' if @acceptMergeRequestButton - @cancelMergeOnSuccessButton.off 'click' if @cancelMergeOnSuccessButton - @removeSourceBranchButton.off 'click' if @removeSourceBranchButton + @mergeWhenSucceedsButton.off 'click' + @acceptMergeRequestButton.off 'click' + @cancelMergeOnSuccessButton.off 'click' + @removeSourceBranchButton.off 'click' cancelPolling: -> @cancel = true @@ -70,14 +71,13 @@ class @MergeRequestWidget addButtonEventListeners: -> @mergeWhenSucceedsButton.on 'click', (e) => - @setMergeWhenBuildSucceeds e - @acceptMergeRequest() + @mergeWhenSucceedsInput.val '1' + @acceptMergeRequest e @acceptMergeRequestButton.on 'click', (e) => @acceptMergeRequest e @cancelMergeOnSuccessButton.on 'click', (e) => @cancelMergeOnSuccess e @removeSourceBranchButton.on 'click', (e) => - @setRemoveSourceBranch e - @setMergeWhenBuildSucceeds() - @acceptMergeRequest() + @mergeWhenSucceedsInput.val '1' + @acceptMergeRequest e, @removeSourceBranchButton.data 'url' mergeInProgress: (deleteSourceBranch = false) -> $.ajax @@ -188,29 +188,21 @@ class @MergeRequestWidget .removeClass('btn-danger btn-warning btn-create') .addClass(css_class) - setMergeWhenBuildSucceeds: (e) -> - e.preventDefault() if e - @mergeWhenSucceedsInput.val '1' - - setRemoveSourceBranch: (e) -> - e.preventDefault() if e - @removeSourceBranchInput.val '1' - - acceptMergeRequest: (e) -> + acceptMergeRequest: (e, url = null) -> e.preventDefault() if e @acceptMergeRequestInput.disable() @dynamicMergeButton.html ' Merge in progress' $.ajax method: 'POST' - url: @opts.mergePath + url: url || @opts.mergePath data: utf8: @utfInput.val() authenticity_token: @authenticityTokenInput.val() sha: @shaInput.val() commit_message: @commitMessageInput.val() merge_when_build_succeeds: @mergeWhenSucceedsInput.val() - should_remove_source_branch: @removeSourceBranchInput.val() + should_remove_source_branch: @removeSourceBranchInput.val() if @removeSourceBranchInput.is ':checked' || removeSourceBranch .done (res) => if res.merge_in_progress @mergeInProgress res.merge_in_progress @@ -219,7 +211,6 @@ class @MergeRequestWidget @getButtons() @getInputs() - cancelMergeOnSuccess: (e) -> e.preventDefault() if e $.ajax diff --git a/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml b/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml index efd91579cbcb..acfee5463313 100644 --- a/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml +++ b/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml @@ -16,7 +16,7 @@ - if remove_source_branch_button || user_can_cancel_automatic_merge .clearfix.prepend-top-10 - if remove_source_branch_button - = button_tag class: 'btn btn-grouped btn-primary btn-sm remove_source_branch' do + = button_tag class: 'btn btn-grouped btn-primary btn-sm remove_source_branch', data: { url: merge_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request, merge_when_build_succeeds: true, should_remove_source_branch: true, sha: @merge_request.diff_head_sha) } do = icon('times') Remove Source Branch When Merged -- GitLab From cce12c8b53f0f2eeed32fc7bbd0fdc67511f4976 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Sat, 23 Jul 2016 07:35:39 +0100 Subject: [PATCH 07/12] Fixed accepting MR? --- app/assets/javascripts/merge_request_widget.js.coffee | 6 +++--- app/controllers/projects/merge_requests_controller.rb | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/merge_request_widget.js.coffee b/app/assets/javascripts/merge_request_widget.js.coffee index 326f72d6e0ac..5c30f1047fc9 100644 --- a/app/assets/javascripts/merge_request_widget.js.coffee +++ b/app/assets/javascripts/merge_request_widget.js.coffee @@ -32,13 +32,13 @@ class @MergeRequestWidget getInputs: -> @acceptMergeRequestInput = $('.accept-mr-form :input') + @commitMessageInput = $('textarea[name=commit_message]') @mergeWhenSucceedsInput = $('input[name=merge_when_build_succeeds]') @removeSourceBranchInput = $('input[name=should_remove_source_branch]') + @shaInput = $('input[name=sha]') + @utfInput = $('input[name=utf8]') @authenticityTokenInput = $('input[name=authenticity_token]', @mergeRequestWidget) - @commitMessageInput = $('textarea[name=commit_message]', @mergeRequestWidget) - @shaInput = $('input[name=sha]', @mergeRequestWidget) - @utfInput = $('input[name=utf8]', @mergeRequestWidget) getButtons: (skipListeners) -> @dynamicMergeButton = $('.js-merge-button') diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 07ccdb5ae84c..f9676633cf27 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -353,7 +353,7 @@ def merge def render_merge_request_widget_partial case @status when :success - render json: { merge_in_progress: (params[:should_remove_source_branch] == '1') } + render json: { merge_in_progress: true } when :merge_when_build_succeeds render partial: 'projects/merge_requests/widget/open/merge_when_build_succeeds', layout: false when :sha_mismatch -- GitLab From c9a8bd75e075f65ef2f08eeccc7fc7e92c111788 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Sat, 23 Jul 2016 19:16:25 +0100 Subject: [PATCH 08/12] Fixed some builds --- app/assets/javascripts/merge_request_widget.js.coffee | 8 +++++--- app/controllers/projects/merge_requests_controller.rb | 3 +++ .../projects/merge_requests/widget/_show.html.haml | 2 +- features/steps/project/merge_requests/acceptance.rb | 4 ++-- .../merge_requests/merge_when_build_succeeds_spec.rb | 10 +++++----- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/merge_request_widget.js.coffee b/app/assets/javascripts/merge_request_widget.js.coffee index 5c30f1047fc9..0dd122fddcef 100644 --- a/app/assets/javascripts/merge_request_widget.js.coffee +++ b/app/assets/javascripts/merge_request_widget.js.coffee @@ -14,6 +14,7 @@ class @MergeRequestWidget @getInputs() @getButtons true + @getMergeStatus() if @opts.checkStatus $('#modal_merge_info').modal(show: false) @@ -99,6 +100,8 @@ class @MergeRequestWidget getMergeStatus: -> $.get @opts.mergeCheckUrl, (data) => @mergeRequestWidget.replaceWith(data) + @getButtons() + @getInputs() ciLabelForStatus: (status) -> switch status @@ -188,11 +191,10 @@ class @MergeRequestWidget .removeClass('btn-danger btn-warning btn-create') .addClass(css_class) - acceptMergeRequest: (e, url = null) -> + acceptMergeRequest: (e, url) -> e.preventDefault() if e @acceptMergeRequestInput.disable() @dynamicMergeButton.html ' Merge in progress' - $.ajax method: 'POST' url: url || @opts.mergePath @@ -202,7 +204,7 @@ class @MergeRequestWidget sha: @shaInput.val() commit_message: @commitMessageInput.val() merge_when_build_succeeds: @mergeWhenSucceedsInput.val() - should_remove_source_branch: @removeSourceBranchInput.val() if @removeSourceBranchInput.is ':checked' || removeSourceBranch + should_remove_source_branch: @removeSourceBranchInput.val() if @removeSourceBranchInput.is ':checked' .done (res) => if res.merge_in_progress @mergeInProgress res.merge_in_progress diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index f9676633cf27..0efde5c5e537 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -312,11 +312,13 @@ def merge # to wait until CI completes to know unless @merge_request.mergeable?(skip_ci_check: merge_when_build_succeeds_active?) @status = :failed + render_merge_request_widget_partial return end if params[:sha] != @merge_request.diff_head_sha @status = :sha_mismatch + render_merge_request_widget_partial return end @@ -327,6 +329,7 @@ def merge if params[:merge_when_build_succeeds].present? unless @merge_request.pipeline @status = :failed + render_merge_request_widget_partial return end diff --git a/app/views/projects/merge_requests/widget/_show.html.haml b/app/views/projects/merge_requests/widget/_show.html.haml index cf977740a74a..49661eb56589 100644 --- a/app/views/projects/merge_requests/widget/_show.html.haml +++ b/app/views/projects/merge_requests/widget/_show.html.haml @@ -19,4 +19,4 @@ pipelines_path: pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), merge_path: merge_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), cancel_merge_on_success_path: cancel_merge_when_build_succeeds_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request), - check_status: (@merge_request.open? && @merge_request.unchecked?) } } + check_status: (@merge_request.open? && @merge_request.unchecked? ? 'true' : 'false') } } diff --git a/features/steps/project/merge_requests/acceptance.rb b/features/steps/project/merge_requests/acceptance.rb index 4fda0731e2f2..e55e4b4ed2a7 100644 --- a/features/steps/project/merge_requests/acceptance.rb +++ b/features/steps/project/merge_requests/acceptance.rb @@ -19,11 +19,11 @@ class Spinach::Features::ProjectMergeRequestsAcceptance < Spinach::FeatureSteps end step 'I should see the Remove Source Branch button' do - expect(page).to have_link('Remove Source Branch') + expect(page).to have_button('Remove Source Branch') end step 'I should not see the Remove Source Branch button' do - expect(page).not_to have_link('Remove Source Branch') + expect(page).not_to have_button('Remove Source Branch') end step 'There is an open Merge Request' do diff --git a/spec/features/merge_requests/merge_when_build_succeeds_spec.rb b/spec/features/merge_requests/merge_when_build_succeeds_spec.rb index 60bc07bd1a0f..da867ca47cdb 100644 --- a/spec/features/merge_requests/merge_when_build_succeeds_spec.rb +++ b/spec/features/merge_requests/merge_when_build_succeeds_spec.rb @@ -30,7 +30,7 @@ end it 'activates Merge When Build Succeeds feature' do - expect(page).to have_link "Cancel Automatic Merge" + expect(page).to have_button "Cancel Automatic Merge" expect(page).to have_content "Set by #{user.name} to be merged automatically when the build succeeds." expect(page).to have_content "The source branch will not be removed." @@ -56,7 +56,7 @@ end it 'cancels the automatic merge' do - click_link "Cancel Automatic Merge" + click_button "Cancel Automatic Merge" expect(page).to have_button "Merge When Build Succeeds" @@ -65,9 +65,9 @@ end it "allows the user to remove the source branch" do - expect(page).to have_link "Remove Source Branch When Merged" + expect(page).to have_button "Remove Source Branch When Merged" - click_link "Remove Source Branch When Merged" + click_button "Remove Source Branch When Merged" expect(page).to have_content "The source branch will be removed" end end @@ -75,7 +75,7 @@ context 'Build is not active' do it "does not allow for enabling" do visit_merge_request(merge_request) - expect(page).not_to have_link "Merge When Build Succeeds" + expect(page).not_to have_button "Merge When Build Succeeds" end end -- GitLab From 8ae6d347806229d26d258b9b8de001351a4fb1af Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Sat, 23 Jul 2016 20:35:05 +0100 Subject: [PATCH 09/12] Fixing last tests, MR acceptance isn't quite right yes --- app/assets/javascripts/merge_request_widget.js.coffee | 3 ++- app/controllers/projects/merge_requests_controller.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/merge_request_widget.js.coffee b/app/assets/javascripts/merge_request_widget.js.coffee index 0dd122fddcef..5c12c9ebcc53 100644 --- a/app/assets/javascripts/merge_request_widget.js.coffee +++ b/app/assets/javascripts/merge_request_widget.js.coffee @@ -206,7 +206,8 @@ class @MergeRequestWidget merge_when_build_succeeds: @mergeWhenSucceedsInput.val() should_remove_source_branch: @removeSourceBranchInput.val() if @removeSourceBranchInput.is ':checked' .done (res) => - if res.merge_in_progress + console.log res, 'res' + if res.merge_in_progress? @mergeInProgress res.merge_in_progress else @mergeRequestWidgetBody.html res diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 0efde5c5e537..ac634b988ff4 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -356,7 +356,7 @@ def merge def render_merge_request_widget_partial case @status when :success - render json: { merge_in_progress: true } + render json: { merge_in_progress: params[:should_remove_source_branch] == '1' } when :merge_when_build_succeeds render partial: 'projects/merge_requests/widget/open/merge_when_build_succeeds', layout: false when :sha_mismatch -- GitLab From ad2271a1686cd18ba4fbac3b8b43552de10915ad Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Sat, 23 Jul 2016 22:39:17 +0100 Subject: [PATCH 10/12] Added logic for remove source branch AFTER merge, should fix final test failure --- .../javascripts/merge_request_widget.js.coffee | 16 ++++++++++++---- .../merge_requests/widget/_merged_buttons.haml | 2 +- .../merge_requests/widget/_show.html.haml | 1 + .../open/_merge_when_build_succeeds.html.haml | 2 +- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/merge_request_widget.js.coffee b/app/assets/javascripts/merge_request_widget.js.coffee index 5c12c9ebcc53..db8fda85ad32 100644 --- a/app/assets/javascripts/merge_request_widget.js.coffee +++ b/app/assets/javascripts/merge_request_widget.js.coffee @@ -47,6 +47,7 @@ class @MergeRequestWidget @cancelMergeOnSuccessButton = $('.js-cancel-automatic-merge') @mergeWhenSucceedsButton = $('.merge_when_build_succeeds') @removeSourceBranchButton = $('.remove_source_branch') + @removeSourceBranchWhenMergedButton = $('.remove_source_branch_when_merged') @addButtonEventListeners() unless skipListeners clearEventListeners: -> @@ -57,6 +58,7 @@ class @MergeRequestWidget @acceptMergeRequestButton.off 'click' @cancelMergeOnSuccessButton.off 'click' @removeSourceBranchButton.off 'click' + @removeSourceBranchWhenMergedButton.off 'click' cancelPolling: -> @cancel = true @@ -74,11 +76,12 @@ class @MergeRequestWidget @mergeWhenSucceedsButton.on 'click', (e) => @mergeWhenSucceedsInput.val '1' @acceptMergeRequest e + @removeSourceBranchWhenMergedButton.on 'click', (e) => + @mergeWhenSucceedsInput.val '1' + @acceptMergeRequest e, @removeSourceBranchWhenMergedButton.data 'url' @acceptMergeRequestButton.on 'click', (e) => @acceptMergeRequest e @cancelMergeOnSuccessButton.on 'click', (e) => @cancelMergeOnSuccess e - @removeSourceBranchButton.on 'click', (e) => - @mergeWhenSucceedsInput.val '1' - @acceptMergeRequest e, @removeSourceBranchButton.data 'url' + @removeSourceBranchButton.on 'click', (e) => @removeSourceBranch e mergeInProgress: (deleteSourceBranch = false) -> $.ajax @@ -206,7 +209,6 @@ class @MergeRequestWidget merge_when_build_succeeds: @mergeWhenSucceedsInput.val() should_remove_source_branch: @removeSourceBranchInput.val() if @removeSourceBranchInput.is ':checked' .done (res) => - console.log res, 'res' if res.merge_in_progress? @mergeInProgress res.merge_in_progress else @@ -223,3 +225,9 @@ class @MergeRequestWidget @mergeRequestWidgetBody.html res @getButtons() @getInputs() + + removeSourceBranch: (e) -> + e.preventDefault() + $.ajax + method: 'DELETE', + url: @opts.removePath diff --git a/app/views/projects/merge_requests/widget/_merged_buttons.haml b/app/views/projects/merge_requests/widget/_merged_buttons.haml index d836a2535070..ac096278b34a 100644 --- a/app/views/projects/merge_requests/widget/_merged_buttons.haml +++ b/app/views/projects/merge_requests/widget/_merged_buttons.haml @@ -5,7 +5,7 @@ - if can_remove_source_branch || mr_can_be_reverted || mr_can_be_cherry_picked .clearfix.merged-buttons - if can_remove_source_branch - = link_to namespace_project_branch_path(@merge_request.source_project.namespace, @merge_request.source_project, @merge_request.source_branch), remote: true, method: :delete, class: "btn btn-default btn-sm remove_source_branch" do + = button_tag class: "btn btn-default btn-sm remove_source_branch" do = icon('trash-o') Remove Source Branch - if mr_can_be_reverted diff --git a/app/views/projects/merge_requests/widget/_show.html.haml b/app/views/projects/merge_requests/widget/_show.html.haml index 49661eb56589..7aefdd565665 100644 --- a/app/views/projects/merge_requests/widget/_show.html.haml +++ b/app/views/projects/merge_requests/widget/_show.html.haml @@ -18,5 +18,6 @@ builds_path: builds_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), pipelines_path: pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), merge_path: merge_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), + remove_path: namespace_project_branch_path(@merge_request.source_project.namespace, @merge_request.source_project, @merge_request.source_branch), cancel_merge_on_success_path: cancel_merge_when_build_succeeds_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request), check_status: (@merge_request.open? && @merge_request.unchecked? ? 'true' : 'false') } } diff --git a/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml b/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml index acfee5463313..0239d151d6ec 100644 --- a/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml +++ b/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.haml @@ -16,7 +16,7 @@ - if remove_source_branch_button || user_can_cancel_automatic_merge .clearfix.prepend-top-10 - if remove_source_branch_button - = button_tag class: 'btn btn-grouped btn-primary btn-sm remove_source_branch', data: { url: merge_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request, merge_when_build_succeeds: true, should_remove_source_branch: true, sha: @merge_request.diff_head_sha) } do + = button_tag class: 'btn btn-grouped btn-primary btn-sm remove_source_branch_when_merged', data: { url: merge_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request, merge_when_build_succeeds: true, should_remove_source_branch: true, sha: @merge_request.diff_head_sha) } do = icon('times') Remove Source Branch When Merged -- GitLab From 03891a62a71cdab2810b90123d9ff9947403a9ca Mon Sep 17 00:00:00 2001 From: Luke Bennett Date: Wed, 27 Jul 2016 18:52:30 +0100 Subject: [PATCH 11/12] Updated for es5 --- app/assets/javascripts/dispatcher.js | 1 + app/assets/javascripts/dispatcher.js.coffee | 172 ------------- .../javascripts/merge_request_widget.js | 169 +++++++++++-- .../merge_request_widget.js.coffee | 233 ------------------ 4 files changed, 149 insertions(+), 426 deletions(-) delete mode 100644 app/assets/javascripts/dispatcher.js.coffee delete mode 100644 app/assets/javascripts/merge_request_widget.js.coffee diff --git a/app/assets/javascripts/dispatcher.js b/app/assets/javascripts/dispatcher.js index 99b16f7d59bd..0677880ec2ea 100644 --- a/app/assets/javascripts/dispatcher.js +++ b/app/assets/javascripts/dispatcher.js @@ -82,6 +82,7 @@ shortcut_handler = new ShortcutsIssuable(true); new ZenMode(); new MergedButtons(); + new MergeRequestWidget(); break; case 'projects:merge_requests:commits': case 'projects:merge_requests:builds': diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee deleted file mode 100644 index 36d55fe88e6d..000000000000 --- a/app/assets/javascripts/dispatcher.js.coffee +++ /dev/null @@ -1,172 +0,0 @@ -$ -> - new Dispatcher() - -class Dispatcher - constructor: () -> - @initSearch() - @initPageScripts() - - initPageScripts: -> - page = $('body').attr('data-page') - - unless page - return false - - path = page.split(':') - shortcut_handler = null - switch page - when 'projects:issues:index' - Issuable.init() - new IssuableBulkActions() - shortcut_handler = new ShortcutsNavigation() - when 'projects:issues:show' - new Issue() - shortcut_handler = new ShortcutsIssuable() - new ZenMode() - when 'projects:milestones:show', 'groups:milestones:show', 'dashboard:milestones:show' - new Milestone() - when 'dashboard:todos:index' - new Todos() - when 'projects:milestones:new', 'projects:milestones:edit' - new ZenMode() - new DueDateSelect() - new GLForm($('.milestone-form')) - when 'groups:milestones:new' - new ZenMode() - when 'projects:compare:show' - new Diff() - when 'projects:issues:new','projects:issues:edit' - shortcut_handler = new ShortcutsNavigation() - new GLForm($('.issue-form')) - new IssuableForm($('.issue-form')) - when 'projects:merge_requests:new', 'projects:merge_requests:edit' - new Diff() - shortcut_handler = new ShortcutsNavigation() - new GLForm($('.merge-request-form')) - new IssuableForm($('.merge-request-form')) - when 'projects:tags:new' - new ZenMode() - new GLForm($('.tag-form')) - when 'projects:releases:edit' - new ZenMode() - new GLForm($('.release-form')) - when 'projects:merge_requests:show' - new Diff() - shortcut_handler = new ShortcutsIssuable(true) - new ZenMode() - new MergedButtons() - new MergeRequestWidget() - when 'projects:merge_requests:commits', 'projects:merge_requests:builds' - new MergedButtons() - when "projects:merge_requests:diffs" - new Diff() - new ZenMode() - new MergedButtons() - when 'projects:merge_requests:index' - shortcut_handler = new ShortcutsNavigation() - Issuable.init() - when 'dashboard:activity' - new Activities() - when 'dashboard:projects:starred' - new Activities() - when 'projects:commit:show' - new Commit() - new Diff() - new ZenMode() - shortcut_handler = new ShortcutsNavigation() - when 'projects:commits:show', 'projects:activity' - shortcut_handler = new ShortcutsNavigation() - when 'projects:show' - shortcut_handler = new ShortcutsNavigation() - - new NotificationsForm() - new TreeView() if $('#tree-slider').length - when 'groups:activity' - new Activities() - when 'groups:show' - shortcut_handler = new ShortcutsNavigation() - new NotificationsForm() - new NotificationsDropdown() - when 'groups:group_members:index' - new GroupMembers() - new UsersSelect() - when 'projects:project_members:index' - new ProjectMembers() - new UsersSelect() - when 'groups:new', 'groups:edit', 'admin:groups:edit', 'admin:groups:new' - new GroupAvatar() - when 'projects:tree:show' - shortcut_handler = new ShortcutsNavigation() - new TreeView() - when 'projects:find_file:show' - shortcut_handler = true - when 'projects:blob:show', 'projects:blame:show' - new LineHighlighter() - shortcut_handler = new ShortcutsNavigation() - new ShortcutsBlob true - when 'projects:labels:new', 'projects:labels:edit' - new Labels() - when 'projects:labels:index' - new LabelManager() if $('.prioritized-labels').length - when 'projects:network:show' - # Ensure we don't create a particular shortcut handler here. This is - # already created, where the network graph is created. - shortcut_handler = true - when 'projects:forks:new' - new ProjectFork() - when 'projects:artifacts:browse' - new BuildArtifacts() - when 'projects:group_links:index' - new GroupsSelect() - when 'search:show' - new Search() - - switch path.first() - when 'admin' - new Admin() - switch path[1] - when 'groups' - new UsersSelect() - when 'projects' - new NamespaceSelects() - when 'dashboard', 'root' - shortcut_handler = new ShortcutsDashboardNavigation() - when 'profiles' - new NotificationsForm() - new NotificationsDropdown() - when 'projects' - new Project() - new ProjectAvatar() - switch path[1] - when 'compare' - new CompareAutocomplete() - when 'edit' - shortcut_handler = new ShortcutsNavigation() - new ProjectNew() - when 'new' - new ProjectNew() - when 'show' - new ProjectNew() - new ProjectShow() - new NotificationsDropdown() - when 'wikis' - new Wikis() - shortcut_handler = new ShortcutsNavigation() - new ZenMode() - new GLForm($('.wiki-form')) - when 'snippets' - shortcut_handler = new ShortcutsNavigation() - new ZenMode() if path[2] == 'show' - when 'labels', 'graphs', 'compare', 'pipelines', 'forks', \ - 'milestones', 'project_members', 'deploy_keys', 'builds', \ - 'hooks', 'services', 'protected_branches' - shortcut_handler = new ShortcutsNavigation() - - # If we haven't installed a custom shortcut handler, install the default one - if not shortcut_handler - new Shortcuts() - - initSearch: -> - - # Only when search form is present - new SearchAutocomplete() if $('.search').length diff --git a/app/assets/javascripts/merge_request_widget.js b/app/assets/javascripts/merge_request_widget.js index 7bbcdf598388..f90169497255 100644 --- a/app/assets/javascripts/merge_request_widget.js +++ b/app/assets/javascripts/merge_request_widget.js @@ -9,7 +9,15 @@ // merge_check_url - String, URL to use to check automerge status // ci_status_url - String, URL to use to check CI status // - this.opts = opts; + this.mergeRequestWidget = $('.mr-state-widget'); + this.mergeRequestWidgetBody = $('.mr-widget-body'); + this.opts = opts || $('.js-merge-request-widget-options').data(); + this.getInputs(); + this.getButtons(true); + if (this.opts.checkStatus) { + this.getMergeStatus(); + } + $('#modal_merge_info').modal({ show: false }); @@ -17,17 +25,49 @@ this.readyForCICheck = false; this.cancel = false; clearInterval(this.fetchBuildStatusInterval); + this.clearButtonEventListeners(); this.clearEventListeners(); + this.addButtonEventListeners(); this.addEventListeners(); this.getCIStatus(false); this.pollCIStatus(); notifyPermissions(); } + MergeRequestWidget.prototype.getInputs = function() { + this.acceptMergeRequestInput = $('.accept-mr-form :input'); + this.commitMessageInput = $('textarea[name=commit_message]'); + this.mergeWhenSucceedsInput = $('input[name=merge_when_build_succeeds]'); + this.removeSourceBranchInput = $('input[name=should_remove_source_branch]'); + this.shaInput = $('input[name=sha]'); + this.utfInput = $('input[name=utf8]'); + return this.authenticityTokenInput = $('input[name=authenticity_token]', this.mergeRequestWidget); + }; + + MergeRequestWidget.prototype.getButtons = function(skipListeners) { + this.dynamicMergeButton = $('.js-merge-button'); + this.acceptMergeRequestButton = $('.accept_merge_request'); + this.cancelMergeOnSuccessButton = $('.js-cancel-automatic-merge'); + this.mergeWhenSucceedsButton = $('.merge_when_build_succeeds'); + this.removeSourceBranchButton = $('.remove_source_branch'); + this.removeSourceBranchWhenMergedButton = $('.remove_source_branch_when_merged'); + if (!skipListeners) { + return this.addButtonEventListeners(); + } + }; + MergeRequestWidget.prototype.clearEventListeners = function() { return $(document).off('page:change.merge_request'); }; + MergeRequestWidget.prototype.clearButtonEventListeners = function() { + this.mergeWhenSucceedsButton.off('click'); + this.acceptMergeRequestButton.off('click'); + this.cancelMergeOnSuccessButton.off('click'); + this.removeSourceBranchButton.off('click'); + return this.removeSourceBranchWhenMergedButton.off('click'); + }; + MergeRequestWidget.prototype.cancelPolling = function() { return this.cancel = true; }; @@ -48,6 +88,36 @@ })(this)); }; + MergeRequestWidget.prototype.addButtonEventListeners = function() { + this.mergeWhenSucceedsButton.on('click', (function(_this) { + return function(e) { + _this.mergeWhenSucceedsInput.val('1'); + return _this.acceptMergeRequest(e); + }; + })(this)); + this.removeSourceBranchWhenMergedButton.on('click', (function(_this) { + return function(e) { + _this.mergeWhenSucceedsInput.val('1'); + return _this.acceptMergeRequest(e, _this.removeSourceBranchWhenMergedButton.data('url')); + }; + })(this)); + this.acceptMergeRequestButton.on('click', (function(_this) { + return function(e) { + return _this.acceptMergeRequest(e); + }; + })(this)); + this.cancelMergeOnSuccessButton.on('click', (function(_this) { + return function(e) { + return _this.cancelMergeOnSuccess(e); + }; + })(this)); + return this.removeSourceBranchButton.on('click', (function(_this) { + return function(e) { + return _this.removeSourceBranch(e); + }; + })(this)); + }; + MergeRequestWidget.prototype.mergeInProgress = function(deleteSourceBranch) { if (deleteSourceBranch == null) { deleteSourceBranch = false; @@ -55,30 +125,33 @@ return $.ajax({ type: 'GET', url: $('.merge-request').data('url'), + dataType: 'json', success: (function(_this) { return function(data) { - var callback, urlSuffix; + var urlSuffix; if (data.state === "merged") { urlSuffix = deleteSourceBranch ? '?deleted_source_branch=true' : ''; return window.location.href = window.location.pathname + urlSuffix; } else if (data.merge_error) { - return $('.mr-widget-body').html("

" + data.merge_error + "

"); + return _this.mergeRequestWidgetBody.html("

" + data.merge_error + "

"); } else { - callback = function() { - return merge_request_widget.mergeInProgress(deleteSourceBranch); - }; - return setTimeout(callback, 2000); + return setTimeout(function() { + return _this.mergeInProgress(deleteSourceBranch); + }, 2000); } }; - })(this), - dataType: 'json' + })(this) }); }; MergeRequestWidget.prototype.getMergeStatus = function() { - return $.get(this.opts.merge_check_url, function(data) { - return $('.mr-state-widget').replaceWith(data); - }); + return $.get(this.opts.mergeCheckUrl, (function(_this) { + return function(data) { + _this.mergeRequestWidget.replaceWith(data); + _this.getButtons(); + return _this.getInputs(); + }; + })(this)); }; MergeRequestWidget.prototype.ciLabelForStatus = function(status) { @@ -108,7 +181,7 @@ var _this; _this = this; $('.ci-widget-fetching').show(); - return $.getJSON(this.opts.ci_status_url, (function(_this) { + return $.getJSON(this.opts.ciStatusUrl, (function(_this) { return function(data) { var message, status, title; if (_this.cancel) { @@ -118,8 +191,8 @@ if (data.status === '') { return; } - if (_this.firstCICheck || data.status !== _this.opts.ci_status && (data.status != null)) { - _this.opts.ci_status = data.status; + if (_this.firstCICheck || data.status !== _this.opts.ciStatus && (data.status != null)) { + _this.opts.ciStatus = data.status; _this.showCIStatus(data.status); if (data.coverage) { _this.showCICoverage(data.coverage); @@ -129,19 +202,19 @@ if (showNotification && !_this.firstCICheck) { status = _this.ciLabelForStatus(data.status); if (status === "preparing") { - title = _this.opts.ci_title.preparing; + title = _this.opts.ciTitle.preparing; status = status.charAt(0).toUpperCase() + status.slice(1); - message = _this.opts.ci_message.preparing.replace('{{status}}', status); + message = _this.opts.ciMessage.preparing.replace('{{status}}', status); } else { - title = _this.opts.ci_title.normal; - message = _this.opts.ci_message.normal.replace('{{status}}', status); + title = _this.opts.ciTitle.normal; + message = _this.opts.ciMessage.normal.replace('{{status}}', status); } title = title.replace('{{status}}', status); message = message.replace('{{sha}}', data.sha); message = message.replace('{{title}}', data.title); - notify(title, message, _this.opts.gitlab_icon, function() { + notify(title, message, _this.opts.gitlabIcon, function() { this.close(); - return Turbolinks.visit(_this.opts.builds_path); + return Turbolinks.visit(_this.opts.buildsPath); }); } return _this.firstCICheck = false; @@ -186,6 +259,60 @@ return $('.js-merge-button,.accept-action .dropdown-toggle').removeClass('btn-danger btn-warning btn-create').addClass(css_class); }; + MergeRequestWidget.prototype.acceptMergeRequest = function(e, url) { + if (e) { + e.preventDefault(); + } + this.acceptMergeRequestInput.disable(); + this.dynamicMergeButton.html(' Merge in progress'); + return $.ajax({ + method: 'POST', + url: url || this.opts.mergePath, + data: { + utf8: this.utfInput.val(), + authenticity_token: this.authenticityTokenInput.val(), + sha: this.shaInput.val(), + commit_message: this.commitMessageInput.val(), + merge_when_build_succeeds: this.mergeWhenSucceedsInput.val(), + should_remove_source_branch: this.removeSourceBranchInput.is(':checked') ? this.removeSourceBranchInput.val() : void 0 + } + }).done((function(_this) { + return function(res) { + if (res.merge_in_progress != null) { + return _this.mergeInProgress(res.merge_in_progress); + } else { + _this.mergeRequestWidgetBody.html(res); + _this.getButtons(); + return _this.getInputs(); + } + }; + })(this)); + }; + + MergeRequestWidget.prototype.cancelMergeOnSuccess = function(e) { + if (e) { + e.preventDefault(); + } + return $.ajax({ + method: 'POST', + url: this.opts.cancelMergeOnSuccessPath + }).done((function(_this) { + return function(res) { + _this.mergeRequestWidgetBody.html(res); + _this.getButtons(); + return _this.getInputs(); + }; + })(this)); + }; + + MergeRequestWidget.prototype.removeSourceBranch = function(e) { + e.preventDefault(); + return $.ajax({ + method: 'DELETE', + url: this.opts.removePath + }); + }; + return MergeRequestWidget; })(); diff --git a/app/assets/javascripts/merge_request_widget.js.coffee b/app/assets/javascripts/merge_request_widget.js.coffee deleted file mode 100644 index db8fda85ad32..000000000000 --- a/app/assets/javascripts/merge_request_widget.js.coffee +++ /dev/null @@ -1,233 +0,0 @@ -class @MergeRequestWidget - # Initialize MergeRequestWidget behavior - # - # checkEnable - Boolean, whether to check automerge status - # mergeCheckUrl - String, URL to use to check automerge status - # ciStatusUrl - String, URL to use to check CI status - # - - constructor: (opts) -> - @mergeRequestWidget = $('.mr-state-widget') - @mergeRequestWidgetBody = $('.mr-widget-body') - - @opts = opts || $('.js-merge-request-widget-options').data() - - @getInputs() - @getButtons true - - @getMergeStatus() if @opts.checkStatus - - $('#modal_merge_info').modal(show: false) - @firstCICheck = true - @readyForCICheck = false - @cancel = false - clearInterval @fetchBuildStatusInterval - - @clearButtonEventListeners() - @clearEventListeners() - @addButtonEventListeners() - @addEventListeners() - @getCIStatus(false) - @pollCIStatus() - notifyPermissions() - - getInputs: -> - @acceptMergeRequestInput = $('.accept-mr-form :input') - @commitMessageInput = $('textarea[name=commit_message]') - @mergeWhenSucceedsInput = $('input[name=merge_when_build_succeeds]') - @removeSourceBranchInput = $('input[name=should_remove_source_branch]') - @shaInput = $('input[name=sha]') - @utfInput = $('input[name=utf8]') - - @authenticityTokenInput = $('input[name=authenticity_token]', @mergeRequestWidget) - - getButtons: (skipListeners) -> - @dynamicMergeButton = $('.js-merge-button') - @acceptMergeRequestButton = $('.accept_merge_request') - @cancelMergeOnSuccessButton = $('.js-cancel-automatic-merge') - @mergeWhenSucceedsButton = $('.merge_when_build_succeeds') - @removeSourceBranchButton = $('.remove_source_branch') - @removeSourceBranchWhenMergedButton = $('.remove_source_branch_when_merged') - @addButtonEventListeners() unless skipListeners - - clearEventListeners: -> - $(document).off 'page:change.merge_request' - - clearButtonEventListeners: -> - @mergeWhenSucceedsButton.off 'click' - @acceptMergeRequestButton.off 'click' - @cancelMergeOnSuccessButton.off 'click' - @removeSourceBranchButton.off 'click' - @removeSourceBranchWhenMergedButton.off 'click' - - cancelPolling: -> - @cancel = true - - addEventListeners: -> - allowedPages = ['show', 'commits', 'builds', 'changes'] - $(document).on 'page:change.merge_request', => - page = $('body').data('page').split(':').last() - if allowedPages.indexOf(page) < 0 - clearInterval @fetchBuildStatusInterval - @cancelPolling() - @clearEventListeners() - - addButtonEventListeners: -> - @mergeWhenSucceedsButton.on 'click', (e) => - @mergeWhenSucceedsInput.val '1' - @acceptMergeRequest e - @removeSourceBranchWhenMergedButton.on 'click', (e) => - @mergeWhenSucceedsInput.val '1' - @acceptMergeRequest e, @removeSourceBranchWhenMergedButton.data 'url' - @acceptMergeRequestButton.on 'click', (e) => @acceptMergeRequest e - @cancelMergeOnSuccessButton.on 'click', (e) => @cancelMergeOnSuccess e - @removeSourceBranchButton.on 'click', (e) => @removeSourceBranch e - - mergeInProgress: (deleteSourceBranch = false) -> - $.ajax - type: 'GET' - url: $('.merge-request').data('url') - dataType: 'json' - success: (data) => - if data.state == "merged" - urlSuffix = if deleteSourceBranch then '?delete_source=true' else '' - - window.location.href = window.location.pathname + urlSuffix - else if data.merge_error - @mergeRequestWidgetBody.html("

" + data.merge_error + "

") - else - setTimeout => - @mergeInProgress(deleteSourceBranch) - , 2000 - - getMergeStatus: -> - $.get @opts.mergeCheckUrl, (data) => - @mergeRequestWidget.replaceWith(data) - @getButtons() - @getInputs() - - ciLabelForStatus: (status) -> - switch status - when 'success' - 'passed' - when 'success_with_warnings' - 'passed with warnings' - else - status - - pollCIStatus: -> - @fetchBuildStatusInterval = setInterval ( => - return if not @readyForCICheck - - @getCIStatus(true) - - @readyForCICheck = false - ), 10000 - - getCIStatus: (showNotification) -> - _this = @ - $('.ci-widget-fetching').show() - - $.getJSON @opts.ciStatusUrl, (data) => - return if @cancel - @readyForCICheck = true - - if data.status is '' - return - - if @firstCICheck || data.status isnt @opts.ciStatus and data.status? - @opts.ciStatus = data.status - @showCIStatus data.status - if data.coverage - @showCICoverage data.coverage - - # The first check should only update the UI, a notification - # should only be displayed on status changes - if showNotification and not @firstCICheck - status = @ciLabelForStatus(data.status) - - if status is "preparing" - title = @opts.ciTitle.preparing - status = status.charAt(0).toUpperCase() + status.slice(1) - message = @opts.ciMessage.preparing.replace('{{status}}', status) - else - title = @opts.ciTitle.normal - message = @opts.ciMessage.normal.replace('{{status}}', status) - - title = title.replace('{{status}}', status) - message = message.replace('{{sha}}', data.sha) - message = message.replace('{{title}}', data.title) - - notify( - title, - message, - @opts.gitlabIcon, - -> - @close() - Turbolinks.visit _this.opts.buildsPath - ) - @firstCICheck = false - - showCIStatus: (state) -> - return if not state? - $('.ci_widget').hide() - allowed_states = ["failed", "canceled", "running", "pending", "success", "success_with_warnings", "skipped", "not_found"] - if state in allowed_states - $('.ci_widget.ci-' + state).show() - switch state - when "failed", "canceled", "not_found" - @setMergeButtonClass('btn-danger') - when "running" - @setMergeButtonClass('btn-warning') - when "success", "success_with_warnings" - @setMergeButtonClass('btn-create') - else - $('.ci_widget.ci-error').show() - @setMergeButtonClass('btn-danger') - - showCICoverage: (coverage) -> - text = 'Coverage ' + coverage + '%' - $('.ci_widget:visible .ci-coverage').text(text) - - setMergeButtonClass: (css_class) -> - $('.js-merge-button,.accept-action .dropdown-toggle') - .removeClass('btn-danger btn-warning btn-create') - .addClass(css_class) - - acceptMergeRequest: (e, url) -> - e.preventDefault() if e - @acceptMergeRequestInput.disable() - @dynamicMergeButton.html ' Merge in progress' - $.ajax - method: 'POST' - url: url || @opts.mergePath - data: - utf8: @utfInput.val() - authenticity_token: @authenticityTokenInput.val() - sha: @shaInput.val() - commit_message: @commitMessageInput.val() - merge_when_build_succeeds: @mergeWhenSucceedsInput.val() - should_remove_source_branch: @removeSourceBranchInput.val() if @removeSourceBranchInput.is ':checked' - .done (res) => - if res.merge_in_progress? - @mergeInProgress res.merge_in_progress - else - @mergeRequestWidgetBody.html res - @getButtons() - @getInputs() - - cancelMergeOnSuccess: (e) -> - e.preventDefault() if e - $.ajax - method: 'POST' - url: @opts.cancelMergeOnSuccessPath - .done (res) => - @mergeRequestWidgetBody.html res - @getButtons() - @getInputs() - - removeSourceBranch: (e) -> - e.preventDefault() - $.ajax - method: 'DELETE', - url: @opts.removePath -- GitLab From becead3fbde6b8da6a10b29297db887fcb229f33 Mon Sep 17 00:00:00 2001 From: Luke Bennett Date: Sat, 13 Aug 2016 21:51:34 +0100 Subject: [PATCH 12/12] Review changes --- .../javascripts/merge_request_widget.js | 245 +++++++----------- .../projects/merge_requests_controller.rb | 15 +- app/helpers/merge_requests_helper.rb | 25 ++ .../merge_requests/widget/_show.html.haml | 15 +- 4 files changed, 129 insertions(+), 171 deletions(-) diff --git a/app/assets/javascripts/merge_request_widget.js b/app/assets/javascripts/merge_request_widget.js index f90169497255..c733dadd22e4 100644 --- a/app/assets/javascripts/merge_request_widget.js +++ b/app/assets/javascripts/merge_request_widget.js @@ -14,10 +14,7 @@ this.opts = opts || $('.js-merge-request-widget-options').data(); this.getInputs(); this.getButtons(true); - if (this.opts.checkStatus) { - this.getMergeStatus(); - } - + if (this.opts.checkStatus) this.getMergeStatus(); $('#modal_merge_info').modal({ show: false }); @@ -51,9 +48,7 @@ this.mergeWhenSucceedsButton = $('.merge_when_build_succeeds'); this.removeSourceBranchButton = $('.remove_source_branch'); this.removeSourceBranchWhenMergedButton = $('.remove_source_branch_when_merged'); - if (!skipListeners) { - return this.addButtonEventListeners(); - } + if (!skipListeners) return this.addButtonEventListeners(); }; MergeRequestWidget.prototype.clearEventListeners = function() { @@ -73,85 +68,65 @@ }; MergeRequestWidget.prototype.addEventListeners = function() { - var allowedPages; - allowedPages = ['show', 'commits', 'builds', 'pipelines', 'changes']; - return $(document).on('page:change.merge_request', (function(_this) { - return function() { - var page; - page = $('body').data('page').split(':').last(); - if (allowedPages.indexOf(page) < 0) { - clearInterval(_this.fetchBuildStatusInterval); - _this.cancelPolling(); - return _this.clearEventListeners(); - } - }; - })(this)); + var allowedPages = ['show', 'commits', 'builds', 'pipelines', 'changes']; + return $(document).on('page:change.merge_request', (function() { + var page = $('body').data('page').split(':').last(); + if (allowedPages.indexOf(page) < 0) { + clearInterval(this.fetchBuildStatusInterval); + this.cancelPolling(); + return this.clearEventListeners(); + } + }).bind(this)); }; MergeRequestWidget.prototype.addButtonEventListeners = function() { - this.mergeWhenSucceedsButton.on('click', (function(_this) { - return function(e) { - _this.mergeWhenSucceedsInput.val('1'); - return _this.acceptMergeRequest(e); - }; - })(this)); - this.removeSourceBranchWhenMergedButton.on('click', (function(_this) { - return function(e) { - _this.mergeWhenSucceedsInput.val('1'); - return _this.acceptMergeRequest(e, _this.removeSourceBranchWhenMergedButton.data('url')); - }; - })(this)); - this.acceptMergeRequestButton.on('click', (function(_this) { - return function(e) { - return _this.acceptMergeRequest(e); - }; - })(this)); - this.cancelMergeOnSuccessButton.on('click', (function(_this) { - return function(e) { - return _this.cancelMergeOnSuccess(e); - }; - })(this)); - return this.removeSourceBranchButton.on('click', (function(_this) { - return function(e) { - return _this.removeSourceBranch(e); - }; - })(this)); + this.mergeWhenSucceedsButton.on('click', (function(e) { + this.mergeWhenSucceedsInput.val('1'); + return this.acceptMergeRequest(e); + }).bind(this)); + this.removeSourceBranchWhenMergedButton.on('click', (function(e) { + this.mergeWhenSucceedsInput.val('1'); + return this.acceptMergeRequest(e, this.removeSourceBranchWhenMergedButton.data('url')); + }).bind(this)); + this.acceptMergeRequestButton.on('click', (function(e) { + return this.acceptMergeRequest(e); + }).bind(this)); + this.cancelMergeOnSuccessButton.on('click', (function(e) { + return this.cancelMergeOnSuccess(e); + }).bind(this)); + return this.removeSourceBranchButton.on('click', (function(e) { + return this.removeSourceBranch(e); + }).bind(this)); }; MergeRequestWidget.prototype.mergeInProgress = function(deleteSourceBranch) { - if (deleteSourceBranch == null) { - deleteSourceBranch = false; - } + if (deleteSourceBranch == null) deleteSourceBranch = false; + return $.ajax({ type: 'GET', url: $('.merge-request').data('url'), dataType: 'json', - success: (function(_this) { - return function(data) { - var urlSuffix; - if (data.state === "merged") { - urlSuffix = deleteSourceBranch ? '?deleted_source_branch=true' : ''; - return window.location.href = window.location.pathname + urlSuffix; - } else if (data.merge_error) { - return _this.mergeRequestWidgetBody.html("

" + data.merge_error + "

"); - } else { - return setTimeout(function() { - return _this.mergeInProgress(deleteSourceBranch); - }, 2000); - } - }; - })(this) + success: (function(data) { + if (data.state === "merged") { + var urlSuffix = deleteSourceBranch ? '?deleted_source_branch=true' : ''; + return window.location.href = window.location.pathname + urlSuffix; + } else if (data.merge_error) { + return this.mergeRequestWidgetBody.html("

" + data.merge_error + "

"); + } else { + return setTimeout((function() { + return this.mergeInProgress(deleteSourceBranch); + }).bind(this), 2000); + } + }).bind(this) }); }; MergeRequestWidget.prototype.getMergeStatus = function() { - return $.get(this.opts.mergeCheckUrl, (function(_this) { - return function(data) { - _this.mergeRequestWidget.replaceWith(data); - _this.getButtons(); - return _this.getInputs(); - }; - })(this)); + return $.get(this.opts.mergeCheckUrl, (function(data) { + this.mergeRequestWidget.replaceWith(data); + this.getButtons(); + return this.getInputs(); + }).bind(this)); }; MergeRequestWidget.prototype.ciLabelForStatus = function(status) { @@ -166,68 +141,50 @@ }; MergeRequestWidget.prototype.pollCIStatus = function() { - return this.fetchBuildStatusInterval = setInterval(((function(_this) { - return function() { - if (!_this.readyForCICheck) { - return; - } - _this.getCIStatus(true); - return _this.readyForCICheck = false; - }; - })(this)), 10000); + return this.fetchBuildStatusInterval = setInterval((function() { + if (!this.readyForCICheck) return; + this.getCIStatus(true); + return this.readyForCICheck = false; + }).bind(this), 10000); }; MergeRequestWidget.prototype.getCIStatus = function(showNotification) { - var _this; - _this = this; $('.ci-widget-fetching').show(); - return $.getJSON(this.opts.ciStatusUrl, (function(_this) { - return function(data) { - var message, status, title; - if (_this.cancel) { - return; - } - _this.readyForCICheck = true; - if (data.status === '') { - return; - } - if (_this.firstCICheck || data.status !== _this.opts.ciStatus && (data.status != null)) { - _this.opts.ciStatus = data.status; - _this.showCIStatus(data.status); - if (data.coverage) { - _this.showCICoverage(data.coverage); - } - // The first check should only update the UI, a notification - // should only be displayed on status changes - if (showNotification && !_this.firstCICheck) { - status = _this.ciLabelForStatus(data.status); - if (status === "preparing") { - title = _this.opts.ciTitle.preparing; - status = status.charAt(0).toUpperCase() + status.slice(1); - message = _this.opts.ciMessage.preparing.replace('{{status}}', status); - } else { - title = _this.opts.ciTitle.normal; - message = _this.opts.ciMessage.normal.replace('{{status}}', status); - } - title = title.replace('{{status}}', status); - message = message.replace('{{sha}}', data.sha); - message = message.replace('{{title}}', data.title); - notify(title, message, _this.opts.gitlabIcon, function() { - this.close(); - return Turbolinks.visit(_this.opts.buildsPath); - }); + return $.getJSON(this.opts.ciStatusUrl, (function(data) { + var message, status, title; + if (this.cancel) return; + this.readyForCICheck = true; + if (data.status === '') return; + if (this.firstCICheck || data.status !== this.opts.ciStatus && (data.status != null)) { + this.opts.ciStatus = data.status; + this.showCIStatus(data.status); + if (data.coverage) this.showCICoverage(data.coverage); + if (showNotification && !this.firstCICheck) { + status = this.ciLabelForStatus(data.status); + if (status === "preparing") { + title = this.opts.ciTitle.preparing; + status = status.charAt(0).toUpperCase() + status.slice(1); + message = this.opts.ciMessage.preparing.replace('{{status}}', status); + } else { + title = this.opts.ciTitle.normal; + message = this.opts.ciMessage.normal.replace('{{status}}', status); } - return _this.firstCICheck = false; + title = title.replace('{{status}}', status); + message = message.replace('{{sha}}', data.sha); + message = message.replace('{{title}}', data.title); + notify(title, message, this.opts.gitlabIcon, function() { + this.close(); + return Turbolinks.visit(this.opts.buildsPath); + }); } - }; - })(this)); + return this.firstCICheck = false; + } + }).bind(this)); }; MergeRequestWidget.prototype.showCIStatus = function(state) { var allowed_states; - if (state == null) { - return; - } + if (state == null) return; $('.ci_widget').hide(); allowed_states = ["failed", "canceled", "running", "pending", "success", "success_with_warnings", "skipped", "not_found"]; if (indexOf.call(allowed_states, state) >= 0) { @@ -260,9 +217,7 @@ }; MergeRequestWidget.prototype.acceptMergeRequest = function(e, url) { - if (e) { - e.preventDefault(); - } + if (e) e.preventDefault(); this.acceptMergeRequestInput.disable(); this.dynamicMergeButton.html(' Merge in progress'); return $.ajax({ @@ -276,33 +231,27 @@ merge_when_build_succeeds: this.mergeWhenSucceedsInput.val(), should_remove_source_branch: this.removeSourceBranchInput.is(':checked') ? this.removeSourceBranchInput.val() : void 0 } - }).done((function(_this) { - return function(res) { - if (res.merge_in_progress != null) { - return _this.mergeInProgress(res.merge_in_progress); - } else { - _this.mergeRequestWidgetBody.html(res); - _this.getButtons(); - return _this.getInputs(); - } - }; - })(this)); + }).done((function(res) { + if (res.merge_in_progress != null) { + return this.mergeInProgress(res.merge_in_progress); + } else { + this.mergeRequestWidgetBody.html(res); + this.getButtons(); + return this.getInputs(); + } + }).bind(this)); }; MergeRequestWidget.prototype.cancelMergeOnSuccess = function(e) { - if (e) { - e.preventDefault(); - } + if (e) e.preventDefault(); return $.ajax({ method: 'POST', url: this.opts.cancelMergeOnSuccessPath - }).done((function(_this) { - return function(res) { - _this.mergeRequestWidgetBody.html(res); - _this.getButtons(); - return _this.getInputs(); - }; - })(this)); + }).done((function(res) { + this.mergeRequestWidgetBody.html(res); + this.getButtons(); + return this.getInputs(); + }).bind(this)); }; MergeRequestWidget.prototype.removeSourceBranch = function(e) { diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index ac634b988ff4..0c34ddebe777 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -312,14 +312,12 @@ def merge # to wait until CI completes to know unless @merge_request.mergeable?(skip_ci_check: merge_when_build_succeeds_active?) @status = :failed - render_merge_request_widget_partial - return + return render_widget(@status) end if params[:sha] != @merge_request.diff_head_sha @status = :sha_mismatch - render_merge_request_widget_partial - return + return render_widget(@status) end TodoService.new.merge_merge_request(merge_request, current_user) @@ -329,8 +327,7 @@ def merge if params[:merge_when_build_succeeds].present? unless @merge_request.pipeline @status = :failed - render_merge_request_widget_partial - return + return render_widget(@status) end if @merge_request.pipeline.active? @@ -350,11 +347,11 @@ def merge @status = :success end - render_merge_request_widget_partial + render_widget(@status) end - def render_merge_request_widget_partial - case @status + def render_widget(status) + case status when :success render json: { merge_in_progress: params[:should_remove_source_branch] == '1' } when :merge_when_build_succeeds diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index 8abe7865fed2..216c11012d4b 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -110,4 +110,29 @@ def merge_request_version_path(project, merge_request, merge_request_diff, start def version_index(merge_request_diff) @merge_request_diffs.size - @merge_request_diffs.index(merge_request_diff) end + + def widget_options + { + merge_check_url: merge_check_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), + check_enable: (@merge_request.unchecked? ? 'true' : 'false'), + ci_status_url: ci_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), + gitlab_icon: asset_path('gitlab_logo.png'), + ci_status: (@merge_request.pipeline ? @merge_request.pipeline.status : ''), + ci_message: { + normal: 'Build {{status}} for "{{title}}"', + preparing: '{{status}} build for "{{title}}"' + }, + ci_enable: (@project.ci_service ? 'true' : 'false'), + ci_title: { + preparing: "{{status}} build", + normal: "Build {{status}}" + }, + builds_path: builds_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), + pipelines_path: pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), + merge_path: merge_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), + remove_path: namespace_project_branch_path(@merge_request.source_project.namespace, @merge_request.source_project, @merge_request.source_branch), + cancel_merge_on_success_path: cancel_merge_when_build_succeeds_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request), + check_status: (@merge_request.open? && @merge_request.unchecked? ? 'true' : 'false') + } + end end diff --git a/app/views/projects/merge_requests/widget/_show.html.haml b/app/views/projects/merge_requests/widget/_show.html.haml index 7aefdd565665..ba3cf18b4a4c 100644 --- a/app/views/projects/merge_requests/widget/_show.html.haml +++ b/app/views/projects/merge_requests/widget/_show.html.haml @@ -7,17 +7,4 @@ - elsif @merge_request.locked? = render 'projects/merge_requests/widget/locked' -.js-merge-request-widget-options{ data: { merge_check_url: merge_check_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), - check_enable: (@merge_request.unchecked? ? 'true' : 'false'), - ci_status_url: ci_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), - gitlab_icon: asset_path('gitlab_logo.png'), - ci_status: (@merge_request.pipeline ? @merge_request.pipeline.status : ''), - ci_message: { normal: 'Build {{status}} for "{{title}}"', preparing: '{{status}} build for "{{title}}"' }, - ci_enable: (@project.ci_service ? 'true' : 'false'), - ci_title: { preparing: "{{status}} build", normal: "Build {{status}}" }, - builds_path: builds_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), - pipelines_path: pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), - merge_path: merge_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), - remove_path: namespace_project_branch_path(@merge_request.source_project.namespace, @merge_request.source_project, @merge_request.source_branch), - cancel_merge_on_success_path: cancel_merge_when_build_succeeds_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request), - check_status: (@merge_request.open? && @merge_request.unchecked? ? 'true' : 'false') } } +.js-merge-request-widget-options{ data: widget_options } -- GitLab