Skip to content

Commit

Permalink
Add :free_text as a shorthand for :name_when_new (#163)
Browse files Browse the repository at this point in the history
  • Loading branch information
josefarias authored May 4, 2024
1 parent ce2bfbb commit 2079d93
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 9 deletions.
15 changes: 12 additions & 3 deletions app/presenters/hotwire_combobox/component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ def initialize \
data: {},
dialog_label: nil,
form: nil,
free_text: false,
id: nil,
input: {},
label: nil,
Expand All @@ -26,9 +27,9 @@ def initialize \
options: [],
value: nil,
**rest
@view, @autocomplete, @id, @name, @value, @form, @async_src, @label,
@view, @autocomplete, @id, @name, @value, @form, @async_src, @label, @free_text,
@name_when_new, @open, @data, @mobile_at, @multiselect_chip_src, @options, @dialog_label =
view, autocomplete, id, name.to_s, value, form, async_src, label,
view, autocomplete, id, name.to_s, value, form, async_src, label, free_text,
name_when_new, open, data, mobile_at, multiselect_chip_src, options, dialog_label

@combobox_attrs = input.reverse_merge(rest).deep_symbolize_keys
Expand Down Expand Up @@ -189,9 +190,17 @@ def pagination_attrs

private
attr_reader :view, :autocomplete, :id, :name, :value, :form,
:name_when_new, :open, :data, :combobox_attrs, :mobile_at,
:free_text, :open, :data, :combobox_attrs, :mobile_at,
:association_name, :multiselect_chip_src

def name_when_new
if free_text && @name_when_new.blank?
hidden_field_name
else
@name_when_new
end
end

def name_when_new_on_multiselect_must_match_original_name
return unless multiselect? && name_when_new.present?

Expand Down
18 changes: 15 additions & 3 deletions test/dummy/app/views/comboboxes/multiselect_new_values.html.erb
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@
<%= tag.style nonce: content_security_policy_nonce do %>
form {
display: flex;
flex-direction: column;
gap: 1rem;
}

input[type="submit"] {
padding: 0.5rem;
}
<% end %>

<% if flash[:notice] %>
<p><%= flash[:notice] %></p>
<% end %>

<%= form_with model: @user, url: user_visits_url(@user), method: :post, html: { style: "display: flex; flex-direction: column; gap: 1rem;" } do |form| %>
<%= form_with model: @user, url: user_visits_url(@user), method: :post do |form| %>
<%= combobox_tag "user[visited_states]",
State.all,
id: "states-field",
label: "Visited states (new allowed)",
multiselect_chip_src: possibly_new_state_chips_path,
name_when_new: "user[visited_states]" %>
<%= form.submit style: "padding: 0.5rem;" %>
free_text: true %>
<%= form.submit %>
<% end %>
Original file line number Diff line number Diff line change
@@ -1,8 +1,20 @@
<%= tag.style nonce: content_security_policy_nonce do %>
form {
display: flex;
flex-direction: column;
gap: 1rem;
}

input[type="submit"] {
padding: 0.5rem;
}
<% end %>

<% if flash[:notice] %>
<p><%= flash[:notice] %></p>
<% end %>

<%= form_with model: @user, html: { style: "display: flex; flex-direction: column; gap: 1rem;" } do |form| %>
<%= form_with model: @user do |form| %>
<%= form.combobox :visited_state_ids, State.all, label: "Visited states", multiselect_chip_src: state_chips_path %>
<%= form.submit style: "padding: 0.5rem;" %>
<%= form.submit %>
<% end %>
2 changes: 1 addition & 1 deletion test/dummy/app/views/comboboxes/new_options.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@
<%= form.submit %>
<% end %>

<%= combobox_tag :movie, movies_path, name_when_new: :new_movie, id: "movie-field", style: "width: 13rem;" %>
<%= combobox_tag :movie, movies_path, name_when_new: :new_movie, id: "movie-field" %>
15 changes: 15 additions & 0 deletions test/helpers/hotwire_combobox/helper_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,24 @@ class HotwireCombobox::HelperTest < ApplicationViewTestCase

assert_nothing_raised do
combobox_tag :foo, multiselect_chip_src: "some_path", name_when_new: :foo
combobox_tag :foo, multiselect_chip_src: "some_path", free_text: true
end
end

test "free_text is a shortcut for name_when_new" do
tag = combobox_tag :foo, free_text: true
assert_attrs tag, tag_name: "fieldset", "data-hw-combobox-name-when-new-value": "foo"

tag = combobox_tag :foo, free_text: true, name_when_new: nil
assert_attrs tag, tag_name: "fieldset", "data-hw-combobox-name-when-new-value": "foo"

tag = combobox_tag :foo, free_text: true, name_when_new: :bar
assert_attrs tag, tag_name: "fieldset", "data-hw-combobox-name-when-new-value": "bar"

tag = combobox_tag :foo, free_text: false, name_when_new: :bar
assert_attrs tag, tag_name: "fieldset", "data-hw-combobox-name-when-new-value": "bar"
end

test "hw_paginated_combobox_options includes existing params in the default next page src, but excludes transient params" do
request.expects(:path).returns("/foo")
request.expects(:query_parameters).returns({ bar: "baz", qux: "quux", page: "1000", input_type: "insertText" }.with_indifferent_access)
Expand Down

0 comments on commit 2079d93

Please sign in to comment.