Adds pagination to forum messages (#4664).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3373 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
2ad8242ae7
commit
8fb29d4d21
|
@ -29,10 +29,24 @@ class MessagesController < ApplicationController
|
||||||
helper :attachments
|
helper :attachments
|
||||||
include AttachmentsHelper
|
include AttachmentsHelper
|
||||||
|
|
||||||
|
REPLIES_PER_PAGE = 25 unless const_defined?(:REPLIES_PER_PAGE)
|
||||||
|
|
||||||
# Show a topic and its replies
|
# Show a topic and its replies
|
||||||
def show
|
def show
|
||||||
@replies = @topic.children.find(:all, :include => [:author, :attachments, {:board => :project}])
|
page = params[:page]
|
||||||
@replies.reverse! if User.current.wants_comments_in_reverse_order?
|
# Find the page of the requested reply
|
||||||
|
if params[:r] && page.nil?
|
||||||
|
offset = @topic.children.count(:conditions => ["#{Message.table_name}.id < ?", params[:r].to_i])
|
||||||
|
page = 1 + offset / REPLIES_PER_PAGE
|
||||||
|
end
|
||||||
|
|
||||||
|
@reply_count = @topic.children.count
|
||||||
|
@reply_pages = Paginator.new self, @reply_count, REPLIES_PER_PAGE, page
|
||||||
|
@replies = @topic.children.find(:all, :include => [:author, :attachments, {:board => :project}],
|
||||||
|
:order => "#{Message.table_name}.created_on ASC",
|
||||||
|
:limit => @reply_pages.items_per_page,
|
||||||
|
:offset => @reply_pages.current.offset)
|
||||||
|
|
||||||
@reply = Message.new(:subject => "RE: #{@message.subject}")
|
@reply = Message.new(:subject => "RE: #{@message.subject}")
|
||||||
render :action => "show", :layout => false if request.xhr?
|
render :action => "show", :layout => false if request.xhr?
|
||||||
end
|
end
|
||||||
|
@ -63,7 +77,7 @@ class MessagesController < ApplicationController
|
||||||
call_hook(:controller_messages_reply_after_save, { :params => params, :message => @reply})
|
call_hook(:controller_messages_reply_after_save, { :params => params, :message => @reply})
|
||||||
attach_files(@reply, params[:attachments])
|
attach_files(@reply, params[:attachments])
|
||||||
end
|
end
|
||||||
redirect_to :action => 'show', :id => @topic
|
redirect_to :action => 'show', :id => @topic, :r => @reply
|
||||||
end
|
end
|
||||||
|
|
||||||
# Edit a message
|
# Edit a message
|
||||||
|
@ -77,7 +91,7 @@ class MessagesController < ApplicationController
|
||||||
attach_files(@message, params[:attachments])
|
attach_files(@message, params[:attachments])
|
||||||
flash[:notice] = l(:notice_successful_update)
|
flash[:notice] = l(:notice_successful_update)
|
||||||
@message.reload
|
@message.reload
|
||||||
redirect_to :action => 'show', :board_id => @message.board, :id => @message.root
|
redirect_to :action => 'show', :board_id => @message.board, :id => @message.root, :r => (@message.parent_id && @message.id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -87,7 +101,7 @@ class MessagesController < ApplicationController
|
||||||
@message.destroy
|
@message.destroy
|
||||||
redirect_to @message.parent.nil? ?
|
redirect_to @message.parent.nil? ?
|
||||||
{ :controller => 'boards', :action => 'show', :project_id => @project, :id => @board } :
|
{ :controller => 'boards', :action => 'show', :project_id => @project, :id => @board } :
|
||||||
{ :action => 'show', :id => @message.parent }
|
{ :action => 'show', :id => @message.parent, :r => @message }
|
||||||
end
|
end
|
||||||
|
|
||||||
def quote
|
def quote
|
||||||
|
|
|
@ -289,6 +289,7 @@ module ApplicationHelper
|
||||||
|
|
||||||
def pagination_links_full(paginator, count=nil, options={})
|
def pagination_links_full(paginator, count=nil, options={})
|
||||||
page_param = options.delete(:page_param) || :page
|
page_param = options.delete(:page_param) || :page
|
||||||
|
per_page_links = options.delete(:per_page_links)
|
||||||
url_param = params.dup
|
url_param = params.dup
|
||||||
# don't reuse query params if filters are present
|
# don't reuse query params if filters are present
|
||||||
url_param.merge!(:fields => nil, :values => nil, :operators => nil) if url_param.delete(:set_filter)
|
url_param.merge!(:fields => nil, :values => nil, :operators => nil) if url_param.delete(:set_filter)
|
||||||
|
@ -307,10 +308,10 @@ module ApplicationHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
unless count.nil?
|
unless count.nil?
|
||||||
html << [
|
html << " (#{paginator.current.first_item}-#{paginator.current.last_item}/#{count})"
|
||||||
" (#{paginator.current.first_item}-#{paginator.current.last_item}/#{count})",
|
if per_page_links != false && links = per_page_links(paginator.items_per_page)
|
||||||
per_page_links(paginator.items_per_page)
|
html << " | #{links}"
|
||||||
].compact.join(' | ')
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
html
|
html
|
||||||
|
|
|
@ -23,6 +23,7 @@ module MessagesHelper
|
||||||
:action => 'show',
|
:action => 'show',
|
||||||
:board_id => message.board_id,
|
:board_id => message.board_id,
|
||||||
:id => message.root,
|
:id => message.root,
|
||||||
|
:r => (message.parent_id && message.id),
|
||||||
:anchor => (message.parent_id ? "message-#{message.id}" : nil)
|
:anchor => (message.parent_id ? "message-#{message.id}" : nil)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -30,7 +30,7 @@ class Message < ActiveRecord::Base
|
||||||
:description => :content,
|
:description => :content,
|
||||||
:type => Proc.new {|o| o.parent_id.nil? ? 'message' : 'reply'},
|
:type => Proc.new {|o| o.parent_id.nil? ? 'message' : 'reply'},
|
||||||
:url => Proc.new {|o| {:controller => 'messages', :action => 'show', :board_id => o.board_id}.merge(o.parent_id.nil? ? {:id => o.id} :
|
:url => Proc.new {|o| {:controller => 'messages', :action => 'show', :board_id => o.board_id}.merge(o.parent_id.nil? ? {:id => o.id} :
|
||||||
{:id => o.parent_id, :anchor => "message-#{o.id}"})}
|
{:id => o.parent_id, :r => o.id, :anchor => "message-#{o.id}"})}
|
||||||
|
|
||||||
acts_as_activity_provider :find_options => {:include => [{:board => :project}, :author]},
|
acts_as_activity_provider :find_options => {:include => [{:board => :project}, :author]},
|
||||||
:author_key => :author_id
|
:author_key => :author_id
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<% unless @replies.empty? %>
|
<% unless @replies.empty? %>
|
||||||
<h3 class="comments"><%= l(:label_reply_plural) %></h3>
|
<h3 class="comments"><%= l(:label_reply_plural) %> (<%= @reply_count %>)</h3>
|
||||||
<% @replies.each do |message| %>
|
<% @replies.each do |message| %>
|
||||||
<div class="message reply" id="<%= "message-#{message.id}" %>">
|
<div class="message reply" id="<%= "message-#{message.id}" %>">
|
||||||
<div class="contextual">
|
<div class="contextual">
|
||||||
|
@ -38,6 +38,7 @@
|
||||||
<%= link_to_attachments message, :author => false %>
|
<%= link_to_attachments message, :author => false %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<p class="pagination"><%= pagination_links_full @reply_pages, @reply_count, :per_page_links => false %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% if !@topic.locked? && authorize_for('messages', 'reply') %>
|
<% if !@topic.locked? && authorize_for('messages', 'reply') %>
|
||||||
|
|
|
@ -47,6 +47,22 @@ class MessagesControllerTest < ActionController::TestCase
|
||||||
assert_not_nil assigns(:topic)
|
assert_not_nil assigns(:topic)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_show_with_pagination
|
||||||
|
message = Message.find(1)
|
||||||
|
assert_difference 'Message.count', 30 do
|
||||||
|
30.times do
|
||||||
|
message.children << Message.new(:subject => 'Reply', :content => 'Reply body', :author_id => 2, :board_id => 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
get :show, :board_id => 1, :id => 1, :r => message.children.last(:order => 'id').id
|
||||||
|
assert_response :success
|
||||||
|
assert_template 'show'
|
||||||
|
replies = assigns(:replies)
|
||||||
|
assert_not_nil replies
|
||||||
|
assert !replies.include?(message.children.first(:order => 'id'))
|
||||||
|
assert replies.include?(message.children.last(:order => 'id'))
|
||||||
|
end
|
||||||
|
|
||||||
def test_show_with_reply_permission
|
def test_show_with_reply_permission
|
||||||
@request.session[:user_id] = 2
|
@request.session[:user_id] = 2
|
||||||
get :show, :board_id => 1, :id => 1
|
get :show, :board_id => 1, :id => 1
|
||||||
|
@ -143,7 +159,8 @@ class MessagesControllerTest < ActionController::TestCase
|
||||||
def test_reply
|
def test_reply
|
||||||
@request.session[:user_id] = 2
|
@request.session[:user_id] = 2
|
||||||
post :reply, :board_id => 1, :id => 1, :reply => { :content => 'This is a test reply', :subject => 'Test reply' }
|
post :reply, :board_id => 1, :id => 1, :reply => { :content => 'This is a test reply', :subject => 'Test reply' }
|
||||||
assert_redirected_to 'boards/1/topics/1'
|
reply = Message.find(:first, :order => 'id DESC')
|
||||||
|
assert_redirected_to "boards/1/topics/1?r=#{reply.id}"
|
||||||
assert Message.find_by_subject('Test reply')
|
assert Message.find_by_subject('Test reply')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue