ahoy_captain 0.8 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -13
  3. data/app/assets/javascript/ahoy_captain/application.js +4 -4
  4. data/app/assets/javascript/ahoy_captain/controllers/active_links_controller.js +30 -0
  5. data/app/assets/javascript/ahoy_captain/controllers/application.js +5 -5
  6. data/app/assets/javascript/ahoy_captain/controllers/application_controller.js +16 -9
  7. data/app/assets/javascript/ahoy_captain/controllers/combobox_controller.js +341 -0
  8. data/app/assets/javascript/ahoy_captain/controllers/details_modal_controller.js +5 -5
  9. data/app/assets/javascript/ahoy_captain/controllers/dropdown_label_controller.js +2 -2
  10. data/app/assets/javascript/ahoy_captain/controllers/filter/item_controller.js +12 -0
  11. data/app/assets/javascript/ahoy_captain/controllers/filter_form_controller.js +13 -0
  12. data/app/assets/javascript/ahoy_captain/controllers/filter_modal_controller.js +45 -0
  13. data/app/assets/javascript/ahoy_captain/controllers/funnel_chart_controller.js +116 -104
  14. data/app/assets/javascript/ahoy_captain/controllers/index.js +4 -3
  15. data/app/assets/javascript/ahoy_captain/controllers/interval_controller.js +8 -3
  16. data/app/assets/javascript/ahoy_captain/controllers/line_chart_controller.js +188 -0
  17. data/app/assets/javascript/ahoy_captain/controllers/predicate_select_controller.js +9 -0
  18. data/app/assets/javascript/ahoy_captain/controllers/properties_controller.js +8 -0
  19. data/app/assets/javascript/ahoy_captain/controllers/property_filter_controller.js +46 -0
  20. data/app/assets/javascript/ahoy_captain/controllers/realtime_controller.js +12 -9
  21. data/app/assets/javascript/ahoy_captain/controllers/tile_controller.js +9 -0
  22. data/app/assets/javascript/ahoy_captain/controllers/toggle_controller.js +17 -0
  23. data/app/assets/javascript/ahoy_captain/helpers/chart_utils.js +156 -0
  24. data/app/assets/javascript/ahoy_captain/helpers/number_formatters.js +55 -0
  25. data/app/components/ahoy_captain/combobox_component.html.erb +33 -0
  26. data/app/components/ahoy_captain/combobox_component.rb +13 -0
  27. data/app/components/ahoy_captain/comparison_link_component.rb +40 -0
  28. data/app/components/ahoy_captain/dropdown_button_component.html.erb +5 -5
  29. data/app/components/ahoy_captain/dropdown_link_component.html.erb +5 -5
  30. data/app/components/ahoy_captain/filter/dropdown_component.html.erb +50 -0
  31. data/app/components/ahoy_captain/filter/dropdown_component.rb +51 -0
  32. data/app/components/ahoy_captain/filter/modal_component.html.erb +12 -9
  33. data/app/components/ahoy_captain/filter/select_component.html.erb +23 -19
  34. data/app/components/ahoy_captain/filter/select_component.rb +41 -9
  35. data/app/components/ahoy_captain/filter/tag_component.html.erb +8 -4
  36. data/app/components/ahoy_captain/filter/tag_component.rb +6 -30
  37. data/app/components/ahoy_captain/filter/tag_container_component.html.erb +2 -3
  38. data/app/components/ahoy_captain/filter/tag_container_component.rb +1 -8
  39. data/app/components/ahoy_captain/stats/comparable_container_component.html.erb +25 -0
  40. data/app/components/ahoy_captain/stats/comparable_container_component.rb +86 -0
  41. data/app/components/ahoy_captain/stats/container_component.html.erb +15 -0
  42. data/app/components/ahoy_captain/stats/container_component.rb +26 -0
  43. data/app/components/ahoy_captain/sticky_nav_component.html.erb +13 -22
  44. data/app/components/ahoy_captain/sticky_nav_component.rb +11 -0
  45. data/app/components/ahoy_captain/table_component.html.erb +4 -37
  46. data/app/components/ahoy_captain/table_component.rb +25 -5
  47. data/app/components/ahoy_captain/tables/devices_table_component.rb +11 -0
  48. data/app/components/ahoy_captain/tables/dynamic_table.rb +13 -0
  49. data/app/components/ahoy_captain/tables/dynamic_table_component.rb +204 -0
  50. data/app/components/ahoy_captain/tables/goals_table_component.rb +17 -0
  51. data/app/components/ahoy_captain/tables/header_component.html.erb +5 -0
  52. data/app/components/ahoy_captain/tables/header_component.rb +18 -0
  53. data/app/components/ahoy_captain/tables/headers/header_component.html.erb +5 -0
  54. data/app/components/ahoy_captain/tables/headers/header_component.rb +16 -0
  55. data/app/components/ahoy_captain/tables/properties_table_component.rb +27 -0
  56. data/app/components/ahoy_captain/tables/row_component.html.erb +4 -0
  57. data/app/components/ahoy_captain/tables/rows/row_component.html.erb +6 -0
  58. data/app/components/ahoy_captain/tables/rows/row_component.rb +40 -0
  59. data/app/components/ahoy_captain/tile_component.html.erb +21 -10
  60. data/app/components/ahoy_captain/tile_component.rb +3 -2
  61. data/app/components/ahoy_captain/tooltip_component.html.erb +2 -2
  62. data/app/controllers/ahoy_captain/application_controller.rb +19 -29
  63. data/app/controllers/ahoy_captain/campaigns_controller.rb +2 -10
  64. data/app/controllers/ahoy_captain/cities_controller.rb +2 -6
  65. data/app/controllers/ahoy_captain/countries_controller.rb +2 -6
  66. data/app/controllers/ahoy_captain/devices_controller.rb +3 -6
  67. data/app/controllers/ahoy_captain/entry_pages_controller.rb +2 -4
  68. data/app/controllers/ahoy_captain/exit_pages_controller.rb +3 -4
  69. data/app/controllers/ahoy_captain/exports_controller.rb +14 -0
  70. data/app/controllers/ahoy_captain/filters/base_controller.rb +1 -3
  71. data/app/controllers/ahoy_captain/filters/goals_controller.rb +9 -0
  72. data/app/controllers/ahoy_captain/filters/pages/actions_controller.rb +1 -1
  73. data/app/controllers/ahoy_captain/filters/pages/entry_pages_controller.rb +3 -3
  74. data/app/controllers/ahoy_captain/filters/pages/exit_pages_controller.rb +2 -3
  75. data/app/controllers/ahoy_captain/filters/properties/names_controller.rb +11 -0
  76. data/app/controllers/ahoy_captain/filters/properties/values_controller.rb +15 -0
  77. data/app/controllers/ahoy_captain/filters/sources_controller.rb +1 -1
  78. data/app/controllers/ahoy_captain/filters/utms_controller.rb +1 -1
  79. data/app/controllers/ahoy_captain/properties_controller.rb +41 -0
  80. data/app/controllers/ahoy_captain/regions_controller.rb +3 -7
  81. data/app/controllers/ahoy_captain/sources_controller.rb +2 -5
  82. data/app/controllers/ahoy_captain/stats/base_controller.rb +86 -5
  83. data/app/controllers/ahoy_captain/stats/bounce_rates_controller.rb +2 -1
  84. data/app/controllers/ahoy_captain/stats/total_pageviews_controller.rb +2 -1
  85. data/app/controllers/ahoy_captain/stats/total_visits_controller.rb +2 -1
  86. data/app/controllers/ahoy_captain/stats/unique_visitors_controller.rb +3 -1
  87. data/app/controllers/ahoy_captain/stats/views_per_visits_controller.rb +3 -11
  88. data/app/controllers/ahoy_captain/stats/visit_durations_controller.rb +2 -1
  89. data/app/controllers/ahoy_captain/top_pages_controller.rb +2 -8
  90. data/app/decorators/ahoy_captain/application_decorator.rb +27 -3
  91. data/app/decorators/ahoy_captain/campaign_decorator.rb +8 -0
  92. data/app/decorators/ahoy_captain/city_decorator.rb +12 -0
  93. data/app/decorators/ahoy_captain/country_decorator.rb +10 -0
  94. data/app/decorators/ahoy_captain/device_decorator.rb +13 -2
  95. data/app/decorators/ahoy_captain/page_decorator.rb +11 -0
  96. data/app/decorators/ahoy_captain/region_decorator.rb +16 -0
  97. data/app/decorators/ahoy_captain/source_decorator.rb +7 -0
  98. data/app/helpers/ahoy_captain/application_helper.rb +62 -3
  99. data/app/models/ahoy_captain/comparison_mode.rb +72 -0
  100. data/app/models/ahoy_captain/export.rb +48 -0
  101. data/app/models/ahoy_captain/filter_parser.rb +82 -0
  102. data/app/models/ahoy_captain/range_from_params.rb +75 -0
  103. data/app/models/ahoy_captain/rangeable.rb +0 -3
  104. data/app/models/concerns/ahoy_captain/compare_mode.rb +19 -0
  105. data/app/models/concerns/ahoy_captain/limitable.rb +17 -0
  106. data/app/models/concerns/ahoy_captain/range_options.rb +1 -14
  107. data/app/presenters/ahoy_captain/dashboard_presenter.rb +18 -49
  108. data/app/presenters/ahoy_captain/goals_presenter.rb +3 -2
  109. data/app/queries/ahoy_captain/application_query.rb +78 -13
  110. data/app/queries/ahoy_captain/campaign_query.rb +14 -0
  111. data/app/queries/ahoy_captain/city_query.rb +11 -0
  112. data/app/queries/ahoy_captain/country_query.rb +10 -0
  113. data/app/queries/ahoy_captain/device_query.rb +10 -0
  114. data/app/queries/ahoy_captain/entry_pages_query.rb +3 -2
  115. data/app/queries/ahoy_captain/event_query.rb +20 -13
  116. data/app/queries/ahoy_captain/exit_pages_query.rb +6 -4
  117. data/app/queries/ahoy_captain/region_query.rb +11 -0
  118. data/app/queries/ahoy_captain/source_query.rb +10 -0
  119. data/app/queries/ahoy_captain/stats/average_views_per_visit_query.rb +11 -4
  120. data/app/queries/ahoy_captain/stats/average_visit_duration_query.rb +14 -2
  121. data/app/queries/ahoy_captain/stats/base_query.rb +18 -0
  122. data/app/queries/ahoy_captain/stats/bounce_rates_query.rb +15 -1
  123. data/app/queries/ahoy_captain/stats/total_pageviews_query.rb +2 -2
  124. data/app/queries/ahoy_captain/stats/total_visitors_query.rb +1 -1
  125. data/app/queries/ahoy_captain/stats/unique_visitors_query.rb +1 -1
  126. data/app/queries/ahoy_captain/stats/views_per_visit_query.rb +1 -1
  127. data/app/queries/ahoy_captain/stats/visit_duration_query.rb +3 -3
  128. data/app/queries/ahoy_captain/top_page_query.rb +13 -0
  129. data/app/queries/ahoy_captain/visit_query.rb +2 -3
  130. data/app/queries/concerns/ahoy_captain/comparable_queries.rb +25 -0
  131. data/app/queries/concerns/ahoy_captain/comparable_query.rb +138 -0
  132. data/app/queries/concerns/ahoy_captain/lazy_comparable_query.rb +42 -0
  133. data/app/views/ahoy_captain/devices/_table.html.erb +2 -0
  134. data/app/views/ahoy_captain/devices/index.html+details.erb +1 -1
  135. data/app/views/ahoy_captain/devices/index.html.erb +2 -2
  136. data/app/views/ahoy_captain/funnels/show.html.erb +5 -2
  137. data/app/views/ahoy_captain/goals/index.html.erb +2 -37
  138. data/app/views/ahoy_captain/layouts/application.html.erb +3 -4
  139. data/app/views/ahoy_captain/properties/_form.html.erb +6 -0
  140. data/app/views/ahoy_captain/properties/index.html.erb +3 -0
  141. data/app/views/ahoy_captain/properties/show.html.erb +6 -0
  142. data/app/views/ahoy_captain/realtimes/show.html.erb +1 -1
  143. data/app/views/ahoy_captain/roots/_filters.html.erb +80 -0
  144. data/app/views/ahoy_captain/roots/show.html.erb +76 -109
  145. data/app/views/ahoy_captain/stats/base/index.html.erb +34 -9
  146. data/app/views/ahoy_captain/stats/show.html.erb +8 -55
  147. data/config/routes.rb +9 -0
  148. data/lib/ahoy_captain/ahoy/event_methods.rb +35 -74
  149. data/lib/ahoy_captain/ahoy/visit_methods.rb +1 -1
  150. data/lib/ahoy_captain/configuration.rb +18 -7
  151. data/lib/ahoy_captain/engine.rb +22 -0
  152. data/lib/ahoy_captain/filter_configuration/filter.rb +16 -0
  153. data/lib/ahoy_captain/filter_configuration/filter_collection.rb +48 -0
  154. data/lib/ahoy_captain/filters_configuration.rb +77 -0
  155. data/lib/ahoy_captain/goals.rb +10 -2
  156. data/lib/ahoy_captain/period_collection.rb +1 -1
  157. data/lib/ahoy_captain/predicate_label.rb +7 -0
  158. data/lib/ahoy_captain/version.rb +1 -1
  159. data/lib/ahoy_captain.rb +7 -1
  160. data/lib/generators/ahoy_captain/templates/config.rb.tt +32 -0
  161. metadata +80 -21
  162. data/app/assets/javascript/ahoy_captain/controllers/filter_controller.js +0 -145
  163. data/app/assets/javascript/ahoy_captain/controllers/filter_tag_controller.js +0 -17
  164. data/app/assets/javascript/ahoy_captain/controllers/link_controller.js +0 -43
  165. data/app/assets/javascript/ahoy_captain/controllers/navigation_controller.js +0 -25
  166. data/app/models/ahoy_captain/current.rb +0 -9
  167. data/app/models/ahoy_captain/url_helpers.rb +0 -6
