ahoy_captain 0.11.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascript/ahoy_captain/controllers/tile_controller.js +25 -1
- data/app/components/ahoy_captain/comparison_link_component.html.erb +17 -0
- data/app/components/ahoy_captain/comparison_link_component.rb +10 -6
- data/app/models/ahoy_captain/range_from_params.rb +0 -1
- data/app/views/ahoy_captain/layouts/shared/_tile_loader.html.erb +12 -0
- data/app/views/ahoy_captain/roots/show.html.erb +54 -14
- data/app/views/ahoy_captain/stats/show.html.erb +2 -2
- data/lib/ahoy_captain/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 550735e026fe60170552c09149ee5dceb1d874020c131f49c9a79a6d1c04982f
|
|
4
|
+
data.tar.gz: 9a782cddeb96ba6726980ae8f0c5b332f51756b8114b88dc63af91a2739776ea
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 021c101c8ff731e860b85baab37836fdb9f1dc5a038c90cd5411b9f0e628b8918823fdc7446164620414bce1a20560a7284dd6d63753ad4ab6c1f1541aed17d8
|
|
7
|
+
data.tar.gz: b0a5fc48678367faa56299f2462b92edf3331adc4df3f0cc685b68584cfea4604d76437528007ce27e5c3173312945d514e2399a65efad1d4b473e2a134b6690
|
|
@@ -2,8 +2,32 @@ import { Controller } from '@hotwired/stimulus';
|
|
|
2
2
|
|
|
3
3
|
export default class extends Controller {
|
|
4
4
|
static targets = ["title"]
|
|
5
|
+
connect() {
|
|
6
|
+
this.frame = this.element.querySelector('turbo-frame');
|
|
7
|
+
const targetNode = this.frame;
|
|
8
|
+
const config = { attributes: true };
|
|
9
|
+
|
|
10
|
+
const callback = (mutationList, observer) => {
|
|
11
|
+
for (const mutation of mutationList) {
|
|
12
|
+
if (mutation.type === "attributes") {
|
|
13
|
+
this.handleFrameLoad(mutation.attributeName)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const observer = new MutationObserver(callback);
|
|
19
|
+
observer.observe(targetNode, config);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
handleFrameLoad(status) {
|
|
23
|
+
if(!this.frame.hasAttribute('skeleton')) {
|
|
24
|
+
if(status === 'busy') {
|
|
25
|
+
this.frame.innerHTML = document.querySelector('#tile-loader-template').innerHTML;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
5
30
|
setTitle(event) {
|
|
6
31
|
this.titleTarget.innerHTML = event.target.title || event.target.text
|
|
7
32
|
}
|
|
8
|
-
|
|
9
33
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<div class="dropdown dropdown-end" data-controller='dropdown-label'>
|
|
2
|
+
<label
|
|
3
|
+
tabindex="0"
|
|
4
|
+
class="cursor-pointer flex <%= classes %>"
|
|
5
|
+
data-action='click->dropdown-label#removeHidden'
|
|
6
|
+
>
|
|
7
|
+
<span data-dropdown-label-target="label"><%= title %></span>
|
|
8
|
+
|
|
9
|
+
</label>
|
|
10
|
+
<ul class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52" data-dropdown-label-target="close">
|
|
11
|
+
<% links.each do |link| %>
|
|
12
|
+
<li data-action="click->dropdown-label#setLabel">
|
|
13
|
+
<%= link %>
|
|
14
|
+
<li>
|
|
15
|
+
<% end %>
|
|
16
|
+
</ul>
|
|
17
|
+
</div>
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
class AhoyCaptain::ComparisonLinkComponent <
|
|
3
|
+
class AhoyCaptain::ComparisonLinkComponent < ViewComponent::Base
|
|
4
4
|
include ::AhoyCaptain::CompareMode
|
|
5
5
|
include ::AhoyCaptain::RangeOptions
|
|
6
6
|
include ::AhoyCaptain::Rangeable
|
|
7
7
|
|
|
8
|
+
renders_many :links
|
|
9
|
+
renders_one :header
|
|
10
|
+
|
|
11
|
+
attr_reader :title, :classes
|
|
8
12
|
def initialize(title: "", classes: "btn btn-sm btn-base-100 no-underline hover:bg-base-100")
|
|
9
13
|
@classes = classes
|
|
10
14
|
end
|
|
11
15
|
|
|
12
16
|
# cheating
|
|
13
17
|
def title
|
|
14
|
-
self.
|
|
18
|
+
self.with_link_content(options_for_option)
|
|
15
19
|
|
|
16
20
|
comparison_mode.label
|
|
17
21
|
end
|
|
@@ -22,12 +26,12 @@ class AhoyCaptain::ComparisonLinkComponent < AhoyCaptain::DropdownLinkComponent
|
|
|
22
26
|
|
|
23
27
|
def options_for_option
|
|
24
28
|
[
|
|
25
|
-
(link_to "Disable Comparison", AhoyCaptain::Engine.routes.url_helpers.root_path(**helpers.search_params.merge(comparison: false))),
|
|
26
|
-
(link_to "Previous period", AhoyCaptain::Engine.routes.url_helpers.root_path(**helpers.search_params.merge(comparison: :previous)), class: selected(:previous, :true)),
|
|
27
|
-
(link_to "Year-over-year", AhoyCaptain::Engine.routes.url_helpers.root_path(**helpers.search_params.merge(comparison: :year)), class: selected(:year)),
|
|
28
29
|
(link_to "Custom period", "javascript:customComparisonModal.showModal()", class: selected(:custom)),
|
|
30
|
+
(link_to "Year-over-year", AhoyCaptain::Engine.routes.url_helpers.root_path(**helpers.search_params.merge(comparison: :year)), class: selected(:year)),
|
|
31
|
+
(link_to "Previous period", AhoyCaptain::Engine.routes.url_helpers.root_path(**helpers.search_params.merge(comparison: :previous)), class: selected(:previous, :true)),
|
|
32
|
+
(link_to "Disable Comparison", AhoyCaptain::Engine.routes.url_helpers.root_path(**helpers.search_params.merge(comparison: false))),
|
|
29
33
|
|
|
30
|
-
].join.html_safe
|
|
34
|
+
].reverse.join.html_safe
|
|
31
35
|
end
|
|
32
36
|
|
|
33
37
|
private
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
module AhoyCaptain
|
|
2
2
|
class RangeFromParams
|
|
3
3
|
def self.from_params(params)
|
|
4
|
-
|
|
5
4
|
compare = ComparisonMode.new(params)
|
|
6
5
|
new(period: params[:period], start_date: params[:start_date], end_date: params[:end_date], date: params[:date], comparison: compare.enabled?(false), raw: params).tap { |instance| instance.build }
|
|
7
6
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<div class="mt-5" >
|
|
2
|
+
<div role="status" class="animate-pulse">
|
|
3
|
+
<div class="flex justify-between w-full mb-2">
|
|
4
|
+
<div class="h-2.5 bg-gray-200 rounded-full dark:bg-gray-700 w-32"></div>
|
|
5
|
+
<div class="h-2.5 bg-gray-300 rounded-full dark:bg-gray-600 w-24"></div>
|
|
6
|
+
</div>
|
|
7
|
+
<% 10.times do |i| %>
|
|
8
|
+
<div class="h-6 bg-gray-200 dark:bg-gray-700 max-w-[<%= 100 - (i * 10) %>%] mb-2.5"></div>
|
|
9
|
+
<% end %>
|
|
10
|
+
<span class="sr-only">Loading...</span>
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
<main class='w-screen overflow-hidden' data-action="combobox:init@window->application#comboboxInit">
|
|
2
|
+
<script id="tile-loader-template" type="template/html">
|
|
3
|
+
<%= render '/ahoy_captain/layouts/shared/tile_loader' %>
|
|
4
|
+
</script>
|
|
2
5
|
<%= render AhoyCaptain::StickyNavComponent.new do |nav| %>
|
|
3
6
|
<% nav.with_realtime_update do %>
|
|
4
7
|
<%= turbo_frame_tag :realtime, src: realtime_path, data: { controller: "realtime", "realtime-interval-value" => AhoyCaptain.config.realtime_interval.to_i }, loading: :lazy %>
|
|
@@ -8,8 +11,32 @@
|
|
|
8
11
|
<div class="grid grid-cols-1 lg:grid-cols-2 grid-flow-row gap-4 min-h-screen pb-4 max-w-6xl mx-auto">
|
|
9
12
|
<%= render AhoyCaptain::TileComponent.new(wide: true, classes: "p-4 m-2") do |component| %>
|
|
10
13
|
<% component.with_statistic_display do %>
|
|
11
|
-
<%= turbo_frame_tag :stats, src: stats_path(search_params), loading: :lazy %>
|
|
14
|
+
<%= turbo_frame_tag :stats, src: stats_path(search_params), loading: :lazy, skeleton: false do %>
|
|
15
|
+
<div class="grid grid-cols-1 divide-y divide-base-200 overflow-hidden rounded-lg grid-cols-2 md:grid-cols-6 md:divide-y-0">
|
|
16
|
+
<% 6.times do %>
|
|
17
|
+
<div class="relative px-4 md:px-6 w-1/2 my-4 w-auto group cursor-pointer" >
|
|
18
|
+
<div role="status" class="max-w-sm animate-pulse">
|
|
19
|
+
<div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[120px] mb-2.5"></div>
|
|
20
|
+
<div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 mb-2.5 max-w-[60px]"></div>
|
|
21
|
+
<span class="sr-only">Loading...</span>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
<% end %>
|
|
25
|
+
</div>
|
|
26
|
+
<% end %>
|
|
12
27
|
<%= turbo_frame_tag :chart, src: stats_unique_visitors_path(search_params) do %>
|
|
28
|
+
<div role="status" class="p-4 animate-pulse md:p-6">
|
|
29
|
+
<div class="flex items-baseline mt-4 space-x-6">
|
|
30
|
+
<div class="w-full bg-gray-200 rounded-t-lg h-72 dark:bg-gray-700"></div>
|
|
31
|
+
<div class="w-full h-56 bg-gray-200 rounded-t-lg dark:bg-gray-700"></div>
|
|
32
|
+
<div class="w-full bg-gray-200 rounded-t-lg h-72 dark:bg-gray-700"></div>
|
|
33
|
+
<div class="w-full h-64 bg-gray-200 rounded-t-lg dark:bg-gray-700"></div>
|
|
34
|
+
<div class="w-full bg-gray-200 rounded-t-lg h-80 dark:bg-gray-700"></div>
|
|
35
|
+
<div class="w-full bg-gray-200 rounded-t-lg h-72 dark:bg-gray-700"></div>
|
|
36
|
+
<div class="w-full bg-gray-200 rounded-t-lg h-80 dark:bg-gray-700"></div>
|
|
37
|
+
</div>
|
|
38
|
+
<span class="sr-only">Loading...</span>
|
|
39
|
+
</div>
|
|
13
40
|
<% end %>
|
|
14
41
|
<% end %>
|
|
15
42
|
|
|
@@ -17,21 +44,23 @@
|
|
|
17
44
|
|
|
18
45
|
<%= render AhoyCaptain::TileComponent.new(title: 'Top Sources') do |component| %>
|
|
19
46
|
<% component.with_display_links do %>
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
<% end %>
|
|
47
|
+
<div class="flex text-xs font-medium text-gray-400 space-x-2">
|
|
48
|
+
<div class="relative inline-block text-left">
|
|
49
|
+
<%= component.link_to "All", sources_path(search_params), data: { turbo_frame: "sources" } %>
|
|
50
|
+
<%= render AhoyCaptain::DropdownLinkComponent.new(title: "Campaign") do |dropdown| %>
|
|
51
|
+
<% %w{utm_source utm_medium utm_term utm_content utm_campaign}.each do |source| %>
|
|
52
|
+
<%= dropdown.link_to source.titleize.gsub("Utm", "UTM"), public_send("campaign_#{source}_path".to_sym, **search_params), data: { turbo_frame: "sources" } %>
|
|
27
53
|
<% end %>
|
|
28
|
-
|
|
54
|
+
<% end %>
|
|
29
55
|
</div>
|
|
56
|
+
</div>
|
|
30
57
|
|
|
31
58
|
|
|
32
59
|
<% end %>
|
|
33
60
|
<% component.with_statistic_display do %>
|
|
34
|
-
<%= turbo_frame_tag :sources, src: sources_path(search_params), loading: :lazy %>
|
|
61
|
+
<%= turbo_frame_tag :sources, src: sources_path(search_params), loading: :lazy do %>
|
|
62
|
+
<%= render '/ahoy_captain/layouts/shared/tile_loader' %>
|
|
63
|
+
<% end %>
|
|
35
64
|
<% end %>
|
|
36
65
|
<% component.with_details_cta do %>
|
|
37
66
|
<button data-action="click->details-modal#openModal" data-controller="details-modal" data-details-modal-target-value="#sources" class="link no-underline ">Details</button>
|
|
@@ -51,7 +80,9 @@
|
|
|
51
80
|
|
|
52
81
|
<% end %>
|
|
53
82
|
<% component.with_statistic_display do %>
|
|
54
|
-
<%= turbo_frame_tag :pages, src: top_pages_path(search_params), loading: :lazy %>
|
|
83
|
+
<%= turbo_frame_tag :pages, src: top_pages_path(search_params), loading: :lazy do %>
|
|
84
|
+
<%= render '/ahoy_captain/layouts/shared/tile_loader' %>
|
|
85
|
+
<% end %>
|
|
55
86
|
<% end %>
|
|
56
87
|
<% component.with_details_cta do %>
|
|
57
88
|
<button data-action="click->details-modal#openModal" data-controller="details-modal" data-details-modal-target-value="#pages" class="link no-underline ">Details</button>
|
|
@@ -70,7 +101,10 @@
|
|
|
70
101
|
</div>
|
|
71
102
|
<% end %>
|
|
72
103
|
<% component.with_statistic_display do %>
|
|
73
|
-
<%= turbo_frame_tag :geography, src: locations_map_path(search_params), loading: :lazy %>
|
|
104
|
+
<%= turbo_frame_tag :geography, src: locations_map_path(search_params), loading: :lazy do %>
|
|
105
|
+
<%= render '/ahoy_captain/layouts/shared/tile_loader' %>
|
|
106
|
+
|
|
107
|
+
<% end %>
|
|
74
108
|
<% end %>
|
|
75
109
|
<% component.with_details_cta do %>
|
|
76
110
|
<button data-action="click->details-modal#openModal" data-controller="details-modal" data-details-modal-target-value="#geography" class="link no-underline ">Details</button>
|
|
@@ -88,7 +122,10 @@
|
|
|
88
122
|
</div>
|
|
89
123
|
<% end %>
|
|
90
124
|
<% component.with_statistic_display do %>
|
|
91
|
-
<%= turbo_frame_tag :devices, src: devices_browsers_path(search_params), loading: :lazy %>
|
|
125
|
+
<%= turbo_frame_tag :devices, src: devices_browsers_path(search_params), loading: :lazy do %>
|
|
126
|
+
<%= render '/ahoy_captain/layouts/shared/tile_loader' %>
|
|
127
|
+
|
|
128
|
+
<% end %>
|
|
92
129
|
<% end %>
|
|
93
130
|
<% component.with_details_cta do %>
|
|
94
131
|
<button data-action="click->details-modal#openModal" data-controller="details-modal" data-details-modal-target-value="#devices" class="link no-underline ">Details</button>
|
|
@@ -119,7 +156,10 @@
|
|
|
119
156
|
<% end %>
|
|
120
157
|
<% component.with_statistic_display do %>
|
|
121
158
|
<div class="p-4">
|
|
122
|
-
<%= turbo_frame_tag :goals, src: goals_path(search_params), loading: :lazy %>
|
|
159
|
+
<%= turbo_frame_tag :goals, src: goals_path(search_params), loading: :lazy do %>
|
|
160
|
+
<%= render '/ahoy_captain/layouts/shared/tile_loader' %>
|
|
161
|
+
<% end %>
|
|
162
|
+
|
|
123
163
|
</div>
|
|
124
164
|
<% end %>
|
|
125
165
|
<% end %>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<%= turbo_frame_tag :stats, data: { controller: "active-frame-link" } do %>
|
|
2
|
-
<
|
|
2
|
+
<div class="grid grid-cols-1 divide-y divide-base-200 overflow-hidden rounded-lg grid-cols-2 md:grid-cols-6 md:divide-y-0" data-controller="active-links" data-active-links-classes-value='["text-primary"]'>
|
|
3
3
|
<% if @presenter.send(:range).realtime? %>
|
|
4
4
|
<%= render stats_container(@presenter.unique_visitors, stats_unique_visitors_url(search_params), "Unique Visits (30 min)", :number_with_delimiter, true) %>
|
|
5
5
|
<%= render stats_container(@presenter.total_pageviews, stats_total_pageviews_path(search_params), "Total Pageviews (30 min)", :number_with_delimiter) %>
|
|
@@ -11,5 +11,5 @@
|
|
|
11
11
|
<%= render stats_container(@presenter.bounce_rate, stats_bounce_rates_path(search_params), "Bounce Rate", :number_with_delimiter) %>
|
|
12
12
|
<%= render stats_container(@presenter.visit_duration, stats_visit_durations_url(search_params), "Visit Duration", :number_to_duration) %>
|
|
13
13
|
<% end %>
|
|
14
|
-
</
|
|
14
|
+
</div>
|
|
15
15
|
<% end %>
|
data/lib/ahoy_captain/version.rb
CHANGED
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.11.
|
|
4
|
+
version: 0.11.1
|
|
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-09-04 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -388,6 +388,7 @@ files:
|
|
|
388
388
|
- app/assets/manifest/ahoy_captain/manifest.js
|
|
389
389
|
- app/components/ahoy_captain/combobox_component.html.erb
|
|
390
390
|
- app/components/ahoy_captain/combobox_component.rb
|
|
391
|
+
- app/components/ahoy_captain/comparison_link_component.html.erb
|
|
391
392
|
- app/components/ahoy_captain/comparison_link_component.rb
|
|
392
393
|
- app/components/ahoy_captain/dropdown_button_component.html.erb
|
|
393
394
|
- app/components/ahoy_captain/dropdown_button_component.rb
|
|
@@ -528,6 +529,7 @@ files:
|
|
|
528
529
|
- app/views/ahoy_captain/funnels/show.html.erb
|
|
529
530
|
- app/views/ahoy_captain/goals/index.html.erb
|
|
530
531
|
- app/views/ahoy_captain/layouts/application.html.erb
|
|
532
|
+
- app/views/ahoy_captain/layouts/shared/_tile_loader.html.erb
|
|
531
533
|
- app/views/ahoy_captain/locations/cities/index.html+details.erb
|
|
532
534
|
- app/views/ahoy_captain/locations/cities/index.html.erb
|
|
533
535
|
- app/views/ahoy_captain/locations/countries/index.html+details.erb
|