Commit ec8628fa95b54dae3a0a680e3df043ba01c3e0de

Authored by Dmitriy Zaporozhets
2 parents 9d637d57 70212889

Merge branch 'feature/mr_context' into 'master'

Allow change assignee/milestone from MergeRequest show page
app/assets/javascripts/merge_request.js.coffee 0 → 100644
... ... @@ -0,0 +1,103 @@
  1 +class MergeRequest
  2 + constructor: (@opts) ->
  3 + @initContextWidget()
  4 + this.$el = $('.merge-request')
  5 + @diffs_loaded = if @opts.action == 'diffs' then true else false
  6 + @commits_loaded = false
  7 +
  8 + this.activateTab(@opts.action)
  9 +
  10 + this.bindEvents()
  11 +
  12 + this.initMergeWidget()
  13 + this.$('.show-all-commits').on 'click', =>
  14 + this.showAllCommits()
  15 +
  16 + modal = $('#modal_merge_info').modal(show: false)
  17 +
  18 + disableButtonIfEmptyField '#merge_commit_message', '.accept_merge_request'
  19 +
  20 +
  21 + # Local jQuery finder
  22 + $: (selector) ->
  23 + this.$el.find(selector)
  24 +
  25 + initContextWidget: ->
  26 + $('.edit-merge_request.inline-update input[type="submit"]').hide()
  27 + $(".issue-box .inline-update").on "change", "select", ->
  28 + $(this).submit()
  29 + $(".issue-box .inline-update").on "change", "#merge_request_assignee_id", ->
  30 + $(this).submit()
  31 +
  32 + initMergeWidget: ->
  33 + this.showState( @opts.current_status )
  34 +
  35 + if this.$('.automerge_widget').length and @opts.check_enable
  36 + $.get @opts.url_to_automerge_check, (data) =>
  37 + this.showState( data.merge_status )
  38 + , 'json'
  39 +
  40 + if @opts.ci_enable
  41 + $.get @opts.url_to_ci_check, (data) =>
  42 + this.showCiState data.status
  43 + , 'json'
  44 +
  45 + bindEvents: ->
  46 + this.$('.nav-tabs').on 'click', 'a', (event) =>
  47 + a = $(event.currentTarget)
  48 +
  49 + href = a.attr('href')
  50 + History.replaceState {path: href}, document.title, href
  51 +
  52 + event.preventDefault()
  53 +
  54 + this.$('.nav-tabs').on 'click', 'li', (event) =>
  55 + this.activateTab($(event.currentTarget).data('action'))
  56 +
  57 + this.$('.accept_merge_request').on 'click', ->
  58 + $('.automerge_widget.can_be_merged').hide()
  59 + $('.merge-in-progress').show()
  60 +
  61 + activateTab: (action) ->
  62 + this.$('.nav-tabs li').removeClass 'active'
  63 + this.$('.tab-content').hide()
  64 + switch action
  65 + when 'diffs'
  66 + this.$('.nav-tabs .diffs-tab').addClass 'active'
  67 + this.loadDiff() unless @diffs_loaded
  68 + this.$('.diffs').show()
  69 + else
  70 + this.$('.nav-tabs .notes-tab').addClass 'active'
  71 + this.$('.notes').show()
  72 +
  73 + showState: (state) ->
  74 + $('.automerge_widget').hide()
  75 + $('.automerge_widget.' + state).show()
  76 +
  77 + showCiState: (state) ->
  78 + $('.ci_widget').hide()
  79 + $('.ci_widget.ci-' + state).show()
  80 +
  81 + loadDiff: (event) ->
  82 + $.ajax
  83 + type: 'GET'
  84 + url: this.$('.nav-tabs .diffs-tab a').attr('href')
  85 + beforeSend: =>
  86 + this.$('.status').addClass 'loading'
  87 + complete: =>
  88 + @diffs_loaded = true
  89 + this.$('.status').removeClass 'loading'
  90 + success: (data) =>
  91 + this.$(".diffs").html(data.html)
  92 + dataType: 'json'
  93 +
  94 + showAllCommits: ->
  95 + this.$('.first-commits').remove()
  96 + this.$('.all-commits').removeClass 'hide'
  97 +
  98 + alreadyOrCannotBeMerged: ->
  99 + this.$('.automerge_widget').hide()
  100 + this.$('.merge-in-progress').hide()
  101 + this.$('.automerge_widget.already_cannot_be_merged').show()
  102 +
  103 +this.MergeRequest = MergeRequest
