@@ -73,11 +73,12 @@ def datagrid_filter_input(attribute_or_filter, **options, &block)
7373 when :select
7474 select (
7575 filter . name ,
76- object . select_options ( filter ) || [ ] ,
76+ options . delete ( :select_choices ) || object . select_choices ( filter ) || [ ] ,
7777 {
7878 include_blank : filter . include_blank ,
7979 prompt : filter . prompt ,
8080 include_hidden : false ,
81+ **options . delete ( :select_options ) ,
8182 } ,
8283 multiple : filter . multiple? ,
8384 **options ,
@@ -97,7 +98,7 @@ def datagrid_filter_input(attribute_or_filter, **options, &block)
9798 protected
9899
99100 def datagrid_enum_checkboxes_filter ( filter , options = { } )
100- elements = object . select_options ( filter ) . map do |element |
101+ elements = object . select_choices ( filter ) . map do |element |
101102 text , value = @template . send ( :option_text_and_value , element )
102103 checked = enum_checkbox_checked? ( filter , value )
103104 [ value , text , checked ]
@@ -137,50 +138,55 @@ def enum_checkbox_checked?(filter, option_value)
137138 end
138139
139140 def datagrid_dynamic_filter ( filter , options = { } )
140- field , operation , value = object . filter_value ( filter )
141141 options = add_filter_options ( filter , **options )
142- field_input = dynamic_filter_select (
143- filter . name ,
144- object . select_options ( filter ) || [ ] ,
142+ field , operation , value = object . filter_value ( filter )
143+ field_options = datagrid_dynamic_field_options ( options : options , field : field , filter : filter )
144+ operation_options = datagrid_dynamic_operation_options ( options : options , operation : operation , filter : filter )
145+ value_options = datagrid_dynamic_value_options ( options : options , value : value , filter : filter )
146+ render_partial (
147+ "dynamic_filter" ,
148+ { filter : filter ,
149+ form : self ,
150+ field_options : field_options ,
151+ operation_options : operation_options ,
152+ value_options : value_options , } ,
153+ )
154+ end
155+
156+ def datagrid_dynamic_field_options ( options :, field :, filter :)
157+ options . merge (
145158 {
146- include_blank : filter . include_blank ,
147- prompt : filter . prompt ,
148- include_hidden : false ,
149- selected : field ,
159+ type : :select ,
160+ select_options : {
161+ selected : field ,
162+ } ,
163+ name : @template . field_name ( object_name , filter . name , "field" ) ,
150164 } ,
151- **add_html_classes ( options , "datagrid-dynamic-field" ) ,
152- name : @template . field_name ( object_name , filter . name , "field" ) ,
153165 )
154- operation_input = dynamic_filter_select (
155- filter . name , filter . operations_select ,
166+ end
167+
168+ def datagrid_dynamic_operation_options ( options :, operation :, filter :)
169+ options . merge (
156170 {
157- include_blank : false ,
158- include_hidden : false ,
159- prompt : false ,
160- selected : operation ,
171+ type : :select ,
172+ select_choices : filter . operations_select ,
173+ select_options : {
174+ include_blank : false ,
175+ prompt : false ,
176+ selected : operation ,
177+ } ,
178+ name : @template . field_name ( object_name , filter . name , "operation" ) ,
161179 } ,
162- **add_html_classes ( options , "datagrid-dynamic-operation" ) ,
163- name : @template . field_name ( object_name , filter . name , "operation" ) ,
164- )
165- value_input = datagrid_filter_input (
166- filter . name ,
167- **add_html_classes ( options , "datagrid-dynamic-value" ) ,
168- value : value ,
169- name : @template . field_name ( object_name , filter . name , "value" ) ,
170180 )
171- [ field_input , operation_input , value_input ] . join ( "\n " ) . html_safe
172181 end
173182
174- def dynamic_filter_select ( name , variants , select_options , html_options )
175- if variants . size <= 1
176- value = variants . first
177- # select options format may vary
178- value = value . last if value . is_a? ( Array )
179- # don't render any visible input when there is nothing to choose from
180- hidden_field ( name , **html_options , value : value )
181- else
182- select ( name , variants , select_options , html_options )
183- end
183+ def datagrid_dynamic_value_options ( options :, value :, filter :)
184+ options . merge (
185+ {
186+ value : value ,
187+ name : @template . field_name ( object_name , filter . name , "value" ) ,
188+ } ,
189+ )
184190 end
185191
186192 def datagrid_range_filter ( filter , options = { } )
@@ -205,10 +211,6 @@ def datagrid_get_filter(attribute_or_filter)
205211 raise ( ArgumentError , "Datagrid filter #{ attribute_or_filter } not found" )
206212 end
207213
208- def add_html_classes ( options , *classes )
209- Datagrid ::Utils . add_html_classes ( options , *classes )
210- end
211-
212214 def partial_path ( name )
213215 if ( partials = options [ :partials ] )
214216 partial_name = File . join ( partials , name )
0 commit comments