[chore] render filterable tree view in fieldset

Fieldset-style inputs never go through the `FormControl` wrapper, so the
legend needs the `FormControl-label` class applied by the component. The
input does not support validation for the time being.

Wrapper arguments stay on the fieldset, while the component-specific and
form arguments flow to the inner tree view.
This commit is contained in:
Alexander Brandon Coles
2026-06-08 09:48:09 +01:00
parent 0be3025f64
commit a3507d8883
8 changed files with 63 additions and 11 deletions
@@ -1 +1,2 @@
@import "advanced_form_group" @import "advanced_form_group"
@import "filterable_tree_view"
@@ -59,6 +59,10 @@ module Primer
true true
end end
# :nocov: # :nocov:
def supports_validation?
false
end
end end
end end
end end
@@ -1,7 +1,19 @@
<%= <div class="FormControl-filterable-tree-view-wrap">
render(FormControl.new(input: @input)) do <%= content_tag(:fieldset, **@fieldset_arguments) do %>
render(Primer::OpenProject::FilterableTreeView.new(**@input.input_arguments)) do |tree_view| <% if @input.label %>
@input.block&.call(tree_view) <%= content_tag(:legend, **@input.label_arguments) do %>
end <%= @input.label %>
end <% end %>
%> <% end %>
<div class="mb-2">
<%= render(Caption.new(input: @input)) %>
</div>
<%= render(SpacingWrapper.new) do %>
<%=
render(Primer::OpenProject::FilterableTreeView.new(**@tree_view_arguments)) do |tree_view|
@input.block&.call(tree_view)
end
%>
<% end %>
<% end %>
</div>
@@ -39,10 +39,18 @@ module Primer
super() super()
@input = input @input = input
@input.add_label_classes("FormControl-label")
@input.input_arguments[:form_arguments] = { @fieldset_arguments = @input.input_arguments.extract!(:hidden, :class, :classes)
name: @input.name, Primer::Forms::Utils.classify(@fieldset_arguments)
builder: builder @fieldset_arguments.delete(:class) if @fieldset_arguments[:class].blank?
@tree_view_arguments = {
**@input.input_arguments,
form_arguments: {
name: @input.name,
builder: builder
}
} }
end end
end end
@@ -0,0 +1,5 @@
.FormControl-filterable-tree-view-wrap
& fieldset
padding: 0
margin: 0
border: 0
@@ -37,6 +37,7 @@ module Wikis
f.filterable_tree_view( f.filterable_tree_view(
name: "wiki_page_selection", name: "wiki_page_selection",
label: I18n.t("wikis.link_existing_wiki_page_form.label"),
src: helpers.search_wiki_pages_path(provider_id: model.provider_id, name: "wiki_page_selection"), src: helpers.search_wiki_pages_path(provider_id: model.provider_id, name: "wiki_page_selection"),
filter_mode_control_arguments: { hidden: true }, filter_mode_control_arguments: { hidden: true },
filter_input_arguments: { filter_input_arguments: {
+1
View File
@@ -151,6 +151,7 @@ en:
link_existing_wiki_page_dialog: link_existing_wiki_page_dialog:
title: Add existing wiki page title: Add existing wiki page
link_existing_wiki_page_form: link_existing_wiki_page_form:
label: Wiki page
no_results: No wiki pages found no_results: No wiki pages found
placeholder: Search for a wiki page placeholder: Search for a wiki page
oauth_login_component: oauth_login_component:
@@ -41,7 +41,7 @@ RSpec.describe Primer::OpenProject::Forms::FilterableTreeView, type: :forms do
render_in_view_context(model, params) do |model, params| render_in_view_context(model, params) do |model, params|
primer_form_with(url: "/foo", model:) do |f| primer_form_with(url: "/foo", model:) do |f|
render_inline_form(f) do |form| render_inline_form(f) do |form|
form.filterable_tree_view(name: :ingredients, **params) do |tree| form.filterable_tree_view(name: :ingredients, label: "Ingredients", **params) do |tree|
tree.with_leaf(select_variant: :multiple, label: "flour") tree.with_leaf(select_variant: :multiple, label: "flour")
tree.with_leaf(select_variant: :multiple, label: "sugar") tree.with_leaf(select_variant: :multiple, label: "sugar")
tree.with_leaf(select_variant: :multiple, label: "eggs") tree.with_leaf(select_variant: :multiple, label: "eggs")
@@ -60,10 +60,30 @@ RSpec.describe Primer::OpenProject::Forms::FilterableTreeView, type: :forms do
expect(rendered_form).to have_element :"filterable-tree-view" expect(rendered_form).to have_element :"filterable-tree-view"
end end
it "renders the fieldset" do
expect(rendered_form).to have_selector :fieldset, "Ingredients"
end
it "renders the label as the fieldset legend" do
expect(rendered_form).to have_element :legend, class: "FormControl-label", text: "Ingredients"
end
it "renders the leafs", :aggregate_failures do it "renders the leafs", :aggregate_failures do
expect(rendered_form).to have_element(:li, class: "TreeViewItem", role: "none", text: "flour") expect(rendered_form).to have_element(:li, class: "TreeViewItem", role: "none", text: "flour")
expect(rendered_form).to have_element(:li, class: "TreeViewItem", role: "none", text: "sugar") expect(rendered_form).to have_element(:li, class: "TreeViewItem", role: "none", text: "sugar")
expect(rendered_form).to have_element(:li, class: "TreeViewItem", role: "none", text: "eggs") expect(rendered_form).to have_element(:li, class: "TreeViewItem", role: "none", text: "eggs")
end end
it "wires the tree view up for form submission" do
expect(rendered_form).to have_element :input, type: "hidden", name: "comment[ingredients][]", visible: :all
end
context "when hidden" do
let(:params) { { hidden: true } }
it "hides the whole fieldset" do
expect(rendered_form).to have_selector :fieldset, visible: :hidden
end
end
end end
end end