Module: Shadcn::Rails::Helpers::PaginationHelper

Extended by:
ActiveSupport::Concern
Defined in:
lib/shadcn/rails/helpers/pagination_helper.rb

Overview

Helper methods for integrating with popular Rails pagination gems Supports: will_paginate, Kaminari, and Pagy

Instance Method Summary collapse

Instance Method Details

#shadcn_paginate(collection_or_pagy, pagy: nil, url_builder: nil, window: 2, **options) ⇒ Object

Render a shadcn pagination component from a paginated collection or Pagy object

Examples:

With Kaminari

<%= shadcn_paginate @users %>

With will_paginate

<%= shadcn_paginate @posts %>

With Pagy

<%= shadcn_paginate @pagy %>

With custom URL builder

<%= shadcn_paginate @posts, url_builder: ->(page) { posts_path(page: page, sort: params[:sort]) } %>

Parameters:

  • collection_or_pagy (Object)

    A paginated collection (Kaminari/will_paginate) or Pagy object

  • pagy (Pagy, nil) (defaults to: nil)

    Optional Pagy object (for explicit pagy usage)

  • url_builder (Proc, nil) (defaults to: nil)

    Lambda/Proc to generate page URLs, receives page number

  • window (Integer) (defaults to: 2)

    Number of pages to show around current page (default: 2)

  • options (Hash)

    Additional options passed to PaginationComponent



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/shadcn/rails/helpers/pagination_helper.rb', line 31

def shadcn_paginate(collection_or_pagy, pagy: nil, url_builder: nil, window: 2, **options)
  pagination_data = extract_pagination_data(collection_or_pagy, pagy: pagy)
  return nil if pagination_data[:total_pages] <= 1

  url_builder ||= default_url_builder
  series = generate_page_series(
    pagination_data[:current_page],
    pagination_data[:total_pages],
    window: window
  )

  render Shadcn::PaginationComponent.new(**options) do |pagination|
    pagination.with_pagination_content do |content|
      # Previous button
      prev_href = pagination_data[:prev_page] ? url_builder.call(pagination_data[:prev_page]) : nil
      content.with_previous(href: prev_href, disabled: pagination_data[:prev_page].nil?)

      # Page items
      series.each do |item|
        case item
        when :gap
          content.with_ellipse
        when Integer
          content.with_item(href: url_builder.call(item)) { item.to_s }
        when String # Current page (string format)
          page_num = item.to_i
          content.with_item(href: url_builder.call(page_num), active: true) { item }
        end
      end

      # Next button
      next_href = pagination_data[:next_page] ? url_builder.call(pagination_data[:next_page]) : nil
      content.with_next_page(href: next_href, disabled: pagination_data[:next_page].nil?)
    end
  end
end