Commit ed610043a8d7e60f0bd796005a8d7cdb10565206

Authored by Dmitriy Zaporozhets
2 parents 5117bf6f dd86ce3f

Merge branch 'milestone-issue-position' into 'master'

Milestone issues sorting

Now issues save sort position inside milestone lists

Part of #1207
app/assets/javascripts/milestone.js.coffee
@@ -11,6 +11,18 @@ class Milestone @@ -11,6 +11,18 @@ class Milestone
11 new Flash("Issue update failed", 'alert') 11 new Flash("Issue update failed", 'alert')
12 dataType: "json" 12 dataType: "json"
13 13
  14 + @sortIssues: (data) ->
  15 + sort_issues_url = location.href + "/sort_issues"
  16 +
  17 + $.ajax
  18 + type: "PUT"
  19 + url: sort_issues_url
  20 + data: data
  21 + success: (data) ->
  22 + if data.saved != true
  23 + new Flash("Issues update failed", 'alert')
  24 + dataType: "json"
  25 +
14 @updateMergeRequest: (li, merge_request_url, data) -> 26 @updateMergeRequest: (li, merge_request_url, data) ->
15 $.ajax 27 $.ajax
16 type: "PUT" 28 type: "PUT"
@@ -31,6 +43,10 @@ class Milestone @@ -31,6 +43,10 @@ class Milestone
31 $("#issues-list-unassigned, #issues-list-ongoing, #issues-list-closed").sortable( 43 $("#issues-list-unassigned, #issues-list-ongoing, #issues-list-closed").sortable(
32 connectWith: ".issues-sortable-list", 44 connectWith: ".issues-sortable-list",
33 dropOnEmpty: true, 45 dropOnEmpty: true,
  46 + update: (event, ui) ->
  47 + data = $(this).sortable("serialize")
  48 + Milestone.sortIssues(data)
  49 +
34 receive: (event, ui) -> 50 receive: (event, ui) ->
35 new_state = $(this).data('state') 51 new_state = $(this).data('state')
36 issue_id = ui.item.data('iid') 52 issue_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] 3 + before_filter :milestone, only: [:edit, :update, :destroy, :show, :sort_issues]
4 4
5 # Allow read any milestone 5 # Allow read any milestone
6 before_filter :authorize_read_milestone! 6 before_filter :authorize_read_milestone!
@@ -72,6 +72,16 @@ class Projects::MilestonesController &lt; Projects::ApplicationController @@ -72,6 +72,16 @@ class Projects::MilestonesController &lt; Projects::ApplicationController
72 end 72 end
73 end 73 end
74 74
  75 + def sort_issues
  76 + @issues = @milestone.issues.where(id: params['sortable_issue'])
  77 + @issues.each do |issue|
  78 + issue.position = params['sortable_issue'].index(issue.id.to_s) + 1
  79 + issue.save
  80 + end
  81 +
  82 + render json: { saved: true }
  83 + end
  84 +
75 protected 85 protected
76 86
77 def milestone 87 def milestone
app/views/projects/milestones/_issue.html.haml
1 -%li{ class: 'issue-row', 'data-iid' => issue.iid, 'data-url' => project_issue_path(@project, issue) } 1 +%li{ id: dom_id(issue, 'sortable'), class: 'issue-row', 'data-iid' => issue.iid, 'data-url' => project_issue_path(@project, issue) }
2 %span.str-truncated 2 %span.str-truncated
3 = link_to [@project, issue] do 3 = link_to [@project, issue] do
4 %span.cgray ##{issue.iid} 4 %span.cgray ##{issue.iid}
app/views/projects/milestones/_issues.html.haml
1 .panel.panel-default 1 .panel.panel-default
2 .panel-heading= title 2 .panel-heading= title
3 %ul{ class: "well-list issues-sortable-list", id: "issues-list-#{id}", "data-state" => id } 3 %ul{ class: "well-list issues-sortable-list", id: "issues-list-#{id}", "data-state" => id }
4 - - issues.each do |issue| 4 + - issues.sort_by(&:position).each do |issue|
5 = render 'issue', issue: issue 5 = render 'issue', issue: issue
6 %li.light Drag and drop available 6 %li.light Drag and drop available
config/routes.rb
@@ -278,7 +278,11 @@ Gitlab::Application.routes.draw do @@ -278,7 +278,11 @@ Gitlab::Application.routes.draw do
278 end 278 end
279 279
280 resources :team, controller: 'team_members', only: [:index] 280 resources :team, controller: 'team_members', only: [:index]
281 - resources :milestones, except: [:destroy], constraints: {id: /\d+/} 281 + resources :milestones, except: [:destroy], constraints: {id: /\d+/} do
  282 + member do
  283 + put :sort_issues
  284 + end
  285 + end
282 286
283 resources :labels, only: [:index] do 287 resources :labels, only: [:index] do
284 collection do 288 collection do