From 0b00b3dac3ec31924dae821c0fccc08598161762 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 11 Jun 2014 17:11:52 +0300 Subject: [PATCH] Add sorting to merge requests on milestone page --- app/assets/javascripts/milestone.js.coffee | 16 ++++++++++++++++ app/controllers/projects/milestones_controller.rb | 12 +++++++++++- app/views/projects/milestones/_merge_request.html.haml | 2 +- app/views/projects/milestones/_merge_requests.html.haml | 2 +- config/routes.rb | 1 + db/migrate/20140611135229_add_position_to_merge_request.rb | 5 +++++ db/schema.rb | 11 ++++++----- 7 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 db/migrate/20140611135229_add_position_to_merge_request.rb diff --git a/app/assets/javascripts/milestone.js.coffee b/app/assets/javascripts/milestone.js.coffee index 3418832..97a71b9 100644 --- a/app/assets/javascripts/milestone.js.coffee +++ b/app/assets/javascripts/milestone.js.coffee @@ -23,6 +23,18 @@ class Milestone new Flash("Issues update failed", 'alert') dataType: "json" + @sortMergeRequests: (data) -> + sort_mr_url = location.href + "/sort_merge_requests" + + $.ajax + type: "PUT" + url: sort_mr_url + data: data + success: (data) -> + if data.saved != true + new Flash("MR update failed", 'alert') + dataType: "json" + @updateMergeRequest: (li, merge_request_url, data) -> $.ajax type: "PUT" @@ -71,6 +83,10 @@ class Milestone $("#merge_requests-list-unassigned, #merge_requests-list-ongoing, #merge_requests-list-closed").sortable( connectWith: ".merge_requests-sortable-list", dropOnEmpty: true, + update: (event, ui) -> + data = $(this).sortable("serialize") + Milestone.sortMergeRequests(data) + receive: (event, ui) -> new_state = $(this).data('state') merge_request_id = ui.item.data('iid') diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb index 1394702..c38c77d 100644 --- a/app/controllers/projects/milestones_controller.rb +++ b/app/controllers/projects/milestones_controller.rb @@ -1,6 +1,6 @@ class Projects::MilestonesController < Projects::ApplicationController before_filter :module_enabled - before_filter :milestone, only: [:edit, :update, :destroy, :show, :sort_issues] + before_filter :milestone, only: [:edit, :update, :destroy, :show, :sort_issues, :sort_merge_requests] # Allow read any milestone before_filter :authorize_read_milestone! @@ -82,6 +82,16 @@ class Projects::MilestonesController < Projects::ApplicationController render json: { saved: true } end + def sort_merge_requests + @merge_requests = @milestone.merge_requests.where(id: params['sortable_merge_request']) + @merge_requests.each do |merge_request| + merge_request.position = params['sortable_merge_request'].index(merge_request.id.to_s) + 1 + merge_request.save + end + + render json: { saved: true } + end + protected def milestone diff --git a/app/views/projects/milestones/_merge_request.html.haml b/app/views/projects/milestones/_merge_request.html.haml index 4787da5..d630c45 100644 --- a/app/views/projects/milestones/_merge_request.html.haml +++ b/app/views/projects/milestones/_merge_request.html.haml @@ -1,4 +1,4 @@ -%li{ class: 'mr-row', 'data-iid' => merge_request.iid, 'data-url' => project_merge_request_path(@project, merge_request) } +%li{ id: dom_id(merge_request, 'sortable'), class: 'mr-row', 'data-iid' => merge_request.iid, 'data-url' => project_merge_request_path(@project, merge_request) } %span.str-truncated = link_to [@project, merge_request] do %span.cgray ##{merge_request.iid} diff --git a/app/views/projects/milestones/_merge_requests.html.haml b/app/views/projects/milestones/_merge_requests.html.haml index 18c4660..521bfa7 100644 --- a/app/views/projects/milestones/_merge_requests.html.haml +++ b/app/views/projects/milestones/_merge_requests.html.haml @@ -1,6 +1,6 @@ .panel.panel-default .panel-heading= title %ul{ class: "well-list merge_requests-sortable-list", id: "merge_requests-list-#{id}", "data-state" => id } - - merge_requests.each do |merge_request| + - merge_requests.sort_by(&:position).each do |merge_request| = render 'merge_request', merge_request: merge_request %li.light Drag and drop available diff --git a/config/routes.rb b/config/routes.rb index c38b5c4..34ee8d2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -281,6 +281,7 @@ Gitlab::Application.routes.draw do resources :milestones, except: [:destroy], constraints: {id: /\d+/} do member do put :sort_issues + put :sort_merge_requests end end diff --git a/db/migrate/20140611135229_add_position_to_merge_request.rb b/db/migrate/20140611135229_add_position_to_merge_request.rb new file mode 100644 index 0000000..d5fdecd --- /dev/null +++ b/db/migrate/20140611135229_add_position_to_merge_request.rb @@ -0,0 +1,5 @@ +class AddPositionToMergeRequest < ActiveRecord::Migration + def change + add_column :merge_requests, :position, :integer, default: 0 + end +end diff --git a/db/schema.rb b/db/schema.rb index 9383733..345b6fd 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20140502125220) do +ActiveRecord::Schema.define(version: 20140611135229) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -121,9 +121,9 @@ ActiveRecord::Schema.define(version: 20140502125220) do add_index "merge_request_diffs", ["merge_request_id"], name: "index_merge_request_diffs_on_merge_request_id", unique: true, using: :btree create_table "merge_requests", force: true do |t| - t.string "target_branch", null: false - t.string "source_branch", null: false - t.integer "source_project_id", null: false + t.string "target_branch", null: false + t.string "source_branch", null: false + t.integer "source_project_id", null: false t.integer "author_id" t.integer "assignee_id" t.string "title" @@ -132,9 +132,10 @@ ActiveRecord::Schema.define(version: 20140502125220) do t.integer "milestone_id" t.string "state" t.string "merge_status" - t.integer "target_project_id", null: false + t.integer "target_project_id", null: false t.integer "iid" t.text "description" + t.integer "position", default: 0 end add_index "merge_requests", ["assignee_id"], name: "index_merge_requests_on_assignee_id", using: :btree -- libgit2 0.21.2