@@ -0,0 +1,16 @@
1
+ module AhoyCaptain
2
+ class FilterConfiguration
3
+ class Filter
4
+ attr_reader :column, :label, :url, :predicates, :multiple, :position
5
+
6
+ def initialize(label:, column:, url:, predicates: [:in, :not_in], multiple: true, position: nil)
7
+ @column = column
8
+ @label = label
9
+ @url = url
10
+ @predicates = predicates
11
+ @multiple = multiple
12
+ @position = position
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,48 @@
1
+ module AhoyCaptain
2
+ class FilterConfiguration
3
+ class FilterCollection
4
+ def initialize(label)
5
+ @label = label
6
+ @registry = []
7
+ end
8
+
9
+ def filter(label:, column:, url:, predicates: [:in, :not_in], multiple: true, position: nil)
10
+ position ||= @registry.size
11
+ if item = find(column)
12
+ @registry.delete(item)
13
+ end
14
+
15
+ @registry << FilterConfiguration::Filter.new(label: label, column: column, url: url, predicates: predicates, multiple: multiple, position: position)
16
+ @registry = @registry.sort_by { |filter| filter.position }
17
+ end
18
+
19
+ def each(&block)
20
+ @registry.each(&block)
21
+ end
22
+
23
+ def modal_name
24
+ "#{@label.parameterize.underscore}Modal"
25
+ end
26
+
27
+ def find(column)
28
+ @registry.find { |filter| filter.column == column.to_sym }
29
+ end
30
+
31
+ def delete(name)
32
+ @registry.delete_if { |filter| filter.column == name }
33
+ end
34
+
35
+ def filters
36
+ @registry
37
+ end
38
+
39
+ def [](name)
40
+ find(name)
41
+ end
42
+
43
+ def include?(name)
44
+ find(name).present?
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,77 @@
1
+ require 'ahoy_captain/filter_configuration/filter'
2
+ require 'ahoy_captain/filter_configuration/filter_collection'
3
+
4
+ module AhoyCaptain
5
+ class FiltersConfiguration
6
+ def self.load_default
7
+ new.tap do |config|
8
+ config.register("Page") do
9
+ filter column: :route, label: "Route", url: :filters_actions_path, predicates: [:in, :not_in]
10
+ filter column: :entry_page, label: "Entry Page", url: :filters_entry_pages_path, predicates: [:in, :not_in]
11
+ filter column: :exit_page, label: "Exit Page", url: :filters_exit_pages_path, predicates: [:in, :not_in]
12
+ end
13
+
14
+ config.register("Geography") do
15
+ filter column: :country, label: "Country", url: :filters_locations_countries_path, predicates: [:in, :not_in]
16
+ filter column: :region, label: "Region", url: :filters_locations_regions_path, predicates: [:in, :not_in]
17
+ filter column: :city, label: "City", url: :filters_locations_cities_path, predicates: [:in, :not_in]
18
+ end
19
+
20
+ config.register("Source") do
21
+ filter column: :referring_domain, label: "Source", url: :filters_sources_path, predicates: [:in, :not_in]
22
+ end
23
+
24
+ config.register("Screen size") do
25
+ filter column: :device_type, label: "Screen size", url: :filters_screens_path, predicates: [:in, :not_in]
26
+ end
27
+
28
+ config.register("Operating System") do
29
+ filter column: :os, label: "OS Name", url: :filters_names_path, predicates: [:in, :not_in]
30
+ filter column: :os_version, label: "OS Version", url: :filters_versions_path, predicates: [:in, :not_in]
31
+ end
32
+
33
+ config.register("UTM Tags") do
34
+ filter column: :utm_medium, label: "UTM Medium", url: :filters_utm_mediums_path, predicates: [:in, :not_in]
35
+ filter column: :utm_source, label: "UTM Source", url: :filters_utm_sources_path, predicates: [:in, :not_in]
36
+ filter column: :utm_campaign, label: "UTM Campaign", url: :filters_utm_campaigns_path, predicates: [:in, :not_in]
37
+ filter column: :utm_term, label: "UTM Term", url: :filters_utm_terms_path, predicates: [:in, :not_in]
38
+ filter column: :utm_content, label: "UTM Content", url: :filters_utm_contents_path, predicates: [:in, :not_in]
39
+ end
40
+
41
+ config.register("Goal") do
42
+ filter column: :goal, label: "Goal", url: :filters_goals_path, predicates: [:in]
43
+ end
44
+ end
45
+ end
46
+
47
+ def initialize
48
+ @registry = {}
49
+ end
50
+
51
+ def register(label, &block)
52
+ item = FilterConfiguration::FilterCollection.new(label)
53
+ item.instance_exec(&block)
54
+ @registry[label] = item
55
+ end
56
+
57
+ def [](val)
58
+ @registry[val]
59
+ end
60
+
61
+ def delete(name)
62
+ @registry.delete(name)
63
+ end
64
+
65
+ def reset
66
+ @registry = {}
67
+ end
68
+
69
+ def each(&block)
70
+ @registry.each(&block)
71
+ end
72
+
73
+ def detect(&block)
74
+ @registry.detect(&block)
75
+ end
76
+ end
77
+ end
@@ -13,7 +13,15 @@ module AhoyCaptain
13
13
  end
