Class: Repor::Serializers::FormFieldSerializer

Inherits:
BaseSerializer show all
Includes:
ActionView::Helpers::FormOptionsHelper, ActionView::Helpers::FormTagHelper
Defined in:
lib/repor/serializers/form_field_serializer.rb

Instance Attribute Summary

Attributes inherited from BaseSerializer

#report

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from BaseSerializer

#axis_summary, #filter_summary, #human_aggregator_label, #human_aggregator_value_label, #human_category_value_label, #human_dimension_label, #human_dimension_value_label, #human_number_value_label, #human_time_value_label, #initialize, #record_type, #time_formats

Constructor Details

This class inherits a constructor from Repor::Serializers::BaseSerializer

Class Method Details

.deep_deblank(hash, depth = 0) ⇒ Object



11
12
13
14
15
16
17
18
19
20
# File 'lib/repor/serializers/form_field_serializer.rb', line 11

def self.deep_deblank(hash, depth = 0)
  raise "very deep hash or, more likely, internal error" if depth > 100
  hash.delete_if do |key, value|
    case value
    when Hash then deep_deblank(value, depth + 1)
    when Array then value.select!(&:present?)
    else value
    end.blank?
  end
end

.sanitize_params(hash) ⇒ Object



7
8
9
# File 'lib/repor/serializers/form_field_serializer.rb', line 7

def self.sanitize_params(hash)
  deep_deblank(hash.deep_dup)
end

Instance Method Details

#aggregator_fieldObject



37
38
39
40
# File 'lib/repor/serializers/form_field_serializer.rb', line 37

def aggregator_field
  select_tag("#{prefix}[aggregator]",
    options_for_select(aggregator_options, report.aggregator_name))
end

#aggregator_optionsObject



29
30
31
# File 'lib/repor/serializers/form_field_serializer.rb', line 29

def aggregator_options
  @agg_opts ||= report.aggregators.map { |name, agg| [human_aggregator_label(agg), name] }
end

#axis_fieldsObject



52
53
54
55
56
57
58
59
# File 'lib/repor/serializers/form_field_serializer.rb', line 52

def axis_fields
  "<div class='#{axis_fields_class}'>
    Show me #{aggregator_field}
    by #{primary_grouper_field}
    and #{secondary_grouper_field}
    for
  </div>".html_safe
end

#axis_fields_classObject



119
120
121
# File 'lib/repor/serializers/form_field_serializer.rb', line 119

def axis_fields_class
  'repor-axis-fields'
end

#bin_dimension_field(dimension) ⇒ Object



85
86
87
88
89
90
91
# File 'lib/repor/serializers/form_field_serializer.rb', line 85

def bin_dimension_field(dimension)
  fields_for(dimension) do
    fields = "#{bin_min_field(dimension)} to #{bin_max_field(dimension)}"
    fields += " by #{bin_step_field(dimension)}" if dimension.grouping?
    fields
  end
end

#bin_max_field(dimension) ⇒ Object



98
99
100
101
# File 'lib/repor/serializers/form_field_serializer.rb', line 98

def bin_max_field(dimension)
  text_field_tag("#{prefix_for(dimension)}[only][max]",
    dimension.filter_max, placeholder: bin_max_placeholder(dimension))
end

#bin_max_placeholder(dimension) ⇒ Object



129
# File 'lib/repor/serializers/form_field_serializer.rb', line 129

def bin_max_placeholder(dimension); 'max'; end

#bin_min_field(dimension) ⇒ Object



93
94
95
96
# File 'lib/repor/serializers/form_field_serializer.rb', line 93

def bin_min_field(dimension)
  text_field_tag("#{prefix_for(dimension)}[only][min]",
    dimension.filter_min, placeholder: bin_min_placeholder(dimension))
end

#bin_min_placeholder(dimension) ⇒ Object



130
# File 'lib/repor/serializers/form_field_serializer.rb', line 130

def bin_min_placeholder(dimension); 'min'; end

#bin_step_field(dimension) ⇒ Object



103
104
105
106
# File 'lib/repor/serializers/form_field_serializer.rb', line 103

