rails_local_analytics 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -4
- data/app/assets/stylesheets/rails_local_analytics/application.css +10 -2
- data/app/controllers/rails_local_analytics/application_controller.rb +4 -0
- data/app/controllers/rails_local_analytics/dashboard_controller.rb +99 -15
- data/app/jobs/rails_local_analytics/record_request_job.rb +24 -20
- data/app/models/rails_local_analytics/application_record.rb +1 -5
- data/app/views/layouts/rails_local_analytics/application.html.erb +10 -5
- data/app/views/rails_local_analytics/dashboard/index.html.erb +119 -54
- data/config/initializers/browser_monkey_patches.rb +19 -0
- data/config/routes.rb +3 -2
- data/lib/rails_local_analytics/version.rb +1 -1
- metadata +3 -3
- data/app/assets/javascripts/rails_local_analytics/application.js +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ffdaa293f22790a92032f05322b5ceec16f7fa5ca6fe0d853f7ee2c22cb43a7
|
4
|
+
data.tar.gz: 6d40a7a31467662aeda69cf7e2d6ad7f427c7cae14de922b70b8a0fc5003c7ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a3c7cd5cda651680348f9b6feaba06ca917e6b55380fc5b9ec26713391ead71dd89830b209435eff75a3021a624c93a82e69ae5a9173c05d3a4918646d014d7
|
7
|
+
data.tar.gz: e1eda84eff2b599049bd837c69de93bfcf58614d31b9f437233f6a6e0ac881b0112746ea515275d5dac98b3de0d66ee13524f1038dfed0b33c24c02a003cf018
|
data/README.md
CHANGED
@@ -27,6 +27,8 @@ It is fully customizable to store more details if desired.
|
|
27
27
|
|
28
28
|
![Screenshot 3](/screenshot_3.png)
|
29
29
|
|
30
|
+
![Screenshot 4](/screenshot_4.png)
|
31
|
+
|
30
32
|
## Installation
|
31
33
|
|
32
34
|
```ruby
|
@@ -118,8 +120,8 @@ class ApplicationController < ActionController::Base
|
|
118
120
|
RailsLocalAnalytics.record_request(
|
119
121
|
request: request,
|
120
122
|
custom_attributes: { # optional
|
121
|
-
|
122
|
-
|
123
|
+
site: site_based_attrs,
|
124
|
+
page: {},
|
123
125
|
},
|
124
126
|
)
|
125
127
|
end
|
@@ -183,8 +185,8 @@ class ApplicationController
|
|
183
185
|
def record_page_view
|
184
186
|
# perform other logic and call RailsLocalAnalytics.record_request
|
185
187
|
|
186
|
-
TrackedRequestsByDayPage.where("
|
187
|
-
TrackedRequestsByDaySite.where("
|
188
|
+
TrackedRequestsByDayPage.where("day < ?", 3.months.ago).delete_all
|
189
|
+
TrackedRequestsByDaySite.where("day < ?", 3.months.ago).delete_all
|
188
190
|
end
|
189
191
|
end
|
190
192
|
```
|
@@ -1,3 +1,7 @@
|
|
1
|
+
body{
|
2
|
+
padding-bottom: 20px;
|
3
|
+
}
|
4
|
+
|
1
5
|
input, select {
|
2
6
|
border-radius: 5px;
|
3
7
|
border: 1px solid #333;
|
@@ -5,6 +9,10 @@ input, select {
|
|
5
9
|
padding: 2px 5px;
|
6
10
|
}
|
7
11
|
|
8
|
-
.
|
9
|
-
|
12
|
+
button.is-link{
|
13
|
+
border: none;
|
14
|
+
background: none;
|
15
|
+
color: #2780e3;
|
16
|
+
text-decoration: underline;
|
17
|
+
cursor: pointer;
|
10
18
|
}
|
@@ -1,22 +1,24 @@
|
|
1
1
|
module RailsLocalAnalytics
|
2
2
|
class DashboardController < ApplicationController
|
3
|
+
PER_PAGE_LIMIT = 1000
|
4
|
+
|
5
|
+
helper_method :pagination_page_number
|
3
6
|
|
4
7
|
def index
|
5
|
-
params[:type] ||= "
|
8
|
+
params[:type] ||= "page"
|
6
9
|
|
7
10
|
case params[:type]
|
8
|
-
when "
|
11
|
+
when "site"
|
9
12
|
@klass = TrackedRequestsByDaySite
|
10
|
-
when "
|
13
|
+
when "page"
|
11
14
|
@klass = TrackedRequestsByDayPage
|
12
15
|
else
|
13
|
-
|
16
|
+
head 404
|
17
|
+
return
|
14
18
|
end
|
15
19
|
|
16
20
|
if params[:group_by].present? && !@klass.display_columns.include?(params[:group_by])
|
17
|
-
params[:group_by] =
|
18
|
-
else
|
19
|
-
params[:group_by] ||= "All"
|
21
|
+
params[:group_by] = nil
|
20
22
|
end
|
21
23
|
|
22
24
|
if params[:start_date].present?
|
@@ -35,27 +37,109 @@ module RailsLocalAnalytics
|
|
35
37
|
@end_date = @start_date
|
36
38
|
end
|
37
39
|
|
38
|
-
@
|
40
|
+
@results = fetch_records(@start_date, @end_date)
|
41
|
+
|
42
|
+
if @results.size < PER_PAGE_LIMIT
|
43
|
+
prev_start_date, prev_end_date = get_prev_dates(@start_date, @end_date)
|
44
|
+
|
45
|
+
@prev_period_results = fetch_records(prev_start_date, prev_end_date)
|
46
|
+
|
47
|
+
if @prev_period_results.size >= PER_PAGE_LIMIT
|
48
|
+
@prev_period_results = nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def difference
|
54
|
+
case params.require(:type)
|
55
|
+
when "site"
|
56
|
+
@klass = TrackedRequestsByDaySite
|
57
|
+
when "page"
|
58
|
+
@klass = TrackedRequestsByDayPage
|
59
|
+
end
|
60
|
+
|
61
|
+
start_date = Date.parse(params.require(:start_date))
|
62
|
+
end_date = Date.parse(params.require(:end_date))
|
63
|
+
|
64
|
+
prev_start_date, prev_end_date = get_prev_dates(start_date, end_date)
|
65
|
+
|
66
|
+
where_conditions = params.require(:conditions).permit(*@klass.display_columns)
|
67
|
+
|
68
|
+
current_total = fetch_records(
|
69
|
+
start_date,
|
70
|
+
end_date,
|
71
|
+
where_conditions: where_conditions,
|
72
|
+
pluck_columns: ["SUM(total)"],
|
73
|
+
).first
|
74
|
+
|
75
|
+
prev_total = fetch_records(
|
76
|
+
prev_start_date,
|
77
|
+
prev_end_date,
|
78
|
+
where_conditions: where_conditions,
|
79
|
+
pluck_columns: ["SUM(total)"],
|
80
|
+
).first
|
39
81
|
|
40
|
-
|
41
|
-
|
82
|
+
if prev_total
|
83
|
+
diff = current_total - prev_total
|
84
|
+
else
|
85
|
+
diff = current_total
|
86
|
+
end
|
42
87
|
|
43
|
-
|
88
|
+
render json: {difference: diff}
|
44
89
|
end
|
45
90
|
|
46
91
|
private
|
47
92
|
|
48
|
-
def fetch_records(start_date, end_date)
|
93
|
+
def fetch_records(start_date, end_date, where_conditions: nil, pluck_columns: nil)
|
49
94
|
tracked_requests = @klass
|
50
|
-
.where("day >= ?",
|
51
|
-
.where("day <= ?",
|
95
|
+
.where("day >= ?", start_date)
|
96
|
+
.where("day <= ?", end_date)
|
52
97
|
.order(total: :desc)
|
53
98
|
|
99
|
+
if where_conditions.nil? && pluck_columns.nil?
|
100
|
+
tracked_requests = tracked_requests
|
101
|
+
.limit(PER_PAGE_LIMIT)
|
102
|
+
.offset(PER_PAGE_LIMIT * (pagination_page_number-1))
|
103
|
+
end
|
104
|
+
|
105
|
+
if where_conditions
|
106
|
+
tracked_requests = tracked_requests.where(where_conditions)
|
107
|
+
end
|
108
|
+
|
54
109
|
if params[:search].present?
|
55
110
|
tracked_requests = tracked_requests.multi_search(params[:search])
|
56
111
|
end
|
57
112
|
|
58
|
-
|
113
|
+
if params[:group_by].present?
|
114
|
+
group_by_columns = [params[:group_by]]
|
115
|
+
pluck_columns = [params[:group_by], "SUM(total)"]
|
116
|
+
else
|
117
|
+
group_by_columns = @klass.display_columns
|
118
|
+
pluck_columns ||= @klass.display_columns + ["SUM(total)"]
|
119
|
+
end
|
120
|
+
|
121
|
+
tracked_requests
|
122
|
+
.group(*group_by_columns)
|
123
|
+
.pluck(*pluck_columns)
|
124
|
+
end
|
125
|
+
|
126
|
+
def pagination_page_number
|
127
|
+
page = params[:page].presence.to_i || 1
|
128
|
+
page = 1 if page.zero?
|
129
|
+
page
|
130
|
+
end
|
131
|
+
|
132
|
+
def get_prev_dates(start_date, end_date)
|
133
|
+
if start_date == end_date
|
134
|
+
prev_start_date = start_date - 1.day
|
135
|
+
prev_end_date = prev_start_date
|
136
|
+
else
|
137
|
+
duration = end_date - start_date
|
138
|
+
prev_start_date = start_date - duration
|
139
|
+
prev_end_date = end_date - duration
|
140
|
+
end
|
141
|
+
return [prev_start_date, prev_end_date]
|
59
142
|
end
|
143
|
+
|
60
144
|
end
|
61
145
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module RailsLocalAnalytics
|
2
2
|
class RecordRequestJob < ApplicationJob
|
3
|
-
MODELS = [TrackedRequestsByDaySite, TrackedRequestsByDayPage].freeze
|
4
3
|
def perform(json)
|
5
4
|
if json.is_a?(String)
|
6
5
|
json = JSON.parse(json)
|
@@ -8,49 +7,56 @@ module RailsLocalAnalytics
|
|
8
7
|
|
9
8
|
request_hash = json.fetch("request_hash")
|
10
9
|
|
11
|
-
|
10
|
+
custom_attributes_by_type = json.fetch("custom_attributes")
|
12
11
|
|
13
|
-
|
14
|
-
|
12
|
+
["site", "page"].each do |type|
|
13
|
+
case type
|
14
|
+
when "site"
|
15
|
+
klass = TrackedRequestsByDaySite
|
16
|
+
when "page"
|
17
|
+
klass = TrackedRequestsByDayPage
|
18
|
+
end
|
19
|
+
|
20
|
+
custom_attrs = custom_attributes_by_type && custom_attributes_by_type[type]
|
15
21
|
|
16
|
-
attrs = build_attrs(
|
22
|
+
attrs = build_attrs(klass, custom_attrs, request_hash)
|
17
23
|
|
18
24
|
attrs["day"] = json.fetch("day")
|
19
25
|
|
20
|
-
existing_record =
|
26
|
+
existing_record = klass.find_by(attrs)
|
21
27
|
|
22
28
|
if existing_record
|
23
29
|
existing_record.increment!(:total, 1)
|
24
30
|
else
|
25
|
-
|
31
|
+
klass.create!(attrs)
|
26
32
|
end
|
27
33
|
end
|
28
34
|
end
|
29
35
|
|
30
36
|
private
|
31
37
|
|
32
|
-
def build_attrs(
|
38
|
+
def build_attrs(klass, attrs, request_hash)
|
33
39
|
attrs ||= {}
|
34
40
|
|
35
41
|
field = "url_hostname"
|
36
|
-
if !skip_field?(field, attrs,
|
37
|
-
attrs[field] = request_hash.fetch("host")
|
42
|
+
if !skip_field?(field, attrs, klass)
|
43
|
+
attrs[field] = request_hash.fetch("host")
|
38
44
|
end
|
39
45
|
|
40
46
|
field = "url_path"
|
41
|
-
if !skip_field?(field, attrs,
|
42
|
-
attrs[field] = request_hash.fetch("path")
|
47
|
+
if !skip_field?(field, attrs, klass)
|
48
|
+
attrs[field] = request_hash.fetch("path")
|
43
49
|
end
|
44
50
|
|
45
51
|
if request_hash.fetch("referrer").present?
|
46
52
|
field = "referrer_hostname"
|
47
|
-
if !skip_field?(field,attrs,
|
53
|
+
if !skip_field?(field,attrs, klass)
|
48
54
|
referrer_hostname, referrer_path = split_referrer(request_hash.fetch("referrer"))
|
49
55
|
attrs[field] = referrer_hostname
|
50
56
|
end
|
51
57
|
|
52
58
|
field = "referrer_path"
|
53
|
-
if !skip_field?(field, attrs,
|
59
|
+
if !skip_field?(field, attrs, klass)
|
54
60
|
if referrer_path.nil?
|
55
61
|
referrer_hostname, referrer_path = split_referrer(request_hash.fetch("referrer"))
|
56
62
|
end
|
@@ -60,13 +66,13 @@ module RailsLocalAnalytics
|
|
60
66
|
|
61
67
|
if request_hash.fetch("user_agent").present?
|
62
68
|
field = "platform"
|
63
|
-
if !skip_field?(field, attrs,
|
69
|
+
if !skip_field?(field, attrs, klass)
|
64
70
|
browser ||= create_browser_object(request_hash)
|
65
71
|
attrs[field] = browser.platform.name
|
66
72
|
end
|
67
73
|
|
68
74
|
field = "browser_engine"
|
69
|
-
if !skip_field?(field, attrs,
|
75
|
+
if !skip_field?(field, attrs, klass)
|
70
76
|
browser ||= create_browser_object(request_hash)
|
71
77
|
attrs[field] = get_browser_engine(browser)
|
72
78
|
end
|
@@ -76,8 +82,6 @@ module RailsLocalAnalytics
|
|
76
82
|
end
|
77
83
|
|
78
84
|
def split_referrer(referrer)
|
79
|
-
referrer = referrer.downcase
|
80
|
-
|
81
85
|
uri = URI(referrer)
|
82
86
|
|
83
87
|
if uri.host.present?
|
@@ -114,8 +118,8 @@ module RailsLocalAnalytics
|
|
114
118
|
)
|
115
119
|
end
|
116
120
|
|
117
|
-
def skip_field?(field, attrs,
|
118
|
-
attrs&.has_key?(field) || !
|
121
|
+
def skip_field?(field, attrs, klass)
|
122
|
+
attrs&.has_key?(field) || !klass.column_names.include?(field)
|
119
123
|
end
|
120
124
|
|
121
125
|
end
|
@@ -15,7 +15,7 @@ module RailsLocalAnalytics
|
|
15
15
|
sql_conditions << "(#{col} #{like} :search)"
|
16
16
|
end
|
17
17
|
|
18
|
-
relation =
|
18
|
+
relation = relation.where(sql_conditions.join(" OR "), search: "%#{sanitize_sql_like(str)}%")
|
19
19
|
end
|
20
20
|
|
21
21
|
next relation
|
@@ -26,9 +26,5 @@ module RailsLocalAnalytics
|
|
26
26
|
column_names - ["id", "created_at", "updated_at", "total", "day"]
|
27
27
|
end
|
28
28
|
|
29
|
-
def matches?(other_record)
|
30
|
-
day == other_record.day && self.class.display_columns.all?{|col_name| self.send(col_name) == other_record.send(col_name) }
|
31
|
-
end
|
32
|
-
|
33
29
|
end
|
34
30
|
end
|
@@ -9,12 +9,7 @@
|
|
9
9
|
<%= csp_meta_tag %>
|
10
10
|
|
11
11
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.4.0/cosmo/bootstrap.min.css" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
12
|
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.32.0/css/theme.default.min.css" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
13
12
|
<%= stylesheet_link_tag "rails_local_analytics/application" %>
|
14
|
-
|
15
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
16
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.0/js/jquery.tablesorter.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
17
|
-
<%= javascript_include_tag "rails_local_analytics/application" %>
|
18
13
|
</head>
|
19
14
|
|
20
15
|
<body>
|
@@ -23,6 +18,16 @@
|
|
23
18
|
<div class="navbar-header">
|
24
19
|
<%= link_to title , root_path, class: "navbar-brand" %>
|
25
20
|
</h1>
|
21
|
+
|
22
|
+
<ul class="nav navbar-nav navbar-right">
|
23
|
+
<li class="<%= 'active' if params[:type] == "page" %>">
|
24
|
+
<%= link_to "Requests By Page", tracked_requests_path(type: "page") %>
|
25
|
+
</li>
|
26
|
+
|
27
|
+
<li class="<%= 'active' if params[:type] == "site" %>">
|
28
|
+
<%= link_to "Requests By Site", tracked_requests_path(type: "site") %>
|
29
|
+
</li>
|
30
|
+
</ul>
|
26
31
|
</div>
|
27
32
|
</nav>
|
28
33
|
|
@@ -1,16 +1,13 @@
|
|
1
|
-
<%
|
2
|
-
<% site_group_by_options = options_for_select([["All", "All"]] + TrackedRequestsByDaySite.display_columns.map{|x| [x.titleize.sub("Url ", "URL "), x]}) %>
|
1
|
+
<% data_columns = params[:group_by].present? ? [params[:group_by]] : @klass.display_columns %>
|
3
2
|
|
4
|
-
<%= form_tag url_for(params.except(:start_date, :to).to_unsafe_hash), method: "get", class: "well well-sm" do %>
|
3
|
+
<%= form_tag url_for(params.except(:start_date, :to).to_unsafe_hash), method: "get", class: "well well-sm", id: "search-form" do %>
|
5
4
|
<div>
|
6
|
-
<label style="margin-right: 10px;">
|
7
|
-
|
8
|
-
<label style="margin-right: 10px;">Group By: <%= select_tag :group_by, options_for_select([["All", "All"]] + @klass.display_columns.map{|x| [x.titleize.sub("Url ", "URL "), x]} , params[:group_by]) %></label>
|
9
|
-
<label style="margin-right: 10px;">Search: <%= text_field_tag :search, params[:search] %></label>
|
5
|
+
<label style="margin-right: 10px;">Group By: <%= select_tag :group_by, options_for_select([["All", nil]] + @klass.display_columns.map{|x| [x.titleize.sub("Url ", "URL "), x]} , params[:group_by]) %></label>
|
10
6
|
|
11
7
|
<label style="margin-right: 10px;">From: <%= date_field_tag :start_date, @start_date %></label>
|
12
8
|
<label style="margin-right: 10px;">To: <%= date_field_tag :end_date, @end_date %></label>
|
13
|
-
|
9
|
+
|
10
|
+
<label style="margin-right: 10px;">Search: <%= text_field_tag :search, params[:search] %></label>
|
14
11
|
</div>
|
15
12
|
|
16
13
|
<div>
|
@@ -21,61 +18,86 @@
|
|
21
18
|
<%= link_to "Last 7 days", url_for(params.merge(start_date: 7.days.ago.to_date, end_date: Date.today).to_unsafe_hash) %>
|
22
19
|
|
|
23
20
|
<%= link_to "Last 30 days", url_for(params.merge(start_date: 30.days.ago.to_date, end_date: Date.today).to_unsafe_hash) %>
|
21
|
+
|
|
22
|
+
<%= link_to "Last 3 Months", url_for(params.merge(start_date: 3.months.ago.to_date, end_date: Date.today).to_unsafe_hash) %>
|
23
|
+
|
|
24
|
+
<%= link_to "Last 6 Months", url_for(params.merge(start_date: 6.months.ago.to_date, end_date: Date.today).to_unsafe_hash) %>
|
25
|
+
|
|
26
|
+
<%= link_to "Last Year", url_for(params.merge(start_date: 1.year.ago.to_date, end_date: Date.today).to_unsafe_hash) %>
|
24
27
|
</div>
|
25
28
|
<% end %>
|
26
29
|
|
27
|
-
<h2>
|
30
|
+
<h2>Requests by <%= params[:type].titleize %></h2>
|
28
31
|
|
29
|
-
<table class="table table-striped table-condensed
|
32
|
+
<table class="table table-striped table-condensed">
|
30
33
|
<thead>
|
31
|
-
<%
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
<span title="Sort column">↕</span>
|
36
|
-
</th>
|
37
|
-
<% end %>
|
38
|
-
<% else %>
|
39
|
-
<td>
|
40
|
-
<%= params[:group_by].titleize.sub("Url ", "URL ") %>
|
41
|
-
<span title="Sort column">↕</span>
|
42
|
-
</td>
|
34
|
+
<% data_columns.each do |header| %>
|
35
|
+
<th>
|
36
|
+
<%= header.sub("Url ", "URL ") %>
|
37
|
+
</th>
|
43
38
|
<% end %>
|
44
39
|
|
45
40
|
<th>
|
46
|
-
Total
|
47
|
-
|
41
|
+
Total
|
42
|
+
</th>
|
43
|
+
|
44
|
+
<th>
|
45
|
+
Difference from previous period
|
48
46
|
</th>
|
49
47
|
</thead>
|
50
48
|
|
51
49
|
<tbody>
|
52
|
-
<% @
|
53
|
-
<% first_record = records.first %>
|
54
|
-
|
50
|
+
<% @results.each_with_index do |row, row_index| %>
|
55
51
|
<tr>
|
56
|
-
<%
|
57
|
-
<% @klass.display_columns.each do |col_name| %>
|
58
|
-
<td>
|
59
|
-
<%= first_record.send(col_name) %>
|
60
|
-
</td>
|
61
|
-
<% end %>
|
62
|
-
<% else %>
|
52
|
+
<% row[0..-2].each do |value| %>
|
63
53
|
<td>
|
64
|
-
<%=
|
54
|
+
<%= value %>
|
65
55
|
</td>
|
66
56
|
<% end %>
|
67
57
|
|
68
58
|
<td>
|
69
|
-
<% total =
|
70
|
-
<%= total %>
|
59
|
+
<% total = row.last %>
|
60
|
+
<%= total.to_fs(:delimited) %>
|
61
|
+
</td>
|
62
|
+
|
63
|
+
<td>
|
64
|
+
<% if @prev_period_results.nil? %>
|
65
|
+
<%
|
66
|
+
diff_params = {
|
67
|
+
format: :json,
|
68
|
+
type: params[:type],
|
69
|
+
start_date: @start_date,
|
70
|
+
end_date: @end_date,
|
71
|
+
conditions: {},
|
72
|
+
}
|
73
|
+
|
74
|
+
data_columns.each_with_index do |col, col_index|
|
75
|
+
diff_params[:conditions][col] = row[col_index]
|
76
|
+
end
|
77
|
+
|
78
|
+
placeholder_id = "diff-placeholder-#{row_index}"
|
79
|
+
%>
|
71
80
|
|
72
|
-
|
73
|
-
<% diff = total - prev_period_records.sum(&:total) %>
|
81
|
+
<button type="button" class="load-difference is-link" data-url="<%= difference_tracked_requests_path(diff_params) %>" data-placeholder-id="<%= placeholder_id %>">Load Difference</button>
|
74
82
|
|
75
|
-
|
76
|
-
(+<%= diff %>)
|
83
|
+
<div id="<%= placeholder_id %>"></div>
|
77
84
|
<% else %>
|
78
|
-
|
85
|
+
<% prev_period_row_index = @prev_period_results.index{|prev_period_row| row[0..-2] == prev_period_row[0..-2] } %>
|
86
|
+
|
87
|
+
<% if prev_period_row_index.nil? %>
|
88
|
+
+<%= total.to_fs(:delimited) %>
|
89
|
+
<% else %>
|
90
|
+
<% prev_period_row = @prev_period_results.delete_at(prev_period_row_index) %>
|
91
|
+
|
92
|
+
<% prev_period_total = prev_period_row.last %>
|
93
|
+
<% diff = total - prev_period_total %>
|
94
|
+
|
95
|
+
<% if diff >= 0 %>
|
96
|
+
+<%= diff.to_fs(:delimited) %>
|
97
|
+
<% else %>
|
98
|
+
<%= diff.to_fs(:delimited) %>
|
99
|
+
<% end %>
|
100
|
+
<% end %>
|
79
101
|
<% end %>
|
80
102
|
</td>
|
81
103
|
</tr>
|
@@ -83,19 +105,62 @@
|
|
83
105
|
</tbody>
|
84
106
|
</table>
|
85
107
|
|
108
|
+
<div style="text-align: center;">
|
109
|
+
<% if params[:page].present? && params[:page].to_i > 1 %>
|
110
|
+
<%= link_to "Prev", url_for(params.to_unsafe_h.merge(page: pagination_page_number-1)) %>
|
111
|
+
|
|
112
|
+
<% end %>
|
113
|
+
|
114
|
+
<% if @results.size >= RailsLocalAnalytics::DashboardController::PER_PAGE_LIMIT %>
|
115
|
+
<%= link_to "Next", url_for(params.to_unsafe_h.merge(page: pagination_page_number+1)) %>
|
116
|
+
<% end %>
|
117
|
+
</div>
|
118
|
+
|
86
119
|
<script>
|
87
|
-
|
88
|
-
var
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
120
|
+
document.addEventListener("DOMContentLoaded", function(){
|
121
|
+
var form = document.querySelector("form#search-form")
|
122
|
+
|
123
|
+
document.querySelectorAll("form#search-form select, form#search-form input").forEach(function(el){
|
124
|
+
el.addEventListener("change", function(){
|
125
|
+
form.submit();
|
126
|
+
});
|
127
|
+
});
|
128
|
+
|
129
|
+
document.querySelectorAll("button.load-difference").forEach(function(el){
|
130
|
+
el.addEventListener("click", async function(){
|
131
|
+
el.disabled = true;
|
132
|
+
|
133
|
+
var csrf_token = document.querySelector('meta[name="csrf-token"]').content;
|
134
|
+
|
135
|
+
var request = new Request(
|
136
|
+
el.getAttribute("data-url"),
|
137
|
+
{
|
138
|
+
method: "GET",
|
139
|
+
headers: {
|
140
|
+
"Content-Type": "application/json",
|
141
|
+
Accept: "application/json",
|
142
|
+
"X-CSRF-Token": csrf_token,
|
143
|
+
},
|
144
|
+
},
|
145
|
+
);
|
146
|
+
|
147
|
+
var response = await fetch(request)
|
148
|
+
.then(function(response){
|
149
|
+
response.json().then(function(parsed_response){
|
150
|
+
el.style.display = "none";
|
151
|
+
|
152
|
+
var placeholderEl = document.querySelector("#" + el.getAttribute("data-placeholder-id"));
|
153
|
+
|
154
|
+
if(parsed_response.difference >= 1){
|
155
|
+
placeholderEl.innerHTML = "+" + parsed_response.difference.toLocaleString();
|
156
|
+
}else{
|
157
|
+
placeholderEl.innerHTML = "" + parsed_response.difference.toLocaleString();
|
158
|
+
}
|
159
|
+
});
|
160
|
+
|
161
|
+
});
|
162
|
+
|
163
|
+
});
|
99
164
|
});
|
100
165
|
});
|
101
166
|
</script>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
if Browser::VERSION.to_f < 6.0
|
2
|
+
Browser::Base.class_eval do
|
3
|
+
def chromium_based?
|
4
|
+
false
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
Browser::Chrome.class_eval do
|
9
|
+
def chromium_based?
|
10
|
+
true
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
Browser::Edge.class_eval do
|
15
|
+
def chromium_based?
|
16
|
+
match? && ua.match?(/\bEdg\b/)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/config/routes.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
RailsLocalAnalytics::Engine.routes.draw do
|
2
|
-
get "/tracked_requests", to: "dashboard#index"
|
2
|
+
get "/tracked_requests/:type", to: "dashboard#index", as: :tracked_requests
|
3
|
+
get "/tracked_requests/:type/difference", to: "dashboard#difference", as: :difference_tracked_requests, constraints: {format: :json}
|
3
4
|
|
4
|
-
root to: "
|
5
|
+
root to: "application#root"
|
5
6
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_local_analytics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Weston Ganger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-12-
|
11
|
+
date: 2024-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -92,7 +92,6 @@ files:
|
|
92
92
|
- README.md
|
93
93
|
- Rakefile
|
94
94
|
- app/assets/config/rails_local_analytics_manifest.js
|
95
|
-
- app/assets/javascripts/rails_local_analytics/application.js
|
96
95
|
- app/assets/stylesheets/rails_local_analytics/application.css
|
97
96
|
- app/controllers/rails_local_analytics/application_controller.rb
|
98
97
|
- app/controllers/rails_local_analytics/dashboard_controller.rb
|
@@ -104,6 +103,7 @@ files:
|
|
104
103
|
- app/models/tracked_requests_by_day_site.rb
|
105
104
|
- app/views/layouts/rails_local_analytics/application.html.erb
|
106
105
|
- app/views/rails_local_analytics/dashboard/index.html.erb
|
106
|
+
- config/initializers/browser_monkey_patches.rb
|
107
107
|
- config/routes.rb
|
108
108
|
- lib/rails_local_analytics.rb
|
109
109
|
- lib/rails_local_analytics/engine.rb
|