best_boy 2.2.3 → 3.0.0
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.
- checksums.yaml +4 -4
- data/README.md +74 -110
- data/app/assets/javascripts/best_boy/best_boy.js +0 -1
- data/app/assets/stylesheets/best_boy/base.sass +21 -0
- data/app/assets/stylesheets/best_boy/best_boy.css +1 -3
- data/app/controllers/best_boy/{best_boy_events_controller.rb → events_controller.rb} +4 -4
- data/{lib/best_boy/models/active_record → app/models}/best_boy/day_report.rb +0 -0
- data/app/models/best_boy/event.rb +29 -0
- data/{lib/best_boy/models/active_record → app/models}/best_boy/month_report.rb +0 -0
- data/app/views/best_boy/events/_navigation.html.erb +11 -0
- data/app/views/best_boy/events/charts.html.erb +33 -0
- data/app/views/best_boy/events/details.html.erb +98 -0
- data/app/views/best_boy/events/details.xml.haml +22 -0
- data/app/views/best_boy/events/index.html.erb +8 -0
- data/app/views/best_boy/events/lists.html.erb +62 -0
- data/app/views/best_boy/events/lists.xml.haml +8 -0
- data/app/views/best_boy/events/monthly_details.html.erb +67 -0
- data/app/views/best_boy/events/monthly_details.xml.haml +15 -0
- data/app/views/best_boy/events/stats.html.erb +89 -0
- data/app/views/best_boy/events/stats.xml.haml +18 -0
- data/app/views/layouts/best_boy/best_boy.html.erb +43 -0
- data/config/routes.rb +13 -7
- data/db/migrate/20150610155237_create_best_boy_events.rb +17 -0
- data/db/migrate/20150610155251_create_best_boy_reports.rb +28 -0
- data/lib/best_boy.rb +8 -5
- data/lib/best_boy/{controllers/best_boy_controller.rb → controller.rb} +6 -3
- data/lib/best_boy/engine.rb +7 -27
- data/lib/best_boy/{models/active_record/best_boy/eventable.rb → eventable.rb} +7 -6
- data/lib/best_boy/{models/active_record/best_boy/obeys_test_mode.rb → obeys_test_mode.rb} +0 -0
- data/lib/best_boy/{models/active_record/best_boy/reporting.rb → reporting.rb} +0 -0
- data/lib/best_boy/version.rb +1 -1
- data/lib/generators/best_boy/install_generator.rb +11 -0
- data/lib/generators/{templates → best_boy/templates/config/initializers}/best_boy.rb +0 -6
- data/lib/tasks/recover_report_history.rake +7 -7
- metadata +64 -71
- data/app/assets/images/best_boy/glyphicons-halflings-white.png +0 -0
- data/app/assets/images/best_boy/glyphicons-halflings.png +0 -0
- data/app/assets/javascripts/best_boy/bootstrap_datepicker.js +0 -401
- data/app/assets/stylesheets/best_boy/bootstrap.scss +0 -4983
- data/app/assets/stylesheets/best_boy/bootstrap_datepicker.css +0 -156
- data/app/views/best_boy/best_boy_events/_navigation.html.erb +0 -9
- data/app/views/best_boy/best_boy_events/charts.html.erb +0 -25
- data/app/views/best_boy/best_boy_events/details.html.erb +0 -88
- data/app/views/best_boy/best_boy_events/index.html.erb +0 -6
- data/app/views/best_boy/best_boy_events/lists.html.erb +0 -45
- data/app/views/best_boy/best_boy_events/monthly_details.html.erb +0 -51
- data/app/views/best_boy/best_boy_events/stats.html.erb +0 -80
- data/app/views/layouts/best_boy_backend.html.erb +0 -70
- data/lib/best_boy/models/active_record/best_boy_event.rb +0 -21
- data/lib/generators/active_record/best_boy_generator.rb +0 -29
- data/lib/generators/active_record/templates/add_event_source_to_best_boy_events_table.rb +0 -11
- data/lib/generators/active_record/templates/create_best_boy_events_table.rb +0 -17
- data/lib/generators/active_record/templates/create_best_boy_reports.rb +0 -30
- data/lib/generators/best_boy_generator.rb +0 -23
- data/lib/generators/templates/bootstrap/bootstrap.css +0 -4983
- data/lib/generators/templates/bootstrap/bootstrap_datepicker.css +0 -156
- data/lib/generators/templates/bootstrap/bootstrap_datepicker.js +0 -401
- data/lib/generators/templates/bootstrap/glyphicons-halflings-white.png +0 -0
- data/lib/generators/templates/bootstrap/glyphicons-halflings.png +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60316e2e138902bed41149f69236093c10dc2b42
|
4
|
+
data.tar.gz: 345c8c5a0ccd9f0652e823019e6f0d87a179a1ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b917b25c4104b2e57ddf5e6bb752fc44d5be357f48913ac42d8609f767b1e8ee5aaa3dacb90dc51671f826da60571f7789fec3d878b2bfa048535981b3bd8a26
|
7
|
+
data.tar.gz: 4192cdb814d7f125b2be3bb41d32aa9e8d357cd20905cfd4bfb935926d3784138f9e291c779f1cb26cb72f180fdc320feb633160bf97ad260749e8829a36a202
|
data/README.md
CHANGED
@@ -6,20 +6,29 @@ best_boy
|
|
6
6
|
[](https://www.omniref.com/ruby/gems/best_boy)
|
7
7
|
|
8
8
|
A simple event driven logging for ActiveRecord models.
|
9
|
+
BestBoy is able to log model-based "create", "update" and "delete" events as well as custom events triggered in controller actions.
|
10
|
+
It uses its own polymorphic database table to log each event.
|
9
11
|
|
10
12
|
|
11
|
-
|
13
|
+
Rails version support
|
12
14
|
----------------------
|
13
15
|
|
14
|
-
|
15
|
-
At the moment, best_boy only provides support for ActiveRecord models.
|
16
|
+
BestBoy 3 and above only supports Rails >= 4.1
|
16
17
|
|
17
18
|
|
18
|
-
|
19
|
+
Changes in version 3
|
19
20
|
----------------------
|
20
21
|
|
21
|
-
|
22
|
-
|
22
|
+
Best Boy version 3 comes with some backward incompatible changes. However, it's totally worth it because BestBoy now follows all the best practices of a rails engine.
|
23
|
+
This and additional changes of version 3 include
|
24
|
+
|
25
|
+
* Uses rails engine naming conventions with an isolated ``BestBoy`` namespace
|
26
|
+
* serving the necessary migrations from the engines migration folder
|
27
|
+
* serving all assets via the asset pipeline (used to be a opt-in before)
|
28
|
+
* removes unnecessary generator boilerplate and config options
|
29
|
+
* uses the newest Bootstrap version (3)
|
30
|
+
* allows per class extending instead of polluting the whole app
|
31
|
+
* answers to xml requests for easy EXCEL integration
|
23
32
|
|
24
33
|
|
25
34
|
Installation
|
@@ -33,93 +42,18 @@ Install it with Bundler
|
|
33
42
|
|
34
43
|
bundle install
|
35
44
|
|
36
|
-
|
37
|
-
|
38
|
-
rails g best_boy
|
39
|
-
|
40
|
-
This will install following files into your application
|
41
|
-
|
42
|
-
config/initializers/best_boy.rb
|
43
|
-
|
44
|
-
db_migrate/create_best_boy_events_table.rb
|
45
|
-
|
46
|
-
public/javascripts/bootstrap_datepicker.js
|
47
|
-
|
48
|
-
public/stylesheets/bootstrap.css
|
49
|
-
|
50
|
-
public/stylesheets/bootstrap_datepicker.css
|
51
|
-
|
52
|
-
In case you want the gem be compatible with the asset-pipeline, add a flag to the generator call:
|
53
|
-
|
54
|
-
rails g best_boy --asset
|
55
|
-
|
56
|
-
See usage section for version information.
|
57
|
-
|
58
|
-
Run the migration
|
59
|
-
|
60
|
-
rake db:migrate
|
61
|
-
|
62
|
-
|
63
|
-
Changelog
|
64
|
-
---------
|
65
|
-
#### 2.2.3
|
66
|
-
* Rename ``report``method to a more best_boy specific ``trigger_best_boy_event_report`
|
67
|
-
|
68
|
-
#### 2.2.2
|
69
|
-
* Fix dependency bug with kaminari
|
70
|
-
|
71
|
-
#### 2.2.1
|
72
|
-
* flexibilized report creation method to create reports for a specific date
|
73
|
-
* no compatibility with Ruby 1.9.3
|
74
|
-
|
75
|
-
#### 2.2.0
|
76
|
-
* Updated dependencies for rspec and kaminari
|
77
|
-
* Make recover_report_history rake task a noop for no previously tracked BestBoyEvents
|
78
|
-
* Bugfix for report recovery rake task
|
79
|
-
* use appraisal for testing against different gemsets and Ruby versions
|
80
|
-
|
81
|
-
#### 2.1.3
|
82
|
-
* Compatible with Rails 4.1
|
83
|
-
* Loosened kaminari dependency requirements
|
84
|
-
|
85
|
-
#### 2.1.0
|
86
|
-
* Code cleanup - now compatible with RSpec 3 syntax
|
87
|
-
* Support a "dry-run" test mode
|
88
|
-
* Reduce public methods added by `BestBoy::Eventable` ([#4](https://github.com/Absolventa/best_boy/issues/4))
|
89
|
-
* Remove mass-assignments that could cause problems with the protected_attributes gem [#8](https://github.com/Absolventa/best_boy/issues/8)
|
90
|
-
* Do not expose mixed-in controller method ([#9](https://github.com/Absolventa/best_boy/issues/9)))
|
91
|
-
* Avoid potential name clashes for callbacks switch ([#10](https://github.com/Absolventa/best_boy/issues/10))
|
92
|
-
|
93
|
-
|
94
|
-
Upgrading to Version 2
|
95
|
-
--------------------------------
|
96
|
-
|
97
|
-
From v2.x, BestBoy uses aggregated tables for the admin panel. You need
|
98
|
-
to copy the new migrations to your app by running
|
99
|
-
|
100
|
-
rails g best_boy --asset
|
101
|
-
|
102
|
-
again. This generator will also ask you to overwrite your existing initializer - just
|
103
|
-
reject this pressing 'n' for not overwriting your settings. Don't forget to run
|
104
|
-
|
105
|
-
rake db:migrate
|
106
|
-
|
107
|
-
and
|
45
|
+
Install the migrations
|
108
46
|
|
109
|
-
rake best_boy:
|
110
|
-
|
111
|
-
in the context of your mother app afterwards. See also section "Some thoughts about Performance"
|
112
|
-
for more details about new data organization.
|
47
|
+
rake best_boy:install:migrations
|
113
48
|
|
49
|
+
Mount the best boy backend in your routes.rb
|
114
50
|
|
115
|
-
|
116
|
-
--------------------------------
|
51
|
+
mount BestBoy::Engine => "/best_boy"
|
117
52
|
|
118
|
-
|
53
|
+
Run the generator to create your best_boy config file:
|
119
54
|
|
120
|
-
|
55
|
+
rails g best_boy:install
|
121
56
|
|
122
|
-
config.precompile_assets = true
|
123
57
|
|
124
58
|
|
125
59
|
Usage
|
@@ -127,21 +61,28 @@ Usage
|
|
127
61
|
|
128
62
|
In model context:
|
129
63
|
|
64
|
+
include BestBoy::Eventable
|
130
65
|
has_a_best_boy
|
131
66
|
|
132
|
-
This will log "create" and "delete"
|
67
|
+
This will log "create" and "delete" events for each instance.
|
133
68
|
|
134
|
-
If you do not want to selflog
|
69
|
+
If you do not want to selflog those events, maybe because you will sort it semantically with a create source, just deactivate the callback logging by setting the parameter :disable_callbacks to true.
|
135
70
|
|
136
|
-
|
71
|
+
include BestBoy::Eventable
|
72
|
+
has_a_best_boy disable_callbacks: true
|
137
73
|
|
138
74
|
In controller context:
|
139
75
|
|
76
|
+
# in application_controller.rb or the relevant controller
|
77
|
+
include BestBoy::Controller
|
78
|
+
|
79
|
+
# in a resource specific controller
|
140
80
|
best_boy_event object, event, event_source = nil
|
141
81
|
|
142
|
-
This will log custom events for
|
82
|
+
This will log custom events for an object and an event phrase. You can specify this event with an event_source parameter to log maybe seperate create actions.
|
83
|
+
|
84
|
+
If no object or event is given an exception will be raised.
|
143
85
|
|
144
|
-
If no Object is given, it will raise an exception as well as if no event is provided.
|
145
86
|
|
146
87
|
#### Test mode
|
147
88
|
|
@@ -162,15 +103,6 @@ Conversely, you can also sandbox a specific code block:
|
|
162
103
|
end
|
163
104
|
|
164
105
|
|
165
|
-
BestBoyEvent table
|
166
|
-
------------------
|
167
|
-
|
168
|
-
t.integer "owner_id" # owner model id
|
169
|
-
t.string "owner_type" # owner model class type
|
170
|
-
t.string "event" # event (create, delete)
|
171
|
-
t.string "event_source" # event_source parameter for specific action tracking
|
172
|
-
t.datetime "updated_at" # last update timestamp
|
173
|
-
t.datetime "created_at" # creation timestamp
|
174
106
|
|
175
107
|
Getting BestBoyEvents
|
176
108
|
---------------------
|
@@ -179,17 +111,12 @@ BestBoy comes with an admin interface, largely configurable to fit right into yo
|
|
179
111
|
|
180
112
|
Following configurations can be done:
|
181
113
|
|
182
|
-
config.precompile_assets "boolean" # default: false # if you need best_boy to precompile its assets for the asset-pipeline
|
183
|
-
config.orm "symbole" # default: :active_record # for now only active_record is supported
|
184
114
|
config.base_controller "String" # default: "ApplicationController" # declare with Controller should be inherited
|
185
115
|
config.before_filter "comma separated symbols" # default: nil # declare before_filter to use inherited before_filters in admin section
|
186
116
|
config.skip_before_filter "comma separated symbols" # default: nil # declare skip_before_filter to skip inherited before_filters in admin section
|
187
117
|
config.skip_after_filter "comma separated symbols" # default: nil # declare skip_after_filter to skip inherited after_filters in admin section
|
188
118
|
config.custom_redirect "relative path as String" # default: nil # set a path to return back to your existing backend
|
189
119
|
|
190
|
-
After installation you can access it through:
|
191
|
-
|
192
|
-
<your application path>/best_boy_admin
|
193
120
|
|
194
121
|
Some thoughts about Performance
|
195
122
|
-------------------------------
|
@@ -207,21 +134,58 @@ If you're upgrading BestBoy from an older version, there
|
|
207
134
|
is a rake task for 'recovering' these report structure for
|
208
135
|
an existing set of events. Simply run
|
209
136
|
|
210
|
-
|
137
|
+
rake best_boy:recover_report_history
|
211
138
|
|
212
139
|
If you want to recover this report structure not for the whole lifetime,
|
213
140
|
you can pass a date as argument to the rake task call:
|
214
141
|
|
215
|
-
|
142
|
+
rake best_boy:recover_report_history['2010-02-01']
|
216
143
|
|
217
144
|
The latter would destroy and recover the all reports created after
|
218
145
|
beginning of Feb 1st, 2010 up to now.
|
219
146
|
|
220
147
|
Budget some time for this task, since it can take long if your BestBoyEvent table has grown very big.
|
221
148
|
|
149
|
+
|
150
|
+
Changelog
|
151
|
+
---------
|
152
|
+
#### 3.0.0
|
153
|
+
* Major engine cleanup. Aims Rails >= 4.1 from now on.
|
154
|
+
* Includes backward incompatible changes. See above hint for more information.
|
155
|
+
|
156
|
+
#### 2.2.3
|
157
|
+
* Rename ``report`` method to a more best_boy specific ``trigger_best_boy_event_report`
|
158
|
+
|
159
|
+
#### 2.2.2
|
160
|
+
* Fix dependency bug with kaminari
|
161
|
+
|
162
|
+
#### 2.2.1
|
163
|
+
* flexibilized report creation method to create reports for a specific date
|
164
|
+
* no compatibility with Ruby 1.9.3
|
165
|
+
|
166
|
+
#### 2.2.0
|
167
|
+
* Updated dependencies for rspec and kaminari
|
168
|
+
* Make recover_report_history rake task a noop for no previously tracked BestBoyEvents
|
169
|
+
* Bugfix for report recovery rake task
|
170
|
+
* use appraisal for testing against different gemsets and Ruby versions
|
171
|
+
|
172
|
+
#### 2.1.3
|
173
|
+
* Compatible with Rails 4.1
|
174
|
+
* Loosened kaminari dependency requirements
|
175
|
+
|
176
|
+
#### 2.1.0
|
177
|
+
* Code cleanup - now compatible with RSpec 3 syntax
|
178
|
+
* Support a "dry-run" test mode
|
179
|
+
* Reduce public methods added by `BestBoy::Eventable` ([#4](https://github.com/Absolventa/best_boy/issues/4))
|
180
|
+
* Remove mass-assignments that could cause problems with the protected_attributes gem [#8](https://github.com/Absolventa/best_boy/issues/8)
|
181
|
+
* Do not expose mixed-in controller method ([#9](https://github.com/Absolventa/best_boy/issues/9)))
|
182
|
+
* Avoid potential name clashes for callbacks switch ([#10](https://github.com/Absolventa/best_boy/issues/10))
|
183
|
+
|
184
|
+
|
185
|
+
|
222
186
|
Used gems and resources
|
223
187
|
-----------------------
|
224
|
-
* [Twitter Bootstrap](http://twitter.github.com/bootstrap/) in its version
|
188
|
+
* [Twitter Bootstrap](http://twitter.github.com/bootstrap/) in its version 3
|
225
189
|
* [Stefan Petre](http://www.eyecon.ro/bootstrap-datepicker) for Datepicker in Twitter Bootstrap style
|
226
190
|
* [Winston Teo Yong Wei](https://github.com/winston/google_visualr) Google_Visualr in its version 2.1.2
|
227
191
|
|
@@ -235,7 +199,7 @@ Contributors in alphabetic order
|
|
235
199
|
|
236
200
|
Thanks
|
237
201
|
------
|
238
|
-
We ♥ PRs – thanks to everyone contributing to this project.
|
202
|
+
We ♥ PRs – thanks to everyone contributing to this project.
|
239
203
|
|
240
204
|
|
241
205
|
See [LICENSE.txt](https://raw.github.com/Absolventa/best_boy/master/LICENSE.txt) for usage and licensing details.
|
@@ -0,0 +1,21 @@
|
|
1
|
+
body
|
2
|
+
padding-top: 60px
|
3
|
+
|
4
|
+
//reset pagination for kamiari
|
5
|
+
nav.pagination
|
6
|
+
text-align: center
|
7
|
+
span
|
8
|
+
float: left
|
9
|
+
border: 1px solid #ddd
|
10
|
+
padding: 6px 12px
|
11
|
+
position: relative
|
12
|
+
line-height: 24px
|
13
|
+
a
|
14
|
+
text-decoration: none
|
15
|
+
background-color: #fff
|
16
|
+
span.current
|
17
|
+
background-color: whiteSmoke
|
18
|
+
color: #999
|
19
|
+
cursor: default
|
20
|
+
span.gap
|
21
|
+
padding: 6px 12px
|
@@ -8,7 +8,5 @@
|
|
8
8
|
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
9
|
* compiled file, but it's generally better to create a new file per style scope.
|
10
10
|
*
|
11
|
-
*=
|
12
|
-
*= require best_boy/bootstrap
|
13
|
-
*= require best_boy/bootstrap_datepicker
|
11
|
+
*= require best_boy/base
|
14
12
|
*/
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module BestBoy
|
2
|
-
class
|
2
|
+
class EventsController < BestBoy.base_controller.constantize
|
3
3
|
|
4
4
|
before_action BestBoy.before_filter if BestBoy.before_filter.present?
|
5
5
|
|
6
6
|
skip_before_filter BestBoy.skip_before_filter if BestBoy.skip_before_filter.present?
|
7
7
|
skip_after_filter BestBoy.skip_after_filter if BestBoy.skip_after_filter.present?
|
8
8
|
|
9
|
-
layout '
|
9
|
+
layout 'best_boy/best_boy'
|
10
10
|
|
11
11
|
|
12
12
|
helper BestBoy::BestBoyViewHelper
|
@@ -146,7 +146,7 @@ module BestBoy
|
|
146
146
|
end
|
147
147
|
|
148
148
|
def chart_for(data)
|
149
|
-
@chart = GoogleVisualr::Interactive::AreaChart.new(data, { width:
|
149
|
+
@chart = GoogleVisualr::Interactive::AreaChart.new(data, { width: 1100, height: 300, title: "" })
|
150
150
|
end
|
151
151
|
|
152
152
|
def row_values_for(day)
|
@@ -285,7 +285,7 @@ module BestBoy
|
|
285
285
|
instance_variable_set(instance_var, value)
|
286
286
|
end
|
287
287
|
|
288
|
-
scope =
|
288
|
+
scope = BestBoy::Event
|
289
289
|
scope = scope.where(owner_type: @owner_type) if @owner_type.present?
|
290
290
|
scope = scope.where(event: @event) if @event.present?
|
291
291
|
scope = scope.where(event_source: @event_source) if @event_source.present?
|
File without changes
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module BestBoy
|
2
|
+
class Event < ActiveRecord::Base
|
3
|
+
|
4
|
+
include BestBoy::ObeysTestMode
|
5
|
+
|
6
|
+
# db configuration
|
7
|
+
#
|
8
|
+
#
|
9
|
+
|
10
|
+
self.table_name = "best_boy_events"
|
11
|
+
|
12
|
+
# associations
|
13
|
+
#
|
14
|
+
#
|
15
|
+
belongs_to :owner, polymorphic: true
|
16
|
+
|
17
|
+
# validations
|
18
|
+
#
|
19
|
+
#
|
20
|
+
validates :event, presence: true
|
21
|
+
|
22
|
+
# scopes
|
23
|
+
#
|
24
|
+
#
|
25
|
+
|
26
|
+
scope :per_day, ->(date) { where(created_at: date.beginning_of_day..date.end_of_day ) }
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
File without changes
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="col-md-12">
|
3
|
+
<ul class="nav nav-tabs">
|
4
|
+
<% available_owner_types.each do |owner_type| %>
|
5
|
+
<li class="<%= (current_owner_type == owner_type) ? 'active' : nil %>">
|
6
|
+
<%= link_to owner_type, send("#{referrer}_events_path", owner_type: owner_type) %>
|
7
|
+
</li>
|
8
|
+
<% end %>
|
9
|
+
</ul>
|
10
|
+
</div>
|
11
|
+
</div>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<% content_for :javascripts do %>
|
2
|
+
<%= javascript_include_tag "https://www.google.com/jsapi" %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<div class="row">
|
6
|
+
<div class="col-md-12">
|
7
|
+
<%= form_tag charts_events_path, method: :get, id: "chart-form" do %>
|
8
|
+
<div class="form-group">
|
9
|
+
<div class="col-md-3">
|
10
|
+
<%= select_tag :owner_type, options_for_select([["Owner", nil]] + available_owner_types, selected: params[:owner_type]), onchange: "submit();", class: "form-control" %>
|
11
|
+
</div>
|
12
|
+
<div class="col-md-3">
|
13
|
+
<%= select_tag :event, options_for_select([["Event", nil]] + available_events, selected: params[:event]), onchange: "submit();", class: "form-control" %>
|
14
|
+
</div>
|
15
|
+
<div class="col-md-3">
|
16
|
+
<%= select_tag :event_source, options_for_select([["Event Source", nil]] + available_event_sources, selected: params[:event_source]), onchange: "submit();", class: "form-control" %>
|
17
|
+
</div>
|
18
|
+
<div class="col-md-3">
|
19
|
+
<%= select_tag :time_interval, options_for_select([["Time Interval", nil], ["yearly", "year"], ["monthly", "month"], ["weekly", "week"]], selected: params[:time_interval]), onchange: "submit();", class: "form-control" %>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
<% end %>
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<div class="row">
|
27
|
+
<div class="col-md-12">
|
28
|
+
<div class="well">
|
29
|
+
<div id='chart'></div>
|
30
|
+
<%= render_chart(@chart, 'chart') %>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
</div>
|
@@ -0,0 +1,98 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="col-md-12">
|
3
|
+
<div class="well">
|
4
|
+
<%= link_to "<< back to stats", stats_events_path(owner_type: current_owner_type) %>
|
5
|
+
</div>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="row">
|
10
|
+
<div class="col-md-12">
|
11
|
+
<div class="well">
|
12
|
+
<h3>Detailed Statistics</h3>
|
13
|
+
<table class="table table-striped table-bordered">
|
14
|
+
<thead>
|
15
|
+
<tr>
|
16
|
+
<th>Source</th>
|
17
|
+
<th colspan="2">overall</th>
|
18
|
+
<th colspan="2">year</th>
|
19
|
+
<th colspan="2">month</th>
|
20
|
+
<th colspan="2">week</th>
|
21
|
+
<th colspan="2">day</th>
|
22
|
+
</tr>
|
23
|
+
</thead>
|
24
|
+
<% if available_event_sources.first.present? %>
|
25
|
+
<tbody>
|
26
|
+
<% @sourced_occurrences.keys.each do |source| %>
|
27
|
+
<tr>
|
28
|
+
<td><%= source %></td>
|
29
|
+
<% @sourced_occurrences[source].keys.reverse.each do |time_period| %>
|
30
|
+
<td><%= @sourced_occurrences[source][time_period] %></td>
|
31
|
+
<td><%= relative_occurrences(@sourced_occurrences[source], time_period) %></td>
|
32
|
+
<% end %>
|
33
|
+
</tr>
|
34
|
+
<% end %>
|
35
|
+
</tbody>
|
36
|
+
<% end %>
|
37
|
+
<tfoot>
|
38
|
+
<tr>
|
39
|
+
<th>All</th>
|
40
|
+
<% @occurrences[params[:event]].keys.reverse.each do |time_period| %>
|
41
|
+
<th><%= @occurrences[params[:event]][time_period] %></th>
|
42
|
+
<th><%= relative_occurrences(@occurrences[params[:event]], time_period)%></th>
|
43
|
+
<% end %>
|
44
|
+
</tr>
|
45
|
+
</tfoot>
|
46
|
+
</table>
|
47
|
+
</div>
|
48
|
+
</div>
|
49
|
+
</div>
|
50
|
+
|
51
|
+
<div class="row">
|
52
|
+
<div class="col-md-12">
|
53
|
+
<div class="well">
|
54
|
+
<div class="row">
|
55
|
+
<div class="col-md-10">
|
56
|
+
<h3>Detailed Statistics for <%= current_year %> per month</h3>
|
57
|
+
</div>
|
58
|
+
<div class="col-md-2">
|
59
|
+
<%= form_tag details_events_path, method: :get do %>
|
60
|
+
<%= hidden_field_tag :owner_type, current_owner_type %>
|
61
|
+
<%= hidden_field_tag :event, current_event %>
|
62
|
+
<%= select_tag :year, options_for_select(available_years, selected: current_year), onchange: "submit();", class: "form-control" %>
|
63
|
+
<% end %>
|
64
|
+
</div>
|
65
|
+
</div>
|
66
|
+
<table class="table table-striped table-bordered">
|
67
|
+
<thead>
|
68
|
+
<tr>
|
69
|
+
<th>Event Source</th>
|
70
|
+
<% month_name_array.each do |month| %>
|
71
|
+
<th><%= link_to month, monthly_details_events_path(owner_type: current_owner_type, event: current_event, month: month, year: current_year, time_interval: "month") %></th>
|
72
|
+
<% end %>
|
73
|
+
</tr>
|
74
|
+
</thead>
|
75
|
+
<tbody>
|
76
|
+
<% if available_event_sources? %>
|
77
|
+
<% @event_selected_year_occurrences.keys.reject { |k| k == "All" }.each do |source| %>
|
78
|
+
<tr>
|
79
|
+
<td><%= source %></td>
|
80
|
+
<% @event_selected_year_occurrences[source].keys.reject.each do |month| %>
|
81
|
+
<td><%= @event_selected_year_occurrences[source][month] %></td>
|
82
|
+
<% end %>
|
83
|
+
</tr>
|
84
|
+
<% end %>
|
85
|
+
<% end %>
|
86
|
+
</tbody>
|
87
|
+
<tfoot>
|
88
|
+
<tr>
|
89
|
+
<td><strong>All</strong></td>
|
90
|
+
<% @event_selected_year_occurrences["All"].keys.each do |month| %>
|
91
|
+
<td><%= @event_selected_year_occurrences["All"][month] %></td>
|
92
|
+
<% end %>
|
93
|
+
</tr>
|
94
|
+
</tfoot>
|
95
|
+
</table>
|
96
|
+
</div>
|
97
|
+
</div>
|
98
|
+
</div>
|