From c32f6dd4fffe1d2b5fc34f42e447e7b5c8fc5b92 Mon Sep 17 00:00:00 2001 From: nertc Date: Mon, 19 Aug 2024 22:09:06 +0400 Subject: [PATCH] Add pagination to Issues page --- app/controllers/issues_controller.rb | 8 ++++++- app/views/issues/_page.html.erb | 34 ++++++++++++++++++++++++++++ app/views/issues/index.html.erb | 30 +----------------------- config/locales/en.yml | 10 +++++++- test/system/issues_test.rb | 32 ++++++++++++++++++++++++-- 5 files changed, 81 insertions(+), 33 deletions(-) create mode 100644 app/views/issues/_page.html.erb diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index c24054f77..1baf533f4 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -1,4 +1,6 @@ class IssuesController < ApplicationController + include PaginationMethods + layout "site" before_action :authorize_web @@ -11,6 +13,8 @@ class IssuesController < ApplicationController before_action :check_database_writable, :only => [:resolve, :ignore, :reopen] def index + @params = params.permit(:before, :after, :limit, :status, :search_by_user, :issue_type, :last_updated_by) + @params[:limit] ||= 50 @title = t ".title" @issue_types = [] @@ -18,7 +22,7 @@ class IssuesController < ApplicationController @issue_types.push("DiaryEntry", "DiaryComment", "User") if current_user.administrator? @users = User.joins(:roles).where(:user_roles => { :role => current_user.roles.map(&:role) }).distinct - @issues = Issue.visible_to(current_user).order(:updated_at => :desc) + @issues = Issue.visible_to(current_user) # If search if params[:search_by_user].present? @@ -39,6 +43,8 @@ class IssuesController < ApplicationController last_updated_by = params[:last_updated_by].to_s == "nil" ? nil : params[:last_updated_by].to_i @issues = @issues.where(:updated_by => last_updated_by) end + + @issues, @newer_issues_id, @older_issues_id = get_page_items(@issues, :limit => @params[:limit]) end def show diff --git a/app/views/issues/_page.html.erb b/app/views/issues/_page.html.erb new file mode 100644 index 000000000..ed23fb8cd --- /dev/null +++ b/app/views/issues/_page.html.erb @@ -0,0 +1,34 @@ + + + + + + + + + + + + <% @issues.each do |issue| %> + + + + + + + + <% end %> + +
<%= t ".status" %><%= t ".reports" %><%= t ".reported_item" %><%= t ".reported_user" %><%= t ".last_updated" %>
<%= t ".states.#{issue.status}" %><%= link_to t(".reports_count", :count => issue.reports_count), issue %><%= link_to reportable_title(issue.reportable), reportable_url(issue.reportable) %><%= link_to issue.reported_user.display_name, issue.reported_user if issue.reported_user %> + <% if issue.user_updated %> + <%= t ".last_updated_time_ago_user_html", :user => link_to(issue.user_updated.display_name, issue.user_updated), + :time_ago => friendly_date_ago(issue.updated_at) %> + <% else %> + <%= friendly_date_ago(issue.updated_at) %> + <% end %> +
+<%= render "shared/pagination", + :newer_key => "issues.page.newer_issues", + :older_key => "issues.page.older_issues", + :newer_id => @newer_issues_id, + :older_id => @older_issues_id %> diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 523f90846..6234f755f 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -43,33 +43,5 @@ <% if @issues.length == 0 %>

<%= t ".issues_not_found" %>

<% else %> - - - - - - - - - - - - <% @issues.each do |issue| %> - - - - - - - - <% end %> - -
<%= t ".status" %><%= t ".reports" %><%= t ".reported_item" %><%= t ".reported_user" %><%= t ".last_updated" %>
<%= t ".states.#{issue.status}" %><%= link_to t(".reports_count", :count => issue.reports_count), issue %><%= link_to reportable_title(issue.reportable), reportable_url(issue.reportable) %><%= link_to issue.reported_user.display_name, issue.reported_user if issue.reported_user %> - <% if issue.user_updated %> - <%= t ".last_updated_time_ago_user_html", :user => link_to(issue.user_updated.display_name, issue.user_updated), - :time_ago => friendly_date_ago(issue.updated_at) %> - <% else %> - <%= friendly_date_ago(issue.updated_at) %> - <% end %> -
+ <%= render :partial => "page" %> <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 36698f02c..a544fe307 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1469,11 +1469,17 @@ en: search_guidance: "Search Issues:" user_not_found: User does not exist issues_not_found: No such issues found + link_to_reports: View Reports + states: + ignored: Ignored + open: Open + resolved: Resolved + page: + reported_user: Reported User status: Status reports: Reports last_updated: Last Updated last_updated_time_ago_user_html: "%{time_ago} by %{user}" - link_to_reports: View Reports reports_count: one: "%{count} Report" other: "%{count} Reports" @@ -1482,6 +1488,8 @@ en: ignored: Ignored open: Open resolved: Resolved + older_issues: Older Issues + newer_issues: Newer Issues show: title: "%{status} Issue #%{issue_id}" reports: diff --git a/test/system/issues_test.rb b/test/system/issues_test.rb index b9b989c07..4086a4fe4 100644 --- a/test/system/issues_test.rb +++ b/test/system/issues_test.rb @@ -158,7 +158,35 @@ class IssuesTest < ApplicationSystemTestCase visit issues_path - assert_link I18n.t("issues.index.reports_count", :count => issue1.reports_count), :href => issue_path(issue1) - assert_link I18n.t("issues.index.reports_count", :count => issue2.reports_count), :href => issue_path(issue2) + assert_link I18n.t("issues.page.reports_count", :count => issue1.reports_count), :href => issue_path(issue1) + assert_link I18n.t("issues.page.reports_count", :count => issue2.reports_count), :href => issue_path(issue2) + end + + def test_issues_pagination + 1.upto(80).each do + user = create(:user) + create(:issue, :reportable => user, :reported_user => user, :assigned_role => "administrator") + end + + sign_in_as(create(:administrator_user)) + + visit issues_path + + # First Page + assert_no_content I18n.t("issues.index.user_not_found") + assert_no_content I18n.t("issues.index.issues_not_found") + assert_css "tr", :count => 51 + + # Second Page + click_on I18n.t("issues.page.older_issues") + assert_no_content I18n.t("issues.index.user_not_found") + assert_no_content I18n.t("issues.index.issues_not_found") + assert_css "tr", :count => 31, :wait => 1 + + # Back to First Page + click_on I18n.t("issues.page.newer_issues") + assert_no_content I18n.t("issues.index.user_not_found") + assert_no_content I18n.t("issues.index.issues_not_found") + assert_css "tr", :count => 51, :wait => 1 end end -- 2.39.5