summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2007-12-07 10:26:07 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2007-12-07 10:26:07 +0000
commit3c44aac1f50cfee83e87baa21d758620749c01e0 (patch)
tree3dfbb0892524bac3e2953de6825a8e763f287fbc /app
parent355289fa677f6a9a26e252e640861497a34cada6 (diff)
downloadredmine-3c44aac1f50cfee83e87baa21d758620749c01e0.tar.gz
redmine-3c44aac1f50cfee83e87baa21d758620749c01e0.zip
Added version details view accessible from the roadmap.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@955 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app')
-rw-r--r--app/controllers/versions_controller.rb10
-rw-r--r--app/helpers/versions_helper.rb28
-rw-r--r--app/models/issue_category.rb4
-rw-r--r--app/models/tracker.rb4
-rw-r--r--app/views/projects/roadmap.rhtml66
-rw-r--r--app/views/projects/settings/_versions.rhtml2
-rw-r--r--app/views/versions/_issue_counts.rhtml35
-rw-r--r--app/views/versions/_overview.rhtml24
-rw-r--r--app/views/versions/show.rhtml14
9 files changed, 144 insertions, 43 deletions
diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb
index 4e9016ebf..1365c97e8 100644
--- a/app/controllers/versions_controller.rb
+++ b/app/controllers/versions_controller.rb
@@ -21,6 +21,9 @@ class VersionsController < ApplicationController
cache_sweeper :version_sweeper, :only => [ :edit, :destroy ]
+ def show
+ end
+
def edit
if request.post? and @version.update_attributes(params[:version])
flash[:notice] = l(:notice_successful_update)
@@ -49,6 +52,13 @@ class VersionsController < ApplicationController
flash[:notice] = l(:notice_successful_delete)
redirect_to :controller => 'projects', :action => 'list_files', :id => @project
end
+
+ def status_by
+ respond_to do |format|
+ format.html { render :action => 'show' }
+ format.js { render(:update) {|page| page.replace_html 'status_by', render_issue_status_by(@version, params[:status_by])} }
+ end
+ end
private
def find_project
diff --git a/app/helpers/versions_helper.rb b/app/helpers/versions_helper.rb
index 452f4d7fb..0fcc6407c 100644
--- a/app/helpers/versions_helper.rb
+++ b/app/helpers/versions_helper.rb
@@ -16,4 +16,32 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module VersionsHelper
+
+ STATUS_BY_CRITERIAS = %w(category tracker priority author assigned_to)
+
+ def render_issue_status_by(version, criteria)
+ criteria ||= 'category'
+ raise 'Unknown criteria' unless STATUS_BY_CRITERIAS.include?(criteria)
+
+ h = Hash.new {|k,v| k[v] = [0, 0]}
+ begin
+ # Total issue count
+ Issue.count(:group => criteria,
+ :conditions => ["#{Issue.table_name}.fixed_version_id = ?", version.id]).each {|c,s| h[c][0] = s}
+ # Open issues count
+ Issue.count(:group => criteria,
+ :include => :status,
+ :conditions => ["#{Issue.table_name}.fixed_version_id = ? AND #{IssueStatus.table_name}.is_closed = ?", version.id, false]).each {|c,s| h[c][1] = s}
+ rescue ActiveRecord::RecordNotFound
+ # When grouping by an association, Rails throws this exception if there's no result (bug)
+ end
+ counts = h.keys.compact.sort.collect {|k| {:group => k, :total => h[k][0], :open => h[k][1], :closed => (h[k][0] - h[k][1])}}
+ max = counts.collect {|c| c[:total]}.max
+
+ render :partial => 'issue_counts', :locals => {:version => version, :criteria => criteria, :counts => counts, :max => max}
+ end
+
+ def status_by_options_for_select(value)
+ options_for_select(STATUS_BY_CRITERIAS.collect {|criteria| [l("field_#{criteria}".to_sym), criteria]}, value)
+ end
end
diff --git a/app/models/issue_category.rb b/app/models/issue_category.rb
index 9478504f1..51baeb419 100644
--- a/app/models/issue_category.rb
+++ b/app/models/issue_category.rb
@@ -35,5 +35,9 @@ class IssueCategory < ActiveRecord::Base
destroy_without_reassign
end
+ def <=>(category)
+ name <=> category.name
+ end
+
def to_s; name end
end
diff --git a/app/models/tracker.rb b/app/models/tracker.rb
index 6de2a098c..8d8647747 100644
--- a/app/models/tracker.rb
+++ b/app/models/tracker.rb
@@ -29,6 +29,10 @@ class Tracker < ActiveRecord::Base
def to_s; name end
+ def <=>(tracker)
+ name <=> tracker.name
+ end
+
def self.all
find(:all, :order => 'position')
end
diff --git a/app/views/projects/roadmap.rhtml b/app/views/projects/roadmap.rhtml
index 7c3544a53..daf7639fc 100644
--- a/app/views/projects/roadmap.rhtml
+++ b/app/views/projects/roadmap.rhtml
@@ -5,48 +5,28 @@
<% end %>
<% @versions.each do |version| %>
- <a name="<%= version.name %>"><h3 class="icon22 icon22-package"><%= version.name %></h3></a>
- <% if version.completed? %>
- <p><%= format_date(version.effective_date) %></p>
- <% elsif version.overdue? %>
- <p><strong><%= l(:label_roadmap_overdue, distance_of_time_in_words(Time.now, version.effective_date)) %> (<%= format_date(version.effective_date) %>)</strong></p>
- <% elsif version.effective_date %>
- <p><strong><%=l(:label_roadmap_due_in)%> <%= distance_of_time_in_words Time.now, version.effective_date %> (<%= format_date(version.effective_date) %>)</strong></p>
- <% end %>
- <p><%=h version.description %></p>
-
- <% if version.fixed_issues.count > 0 %>
- <%= progress_bar([version.closed_pourcent, version.completed_pourcent], :width => '40em', :legend => ('%0.0f%' % version.completed_pourcent)) %>
- <p class="progress-info">
- <%= link_to(version.closed_issues_count, :controller => 'issues', :action => 'index', :project_id => @project, :status_id => 'c', :fixed_version_id => version, :set_filter => 1) %>
- <%= lwr(:label_closed_issues, version.closed_issues_count) %>
- (<%= '%0.0f' % (version.closed_issues_count.to_f / version.fixed_issues.count * 100) %>%)
- &#160;
- <%= link_to(version.open_issues_count, :controller => 'issues', :action => 'index', :project_id => @project, :status_id => 'o', :fixed_version_id => version, :set_filter => 1) %>
- <%= lwr(:label_open_issues, version.open_issues_count)%>
- (<%= '%0.0f' % (version.open_issues_count.to_f / version.fixed_issues.count * 100) %>%)
- </p>
- <%= render(:partial => "wiki/content", :locals => {:content => version.wiki_page.content}) if version.wiki_page %>
- <% issues = version.fixed_issues.find(:all,
- :include => [:status, :tracker],
- :conditions => ["tracker_id in (#{@selected_tracker_ids.join(',')})"],
- :order => "#{Tracker.table_name}.position") unless @selected_tracker_ids.empty?
- issues ||= []
- %>
- <ul>
- <% if issues.size > 0 %>
- <% issues.each do |issue| %>
- <li>
- <%= link = link_to_issue(issue)
- issue.status.is_closed? ? content_tag("del", link) : link %>: <%=h issue.subject %>
- <%= content_tag "em", "(#{l(:label_closed_issues)})" if issue.status.is_closed? %>
- </li>
- <% end %>
- <% end %>
- </ul>
- <% else %>
- <p><em><%= l(:label_roadmap_no_issues) %></em></p>
- <% end %>
+ <%= tag 'a', :name => version.name %>
+ <h3 class="icon22 icon22-package"><%= link_to h(version.name), :controller => 'versions', :action => 'show', :id => version %></h3>
+ <%= render :partial => 'versions/overview', :locals => {:version => version} %>
+ <%= render(:partial => "wiki/content", :locals => {:content => version.wiki_page.content}) if version.wiki_page %>
+
+ <% issues = version.fixed_issues.find(:all,
+ :include => [:status, :tracker],
+ :conditions => ["tracker_id in (#{@selected_tracker_ids.join(',')})"],
+ :order => "#{Tracker.table_name}.position") unless @selected_tracker_ids.empty?
+ issues ||= []
+ %>
+ <ul>
+ <% if issues.size > 0 %>
+ <% issues.each do |issue| %>
+ <li>
+ <%= link = link_to_issue(issue)
+ issue.status.is_closed? ? content_tag("del", link) : link %>: <%=h issue.subject %>
+ <%= content_tag "em", "(#{l(:label_closed_issues)})" if issue.status.is_closed? %>
+ </li>
+ <% end %>
+ <% end %>
+ </ul>
<% end %>
<% content_for :sidebar do %>
@@ -66,3 +46,5 @@
<%= link_to version.name, :anchor => version.name %><br />
<% end %>
<% end %>
+
+<% set_html_title l(:label_roadmap) %>
diff --git a/app/views/projects/settings/_versions.rhtml b/app/views/projects/settings/_versions.rhtml
index 63c408b0d..7329c7f3b 100644
--- a/app/views/projects/settings/_versions.rhtml
+++ b/app/views/projects/settings/_versions.rhtml
@@ -11,7 +11,7 @@
<tbody>
<% for version in @project.versions.sort %>
<tr class="<%= cycle 'odd', 'even' %>">
- <td><%=h version.name %></td>
+ <td><%= link_to h(version.name), :controller => 'versions', :action => 'show', :id => version %></td>
<td align="center"><%= format_date(version.effective_date) %></td>
<td><%=h version.description %></td>
<td><%= link_to(version.wiki_page_title, :controller => 'wiki', :page => Wiki.titleize(version.wiki_page_title)) unless version.wiki_page_title.blank? || @project.wiki.nil? %></td>
diff --git a/app/views/versions/_issue_counts.rhtml b/app/views/versions/_issue_counts.rhtml
new file mode 100644
index 000000000..4bab5c659
--- /dev/null
+++ b/app/views/versions/_issue_counts.rhtml
@@ -0,0 +1,35 @@
+<form id="status_by_form">
+<fieldset>
+<legend>
+<%= l(:label_issues_by,
+ select_tag('status_by',
+ status_by_options_for_select(criteria),
+ :id => 'status_by_select',
+ :onchange => remote_function(:url => { :action => :status_by, :id => version },
+ :with => "Form.serialize('status_by_form')"))) %>
+</legend>
+<% if counts.empty? %>
+ <p><em><%= l(:label_no_data) %></em></p>
+<% else %>
+ <table>
+ <% counts.each do |count| %>
+ <tr>
+ <td width="130px" align="right" >
+ <%= link_to count[:group], {:controller => 'issues',
+ :action => 'index',
+ :project_id => version.project,
+ :set_filter => 1,
+ :fixed_version_id => version,
+ "#{criteria}_id" => count[:group]} %>
+ </td>
+ <td width="240px">
+ <%= progress_bar((count[:closed].to_f / count[:total])*100,
+ :legend => "#{count[:closed]}/#{count[:total]}",
+ :width => "#{(count[:total].to_f / max * 200).floor}px;") %>
+ </td>
+ </tr>
+ <% end %>
+ </table>
+<% end %>
+</fieldset>
+</form>
diff --git a/app/views/versions/_overview.rhtml b/app/views/versions/_overview.rhtml
new file mode 100644
index 000000000..d3aa6b18f
--- /dev/null
+++ b/app/views/versions/_overview.rhtml
@@ -0,0 +1,24 @@
+<% if version.completed? %>
+ <p><%= format_date(version.effective_date) %></p>
+<% elsif version.overdue? %>
+ <p><strong><%= l(:label_roadmap_overdue, distance_of_time_in_words(Time.now, version.effective_date)) %> (<%= format_date(version.effective_date) %>)</strong></p>
+<% elsif version.effective_date %>
+ <p><strong><%=l(:label_roadmap_due_in)%> <%= distance_of_time_in_words Time.now, version.effective_date %> (<%= format_date(version.effective_date) %>)</strong></p>
+<% end %>
+
+<p><%=h version.description %></p>
+
+<% if version.fixed_issues.count > 0 %>
+ <%= progress_bar([version.closed_pourcent, version.completed_pourcent], :width => '40em', :legend => ('%0.0f%' % version.completed_pourcent)) %>
+ <p class="progress-info">
+ <%= link_to(version.closed_issues_count, :controller => 'issues', :action => 'index', :project_id => version.project, :status_id => 'c', :fixed_version_id => version, :set_filter => 1) %>
+ <%= lwr(:label_closed_issues, version.closed_issues_count) %>
+ (<%= '%0.0f' % (version.closed_issues_count.to_f / version.fixed_issues.count * 100) %>%)
+ &#160;
+ <%= link_to(version.open_issues_count, :controller => 'issues', :action => 'index', :project_id => version.project, :status_id => 'o', :fixed_version_id => version, :set_filter => 1) %>
+ <%= lwr(:label_open_issues, version.open_issues_count)%>
+ (<%= '%0.0f' % (version.open_issues_count.to_f / version.fixed_issues.count * 100) %>%)
+ </p>
+<% else %>
+ <p><em><%= l(:label_roadmap_no_issues) %></em></p>
+<% end %>
diff --git a/app/views/versions/show.rhtml b/app/views/versions/show.rhtml
new file mode 100644
index 000000000..d8e2d243d
--- /dev/null
+++ b/app/views/versions/show.rhtml
@@ -0,0 +1,14 @@
+<div class="contextual">
+<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => @version}, :class => 'icon icon-edit' %>
+</div>
+
+<h2><%= h(@version.name) %></h2>
+
+<div id="status_by" style="float:right;">
+<%= render_issue_status_by(@version, params[:status_by]) if @version.fixed_issues.count > 0 %>
+</div>
+
+<%= render :partial => 'versions/overview', :locals => {:version => @version} %>
+<%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %>
+
+<% set_html_title h(@version.name) %>