mountain-goat 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. data/README.md +4 -3
  2. data/generators/mg/mg_generator.rb +2 -2
  3. data/init.rb +0 -1
  4. data/lib/mountain-goat.rb +0 -2
  5. data/lib/mountain-goat/controllers/mg/report_items_controller.rb +1 -1
  6. data/lib/mountain-goat/controllers/mg/tests_controller.rb +0 -16
  7. data/lib/mountain-goat/m_g.rb +20 -19
  8. data/lib/mountain-goat/models/mg/choice.rb +6 -0
  9. data/lib/mountain-goat/public/g-funnel.js +1 -1
  10. data/lib/mountain-goat/version.rb +1 -1
  11. data/lib/mountain-goat/views/mountain_goat/mg/records/_records.html.erb +1 -1
  12. data/lib/mountain-goat/views/mountain_goat/mg/records/index.html.erb +0 -1
  13. data/lib/mountain-goat/views/mountain_goat/mg/reports/_report.html.erb +1 -1
  14. data/lib/mountain-goat/views/mountain_goat/mg/tests/show.html.erb +14 -11
  15. metadata +5 -15
  16. data/lib/mgflotilla.rb +0 -170
  17. data/lib/mountain-goat/public/jquery.flot.js +0 -2615
  18. data/lib/mountain-goat/views/mountain_goat/mg/goals/.tmp_show.html.erb.86489~ +0 -32
  19. data/lib/mountain-goat/views/mountain_goat/mg/report_items/.tmp__chart.html.erb.73596~ +0 -18
  20. data/lib/mountain-goat/views/mountain_goat/mg/report_items/.tmp__show.html.erb.52502~ +0 -29
  21. data/lib/mountain-goat/views/mountain_goat/mg/reports/.tmp__report_form.html.erb.42949~ +0 -26
  22. data/lib/mountain-goat/views/mountain_goat/mg/reports/.tmp__report_report_items.html.erb.96264~ +0 -5
  23. data/lib/mountain-goat/views/mountain_goat/mg/reports/.tmp_edit.html.erb.39909~ +0 -33
  24. data/lib/mountain-goat/views/mountain_goat/mg/reports/.tmp_show.html.erb.37905~ +0 -18
  25. data/lib/mountain-goat/views/mountain_goat/mg/tests/.tmp_show.html.erb.19989~ +0 -63
data/README.md CHANGED
@@ -40,13 +40,13 @@ For more information, read my blog post on how mountain goat quickly accomplishe
40
40
 
41
41
  ## Upgrade from < 1.0.0
42
42
 
43
- If you are upgrading from Mountain Goat < 1.0.3, please run the following command (please overwrite mountain-goat.yml when prompted):
43
+ If you are upgrading from Mountain Goat < 1.0.4, please run the following command (please overwrite mountain-goat.yml when prompted):
44
44
 
45
- ./script/generate mg --update=1.0.0,1.0.3
45
+ ./script/generate mg --update=1.0.0,1.0.4
46
46
 
47
47
  rake db:migrate
48
48
 
49
- This will install new migrations necessary for version 1.0.3. Leave out the 1.0.0 from the command if you are upgrading from version 1.0.0.
49
+ This will install new migrations necessary for version 1.0.4. Leave out the 1.0.0 from the command if you are upgrading from version 1.0.0.
50
50
 
51
51
  ## Install
52
52
 
@@ -267,6 +267,7 @@ As mountain goat is a suite that is added into your project dynamically, the fol
267
267
  * mg_reports
268
268
 
269
269
  ## Change log
270
+ 1.0.4 - More Bug-fixes / Remove Flot Graphs Entirely
270
271
  1.0.3 - Some overall bug-fixes and start to use Raphael Graphs
271
272
  1.0.2 - Big UI overhaul ~ Robert
272
273
  - Renamed objects to reflect real-world thinking (e.g. metric => test)
@@ -2,7 +2,7 @@ class MgGenerator < Rails::Generator::Base
2
2
  def add_options!(opt)
3
3
  opt.on('-p', '--password=password', String, "Your password to access Mountain Goat") { |v| options[:password] = v}
4
4
  opt.on('-w', '--wkhtmltopdf=/path/to/dir', String, "Path to installation of wkhtmltopdf (optional)") { |v| options[:wkhtmltopdf] = v}