14
14
 
15
15
  def name(value)
16
- @event_query = -> { AhoyCaptain.event.where(name: value) }
16
+ @event_query = -> { ::AhoyCaptain.event.where(name: value) }
17
+ end
18
+
19
+ def event(value)
20
+ ActiveSupport::Deprecation.warn(
21
+ "event is deprecated. " \
22
+ "Use name instead."
23
+ )
24
+ name(value)
17
25
  end
18
26
 
19
27
  def query(&block)
@@ -25,7 +33,7 @@ module AhoyCaptain
25
33
  include Enumerable
26
34
 
27
35
  def initialize
28
- @goals = {}
36
+ @goals = {}.with_indifferent_access
29
37
  end
30
38
 
31
39
  def register(goal)
@@ -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
 
@@ -0,0 +1,7 @@
1
+ module AhoyCaptain
2
+ class PredicateLabel
3
+ def self.[](value)
4
+ AhoyCaptain.config.predicate_labels[value.to_sym] || value.to_s.titleize
5
+ end
6
+ end
7
+ end
@@ -1,3 +1,3 @@
1
1
  module AhoyCaptain
2
- VERSION = "0.8"
2
+ VERSION = "0.10.0"
3
3
  end
data/lib/ahoy_captain.rb CHANGED
@@ -4,6 +4,7 @@ require "ahoy_captain/engine"
4
4
  require "ahoy_captain/goals"
