ahoy_captain 0.11.0 → 0.11.1
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/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
|