Skip to content

Commit fa990fa

Browse files
authored
Merge pull request #463 from opf/75258-hide-pagination-buttons-when-they-are-disabled
[75258] Hide pagination buttons when they are disabled
2 parents a2f7998 + 876c8ad commit fa990fa

4 files changed

Lines changed: 61 additions & 32 deletions

File tree

.changeset/hot-taxis-hunt.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@openproject/primer-view-components": patch
3+
---
4+
5+
[75258] Hide unavailable pagination navigation and omit single-page pagination

app/components/primer/open_project/pagination.rb

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ def pages
5757
end
5858
end
5959

60+
def render?
61+
page_count > 1
62+
end
63+
6064
private
6165

6266
def cast_integer!(value, name)
@@ -81,36 +85,45 @@ def default_href_builder(page_num)
8185
end
8286

8387
def build_pagination_model
84-
prev_page = previous_page_item
85-
next_page = next_page_item
86-
87-
return [prev_page, next_page] unless show_pages || page_count <= 0
88+
pages = []
8889

89-
pages = if all_pages_fit?
90-
full_pagination_without_breaks
91-
else
92-
paginated_number_items
93-
end
90+
pages << previous_page_item unless first_page?
91+
pages.concat(number_page_items) if show_pages
92+
pages << next_page_item unless last_page?
9493

95-
[prev_page, *pages, next_page]
94+
pages
9695
end
9796

9897
def previous_page_item
9998
{
10099
type: PAGE_TYPE__PREV,
101-
num: current_page - 1,
102-
disabled: current_page == 1
100+
num: current_page - 1
103101
}
104102
end
105103

106104
def next_page_item
107105
{
108106
type: PAGE_TYPE__NEXT,
109-
num: current_page + 1,
110-
disabled: current_page == page_count
107+
num: current_page + 1
111108
}
112109
end
113110

111+
def first_page?
112+
current_page == 1
113+
end
114+
115+
def last_page?
116+
current_page == page_count
117+
end
118+
119+
def number_page_items
120+
if all_pages_fit?
121+
full_pagination_without_breaks
122+
else
123+
paginated_number_items
124+
end
125+
end
126+
114127
def full_pagination_without_breaks
115128
pages = []
116129
add_pages(pages, 1, page_count)
@@ -233,20 +246,12 @@ def build_component_data(page)
233246
key_string = key.to_s
234247
content = I18n.t("pagination.#{key_string}")
235248

236-
if page[:disabled]
237-
props.merge!(
238-
rel: key_string,
239-
"aria-hidden": "true",
240-
"aria-disabled": "true"
241-
)
242-
else
243-
props.merge!(
244-
rel: key_string,
245-
href: href_builder.call(page[:num]),
246-
"aria-label": I18n.t("pagination.#{key_string}_page"),
247-
**@link_arguments
248-
)
249-
end
249+
props.merge!(
250+
rel: key_string,
251+
href: href_builder.call(page[:num]),
252+
"aria-label": I18n.t("pagination.#{key_string}_page"),
253+
**@link_arguments
254+
)
250255

251256
when PAGE_TYPE__NUM
252257
key = :"page-#{page[:num]}"

previews/primer/open_project/pagination_preview.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ def playground(
2323
margin_page_count = (margin_page_count.presence || 1).to_i
2424
surrounding_page_count = (surrounding_page_count.presence || 2).to_i
2525

26+
# Ensure current_page doesn't exceed page_count
27+
current_page = [current_page, page_count].min
28+
current_page = [current_page, 1].max # Ensure at least 1
29+
2630
render(
2731
Primer::OpenProject::Pagination.new(
2832
current_page: current_page,
@@ -46,6 +50,7 @@ def default
4650
)
4751
)
4852
end
53+
4954
#
5055
# @!endgroup
5156
end

test/components/primer/open_project/pagination_test.rb

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,18 @@ def test_marks_current_page
2828
assert_selector("[aria-current='page']", text: "3")
2929
end
3030

31-
def test_disables_previous_on_first_page
31+
def test_hides_previous_on_first_page
3232
render_inline(Primer::OpenProject::Pagination.new(page_count: 5, current_page: 1))
3333

34-
assert_selector("[rel='prev'][aria-disabled='true']")
34+
refute_selector("[rel='prev']")
35+
assert_selector("[rel='next']")
3536
end
3637

37-
def test_disables_next_on_last_page
38+
def test_hides_next_on_last_page
3839
render_inline(Primer::OpenProject::Pagination.new(page_count: 5, current_page: 5))
3940

40-
assert_selector("[rel='next'][aria-disabled='true']")
41+
assert_selector("[rel='prev']")
42+
refute_selector("[rel='next']")
4143
end
4244

4345
def test_renders_ellipsis_for_many_pages
@@ -300,4 +302,16 @@ def test_link_arguments_are_not_applied_to_break_elements
300302
refute_selector("span[role='presentation'][data-turbo='false']")
301303
end
302304

305+
def test_single_page_does_not_render_pagination
306+
render_inline(
307+
Primer::OpenProject::Pagination.new(
308+
page_count: 1,
309+
current_page: 1
310+
)
311+
)
312+
313+
refute_selector("nav[aria-label='Pagination']")
314+
refute_selector(".PaginationContainer")
315+
end
316+
303317
end

0 commit comments

Comments
 (0)