Rewrite the Gantt chart. #6276

This version of the Gantt chart supports nested charts. So Projects,
Versions, and Issues will be nested underneath their parents correctly.

Additional features:

* Move all Gantt code to Redmine::Helpers::Gantt class instead of having it in
  the Gantt class, controller, and view
* Recursive and nest sub-projects
* Recursive and nest versions
* Recursive and nest issues
* Draw a line showing when a Project is active and it's progress
* Draw a line showing when a Version is active and it's progress
* Show a version's % complete
* Change the color of Projects, Versions, and Issues if they are late or
  behind schedule
* Added Project#start_date and #due_date
* Added Project#completed_percent
* Use a mini-gravatar on the Gantt chart
* Added tests for the Gantt rendering

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4072 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Eric Davis
2010-09-10 03:09:02 +00:00
parent 8d52608dba
commit bdb3937e0f
29 changed files with 1879 additions and 403 deletions
+1 -1
View File
@@ -6,7 +6,7 @@ task :default => :spec
desc 'Run all application-specific specs'
Spec::Rake::SpecTask.new(:spec) do |t|
t.rcov = true
# t.rcov = true
end
desc "Report code statistics (KLOCs, etc) from the application"
+6 -3
View File
@@ -26,6 +26,9 @@ module GravatarHelper
# decorational picture, the alt text should be empty according to the
# XHTML specs.
:alt => '',
# The title text to use for the img tag for the gravatar.
:title => '',
# The class to assign to the img tag for the gravatar.
:class => 'gravatar',
@@ -48,8 +51,8 @@ module GravatarHelper
def gravatar(email, options={})
src = h(gravatar_url(email, options))
options = DEFAULT_OPTIONS.merge(options)
[:class, :alt, :size].each { |opt| options[opt] = h(options[opt]) }
"<img class=\"#{options[:class]}\" alt=\"#{options[:alt]}\" width=\"#{options[:size]}\" height=\"#{options[:size]}\" src=\"#{src}\" />"
[:class, :alt, :size, :title].each { |opt| options[opt] = h(options[opt]) }
"<img class=\"#{options[:class]}\" alt=\"#{options[:alt]}\" title=\"#{options[:title]}\" width=\"#{options[:size]}\" height=\"#{options[:size]}\" src=\"#{src}\" />"
end
# Returns the base Gravatar URL for the given email hash. If ssl evaluates to true,
@@ -82,4 +85,4 @@ module GravatarHelper
end
end
end
+15 -9
View File
@@ -4,34 +4,40 @@ require 'active_support' # to get "returning"
require File.dirname(__FILE__) + '/../lib/gravatar'
include GravatarHelper, GravatarHelper::PublicMethods, ERB::Util
context "gravatar_url with a custom default URL" do
setup do
describe "gravatar_url with a custom default URL" do
before(:each) do
@original_options = DEFAULT_OPTIONS.dup
DEFAULT_OPTIONS[:default] = "no_avatar.png"
@url = gravatar_url("somewhere")
end
specify "should include the \"default\" argument in the result" do
it "should include the \"default\" argument in the result" do
@url.should match(/&default=no_avatar.png/)
end
teardown do
after(:each) do
DEFAULT_OPTIONS.merge!(@original_options)
end
end
context "gravatar_url with default settings" do
setup do
describe "gravatar_url with default settings" do
before(:each) do
@url = gravatar_url("somewhere")
end
specify "should have a nil default URL" do
it "should have a nil default URL" do
DEFAULT_OPTIONS[:default].should be_nil
end
specify "should not include the \"default\" argument in the result" do
it "should not include the \"default\" argument in the result" do
@url.should_not match(/&default=/)
end
end
end
describe "gravatar with a custom title option" do
it "should include the title in the result" do
gravatar('example@example.com', :title => "This is a title attribute").should match(/This is a title attribute/)
end
end