Skip to content

Commit

Permalink
Prepare internals for input type customization
Browse files Browse the repository at this point in the history
  • Loading branch information
bogdan committed Nov 13, 2023
1 parent 0b297b8 commit eeb0fae
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 29 deletions.
4 changes: 2 additions & 2 deletions app/views/datagrid/_range_filter.html.erb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
<%= form.text_field(filter.name, from_options) %>
<%= form.datagrid_filter_input(filter, **from_options) %>
<span class="separator <%= filter.type %>"><%= I18n.t('datagrid.filters.range.separator') %></span>
<%= form.text_field(filter.name, to_options) %>
<%= form.datagrid_filter_input(filter, **to_options) %>
1 change: 1 addition & 0 deletions lib/datagrid/filters/base_filter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ class Datagrid::FilteringError < StandardError
# @!visibility private
class Datagrid::Filters::BaseFilter

class_attribute :input_helper_name, instance_writer: false
attr_accessor :grid_class, :options, :block, :name

def initialize(grid_class, name, options = {}, &block)
Expand Down
30 changes: 17 additions & 13 deletions lib/datagrid/form_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,12 @@ module FormBuilder
# * <tt>select</tt> for enum, xboolean filter types
# * <tt>check_box</tt> for boolean filter type
# * <tt>text_field</tt> for other filter types
def datagrid_filter(filter_or_attribute, options = {}, &block)
def datagrid_filter(filter_or_attribute, partials: nil, **options, &block)
filter = datagrid_get_filter(filter_or_attribute)
options = {
**filter.input_options,
**add_html_classes(options, filter.name, datagrid_filter_html_class(filter)),
}
# Prevent partials option from appearing in HTML attributes
options.delete(:partials) # Legacy option
self.send(filter.form_builder_helper_name, filter, options, &block)
end

Expand All @@ -28,6 +26,11 @@ def datagrid_label(filter_or_attribute, text = nil, **options, &block)
label(filter.name, text || filter.header, **filter.label_options, **options, &block)
end

def datagrid_filter_input(attribute_or_filter, **options)
filter = datagrid_get_filter(attribute_or_filter)
text_field filter.name, value: object.filter_value_as_string(filter), **options
end

protected
def datagrid_extended_boolean_filter(attribute_or_filter, options = {})
datagrid_enum_filter(attribute_or_filter, options)
Expand All @@ -46,23 +49,21 @@ def datagrid_date_time_filter(attribute_or_filter, options = {})
end

def datagrid_default_filter(attribute_or_filter, options = {})
filter = datagrid_get_filter(attribute_or_filter)
text_field filter.name, value: object.filter_value_as_string(filter), **options
datagrid_filter_input(attribute_or_filter, **options)
end