5
5
  require "ahoy_captain/funnels"
6
6
  require "ahoy_captain/configuration"
7
+ require "ahoy_captain/predicate_label"
7
8
  require 'ahoy_captain/ahoy/visit_methods'
8
9
  require 'ahoy_captain/ahoy/event_methods'
9
10
 
@@ -27,11 +28,12 @@ module AhoyCaptain
27
28
  pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
28
29
  pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
29
30
  pin "application", to: "ahoy_captain/application.js", preload: true
30
- pin "slim-select", to: "https://ga.jspm.io/npm:slim-select@2.6.0/dist/slimselect.es.js", preload: true
31
31
  pin "chartkick", to: "chartkick.js"
32
32
  pin "Chart.bundle", to: "Chart.bundle.js"
33
33
  pin "chartjs-plugin-datalabels", to: "https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2", preload: true
34
+ pin "classnames", to: "https://cdnjs.cloudflare.com/ajax/libs/classnames/2.3.2/index.min.js", preload: true
34
35
  pin_all_from AhoyCaptain::Engine.root.join("app/assets/javascript/ahoy_captain/controllers"), under: "controllers", to: "ahoy_captain/controllers"
36
+ pin_all_from AhoyCaptain::Engine.root.join("app/assets/javascript/ahoy_captain/helpers"), under: "helpers", to: "ahoy_captain/helpers"
35
37
  end
