Skip to content

Commit 6e24a94

Browse files
authored
Merge pull request opf#483 from opf/bug/op-19578-update-all-filters-button-where-quick-filters-are-used
[OP-19578] Update "All filters" button where quick filters are used
2 parents 3243927 + f04c60c commit 6e24a94

9 files changed

Lines changed: 75 additions & 31 deletions

File tree

.changeset/khaki-carpets-matter.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
'@openproject/primer-view-components': patch
3+
---
4+
5+
Change defaults for `Primer::OpenProject::SubHeader` for
6+
7+
* `collapsed_search` to `true`
8+
* `scheme` of the filter button to `invisible`
9+
* `label` of the filter button to `All filters`

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

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

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

10+
<%= segmented_control %>
11+
12+
<% if @segmented_control_block.present? %>
13+
<%= render(@mobile_segmented_control) do |control| %>
14+
<% @segmented_control_block.call(control) %>
15+
<% end %>
16+
<% end %>
17+
1018
<%= quick_sort %>
1119
<%= quick_group %>
1220
<% quick_filters.each do |quick_filter| %>
@@ -15,14 +23,6 @@
1523

1624
<%= render(@mobile_filter_button) if @mobile_filter_button.present? %>
1725
<%= filter_button %>
18-
19-
<%= segmented_control %>
20-
21-
<% if @segmented_control_block.present? %>
22-
<%= render(@mobile_segmented_control) do |control| %>
23-
<% @segmented_control_block.call(control) %>
24-
<% end %>
25-
<% end %>
2626
</div>
2727

2828
<div class="SubHeader-middlePane SubHeader-hiddenOnExpand">

