ahoy_captain 0.77 → 0.81

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascript/ahoy_captain/application.js +4 -4
  3. data/app/assets/javascript/ahoy_captain/controllers/application.js +5 -5
  4. data/app/assets/javascript/ahoy_captain/controllers/application_controller.js +9 -10
  5. data/app/assets/javascript/ahoy_captain/controllers/details_modal_controller.js +5 -5
  6. data/app/assets/javascript/ahoy_captain/controllers/dropdown_label_controller.js +2 -2
  7. data/app/assets/javascript/ahoy_captain/controllers/filter_controller.js +64 -58
  8. data/app/assets/javascript/ahoy_captain/controllers/filter_tag_controller.js +11 -8
  9. data/app/assets/javascript/ahoy_captain/controllers/funnel_chart_controller.js +77 -133
  10. data/app/assets/javascript/ahoy_captain/controllers/index.js +4 -3
  11. data/app/assets/javascript/ahoy_captain/controllers/interval_controller.js +10 -0
  12. data/app/assets/javascript/ahoy_captain/controllers/link_controller.js +22 -22
  13. data/app/assets/javascript/ahoy_captain/controllers/navigation_controller.js +10 -10
  14. data/app/assets/javascript/ahoy_captain/controllers/realtime_controller.js +7 -8
  15. data/app/controllers/ahoy_captain/application_controller.rb +17 -15
  16. data/app/controllers/ahoy_captain/campaigns_controller.rb +2 -10
  17. data/app/controllers/ahoy_captain/cities_controller.rb +2 -6
  18. data/app/controllers/ahoy_captain/countries_controller.rb +2 -6
  19. data/app/controllers/ahoy_captain/devices_controller.rb +3 -6
  20. data/app/controllers/ahoy_captain/entry_pages_controller.rb +2 -4
  21. data/app/controllers/ahoy_captain/exit_pages_controller.rb +3 -4
  22. data/app/controllers/ahoy_captain/exports_controller.rb +15 -0
  23. data/app/controllers/ahoy_captain/realtimes_controller.rb +1 -1
  24. data/app/controllers/ahoy_captain/regions_controller.rb +3 -7
  25. data/app/controllers/ahoy_captain/sources_controller.rb +2 -5
  26. data/app/controllers/ahoy_captain/stats/base_controller.rb +61 -0
  27. data/app/controllers/ahoy_captain/stats/bounce_rates_controller.rb +3 -2
  28. data/app/controllers/ahoy_captain/stats/total_pageviews_controller.rb +1 -1
  29. data/app/controllers/ahoy_captain/stats/total_visits_controller.rb +1 -1
  30. data/app/controllers/ahoy_captain/stats/unique_visitors_controller.rb +1 -1
  31. data/app/controllers/ahoy_captain/stats/views_per_visits_controller.rb +7 -6
  32. data/app/controllers/ahoy_captain/stats/visit_durations_controller.rb +1 -1
  33. data/app/controllers/ahoy_captain/top_pages_controller.rb +2 -8
  34. data/app/decorators/ahoy_captain/application_decorator.rb +27 -3
  35. data/app/decorators/ahoy_captain/campaign_decorator.rb +8 -0
  36. data/app/decorators/ahoy_captain/city_decorator.rb +12 -0
  37. data/app/decorators/ahoy_captain/country_decorator.rb +10 -0
  38. data/app/decorators/ahoy_captain/device_decorator.rb +13 -2
  39. data/app/decorators/ahoy_captain/page_decorator.rb +11 -0
  40. data/app/decorators/ahoy_captain/region_decorator.rb +16 -0
  41. data/app/decorators/ahoy_captain/source_decorator.rb +7 -0
  42. data/app/models/ahoy_captain/export.rb +48 -0
  43. data/app/presenters/ahoy_captain/dashboard_presenter.rb +24 -16
  44. data/app/presenters/ahoy_captain/funnel_presenter.rb +32 -29
  45. data/app/presenters/ahoy_captain/goals_presenter.rb +32 -23
  46. data/app/queries/ahoy_captain/application_query.rb +5 -2
  47. data/app/queries/ahoy_captain/campaign_query.rb +14 -0
  48. data/app/queries/ahoy_captain/city_query.rb +11 -0
  49. data/app/queries/ahoy_captain/country_query.rb +10 -0
  50. data/app/queries/ahoy_captain/device_query.rb +10 -0
  51. data/app/queries/ahoy_captain/entry_pages_query.rb +3 -2
  52. data/app/queries/ahoy_captain/event_query.rb +16 -1
  53. data/app/queries/ahoy_captain/exit_pages_query.rb +6 -4
  54. data/app/queries/ahoy_captain/region_query.rb +11 -0
  55. data/app/queries/ahoy_captain/source_query.rb +10 -0
  56. data/app/queries/ahoy_captain/stats/average_visit_duration_query.rb +3 -7
  57. data/app/queries/ahoy_captain/stats/bounce_rates_query.rb +9 -6
  58. data/app/queries/ahoy_captain/stats/total_visitors_query.rb +1 -1
  59. data/app/queries/ahoy_captain/stats/unique_visitors_query.rb +1 -1
  60. data/app/queries/ahoy_captain/stats/views_per_visit_query.rb +2 -2
  61. data/app/queries/ahoy_captain/stats/visit_duration_query.rb +4 -4
  62. data/app/queries/ahoy_captain/top_page_query.rb +13 -0
  63. data/app/queries/ahoy_captain/visit_query.rb +12 -12
  64. data/app/views/ahoy_captain/goals/index.html.erb +5 -5
  65. data/app/views/ahoy_captain/roots/show.html.erb +1 -1
  66. data/app/views/ahoy_captain/stats/base/index.html.erb +9 -1
  67. data/app/views/ahoy_captain/stats/show.html.erb +1 -1
  68. data/config/routes.rb +1 -0
  69. data/lib/ahoy_captain/ahoy/event_methods.rb +1 -1
  70. data/lib/ahoy_captain/configuration.rb +2 -2
  71. data/lib/ahoy_captain/engine.rb +1 -0
  72. data/lib/ahoy_captain/goals.rb +8 -4
  73. data/lib/ahoy_captain/period_collection.rb +1 -1
  74. data/lib/ahoy_captain/version.rb +1 -1
  75. data/lib/generators/ahoy_captain/migration_generator.rb +21 -0
  76. data/lib/generators/ahoy_captain/templates/config.rb.tt +18 -3
  77. data/lib/generators/ahoy_captain/templates/migration.rb.tt +7 -0
  78. metadata +42 -4
  79. data/app/models/ahoy_captain/current.rb +0 -9
  80. 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.uniques %>" max="<%= item.total %>">
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.uniques) %>
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.total) %>
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.conversion_rate %>%
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
- <%= line_chart @stats %>
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 * 100 %>%
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].gsub("properties", "ahoy_events.properties"))
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"
@@ -6,6 +6,7 @@ require 'view_component'
6
6
  require 'chartkick'