def bin_step_field(dimension)
  text_field_tag("#{prefix_for(dimension)}[bin_width]",
    dimension.params[:bin_width], placeholder: bin_step_placeholder(dimension))
end

#bin_step_placeholder(dimension) ⇒ Object



131
132
133
# File 'lib/repor/serializers/form_field_serializer.rb', line 131

def bin_step_placeholder(dimension)
  dimension.bin_width.inspect
end

#category_dimension_field(dimension) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/repor/serializers/form_field_serializer.rb', line 72

def category_dimension_field(dimension)
  options = [[nil, nil]]
  dimension.all_values.each do |value|
    next if value.nil?
    options << [human_dimension_value_label(dimension, value), value]
  end

  fields_for(dimension) do
    select_tag("#{prefix_for(dimension)}[only]",
      options_for_select(options, dimension.filter_values.first))
  end
end

#css_class(s) ⇒ Object



143
144
145
# File 'lib/repor/serializers/form_field_serializer.rb', line 143

def css_class(s)
  s.to_s.demodulize.underscore.dasherize
end

#dimension_fieldsObject



61
62
63
# File 'lib/repor/serializers/form_field_serializer.rb', line 61

def dimension_fields
  report.dimensions.map { |name, dimension| field_for(dimension) }.compact
end

#dimension_fields_class(dimension) ⇒ Object



123
124
125
126
127
# File 'lib/repor/serializers/form_field_serializer.rb', line 123

def dimension_fields_class(dimension)
  ['repor-dimension-fields',
   "repor-dimension-fields--#{css_class(dimension.name)}",
   "repor-dimension-fields--#{css_class(dimension.class.name)}"].join(' ')
end

#dimension_optionsObject



33
34
35
# File 'lib/repor/serializers/form_field_serializer.rb', line 33

def dimension_options
  @dim_opts ||= report.dimensions.map { |name, dim| [human_dimension_label(dim), name] }
end

#field_for(dimension) ⇒ Object



65
66
67
68
69
70
# File 'lib/repor/serializers/form_field_serializer.rb', line 65

def field_for(dimension)
  case dimension
  when Repor::Dimensions::CategoryDimension then category_dimension_field(dimension)
  when Repor::Dimensions::BinDimension then bin_dimension_field(dimension)
  end
end

#fields_for(dimension, &block) ⇒ Object



108
109
110
111
112
113
# File 'lib/repor/serializers/form_field_serializer.rb', line 108

def fields_for(dimension, &block)
  "<fieldset class='#{dimension_fields_class(dimension)}'>
    <legend>#{human_dimension_label(dimension)}</legend>
    #{yield}
  </fieldset>".html_safe
end

#html_fieldsObject



22
23
24
25
26
27
# File 'lib/repor/serializers/form_field_serializer.rb', line 22

def html_fields
  "<div class='#{wrapper_class}'>
    #{axis_fields}
    #{dimension_fields.join}
  </div>".html_safe
end

#prefixObject



135
136
137
# File 'lib/repor/serializers/form_field_serializer.rb', line 135

def prefix
  report.class.name.underscore
end

#prefix_for(dimension) ⇒ Object



139
140
141
# File 'lib/repor/serializers/form_field_serializer.rb', line 139

def prefix_for(dimension)
  "#{prefix}[dimensions][#{dimension.name}]"
end

#primary_grouper_fieldObject



42
43
44
45
# File 'lib/repor/serializers/form_field_serializer.rb', line 42

def primary_grouper_field
  select_tag("#{prefix}[groupers][0]",
    options_for_select(dimension_options, report.grouper_names[0]))
end

#secondary_grouper_fieldObject



47
48
49
50
# File 'lib/repor/serializers/form_field_serializer.rb', line 47

def secondary_grouper_field
  select_tag("#{prefix}[groupers][1]",
    options_for_select([[nil, nil]]+dimension_options, report.grouper_names[1]))
end

#wrapper_classObject



115
116
117
# File 'lib/repor/serializers/form_field_serializer.rb', line 115

def wrapper_class
  "repor-fields repor-fields--#{css_class(report.class.name)}"
end