36
38
  end
37
39
 
@@ -50,5 +52,9 @@ module AhoyCaptain
50
52
  def visit
51
53
  @visit ||= config.models[:visit].constantize
52
54
  end
55
+
56
+ def none
57
+ @none ||= OpenStruct.new(text: "(none)", value: "!none!")
58
+ end
53
59
  end
54
60
  end
@@ -80,6 +80,33 @@ AhoyCaptain.configure do |config|
80
80
  #
81
81
  # Set to false to disable custom ranges
82
82
  # config.ranges.custom = true
83
+ #
84
+ # For an interval to be considered "realtime" it must not have a secondary item in the range
85
+
86
+ # ==> Filters
87
+ #
88
+ # Defaults come from lib/ahoy_captain/filter_configuration.rb
89
+ #
90
+ # If you want your own entirely, first call reset.
91
+ # config.filters.reset
92
+ #
93
+ # Then you can add your own.
94
+ #
95
+ # config.filters.register "Group label" do
96
+ # filter label: "Some label", column: :column_name, url: :url_for_options, predicates: [:in, :not_in], multiple: true
97
+ # end
98
+ #
99
+ # You can also remove an existing group:
100
+ #
101
+ # config.filters.delete("Group label")
102
+ #
103
+ # Remove a specific filter from a group:
104
+ #
105
+ # config.filters["Group label"].delete(:column_name)
106
+ #
107
+ # You can add to an existing group:
108
+ #
109
+ # config.filters["Group label"].filter label: "Some label", column: :column_name, url: :url_for_options, predicates: [:in, :not_in], multiple: true
83
110
 
84
111
  # ==> Caching
85
112
  # config.cache.enabled = false
@@ -135,4 +162,9 @@ AhoyCaptain.configure do |config|
135
162
  # goal :appointment_created
136
163
  # goal :appointment_paid
137
164
  # end
165
+ #
166
+ # => Realtime interval
167
+ # config.realtime_interval = 30.seconds
168
+ #
169
+ # How frequently the page should refresh if the interval is realtime
138
170
  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.8'
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - joshmn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-03 00:00:00.000000000 Z
11
+ date: 2023-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -151,35 +151,35 @@ dependencies:
151
151
  - !ruby/object:Gem::Version
152
152
  version: '4'
153
153
  - !ruby/object:Gem::Dependency
154
- name: rails
154
+ name: rubyzip
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - ">="
158
158
  - !ruby/object:Gem::Version
