Skip to content

Commit c30bff1

Browse files
committed
Rename slots for sorting and grouping
1 parent d51cc25 commit c30bff1

7 files changed

Lines changed: 48 additions & 49 deletions

File tree

app/components/primer/open_project/sub_header.html.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
<%= render @collapsed_filter_trigger if @collapsed_filter_trigger.present? %>
99

10-
<%= sort_quick_filter %>
11-
<%= group_quick_filter %>
10+
<%= quick_sort %>
11+
<%= quick_group %>
1212
<% quick_filters.each do |quick_filter| %>
1313
<%= quick_filter %>
1414
<% end %>

app/components/primer/open_project/sub_header.rb

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -170,37 +170,27 @@ class SubHeader < Primer::Component
170170
}
171171
}
172172

173-
# Quick filters shown in the left pane next to the search bar (0–5 items total across all types).
174-
# Hidden on smaller screens when more than one `quick_filter` is provided. Requires `filter_button` when using more than one `quick_filter`.
175-
# Supports ActionMenus, Buttons, IconButtons, SelectPanels, and SegmentedControls inside the block.
176-
#
177-
# Use `with_sort_quick_filter` for sort controls (renders first),
178-
# `with_group_quick_filter` for group controls (renders second),
179-
# and `with_quick_filter` for all others (renders last).
180-
renders_one :sort_quick_filter, lambda { |**kwargs|
173+
# A slot for a generic sorting component. Will be rendered next to the search input
174+
renders_one :quick_sort, lambda { |**kwargs|
181175
deny_tag_argument(**kwargs)
182-
kwargs[:tag] = :div
183-
kwargs[:mr] ||= 2
184-
QuickFilter.new(**kwargs)
176+
177+
QuickActionComponent.new(**kwargs)
185178
}
186179

187-
renders_one :group_quick_filter, lambda { |**kwargs|
180+
# A slot for a generic sorting component. Will be rendered next to the sorting button
181+
renders_one :quick_group, lambda { |**kwargs|
188182
deny_tag_argument(**kwargs)
189-
kwargs[:tag] = :div
190-
kwargs[:mr] ||= 2
191-
QuickFilter.new(**kwargs)
183+
184+
QuickActionComponent.new(**kwargs)
192185
}
193186

187+
# Quick filters shown in the left pane next to the search bar (0–5 items total across all types).
188+
# Hidden on smaller screens when more than one `quick_filter` is provided. Requires `filter_button` when using more than one `quick_filter`.
189+
# Supports ActionMenus, Buttons, IconButtons, SelectPanels, and SegmentedControls inside the block.
194190
renders_many :quick_filters, lambda { |**kwargs|
195191
deny_tag_argument(**kwargs)
196-
kwargs[:tag] = :div
197-
kwargs[:mr] ||= 2
198-
kwargs[:classes] = class_names(
199-
"SubHeader-hiddenOnExpand",
200-
kwargs[:classes]
201-
)
202192

203-
QuickFilter.new(**kwargs)
193+
QuickActionComponent.new(**kwargs)
204194
}
205195

206196
renders_one :segmented_control, lambda { |**system_arguments, &block|
@@ -256,14 +246,14 @@ def initialize(collapsed_search: false, **system_arguments)
256246
end
257247

258248
def before_render
259-
all_qf = [sort_quick_filter, group_quick_filter].compact + quick_filters
249+
all_quick_actions = [quick_sort, quick_group].compact + quick_filters
260250

261251
if quick_filters.size > 1 && filter_button.nil?
262252
raise ArgumentError, "You must provide a filter_button when using quick_filters."
263253
end
264254

265-
if all_qf.size > 5
266-
raise ArgumentError, "SubHeader supports a maximum of 5 quick_filters, got #{all_qf.size}."
255+
if quick_filters.size > 5
256+
raise ArgumentError, "SubHeader supports a maximum of 5 quick_filters, got #{all_quick_actions.size}."
267257
end
268258

269259
if quick_filters.size > 1
@@ -274,7 +264,7 @@ def before_render
274264

275265
@system_arguments[:classes] = class_names(
276266
@system_arguments[:classes],
277-
"SubHeader--emptyLeftPane" => !segmented_control? && !filter_button && !filter_input && all_qf.empty?
267+
"SubHeader--emptyLeftPane" => !segmented_control? && !filter_button && !filter_input && all_quick_actions.empty?
278268
)
279269
end
280270

app/components/primer/open_project/sub_header/quick_filter.rb renamed to app/components/primer/open_project/sub_header/quick_action_component.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,17 @@ module OpenProject
55
# Thin wrapper for quick filter slots that defers BaseComponent construction to render time,
66
# allowing system arguments (e.g. display) to be mutated in before_render.
77
# Do not use standalone
8-
class SubHeader::QuickFilter < Primer::Component
8+
class SubHeader::QuickActionComponent < Primer::Component
99
status :open_project
1010

1111
def initialize(**system_arguments)
1212
@system_arguments = system_arguments
13+
system_arguments[:tag] = :div
14+
system_arguments[:mr] ||= 2
15+
system_arguments[:classes] = class_names(
16+
"SubHeader-hiddenOnExpand",
17+
system_arguments[:classes]
18+
)
1319
end
1420

1521
def merge_system_arguments!(**other_arguments)

previews/primer/open_project/sub_header_preview/quick_filters.html.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
"All filters"
66
end
77

8-
component.with_sort_quick_filter do
8+
component.with_quick_sort do
99
render(Primer::Beta::IconButton.new(icon: :"sort-desc", "aria-label": "Sort"))
1010
end
1111

12-
component.with_group_quick_filter do
12+
component.with_quick_group do
1313
render(Primer::Beta::IconButton.new(icon: :rows, "aria-label": "Group"))
1414
end
1515

static/statuses.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@
173173
"Primer::OpenProject::SubHeader::Button": "open_project",
174174
"Primer::OpenProject::SubHeader::ButtonGroup": "open_project",
175175
"Primer::OpenProject::SubHeader::Menu": "open_project",
176-
"Primer::OpenProject::SubHeader::QuickFilter": "open_project",
176+
"Primer::OpenProject::SubHeader::QuickActionComponent": "open_project",
177177
"Primer::OpenProject::SubHeader::SegmentedControl": "open_project",
178178
"Primer::OpenProject::ZenModeButton": "open_project",
179179
"Primer::Tooltip": "deprecated",

test/components/component_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ def test_registered_components
252252
"Primer::OpenProject::SubHeader::Button",
253253
"Primer::OpenProject::SubHeader::ButtonGroup",
254254
"Primer::OpenProject::SubHeader::Menu",
255-
"Primer::OpenProject::SubHeader::QuickFilter",
255+
"Primer::OpenProject::SubHeader::QuickActionComponent",
256256
"Primer::OpenProject::SubHeader::SegmentedControl",
257257
"Primer::OpenProject::SidePanel::Section",
258258
"Primer::OpenProject::DangerDialog::FormWrapper",

test/components/primer/open_project/sub_header_test.rb

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -325,15 +325,15 @@ def test_quick_filters_maximum_is_five
325325

326326
def test_renders_sort_quick_filter
327327
render_inline(Primer::OpenProject::SubHeader.new) do |component|
328-
component.with_sort_quick_filter { "<span class='SortFilter'>Sort</span>".html_safe }
328+
component.with_quick_sort { "<span class='SortFilter'>Sort</span>".html_safe }
329329
end
330330

331331
assert_selector(".SubHeader-leftPane .SortFilter")
332332
end
333333

334334
def test_renders_group_quick_filter
335335
render_inline(Primer::OpenProject::SubHeader.new) do |component|
336-
component.with_group_quick_filter { "<span class='GroupFilter'>Group</span>".html_safe }
336+
component.with_quick_group { "<span class='GroupFilter'>Group</span>".html_safe }
337337
end
338338

339339
assert_selector(".SubHeader-leftPane .GroupFilter")
@@ -343,8 +343,8 @@ def test_sort_and_group_quick_filters_render_before_other_quick_filters
343343
render_inline(Primer::OpenProject::SubHeader.new) do |component|
344344
component.with_filter_button { "Filter" }
345345
component.with_quick_filter(classes: "OtherFilter") { "Other" }
346-
component.with_group_quick_filter(classes: "GroupFilter") { "Group" }
347-
component.with_sort_quick_filter(classes: "SortFilter") { "Sort" }
346+
component.with_quick_group(classes: "GroupFilter") { "Group" }
347+
component.with_quick_sort(classes: "SortFilter") { "Sort" }
348348
end
349349

350350
assert_selector(".SortFilter ~ .GroupFilter")
@@ -353,32 +353,35 @@ def test_sort_and_group_quick_filters_render_before_other_quick_filters
353353

354354
def test_sort_and_group_do_not_count_toward_filter_button_requirement
355355
render_inline(Primer::OpenProject::SubHeader.new) do |component|
356-
component.with_sort_quick_filter { "Sort" }
356+
component.with_quick_sort { "Sort" }
357357
component.with_quick_filter { "Status" }
358358
end
359359

360360
assert_text "Sort"
361361
assert_text "Status"
362362
end
363363

364-
def test_sort_and_group_count_toward_maximum
365-
err = assert_raises ArgumentError do
366-
render_inline(Primer::OpenProject::SubHeader.new) do |component|
367-
component.with_filter_button { "Filter" }
368-
component.with_sort_quick_filter { "Sort" }
369-
component.with_group_quick_filter { "Group" }
370-
4.times { |i| component.with_quick_filter { "Filter #{i}" } }
371-
end
364+
def test_sort_and_group_do_not_count_toward_maximum
365+
render_inline(Primer::OpenProject::SubHeader.new) do |component|
366+
component.with_filter_button { "Filter" }
367+
component.with_quick_sort { "Sort" }
368+
component.with_quick_group { "Group" }
369+
4.times { |i| component.with_quick_filter { "Filter #{i}" } }
372370
end
373371

374-
assert_equal "SubHeader supports a maximum of 5 quick_filters, got 6.", err.message
372+
assert_text "Sort"
373+
assert_text "Group"
374+
assert_text "Filter 0"
375+
assert_text "Filter 1"
376+
assert_text "Filter 2"
377+
assert_text "Filter 3"
375378
end
376379

377380
def test_sort_and_group_are_not_hidden_on_mobile_when_multiple_quick_filters
378381
render_inline(Primer::OpenProject::SubHeader.new) do |component|
379382
component.with_filter_button { "Filter" }
380-
component.with_sort_quick_filter { "<span class='SortFilter'>Sort</span>".html_safe }
381-
component.with_group_quick_filter { "<span class='GroupFilter'>Group</span>".html_safe }
383+
component.with_quick_sort { "<span class='SortFilter'>Sort</span>".html_safe }
384+
component.with_quick_group { "<span class='GroupFilter'>Group</span>".html_safe }
382385
end
383386

384387
assert_no_selector(".d-none.d-md-flex .SortFilter")

0 commit comments

Comments
 (0)