rails_event_viewer 0.1.1 → 0.1.2
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/CHANGELOG.md +6 -0
- data/app/controllers/rails_event_viewer/application_controller.rb +3 -9
- data/app/controllers/rails_event_viewer/event_types_controller.rb +2 -2
- data/app/controllers/rails_event_viewer/events_controller.rb +2 -2
- data/app/controllers/rails_event_viewer/groups_controller.rb +2 -2
- data/app/helpers/rails_event_viewer/application_helper.rb +4 -0
- data/app/models/rails_event_viewer/page.rb +35 -0
- data/app/views/rails_event_viewer/event_types/show.html.erb +2 -2
- data/app/views/rails_event_viewer/events/index.html.erb +2 -2
- data/app/views/rails_event_viewer/groups/show.html.erb +1 -1
- data/app/views/rails_event_viewer/shared/_pagination.html.erb +13 -13
- data/lib/rails_event_viewer/version.rb +1 -1
- data/lib/rails_event_viewer.rb +0 -2
- metadata +2 -16
- data/lib/rails_event_viewer/pagy_countable.rb +0 -31
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ef30fa1ce21c1dc5c6eaa4634707801f2d32b67ab561231865cc67c0eb2c557f
|
|
4
|
+
data.tar.gz: 9a423c1745dfb3a088137fbe4c912c069a1e65ca68afc0e4d1dac2961819baac
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3b25d996bb14c0bada11737d07a98f93fbd10b8f4781ea3163b79185e31a2b6fe30a99b74e69f63e1d6e768a1fa137124bab9f3a47da07f5940466de1933e2ff
|
|
7
|
+
data.tar.gz: 828ddff25e0930d10bc34c75ee58e789f361f6dc14c3bf24c56b463e8b1327b454cf15ce7536f7d32969716f4c6db82bd9640c3bfcada4a8c9aed072132bc158
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.2 (2026-09-30)
|
|
4
|
+
|
|
5
|
+
- Removed the `pagy` dependency. Pagination is handled by a small built-in class, so host apps on any Pagy version, or none, can install the gem.
|
|
6
|
+
- Page links now keep the active filters, search query, and `per_page`. Previously every page link dropped them, so page 2 of a filtered list showed unfiltered results.
|
|
7
|
+
- A page number past the end now shows the last page instead of an empty one.
|
|
8
|
+
|
|
3
9
|
## 0.1.1 (2026-09-30)
|
|
4
10
|
|
|
5
11
|
- The dashboard now works under a strict Content Security Policy. Tailwind CSS is compiled into the gem, and Chart.js, its date adapter, and Chartkick are served from the host app with CSP nonces instead of from CDNs.
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
module RailsEventViewer
|
|
2
2
|
class ApplicationController < ActionController::Base
|
|
3
|
-
include Pagy::Method
|
|
4
|
-
|
|
5
3
|
layout "rails_event_viewer/application"
|
|
6
4
|
|
|
7
5
|
before_action :authenticate!
|
|
@@ -72,13 +70,9 @@ module RailsEventViewer
|
|
|
72
70
|
(params[:per_page] || RailsEventViewer.per_page).to_i.clamp(1, 100)
|
|
73
71
|
end
|
|
74
72
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
countable = RailsEventViewer::PagyCountable.new(relation)
|
|
79
|
-
pagy, records = pagy(:offset, countable, limit: per_page)
|
|
80
|
-
|
|
81
|
-
[pagy, records.to_a]
|
|
73
|
+
def paginate(relation)
|
|
74
|
+
pagination = Page.new(count: relation.count, per_page: per_page, page: params[:page])
|
|
75
|
+
[pagination, relation.offset(pagination.offset).limit(pagination.per_page).to_a]
|
|
82
76
|
end
|
|
83
77
|
end
|
|
84
78
|
end
|
|
@@ -8,8 +8,8 @@ module RailsEventViewer
|
|
|
8
8
|
@event_type_name = params[:name]
|
|
9
9
|
total_events = RailsEventViewer.events.with_name(@event_type_name)
|
|
10
10
|
|
|
11
|
-
@
|
|
12
|
-
@total_count = @
|
|
11
|
+
@pagination, @events = paginate(total_events)
|
|
12
|
+
@total_count = @pagination.count
|
|
13
13
|
@events_today = total_events.since(Time.current.beginning_of_day).count
|
|
14
14
|
end
|
|
15
15
|
end
|
|
@@ -2,7 +2,7 @@ module RailsEventViewer
|
|
|
2
2
|
class EventsController < ApplicationController
|
|
3
3
|
def index
|
|
4
4
|
relation = apply_filters(RailsEventViewer.events)
|
|
5
|
-
@
|
|
5
|
+
@pagination, @events = paginate(relation)
|
|
6
6
|
@event_names = current_adapter.distinct_event_names
|
|
7
7
|
end
|
|
8
8
|
|
|
@@ -20,7 +20,7 @@ module RailsEventViewer
|
|
|
20
20
|
def search
|
|
21
21
|
@query = params[:q]
|
|
22
22
|
relation = RailsEventViewer.events.search(@query)
|
|
23
|
-
@
|
|
23
|
+
@pagination, @events = paginate(relation)
|
|
24
24
|
@event_names = current_adapter.distinct_event_names
|
|
25
25
|
|
|
26
26
|
render :index
|
|
@@ -27,8 +27,8 @@ module RailsEventViewer
|
|
|
27
27
|
RailsEventViewer.events.with_context(@key, @value)
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
@
|
|
31
|
-
@total_count = @
|
|
30
|
+
@pagination, @events = paginate(events)
|
|
31
|
+
@total_count = @pagination.count
|
|
32
32
|
@event_names = @events.map { |e| event_name(e) }.uniq
|
|
33
33
|
|
|
34
34
|
@first_event_at, @last_event_at = current_adapter.event_time_span(events)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module RailsEventViewer
|
|
2
|
+
class Page
|
|
3
|
+
attr_reader :page, :per_page, :count
|
|
4
|
+
|
|
5
|
+
def initialize(count:, per_page:, page:)
|
|
6
|
+
@count = count
|
|
7
|
+
@per_page = per_page
|
|
8
|
+
@page = page.to_i.clamp(1, pages)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def pages
|
|
12
|
+
[(count.to_f / per_page).ceil, 1].max
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def offset
|
|
16
|
+
(page - 1) * per_page
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def from
|
|
20
|
+
count.zero? ? 0 : offset + 1
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def to
|
|
24
|
+
[offset + per_page, count].min
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def previous
|
|
28
|
+
page - 1 if page > 1
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def next
|
|
32
|
+
page + 1 if page < pages
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
icon: "calendar" %>
|
|
32
32
|
<%= render "rails_event_viewer/shared/stat_card",
|
|
33
33
|
title: "Page",
|
|
34
|
-
value: "#{@
|
|
34
|
+
value: "#{@pagination.page} of #{@pagination.pages}",
|
|
35
35
|
icon: "tag" %>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
</table>
|
|
93
93
|
</div>
|
|
94
94
|
|
|
95
|
-
<%= render "rails_event_viewer/shared/pagination",
|
|
95
|
+
<%= render "rails_event_viewer/shared/pagination", pagination: @pagination %>
|
|
96
96
|
<% else %>
|
|
97
97
|
<div class="px-6 py-12 text-center text-gray-500">
|
|
98
98
|
No events of this type yet.
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<% end %>
|
|
12
12
|
</h1>
|
|
13
13
|
<div class="text-sm text-gray-500">
|
|
14
|
-
<%= @
|
|
14
|
+
<%= @pagination.count %> total events
|
|
15
15
|
</div>
|
|
16
16
|
</div>
|
|
17
17
|
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
</table>
|
|
44
44
|
</div>
|
|
45
45
|
|
|
46
|
-
<%= render "rails_event_viewer/shared/pagination",
|
|
46
|
+
<%= render "rails_event_viewer/shared/pagination", pagination: @pagination %>
|
|
47
47
|
<% else %>
|
|
48
48
|
<div class="px-6 py-12 text-center text-gray-500">
|
|
49
49
|
<svg class="mx-auto h-12 w-12 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
</div>
|
|
125
125
|
</div>
|
|
126
126
|
|
|
127
|
-
<%= render "rails_event_viewer/shared/pagination",
|
|
127
|
+
<%= render "rails_event_viewer/shared/pagination", pagination: @pagination %>
|
|
128
128
|
<% else %>
|
|
129
129
|
<div class="px-6 py-12 text-center text-gray-500">
|
|
130
130
|
No events found in this group.
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
<% if
|
|
1
|
+
<% if pagination.pages > 1 %>
|
|
2
2
|
<div class="bg-white px-4 py-3 flex items-center justify-between border-t border-gray-200 sm:px-6">
|
|
3
3
|
<div class="flex-1 flex items-center justify-between">
|
|
4
4
|
<div>
|
|
5
5
|
<p class="text-sm text-gray-700">
|
|
6
6
|
Showing
|
|
7
|
-
<span class="font-medium"><%=
|
|
7
|
+
<span class="font-medium"><%= pagination.from %></span>
|
|
8
8
|
to
|
|
9
|
-
<span class="font-medium"><%=
|
|
9
|
+
<span class="font-medium"><%= pagination.to %></span>
|
|
10
10
|
of
|
|
11
|
-
<span class="font-medium"><%=
|
|
11
|
+
<span class="font-medium"><%= pagination.count %></span>
|
|
12
12
|
results
|
|
13
13
|
</p>
|
|
14
14
|
</div>
|
|
15
15
|
<nav class="flex items-center space-x-1" aria-label="Pagination">
|
|
16
|
-
<% if
|
|
17
|
-
<%= link_to
|
|
16
|
+
<% if pagination.previous %>
|
|
17
|
+
<%= link_to page_path(pagination.previous), class: "relative inline-flex items-center px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50" do %>
|
|
18
18
|
<svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
19
19
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
|
|
20
20
|
</svg>
|
|
@@ -29,18 +29,18 @@
|
|
|
29
29
|
</span>
|
|
30
30
|
<% end %>
|
|
31
31
|
|
|
32
|
-
<% (1..
|
|
33
|
-
<% if page_num ==
|
|
32
|
+
<% (1..pagination.pages).each do |page_num| %>
|
|
33
|
+
<% if page_num == pagination.page %>
|
|
34
34
|
<span class="relative inline-flex items-center px-3 py-2 text-sm font-medium text-white bg-indigo-600 border border-indigo-600 rounded-md"><%= page_num %></span>
|
|
35
|
-
<% elsif page_num == 1 || page_num ==
|
|
36
|
-
<%= link_to page_num,
|
|
37
|
-
<% elsif page_num ==
|
|
35
|
+
<% elsif page_num == 1 || page_num == pagination.pages || (page_num >= pagination.page - 2 && page_num <= pagination.page + 2) %>
|
|
36
|
+
<%= link_to page_num, page_path(page_num), class: "relative inline-flex items-center px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50" %>
|
|
37
|
+
<% elsif page_num == pagination.page - 3 || page_num == pagination.page + 3 %>
|
|
38
38
|
<span class="relative inline-flex items-center px-2 py-2 text-sm font-medium text-gray-700">...</span>
|
|
39
39
|
<% end %>
|
|
40
40
|
<% end %>
|
|
41
41
|
|
|
42
|
-
<% if
|
|
43
|
-
<%= link_to
|
|
42
|
+
<% if pagination.next %>
|
|
43
|
+
<%= link_to page_path(pagination.next), class: "relative inline-flex items-center px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50" do %>
|
|
44
44
|
<span class="mr-1">Next</span>
|
|
45
45
|
<svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
46
46
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
|
data/lib/rails_event_viewer.rb
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
require "pagy"
|
|
2
1
|
require "chartkick"
|
|
3
2
|
require "groupdate"
|
|
4
3
|
|
|
@@ -118,5 +117,4 @@ require "rails_event_viewer/adapter"
|
|
|
118
117
|
require "rails_event_viewer/events_relation"
|
|
119
118
|
require "rails_event_viewer/subscriber"
|
|
120
119
|
require "rails_event_viewer/json_query"
|
|
121
|
-
require "rails_event_viewer/pagy_countable"
|
|
122
120
|
require "rails_event_viewer/time_utils"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rails_event_viewer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Keshav Biswa
|
|
@@ -23,20 +23,6 @@ dependencies:
|
|
|
23
23
|
- - ">="
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
25
|
version: 8.1.0
|
|
26
|
-
- !ruby/object:Gem::Dependency
|
|
27
|
-
name: pagy
|
|
28
|
-
requirement: !ruby/object:Gem::Requirement
|
|
29
|
-
requirements:
|
|
30
|
-
- - ">="
|
|
31
|
-
- !ruby/object:Gem::Version
|
|
32
|
-
version: '43.0'
|
|
33
|
-
type: :runtime
|
|
34
|
-
prerelease: false
|
|
35
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
-
requirements:
|
|
37
|
-
- - ">="
|
|
38
|
-
- !ruby/object:Gem::Version
|
|
39
|
-
version: '43.0'
|
|
40
26
|
- !ruby/object:Gem::Dependency
|
|
41
27
|
name: chartkick
|
|
42
28
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -93,6 +79,7 @@ files:
|
|
|
93
79
|
- app/helpers/rails_event_viewer/application_helper.rb
|
|
94
80
|
- app/models/rails_event_viewer/application_record.rb
|
|
95
81
|
- app/models/rails_event_viewer/entry.rb
|
|
82
|
+
- app/models/rails_event_viewer/page.rb
|
|
96
83
|
- app/views/layouts/rails_event_viewer/application.html.erb
|
|
97
84
|
- app/views/rails_event_viewer/analytics/overview.html.erb
|
|
98
85
|
- app/views/rails_event_viewer/dashboard/index.html.erb
|
|
@@ -123,7 +110,6 @@ files:
|
|
|
123
110
|
- lib/rails_event_viewer/engine.rb
|
|
124
111
|
- lib/rails_event_viewer/events_relation.rb
|
|
125
112
|
- lib/rails_event_viewer/json_query.rb
|
|
126
|
-
- lib/rails_event_viewer/pagy_countable.rb
|
|
127
113
|
- lib/rails_event_viewer/subscriber.rb
|
|
128
114
|
- lib/rails_event_viewer/time_utils.rb
|
|
129
115
|
- lib/rails_event_viewer/version.rb
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
module RailsEventViewer
|
|
2
|
-
class PagyCountable
|
|
3
|
-
def initialize(relation)
|
|
4
|
-
@relation = relation
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
def count(*)
|
|
8
|
-
@relation.count
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def offset(value)
|
|
12
|
-
OffsetWrapper.new(@relation, value)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# Intermediate wrapper that captures offset and applies limit
|
|
16
|
-
class OffsetWrapper
|
|
17
|
-
def initialize(relation, offset_value)
|
|
18
|
-
@relation = relation
|
|
19
|
-
@offset_value = offset_value
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def limit(value)
|
|
23
|
-
@relation.offset(@offset_value).limit(value).to_a
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def to_a
|
|
27
|
-
@relation.offset(@offset_value).to_a
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|