diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index eec6977d..ac98c448 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -421,6 +421,20 @@ class ProjectsController < ApplicationController
@fixed_issues ||= []
end
+ def roadmap
+ @trackers = Tracker.find(:all, :conditions => ["is_in_roadmap=?", true], :order => 'position')
+ if request.get?
+ @selected_tracker_ids = @trackers.collect {|t| t.id.to_s }
+ else
+ @selected_tracker_ids = params[:tracker_ids].collect { |id| id.to_i.to_s } if params[:tracker_ids] and params[:tracker_ids].is_a? Array
+ end
+ @selected_tracker_ids ||= []
+ @versions = @project.versions.find(:all,
+ :conditions => [ "versions.effective_date>?", Date.today],
+ :order => "versions.effective_date ASC"
+ )
+ end
+
def activity
if params[:year] and params[:year].to_i > 1900
@year = params[:year].to_i
diff --git a/app/views/layouts/base.rhtml b/app/views/layouts/base.rhtml
index d5ae4d33..b359898f 100644
--- a/app/views/layouts/base.rhtml
+++ b/app/views/layouts/base.rhtml
@@ -89,6 +89,7 @@
<%= link_to l(:label_activity), {:controller => 'projects', :action => 'activity', :id => @project }, :class => "menuItem" %>
<%= link_to l(:label_news_plural), {:controller => 'projects', :action => 'list_news', :id => @project }, :class => "menuItem" %>
<%= link_to l(:label_change_log), {:controller => 'projects', :action => 'changelog', :id => @project }, :class => "menuItem" %>
+ <%= link_to l(:label_roadmap), {:controller => 'projects', :action => 'roadmap', :id => @project }, :class => "menuItem" %>
<%= link_to l(:label_document_plural), {:controller => 'projects', :action => 'list_documents', :id => @project }, :class => "menuItem" %>
<%= link_to l(:label_member_plural), {:controller => 'projects', :action => 'list_members', :id => @project }, :class => "menuItem" %>
<%= link_to l(:label_attachment_plural), {:controller => 'projects', :action => 'list_files', :id => @project }, :class => "menuItem" %>
@@ -111,6 +112,7 @@
<%= link_to l(:label_activity), :controller => 'projects', :action => 'activity', :id => @project %>
<%= link_to l(:label_news_plural), :controller => 'projects', :action => 'list_news', :id => @project %>
<%= link_to l(:label_change_log), :controller => 'projects', :action => 'changelog', :id => @project %>
+ <%= link_to l(:label_roadmap), :controller => 'projects', :action => 'roadmap', :id => @project %>
<%= link_to l(:label_document_plural), :controller => 'projects', :action => 'list_documents', :id => @project %>
<%= link_to l(:label_member_plural), :controller => 'projects', :action => 'list_members', :id => @project %>
<%= link_to l(:label_attachment_plural), :controller => 'projects', :action => 'list_files', :id => @project %>
diff --git a/app/views/projects/roadmap.rhtml b/app/views/projects/roadmap.rhtml
new file mode 100644
index 00000000..aad4d519
--- /dev/null
+++ b/app/views/projects/roadmap.rhtml
@@ -0,0 +1,26 @@
+<%=l(:label_roadmap)%>
+
+
+
+
+<% form_tag do %>
+
<%=l(:label_tracker_plural)%>
+<% @trackers.each do |tracker| %>
+ <%= check_box_tag "tracker_ids[]", tracker.id, (@selected_tracker_ids.include? tracker.id.to_s) %>
+ <%= tracker.name %>
+<% end %>
+
<%= submit_tag l(:button_apply), :class => 'button-small' %>
+<% end %>
+
+
+<% @versions.each do |version| %>
+
<%= version.name %>
+
<%= format_date(version.effective_date) %>
+ <%=h version.description %>
+
+ <% version.fixed_issues.find(:all, :conditions => ["issues.tracker_id in (#{@selected_tracker_ids.join(',')})"]).each do |issue| %>
+ - <%= link_to "#{issue.tracker.name} #{issue.id}", :controller => 'issues', :action => 'show', :id => issue %>: <%=h issue.subject %>
+ <% end %>
+
+<% end %>
+
\ No newline at end of file
diff --git a/app/views/trackers/_form.rhtml b/app/views/trackers/_form.rhtml
index 625c0d63..fd79bf5f 100644
--- a/app/views/trackers/_form.rhtml
+++ b/app/views/trackers/_form.rhtml
@@ -2,6 +2,7 @@
<%= f.text_field :name, :required => true %>
-
<%= f.check_box :is_in_chlog %>
+
<%= f.check_box :is_in_chlog %>
+
<%= f.check_box :is_in_roadmap %>
diff --git a/db/migrate/023_add_tracker_is_in_roadmap.rb b/db/migrate/023_add_tracker_is_in_roadmap.rb
new file mode 100644
index 00000000..82ef87bb
--- /dev/null
+++ b/db/migrate/023_add_tracker_is_in_roadmap.rb
@@ -0,0 +1,9 @@
+class AddTrackerIsInRoadmap < ActiveRecord::Migration
+ def self.up
+ add_column :trackers, :is_in_roadmap, :boolean, :default => true, :null => false
+ end
+
+ def self.down
+ remove_column :trackers, :is_in_roadmap
+ end
+end
diff --git a/db/migrate/024_add_roadmap_permission.rb b/db/migrate/024_add_roadmap_permission.rb
new file mode 100644
index 00000000..51c097ed
--- /dev/null
+++ b/db/migrate/024_add_roadmap_permission.rb
@@ -0,0 +1,9 @@
+class AddRoadmapPermission < ActiveRecord::Migration
+ def self.up
+ Permission.create :controller => "projects", :action => "roadmap", :description => "label_roadmap", :sort => 107, :is_public => true, :mail_option => 1, :mail_enabled => 0
+ end
+
+ def self.down
+ Permission.find(:first, :conditions => ["controller=? and action=?", 'projects', 'roadmap']).destroy
+ end
+end
diff --git a/lang/de.yml b/lang/de.yml
index ffc1f7f7..f3962d66 100644
--- a/lang/de.yml
+++ b/lang/de.yml
@@ -313,6 +313,7 @@ label_sort_highest: Erste
label_sort_higher: Aufzurichten
label_sort_lower: Herabzusteigen
label_sort_lowest: Letzter
+label_roadmap: Roadmap
button_login: Einloggen
button_submit: Einreichen
diff --git a/lang/en.yml b/lang/en.yml
index 824bb21f..fe691443 100644
--- a/lang/en.yml
+++ b/lang/en.yml
@@ -313,6 +313,7 @@ label_sort_highest: Move to top
label_sort_higher: Move up
label_sort_lower: Move down
label_sort_lowest: Move to bottom
+label_roadmap: Roadmap
button_login: Login
button_submit: Submit
diff --git a/lang/es.yml b/lang/es.yml
index ea07a50e..4c4ed816 100644
--- a/lang/es.yml
+++ b/lang/es.yml
@@ -313,6 +313,7 @@ label_sort_highest: Primero
label_sort_higher: Subir
label_sort_lower: Bajar
label_sort_lowest: Último
+label_roadmap: Roadmap
button_login: Conexión
button_submit: Someter
diff --git a/lang/fr.yml b/lang/fr.yml
index 6925a722..6f85240f 100644
--- a/lang/fr.yml
+++ b/lang/fr.yml
@@ -313,6 +313,7 @@ label_sort_highest: Remonter en premier
label_sort_higher: Remonter
label_sort_lower: Descendre
label_sort_lowest: Descendre en dernier
+label_roadmap: Roadmap
button_login: Connexion
button_submit: Soumettre
diff --git a/lib/tasks/load_default_data.rake b/lib/tasks/load_default_data.rake
index 12e0efd3..b554df1b 100644
--- a/lib/tasks/load_default_data.rake
+++ b/lib/tasks/load_default_data.rake
@@ -35,29 +35,29 @@ begin
puts "Loading default configuration data for language: #{current_language}"
# roles
- manager = Role.create :name => l(:default_role_manager)
+ manager = Role.create :name => l(:default_role_manager), :position => 1
manager.permissions = Permission.find(:all, :conditions => ["is_public=?", false])
- developper = Role.create :name => l(:default_role_developper)
+ developper = Role.create :name => l(:default_role_developper), :position => 2
perms = [150, 320, 321, 322, 420, 421, 422, 1050, 1060, 1070, 1075, 1130, 1220, 1221, 1222, 1223, 1224, 1320, 1322, 1061, 1057]
developper.permissions = Permission.find(:all, :conditions => ["sort IN (#{perms.join(',')})"])
- reporter = Role.create :name => l(:default_role_reporter)
+ reporter = Role.create :name => l(:default_role_reporter), :position => 3
perms = [1050, 1060, 1070, 1057, 1130]
reporter.permissions = Permission.find(:all, :conditions => ["sort IN (#{perms.join(',')})"])
# trackers
- Tracker.create(:name => l(:default_tracker_bug), :is_in_chlog => true)
- Tracker.create(:name => l(:default_tracker_feature), :is_in_chlog => true)
- Tracker.create(:name => l(:default_tracker_support), :is_in_chlog => false)
+ Tracker.create(:name => l(:default_tracker_bug), :is_in_chlog => true, :is_in_roadmap => false, :position => 1)
+ Tracker.create(:name => l(:default_tracker_feature), :is_in_chlog => true, :is_in_roadmap => true, :position => 2)
+ Tracker.create(:name => l(:default_tracker_support), :is_in_chlog => false, :is_in_roadmap => false, :position => 3)
# issue statuses
- new = IssueStatus.create(:name => l(:default_issue_status_new), :is_closed => false, :is_default => true, :html_color => 'F98787')
- assigned = IssueStatus.create(:name => l(:default_issue_status_assigned), :is_closed => false, :is_default => false, :html_color => 'C0C0FF')
- resolved = IssueStatus.create(:name => l(:default_issue_status_resolved), :is_closed => false, :is_default => false, :html_color => '88E0B3')
- feedback = IssueStatus.create(:name => l(:default_issue_status_feedback), :is_closed => false, :is_default => false, :html_color => 'F3A4F4')
- closed = IssueStatus.create(:name => l(:default_issue_status_closed), :is_closed => true, :is_default => false, :html_color => 'DBDBDB')
- rejected = IssueStatus.create(:name => l(:default_issue_status_rejected), :is_closed => true, :is_default => false, :html_color => 'F5C28B')
+ new = IssueStatus.create(:name => l(:default_issue_status_new), :is_closed => false, :is_default => true, :html_color => 'F98787', :position => 1)
+ assigned = IssueStatus.create(:name => l(:default_issue_status_assigned), :is_closed => false, :is_default => false, :html_color => 'C0C0FF', :position => 2)
+ resolved = IssueStatus.create(:name => l(:default_issue_status_resolved), :is_closed => false, :is_default => false, :html_color => '88E0B3', :position => 3)
+ feedback = IssueStatus.create(:name => l(:default_issue_status_feedback), :is_closed => false, :is_default => false, :html_color => 'F3A4F4', :position => 4)
+ closed = IssueStatus.create(:name => l(:default_issue_status_closed), :is_closed => true, :is_default => false, :html_color => 'DBDBDB', :position => 5)
+ rejected = IssueStatus.create(:name => l(:default_issue_status_rejected), :is_closed => true, :is_default => false, :html_color => 'F5C28B', :position => 6)
# workflow
Tracker.find(:all).each { |t|