159
- version: '6'
160
- type: :development
159
+ version: '0'
160
+ type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
- version: '6'
166
+ version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
- name: sprockets-rails
168
+ name: rails
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - ">="
172
172
  - !ruby/object:Gem::Version
173
- version: '0'
173
+ version: '6'
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
- version: '0'
180
+ version: '6'
181
181
  - !ruby/object:Gem::Dependency
182
- name: better_errors
182
+ name: sprockets-rails
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
185
  - - ">="
@@ -193,7 +193,7 @@ dependencies:
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
195
  - !ruby/object:Gem::Dependency
196
- name: binding_of_caller
196
+ name: better_errors
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
199
  - - ">="
@@ -207,7 +207,7 @@ dependencies:
207
207
  - !ruby/object:Gem::Version
208
208
  version: '0'
209
209
  - !ruby/object:Gem::Dependency
210
- name: sassc
210
+ name: binding_of_caller
211
211
  requirement: !ruby/object:Gem::Requirement
212
212
  requirements:
213
213
  - - ">="
@@ -221,7 +221,7 @@ dependencies:
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0'
223
223
  - !ruby/object:Gem::Dependency
224
- name: puma
224
+ name: sassc
225
225
  requirement: !ruby/object:Gem::Requirement
226
226
  requirements:
227
227
  - - ">="
@@ -235,7 +235,7 @@ dependencies:
235
235
  - !ruby/object:Gem::Version
236
236
  version: '0'
237
237
  - !ruby/object:Gem::Dependency
238
- name: pg
238
+ name: puma
239
239
  requirement: !ruby/object:Gem::Requirement
240
240
  requirements:
241
241
  - - ">="
@@ -249,7 +249,7 @@ dependencies:
249
249
  - !ruby/object:Gem::Version
250
250
  version: '0'
251
251
  - !ruby/object:Gem::Dependency
252
- name: pp_sql
252
+ name: pg
253
253
  requirement: !ruby/object:Gem::Requirement
254
254
  requirements:
255
255
  - - ">="
@@ -278,23 +278,37 @@ files:
278
278
  - app/assets/images/ahoy_captain/logo.png
279
279
  - app/assets/images/ahoy_captain/safari-pinned-tab.svg
280
280
  - app/assets/javascript/ahoy_captain/application.js
281
+ - app/assets/javascript/ahoy_captain/controllers/active_links_controller.js
281
282
  - app/assets/javascript/ahoy_captain/controllers/application.js
282
283
  - app/assets/javascript/ahoy_captain/controllers/application_controller.js
284
+ - app/assets/javascript/ahoy_captain/controllers/combobox_controller.js
283
285
  - app/assets/javascript/ahoy_captain/controllers/details_modal_controller.js
284
286
  - app/assets/javascript/ahoy_captain/controllers/dropdown_label_controller.js
285
- - app/assets/javascript/ahoy_captain/controllers/filter_controller.js
286
- - app/assets/javascript/ahoy_captain/controllers/filter_tag_controller.js
287
+ - app/assets/javascript/ahoy_captain/controllers/filter/item_controller.js
288
+ - app/assets/javascript/ahoy_captain/controllers/filter_form_controller.js
289
+ - app/assets/javascript/ahoy_captain/controllers/filter_modal_controller.js
287
290
  - app/assets/javascript/ahoy_captain/controllers/funnel_chart_controller.js
288
291
  - app/assets/javascript/ahoy_captain/controllers/index.js
289
292
  - app/assets/javascript/ahoy_captain/controllers/interval_controller.js
290
- - app/assets/javascript/ahoy_captain/controllers/link_controller.js
291
- - app/assets/javascript/ahoy_captain/controllers/navigation_controller.js
293
+ - app/assets/javascript/ahoy_captain/controllers/line_chart_controller.js
294
+ - app/assets/javascript/ahoy_captain/controllers/predicate_select_controller.js
295
+ - app/assets/javascript/ahoy_captain/controllers/properties_controller.js
296
+ - app/assets/javascript/ahoy_captain/controllers/property_filter_controller.js
292
297
  - app/assets/javascript/ahoy_captain/controllers/realtime_controller.js
298
+ - app/assets/javascript/ahoy_captain/controllers/tile_controller.js
299
+ - app/assets/javascript/ahoy_captain/controllers/toggle_controller.js
300
+ - app/assets/javascript/ahoy_captain/helpers/chart_utils.js
301
+ - app/assets/javascript/ahoy_captain/helpers/number_formatters.js
293
302
  - app/assets/manifest/ahoy_captain/manifest.js
303
+ - app/components/ahoy_captain/combobox_component.html.erb
304
+ - app/components/ahoy_captain/combobox_component.rb
305
+ - app/components/ahoy_captain/comparison_link_component.rb
294
306
  - app/components/ahoy_captain/dropdown_button_component.html.erb
295
307
  - app/components/ahoy_captain/dropdown_button_component.rb
296
308
  - app/components/ahoy_captain/dropdown_link_component.html.erb