... ...
app/assets/javascripts/merge_requests.js.coffee
... ... @@ -6,99 +6,3 @@
6 6 $('#milestone_id').select2()
7 7 $('#milestone_id, #assignee_id').on 'change', ->
8 8 $(this).closest('form').submit()
9   -
10   -class MergeRequest
11   -
12   - constructor: (@opts) ->
13   - this.$el = $('.merge-request')
14   - @diffs_loaded = if @opts.action == 'diffs' then true else false
15   - @commits_loaded = false
16   -
17   - this.activateTab(@opts.action)
18   -
19   - this.bindEvents()
20   -
21   - this.initMergeWidget()
22   - this.$('.show-all-commits').on 'click', =>
23   - this.showAllCommits()
24   -
25   - modal = $('#modal_merge_info').modal(show: false)
26   -
27   - disableButtonIfEmptyField '#merge_commit_message', '.accept_merge_request'
28   -
29   - # Local jQuery finder
30   - $: (selector) ->
31   - this.$el.find(selector)
32   -
33   - initMergeWidget: ->
34   - this.showState( @opts.current_status )
35   -
36   - if this.$('.automerge_widget').length and @opts.check_enable
37   - $.get @opts.url_to_automerge_check, (data) =>
38   - this.showState( data.merge_status )
39   - , 'json'
40   -
41   - if @opts.ci_enable
42   - $.get @opts.url_to_ci_check, (data) =>
43   - this.showCiState data.status
44   - , 'json'
45   -
46   - bindEvents: ->
47   - this.$('.nav-tabs').on 'click', 'a', (event) =>
48   - a = $(event.currentTarget)
49   -
50   - href = a.attr('href')
51   - History.replaceState {path: href}, document.title, href
52   -
53   - event.preventDefault()
54   -
55   - this.$('.nav-tabs').on 'click', 'li', (event) =>
56   - this.activateTab($(event.currentTarget).data('action'))
57   -
58   - this.$('.accept_merge_request').on 'click', ->
59   - $('.automerge_widget.can_be_merged').hide()
60   - $('.merge-in-progress').show()
61   -
62   - activateTab: (action) ->
63   - this.$('.nav-tabs li').removeClass 'active'
64   - this.$('.tab-content').hide()
65   - switch action
66   - when 'diffs'
67   - this.$('.nav-tabs .diffs-tab').addClass 'active'
68   - this.loadDiff() unless @diffs_loaded
69   - this.$('.diffs').show()
70   - else
71   - this.$('.nav-tabs .notes-tab').addClass 'active'
72   - this.$('.notes').show()
73   -
74   - showState: (state) ->
75   - $('.automerge_widget').hide()
76   - $('.automerge_widget.' + state).show()
77   -
78   - showCiState: (state) ->
79   - $('.ci_widget').hide()
80   - $('.ci_widget.ci-' + state).show()
81   -
82   - loadDiff: (event) ->
83   - $.ajax
84   - type: 'GET'
85   - url: this.$('.nav-tabs .diffs-tab a').attr('href')
86   - beforeSend: =>
87   - this.$('.status').addClass 'loading'
88   - complete: =>
89   - @diffs_loaded = true
90   - this.$('.status').removeClass 'loading'
91   - success: (data) =>
92   - this.$(".diffs").html(data.html)
93   - dataType: 'json'
94   -
95   - showAllCommits: ->
96   - this.$('.first-commits').remove()
97   - this.$('.all-commits').removeClass 'hide'
98   -
99   - alreadyOrCannotBeMerged: ->
100   - this.$('.automerge_widget').hide()
101   - this.$('.merge-in-progress').hide()
102   - this.$('.automerge_widget.already_cannot_be_merged').show()
103   -
104   -this.MergeRequest = MergeRequest
... ...
app/controllers/projects/merge_requests_controller.rb
... ... @@ -108,8 +108,15 @@ class Projects::MergeRequestsController < Projects::ApplicationController
108 108 if @merge_request.update_attributes(params[:merge_request].merge(author_id_of_changes: current_user.id))
109 109 @merge_request.reload_code
110 110 @merge_request.mark_as_unchecked
  111 +