5
- opt.on('-u', '--update=1.0.0,1.0.3', String, "If you have previously installed Mountain Goat, use to generate *update* tables.") { |v| options[:update] = v}
5
+ opt.on('-u', '--update=1.0.0,1.0.4', String, "If you have previously installed Mountain Goat, use to generate *update* tables.") { |v| options[:update] = v}
6
6
  puts <<-HELPFUL_INSTRUCTIONS
7
7
 
8
8
  Mountain Goat is your home for in-house bandit testing.
@@ -42,7 +42,7 @@ class MgGenerator < Rails::Generator::Base
42
42
  m.migration_template 'update_mountain_goat_tables.rb', 'db/migrate', { :migration_file_name => "update_mountain_goat_tables" }
43
43
  end
44
44
 
45
- if update.include?("1.0.3") || update.include?("1.0.2") || update.include?("1.0.1")
45
+ if update.include?("1.0.4") || update.include?("1.0.3") || update.include?("1.0.2") || update.include?("1.0.1")
46
46
  m.migration_template 'update_mountain_goat_tables_v2.rb', 'db/migrate', { :migration_file_name => "update_mountain_goat_tables_v2" }
47
47
  end
48
48
 
data/init.rb CHANGED
@@ -1,5 +1,4 @@
1
1
 
2
- require File.join([File.dirname(__FILE__), 'lib/mgflotilla'])
3
2
  require File.join([File.dirname(__FILE__), 'lib/mountain-goat'])
4
3
 
5
4
  #ActionView::Helpers
data/lib/mountain-goat.rb CHANGED
@@ -4,8 +4,6 @@ require 'active_support'
4
4
  require 'action_controller'
5
5
  require 'action_controller/routing'
6
6
 
7
- require File.join([File.dirname(__FILE__), 'mgflotilla'])
8
-
9
7
  require File.join([File.dirname(__FILE__), 'mountain-goat/controllers/mg/mg'])
10
8
  require File.join([File.dirname(__FILE__), 'mountain-goat/controllers/mg/mountain_goat_controller'])
11
9
  require File.join([File.dirname(__FILE__), 'mountain-goat/controllers/mg/tests_controller'])
@@ -22,7 +22,7 @@ class Mg::ReportItemsController < Mg
22
22
  raise ArgumentError, "Invalid report" if @report.nil?
23
23
 
24
24
  @report_item = @report.mg_report_items.new(params[:report_item].clone.delete_if { |k, v| k.intern == :reportable || k.intern == :pivot } )
25
- @report_item.order = @report.mg_report_items.maximum(:order) + 1 # @report.mg_report_items.to_a.map { |ri| ri.order }.push(0).max + 1# -- weird sqlite3 bugs
25
+ @report_item.order = ( @report.mg_report_items.maximum(:order) || 0 ) + 1 # @report.mg_report_items.to_a.map { |ri| ri.order }.push(0).max + 1# -- weird sqlite3 bugs
26
26
 
27
27
  if !params[:report_item][:reportable].blank?
28
28
  id, model = params[:report_item][:reportable].split('-')
@@ -18,22 +18,6 @@ class Mg::TestsController < Mg
18
18
  # GET /mg/tests/1.xml
19
19
  def show
20
20
  @test = Mg::Test.find(params[:id])
21
-
22
- @rates = {}
23
- @rates[:served] = []
24
- @rates[:reward_count] = []
25
- @rates[:reward_rates] = []
26
- @rates[:titles] = {}
27
- i = 0
28
- @test.mg_choices.each do |mv|
29
- @rates[:served].push( { :choice_type => i, :value => mv.served } )
30
- @rates[:reward_count].push( { :choice_type => i, :value => mv.reward_count } )
31
- @rates[:reward_rates].push( { :choice_type => i, :value => mv.reward_rate } )
32
- @rates[:titles].merge!({i => mv.name})
33
- i += 1
34
- end
35
-
36
- logger.warn @rates[:titles].inspect
37
21
 
38
22
  respond_to do |format|
39
23
  format.html # show.html.erb
@@ -1,23 +1,4 @@
1
1
 
