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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 752061254efb5dd9bb402c098fd0b53241f5919f312650510213b36046792884
4
- data.tar.gz: 131edfa9428def3ae0da02c9f622162ee52a0de11a263a3c7ff7ba86249481af
3
+ metadata.gz: ef30fa1ce21c1dc5c6eaa4634707801f2d32b67ab561231865cc67c0eb2c557f
4
+ data.tar.gz: 9a423c1745dfb3a088137fbe4c912c069a1e65ca68afc0e4d1dac2961819baac
5
5
  SHA512:
6
- metadata.gz: 6f6945accdea24afb5c058910e690fbbd152c32bb70cc74655a1eefd6a7d176f819621962d0709327f2b723f74e5a544e2889b5fec82d294da516e694a6d3178
7
- data.tar.gz: cbf5155e5905e351f368254188a71a93c9bf54f28cd358bc2c72c9173ff825aa9cc416e99983e3b1ed541c536276808c1abc5a705714bc3a619ed64e08e6f083
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
- # Helper to create paginated results from EventsRelation
76
- # Uses a countable wrapper to make EventsRelation work with Pagy
77
- def pagy_events(relation)
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
- @pagy, @events = pagy_events(total_events)
12
- @total_count = @pagy.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
- @pagy, @events = pagy_events(relation)
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
- @pagy, @events = pagy_events(relation)
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
- @pagy, @events = pagy_events(events)
31
- @total_count = @pagy.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)
@@ -41,6 +41,10 @@ module RailsEventViewer
41
41
  end
42
42
  end
43
43
 
44
+ def page_path(page)
45
+ "#{request.path}?#{request.query_parameters.merge("page" => page.to_s).to_query}"
46
+ end
47
+
44
48
  def timezone_options
45
49
  ActiveSupport::TimeZone.all.map { |tz| [tz.to_s, tz.name] }
46
50
  end
@@ -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: "#{@pagy.page} of #{@pagy.pages}",
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", pagy: @pagy %>
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
- <%= @pagy.count %> total events
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", pagy: @pagy %>
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", pagy: @pagy %>
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 pagy.pages > 1 %>
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"><%= pagy.from %></span>
7
+ <span class="font-medium"><%= pagination.from %></span>
8
8
  to
9
- <span class="font-medium"><%= pagy.to %></span>
9
+ <span class="font-medium"><%= pagination.to %></span>
10
10
  of
11
- <span class="font-medium"><%= pagy.count %></span>
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 pagy.previous %>
17
- <%= link_to url_for(page: pagy.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 %>
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..pagy.pages).each do |page_num| %>
33
- <% if page_num == pagy.page %>
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 == pagy.pages || (page_num >= pagy.page - 2 && page_num <= pagy.page + 2) %>
36
- <%= link_to page_num, url_for(page: 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 == pagy.page - 3 || page_num == pagy.page + 3 %>
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 pagy.next %>
43
- <%= link_to url_for(page: pagy.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 %>
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" />
@@ -1,3 +1,3 @@
1
1
  module RailsEventViewer
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -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.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