111 112 @merge_request.reset_events_cache
112   - redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully updated.'
  113 +
  114 + respond_to do |format|
  115 + format.js
  116 + format.html do
  117 + redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully updated.'
  118 + end
  119 + end
113 120 else
114 121 render "edit"
115 122 end
... ...
app/views/projects/issues/_issue_context.html.haml
... ... @@ -4,7 +4,7 @@
4 4 \ and currently assigned to
5 5  
6 6 - if can?(current_user, :modify_issue, @issue)
7   - = project_users_select_tag('issue[assignee_id]', placeholder: 'Select a user', class: 'custom-form-control', selected: @issue.assignee_id)
  7 + = project_users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control', selected: @issue.assignee_id)
8 8 - elsif issue.assignee
9 9 = link_to_member(@project, @issue.assignee)
10 10  
... ...
app/views/projects/merge_requests/show/_context.html.haml 0 → 100644
... ... @@ -0,0 +1,23 @@
  1 += form_for [@project, @merge_request], remote: true, html: {class: 'edit-merge_request inline-update'} do |f|
  2 + Created by #{link_to_member(@project, merge_request.author)} 
  3 + - if merge_request.assignee
  4 + \ and currently assigned to
  5 +
  6 + - if can?(current_user, :modify_merge_request, @merge_request)
  7 + = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control', selected: @merge_request.assignee_id)
  8 + - elsif merge_request.assignee
  9 + = link_to_member(@project, @merge_request.assignee)
  10 +
  11 +
  12 + .pull-right.hidden-sm.hidden-xs
  13 + - if merge_request.milestone
  14 + - milestone = merge_request.milestone
  15 + %cite.cgray Attached to milestone
  16 +
  17 + - if can?(current_user, :modify_merge_request, @merge_request)
  18 + = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone (none):" }, {class: 'select2 select2-compact'})
  19 +
  20 + = hidden_field_tag :merge_request_context
  21 + = f.submit class: 'btn'
  22 + - elsif merge_request.milestone
  23 + = link_to merge_request.milestone.title, project_milestone_path
... ...
app/views/projects/merge_requests/show/_mr_box.html.haml
... ... @@ -4,15 +4,7 @@
4 4  
5 5 .context
6 6 %cite.cgray
7   - Created by #{link_to_member(@project, @merge_request.author)}.
8   - - if @merge_request.assignee
9   - Currently assigned to #{link_to_member(@project, @merge_request.assignee)}.
10   - - if @merge_request.milestone
11   - .pull-right
12   - - milestone = @merge_request.milestone
13   - %cite.cgray Attached to milestone
14   - %strong= link_to_gfm truncate(milestone.title, length: 20), project_milestone_path(milestone.project, milestone)
15   -
  7 + = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request }
16 8  
17 9 - if @merge_request.description.present?
18 10 .description
... ...
app/views/projects/merge_requests/update.js.haml 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +- if params[:merge_request_context]
  2 + $('.issue-box .context').effect('highlight');
... ...