From 77d8daedeaa3f97d3f8365745dd02b370b7ebdcd Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Sun, 25 Oct 2020 02:21:12 +0200 Subject: [PATCH] Added pagination of screenshots to reduce loading times --- app/controllers/packages_controller.rb | 29 +++++++++++++++++++++++++- app/helpers/packages_helper.rb | 26 +++++++++++------------ app/views/packages/details.slim | 8 +++---- app/views/packages/grid.slim | 4 ++-- 4 files changed, 47 insertions(+), 20 deletions(-) diff --git a/app/controllers/packages_controller.rb b/app/controllers/packages_controller.rb index e283806..9d5d3f5 100644 --- a/app/controllers/packages_controller.rb +++ b/app/controllers/packages_controller.rb @@ -13,11 +13,23 @@ class PackagesController < ApplicationController def details # TODO: Get only screenshots visible to the user (admin or owner or approved) @package = Package.find_by(name: params[:name]) - + unless @package @packagename = params[:name] render 'notfound' end + + # The first page of screenshots (if there are multiple at all) shows the + # first image twice as large. So the first page contains 5 images while + # the second and further page contain 6 images. + @page = params[:page] + @images_per_page = if @page.to_i < 2 + 5 + else + 6 + end + # raise + @screenshots = screenshots_visible_to_user(@package).paginate(page: @page, per_page: @images_per_page) end # Show upload form for new images @@ -331,4 +343,19 @@ class PackagesController < ApplicationController return false end + def screenshots_visible_to_user(package) + if user_signed_in? and current_user.is_admin? + # User is an admin and can view all screenshots + package.screenshots + # TODO: User logins and assigned screenshots will come in a later version + # elsif user_signed_in? + # package.screenshots.where(id: (current_user.screenshots.select(:id))) | \ + # package.screenshots.where(approved: true).order('created_at DESC') + else + package.screenshots.where(uploaderhash: session.id.to_s).or( + package.screenshots.where(approved: true) + ) + .order('created_at DESC') + end + end end diff --git a/app/helpers/packages_helper.rb b/app/helpers/packages_helper.rb index 1660ea5..a246fd2 100644 --- a/app/helpers/packages_helper.rb +++ b/app/helpers/packages_helper.rb @@ -5,19 +5,19 @@ module PackagesHelper # - approved (public) screenshots # - screenshots uploaded by the user # - all screenshots if the user is an admin - def screenshots_visible_to_user(package) - if user_signed_in? and current_user.is_admin? - # User is an admin and can view all screenshots - package.screenshots - # TODO: User logins and assigned screenshots will come in a later version - # elsif user_signed_in? - # package.screenshots.where(id: (current_user.screenshots.select(:id))) | \ - # package.screenshots.where(approved: true).order('created_at DESC') - else - package.screenshots.where(uploaderhash: session.id.to_s) | \ - package.screenshots.where(approved: true).order('created_at DESC') - end - end + # def screenshots_visible_to_user(package) + # if user_signed_in? and current_user.is_admin? + # # User is an admin and can view all screenshots + # package.screenshots + # # TODO: User logins and assigned screenshots will come in a later version + # # elsif user_signed_in? + # # package.screenshots.where(id: (current_user.screenshots.select(:id))) | \ + # # package.screenshots.where(approved: true).order('created_at DESC') + # else + # package.screenshots.where(uploaderhash: session.id.to_s) | \ + # package.screenshots.where(approved: true).order('created_at DESC') + # end + # end def screenshot_uploaded_by_current_user?(screenshot) screenshot.uploaderhash == session.id.to_s diff --git a/app/views/packages/details.slim b/app/views/packages/details.slim index 259995b..632d187 100644 --- a/app/views/packages/details.slim +++ b/app/views/packages/details.slim @@ -10,14 +10,14 @@ .grid-x.grid-margin-x .small-7.medium-7.cell / Left column contains images - - if screenshots_visible_to_user(@package).count > 0 + - if @screenshots.count > 0 .grid-x.grid-margin-y.grid-margin-x.align-middle - - screenshots_visible_to_user(@package).each_with_index do |screenshot, idx| - / Display the first screenshot as a large image - - if idx==0 / TODO: paginator at the top looks ugly. maybe more space? or put it into the box on the right? = render(partial: 'packages/paginator', locals: {items: @screenshots}) + - @screenshots.each_with_index do |screenshot, idx| + / Display the first screenshot as a large image (on the first page only) + - if idx==0 && @page.to_i<2 .small-12.medium-12.cell .margin-bottom-3 = render(partial:'medium_image', locals: {screenshot: screenshot}) diff --git a/app/views/packages/grid.slim b/app/views/packages/grid.slim index 2b82d11..6f635bc 100644 --- a/app/views/packages/grid.slim +++ b/app/views/packages/grid.slim @@ -2,7 +2,7 @@ .grid-x .small-6.medium-8.large-9.cell // Paginator - = render 'packages/paginator' + = render(partial: 'packages/paginator', locals: {items: @packages}) .small-6.medium-4.large-3.cell // Search form @@ -21,7 +21,7 @@ = render 'packages/noresults' // Paginator - = render 'packages/paginator' + = render(partial: 'packages/paginator', locals: {items: @packages}) // Icon sidebar for options and views .small-3.large-2.cell