@@ -297,6 +297,21 @@ defmodule Phoenix.HTML.Form do
297297 #=> <option>France</option>
298298 #=> </optgroup>
299299
300+ Horizontal separators can be added:
301+
302+ options_for_select(["Admin", "User", :hr, "New"], nil)
303+ #=> <option>Admin</option>
304+ #=> <option>User</option>
305+ #=> <hr/>
306+ #=> <option>New</option>
307+
308+ options_for_select(["Admin": "admin", "User": "user", hr: nil, "New": "new"], nil)
309+ #=> <option value="admin" selected>Admin</option>
310+ #=> <option value="user">User</option>
311+ #=> <hr/>
312+ #=> <option value="new">New</option>
313+
314+
300315 """
301316 def options_for_select ( options , selected_values ) do
302317 { :safe ,
@@ -308,6 +323,9 @@ defmodule Phoenix.HTML.Form do
308323
309324 defp escaped_options_for_select ( options , selected_values ) do
310325 Enum . reduce ( options , [ ] , fn
326+ { :hr , nil } , acc ->
327+ [ acc | hr_tag ( ) ]
328+
311329 { option_key , option_value } , acc ->
312330 [ acc | option ( option_key , option_value , [ ] , selected_values ) ]
313331
@@ -326,6 +344,9 @@ defmodule Phoenix.HTML.Form do
326344
327345 [ acc | option ( option_key , option_value , options , selected_values ) ]
328346
347+ :hr , acc ->
348+ [ acc | hr_tag ( ) ]
349+
329350 option , acc ->
330351 [ acc | option ( option , option , [ ] , selected_values ) ]
331352 end )
@@ -349,6 +370,10 @@ defmodule Phoenix.HTML.Form do
349370 [ ?< , name , attrs , ?> , body , ?< , ?/ , name , ?> ]
350371 end
351372
373+ defp hr_tag ( ) do
374+ [ ?< , "hr" , ?/ , ?> ]
375+ end
376+
352377 # Helper for getting field errors, handling string fields
353378 defp field_errors ( errors , field )
354379 when is_list ( errors ) and ( is_atom ( field ) or is_binary ( field ) ) do
0 commit comments