From cb02f1cb82ad424ed6e9845e8654fa17e3c38351 Mon Sep 17 00:00:00 2001 From: VSizov Date: Sat, 15 Oct 2011 19:56:53 +0300 Subject: Sortable issues --- app/assets/javascripts/dashboard.js.coffee | 3 --- app/assets/javascripts/issues.js.coffee | 3 --- app/assets/javascripts/profile.js.coffee | 3 --- app/assets/javascripts/projects.js | 1 + app/assets/stylesheets/projects.css.scss | 4 ++++ app/controllers/issues_controller.rb | 10 ++++++++++ app/models/issue.rb | 2 ++ app/models/project.rb | 2 +- app/views/issues/_show.html.haml | 2 +- app/views/issues/index.html.haml | 26 ++++++++++++++++++++++++++ app/views/issues/index.js.haml | 1 + 11 files changed, 46 insertions(+), 11 deletions(-) delete mode 100644 app/assets/javascripts/dashboard.js.coffee delete mode 100644 app/assets/javascripts/issues.js.coffee delete mode 100644 app/assets/javascripts/profile.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/dashboard.js.coffee b/app/assets/javascripts/dashboard.js.coffee deleted file mode 100644 index 761567942fc..00000000000 --- a/app/assets/javascripts/dashboard.js.coffee +++ /dev/null @@ -1,3 +0,0 @@ -# Place all the behaviors and hooks related to the matching controller here. -# All this logic will automatically be available in application.js. -# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee deleted file mode 100644 index 761567942fc..00000000000 --- a/app/assets/javascripts/issues.js.coffee +++ /dev/null @@ -1,3 +0,0 @@ -# Place all the behaviors and hooks related to the matching controller here. -# All this logic will automatically be available in application.js. -# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/javascripts/profile.js.coffee b/app/assets/javascripts/profile.js.coffee deleted file mode 100644 index 761567942fc..00000000000 --- a/app/assets/javascripts/profile.js.coffee +++ /dev/null @@ -1,3 +0,0 @@ -# Place all the behaviors and hooks related to the matching controller here. -# All this logic will automatically be available in application.js. -# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/javascripts/projects.js b/app/assets/javascripts/projects.js index dc13d006077..74f0e643c21 100644 --- a/app/assets/javascripts/projects.js +++ b/app/assets/javascripts/projects.js @@ -34,6 +34,7 @@ $(document).ready(function(){ e.preventDefault(); } }); + }); function focusSearch() { diff --git a/app/assets/stylesheets/projects.css.scss b/app/assets/stylesheets/projects.css.scss index 0ee40f512ac..fdfd2b8653b 100644 --- a/app/assets/stylesheets/projects.css.scss +++ b/app/assets/stylesheets/projects.css.scss @@ -539,3 +539,7 @@ tbody tr:nth-child(2n) td, tbody tr.even td { float:left; } } + +.handle:hover{ + cursor: move; +} diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index f8b4719809b..3e5f2898228 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -69,4 +69,14 @@ class IssuesController < ApplicationController format.js { render :nothing => true } end end + + def sort + @issues = @project.issues.all + @issues.each do |issue| + issue.position = params['issue'].index(issue.id.to_s) + 1 + issue.save + end + + render :nothing => true + end end diff --git a/app/models/issue.rb b/app/models/issue.rb index 0399607efe6..9b1b923eaa0 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -21,6 +21,8 @@ class Issue < ActiveRecord::Base scope :opened, where(:closed => false) scope :closed, where(:closed => true) scope :assigned, lambda { |u| where(:assignee_id => u.id)} + + acts_as_list end # == Schema Information # diff --git a/app/models/project.rb b/app/models/project.rb index 17b556c3471..06a36a275b9 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -3,7 +3,7 @@ require "grit" class Project < ActiveRecord::Base belongs_to :owner, :class_name => "User" - has_many :issues, :dependent => :destroy + has_many :issues, :dependent => :destroy, :order => "position" has_many :users_projects, :dependent => :destroy has_many :users, :through => :users_projects has_many :notes, :dependent => :destroy diff --git a/app/views/issues/_show.html.haml b/app/views/issues/_show.html.haml index 131d0d4c8a2..cf01020806a 100644 --- a/app/views/issues/_show.html.haml +++ b/app/views/issues/_show.html.haml @@ -1,6 +1,6 @@ %tr{ :id => dom_id(issue), :class => "issue", :url => project_issue_path(@project, issue) } %td - = image_tag gravatar_icon(issue.assignee.email), :class => "left", :width => 40, :style => "padding:0 5px;" + = image_tag gravatar_icon(issue.assignee.email), :class => ["left", "handle"], :width => 40, :style => "padding:0 5px;" = truncate issue.assignee.name, :lenght => 20 %td ##{issue.id} %td= html_escape issue.title diff --git a/app/views/issues/index.html.haml b/app/views/issues/index.html.haml index 7157d2c385d..6f4548a8066 100644 --- a/app/views/issues/index.html.haml +++ b/app/views/issues/index.html.haml @@ -22,3 +22,29 @@ :javascript $('.delete-issue').live('ajax:success', function() { $(this).closest('tr').fadeOut(); }); + + function setSortable(){ + $('#issues-table>tbody').sortable({ + axis: 'y', + dropOnEmpty: false, + handle: '.handle', + cursor: 'crosshair', + items: 'tr', + opacity: 0.4, + scroll: true, + update: function(){ + $.ajax({ + type: 'post', + data: $('#issues-table>tbody').sortable('serialize'), + dataType: 'script', + complete: function(request){ + $('#issues-table>tbody').effect('highlight'); + }, + url: "#{sort_project_issues_path(@project)}"}) + } + }); + } + + $(function(){ + setSortable(); + }); diff --git a/app/views/issues/index.js.haml b/app/views/issues/index.js.haml index 1f051309233..bc18ac15151 100644 --- a/app/views/issues/index.js.haml +++ b/app/views/issues/index.js.haml @@ -1,2 +1,3 @@ :plain $('#issues-table-holder').html("#{escape_javascript(render('issues'))}"); + setSortable(); -- cgit v1.2.3