Skip to content

Commit 481fd59

Browse files
authored
Merge pull request #469 from opf/feature/op-19305-enforce-order-of-subheader-slots-quickfilters
[OP-19305] Enforce order of subheader slots/quickfilters
2 parents e862279 + b951013 commit 481fd59

13 files changed

Lines changed: 119 additions & 24 deletions

File tree

.changeset/empty-poets-occur.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+
Introduce specific slots for sort and group quick filters
2 Bytes
Loading

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

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

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

10+
<%= quick_sort %>
11+
<%= quick_group %>
1012
<% quick_filters.each do |quick_filter| %>
1113
<%= quick_filter %>
1214
<% end %>

app/components/primer/open_project/sub_header.rb

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -170,19 +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).
174-
# Hidden on smaller screens. Requires all_filters_button to be set when used.
173+
# A slot for a generic sorting component. Will be rendered next to the search input
174+
renders_one :quick_sort, lambda { |**kwargs|
175+
deny_tag_argument(**kwargs)
176+
177+
QuickActionComponent.new(**kwargs)
178+
}
179+
180+
# A slot for a generic sorting component. Will be rendered next to the sorting button
181+
renders_one :quick_group, lambda { |**kwargs|
182+
deny_tag_argument(**kwargs)
183+
184+
QuickActionComponent.new(**kwargs)
185+
}
186+
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`.
175189
# Supports ActionMenus, Buttons, IconButtons, SelectPanels, and SegmentedControls inside the block.
176190
renders_many :quick_filters, lambda { |**kwargs|
177191
deny_tag_argument(**kwargs)
178-
kwargs[:tag] = :div
179-
kwargs[:mr] ||= 2
180-
kwargs[:classes] = class_names(
181-
"SubHeader-hiddenOnExpand",
182-
kwargs[:classes]
183-
)
184192

185-
QuickFilter.new(**kwargs)
193+
QuickActionComponent.new(**kwargs)
186194
}
187195

188196
renders_one :segmented_control, lambda { |**system_arguments, &block|
@@ -238,12 +246,14 @@ def initialize(collapsed_search: false, **system_arguments)
238246
end
239247

240248
def before_render
249+
all_quick_actions = [quick_sort, quick_group].compact + quick_filters
250+
241251
if quick_filters.size > 1 && filter_button.nil?
242252
raise ArgumentError, "You must provide a filter_button when using quick_filters."
243253
end
244254

245255
if quick_filters.size > 5
246-
raise ArgumentError, "SubHeader supports a maximum of 5 quick_filters, got #{quick_filters.size}."
256+
raise ArgumentError, "SubHeader supports a maximum of 5 quick_filters, got #{all_quick_actions.size}."
247257
end
248258

249259
if quick_filters.size > 1
@@ -254,7 +264,7 @@ def before_render
254264

255265
@system_arguments[:classes] = class_names(
256266
@system_arguments[:classes],
257-
"SubHeader--emptyLeftPane" => !segmented_control? && !filter_button && !filter_input && quick_filters.empty?
267+
"SubHeader--emptyLeftPane" => !segmented_control? && !filter_button && !filter_input && all_quick_actions.empty?
258268
)
259269
end
260270

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: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@
55
"All filters"
66
end
77

8+
component.with_quick_sort do
9+
render(Primer::Beta::IconButton.new(icon: :"sort-desc", "aria-label": "Sort"))
10+
end
11+
12+
component.with_quick_group do
13+
render(Primer::Beta::IconButton.new(icon: :rows, "aria-label": "Group"))
14+
end
15+
816
component.with_quick_filter do
917
render(Primer::Alpha::SegmentedControl.new("aria-label": "File view")) do |component|
1018
component.with_item(label: "Monthly", selected: true)

static/arguments.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6600,10 +6600,10 @@
66006600
]
66016601
},
66026602
{
6603-
"component": "OpenProject::SubHeader::QuickFilter",
6603+
"component": "OpenProject::SubHeader::QuickActionComponent",
66046604
"status": "open_project",
66056605
"a11y_reviewed": false,
6606-
"short_name": "OpenProjectSubHeaderQuickFilter",
6606+
"short_name": "OpenProjectSubHeaderQuickActionComponent",
66076607
"source": "https://github.com/primer/view_components/tree/main/app/components/primer/open_project/sub_header/quick_filter.rb",
66086608
"lookbook": "https://primer.style/view-components/lookbook/inspect/primer/open_project/sub_header/quick_filter/default/",
66096609
"parameters": []

static/audited_at.json

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

static/constants.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1996,7 +1996,7 @@
19961996
"none"
19971997
],
19981998
"Menu": "Primer::OpenProject::SubHeader::Menu",
1999-
"QuickFilter": "Primer::OpenProject::SubHeader::QuickFilter",
1999+
"QuickActionComponent": "Primer::OpenProject::SubHeader::QuickActionComponent",
20002000
"SHOWN_FILTER_TARGET_SELECTOR": "sub-header.shownItemsOnExpandedFilter",
20012001
"SegmentedControl": "Primer::OpenProject::SubHeader::SegmentedControl"
20022002
},
@@ -2009,8 +2009,8 @@
20092009
"Primer::OpenProject::SubHeader::Menu": {
20102010
"GeneratedSlotMethods": "Primer::OpenProject::SubHeader::Menu::GeneratedSlotMethods"
20112011
},
2012-
"Primer::OpenProject::SubHeader::QuickFilter": {
2013-
"GeneratedSlotMethods": "Primer::OpenProject::SubHeader::QuickFilter::GeneratedSlotMethods"
2012+
"Primer::OpenProject::SubHeader::QuickActionComponent": {
2013+
"GeneratedSlotMethods": "Primer::OpenProject::SubHeader::QuickActionComponent::GeneratedSlotMethods"
20142014
},
20152015
"Primer::OpenProject::SubHeader::SegmentedControl": {
20162016
"GeneratedSlotMethods": "Primer::OpenProject::SubHeader::SegmentedControl::GeneratedSlotMethods"

static/info_arch.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22108,16 +22108,16 @@
2210822108
"subcomponents": []
2210922109
},
2211022110
{
22111-
"fully_qualified_name": "Primer::OpenProject::SubHeader::QuickFilter",
22111+
"fully_qualified_name": "Primer::OpenProject::SubHeader::QuickActionComponent",
2211222112
"description": "Thin wrapper for quick filter slots that defers BaseComponent construction to render time,\nallowing system arguments (e.g. display) to be mutated in before_render.\nDo not use standalone",
2211322113
"accessibility_docs": null,
2211422114
"is_form_component": false,
2211522115
"is_published": true,
2211622116
"requires_js": false,
22117-
"component": "OpenProject::SubHeader::QuickFilter",
22117+
"component": "OpenProject::SubHeader::QuickActionComponent",
2211822118
"status": "open_project",
2211922119
"a11y_reviewed": false,
22120-
"short_name": "OpenProjectSubHeaderQuickFilter",
22120+
"short_name": "OpenProjectSubHeaderQuickActionComponent",
2212122121
"source": "https://github.com/primer/view_components/tree/main/app/components/primer/open_project/sub_header/quick_filter.rb",
2212222122
"lookbook": "https://primer.style/view-components/lookbook/inspect/primer/open_project/sub_header/quick_filter/default/",
2212322123
"parameters": [],

0 commit comments

Comments
 (0)