Commit fa1b55b8d65da975b9546e75dbfe543617deec1d

Authored by Paulo Meireles
2 parents b7cf2db3 7ad05188

Merge branch 'mezuro-dev' into mezuro

Conflicts:
	plugins/mezuro/controllers/mezuro_plugin_profile_controller.rb
	plugins/mezuro/lib/mezuro_plugin/helpers/content_viewer_helper.rb
	plugins/mezuro/views/mezuro_plugin_myprofile/_range_form.html.erb
plugins/mezuro/controllers/mezuro_plugin_myprofile_controller.rb
... ... @@ -60,7 +60,7 @@ class MezuroPluginMyprofileController < ProfileController
60 60 redirect_to "/myprofile/#{profile.identifier}/plugin/mezuro/edit_metric_configuration?id=#{id}&metric_name=#{metric_name.gsub(/\s/, '+')}"
61 61 end
62 62 end
63   -
  63 +
64 64 def create_compound_metric_configuration
65 65 id = params[:id]
66 66 metric_name = params[:metric_configuration][:metric][:name]
... ... @@ -108,14 +108,14 @@ class MezuroPluginMyprofileController < ProfileController
108 108 redirect_to "/#{profile.identifier}/#{configuration_content.slug}"
109 109 end
110 110 end
111   -
  111 +
112 112 def new_range
113 113 @configuration_content = profile.articles.find(params[:id])
114 114 @metric_name = params[:metric_name]
115 115 @range = Kalibro::Range.new
116 116 @range_color = "#000000"
117 117 end
118   -
  118 +
119 119 def edit_range
120 120 @configuration_content = profile.articles.find(params[:id])
121 121 @metric_name = params[:metric_name]
... ... @@ -129,14 +129,14 @@ class MezuroPluginMyprofileController < ProfileController
129 129 @configuration_content = profile.articles.find(params[:id])
130 130 @range = Kalibro::Range.new params[:range]
131 131 metric_name = params[:metric_name]
132   - metric_configuration = Kalibro::MetricConfiguration.find_by_configuration_name_and_metric_name(@configuration_content.name, metric_name)
  132 + metric_configuration = Kalibro::MetricConfiguration.find_by_configuration_name_and_metric_name(@configuration_content.name, metric_name)
133 133 metric_configuration.add_range(@range)
134 134 metric_configuration.save
135 135 if metric_configuration_has_errors? metric_configuration
136 136 redirect_to_error_page metric_configuration.errors[0].message
137 137 end
138 138 end
139   -
  139 +
140 140 def update_range
141 141 configuration_content = profile.articles.find(params[:id])
142 142 metric_name = params[:metric_name]
... ... @@ -149,7 +149,7 @@ class MezuroPluginMyprofileController < ProfileController
149 149 redirect_to_error_page metric_configuration.errors[0].message
150 150 end
151 151 end
152   -
  152 +
153 153 def remove_range
154 154 configuration_content = profile.articles.find(params[:id])
155 155 metric_name = params[:metric_name]
... ...
plugins/mezuro/controllers/mezuro_plugin_profile_controller.rb
... ... @@ -36,7 +36,7 @@ class MezuroPluginProfileController < ProfileController
36 36 else
37 37 render :partial => 'content_viewer/project_result'
38 38 end
39   - end
  39 + end
40 40  
41 41 def module_result
42 42 @content = profile.articles.find(params[:id])
... ... @@ -81,24 +81,26 @@ class MezuroPluginProfileController < ProfileController
81 81 if project_content_has_errors?
82 82 redirect_to_error_page(@content.errors[:base])
83 83 else
84   - @score_history = modules_results.collect { |module_result| module_result.grade }
  84 + @score_history = modules_results.map do |module_result|
  85 + [module_result.grade, format_date_to_simple_form(module_result.date)]
  86 + end
85 87 render :partial => 'content_viewer/score_history'
86 88 end
87 89 end
88   -
  90 +
89 91 private
90   -
  92 +
91 93 def filtering_metric_history(metric_name, module_history)
92 94 metrics_history = module_history.map do |module_result|
93   - module_result.metric_results
  95 + [module_result.metric_results, format_date_to_simple_form(module_result.date)]
