Commit 0b00b3dac3ec31924dae821c0fccc08598161762

Authored by Dmitriy Zaporozhets
1 parent 1d773577

Add sorting to merge requests on milestone page

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
app/assets/javascripts/milestone.js.coffee
@@ -23,6 +23,18 @@ class Milestone @@ -23,6 +23,18 @@ class Milestone
23 new Flash("Issues update failed", 'alert') 23 new Flash("Issues update failed", 'alert')
24 dataType: "json" 24 dataType: "json"
25 25
  26 + @sortMergeRequests: (data) ->
  27 + sort_mr_url = location.href + "/sort_merge_requests"
  28 +
  29 + $.ajax
  30 + type: "PUT"
  31 + url: sort_mr_url
  32 + data: data
  33 + success: (data) ->
  34 + if data.saved != true
  35 + new Flash("MR update failed", 'alert')
  36 + dataType: "json"
  37 +
26 @updateMergeRequest: (li, merge_request_url, data) -> 38 @updateMergeRequest: (li, merge_request_url, data) ->
27 $.ajax 39 $.ajax
28 type: "PUT" 40 type: "PUT"
@@ -71,6 +83,10 @@ class Milestone @@ -71,6 +83,10 @@ class Milestone
71 $("#merge_requests-list-unassigned, #merge_requests-list-ongoing, #merge_requests-list-closed").sortable( 83 $("#merge_requests-list-unassigned, #merge_requests-list-ongoing, #merge_requests-list-closed").sortable(
72 connectWith: ".merge_requests-sortable-list", 84 connectWith: ".merge_requests-sortable-list",
73 dropOnEmpty: true, 85 dropOnEmpty: true,
  86 + update: (event, ui) ->
  87 + data = $(this).sortable("serialize")
  88 + Milestone.sortMergeRequests(data)
  89 +
74 receive: (event, ui) -> 90 receive: (event, ui) ->
75 new_state = $(this).data('state') 91 new_state = $(this).data('state')
76 merge_request_id = ui.item.data('iid') 92 merge_request_id = ui.item.data('iid')
app/controllers/projects/milestones_controller.rb
1 class Projects::MilestonesController < Projects::ApplicationController 1 class Projects::MilestonesController < Projects::ApplicationController
2 before_filter :module_enabled 2 before_filter :module_enabled
3 - before_filter :milestone, only: [:edit, :update, :destroy, :show, :sort_issues] 3 + before_filter :milestone, only: [:edit, :update, :destroy, :show, :sort_issues, :sort_merge_requests]
4 4
5 # Allow read any milestone 5 # Allow read any milestone
6 before_filter :authorize_read_milestone! 6 before_filter :authorize_read_milestone!
@@ -82,6 +82,16 @@ class Projects::MilestonesController &lt; Projects::ApplicationController @@ -82,6 +82,16 @@ class Projects::MilestonesController &lt; Projects::ApplicationController
82 render json: { saved: true } 82 render json: { saved: true }
83 end 83 end
84 84
  85 + def sort_merge_requests
  86 + @merge_requests = @milestone.merge_requests.where(id: params['sortable_merge_request'])
  87 + @merge_requests.each do |merge_request|
  88 + merge_request.position = params['sortable_merge_request'].index(merge_request.id.to_s) + 1
  89 + merge_request.save
  90 + end
  91 +
  92 + render json: { saved: true }
  93 + end
  94 +
85 protected 95 protected
86 96
87 def milestone 97 def milestone
app/views/projects/milestones/_merge_request.html.haml
1 -%li{ class: 'mr-row', 'data-iid' => merge_request.iid, 'data-url' => project_merge_request_path(@project, merge_request) } 1 +%li{ id: dom_id(merge_request, 'sortable'), class: 'mr-row', 'data-iid' => merge_request.iid, 'data-url' => project_merge_request_path(@project, merge_request) }
2 %span.str-truncated 2 %span.str-truncated
3 = link_to [@project, merge_request] do 3 = link_to [@project, merge_request] do
4 %span.cgray ##{merge_request.iid} 4 %span.cgray ##{merge_request.iid}
app/views/projects/milestones/_merge_requests.html.haml
1 .panel.panel-default 1 .panel.panel-default
2 .panel-heading= title 2 .panel-heading= title
3 %ul{ class: "well-list merge_requests-sortable-list", id: "merge_requests-list-#{id}", "data-state" => id } 3 %ul{ class: "well-list merge_requests-sortable-list", id: "merge_requests-list-#{id}", "data-state" => id }
4 - - merge_requests.each do |merge_request| 4 + - merge_requests.sort_by(&:position).each do |merge_request|
5 = render 'merge_request', merge_request: merge_request 5 = render 'merge_request', merge_request: merge_request
6 %li.light Drag and drop available 6 %li.light Drag and drop available
config/routes.rb
@@ -281,6 +281,7 @@ Gitlab::Application.routes.draw do @@ -281,6 +281,7 @@ Gitlab::Application.routes.draw do
281 resources :milestones, except: [:destroy], constraints: {id: /\d+/} do 281 resources :milestones, except: [:destroy], constraints: {id: /\d+/} do
282 member do 282 member do
283 put :sort_issues 283 put :sort_issues
  284 + put :sort_merge_requests
284 end 285 end
285 end 286 end
286 287
db/migrate/20140611135229_add_position_to_merge_request.rb 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +class AddPositionToMergeRequest < ActiveRecord::Migration
  2 + def change
  3 + add_column :merge_requests, :position, :integer, default: 0
  4 + end
  5 +end
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 # 11 #
12 # It's strongly recommended that you check this file into your version control system. 12 # It's strongly recommended that you check this file into your version control system.
13 13
14 -ActiveRecord::Schema.define(version: 20140502125220) do 14 +ActiveRecord::Schema.define(version: 20140611135229) do
15 15
16 # These are extensions that must be enabled in order to support this database 16 # These are extensions that must be enabled in order to support this database
17 enable_extension "plpgsql" 17 enable_extension "plpgsql"
@@ -121,9 +121,9 @@ ActiveRecord::Schema.define(version: 20140502125220) do @@ -121,9 +121,9 @@ ActiveRecord::Schema.define(version: 20140502125220) do
121 add_index "merge_request_diffs", ["merge_request_id"], name: "index_merge_request_diffs_on_merge_request_id", unique: true, using: :btree 121 add_index "merge_request_diffs", ["merge_request_id"], name: "index_merge_request_diffs_on_merge_request_id", unique: true, using: :btree
122 122
123 create_table "merge_requests", force: true do |t| 123 create_table "merge_requests", force: true do |t|
124 - t.string "target_branch", null: false  
125 - t.string "source_branch", null: false  
126 - t.integer "source_project_id", null: false 124 + t.string "target_branch", null: false
  125 + t.string "source_branch", null: false
  126 + t.integer "source_project_id", null: false
127 t.integer "author_id" 127 t.integer "author_id"
128 t.integer "assignee_id" 128 t.integer "assignee_id"
129 t.string "title" 129 t.string "title"
@@ -132,9 +132,10 @@ ActiveRecord::Schema.define(version: 20140502125220) do @@ -132,9 +132,10 @@ ActiveRecord::Schema.define(version: 20140502125220) do
132 t.integer "milestone_id" 132 t.integer "milestone_id"
133 t.string "state" 133 t.string "state"
134 t.string "merge_status" 134 t.string "merge_status"
135 - t.integer "target_project_id", null: false 135 + t.integer "target_project_id", null: false
136 t.integer "iid" 136 t.integer "iid"
137 t.text "description" 137 t.text "description"
  138 + t.integer "position", default: 0
138 end 139 end
139 140
140 add_index "merge_requests", ["assignee_id"], name: "index_merge_requests_on_assignee_id", using: :btree 141 add_index "merge_requests", ["assignee_id"], name: "index_merge_requests_on_assignee_id", using: :btree