Commit 39b737871f139fa0ee63818c6cdf1763756b41be
1 parent
17ee9571
Exists in
colab
and in
4 other branches
Highcharts replaced by Gruff due to license incompability
Still need to work on the layout
Showing
9 changed files
with
63 additions
and
65 deletions
Show diff stats
Gemfile
... | ... | @@ -45,6 +45,9 @@ gem "pg", "~> 0.17.0" |
45 | 45 | # Twitter Bootstrap for layout |
46 | 46 | gem "twitter-bootstrap-rails", "~> 2.2.8" |
47 | 47 | |
48 | +# Chart generation | |
49 | +gem "gruff", "~> 0.5.1" | |
50 | + | |
48 | 51 | group :doc do |
49 | 52 | # bundle exec rake doc:rails generates the API under doc/api. |
50 | 53 | gem 'sdoc', require: false | ... | ... |
Gemfile.lock
... | ... | @@ -88,6 +88,8 @@ GEM |
88 | 88 | railties (>= 3.0.0) |
89 | 89 | gherkin (2.12.2) |
90 | 90 | multi_json (~> 1.3) |
91 | + gruff (0.5.1) | |
92 | + rmagick | |
91 | 93 | gyoku (1.1.0) |
92 | 94 | builder (>= 2.1.2) |
93 | 95 | highline (1.6.20) |
... | ... | @@ -165,6 +167,7 @@ GEM |
165 | 167 | ref (1.0.5) |
166 | 168 | rest-client (1.6.7) |
167 | 169 | mime-types (>= 1.16) |
170 | + rmagick (2.13.2) | |
168 | 171 | rspec-core (2.14.7) |
169 | 172 | rspec-expectations (2.14.4) |
170 | 173 | diff-lcs (>= 1.1.3, < 2.0) |
... | ... | @@ -257,6 +260,7 @@ DEPENDENCIES |
257 | 260 | database_cleaner |
258 | 261 | devise (~> 3.2.0) |
259 | 262 | factory_girl_rails (~> 4.3.0) |
263 | + gruff (~> 0.5.1) | |
260 | 264 | jbuilder (~> 1.2) |
261 | 265 | jquery-rails |
262 | 266 | kalibro_entities (~> 0.0.1.rc6) | ... | ... |
README.rdoc
... | ... | @@ -12,7 +12,7 @@ platform with Mezuro Plugin actived to access Kalibro Web Service. |
12 | 12 | 3. <tt>cap deploy:setup</tt> will install the ruby correct ruby version, the gemset and all the directories tree; |
13 | 13 | 4. <tt>cap deploy:migrations</tt> deploys the code and run all the migrations |
14 | 14 | |
15 | -* System dependencies | |
15 | +* System dependencies (Ubuntu package names) | |
16 | 16 | |
17 | 17 | * build-essential |
18 | 18 | |
... | ... | @@ -28,6 +28,12 @@ platform with Mezuro Plugin actived to access Kalibro Web Service. |
28 | 28 | |
29 | 29 | * PhantomJS 1.9.1 (http://phantomjs.org/) |
30 | 30 | |
31 | + * imagemagick | |
32 | + | |
33 | + * libmagickcore-dev | |
34 | + | |
35 | + * libmagickwand-dev | |
36 | + | |
31 | 37 | * Ruby version |
32 | 38 | |
33 | 39 | 2.0.0-p247 | ... | ... |
673 Bytes
app/assets/javascripts/graphics.js
... | ... | @@ -1,51 +0,0 @@ |
1 | -function chart_of_the_historic_of_metric (json_params, dinamic_values) | |
2 | -{ | |
3 | - container_id = json_params['container_id']; | |
4 | - metric_name = json_params['metric_name']; | |
5 | - module_name = json_params['module_name']; | |
6 | - dates = dinamic_values['dates']; | |
7 | - metric_values = dinamic_values['values']; | |
8 | - | |
9 | - $('#tr_container_' + container_id).hide(); | |
10 | - $(function () { | |
11 | - $('#container_'+container_id).highcharts({ | |
12 | - chart: { | |
13 | - marginBottom: 80, | |
14 | - width: 600, | |
15 | - style: {margin: '0 auto'} | |
16 | - }, | |
17 | - title: { | |
18 | - text: metric_name, | |
19 | - x: -20 //center | |
20 | - }, | |
21 | - subtitle: { | |
22 | - text: module_name, | |
23 | - x: -20 | |
24 | - }, | |
25 | - xAxis: { | |
26 | - categories: dates | |
27 | - }, | |
28 | - yAxis: { | |
29 | - title: { | |
30 | - text: 'Value' | |
31 | - }, | |
32 | - labels: { | |
33 | - align: 'left', | |
34 | - x: 0, | |
35 | - y: -2 | |
36 | - }, | |
37 | - plotLines: [{ | |
38 | - value: 0, | |
39 | - width: 1, | |
40 | - color: '#808080' | |
41 | - }] | |
42 | - }, | |
43 | - series: [{ | |
44 | - name: 'Metric value', | |
45 | - data: metric_values | |
46 | - }] | |
47 | - }); | |
48 | - }); | |
49 | - | |
50 | - $('#tr_container_' + container_id).show("slow"); | |
51 | -} | |
52 | 0 | \ No newline at end of file |
... | ... | @@ -0,0 +1,21 @@ |
1 | +@Module = { } | |
2 | + | |
3 | +class Module.Graphic | |
4 | + constructor: (@container, @metric_name, @module_id) -> | |
5 | + $('tr#'+@container).slideDown('slow') | |
6 | + this.load() | |
7 | + | |
8 | + load: -> | |
9 | + # Those two var are necessary so the jQuery callback can use them | |
10 | + # Otherwise the scope of the callback function is isolated | |
11 | + container = @container | |
12 | + display = this.display | |
13 | + | |
14 | + $.get '/modules/metric_history', | |
15 | + metric_name: @metric_name | |
16 | + module_id: @module_id | |
17 | + (data) -> | |
18 | + display(data,container) | |
19 | + | |
20 | + display: (data, container) -> | |
21 | + $('div#'+container).html('<img src="data:image/png;base64,' + data + '" />') | ... | ... |
app/controllers/modules_controller.rb
1 | -require 'json' | |
2 | 1 | class ModulesController < ApplicationController |
3 | 2 | |
4 | 3 | # GET /modules/metric_history |
... | ... | @@ -11,7 +10,25 @@ class ModulesController < ApplicationController |
11 | 10 | dates.push date |
12 | 11 | values.push metric_history[date] |
13 | 12 | end |
14 | - render :json => {dates: dates, values: values}.to_json | |
13 | + | |
14 | + send_data(Base64.encode64(graphic_for(values, dates)), type: 'image/png', filename: "#{params[:module_id]}-#{params[:metric_name]}.png") | |
15 | + end | |
16 | + | |
17 | + private | |
18 | + | |
19 | + def graphic_for(values, dates) | |
20 | + graphic = Gruff::Line.new(400) | |
21 | + graphic.hide_title = true | |
22 | + graphic.hide_legend = true | |
23 | + graphic.theme = { | |
24 | + :background_colors => 'transparent' | |
25 | + } | |
26 | + | |
27 | + graphic.labels = Hash[dates.each_with_index.map{ |date, index| [index, date.to_s]}] | |
28 | + | |
29 | + graphic.data('Values', values) | |
30 | + | |
31 | + graphic.to_blob | |
15 | 32 | end |
16 | 33 | |
17 | 34 | end |
18 | 35 | \ No newline at end of file | ... | ... |
app/views/repositories/_metric_result.html.erb
... | ... | @@ -5,22 +5,17 @@ |
5 | 5 | %> |
6 | 6 | <tr> |
7 | 7 | <td><%= link_to metric_name, "#metric_#{module_result.id}", |
8 | - onclick: "$.get('/modules/metric_history', | |
9 | - { metric_name: \"#{metric_name}\", | |
10 | - module_id: \"#{module_result.id}\"} | |
11 | - ).done(function( data ) { | |
12 | - json_params = JSON.parse('{\"container_id\": \"#{metric_result.id}\", \"metric_name\": \"#{metric_name}\", \"module_name\": \"#{module_result.module.name}\"}'); | |
13 | - chart_of_the_historic_of_metric (json_params, data); | |
14 | - });", | |
15 | - id: "metric_#{module_result.id}", | |
16 | - remote: true %></td> | |
8 | + onclick: "new Module.Graphic('container#{metric_result.id}', '#{metric_name}', '#{module_result.id}')", | |
9 | + id: "metric_#{module_result.id}", | |
10 | + remote: true %> | |
11 | + </td> | |
17 | 12 | <td><%= format_grade(metric_result.value) %></td> |
18 | 13 | <td><%= metric_configuration_snapshot.weight %></td> |
19 | 14 | <td><span style="color: #<%= range_snapshot.color %>"><%= range_snapshot.label %></span></td> |
20 | 15 | </tr> |
21 | - <tr id="tr_container_<%= metric_result.id %>" style="display: none"> | |
16 | + <tr id="container<%= metric_result.id %>" style="display: none"> | |
22 | 17 | <td colspan="4"> |
23 | - <div id="container_<%= metric_result.id %>"></div> | |
18 | + <div id="container<%= metric_result.id %>" class="graphic_container"><%= image_tag 'loader.gif' %> Loading data. Please, wait.</div> | |
24 | 19 | </td> |
25 | 20 | </tr> |
26 | 21 | <% end %> |
27 | 22 | \ No newline at end of file | ... | ... |