297
309
  - app/components/ahoy_captain/dropdown_link_component.rb
310
+ - app/components/ahoy_captain/filter/dropdown_component.html.erb
311
+ - app/components/ahoy_captain/filter/dropdown_component.rb
298
312
  - app/components/ahoy_captain/filter/modal_component.html.erb
299
313
  - app/components/ahoy_captain/filter/modal_component.rb
300
314
  - app/components/ahoy_captain/filter/select_component.html.erb
@@ -303,10 +317,26 @@ files:
303
317
  - app/components/ahoy_captain/filter/tag_component.rb
304
318
  - app/components/ahoy_captain/filter/tag_container_component.html.erb
305
319
  - app/components/ahoy_captain/filter/tag_container_component.rb
320
+ - app/components/ahoy_captain/stats/comparable_container_component.html.erb
321
+ - app/components/ahoy_captain/stats/comparable_container_component.rb
322
+ - app/components/ahoy_captain/stats/container_component.html.erb
323
+ - app/components/ahoy_captain/stats/container_component.rb
306
324
  - app/components/ahoy_captain/sticky_nav_component.html.erb
307
325
  - app/components/ahoy_captain/sticky_nav_component.rb
308
326
  - app/components/ahoy_captain/table_component.html.erb
309
327
  - app/components/ahoy_captain/table_component.rb
328
+ - app/components/ahoy_captain/tables/devices_table_component.rb
329
+ - app/components/ahoy_captain/tables/dynamic_table.rb
330
+ - app/components/ahoy_captain/tables/dynamic_table_component.rb
331
+ - app/components/ahoy_captain/tables/goals_table_component.rb
332
+ - app/components/ahoy_captain/tables/header_component.html.erb
333
+ - app/components/ahoy_captain/tables/header_component.rb
334
+ - app/components/ahoy_captain/tables/headers/header_component.html.erb
335
+ - app/components/ahoy_captain/tables/headers/header_component.rb
336
+ - app/components/ahoy_captain/tables/properties_table_component.rb
337
+ - app/components/ahoy_captain/tables/row_component.html.erb
338
+ - app/components/ahoy_captain/tables/rows/row_component.html.erb
339
+ - app/components/ahoy_captain/tables/rows/row_component.rb
310
340
  - app/components/ahoy_captain/tile_component.html.erb
311
341
  - app/components/ahoy_captain/tile_component.rb
312
342
  - app/components/ahoy_captain/tooltip_component.html.erb
@@ -318,18 +348,23 @@ files:
318
348
  - app/controllers/ahoy_captain/devices_controller.rb
319
349
  - app/controllers/ahoy_captain/entry_pages_controller.rb
320
350
  - app/controllers/ahoy_captain/exit_pages_controller.rb
351
+ - app/controllers/ahoy_captain/exports_controller.rb
321
352
  - app/controllers/ahoy_captain/filters/base_controller.rb
353
+ - app/controllers/ahoy_captain/filters/goals_controller.rb
322
354
  - app/controllers/ahoy_captain/filters/locations_controller.rb
323
355
  - app/controllers/ahoy_captain/filters/operating_systems/names_controller.rb
324
356
  - app/controllers/ahoy_captain/filters/operating_systems/versions_controller.rb
325
357
  - app/controllers/ahoy_captain/filters/pages/actions_controller.rb
326
358
  - app/controllers/ahoy_captain/filters/pages/entry_pages_controller.rb
327
359
  - app/controllers/ahoy_captain/filters/pages/exit_pages_controller.rb
360
+ - app/controllers/ahoy_captain/filters/properties/names_controller.rb
361
+ - app/controllers/ahoy_captain/filters/properties/values_controller.rb
328
362
  - app/controllers/ahoy_captain/filters/screens_controller.rb
329
363
  - app/controllers/ahoy_captain/filters/sources_controller.rb
330
364
  - app/controllers/ahoy_captain/filters/utms_controller.rb
331
365
  - app/controllers/ahoy_captain/funnels_controller.rb
332
366
  - app/controllers/ahoy_captain/goals_controller.rb
367
+ - app/controllers/ahoy_captain/properties_controller.rb
333
368
  - app/controllers/ahoy_captain/realtimes_controller.rb
334
369
  - app/controllers/ahoy_captain/regions_controller.rb
335
370
  - app/controllers/ahoy_captain/roots_controller.rb
@@ -355,33 +390,49 @@ files:
355
390
  - app/decorators/ahoy_captain/source_decorator.rb
356
391
  - app/decorators/ahoy_captain/top_page_decorator.rb
357
392
  - app/helpers/ahoy_captain/application_helper.rb
358
- - app/models/ahoy_captain/current.rb
393
+ - app/models/ahoy_captain/comparison_mode.rb
394
+ - app/models/ahoy_captain/export.rb
395
+ - app/models/ahoy_captain/filter_parser.rb
396
+ - app/models/ahoy_captain/range_from_params.rb
359
397
  - app/models/ahoy_captain/rangeable.rb
