Commit e989d07087aeebea20f643e5ef1ef7e8459e286a
1 parent
d384598e
Exists in
master
and in
1 other branch
Fix pagination to properly link to oldest notice
- closes #164 - Kaminari was dropping the ?notice=1 from the first page link. In the controller if notice is not passed in we were assuming the user wanted the latest notice instead of the first. - Originally the Errs#show page would default to displaying the last notice page since that was the most recent notice. We changed the controller to order notices by created_at so that the notice we want to view is on page 1. That way, we do not have to fight Kaminari. - Rename Previous and Next to Older and Newer to reflect user's intent.
Showing
8 changed files
with
53 additions
and
11 deletions
Show diff stats
app/controllers/errs_controller.rb
... | ... | @@ -29,9 +29,7 @@ class ErrsController < ApplicationController |
29 | 29 | end |
30 | 30 | |
31 | 31 | def show |
32 | - page = (params[:notice] || @problem.notices_count) | |
33 | - page = 1 if page.to_i.zero? | |
34 | - @notices = @problem.notices.page(page.to_i).per(1) | |
32 | + @notices = @problem.notices.reverse_ordered.page(params[:notice]).per(1) | |
35 | 33 | @notice = @notices.first |
36 | 34 | @comment = Comment.new |
37 | 35 | if request.headers['X-PJAX'] | ... | ... |
app/helpers/navigation_helper.rb
... | ... | @@ -34,4 +34,15 @@ module NavigationHelper |
34 | 34 | active |
35 | 35 | end |
36 | 36 | |
37 | + # Returns the page number in reverse order. | |
38 | + # Needed when reverse chronological paginating notices but | |
39 | + # want to display the actual chronological occurrence number. | |
40 | + # | |
41 | + # E.G. - Given 6 notices, page 2 shows the second from last | |
42 | + # occurrence indexed by 1, but it is diplaying the 5th ever | |
43 | + # occurence of that error. | |
44 | + def page_count_from_end(current_page, total_pages) | |
45 | + (total_pages.to_i - current_page.to_i) + 1 | |
46 | + end | |
47 | + | |
37 | 48 | end | ... | ... |
app/models/notice.rb
... | ... | @@ -30,6 +30,7 @@ class Notice |
30 | 30 | validates_presence_of :backtrace, :server_environment, :notifier |
31 | 31 | |
32 | 32 | scope :ordered, order_by(:created_at.asc) |
33 | + scope :reverse_ordered, order_by(:created_at.desc) | |
33 | 34 | scope :for_errs, lambda {|errs| where(:err_id.in => errs.all.map(&:id))} |
34 | 35 | |
35 | 36 | delegate :app, :problem, :to => :err | ... | ... |
app/views/kaminari/notices/_next_page.html.haml
1 | -~ link_to_unless current_page.last?, raw('Next →'), url, :class => "next_page", :rel => "next", :remote => remote do |name| | |
1 | +~ link_to_unless current_page.last?, raw('← Older'), url, :class => "next_page", :rel => "next", :remote => remote do |name| | |
2 | 2 | ~ content_tag :span, name, :class => 'next_page disabled' | ... | ... |
app/views/kaminari/notices/_paginator.html.haml
... | ... | @@ -7,7 +7,8 @@ |
7 | 7 | -# paginator: the paginator that renders the pagination tags inside |
8 | 8 | = paginator.render do |
9 | 9 | .notice-pagination< |
10 | - = prev_page_tag | |
11 | 10 | = next_page_tag |
11 | + | | |
12 | + = prev_page_tag | |
12 | 13 | .notice-pagination-loader= image_tag 'loader.gif' |
13 | -viewing occurrence #{current_page} of #{num_pages} | |
14 | +viewing occurrence #{page_count_from_end(current_page, num_pages)} of #{num_pages} | ... | ... |
app/views/kaminari/notices/_prev_page.html.haml
1 | -~ link_to_unless current_page.first?, raw('← Previous'), url, :class => "previous_page", :rel => "prev", :remote => remote do |name| | |
1 | +~ link_to_unless current_page.first?, raw('Newer →'), url, :class => "previous_page", :rel => "prev", :remote => remote do |name| | |
2 | 2 | ~ content_tag :span, name, :class => 'previous_page disabled' | ... | ... |
spec/controllers/errs_controller_spec.rb
... | ... | @@ -138,10 +138,6 @@ describe ErrsController do |
138 | 138 | describe "GET /apps/:app_id/errs/:id" do |
139 | 139 | render_views |
140 | 140 | |
141 | - before do | |
142 | - 3.times { Fabricate(:notice, :err => err)} | |
143 | - end | |
144 | - | |
145 | 141 | context 'when logged in as an admin' do |
146 | 142 | before do |
147 | 143 | sign_in Fabricate(:admin) |
... | ... | @@ -162,6 +158,26 @@ describe ErrsController do |
162 | 158 | response.should be_success |
163 | 159 | end |
164 | 160 | |
161 | + context 'pagination' do | |
162 | + let!(:notices) do | |
163 | + 3.times.reduce([]) do |coll, i| | |
164 | + coll << Fabricate(:notice, :err => err, :created_at => (Time.now + i)) | |
165 | + end | |
166 | + end | |
167 | + | |
168 | + it "paginates the notices 1 at a time, starting with the most recent" do | |
169 | + get :show, :app_id => app.id, :id => err.problem.id | |
170 | + assigns(:notices).entries.count.should == 1 | |
171 | + assigns(:notices).should include(notices.last) | |
172 | + end | |
173 | + | |
174 | + it "paginates the notices 1 at a time, based on then notice param" do | |
175 | + get :show, :app_id => app.id, :id => err.problem.id, :notice => 3 | |
176 | + assigns(:notices).entries.count.should == 1 | |
177 | + assigns(:notices).should include(notices.first) | |
178 | + end | |
179 | + end | |
180 | + | |
165 | 181 | context "create issue button" do |
166 | 182 | let(:button_matcher) { match(/create issue/) } |
167 | 183 | ... | ... |
... | ... | @@ -0,0 +1,15 @@ |
1 | +require 'spec_helper' | |
2 | + | |
3 | +describe NavigationHelper do | |
4 | + describe '#page_count_from_end' do | |
5 | + it 'returns the page number when counting from the last occurrence of a notice' do | |
6 | + page_count_from_end(1, 6).should == 6 | |
7 | + page_count_from_end(6, 6).should == 1 | |
8 | + page_count_from_end(2, 6).should == 5 | |
9 | + end | |
10 | + | |
11 | + it 'properly handles strings for input' do | |
12 | + page_count_from_end('2', '6').should == 5 | |
13 | + end | |
14 | + end | |
15 | +end | ... | ... |