Skip to content

Commit f3118af

Browse files
committed
Allow single quickFilters without requiring the "all filters" button
1 parent 54c6cf7 commit f3118af

5 files changed

Lines changed: 63 additions & 6 deletions

File tree

.changeset/loose-dragons-drop.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+
Allow single quickFilters without additional "all filters" button

app/components/primer/open_project/sub_header.rb

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,8 @@ class SubHeader < Primer::Component
177177
deny_tag_argument(**kwargs)
178178
kwargs[:tag] = :div
179179
kwargs[:mr] ||= 2
180-
kwargs[:display] = DESKTOP_ACTIONS_DISPLAY
181180

182-
Primer::BaseComponent.new(**kwargs)
181+
QuickFilter.new(**kwargs)
183182
}
184183

185184
renders_one :segmented_control, lambda { |**system_arguments, &block|
@@ -235,14 +234,20 @@ def initialize(collapsed_search: false, **system_arguments)
235234
end
236235

237236
def before_render
238-
if quick_filters.any? && filter_button.nil?
237+
if quick_filters.size > 1 && filter_button.nil?
239238
raise ArgumentError, "You must provide a filter_button when using quick_filters."
240239
end
241240

242241
if quick_filters.size > 5
243242
raise ArgumentError, "SubHeader supports a maximum of 5 quick_filters, got #{quick_filters.size}."
244243
end
245244

245+
if quick_filters.size > 1
246+
quick_filters.each do |qf|
247+
qf.merge_system_arguments!(display: DESKTOP_ACTIONS_DISPLAY)
248+
end
249+
end
250+
246251
@system_arguments[:classes] = class_names(
247252
@system_arguments[:classes],
248253
"SubHeader--emptyLeftPane" => !segmented_control? && !filter_button && !filter_input && quick_filters.empty?
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# frozen_string_literal: true
2+
3+
module Primer
4+
module OpenProject
5+
# Thin wrapper for quick filter slots that defers BaseComponent construction to render time,
6+
# allowing system arguments (e.g. display) to be mutated in before_render.
7+
# Do not use standalone
8+
class SubHeader::QuickFilter < Primer::Component
9+
status :open_project
10+
11+
def initialize(**system_arguments)
12+
@system_arguments = system_arguments
13+
end
14+
15+
def merge_system_arguments!(**other_arguments)
16+
@system_arguments[:aria] = merge_aria(@system_arguments, other_arguments)
17+
@system_arguments[:data] = merge_data(@system_arguments, other_arguments)
18+
@system_arguments.merge!(**other_arguments)
19+
end
20+
21+
def call
22+
render(Primer::BaseComponent.new(**@system_arguments)) { content }
23+
end
24+
end
25+
end
26+
end

test/components/component_test.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +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",
255256
"Primer::OpenProject::SubHeader::SegmentedControl",
256257
"Primer::OpenProject::SidePanel::Section",
257258
"Primer::OpenProject::DangerDialog::FormWrapper",

test/components/primer/open_project/sub_header_test.rb

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -272,27 +272,47 @@ def test_renders_quick_filters
272272
assert_selector(".SubHeader-leftPane .MyQuickFilter", count: 2)
273273
end
274274

275-
def test_quick_filters_are_hidden_on_mobile
275+
def test_quick_filters_are_hidden_on_mobile_when_multiple
276276
render_inline(Primer::OpenProject::SubHeader.new) do |component|
277277
component.with_filter_button { "Filter" }
278278
component.with_quick_filter { "<span class='MyQuickFilter'>Status</span>".html_safe }
279+
component.with_quick_filter { "<span class='MyQuickFilter'>Assignee</span>".html_safe }
279280
end
280281

281282
# Each quick_filter wrapper has d-none d-md-flex (hidden on mobile, visible on desktop)
282-
assert_selector(".d-none.d-md-flex .MyQuickFilter")
283+
assert_selector(".d-none.d-md-flex .MyQuickFilter", count: 2)
284+
end
285+
286+
def test_single_quick_filter_is_visible_on_all_screen_sizes
287+
render_inline(Primer::OpenProject::SubHeader.new) do |component|
288+
component.with_quick_filter { "<span class='MyQuickFilter'>Status</span>".html_safe }
289+
end
290+
291+
assert_selector(".MyQuickFilter")
292+
assert_no_selector(".d-none .MyQuickFilter")
283293
end
284294

285-
def test_quick_filters_require_filter_button
295+
def test_quick_filters_require_filter_button_when_multiple_quick_filters
286296
err = assert_raises ArgumentError do
287297
render_inline(Primer::OpenProject::SubHeader.new) do |component|
288298
component.with_filter_input(name: "filter", label: "Filter")
289299
component.with_quick_filter { "Status" }
300+
component.with_quick_filter { "Status" }
290301
end
291302
end
292303

293304
assert_equal "You must provide a filter_button when using quick_filters.", err.message
294305
end
295306

307+
308+
def test_quick_filters_require_no_filter_button_for_single_quick_filter
309+
render_inline(Primer::OpenProject::SubHeader.new) do |component|
310+
component.with_quick_filter { "<span class='MyQuickFilter'>Status</span>".html_safe }
311+
end
312+
313+
assert_selector(".MyQuickFilter")
314+
end
315+
296316
def test_quick_filters_maximum_is_five
297317
err = assert_raises ArgumentError do
298318
render_inline(Primer::OpenProject::SubHeader.new) do |component|

0 commit comments

Comments
 (0)