lib/pagy/extras/overflow.rb



# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/overflow
# encoding: utf-8
# frozen_string_literal: true

class Pagy

  VARS[:overflow] = :empty_page

  def overflow?; @overflow end

  alias :initialize_without_overflow :initialize
  def initialize_with_overflow(vars)
    @overflow ||= false                         # don't override if :last_page re-run the method after an overflow
    initialize_without_overflow(vars)
  rescue OverflowError
    @overflow = true                            # add the overflow flag
    case @vars[:overflow]
    when :exception
      raise                                     # same as without the extra
    when :last_page
      initial_page = @vars[:page]               # save the very initial page (even after re-run)
      initialize(vars.merge!(page: @last))      # re-run with the last page
      @vars[:page] = initial_page               # restore the inital page
    when :empty_page
      @offset = @items = @from = @to = 0        # vars relative to the actual page
      @prev = @last                             # prev relative to the actual page
      extend(Series)                            # special series for :empty_page
    else
      raise ArgumentError, "expected :overflow variable in [:last_page, :empty_page, :exception]; got #{@vars[:overflow].inspect}"
    end
  end
  alias :initialize :initialize_with_overflow

  module Series
    def series(size=@vars[:size])
      @page = @last                               # series for last page
      super(size).tap do |s|                      # call original series
        s[s.index(@page.to_s)] = @page            # string to integer (i.e. no current page)
        @page = @vars[:page]                      # restore the actual page
      end
    end
  end


  # support for Pagy::Countless
  if defined?(Pagy::Countless)
    class Countless

      alias :finalize_without_overflow :finalize
      def finalize_with_overflow(items)
        @overflow = false
        finalize_without_overflow(items)
      rescue OverflowError
        @overflow = true                            # add the overflow flag
        case @vars[:overflow]
        when :exception
          raise                                     # same as without the extra
        when :empty_page
          @offset = @items = @from = @to = 0        # vars relative to the actual page
          @vars[:size] = []                         # no page in the series
          self
        else
          raise ArgumentError, "expected :overflow variable in [:empty_page, :exception]; got #{@vars[:overflow].inspect}"
        end
      end
      alias :finalize :finalize_with_overflow

    end
  end

end