def datagrid_enum_filter(attribute_or_filter, options = {}, &block)
filter = datagrid_get_filter(attribute_or_filter)
if filter.checkboxes?
partial = partial_path('enum_checkboxes')
options = add_html_classes(options, 'checkboxes')
elements = object.select_options(filter).map do |element|
text, value = @template.send(:option_text_and_value, element)
checked = enum_checkbox_checked?(filter, value)
[value, text, checked]
end
@template.render(
partial: partial,
locals: {
render_partial(
'enum_checkboxes',
{
elements: elements,
form: self,
filter: filter,
Expand Down Expand Up @@ -149,15 +150,14 @@ def dynamic_filter_select(name, variants, select_options, html_options)
def datagrid_range_filter(type, attribute_or_filter, options = {})
filter = datagrid_get_filter(attribute_or_filter)
if filter.range?
partial = partial_path('range_filter')
options = options.merge(multiple: true)
from_options = datagrid_range_filter_options(object, filter, :from, options)
to_options = datagrid_range_filter_options(object, filter, :to, options)
@template.render partial: partial, locals: {
render_partial 'range_filter', {
from_options: from_options, to_options: to_options, filter: filter, form: self
}
else
datagrid_default_filter(filter, options)
datagrid_filter_input(filter, **options)
end
end

Expand All @@ -180,7 +180,7 @@ def datagrid_range_filter_options(object, filter, type, options)
end

def datagrid_string_filter(attribute_or_filter, options = {})
datagrid_default_filter(attribute_or_filter, options)
datagrid_range_filter(:string, attribute_or_filter, options)
end

def datagrid_float_filter(attribute_or_filter, options = {})
Expand Down Expand Up @@ -219,6 +219,10 @@ def partial_path(name)
File.join('datagrid', name)
end

def render_partial(name, locals)
@template.render partial: partial_path(name), locals: locals
end

class Error < StandardError
end
end
Expand Down
28 changes: 14 additions & 14 deletions spec/datagrid/form_builder_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -112,16 +112,16 @@ class MyTemplate
let(:_filter_options) { {:id => "hello"} }
let(:_range) { [1,2]}
it { should equal_to_dom(
'<input id="from_hello" class="group_id integer_filter from" multiple value="1" type="text" name="report[group_id][]"/>' +
'<input value="1" id="from_hello" class="group_id integer_filter from" multiple type="text" name="report[group_id][]"/>' +
'<span class="separator integer"> - </span>' +
'<input id="to_hello" class="group_id integer_filter to" multiple value="2" type="text" name="report[group_id][]"/>'
'<input value="2" id="to_hello" class="group_id integer_filter to" multiple type="text" name="report[group_id][]"/>'
)}
end
context "with only left bound" do

let(:_range) { [10, nil]}
it { should equal_to_dom(
'<input class="group_id integer_filter from" multiple value="10" type="text" name="report[group_id][]"/>' +
'<input value="10" class="group_id integer_filter from" multiple type="text" name="report[group_id][]"/>' +
'<span class="separator integer"> - </span>' +
'<input class="group_id integer_filter to" multiple type="text" name="report[group_id][]"/>'
)}
Expand All @@ -132,17 +132,17 @@ class MyTemplate
it { should equal_to_dom(
'<input class="group_id integer_filter from" multiple type="text" name="report[group_id][]"/>' +
'<span class="separator integer"> - </span>' +
'<input class="group_id integer_filter to" multiple value="10" type="text" name="report[group_id][]"/>'
'<input value="10" class="group_id integer_filter to" multiple type="text" name="report[group_id][]"/>'
)}
it { should be_html_safe }
end

context "with invalid range value" do
let(:_range) { 2..1 }
it { should equal_to_dom(
'<input class="group_id integer_filter from" multiple value="1" type="text" name="report[group_id][]"/>' +
'<input value="1" class="group_id integer_filter from" multiple type="text" name="report[group_id][]"/>' +
'<span class="separator integer"> - </span>' +
'<input class="group_id integer_filter to" multiple value="2" type="text" name="report[group_id][]"/>'
'<input value="2" class="group_id integer_filter to" multiple type="text" name="report[group_id][]"/>'
)}
end

Expand Down Expand Up @@ -174,9 +174,9 @@ class MyTemplate
}
let(:_range) { [1.5,2.5]}
it { should equal_to_dom(
'<input class="rating float_filter from" multiple value="1.5" type="text" name="report[rating][]"/>' +
'<input value="1.5" class="rating float_filter from" multiple type="text" name="report[rating][]"/>' +
'<span class="separator float"> - </span>' +
'<input class="rating float_filter to" multiple value="2.5" type="text" name="report[rating][]"/>'
'<input value="2.5" class="rating float_filter to" multiple type="text" name="report[rating][]"/>'
)}
end

Expand All @@ -192,7 +192,7 @@ class MyTemplate

let(:_range) { ["2012-01-03", nil]}
it { should equal_to_dom(
'<input class="created_at date_filter from" multiple value="2012-01-03" type="text" name="report[created_at][]"/>' +
'<input value="2012-01-03" class="created_at date_filter from" multiple type="text" name="report[created_at][]"/>' +
'<span class="separator date"> - </span>' +
'<input class="created_at date_filter to" multiple type="text" name="report[created_at][]"/>'
)}
Expand All @@ -206,9 +206,9 @@ class MyTemplate
end
let(:_range) { ["2013/01/01", '2013/02/02']}
it { should equal_to_dom(
'<input class="created_at date_filter from" multiple value="01/01/2013" type="text" name="report[created_at][]"/>' +
'<input value="01/01/2013" class="created_at date_filter from" multiple type="text" name="report[created_at][]"/>' +
'<span class="separator date"> - </span>' +
'<input class="created_at date_filter to" multiple value="02/02/2013" type="text" name="report[created_at][]"/>'
'<input value="02/02/2013" class="created_at date_filter to" multiple type="text" name="report[created_at][]"/>'
)}
end
context "with only right bound" do
Expand All @@ -217,17 +217,17 @@ class MyTemplate
it { should equal_to_dom(
'<input class="created_at date_filter from" multiple type="text" name="report[created_at][]"/>' +
'<span class="separator date"> - </span>' +
'<input class="created_at date_filter to" multiple value="2012-01-03" type="text" name="report[created_at][]"/>'
'<input value="2012-01-03" class="created_at date_filter to" multiple type="text" name="report[created_at][]"/>'
)}
it { should be_html_safe }
end

context "with invalid range value" do
let(:_range) { Date.parse('2012-01-02')..Date.parse('2012-01-01') }
it { should equal_to_dom(
'<input class="created_at date_filter from" multiple value="2012-01-01" type="text" name="report[created_at][]"/>' +
'<input value="2012-01-01" class="created_at date_filter from" multiple type="text" name="report[created_at][]"/>' +
'<span class="separator date"> - </span>' +
'<input class="created_at date_filter to" multiple value="2012-01-02" type="text" name="report[created_at][]"/>'
'<input value="2012-01-02" class="created_at date_filter to" multiple type="text" name="report[created_at][]"/>'
)}
end
context "with blank range value" do
Expand Down

0 comments on commit eeb0fae

Please # to comment.