2
- ################
3
- # Setup PDFKit #
4
- ################
5
-
6
- begin
7
- require 'pdfkit'
8
- rescue LoadError
9
- raise "Mountain Goat Reports will not work without the 'pdfkit' gem (please run `gem install pdfkit`)"
10
- end
11
-
12
- ######################
13
- # Setup svg-graph #
14
- ######################
15
-
16
- begin
17
- require 'SVG/Graph/TimeSeries'
18
- rescue LoadError
19
- raise "Mountain Goat Reports will not work without the 'svg-graph' gem (please run `gem install svg-graph`)"
20
- end
21
2
 
22
3
  ############################
23
4
  # TODO: Verify Email Setup #
@@ -25,6 +6,26 @@ end
25
6
 
26
7
  class MG
27
8
  def self.deliver(delivery_set = nil)
9
+ ################
10
+ # Setup PDFKit #
11
+ ################
12
+
13
+ begin
14
+ require 'pdfkit'
15
+ rescue LoadError
16
+ raise "Mountain Goat Reports will not work without the 'pdfkit' gem (please run `gem install pdfkit`)"
17
+ end
18
+
19
+ ######################
20
+ # Setup svg-graph #
21
+ ######################
22
+
23
+ begin
24
+ require 'SVG/Graph/TimeSeries'
25
+ rescue LoadError
26
+ raise "Mountain Goat Reports will not work without the 'svg-graph' gem (please run `gem install svg-graph`)"
27
+ end
28
+
28
29
  mg_yml = YAML::load(File.open("#{RAILS_ROOT}/config/mountain-goat.yml"))
29
30
 
30
31
  if mg_yml.blank? || mg_yml[RAILS_ENV].blank? || mg_yml[RAILS_ENV]['wkhtmltopdf'].blank?
@@ -47,4 +47,10 @@ class Mg::Choice < ActiveRecord::Base
47
47
  return nil if self.reward_count == 0 || self.reward_count.nil? || self.reward.nil?
48
48
  return self.reward / self.reward_count.to_f
49
49
  end
50
+
51
+ # What is the average reward given to this choice
52
+ def avg_points_per_serve
53
+ return nil if self.served == 0 || self.served.nil? || self.reward.nil?
54
+ return self.reward / self.served.to_f
55
+ end
50
56
  end
