Skip to content
Browse files

Merge pull request #382 from semaperepelitsa/grouped_collection

Grouped collection input
  • Loading branch information...
2 parents 9ff998f + ab7cd70 commit 5b2f0676f6fbd525159f3ec01305a72a504adc07 @carlosantoniodasilva carlosantoniodasilva committed Jan 24, 2012
View
1 lib/simple_form/form_builder.rb
@@ -12,6 +12,7 @@ class FormBuilder < ActionView::Helpers::FormBuilder
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
View
27 lib/simple_form/inputs.rb
@@ -1,17 +1,18 @@
module SimpleForm
module Inputs
- autoload :Base, 'simple_form/inputs/base'
- autoload :BlockInput, 'simple_form/inputs/block_input'
- autoload :BooleanInput, 'simple_form/inputs/boolean_input'
- autoload :CollectionInput, 'simple_form/inputs/collection_input'
- autoload :DateTimeInput, 'simple_form/inputs/date_time_input'
- autoload :FileInput, 'simple_form/inputs/file_input'
- autoload :HiddenInput, 'simple_form/inputs/hidden_input'
- autoload :NumericInput, 'simple_form/inputs/numeric_input'
- autoload :PasswordInput, 'simple_form/inputs/password_input'
- autoload :PriorityInput, 'simple_form/inputs/priority_input'
- autoload :RangeInput, 'simple_form/inputs/range_input'
- autoload :StringInput, 'simple_form/inputs/string_input'
- autoload :TextInput, 'simple_form/inputs/text_input'
+ autoload :Base, 'simple_form/inputs/base'
+ 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'
+ autoload :NumericInput, 'simple_form/inputs/numeric_input'
+ autoload :PasswordInput, 'simple_form/inputs/password_input'
+ autoload :PriorityInput, 'simple_form/inputs/priority_input'
+ autoload :RangeInput, 'simple_form/inputs/range_input'
+ autoload :StringInput, 'simple_form/inputs/string_input'
+ autoload :TextInput, 'simple_form/inputs/text_input'
end
end
View
8 lib/simple_form/inputs/collection_input.rb
@@ -58,9 +58,7 @@ def detect_collection_methods
[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)
@@ -73,8 +71,8 @@ def detect_common_display_methods
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)
View
38 lib/simple_form/inputs/grouped_collection_input.rb
@@ -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
View
18 test/inputs_test.rb
@@ -976,6 +976,24 @@ def with_input_for(object, attribute_name, type, options={})
assert_no_select 'select[required]'
end
+ # GroupedCollectionInput
+ 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
+
# With no object
test 'input should be generated properly when object is not present' do
with_input_for :project, :name, :string

0 comments on commit 5b2f067

Please sign in to comment.
Something went wrong with that request. Please try again.