Commit ecdf778e80d3804a076061989b5abb2d6e1e5c19

Authored by randx
2 parents 50a6c614 263282de

Merge branch 'public_submission_milestones_for_mr' of https://github.com/piffio/…

…gitlabhq into piffio-public_submission_milestones_for_mr

Conflicts:
	app/views/merge_requests/_form.html.haml
app/assets/javascripts/merge_requests.js
... ... @@ -115,4 +115,15 @@ var MergeRequest = {
115 115 $(".merge_in_progress").hide();
116 116 $(".automerge_widget.already_cannot_be_merged").show();
117 117 }
  118 +};
  119 +
  120 +/*
  121 + * Filter merge requests
  122 + */
  123 +function merge_requestsPage() {
  124 + $("#assignee_id").chosen();
  125 + $("#milestone_id").chosen();
  126 + $("#milestone_id, #assignee_id").on("change", function(){
  127 + $(this).closest("form").submit();
  128 + });
118 129 }
... ...
app/assets/stylesheets/sections/merge_requests.scss
... ... @@ -121,3 +121,20 @@ li.merge_request {
121 121 .mr_direction_tip {
122 122 margin-top:40px
123 123 }
  124 +
  125 +.merge_requests_form_box {
  126 + @extend .main_box;
  127 + .merge_requests_middle_box {
  128 + @extend .middle_box_content;
  129 + height:30px;
  130 + .merge_requests_assignee {
  131 + @extend .span6;
  132 + float:left;
  133 + }
  134 + .merge_requests_milestone {
  135 + @extend .span4;
  136 + float:left;
  137 + }
  138 + }
  139 +}
  140 +
... ...
app/contexts/merge_requests_load_context.rb
... ... @@ -2,7 +2,7 @@ class MergeRequestsLoadContext < BaseContext
2 2 def execute
3 3 type = params[:f]
4 4  
5   - merge_requests = project.merge_requests
  5 + merge_requests = @project.merge_requests
6 6  
7 7 merge_requests = case type
8 8 when 'all' then merge_requests
... ... @@ -12,5 +12,18 @@ class MergeRequestsLoadContext < BaseContext
12 12 end.page(params[:page]).per(20)
13 13  
14 14 merge_requests.includes(:author, :project).order("closed, created_at desc")
  15 +
  16 + @merge_requests = merge_requests
  17 +
  18 + # Filter by specific assignee_id (or lack thereof)?
  19 + if params[:assignee_id].present?
  20 + @merge_requests = merge_requests.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id]))
  21 + end
  22 +
  23 + # Filter by specific milestone_id (or lack thereof)?
  24 + if params[:milestone_id].present?
  25 + @merge_requests = merge_requests.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id]))
  26 + end
  27 + @merge_requests
15 28 end
16 29 end
... ...
app/controllers/milestones_controller.rb
... ... @@ -32,6 +32,7 @@ class MilestonesController < ProjectResourceController
32 32 def show
33 33 @issues = @milestone.issues
34 34 @users = @milestone.participants
  35 + @merge_requests = @milestone.merge_requests
35 36  
36 37 respond_to do |format|
37 38 format.html
... ...
app/models/merge_request.rb
... ... @@ -4,11 +4,13 @@ class MergeRequest < ActiveRecord::Base
4 4 include IssueCommonality
5 5 include Votes
6 6  
7   - attr_accessible :title, :assignee_id, :closed, :target_branch, :source_branch,
  7 + attr_accessible :title, :assignee_id, :closed, :target_branch, :source_branch, :milestone_id,
8 8 :author_id_of_changes
9 9  
10 10 attr_accessor :should_remove_source_branch
11 11  
  12 + belongs_to :milestone
  13 +
12 14 BROKEN_DIFF = "--broken-diff"
13 15  
14 16 UNCHECKED = 1
... ... @@ -26,6 +28,10 @@ class MergeRequest < ActiveRecord::Base
26 28 where("source_branch LIKE :branch OR target_branch LIKE :branch", branch: branch_name)
27 29 end
28 30  
  31 + def self.find_all_by_milestone(milestone)
  32 + where("milestone_id = :milestone_id", milestone_id: milestone)
  33 + end
  34 +