app/components/primer/open_project/sub_header.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,10 @@ class SubHeader < Primer::Component
131131
# To render custom content, call the `with_filter_component` method and pass a block that returns HTML.
132132
renders_one :filter_button, types: {
133133
button: {
134-
renders: lambda { |icon_only: false, leading_icon: :filter, mobile_label: I18n.t("button_filter"), **kwargs|
134+
renders: lambda { |icon_only: false, leading_icon: :filter, mobile_label: I18n.t("button_all_filters"), **kwargs|
135135
kwargs[:mr] ||= 2
136136
kwargs[:icon] = leading_icon
137+
kwargs[:scheme] ||= :invisible
137138

138139
kwargs[:aria] ||= merge_aria(
139140
kwargs,
@@ -226,7 +227,7 @@ class SubHeader < Primer::Component
226227

227228
# @param collapsed_search [Boolean] When true, the search bar starts collapsed as an icon button on all screen sizes. Clicking expands it.
228229
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
229-
def initialize(collapsed_search: false, **system_arguments)
230+
def initialize(collapsed_search: true, **system_arguments)
230231
@collapsed_search = collapsed_search
231232
@system_arguments = system_arguments
232233
@system_arguments[:tag] = :"sub-header"

app/components/primer/open_project/sub_header/button.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def before_render
3535
def call
3636
render(@button) do |button|
3737
button.with_leading_visual_icon(icon: @icon)
38-
content
38+
content || I18n.t("button_all_filters")
3939
end
4040
end
4141
end

config/locales/en.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ en:
55
button_close: "Close"
66
button_delete: "Delete"
77
button_delete_permanently: "Delete permanently"
8+
button_all_filters: "All filters"
89
button_filter: "Filter"
910
button_save: "Save"
1011

previews/primer/open_project/sub_header_preview.rb

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,17 @@ def playground(
2222
show_filter_button: true,
2323
show_quick_filter: true,
2424
show_action_button: true,
25-
collapsed_search: false,
25+
collapsed_search: true,
2626
text: nil,
2727
value: nil
2828
)
29-
render_with_template(locals: {show_filter_input: show_filter_input,
30-
show_clear_button: show_clear_button,
31-
show_filter_button: show_filter_button,
32-
show_quick_filter: show_quick_filter,
33-
show_action_button: show_action_button,
34-
collapsed_search: collapsed_search,
29+
bool = ActiveModel::Type::Boolean.new
30+
render_with_template(locals: {show_filter_input: bool.cast(show_filter_input),
31+
show_clear_button: bool.cast(show_clear_button),
32+
show_filter_button: bool.cast(show_filter_button),
33+
show_quick_filter: bool.cast(show_quick_filter),
34+
show_action_button: bool.cast(show_action_button),
35+
collapsed_search: bool.cast(collapsed_search),
3536
text: text,
3637
value: value})
3738
end
@@ -42,7 +43,6 @@ def default
4243
component.with_filter_input(name: "filter", label: "Filter")
4344
component.with_filter_button do |button|
4445
button.with_trailing_visual_counter(count: "15")
45-
"Filter"
4646
end
4747

4848
component.with_action_button(leading_icon: :plus, label: "Create", scheme: :primary) do
@@ -93,11 +93,11 @@ def segmented_control
9393
end
9494
end
9595

96-
# @label With collapsed search
97-
def collapsed_search
98-
render(Primer::OpenProject::SubHeader.new(collapsed_search: true)) do |component|
96+
# @label With expanded search
97+
def expanded_search
98+
render(Primer::OpenProject::SubHeader.new(collapsed_search: false)) do |component|
9999
component.with_filter_input(name: "filter", label: "Filter")
100-
component.with_filter_button do |button|
100+
component.with_filter_button(scheme: :default) do |button|
101101
button.with_trailing_visual_counter(count: "15")
102102
"Filter"
103103
end

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
@@ -1,7 +1,7 @@
1-
<%= render(Primer::OpenProject::SubHeader.new(collapsed_search: true)) do |component|
1+
<%= render(Primer::OpenProject::SubHeader.new) do |component|
22
component.with_filter_input(name: "filter", label: "Filter")
33

4-
component.with_filter_button(mobile_label: "All filters") do
4+
component.with_filter_button do
55
"All filters"
66
end
77

test/components/primer/open_project/sub_header_test.rb

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,14 @@ def test_renders_an_icon_filter_button
137137
assert_selector(".SubHeader-leftPane .Button--iconOnly .octicon-filter")
138138
end
139139

140+
def test_filter_button_uses_invisible_scheme
141+
render_inline(Primer::OpenProject::SubHeader.new) do |component|
142+
component.with_filter_button { "Filter" }
143+
end
144+
145+
assert_selector(".SubHeader .Button--invisible")
146+
end
147+
140148
def test_renders_a_custom_filter_button
141149
render_inline(Primer::OpenProject::SubHeader.new) do |component|
142150
component.with_filter_component do
@@ -229,8 +237,8 @@ def test_does_not_render_input_events_when_show_clear_button_is_not_set
229237
assert_no_selector(".FormControl-input-trailingAction[data-action=\"click:primer-text-field#clearContents\"]")
230238
end
231239

232-
def test_renders_collapsed_search
233-
render_inline(Primer::OpenProject::SubHeader.new(collapsed_search: true)) do |component|
240+
def test_renders_collapsed_search_per_default
241+
render_inline(Primer::OpenProject::SubHeader.new) do |component|
234242
component.with_filter_input(name: "filter", label: "Filter")
235243
end
236244

@@ -243,7 +251,7 @@ def test_renders_collapsed_search
243251
end
244252

245253
def test_collapsed_search_trigger_visible_on_all_screen_sizes
246-
render_inline(Primer::OpenProject::SubHeader.new(collapsed_search: true)) do |component|
254+
render_inline(Primer::OpenProject::SubHeader.new) do |component|
247255
component.with_filter_input(name: "filter", label: "Filter")
248256
end
249257

@@ -252,8 +260,8 @@ def test_collapsed_search_trigger_visible_on_all_screen_sizes
252260
assert_no_selector("[data-action='click:sub-header#expandFilterInput'].d-md-none")
253261
end
254262

255-
def test_default_search_trigger_hidden_on_desktop
256-
render_inline(Primer::OpenProject::SubHeader.new) do |component|
263+
def test_expanded_search_trigger_hidden_on_desktop
264+
render_inline(Primer::OpenProject::SubHeader.new(collapsed_search: false)) do |component|
257265
component.with_filter_input(name: "filter", label: "Filter")
258266
end
259267

@@ -387,4 +395,29 @@ def test_sort_and_group_are_not_hidden_on_mobile_when_multiple_quick_filters
387395
assert_no_selector(".d-none.d-md-flex .SortFilter")
388396
assert_no_selector(".d-none.d-md-flex .GroupFilter")
389397
end
398+
399+
def test_collapsed_search_auto_enabled_when_quick_filter_present
400+
render_inline(Primer::OpenProject::SubHeader.new) do |component|
401+
component.with_filter_input(name: "filter", label: "Filter")
402+
component.with_quick_filter { "<span class='MyQuickFilter'>Status</span>".html_safe }
403+
end
404+
405+
# Filter container is hidden (collapsed_search auto-detected as true)
406+
assert_selector(".SubHeader-filterContainer.d-none")
407+
assert_no_selector(".SubHeader-filterContainer.d-md-flex")
408+
# Trigger is visible on all screen sizes (no d-sm-none)
409+
assert_no_selector("[data-action='click:sub-header#expandFilterInput'].d-md-none")
410+
end
411+
412+
def test_explicit_collapsed_search_false_overrides_auto_collapse
413+
render_inline(Primer::OpenProject::SubHeader.new(collapsed_search: false)) do |component|
414+
component.with_filter_input(name: "filter", label: "Filter")
415+
component.with_quick_filter { "<span class='MyQuickFilter'>Status</span>".html_safe }
416+
end
417+
418+
# Filter container is NOT hidden despite quick_filter being present
419+
assert_selector(".SubHeader-filterContainer.d-md-flex")
420+
# Trigger is mobile-only (d-sm-none) since collapsed_search is false
421+
assert_selector("[data-action='click:sub-header#expandFilterInput'].d-md-none")
422+
end
390423
end

test/system/open_project/sub_header_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def render_clear_button_with_an_initial_value
1717
end
1818

1919
def test_clear_button_functionality
20-
visit_preview(:playground, show_clear_button: true)
20+
visit_preview(:playground, show_clear_button: true, collapsed_search: false)
2121
# no clear button with empty value
2222
assert_no_selector("button.FormControl-input-trailingAction")
2323

0 commit comments

Comments
 (0)