7
7
  require 'groupdate'
8
8
  require 'pagy'
9
+ require 'zip'
9
10
 
10
11
  module AhoyCaptain
11
12
  class Engine < Rails::Engine
@@ -1,19 +1,23 @@
1
1
  module AhoyCaptain
2
2
  class Goal
3
3
  attr_accessor :id
4
- attr_reader :title, :event_name
4
+ attr_reader :title, :event_query
5
5
  def initialize
6
6
  @id = nil
7
7
  @title = nil
8
- @event_name = nil
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 event(value)
16
- @event_name = value
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
 
@@ -51,7 +51,7 @@ module AhoyCaptain
51
51
  }.each do |param, options|
52
52
  instance.add(param, options[:label], options[:range])
53
53
  end
54
- instance.default = :mtd
54
+ instance.default = :'30d'
55
55
  instance
56
56
  end
57
57
 
@@ -1,3 +1,3 @@
1
1
  module AhoyCaptain
2
- VERSION = "0.77"
2
+ VERSION = "0.81"
3
3
  end
@@ -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
- # event "The event name you're tracking in your Ahoy::Event table"
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
- # event "$appointment.paid"
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.77'
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-07-30 00:00:00.000000000 Z
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/current.rb
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
@@ -1,9 +0,0 @@
1
- module AhoyCaptain
2
- class Current < ActiveSupport::CurrentAttributes
3
- attribute :request
4
-
5
- after_reset do
6
- self.request = nil
7
- end
8
- end
9
- end
@@ -1,6 +0,0 @@
1
- module AhoyCaptain
2
- class UrlHelpers
3
- include AhoyCaptain::Engine.routes.url_helpers
4
- include Singleton
5
- end
6
- end