Merge pull request #382 from semaperepelitsa/grouped_collection
Grouped collection input Conflicts: test/inputs_test.rb
This commit is contained in:
parent
0e448b0a25
commit
e68094e652
|
@ -20,6 +20,7 @@ module SimpleForm
|
|||
map_type :integer, :decimal, :float, :to => SimpleForm::Inputs::NumericInput
|
||||
map_type :range, :to => SimpleForm::Inputs::RangeInput
|
||||
map_type :select, :radio, :check_boxes, :to => SimpleForm::Inputs::CollectionInput
|
||||
map_type :grouped_select, :to => SimpleForm::Inputs::GroupedCollectionInput
|
||||
map_type :date, :time, :datetime, :to => SimpleForm::Inputs::DateTimeInput
|
||||
map_type :country, :time_zone, :to => SimpleForm::Inputs::PriorityInput
|
||||
map_type :boolean, :to => SimpleForm::Inputs::BooleanInput
|
||||
|
|
|
@ -4,6 +4,7 @@ module SimpleForm
|
|||
autoload :BlockInput, 'simple_form/inputs/block_input'
|
||||
autoload :BooleanInput, 'simple_form/inputs/boolean_input'
|
||||
autoload :CollectionInput, 'simple_form/inputs/collection_input'
|
||||
autoload :GroupedCollectionInput, 'simple_form/inputs/grouped_collection_input'
|
||||
autoload :DateTimeInput, 'simple_form/inputs/date_time_input'
|
||||
autoload :FileInput, 'simple_form/inputs/file_input'
|
||||
autoload :HiddenInput, 'simple_form/inputs/hidden_input'
|
||||
|
|
|
@ -65,9 +65,7 @@ module SimpleForm
|
|||
[label, value]
|
||||
end
|
||||
|
||||
def detect_common_display_methods
|
||||
collection_classes = detect_collection_classes
|
||||
|
||||
def detect_common_display_methods(collection_classes = detect_collection_classes)
|
||||
if collection_classes.include?(Array)
|
||||
{ :label => :first, :value => :last }
|
||||
elsif collection_includes_basic_objects?(collection_classes)
|
||||
|
@ -80,8 +78,8 @@ module SimpleForm
|
|||
end
|
||||
end
|
||||
|
||||
def detect_collection_classes
|
||||
collection.map { |e| e.class }.uniq
|
||||
def detect_collection_classes(some_collection = collection)
|
||||
some_collection.map { |e| e.class }.uniq
|
||||
end
|
||||
|
||||
def collection_includes_basic_objects?(collection_classes)
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
module SimpleForm
|
||||
module Inputs
|
||||
class GroupedCollectionInput < CollectionInput
|
||||
def input
|
||||
label_method, value_method = detect_collection_methods
|
||||
@builder.grouped_collection_select(attribute_name, group_collection,
|
||||
group_method, group_label_method, value_method, label_method,
|
||||
input_options, input_html_options)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def group_collection
|
||||
@group_collection ||= options.delete(:collection)
|
||||
end
|
||||
|
||||
# Sample collection
|
||||
def collection
|
||||
@collection ||= group_collection.first.try(:send, group_method)
|
||||
end
|
||||
|
||||
def group_method
|
||||
@group_method ||= options.delete(:group_method)
|
||||
end
|
||||
|
||||
def group_label_method
|
||||
label = options.delete(:group_label_method)
|
||||
|
||||
unless label
|
||||
common_method_for = detect_common_display_methods( detect_collection_classes(group_collection) )
|
||||
label = common_method_for[:label]
|
||||
end
|
||||
|
||||
label
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,21 @@
|
|||
# encoding: UTF-8
|
||||
require 'test_helper'
|
||||
|
||||
class GroupedCollectionInputTest < ActionView::TestCase
|
||||
test 'input should have grouped options' do
|
||||
with_input_for @user, :name, :grouped_select,
|
||||
:collection => [['Authors', ['Jose', 'Carlos']], ['General', ['Bob', 'John']]],
|
||||
:group_method => :last
|
||||
assert_select 'select.grouped_select#user_name' do
|
||||
assert_select 'optgroup[label=Authors]' do
|
||||
assert_select 'option', 'Jose'
|
||||
assert_select 'option', 'Carlos'
|
||||
end
|
||||
|
||||
assert_select 'optgroup[label=General]' do
|
||||
assert_select 'option', 'Bob'
|
||||
assert_select 'option', 'John'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue