Skip to content

Commit

Permalink
Cleanup for #60
Browse files Browse the repository at this point in the history
  • Loading branch information
jodosha committed Mar 7, 2016
1 parent 0dd5309 commit 4a885a6
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 20 deletions.
67 changes: 54 additions & 13 deletions lib/hanami/helpers/form_helper/form_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -769,38 +769,79 @@ def select(name, values, attributes = {})
# Datalist input
#
# @param name [Symbol] the input name
# @param values [Hash] a Hash to generate <tt><option></tt> tags of datalist.
# Keys correspond to <tt>value</tt> and values correspond to the content.
# @param values [Array,Hash] a collection that is transformed into <tt><option></tt> tags.
# @param list [String] the name of list for the text input, it's also the id of datalist
# @param attributes [Hash] HTML attributes to pass to the input tag
#
# @since 0.3.1
# @since x.x.x
#
# @example Basic usage
# @example Basic Usage
# <%=
# # ...
# values = Hash['it' => 'Italy', 'us' => 'United States']
# values = ['Italy', 'United States']
# datalist :stores, values, 'books'
# %>
#
# # Output:
# # <input type="text" name="book[store]" id="book-store" list="books">
# # <input type="text" name="book[store]" id="book-store" value="" list="books">
# # <datalist id="books">
# # <option value="Italy"></option>
# # <option value="United States"></option>
# # </datalist>
#
# @example Options As Hash
# <%=
# # ...
# values = Hash['Italy' => 'it', 'United States' => 'us']
# datalist :stores, values, 'books'
# %>
#
# # Output:
# # <input type="text" name="book[store]" id="book-store" value="" list="books">
# # <datalist id="books">
# # <option value="Italy">it</option>
# # <option value="United States">us</option>
# # </datalist>
#
# @example Specify Custom Attributes For Datalist Input
# <%=
# # ...
# values = ['Italy', 'United States']
# datalist :stores, values, 'books', datalist: { class: 'form-control' }
# %>
#
# # Output:
# # <input type="text" name="book[store]" id="book-store" value="" list="books">
# # <datalist id="books" class="form-control">
# # <option value="Italy"></option>
# # <option value="United States"></option>
# # </datalist>
#
# @example Specify Custom Attributes For Options List
# <%=
# # ...
# values = ['Italy', 'United States']
# datalist :stores, values, 'books', options: { class: 'form-control' }
# %>
#
# # Output:
# # <input type="text" name="book[store]" id="book-store" value="" list="books">
# # <datalist id="books">
# # <option value="Italy" class="form-control"></option>
# # <option value="United States" class="form-control"></option>
# # </datalist>
def datalist(name, values, list, attributes = {})
options = attributes.delete(:options) || {}
datalist = attributes.delete(:datalist) || {}
attributes = { type: 'text', name: _input_name(name), id: _input_id(name), list: list }.merge(attributes)
attrs = attributes.dup
options = attrs.delete(:options) || {}
datalist = attrs.delete(:datalist) || {}

# remove 'id' attribute
datalist = { id: list }.merge(datalist)
attrs[:list] = list
datalist[:id] = list

input(attributes)
text_field(name, attrs)
super(datalist) do
values.each do |value, content|
option(value, {value: content}.merge(options))
option(content, {value: value}.merge(options))
end
end
end
Expand Down
26 changes: 19 additions & 7 deletions test/form_helper_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1190,54 +1190,66 @@
end

describe "#datalist" do
let(:values) { Hash['it' => 'Italy', 'us' => 'United States'] }
let(:values) { ['Italy', 'United States'] }

it "renders" do
actual = view.form_for(:book, action) do
datalist :store, values, 'books'
end.to_s

actual.must_include %(<input type="text" name="book[store]" id="book-store" list="books">\n<datalist id="books">\n<option value="Italy">it</option>\n<option value="United States">us</option>\n</datalist>)
actual.must_include %(<input type="text" name="book[store]" id="book-store" value="" list="books">\n<datalist id="books">\n<option value="Italy"></option>\n<option value="United States"></option>\n</datalist>)
end

it "just allows to override 'id' attribute of the text input" do
actual = view.form_for(:book, action) do
datalist :store, values, 'books', id: 'store'
end.to_s

actual.must_include %(<input type="text" name="book[store]" id="store" list="books">\n<datalist id="books">\n<option value="Italy">it</option>\n<option value="United States">us</option>\n</datalist>)
actual.must_include %(<input type="text" name="book[store]" id="store" value="" list="books">\n<datalist id="books">\n<option value="Italy"></option>\n<option value="United States"></option>\n</datalist>)
end

it "allows to override 'name' attribute" do
actual = view.form_for(:book, action) do
datalist :store, values, 'books', name: 'store'
end.to_s

actual.must_include %(<input type="text" name="store" id="book-store" list="books">\n<datalist id="books">\n<option value="Italy">it</option>\n<option value="United States">us</option>\n</datalist>)
actual.must_include %(<input type="text" name="store" id="book-store" value="" list="books">\n<datalist id="books">\n<option value="Italy"></option>\n<option value="United States"></option>\n</datalist>)
end

it "allows to specify HTML attributes" do
actual = view.form_for(:book, action) do
datalist :store, values, 'books', class: 'form-control'
end.to_s

actual.must_include %(<input type="text" name="book[store]" id="book-store" list="books" class="form-control">\n<datalist id="books">\n<option value="Italy">it</option>\n<option value="United States">us</option>\n</datalist>)
actual.must_include %(<input type="text" name="book[store]" id="book-store" value="" class="form-control" list="books">\n<datalist id="books">\n<option value="Italy"></option>\n<option value="United States"></option>\n</datalist>)
end

it "allows to specify HTML attributes for options" do
actual = view.form_for(:book, action) do
datalist :store, values, 'books', options: { class: 'form-option' }
end.to_s

actual.must_include %(<input type="text" name="book[store]" id="book-store" list="books">\n<datalist id="books">\n<option value="Italy" class="form-option">it</option>\n<option value="United States" class="form-option">us</option>\n</datalist>)
actual.must_include %(<input type="text" name="book[store]" id="book-store" value="" list="books">\n<datalist id="books">\n<option value="Italy" class="form-option"></option>\n<option value="United States" class="form-option"></option>\n</datalist>)
end

it "allows to specify HTML attributes for datalist" do
actual = view.form_for(:book, action) do
datalist :store, values, 'books', datalist: { class: 'form-option' }
end.to_s

actual.must_include %(<input type="text" name="book[store]" id="book-store" list="books">\n<datalist id="books" class="form-option">\n<option value="Italy">it</option>\n<option value="United States">us</option>\n</datalist>)
actual.must_include %(<input type="text" name="book[store]" id="book-store" value="" list="books">\n<datalist class="form-option" id="books">\n<option value="Italy"></option>\n<option value="United States"></option>\n</datalist>)
end

describe "with a Hash of values" do
let(:values) { Hash['Italy' => 'it', 'United States' => 'us'] }

it "renders" do
actual = view.form_for(:book, action) do
datalist :store, values, 'books'
end.to_s

actual.must_include %(<input type="text" name="book[store]" id="book-store" value="" list="books">\n<datalist id="books">\n<option value="Italy">it</option>\n<option value="United States">us</option>\n</datalist>)
end
end
end
end

0 comments on commit 4a885a6

Please sign in to comment.