@@ -58,7 +58,7 @@ Raphael.fn.g.funnelchart = function (cx, cy, cw, ch, values, opts) {
58
58
  var path = trap(sx0, sy0, w0, w1, sh);
59
59
  var p = this.path(path).attr({fill: opts.colors && opts.colors[i] || this.g.colors[i] || "#666", stroke: opts.stroke || "#fff", "stroke-width": (opts.strokewidth == null ? 1 : opts.strokewidth), "stroke-linejoin": "round"});
60
60
  if (values[i].labeltext)
61
- p.insetLabel = this.text(sx0 + w0 / 2.0, sy0 + sh / 3.0, values[i].labeltext + ( i > 0 ? ( " " + ( ( values[i] - values[i - 1] ) / values[i - 1] ) + "%" ) : "")).attr({font: "20px Helvetica", stroke: "#fff", fill: "#eee", "fill-opacity": 0.95, "stroke-opacity": 0 });
61
+ p.insetLabel = this.text(sx0 + w0 / 2.0, sy0 + sh / 3.0, values[i].labeltext + ( i > 0 ? ( " " + ( ( values[i] * 100 / values[i - 1] ).toFixed(2) ) + "%" ) : "")).attr({font: "20px Helvetica", stroke: "#fff", fill: "#bbb", "fill-opacity": 0.95, "stroke-opacity": 0 });
62
62
 
63
63
  p.value = values[i];
64
64
  sectors.push(p);
@@ -1,3 +1,3 @@
1
1
  class MountainGoat
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4"
3
3
  end
@@ -1,5 +1,5 @@
1
1
  <%# locals => records %>
2
2
 
3
3
  <% records.each do |record| %>
4
- <%= render 'record', :locals => { :record => record } %>
4
+ <%= render 'record', :record => record %>
5
5
  <% end %>
@@ -2,7 +2,6 @@
2
2
  <h1><% if @goal %><%=h @goal.name %><% else %>Comprehensive<% end %> Records</h1>
3
3
  <div class="container-content">
4
4
  <div class="recent-record" data-reload="true" data-record-id="<%= @records.count > 0 ? @records.first.id : -1 %>" data-goal-id="<%= @goal ? @goal.id : '' %>"></div>
5
- <a class="button" href="javascript:void(0)" class="reload">Reload</a>
6
5
 
7
6
  <% if @records.count > 0 %>
8
7
  <ul class="record-list">
@@ -15,7 +15,7 @@
15
15
 
16
16
  <h4><%=h report.description %></h4>
17
17
 
18
- <% report.report_items.each do |report_item| %>
18
+ <% report.mg_report_items.each do |report_item| %>
19
19
  <div class="svg-chart">
20
20
  <%= render 'mg/report_items/svg_chart', :report_item => report_item %>
21
21
  </div>
@@ -8,21 +8,24 @@
8
8
  <% else %>
9
9
  <div class="statboard">
10
10
  <div class="flyer-analysis statpad">
11
- <div class="title">Records</div>
11
+ <div class="title">Serves</div>
12
12
  <div class="statbody">
13
- <%= mg_chart("analysis_graph#{@test.id}",
14
- { "Served" => { :collection => @rates[:served], :x => :choice_type, :y => :value },
15
- "Reward Count" => { :collection => @rates[:reward_count], :x => :choice_type, :y => :value } },
16
- { :xaxis => { :ticks => @rates[:titles].map { |i,t| [i + 0.5, t] }.sort }, :yaxis => { :min => 0, :minTickSize => 1 }, :bars => { :show => true }, :legend => { :show => false, :position => "ne" }, :grid => { :hoverable => true, :clickable => true }, :inline => false }, :placeholder_size => "420x260", :pie_hover => true, :line_hover_absolute => true, :item_title => "record(s)") %>
13
+ <div id="chart_item_mg_test_#{@test.id}_served %>" data-raphael="pie"
14
+ data-x="<%= @test.mg_choices.map { |c| "'#{c.name}'" }.join(',') %>"
15
+ data-y="<%= @test.mg_choices.map { |c| c.served }.join(',') %>"
16
+ style="width: 425px; height: 260px;" />
17
+ </div>
17
18
 
18
19
  </div>
19
20
  </div>
20
21
  <div class="flyer-analysis statpad">
21
- <div class="title">Reward Rates</div>
22
+ <div class="title">Avg. Rewards</div>
22
23
  <div class="statbody">
23
- <%= mg_chart("analysis_conv_graph#{@test.id}",
24
- { "Reward Rate" => { :collection => @rates[:reward_rates], :x => :choice_type, :y => :value } },
25
- { :xaxis => { :ticks => @rates[:titles].map { |i,t| [i + 0.5, t] }.sort }, :yaxis => { :min => 0, :minTickSize => 1 }, :bars => { :show => true }, :legend => { :show => false, :position => "ne" }, :grid => { :hoverable => true, :clickable => true }, :inline => false }, :placeholder_size => "420x260", :pie_hover => true, :line_hover_absolute => true, :item_title => "") %>
24
+ <div id="chart_item_mg_test_#{@test.id}_avg_reward %>" data-raphael="pie"
25
+ data-x="<%= @test.mg_choices.map { |c| "'#{c.name}'" }.join(',') %>"
26
+ data-y="<%= @test.mg_choices.map { |c| c.reward / c.served unless c.reward.blank? || c.served.blank? || c.served == 0 }.join(',') %>"
27
+ style="width: 425px; height: 260px;" />
28
+ </div>
26
29
 
27
30
  </div>
28
31
  </div>
@@ -46,8 +49,8 @@
46
49
  <span class="category choice"><%=h choice.name %></span>
47
50
  <span class="category served"><%= choice.served %></span>
48
51
  <span class="category hit-points"><%= choice.reward || "None" %></span>
49
- <span class="category hit-points-avg"><%=h choice.reward_rate || "N/A" %></span>
50
- <span class="category actions"><a href="<%= mg_choice_url choice %>">Edit</a></span>
52
+ <span class="category hit-points-avg"><%=h choice.avg_points_per_serve || "N/A" %></span>
53
+ <span class="category actions"><a href="<%= edit_mg_choice_url choice %>">Edit</a></span>
51
54
  </li>
52
55
  <% end %>
53
56
  </ul>
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mountain-goat
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 3
10
- version: 1.0.3
9
+ - 4
10
+ version: 1.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Geoffrey Hayes
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-10-11 00:00:00 -07:00
19
+ date: 2011-10-13 00:00:00 -07:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -80,7 +80,6 @@ files:
80
80
  - generators/mg/templates/update_mountain_goat_tables_v2.rb
81
81
  - init.rb
82
82
  - install.rb
83
- - lib/mgflotilla.rb
84
83
  - lib/mountain-goat.rb
85
84
  - lib/mountain-goat/analytics.rb
86
85
  - lib/mountain-goat/controllers/mg/choices_controller.rb
@@ -118,7 +117,6 @@ files:
118
117
  - lib/mountain-goat/public/g-raphael-min.js
119
118
  - lib/mountain-goat/public/jqModel.css
120
119
  - lib/mountain-goat/public/jqModel.js
121
- - lib/mountain-goat/public/jquery.flot.js
122
120
  - lib/mountain-goat/public/jquery.raphael.js
123
121
  - lib/mountain-goat/public/jquery.timeago.js
124
122
  - lib/mountain-goat/public/mg.css
@@ -137,7 +135,6 @@ files:
137
135
  - lib/mountain-goat/views/mountain_goat/mg/choices/index.html.erb
138
136
  - lib/mountain-goat/views/mountain_goat/mg/choices/new.html.erb
139
137
  - lib/mountain-goat/views/mountain_goat/mg/choices/show.html.erb
140
- - lib/mountain-goat/views/mountain_goat/mg/goals/.tmp_show.html.erb.86489~
141
138
  - lib/mountain-goat/views/mountain_goat/mg/goals/_goal_form.html.erb
142
139
  - lib/mountain-goat/views/mountain_goat/mg/goals/_goal_meta_type_form.html.erb
143
140
  - lib/mountain-goat/views/mountain_goat/mg/goals/edit.html.erb
@@ -153,8 +150,6 @@ files:
153
150
  - lib/mountain-goat/views/mountain_goat/mg/records/index.html.erb
154
151
  - lib/mountain-goat/views/mountain_goat/mg/records/new.html.erb
155
152
  - lib/mountain-goat/views/mountain_goat/mg/records/show.html.erb
156
- - lib/mountain-goat/views/mountain_goat/mg/report_items/.tmp__chart.html.erb.73596~
157
- - lib/mountain-goat/views/mountain_goat/mg/report_items/.tmp__show.html.erb.52502~
158
153
  - lib/mountain-goat/views/mountain_goat/mg/report_items/_chart.html.erb
159
154
  - lib/mountain-goat/views/mountain_goat/mg/report_items/_funnel.html.erb
160
155
  - lib/mountain-goat/views/mountain_goat/mg/report_items/_report_item_form.html.erb
@@ -164,10 +159,6 @@ files:
164
159
  - lib/mountain-goat/views/mountain_goat/mg/report_items/edit.html.erb
165
160
  - lib/mountain-goat/views/mountain_goat/mg/report_items/new.html.erb
166
161
  - lib/mountain-goat/views/mountain_goat/mg/report_mailer/report.html.erb
167
- - lib/mountain-goat/views/mountain_goat/mg/reports/.tmp__report_form.html.erb.42949~
168
- - lib/mountain-goat/views/mountain_goat/mg/reports/.tmp__report_report_items.html.erb.96264~
169
- - lib/mountain-goat/views/mountain_goat/mg/reports/.tmp_edit.html.erb.39909~
170
- - lib/mountain-goat/views/mountain_goat/mg/reports/.tmp_show.html.erb.37905~
171
162
  - lib/mountain-goat/views/mountain_goat/mg/reports/_report.html.erb
172
163
  - lib/mountain-goat/views/mountain_goat/mg/reports/_report_form.html.erb
173
164
  - lib/mountain-goat/views/mountain_goat/mg/reports/_report_report_items.html.erb
@@ -175,7 +166,6 @@ files:
175
166
  - lib/mountain-goat/views/mountain_goat/mg/reports/index.html.erb
176
167
  - lib/mountain-goat/views/mountain_goat/mg/reports/new.html.erb
177
168
  - lib/mountain-goat/views/mountain_goat/mg/reports/show.html.erb
178
- - lib/mountain-goat/views/mountain_goat/mg/tests/.tmp_show.html.erb.19989~
179
169
  - lib/mountain-goat/views/mountain_goat/mg/tests/_test_form.html.erb
180
170
  - lib/mountain-goat/views/mountain_goat/mg/tests/edit.html.erb
181
171
  - lib/mountain-goat/views/mountain_goat/mg/tests/index.html.erb
@@ -235,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
235
225
  requirements: []
236
226
 
237
227
  rubyforge_project: mountain-goat
238
- rubygems_version: 1.4.2
228
+ rubygems_version: 1.6.2
239
229
  signing_key:
240
230
  specification_version: 3
241
231
  summary: A/B Testing to the edge
data/lib/mgflotilla.rb DELETED
@@ -1,170 +0,0 @@
1
- #begin
2
- # require 'json'
3
- #rescue LoadError
4
- # p "Flotilla will not work without the 'json' gem"
5
- #end
6
-
7
- module MGFlotilla
8
- module Helpers
9
-
10
- # Insert a flot chart into the page. <tt>placeholder</tt> should be the
11
- # name of the div that will hold the chart, <tt>collections</tt> is a hash
12
- # of legends (as strings) and datasets with options as hashes, <tt>options</tt>
13
- # contains graph-wide options.
14
- #
15
- # Example usage:
16
- #
17
- # chart("graph_div", {
18
- # "January" => { :collection => @january, :x => :day, :y => :sales, :options => { :lines => {:show =>true}} },
19
- # "February" => { :collection => @february, :x => :day, :y => :sales, :options => { :points => {:show =>true} } },
20
- # :grid => { :backgroundColor => "#fffaff" })
21
- #
22
- # Options:
23
- # :js_includes - includes flot library inline
24
- # :js_tags - wraps resulting javascript in javascript tags if true. Defaults to true.
25
- # :placeholder_tag - appends a placeholder div for graph
26
- # :placeholder_size - specifys the size of the placeholder div
27
- def mg_chart(placeholder, series, options = {}, html_options = {})
28
- html_options.reverse_merge!({ :js_includes => true, :js_tags => true, :placeholder_tag => true, :placeholder_size => "800x300", :pie_hover => false, :pie_hover_absolute => false })
29
- width, height = html_options[:placeholder_size].split("x") if html_options[:placeholder_size].respond_to?(:split)
30
- additional_js = mg_get_additional_js(placeholder, html_options)
31
-
32
- data, x_is_date, y_is_date = mg_series_to_json(series)
33
- if x_is_date
34
- options[:xaxis] ||= {}
35
- options[:xaxis].merge!({ :mode => 'time' })
36
- end
37
- if y_is_date
38
- options[:yaxis] ||= {}
39
- options[:yaxis].merge!({ :mode => 'time' })
40
- end
41
-
42
- if html_options[:js_includes]
43
- chart_js = <<-EOF
44
- <script type="text/javascript">
45
- (function () {
46
- if (typeof(jQuery) == 'undefined') {
47
- alert("Please include jQuery to view flot");
48
- } else {
49
- if (typeof(jQuery.plot) == 'undefined') {
50
- $('##{placeholder}').html("<span class='flot-error'>Please include jQuery.plot to view flot</span>");
51
- } else {
52
- var plot = jQuery.plot($('##{placeholder}'), #{data}, #{options.to_json});
53
- #{additional_js}
54
- }
55
- }
56
- })();
57
- </script>
58
- EOF
59
- else
60
- chart_js = <<-EOF
61
- (function () {
62
- if (typeof(jQuery) == 'undefined') {
63
- alert("Please include jQuery to view flot");
64
- } else {
65
- if (typeof(jQuery.plot) == 'undefined') {
66
- $('##{placeholder}').html("<span class='flot-error'>Please include jQuery.plot to view flot</span>");
67
- } else {
68
- var plot = jQuery.plot($('##{placeholder}'), #{data}, #{options.to_json});
69
- #{additional_js}
70
- }
71
- }
72
- })();
73
- EOF
74
- end
75
-
76
- html_options[:js_tags] ? javascript_tag(chart_js) : chart_js
77
- output = html_options[:placeholder_tag] ? content_tag(:div, nil, :id => placeholder, :style => "width:#{width}px;height:#{height}px;", :class => "chart") + chart_js : chart_js
78
- output.html_safe
79
- end
80
-
81
- private
82
- def mg_series_to_json(series)
83
- data_sets = []
84
- x_is_date, y_is_date = false, false
85
- series.each do |name, values|
86
- set, data = {}, []
87
- set[:label] = name
88
- first = values[:collection].first
89
- logger.warn "Collection is: #{values[:collection].inspect}"
90
- if first #&& !values[:collection].is_a?(Array)
91
- if first.is_a?(Hash)
92
- x_is_date = first[values[:x]].acts_like?(:date) || first[values[:x]].acts_like?(:time)
93
- y_is_date = first[values[:y]].acts_like?(:date) || first[values[:y]].acts_like?(:time)
94
- else
95
- x_is_date = first.send(values[:x]).acts_like?(:date) || first.send(values[:x]).acts_like?(:time)
96
- y_is_date = first.send(values[:y]).acts_like?(:date) || first.send(values[:y]).acts_like?(:time)
97
- end
98
- end
99
- values[:collection].each do |object|
100
- if values[:collection].is_a?(Hash) || object.is_a?(Hash)
101
- x_value, y_value = object[values[:x]], object[values[:y]]
102
- #logger.warn "A: Object is: #{object}, x,y: #{[x_value, y_value]} from #{[values[:x], values[:y]]}"
103
- else
104
- x_value, y_value = object.send(values[:x]), object.send(values[:y])
105
- #logger.warn "B: Object is: #{object}, x,y: #{[x_value, y_value]}"
106
- end
107
- x = x_is_date ? x_value.to_time.to_i * 1000 : x_value.to_f
108
- y = y_is_date ? y_value.to_time.to_i * 1000 : y_value.to_f
109
- #logger.warn "Tally x,y: #{[x, y]}"
110
- data << [x,y]
111
- end
112
- set[:data] = data
113
- values[:options].each {|option, parameters| set[option] = parameters } if values[:options]
114
- data_sets << set
115
- end
116
- return data_sets.to_json, x_is_date, y_is_date
117
- end
118
-
119
- def mg_get_additional_js(placeholder, options)
120
- res = ""
121
- if options[:pie_hover]
122
- res << <<-EOF
123
- function showTooltip(x, y, contents) {
124
- $('<div id="tooltip">' + contents + '</div>').css( {
125
- position: 'absolute',
126
- //display: 'none',
127
- top: y + 5,
128
- left: x + 5,
129
- border: '1px solid #fdd',
130
- padding: '2px',
131
- 'background-color': '#fee',
132
- opacity: 0.80
133
- }).appendTo("body");//.fadeIn(200);
134
- }
135
-
136
- var previousPoint = null;
137
- $('##{placeholder}').bind('mouseout', function() {
138
- plot.unhighlight();
139
- $("#tooltip").remove();
140
- $(this).data('previous-post', -1);
141
- });
142
-
143
- $('##{placeholder}').bind('plothover', function(event, pos, item) {
144
- if (item) {
145
- if ($(this).data('previous-post') != item.seriesIndex) {
146
- plot.unhighlight();
147
- plot.highlight(item.series, item.datapoint);
148
- $(this).data('previous-post', item.seriesIndex);
149
- }
150
- $("#tooltip").remove();
151
- #{ options[:line_hover_absolute] ? "y = 'on ' + (new Date(item.datapoint[0])).toDateString() + ': ' + item.datapoint[1] + ' #{options[:item_title] || ''}'" : !options[:pie_hover_absolute] ? "y = item.datapoint[0].toFixed(0) + '%';" : "y = item.datapoint[1][0][1] + ' #{options[:item_title] || ''}'" }
152
- showTooltip(pos.pageX, pos.pageY, item.series.label + " " + y);
153
- } else {
154
- //console.log('unhighlight (3)');
155
- plot.unhighlight();
156
- $("#tooltip").remove();
157
- previousPost = $(this).data('previous-post', -1);
158
- }
159
- });
160
- EOF
161
- end
162
-
163
- res
164
- end
165
- end
166
- end
167
-
168
- class ActionView::Base
169
- include MGFlotilla::Helpers
170
- end