360
- - app/models/ahoy_captain/url_helpers.rb
361
398
  - app/models/ahoy_captain/widget.rb
399
+ - app/models/concerns/ahoy_captain/compare_mode.rb
400
+ - app/models/concerns/ahoy_captain/limitable.rb
362
401
  - app/models/concerns/ahoy_captain/range_options.rb
363
402
  - app/presenters/ahoy_captain/dashboard_presenter.rb
364
403
  - app/presenters/ahoy_captain/funnel_presenter.rb
365
404
  - app/presenters/ahoy_captain/goals_presenter.rb
366
405
  - app/queries/ahoy_captain/application_query.rb
406
+ - app/queries/ahoy_captain/campaign_query.rb
407
+ - app/queries/ahoy_captain/city_query.rb
408
+ - app/queries/ahoy_captain/country_query.rb
409
+ - app/queries/ahoy_captain/device_query.rb
367
410
  - app/queries/ahoy_captain/entry_pages_query.rb
368
411
  - app/queries/ahoy_captain/event_query.rb
369
412
  - app/queries/ahoy_captain/exit_pages_query.rb
413
+ - app/queries/ahoy_captain/region_query.rb
414
+ - app/queries/ahoy_captain/source_query.rb
370
415
  - app/queries/ahoy_captain/stats/average_views_per_visit_query.rb
371
416
  - app/queries/ahoy_captain/stats/average_visit_duration_query.rb
417
+ - app/queries/ahoy_captain/stats/base_query.rb
372
418
  - app/queries/ahoy_captain/stats/bounce_rates_query.rb
373
419
  - app/queries/ahoy_captain/stats/total_pageviews_query.rb
374
420
  - app/queries/ahoy_captain/stats/total_visitors_query.rb
375
421
  - app/queries/ahoy_captain/stats/unique_visitors_query.rb
376
422
  - app/queries/ahoy_captain/stats/views_per_visit_query.rb
377
423
  - app/queries/ahoy_captain/stats/visit_duration_query.rb
424
+ - app/queries/ahoy_captain/top_page_query.rb
378
425
  - app/queries/ahoy_captain/visit_query.rb
426
+ - app/queries/concerns/ahoy_captain/comparable_queries.rb
427
+ - app/queries/concerns/ahoy_captain/comparable_query.rb
428
+ - app/queries/concerns/ahoy_captain/lazy_comparable_query.rb
379
429
  - app/views/ahoy_captain/campaigns/index.html+details.erb
380
430
  - app/views/ahoy_captain/campaigns/index.html.erb
381
431
  - app/views/ahoy_captain/cities/index.html+details.erb
382
432
  - app/views/ahoy_captain/cities/index.html.erb
383
433
  - app/views/ahoy_captain/countries/index.html+details.erb
384
434
  - app/views/ahoy_captain/countries/index.html.erb
435
+ - app/views/ahoy_captain/devices/_table.html.erb
385
436
  - app/views/ahoy_captain/devices/index.html+details.erb
386
437
  - app/views/ahoy_captain/devices/index.html.erb
387
438
  - app/views/ahoy_captain/entry_pages/index.html+details.erb
@@ -392,9 +443,13 @@ files:
392
443
  - app/views/ahoy_captain/funnels/show.html.erb
393
444
  - app/views/ahoy_captain/goals/index.html.erb
394
445
  - app/views/ahoy_captain/layouts/application.html.erb
446
+ - app/views/ahoy_captain/properties/_form.html.erb
447
+ - app/views/ahoy_captain/properties/index.html.erb
448
+ - app/views/ahoy_captain/properties/show.html.erb
395
449
  - app/views/ahoy_captain/realtimes/show.html.erb
396
450
  - app/views/ahoy_captain/regions/index.html+details.erb
397
451
  - app/views/ahoy_captain/regions/index.html.erb
452
+ - app/views/ahoy_captain/roots/_filters.html.erb
398
453
  - app/views/ahoy_captain/roots/show.html.erb
399
454
  - app/views/ahoy_captain/sources/index.html+details.erb
400
455
  - app/views/ahoy_captain/sources/index.html.erb
@@ -409,9 +464,13 @@ files:
409
464
  - lib/ahoy_captain/ahoy/visit_methods.rb
410
465
  - lib/ahoy_captain/configuration.rb
411
466
  - lib/ahoy_captain/engine.rb
467
+ - lib/ahoy_captain/filter_configuration/filter.rb
468
+ - lib/ahoy_captain/filter_configuration/filter_collection.rb
469
+ - lib/ahoy_captain/filters_configuration.rb
412
470
  - lib/ahoy_captain/funnels.rb
413
471
  - lib/ahoy_captain/goals.rb
414
472
  - lib/ahoy_captain/period_collection.rb
473
+ - lib/ahoy_captain/predicate_label.rb
415
474
  - lib/ahoy_captain/railtie.rb
416
475
  - lib/ahoy_captain/version.rb
417
476
  - lib/generators/ahoy_captain/install_generator.rb