29 35 def human_state
30 36 states = {
31 37 CAN_BE_MERGED => "can_be_merged",
... ... @@ -212,5 +218,6 @@ end
212 218 # st_diffs :text(4294967295
213 219 # merged :boolean default(FALSE), not null
214 220 # state :integer default(1), not null
  221 +# milestone_id :integer
215 222 #
216 223  
... ...
app/models/milestone.rb
... ... @@ -3,6 +3,7 @@ class Milestone < ActiveRecord::Base
3 3  
4 4 belongs_to :project
5 5 has_many :issues
  6 + has_many :merge_requests
6 7  
7 8 validates :title, presence: true
8 9 validates :project, presence: true
... ...
app/views/merge_requests/_form.html.haml
... ... @@ -28,16 +28,22 @@
28 28 %h4.cdark 2. Fill info
29 29  
30 30 .clearfix
31   - .main_box
  31 + .merge_requests_form_box
32 32 .top_box_content
33 33 = f.label :title do
34 34 %strong= "Title *"
35 35 .input= f.text_field :title, class: "input-xxlarge pad js-gfm-input", maxlength: 255, rows: 5
36   - .middle_box_content
37   - = f.label :assignee_id do
38   - %i.icon-user
39   - Assign to
40   - .input= f.select(:assignee_id, @project.users.all.collect {|p| [ p.name, p.id ] }, { include_blank: "Select user" }, {class: 'chosen span3'})
  36 + .merge_requests_middle_box
  37 + .merge_requests_assignee
  38 + = f.label :assignee_id do
  39 + %i.icon-user
  40 + Assign to
  41 + .input= f.select(:assignee_id, @project.users.all.collect {|p| [ p.name, p.id ] }, { include_blank: "Select user" }, {class: 'chosen span3'})
  42 + .merge_requests_milestone
  43 + = f.label :milestone_id do
  44 + %i.icon-time
  45 + Milestone
  46 + .input= f.select(:milestone_id, @project.milestones.active.all.collect {|p| [ p.title, p.id ] }, { include_blank: "Select milestone" }, {class: 'chosen'})
41 47  
42 48 .control-group
43 49  
... ...
app/views/merge_requests/_merge_request.html.haml
... ... @@ -10,6 +10,10 @@
10 10 %span.btn.small.disabled.grouped
11 11 %i.icon-comment
12 12 = merge_request.mr_and_commit_notes.count
  13 + - if merge_request.milestone_id?
  14 + %span.btn.small.disabled.grouped
  15 + %i.icon-time
  16 + = merge_request.project.milestones.find(merge_request.milestone_id).title
13 17 %span.btn.small.disabled.grouped
14 18 = merge_request.source_branch
15 19 →
... ...
app/views/merge_requests/index.html.haml
... ... @@ -9,19 +9,26 @@
9 9  
10 10 .ui-box
11 11 .title
12   - %ul.nav.nav-pills
13   - %li{class: ("active" if (params[:f] == 'open' || !params[:f]))}
14   - = link_to project_merge_requests_path(@project, f: 'open') do
15   - Open
16   - %li{class: ("active" if params[:f] == "closed")}
17   - = link_to project_merge_requests_path(@project, f: "closed") do
18   - Closed
19   - %li{class: ("active" if params[:f] == 'assigned-to-me')}
20   - = link_to project_merge_requests_path(@project, f: 'assigned-to-me') do
21   - To Me
22   - %li{class: ("active" if params[:f] == 'all')}
23   - = link_to project_merge_requests_path(@project, f: 'all') do
24   - All
  12 + .left
  13 + %ul.nav.nav-pills
  14 + %li{class: ("active" if (params[:f] == 'open' || !params[:f]))}
  15 + = link_to project_merge_requests_path(@project, f: 'open', milestone_id: params[:milestone_id]) do
  16 + Open
  17 + %li{class: ("active" if params[:f] == "closed")}
  18 + = link_to project_merge_requests_path(@project, f: "closed", milestone_id: params[:milestone_id]) do
  19 + Closed
  20 + %li{class: ("active" if params[:f] == 'assigned-to-me')}
  21 + = link_to project_merge_requests_path(@project, f: 'assigned-to-me', milestone_id: params[:milestone_id]) do
  22 + To Me
  23 + %li{class: ("active" if params[:f] == 'all')}
  24 + = link_to project_merge_requests_path(@project, f: 'all', milestone_id: params[:milestone_id]) do
  25 + All
  26 + .right
  27 + = form_tag project_merge_requests_path(@project), id: "merge_requests_search_form", method: :get, class: :right do
  28 + = select_tag(:assignee_id, options_from_collection_for_select([unassigned_filter] + @project.users.all, "id", "name", params[:assignee_id]), prompt: "Assignee")
  29 + = select_tag(:milestone_id, options_from_collection_for_select([unassigned_filter] + @project.milestones.order("id desc").all, "id", "title", params[:milestone_id]), prompt: "Milestone")
  30 + = hidden_field_tag :f, params[:f]
  31 + .clearfix
25 32  
26 33 %ul.unstyled
27 34 = render @merge_requests
... ... @@ -35,3 +42,7 @@
35 42 .span4.right
36 43 %span.cgray.right #{@merge_requests.total_count} merge requests for this filter
37 44  
  45 +:javascript
  46 + $(function() {
  47 + merge_requestsPage();
  48 + })
... ...
app/views/merge_requests/show/_mr_box.html.haml
... ... @@ -14,9 +14,13 @@
14 14 %strong.author= link_to_merge_request_author(@merge_request)
15 15  
16 16 - if @merge_request.assignee
17   - %cite.cgray and currently assigned to
  17 + %cite.cgray , currently assigned to
18 18 = image_tag gravatar_icon(@merge_request.assignee_email), width: 16, class: "lil_av"
19 19 %strong.author= link_to_merge_request_assignee(@merge_request)
  20 + - if @merge_request.milestone
  21 + - milestone = @merge_request.milestone
  22 + %cite.cgray and attached to milestone
  23 + %strong= link_to_gfm truncate(milestone.title, length: 20), project_milestone_path(milestone.project, milestone)
20 24  
21 25  
22 26 - if @merge_request.closed
... ...
app/views/milestones/_milestone.html.haml
... ... @@ -4,6 +4,10 @@
4 4 %span.btn.small.disabled.grouped= pluralize milestone.issues.count, 'issues'
5 5 - if milestone.issues.count > 0
6 6 = link_to 'Browse Issues', project_issues_path(milestone.project, milestone_id: milestone.id), class: "btn small grouped"
  7 + - if milestone.merge_requests.any?
  8 + %span.btn.small.disabled.grouped= pluralize milestone.issues.count, 'Merge Requests'
  9 + - if milestone.merge_requests.count > 0
  10 + = link_to 'Browse Merge Requests', project_merge_requests_path(milestone.project, milestone_id: milestone.id), class: "btn small grouped"
7 11 - if can? current_user, :admin_milestone, milestone.project
8 12 = link_to 'Edit', edit_project_milestone_path(milestone.project, milestone), class: "btn small edit-milestone-link grouped"
9 13 %h4
... ...
app/views/milestones/show.html.haml
... ... @@ -61,6 +61,22 @@
61 61 %br
62 62  
63 63 .span6
  64 + %table.milestone-merge_requests-filter
  65 + %thead
  66 + %th
  67 + %ul.nav.nav-pills
  68 + %li.active= link_to('Open Merge Requests', '#')
  69 + %li=link_to('All Merge Requests', '#')
  70 + - @merge_requests.each do |merge_request|
  71 + %tr{data: {closed: merge_request.closed}}
  72 + %td
  73 + = link_to [@project, merge_request] do
  74 + %span.badge.badge-info ##{merge_request.id}
  75 + –
  76 + = link_to_gfm truncate(merge_request.title, length: 60), [@project, merge_request]
  77 + %br
  78 +
  79 + .span6
64 80 %table
65 81 %thead
66 82 %th Participants
... ...
db/migrate/20121026114600_add_milestone_id_to_merge_requests.rb 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +class AddMilestoneIdToMergeRequests < ActiveRecord::Migration
  2 + def change
  3 + add_column :merge_requests, :milestone_id, :integer, :null => true
  4 + end
  5 +end
... ...
db/schema.rb
... ... @@ -11,7 +11,7 @@
11 11 #
12 12 # It's strongly recommended to check this file into your version control system.
13 13  
14   -ActiveRecord::Schema.define(:version => 20121009205010) do
  14 +ActiveRecord::Schema.define(:version => 20121026114600) do
15 15  
16 16 create_table "events", :force => true do |t|
17 17 t.string "target_type"
... ... @@ -73,6 +73,7 @@ ActiveRecord::Schema.define(:version =&gt; 20121009205010) do
73 73 t.text "st_diffs", :limit => 2147483647
74 74 t.boolean "merged", :default => false, :null => false
75 75 t.integer "state", :default => 1, :null => false
  76 + t.integer "milestone_id"
76 77 end
77 78  
78 79 add_index "merge_requests", ["project_id"], :name => "index_merge_requests_on_project_id"
... ...