diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index a4a3a34..284a47f 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -192,11 +192,13 @@ class IssuesController < ApplicationController
respond_to do |format|
format.html { redirect_back_or_default issue_path(@issue, previous_and_next_issue_ids_params) }
+ format.js { render :nothing => true }
format.api { render_api_ok }
end
else
respond_to do |format|
format.html { render :action => 'edit' }
+ format.js { render :nothing => true, :status => 422 }
format.api { render_validation_errors(@issue) }
end
end
@@ -380,7 +382,7 @@ class IssuesController < ApplicationController
# Overrides Redmine::MenuManager::MenuController::ClassMethods for
# when the "New issue" tab is enabled
def current_menu_item
- if Setting.new_item_menu_tab == '1' && [:new, :create].include?(action_name.to_sym)
+ if Setting.new_item_menu_tab == '1' && [:new, :create].include?(action_name.to_sym)
:new_issue
else
super
diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb
index 84c7980..d990337 100644
--- a/app/controllers/versions_controller.rb
+++ b/app/controllers/versions_controller.rb
@@ -46,11 +46,12 @@ class VersionsController < ApplicationController
@issues_by_version = {}
if @selected_tracker_ids.any? && @versions.any?
+
issues = Issue.visible.
includes(:project, :tracker).
preload(:status, :priority, :fixed_version).
where(:tracker_id => @selected_tracker_ids, :project_id => project_ids, :fixed_version_id => @versions.map(&:id)).
- order("#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
+ order(order_issues_by)
@issues_by_version = issues.group_by(&:fixed_version)
end
@versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
@@ -67,7 +68,7 @@ class VersionsController < ApplicationController
@issues = @version.fixed_issues.visible.
includes(:status, :tracker, :priority).
preload(:project).
- reorder("#{Tracker.table_name}.position, #{Issue.table_name}.id").
+ reorder(order_issues_by).
to_a
}
format.api
@@ -180,4 +181,12 @@ class VersionsController < ApplicationController
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
end
end
+
+ def order_issues_by
+ if Setting.manual_issue_position_in_versions == '1'
+ return "COALESCE(#{Issue.table_name}.position, 999999)"
+ else
+ return "#{Tracker.table_name}.position, #{Issue.table_name}.id"
+ end
+ end
end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 92cfad3..5bd07ae 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -56,7 +56,7 @@ class Issue < ActiveRecord::Base
acts_as_activity_provider :scope => preload(:project, :author, :tracker, :status),
:author_key => :author_id
-
+ acts_as_positioned :scope => [:fixed_version_id]
DONE_RATIO_OPTIONS = %w(issue_field issue_status)
attr_accessor :deleted_attachment_ids
@@ -468,6 +468,9 @@ class Issue < ActiveRecord::Base
:if => lambda {|issue, user| (issue.new_record? || issue.attributes_editable?(user)) &&
user.allowed_to?(:manage_subtasks, issue.project)}
+ safe_attributes 'position',
+ :if => lambda {|issue, user| user.allowed_to?(:change_issue_position_in_version, issue.project)}
+
safe_attributes 'deleted_attachment_ids',
:if => lambda {|issue, user| issue.attachments_deletable?(user)}
@@ -781,7 +784,7 @@ class Issue < ActiveRecord::Base
# Returns the names of attributes that are journalized when updating the issue
def journalized_attribute_names
- names = Issue.column_names - %w(id root_id lft rgt lock_version created_on updated_on closed_on)
+ names = Issue.column_names - %w(id root_id lft rgt lock_version position created_on updated_on closed_on)
if tracker
names -= tracker.disabled_core_fields
end
diff --git a/app/views/settings/_issues.html.erb b/app/views/settings/_issues.html.erb
index f29a6d4..610ea4a 100644
--- a/app/views/settings/_issues.html.erb
+++ b/app/views/settings/_issues.html.erb
@@ -13,6 +13,8 @@
<%= setting_check_box :display_subprojects_issues %>
+<%= setting_check_box :manual_issue_position_in_versions %>
+
<%= setting_select :issue_done_ratio, Issue::DONE_RATIO_OPTIONS.collect {|i| [l("setting_issue_done_ratio_#{i}"), i]} %>
<%= setting_multiselect :non_working_week_days, (1..7).map {|d| [day_name(d), d.to_s]}, :inline => true %>
@@ -20,6 +22,7 @@
<%= setting_text_field :issues_export_limit, :size => 6 %>
<%= setting_text_field :gantt_items_limit, :size => 6 %>
+