ahoy_captain 0.77 → 0.81
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascript/ahoy_captain/application.js +4 -4
- data/app/assets/javascript/ahoy_captain/controllers/application.js +5 -5
- data/app/assets/javascript/ahoy_captain/controllers/application_controller.js +9 -10
- data/app/assets/javascript/ahoy_captain/controllers/details_modal_controller.js +5 -5
- data/app/assets/javascript/ahoy_captain/controllers/dropdown_label_controller.js +2 -2
- data/app/assets/javascript/ahoy_captain/controllers/filter_controller.js +64 -58
- data/app/assets/javascript/ahoy_captain/controllers/filter_tag_controller.js +11 -8
- data/app/assets/javascript/ahoy_captain/controllers/funnel_chart_controller.js +77 -133
- data/app/assets/javascript/ahoy_captain/controllers/index.js +4 -3
- data/app/assets/javascript/ahoy_captain/controllers/interval_controller.js +10 -0
- data/app/assets/javascript/ahoy_captain/controllers/link_controller.js +22 -22
- data/app/assets/javascript/ahoy_captain/controllers/navigation_controller.js +10 -10
- data/app/assets/javascript/ahoy_captain/controllers/realtime_controller.js +7 -8
- data/app/controllers/ahoy_captain/application_controller.rb +17 -15
- data/app/controllers/ahoy_captain/campaigns_controller.rb +2 -10
- data/app/controllers/ahoy_captain/cities_controller.rb +2 -6
- data/app/controllers/ahoy_captain/countries_controller.rb +2 -6
- data/app/controllers/ahoy_captain/devices_controller.rb +3 -6
- data/app/controllers/ahoy_captain/entry_pages_controller.rb +2 -4
- data/app/controllers/ahoy_captain/exit_pages_controller.rb +3 -4
- data/app/controllers/ahoy_captain/exports_controller.rb +15 -0
- data/app/controllers/ahoy_captain/realtimes_controller.rb +1 -1
- data/app/controllers/ahoy_captain/regions_controller.rb +3 -7
- data/app/controllers/ahoy_captain/sources_controller.rb +2 -5
- data/app/controllers/ahoy_captain/stats/base_controller.rb +61 -0
- data/app/controllers/ahoy_captain/stats/bounce_rates_controller.rb +3 -2
- data/app/controllers/ahoy_captain/stats/total_pageviews_controller.rb +1 -1
- data/app/controllers/ahoy_captain/stats/total_visits_controller.rb +1 -1
- data/app/controllers/ahoy_captain/stats/unique_visitors_controller.rb +1 -1
- data/app/controllers/ahoy_captain/stats/views_per_visits_controller.rb +7 -6
- data/app/controllers/ahoy_captain/stats/visit_durations_controller.rb +1 -1
- data/app/controllers/ahoy_captain/top_pages_controller.rb +2 -8
- data/app/decorators/ahoy_captain/application_decorator.rb +27 -3
- data/app/decorators/ahoy_captain/campaign_decorator.rb +8 -0
- data/app/decorators/ahoy_captain/city_decorator.rb +12 -0
- data/app/decorators/ahoy_captain/country_decorator.rb +10 -0
- data/app/decorators/ahoy_captain/device_decorator.rb +13 -2
- data/app/decorators/ahoy_captain/page_decorator.rb +11 -0
- data/app/decorators/ahoy_captain/region_decorator.rb +16 -0
- data/app/decorators/ahoy_captain/source_decorator.rb +7 -0
- data/app/models/ahoy_captain/export.rb +48 -0
- data/app/presenters/ahoy_captain/dashboard_presenter.rb +24 -16
- data/app/presenters/ahoy_captain/funnel_presenter.rb +32 -29
- data/app/presenters/ahoy_captain/goals_presenter.rb +32 -23
- data/app/queries/ahoy_captain/application_query.rb +5 -2
- data/app/queries/ahoy_captain/campaign_query.rb +14 -0
- data/app/queries/ahoy_captain/city_query.rb +11 -0
- data/app/queries/ahoy_captain/country_query.rb +10 -0
- data/app/queries/ahoy_captain/device_query.rb +10 -0
- data/app/queries/ahoy_captain/entry_pages_query.rb +3 -2
- data/app/queries/ahoy_captain/event_query.rb +16 -1
- data/app/queries/ahoy_captain/exit_pages_query.rb +6 -4
- data/app/queries/ahoy_captain/region_query.rb +11 -0
- data/app/queries/ahoy_captain/source_query.rb +10 -0
- data/app/queries/ahoy_captain/stats/average_visit_duration_query.rb +3 -7
- data/app/queries/ahoy_captain/stats/bounce_rates_query.rb +9 -6
- data/app/queries/ahoy_captain/stats/total_visitors_query.rb +1 -1
- data/app/queries/ahoy_captain/stats/unique_visitors_query.rb +1 -1
- data/app/queries/ahoy_captain/stats/views_per_visit_query.rb +2 -2
- data/app/queries/ahoy_captain/stats/visit_duration_query.rb +4 -4
- data/app/queries/ahoy_captain/top_page_query.rb +13 -0
- data/app/queries/ahoy_captain/visit_query.rb +12 -12
- data/app/views/ahoy_captain/goals/index.html.erb +5 -5
- data/app/views/ahoy_captain/roots/show.html.erb +1 -1
- data/app/views/ahoy_captain/stats/base/index.html.erb +9 -1
- data/app/views/ahoy_captain/stats/show.html.erb +1 -1
- data/config/routes.rb +1 -0
- data/lib/ahoy_captain/ahoy/event_methods.rb +1 -1
- data/lib/ahoy_captain/configuration.rb +2 -2
- data/lib/ahoy_captain/engine.rb +1 -0
- data/lib/ahoy_captain/goals.rb +8 -4
- data/lib/ahoy_captain/period_collection.rb +1 -1
- data/lib/ahoy_captain/version.rb +1 -1
- data/lib/generators/ahoy_captain/migration_generator.rb +21 -0
- data/lib/generators/ahoy_captain/templates/config.rb.tt +18 -3
- data/lib/generators/ahoy_captain/templates/migration.rb.tt +7 -0
- metadata +42 -4
- data/app/models/ahoy_captain/current.rb +0 -9
- data/app/models/ahoy_captain/url_helpers.rb +0 -6
@@ -10,21 +10,21 @@
|
|
10
10
|
<div class="grow">
|
11
11
|
<% if @presenter.goals.respond_to?(:each) && @presenter.goals.any? %>
|
12
12
|
<% @presenter.goals.each do |item| %>
|
13
|
+
|
13
14
|
<div class='leading-10 flex relative'>
|
14
|
-
<progress class='progress-primary bg-base-100 h-8 grow' value="<%= item.
|
15
|
+
<progress class='progress-primary bg-base-100 h-8 grow' value="<%= item.cr %>" max="100">
|
15
16
|
</progress>
|
16
17
|
<span class="grow text-elipsis overflow-hidden absolute left-4 bottom-3 h-8 text-base-content">
|
17
18
|
<%= item.name %>
|
18
19
|
</span>
|
19
20
|
<span class="w-8 ml-8 text-right">
|
20
|
-
<%= render AhoyCaptain::TooltipComponent.new(amount: item.
|
21
|
+
<%= render AhoyCaptain::TooltipComponent.new(amount: item.unique_visits) %>
|
21
22
|
</span>
|
22
23
|
<span class="w-8 ml-8 text-right">
|
23
|
-
<%= render AhoyCaptain::TooltipComponent.new(amount: item.
|
24
|
+
<%= render AhoyCaptain::TooltipComponent.new(amount: item.total_events) %>
|
24
25
|
</span>
|
25
|
-
|
26
26
|
<span class="w-8 ml-8 text-right">
|
27
|
-
<%= item.
|
27
|
+
<%= item.cr %>%
|
28
28
|
</span>
|
29
29
|
</div>
|
30
30
|
<% end %>
|
@@ -15,7 +15,7 @@
|
|
15
15
|
<%= render AhoyCaptain::TileComponent.new(title: 'Top Sources') do |component| %>
|
16
16
|
<% component.with_display_links do %>
|
17
17
|
<div data-controller='link' data-link-top_sources-class="text-primary underline">
|
18
|
-
<a href="<%= sources_path(search_params) %>"data-turbo-frame="sources" data-action='click->link#changeTopSources' data-link-target='top_sourcesLink'>All</a>
|
18
|
+
<a href="<%= sources_path(search_params) %>" data-turbo-frame="sources" data-action='click->link#changeTopSources' data-link-target='top_sourcesLink'>All</a>
|
19
19
|
<%= render AhoyCaptain::DropdownLinkComponent.new(title: "Campaign") do |dropdown| %>
|
20
20
|
<% %w{utm_source utm_medium utm_term utm_content utm_campaign}.each do |source| %>
|
21
21
|
<% dropdown.with_option do %>
|
@@ -1,3 +1,11 @@
|
|
1
1
|
<%= turbo_frame_tag :chart do %>
|
2
|
-
|
2
|
+
<div class="flex justify-end gap-3 items-center">
|
3
|
+
<a href="<%= export_path(request.query_parameters) %>" target="_blank" data-turbo-frame="false">Download</a>
|
4
|
+
<%= form_with url: url_for(params.permit!), method: :get, data: { controller: "interval" } do %>
|
5
|
+
<%= select_tag :interval, options_for_select(available_intervals.collect { |interval| [interval.titleize, interval] }, selected: selected_interval), class: "select select-bordered select-sm w-full max-w-sm", 'data-action': "change->interval#handleChange" %>
|
6
|
+
<% end %>
|
7
|
+
</div>
|
8
|
+
<div>
|
9
|
+
<%= line_chart @stats %>
|
10
|
+
</div>
|
3
11
|
<% end %>
|
@@ -38,7 +38,7 @@
|
|
38
38
|
<dt class="text-base font-normal text-base-content">Bounce rate</dt>
|
39
39
|
<dd class="mt-1 flex items-baseline justify-between md:block lg:flex">
|
40
40
|
<div class="flex items-baseline text-2xl font-semibold text-accent-content">
|
41
|
-
<%= number_with_delimiter @presenter.bounce_rate
|
41
|
+
<%= number_with_delimiter @presenter.bounce_rate %>%
|
42
42
|
</div>
|
43
43
|
</dd>
|
44
44
|
</a>
|
data/config/routes.rb
CHANGED
@@ -12,6 +12,7 @@ AhoyCaptain::Engine.routes.draw do
|
|
12
12
|
get "/devices/#{k}" => 'devices#index', defaults: { devices_type: v }, as: "devices_#{k}"
|
13
13
|
end
|
14
14
|
|
15
|
+
resource :export, only: [:show]
|
15
16
|
resource :realtime, only: [:show]
|
16
17
|
resources :funnels, only: [:show]
|
17
18
|
resources :goals, only: [:index]
|
@@ -5,7 +5,7 @@ module AhoyCaptain
|
|
5
5
|
|
6
6
|
included do
|
7
7
|
ransacker :route do |parent|
|
8
|
-
Arel.sql(AhoyCaptain.config.event[:url_column]
|
8
|
+
Arel.sql(AhoyCaptain.config.event[:url_column])
|
9
9
|
end
|
10
10
|
|
11
11
|
scope :with_routes, -> { where(AhoyCaptain.config.event[:url_exists]) }
|
@@ -16,8 +16,8 @@ module AhoyCaptain
|
|
16
16
|
end
|
17
17
|
@event = ActiveSupport::OrderedOptions.new.tap do |option|
|
18
18
|
option.view_name = "$view"
|
19
|
-
option.url_column = "CONCAT(properties->>'controller', '#', properties->>'action')"
|
20
|
-
option.url_exists = "JSONB_EXISTS(properties, 'controller') AND JSONB_EXISTS(properties, 'action')"
|
19
|
+
option.url_column = "CONCAT(ahoy_events.properties->>'controller', '#', ahoy_events.properties->>'action')"
|
20
|
+
option.url_exists = "JSONB_EXISTS(ahoy_events.properties, 'controller') AND JSONB_EXISTS(ahoy_events.properties, 'action')"
|
21
21
|
end
|
22
22
|
@models = ActiveSupport::OrderedOptions.new.tap do |option|
|
23
23
|
option.event = "::Ahoy::Event"
|
data/lib/ahoy_captain/engine.rb
CHANGED
data/lib/ahoy_captain/goals.rb
CHANGED
@@ -1,19 +1,23 @@
|
|
1
1
|
module AhoyCaptain
|
2
2
|
class Goal
|
3
3
|
attr_accessor :id
|
4
|
-
attr_reader :title, :
|
4
|
+
attr_reader :title, :event_query
|
5
5
|
def initialize
|
6
6
|
@id = nil
|
7
7
|
@title = nil
|
8
|
-
@
|
8
|
+
@event_query = nil
|
9
9
|
end
|
10
10
|
|
11
11
|
def label(value)
|
12
12
|
@title = value
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
16
|
-
@
|
15
|
+
def name(value)
|
16
|
+
@event_query = -> { AhoyCaptain.event.where(name: value) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def query(&block)
|
20
|
+
@event_query = block
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
data/lib/ahoy_captain/version.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
require "rails/generators/active_record"
|
3
|
+
|
4
|
+
module AhoyCaptain
|
5
|
+
module Generators
|
6
|
+
class MigrationGenerator < Rails::Generators::Base
|
7
|
+
include ActiveRecord::Generators::Migration
|
8
|
+
source_root File.join(__dir__, "templates")
|
9
|
+
|
10
|
+
def copy_templates
|
11
|
+
migration_template "migration.rb", "db/migrate/create_ahoy_captain_indexes.rb", migration_version: migration_version
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def migration_version
|
17
|
+
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
AhoyCaptain.configure do
|
1
|
+
AhoyCaptain.configure do |config|
|
2
2
|
# ==> Event tracking
|
3
3
|
#
|
4
4
|
# View name
|
@@ -74,6 +74,12 @@ AhoyCaptain.configure do
|
|
74
74
|
#
|
75
75
|
# And handle the default range, which will be used if no range is given:
|
76
76
|
# config.ranges.default = '3d'
|
77
|
+
#
|
78
|
+
# The max range if a custom range is sent
|
79
|
+
# config.ranges.max = 180.days
|
80
|
+
#
|
81
|
+
# Set to false to disable custom ranges
|
82
|
+
# config.ranges.custom = true
|
77
83
|
|
78
84
|
# ==> Caching
|
79
85
|
# config.cache.enabled = false
|
@@ -91,14 +97,23 @@ AhoyCaptain.configure do
|
|
91
97
|
#
|
92
98
|
# config.goal :unique_id do
|
93
99
|
# label "Some label here"
|
94
|
-
#
|
100
|
+
# name "The event name you're tracking in your Ahoy::Event table"
|
95
101
|
# end
|
96
102
|
#
|
97
103
|
# Real-world example:
|
98
104
|
#
|
99
105
|
# config.goal :appointment_paid do
|
100
106
|
# label "Appointment Paid"
|
101
|
-
#
|
107
|
+
# name "$appointment.paid"
|
108
|
+
# end
|
109
|
+
#
|
110
|
+
# You can also use queries:
|
111
|
+
#
|
112
|
+
# config.goal :appointment_paid do
|
113
|
+
# label "Appointment Paid"
|
114
|
+
# query do
|
115
|
+
# ::Ahoy::Event.where(...)
|
116
|
+
# end
|
102
117
|
# end
|
103
118
|
|
104
119
|
# ==> Funnels
|
@@ -0,0 +1,7 @@
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version %>
|
2
|
+
def change
|
3
|
+
add_index :<%= ::AhoyCaptain.visit.table_name %>, :started_at unless index_exists?(:<%= ::AhoyCaptain.visit.table_name %>, :started_at)
|
4
|
+
add_index :<%= ::AhoyCaptain.event.table_name %>, :visit_id unless index_exists?(:<%= ::AhoyCaptain.event.table_name %>, :visit_id)
|
5
|
+
add_index :<%= ::AhoyCaptain.event.table_name %>, :time unless index_exists?(:<%= ::AhoyCaptain.event.table_name %>, :time)
|
6
|
+
end
|
7
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ahoy_captain
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.81'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- joshmn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-08-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -150,6 +150,20 @@ dependencies:
|
|
150
150
|
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '4'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rubyzip
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: rails
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -248,6 +262,20 @@ dependencies:
|
|
248
262
|
- - ">="
|
249
263
|
- !ruby/object:Gem::Version
|
250
264
|
version: '0'
|
265
|
+
- !ruby/object:Gem::Dependency
|
266
|
+
name: pp_sql
|
267
|
+
requirement: !ruby/object:Gem::Requirement
|
268
|
+
requirements:
|
269
|
+
- - ">="
|
270
|
+
- !ruby/object:Gem::Version
|
271
|
+
version: '0'
|
272
|
+
type: :development
|
273
|
+
prerelease: false
|
274
|
+
version_requirements: !ruby/object:Gem::Requirement
|
275
|
+
requirements:
|
276
|
+
- - ">="
|
277
|
+
- !ruby/object:Gem::Version
|
278
|
+
version: '0'
|
251
279
|
description: A full-featured, mountable analytics dashboard for your Rails app, powered
|
252
280
|
by Ahoy.
|
253
281
|
email:
|
@@ -272,6 +300,7 @@ files:
|
|
272
300
|
- app/assets/javascript/ahoy_captain/controllers/filter_tag_controller.js
|
273
301
|
- app/assets/javascript/ahoy_captain/controllers/funnel_chart_controller.js
|
274
302
|
- app/assets/javascript/ahoy_captain/controllers/index.js
|
303
|
+
- app/assets/javascript/ahoy_captain/controllers/interval_controller.js
|
275
304
|
- app/assets/javascript/ahoy_captain/controllers/link_controller.js
|
276
305
|
- app/assets/javascript/ahoy_captain/controllers/navigation_controller.js
|
277
306
|
- app/assets/javascript/ahoy_captain/controllers/realtime_controller.js
|
@@ -303,6 +332,7 @@ files:
|
|
303
332
|
- app/controllers/ahoy_captain/devices_controller.rb
|
304
333
|
- app/controllers/ahoy_captain/entry_pages_controller.rb
|
305
334
|
- app/controllers/ahoy_captain/exit_pages_controller.rb
|
335
|
+
- app/controllers/ahoy_captain/exports_controller.rb
|
306
336
|
- app/controllers/ahoy_captain/filters/base_controller.rb
|
307
337
|
- app/controllers/ahoy_captain/filters/locations_controller.rb
|
308
338
|
- app/controllers/ahoy_captain/filters/operating_systems/names_controller.rb
|
@@ -340,18 +370,23 @@ files:
|
|
340
370
|
- app/decorators/ahoy_captain/source_decorator.rb
|
341
371
|
- app/decorators/ahoy_captain/top_page_decorator.rb
|
342
372
|
- app/helpers/ahoy_captain/application_helper.rb
|
343
|
-
- app/models/ahoy_captain/
|
373
|
+
- app/models/ahoy_captain/export.rb
|
344
374
|
- app/models/ahoy_captain/rangeable.rb
|
345
|
-
- app/models/ahoy_captain/url_helpers.rb
|
346
375
|
- app/models/ahoy_captain/widget.rb
|
347
376
|
- app/models/concerns/ahoy_captain/range_options.rb
|
348
377
|
- app/presenters/ahoy_captain/dashboard_presenter.rb
|
349
378
|
- app/presenters/ahoy_captain/funnel_presenter.rb
|
350
379
|
- app/presenters/ahoy_captain/goals_presenter.rb
|
351
380
|
- app/queries/ahoy_captain/application_query.rb
|
381
|
+
- app/queries/ahoy_captain/campaign_query.rb
|
382
|
+
- app/queries/ahoy_captain/city_query.rb
|
383
|
+
- app/queries/ahoy_captain/country_query.rb
|
384
|
+
- app/queries/ahoy_captain/device_query.rb
|
352
385
|
- app/queries/ahoy_captain/entry_pages_query.rb
|
353
386
|
- app/queries/ahoy_captain/event_query.rb
|
354
387
|
- app/queries/ahoy_captain/exit_pages_query.rb
|
388
|
+
- app/queries/ahoy_captain/region_query.rb
|
389
|
+
- app/queries/ahoy_captain/source_query.rb
|
355
390
|
- app/queries/ahoy_captain/stats/average_views_per_visit_query.rb
|
356
391
|
- app/queries/ahoy_captain/stats/average_visit_duration_query.rb
|
357
392
|
- app/queries/ahoy_captain/stats/bounce_rates_query.rb
|
@@ -360,6 +395,7 @@ files:
|
|
360
395
|
- app/queries/ahoy_captain/stats/unique_visitors_query.rb
|
361
396
|
- app/queries/ahoy_captain/stats/views_per_visit_query.rb
|
362
397
|
- app/queries/ahoy_captain/stats/visit_duration_query.rb
|
398
|
+
- app/queries/ahoy_captain/top_page_query.rb
|
363
399
|
- app/queries/ahoy_captain/visit_query.rb
|
364
400
|
- app/views/ahoy_captain/campaigns/index.html+details.erb
|
365
401
|
- app/views/ahoy_captain/campaigns/index.html.erb
|
@@ -400,7 +436,9 @@ files:
|
|
400
436
|
- lib/ahoy_captain/railtie.rb
|
401
437
|
- lib/ahoy_captain/version.rb
|
402
438
|
- lib/generators/ahoy_captain/install_generator.rb
|
439
|
+
- lib/generators/ahoy_captain/migration_generator.rb
|
403
440
|
- lib/generators/ahoy_captain/templates/config.rb.tt
|
441
|
+
- lib/generators/ahoy_captain/templates/migration.rb.tt
|
404
442
|
homepage:
|
405
443
|
licenses:
|
406
444
|
- MIT
|