diff --git a/app/models/rb_sprint.rb b/app/models/rb_sprint.rb index 6dc2bede7..f743a39bc 100644 --- a/app/models/rb_sprint.rb +++ b/app/models/rb_sprint.rb @@ -36,11 +36,7 @@ def initialize(sprint, direction) @data[:points_to_resolve] = series.collect{|s| s.to_resolve } @data[:points_to_accept] = series.collect{|s| s.to_accept } - if series[0].hours - @data[:hours_ideal] = (0 .. @days.size).collect{|i| (series[0].hours / @days.size) * i }.reverse - else - @data[:hours_ideal] = [nil] * @days.size - end + @data[:ideal] = (0..@days.size).to_a.reverse @data[:points_required_burn_rate] = series.collect{|r| r.to_resolve ? Float(r.to_resolve) / (r.days_left == 0 ? 1 : r.days_left) : nil } @data[:hours_required_burn_rate] = series.collect{|r| r.hours ? Float(r.hours) / (r.days_left == 0 ? 1 : r.days_left) : nil } @@ -55,16 +51,6 @@ def initialize(sprint, direction) else raise "Unexpected burn direction #{direction.inspect}" end - - max = {'hours' => nil, 'points' => nil} - @data.keys.each{|series| - units = series.to_s.gsub(/_.*/, '') - next unless ['points', 'hours'].include?(units) - max[units] = ([max[units]] + @data[series]).compact.max - } - - @data[:max_points] = max['points'] - @data[:max_hours] = max['hours'] end def [](i) @@ -77,7 +63,7 @@ def series(remove_empty = true) @series ||= {} return @series[remove_empty] if @series[remove_empty] - @series[remove_empty] = @data.keys.collect{|k| k.to_s}.select{|k| k =~ /^(points|hours)_/}.sort + @series[remove_empty] = @data.keys.collect{|k| k.to_s}.sort return @series[remove_empty] unless remove_empty # delete :points_committed if flatline diff --git a/app/views/rb_burndown_charts/_burndown.html.erb b/app/views/rb_burndown_charts/_burndown.html.erb index 289a77b6c..d59e33b80 100644 --- a/app/views/rb_burndown_charts/_burndown.html.erb +++ b/app/views/rb_burndown_charts/_burndown.html.erb @@ -14,11 +14,19 @@ :series => series.collect{|s| burndown[s].enum_for(:each_with_index).collect{|d,i| [i*2, d]}}, :position => Hash[*(0.upto(series.size - 1).collect{|i| [series[i], i]}.flatten)], :options => { - :series => series.collect{|s| {:label => l("label_#{s}"), :yaxis => (s.to_s =~ /^points/ ? 'y2axis' : 'yaxis')}}, + :series => series.collect{|s| + axis = s.to_s.split('_')[0] + { + :label => l("label_#{s}"), + :yaxis => {'hours' => 'yaxis', 'points' => 'y2axis', 'ideal' => 'y3axis'}[axis], + :showHighlight => (axis != 'ideal'), + :markerOptions => {:style => {'hours' => 'filledSquare', 'points' => 'filledCircle', 'ideal' => 'filledDiamond'}[axis]} + } + }, :legend => {:show => (mode == :full), :location => 'sw'}, :grid => {:shadow => false}, :seriesDefaults => {:showMarker => (mode == :full), :shadow => false}, - :axesDefaults => {:showTick => (mode == :full)}, + :axesDefaults => {:pad => 1.05, :showTick => (mode == :full)}, :axes => { :xaxis => { :min => 0, @@ -26,15 +34,18 @@ :ticks => ticks, :tickOptions => {:angle => -90, :fontSize => '8pt'} }, - :yaxis => {:min => 0, :max => burndown[:max_hours], :tickOptions => {:formatString => '%d'}}, - :y2axis => {:min => 0, :max => burndown[:max_points], :tickOptions => {:formatString => '%d'}} + :yaxis => {:label => l("label_hours"), :min => 0, :autoscale => true, :tickOptions => {:formatString => '%d'}}, + :y2axis => {:label => l("label_points"), :min => 0, :autoscale => true, :tickOptions => {:formatString => '%d'}}, + :y3axis => {:min => 0, :autoscale => true, :showTicks => false, :showTickMarks => false, :tickOptions => {:showGridline => false, :show => false}} }, - :highlighter => { :tooltipAxes => 'y', :formatString => '%s', :show => true } + :highlighter => { :bringSeriesToFront => true, :tooltipAxes => 'y', :formatString => '%s', :show => true } } } %> RB.burndown.charts[<%= sprint.id %>] = <%= chart.to_json %>; - RB.burndown.charts[<%= sprint.id %>].options.axesDefaults.tickRenderer = RB.$.jqplot.CanvasAxisTickRenderer; - RB.burndown.charts[<%= sprint.id %>].options.axes.xaxis.rendererOptions = {tickRenderer: RB.$.jqplot.CanvasAxisTickRenderer}; + // RB.burndown.charts[<%= sprint.id %>].options.axesDefaults.tickRenderer = RB.$.jqplot.CanvasAxisTickRenderer; + // RB.burndown.charts[<%= sprint.id %>].options.axes.xaxis.tickRenderer: RB.$.jqplot.CanvasAxisTickRenderer; + RB.burndown.charts[<%= sprint.id %>].options.axes.yaxis.labelRenderer = RB.$.jqplot.CanvasAxisLabelRenderer; + RB.burndown.charts[<%= sprint.id %>].options.axes.y2axis.labelRenderer = RB.$.jqplot.CanvasAxisLabelRenderer; RB.burndown.initialize(); diff --git a/config/locales/en.yml b/config/locales/en.yml index eb924c896..cb8f61936 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -73,7 +73,7 @@ en: label_burndown: Burndown label_chart_options: Chart Options label_hours: hours - label_hours_ideal: ideal + label_ideal: ideal label_hours_remaining: remaining hours label_hours_required_burn_rate: required burn rate (hours) label_impediments: Impediments