Skip to content

Commit 6305c8d

Browse files
committed
Truncate breadcrumb elements in PageHeader
1 parent 8c30419 commit 6305c8d

4 files changed

Lines changed: 49 additions & 2 deletions

File tree

.changeset/lovely-seals-say.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': minor
3+
---
4+
5+
Truncate Pageheader breadcrumb items when they are too long

app/components/primer/open_project/page_header.rb

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class PageHeader < Primer::Component
2323
DEFAULT_LEADING_ACTION_DISPLAY = [:none, :flex].freeze
2424
DEFAULT_BREADCRUMBS_DISPLAY = [:none, :flex].freeze
2525
DEFAULT_PARENT_LINK_DISPLAY = [:block, :none].freeze
26+
BREADCRUMB_TRUNCATE_AT = 200
2627

2728
STATE_DEFAULT = :show
2829
STATE_EDIT = :edit
@@ -222,9 +223,17 @@ class PageHeader < Primer::Component
222223
render(Primer::Beta::Breadcrumbs.new(**system_arguments)) do |breadcrumbs|
223224
items.each do |item|
224225
if item.is_a?(String)
225-
breadcrumbs.with_item(href: "#", font_weight: selected_item_font_weight) { item }
226+
breadcrumbs.with_item(href: "#", font_weight: selected_item_font_weight) do
227+
render(Primer::Beta::Truncate.new) do |truncate|
228+
truncate.with_item(max_width: BREADCRUMB_TRUNCATE_AT) { item }
229+
end
230+
end
226231
else
227-
breadcrumbs.with_item(href: item[:href], target: "_top") { item[:text] }
232+
breadcrumbs.with_item(href: item[:href], target: "_top") do
233+
render(Primer::Beta::Truncate.new) do |truncate|
234+
truncate.with_item(max_width: BREADCRUMB_TRUNCATE_AT) { item[:text] }
235+
end
236+
end
228237
end
229238
end
230239
end

previews/primer/open_project/page_header_preview.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,19 @@ def non_bold_breadcrumbs
191191
end
192192
end
193193

194+
# @label With truncated breadcrumbs
195+
# Long breadcrumb elements are truncated after 200px
196+
def truncated_breadcrumbs
197+
breadcrumb_items = [{ href: "/foo", text: "OpenProject" },
198+
{ href: "/bar", text: "Stream Dream team" },
199+
{ href: "/baz", text: "A very long sub project that will be truncated" },
200+
"Hello"]
201+
render(Primer::OpenProject::PageHeader.new) do |header|
202+
header.with_title { "A title" }
203+
header.with_breadcrumbs(breadcrumb_items, selected_item_font_weight: :normal)
204+
end
205+
end
206+
194207
# @label Without breadcrumbs
195208
# A PageHeader example that renders without breadcrumbs.
196209
# This should only be done for *entry pages* (such as overview pages).

test/components/primer/open_project/page_header_test.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,26 @@ def test_renders_non_bold_breadcrumbs
215215
assert_selector("nav[aria-label='Breadcrumb'].PageHeader-breadcrumbs .breadcrumb-item:not(.text-bold) a[href='#']")
216216
end
217217

218+
def test_renders_truncated_breadcrumb
219+
breadcrumb_items = [{ href: "/foo", text: "OpenProject" },
220+
{ href: "/bar", text: "Stream Dream team" },
221+
{ href: "/baz", text: "A very long sub project that will be truncated" },
222+
"Hello"]
223+
224+
render_inline(Primer::OpenProject::PageHeader.new) do |header|
225+
header.with_title { "Hello" }
226+
header.with_breadcrumbs(breadcrumb_items)
227+
end
228+
229+
assert_text("Hello")
230+
assert_selector(".PageHeader-title")
231+
assert_selector(".PageHeader-breadcrumbs")
232+
assert_selector(".PageHeader-parentLink")
233+
234+
assert_selector(".breadcrumb-item a[href='/baz'] .Truncate > .Truncate-text[style='max-width: 135px;']",
235+
text: "A very long sub project that will be truncated")
236+
end
237+
218238
def test_renders_tab_nav
219239
render_inline(Primer::OpenProject::PageHeader.new) do |header|
220240
header.with_title { "Hello" }

0 commit comments

Comments
 (0)