94 96 end
95   - metric_history = metrics_history.map do |array_of_metric_result|
96   - (array_of_metric_result.select do |metric_result|
  97 + metric_history = metrics_history.map do |metric_results_with_date|
  98 + [(metric_results_with_date.first.select do |metric_result|
97 99 metric_result.metric.name.delete("() ") == metric_name
98   - end).first
  100 + end).first, metric_results_with_date.last]
99 101 end
100   - metric_history.map do |metric_result|
101   - metric_result.value
  102 + metric_history.map do |metric_result_with_date|
  103 + [metric_result_with_date.first.value, metric_result_with_date.last]
102 104 end
103 105 end
104 106  
... ... @@ -110,5 +112,9 @@ class MezuroPluginProfileController < ProfileController
110 112 def project_content_has_errors?
111 113 not @content.errors[:base].nil?
112 114 end
113   -end
114 115  
  116 + def format_date_to_simple_form date
  117 + date.to_s[0..9]
  118 + end
  119 +
  120 +end
... ...
plugins/mezuro/lib/kalibro/range.rb
... ... @@ -34,4 +34,12 @@ class Kalibro::Range < Kalibro::Model
34 34 @grade = value.to_f
35 35 end
36 36  
  37 + def mezuro_color
  38 + @color.nil? ? "#e4ca2d" : @color.gsub(/^ff/, "#")
  39 + end
  40 +
  41 + def color=(new_color)
  42 + @color = new_color.gsub(/^#/, "ff")
  43 + end
  44 +
37 45 end
... ...
plugins/mezuro/lib/mezuro_plugin/helpers/content_viewer_helper.rb
1 1 require 'googlecharts'
2 2  
3 3 class MezuroPlugin::Helpers::ContentViewerHelper
  4 +
  5 + MAX_NUMBER_OF_LABELS = 5
  6 +
4 7 def self.format_grade(grade)
5 8 sprintf("%.2f", grade.to_f)
6 9 end
... ... @@ -8,7 +11,7 @@ class MezuroPlugin::Helpers::ContentViewerHelper
8 11 def self.create_periodicity_options
9 12 [["Not Periodically", 0], ["1 day", 1], ["2 days", 2], ["Weekly", 7], ["Biweeky", 15], ["Monthly", 30]]
10 13 end
11   -
  14 +
12 15 def self.create_license_options
13 16 options = YAML.load_file("#{RAILS_ROOT}/plugins/mezuro/licenses.yaml")
14 17 options = options.split(";")
... ... @@ -16,15 +19,23 @@ class MezuroPlugin::Helpers::ContentViewerHelper
16 19 options.each { |option| formated_options << [option, option] }
17 20 formated_options
18 21 end
19   -
20   - def self.generate_chart(values)
21   - Gchart.line(
  22 +
  23 + def self.generate_chart(score_history)
  24 + values = []
  25 + labels = []
  26 + score_history.each do |score_data|
  27 + values << score_data.first
  28 + labels << score_data.last
  29 + end
  30 + labels = discretize_array labels
  31 + Gchart.line(
22 32 :title_color => 'FF0000',
23 33 :size => '600x180',
24 34 :bg => {:color => 'efefef', :type => 'stripes'},
25 35 :line_colors => 'c4a000',
26 36 :data => values,
27   - :axis_with_labels => 'y',
  37 + :labels => labels,
  38 + :axis_with_labels => ['y','x'],
28 39 :max_value => values.max,
29 40 :min_value => values.min
30 41 )
... ... @@ -35,14 +46,33 @@ class MezuroPlugin::Helpers::ContentViewerHelper
35 46 selected_option = options.find { |option| option.last == index.to_i }
36 47 selected_option.first
37 48 end
38   -
  49 +
39 50 def self.format_name(metric_result)
40 51 metric_result.metric.name.delete("() ")
41 52 end
42   -
  53 +
43 54 def self.get_license_option(selected)
44 55 options = YAML.load_file("#{RAILS_ROOT}/plugins/mezuro/licenses.yaml")
45 56 options.split(";")
46 57 selected_option = options.find { |license| license == selected }
47 58 end
  59 +
  60 + private
  61 +
  62 + def self.discretize_array(array)
  63 + if array.size > MAX_NUMBER_OF_LABELS
  64 + range_array.map { |i| discrete_element(array, i)}
  65 + else
  66 + array
  67 + end
  68 + end
  69 +
  70 + def self.range_array
  71 + (0..(MAX_NUMBER_OF_LABELS - 1)).to_a
  72 + end
  73 +
  74 + def self.discrete_element(array, i)
  75 + array[(i*(array.size - 1))/(MAX_NUMBER_OF_LABELS - 1)]
  76 + end
  77 +
48 78 end
... ...
plugins/mezuro/public/javascripts/project_content.js
... ... @@ -51,23 +51,8 @@ function reloadModule(){
51 51 return false;
52 52 }
53 53  
54   -function reloadProjectWithDate(){
55   - var day = jQuery("#project_date_day").val();
56   - var month = jQuery("#project_date_month").val();
57   - var year = jQuery("#project_date_year").val();
58   -
59   - if(day.length == 1)
60   - day = "0" + day;
61   - if(month.length == 1)
62   - month = "0" + month;
63   -
64   - var date = new Date(year + "-" + month + "-" + day + "T00:00:00+00:00");
65   -
66   - if(isNaN(date)){
67   - alert("Invalid date! " + date);
68   - return false;
69   - }
70   - reloadProject(date);
  54 +function reloadProjectWithDate(date){
  55 + reloadProject(date + "T00:00:00+00:00");
71 56 return false;
72 57 }
73 58  
... ...
plugins/mezuro/public/javascripts/validations.js
... ... @@ -39,14 +39,6 @@ function IsNotInfinite(value){
39 39 return true;
40 40 }
41 41  
42   -function IsNotHexadecimal(value){
43   - if(value.match(/^[0-9a-fA-F]{1,8}$/))
44   - {
45   - return false;
46   - }
47   - return true;
48   -}
49   -
50 42 function validate_new_range_configuration(event){
51 43 var label = jQuery("#range_label").val();
52 44 var beginning = jQuery("#range_beginning").val();
... ... @@ -56,24 +48,20 @@ function validate_new_range_configuration(event){
56 48  
57 49 if (is_null(label) || is_null(beginning) || is_null(end) || is_null(color) || is_null(grade))
58 50 {
59   - alert("Please fill all fields marked with (*)");
  51 + alert("Please fill all fields marked with (*).");
60 52 return false;
61 53 }
62 54 if ( (IsNotNumeric(beginning) && IsNotInfinite(beginning)) || (IsNotNumeric(end) && IsNotInfinite(end)) || IsNotNumeric(grade))
63 55 {
64   - alert("Beginning, End and Grade must be numeric values");
  56 + alert("Beginning, End and Grade must be numeric values.");
65 57 return false;
66 58 }
67 59 if (parseInt(beginning) > parseInt(end))
68 60 {
69 61 if(IsNotInfinite(beginning) && IsNotInfinite(end)){
70   - alert("End must be greater than Beginning");
  62 + alert("End must be greater than Beginning.");
71 63 return false;
72 64 }
73 65 }
74   - if (IsNotHexadecimal(color)){
75   - alert("Color must be an hexadecimal value");
76   - return false;
77   - }
78 66 return true;
79 67 }
... ...
plugins/mezuro/test/functional/mezuro_plugin_profile_controller_test.rb
... ... @@ -126,7 +126,7 @@ class MezuroPluginProfileControllerTest &lt; ActionController::TestCase
126 126 get :module_metrics_history, :profile => @profile.identifier, :id => @content.id, :module_name => @project.name,
127 127 :metric_name => @module_result.metric_result.first.metric.name.delete("() ")
128 128 assert_equal @content, assigns(:content)
129   - assert_equal [@module_result.metric_result[0].value], assigns(:score_history)
  129 + assert_equal [[@module_result.metric_result[0].value, @module_result.date.to_s[0..9]]], assigns(:score_history)
130 130 assert_response 200
131 131 end
132 132  
... ... @@ -134,7 +134,7 @@ class MezuroPluginProfileControllerTest &lt; ActionController::TestCase
134 134 Kalibro::ModuleResult.expects(:request).with("ModuleResult", :get_result_history, {:project_name => @project.name, :module_name => @project.name}).returns({:module_result => @module_result})
135 135 get :module_grade_history, :profile => @profile.identifier, :id => @content.id, :module_name => @project.name
136 136 assert_equal @content, assigns(:content)
137   - assert_equal [@module_result.grade], assigns(:score_history)
  137 + assert_equal [[@module_result.grade, @module_result.date.to_s[0..9]]], assigns(:score_history)
138 138 assert_response 200
139 139 end
140 140  
... ...
plugins/mezuro/test/unit/kalibro/range_test.rb
... ... @@ -17,4 +17,16 @@ class RangeTest &lt; ActiveSupport::TestCase
17 17 assert_equal @hash, @range.to_hash
18 18 end
19 19  
  20 + should 'create a default color for new range' do
  21 + assert_equal "#e4ca2d", Kalibro::Range.new.mezuro_color
  22 + end
  23 +
  24 + should "convert color from 'ff' to '#'" do
  25 + assert_equal "#ff0000", @range.mezuro_color
  26 + end
  27 +
  28 + should "convert color from '#' to 'ff' when creating a new range" do
  29 + assert_equal "ffff0000", Kalibro::Range.new({:color => '#ff0000'}).color
  30 + end
  31 +
20 32 end
... ...
plugins/mezuro/views/content_viewer/_project_result.rhtml
1 1 <% unless @content.errors[:base].nil? %>
2 2 <%= @content.errors[:base] %>
3 3 <% else %>
4   - <% form_for :project_date, :html=>{:id=>"project_history_date"} do |f| %>
5   - <%= f.label :day, "Choose project date:" %>
6   -
7   - <table>
8   - <tr>
9   - <td>
10   - Day
11   - </td>
12   - <td>
13   - Month
14   - </td>
15   - <td>
16   - Year
17   - </td>
18   - </tr>
19   - <tr>
20   - <td>
21   - <%= f.text_field :day, :size => 1, :maxlength => 2, :placeholder =>"dd" %>
22   - </td>
23   - <td>
24   - <%= f.text_field :month, :size => 1, :maxlength => 2, :placeholder =>"mm" %>
25   - </td>
26   - <td>
27   - <%= f.text_field :year, :size => 1, :maxlength => 4, :placeholder =>"yyyy" %>
28   - </td>
29   - </tr>
30   - </table>
31   - <%= f.submit "Refresh" %>
32   - <% end %>
33   -
  4 + <p> Choose a date to see specific project results: </p>
  5 + <div id="datepicker" data-date="<%= @project_result.date %>">
  6 + <input id="datepicker_field" style="display:none"/>
  7 + </div>
34 8  
35 9 <h4><%= _('Last Result') %></h4>
36 10  
... ... @@ -48,4 +22,18 @@
48 22 <td><%= @project_result.formatted_analysis_time %></td>
49 23 </tr>
50 24 </table>
  25 +
  26 +
  27 + <script>
  28 + jQuery(document).ready(function($) {
  29 + $("#datepicker").datepicker({ altField: '#datepicker_field', showOn: 'button', dateFormat: "yy-mm-dd",
  30 + buttonImageOnly: true, buttonImage: '/images/calendar_date_select/calendar.png',
  31 + onSelect: function(dateText, inst) {
  32 + reloadProjectWithDate(dateText) } });
  33 + var date = jQuery("#datepicker").attr('data-date').substr(0,10);
  34 + $("#datepicker").datepicker( "setDate" , date );
  35 +
  36 + });
  37 + </script>
  38 +
51 39 <% end %>
... ...
plugins/mezuro/views/mezuro_plugin_myprofile/_range_form.html.erb
... ... @@ -38,7 +38,7 @@
38 38 <%= f.label :color, "(*) Color:" %>
39 39 </td>
40 40 <td>
41   - <%= f.text_field(:color, :id => "range_color", :value => @range_color) %>
  41 + <%= f.text_field(:color, :id => "range_color", :value => @range.mezuro_color) %>
42 42 </td>
43 43 </tr>
44 44 <tr>
... ... @@ -53,10 +53,9 @@
53 53 <%= f.submit "Save Range" %>
54 54  
55 55 <script>jQuery(document).ready(function($) {
56   - $('#range_color').colorPicker({
57   - onColorChange : function(id, newValue) {
58   - newValue = newValue.replace(/#/gi, "ff");
59   - jQuery('#range_color').val(newValue);
60   - }
  56 + $('#range_color').colorPicker({
  57 + onColorChange : function(id, newValue) {
  58 + jQuery('#range_color').val(newValue);
  59 + }
61 60 });
62 61 });</script>
... ...