Class: MuckEngine::FormBuilder

Inherits:
ActionView::Helpers::FormBuilder
  • Object
show all
Defined in:
lib/muck-engine/form_builder.rb

Instance Method Summary collapse

Instance Method Details

#country_select(method, options = {}, html_options = {}, additional_country = nil) ⇒ Object

creates a select control with countries. Default id is ‘countries’. If ‘retain’ is passed for the class value the value of this control will be written into a cookie with the key ‘countries’.



158
159
160
161
# File 'lib/muck-engine/form_builder.rb', line 158

def country_select(method, options = {}, html_options = {}, additional_country = nil)
  @countries ||= (additional_country ? [additional_country] : []) + Country.find(:all, :order => 'sort, name asc')
  self.menu_select(method, I18n.t('muck.engine.choose_country'), @countries, options.merge(:prompt => I18n.t('muck.engine.select_country_prompt'), :wrapper_id => 'countries-container'), html_options.merge(:id => 'countries'))
end

#get_instance_object_value(field_name) ⇒ Object



170
171
172
173
# File 'lib/muck-engine/form_builder.rb', line 170

def get_instance_object_value(field_name)
  obj = object || @template.instance_variable_get("@#{@object_name}")
  obj.send(field_name) rescue nil
end

#language_select(method, options = {}, html_options = {}, additional_language = nil) ⇒ Object

creates a select control with languages. Default id is ‘languages’. If ‘retain’ is passed for the class value the value of this control will be written into a cookie with the key ‘languages’.



165
166
167
168
# File 'lib/muck-engine/form_builder.rb', line 165

def language_select(method, options = {}, html_options = {}, additional_language = nil)
  @languages ||= (additional_language ? [additional_language] : []) + Language.find(:all, :order => 'name asc')
  self.menu_select(method, I18n.t('muck.engine.choose_language'), @languages, options.merge(:prompt => I18n.t('muck.engine.select_language_prompt'), :wrapper_id => 'languages-container'), html_options.merge(:id => 'languages'))
end


175
176
177
# File 'lib/muck-engine/form_builder.rb', line 175

def menu_select(method, label, collection, options = {}, html_options = {})
  muck_select(method, :id, :name, label, collection, options, html_options)
end

#muck_select(method, value_method, name_method, label, collection, options = {}, html_options = {}) ⇒ Object



179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/muck-engine/form_builder.rb', line 179

def muck_select(method, value_method, name_method, label, collection, options = {}, html_options = {})

  # this code will look for a cookie that matches the control and set the value to the cookie value
  # if html_options.has_key?(:class)
  #     if html_options[:class].include?('retain')
  #         id = html_options[:id]
  #         @object.send("#{method}=", @template.cookies[id]) if @template.cookies.has_key? id
  #     end
  # end
  if !options[:tip].nil?
    html_options[:class] ||= ''
    html_options[:class] << add_space_to_css(html_options) + 'tip-field'    
  end
  self.collection_select(method, collection, value_method, name_method, options.merge(:object => @object, :label => label, :type => :choose_menu, :label_class => 'desc', :field_id => html_options[:id]), html_options)
end

#render_field_template(name, field, options) ⇒ Object

Options to pass to render_field_template through the ‘options’ argument. pre_html html content to insert at the beginning of the container extra_html html content to insert at the end of the container tip Text for a popup text tip. tip_title Title for popup text tip tip_key The id of the div that contains the tip text. tip_position Position for tip text. Valid values are ‘top’, ‘right’, ‘bottom’, ‘left’. Default is ‘right’ wrapper_id Alternate id for the container. Each field is typically wrapper in a div. This is the id of that div. wrapper_class Css class for the container. All containers have the class form-row. This value will be in addition to that class. label_class Css class for the label hide_label Prevents a label from being output hide_required Do not show ‘required’ label even though field is required hide_control_error Hide errors that show up next to the field required_text_mark By default ‘(required)’ is used to show required fields. Override this by setting required_text_mark to something else - ie ‘*’

Alternatively override 'muck.engine.required_text_mark' in your app's en.yml or the appropriate localization file. You can also
specify a value in global_config.yml with required_text_mark: *


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/muck-engine/form_builder.rb', line 37

def render_field_template(name, field, options)

  tippable = !options[:tip].nil?

  # used by country, state and other selects to specify a different id
  field_id = options[:field_id]

  local_options = {
    :pre_html         => options.delete(:pre_html),
    :after_label_html => options.delete(:after_label_html),
    :extra_html       => options.delete(:extra_html),
    :tip              => options.delete(:tip),
    :tip_title        => options.delete(:tip_title),
    :tip_key          => options.delete(:tip_key),
    :tip_position     => options.delete(:tip_position) || 'right',
    :wrapper_id       => options.delete(:wrapper_id),
    :wrapper_class    => options.delete(:wrapper_class),
    :hide_required    => options.delete(:hide_required),
    :hide_control_error => options.delete(:hide_control_error),
    :css_class        => options.delete(:css_class)
  }
  # TODO css_class does not appear to be used. Can just use the standard :class in html options to set the class

  is_checkbox = false
  is_checkbox = true if %w(check_box).include?(name)

  required_text_mark = options.delete(:required_text_mark)

  type = options.delete(:type)
  type ||= :tippable if tippable

  label_class = ''
  label_class << "checkbox-label" if is_checkbox
  label_class << " #{options.delete(:label_class)}" if !options[:label_class].nil?
  if label_class.blank?
    label_options = {}
  else
    label_options = { :class => label_class }
  end
  
  if local_options[:hide_required]
    required = false
    label_text = options[:label]
  else
    required = required_field?(field)
    label_text = (options[:label] || field.to_s.camelize)
    label_text = label_text + required_mark(field, required_text_mark) if required
  end
  label_name = options.delete(:label)

  options[:class] ||= ''
  options[:class] << add_space_to_css(options) + 'tip-field' if tippable
  options[:class] << add_space_to_css(options) + "required-value" if required

  if type == :choose_menu
    options[:label_class] = 'desc'
  end

  if options.delete(:hide_label)
    label_element = ''
  else
    label_element = label(field, label_text.html_safe, label_options)
  end

  locals = {
    :field_element  => yield,
    :field_name     => field_id || field_name(field),
    :label_name     => options.delete(:required_label) || label_name || '',
    :label_element  => label_element,
    :is_checkbox    => is_checkbox,
    :required       => required
  }.merge(local_options)

  if object.nil?
    locals[:value] = ''
    locals[:id] = ''
  else
    locals[:value] = object.send(field)
    locals[:id] = object.id
  end

  if has_errors_on?(field)
    locals.merge!(:error => error_message(field, options))
  end

  @template.capture do

    if type == :tippable              
      @template.render :partial => 'forms/field_with_tips', :locals => locals
    elsif type == :choose_menu
      @template.render :partial => 'forms/menu_field', :locals => locals
    elsif type == :color_picker
      @template.render :partial => 'forms/color_picker_field', :locals => locals
    elsif type == :default  
      @template.render :partial => 'forms/default', :locals => locals
    else
      @template.render :partial => 'forms/field', :locals => locals
    end
  end
end

#state_select(method, options = {}, html_options = {}, additional_state = nil) ⇒ Object

creates a select control with states. Default id is ‘states’. If ‘retain’ is passed for the class value the value of this control will be written into a cookie with the key ‘states’.



149
150
151
152
153
154
# File 'lib/muck-engine/form_builder.rb', line 149

def state_select(method, options = {}, html_options = {}, additional_state = nil)
  country_id_field_name = options.delete(:country_id) || 'country_id'
  country_id = get_instance_object_value(country_id_field_name)
  @states = country_id.nil? ? [] : (additional_state ? [additional_state] : []) + State.find(:all, :conditions => ["country_id = ?", country_id], :order => "name asc")
  self.menu_select(method, I18n.t('muck.engine.choose_state'), @states, options.merge(:prompt => I18n.t('muck.engine.select_state_prompt'), :wrapper_id => 'states-container'), html_options.merge(:id => 'states'))
end

#us_state_select(method, options = {}, html_options = {}, additional_state = nil) ⇒ Object

Call ‘<%= country_scripts %>’ to render javascript that will change the state control based on the current country creates a select control with us states. Default id is ‘us_states’. If ‘retain’ is passed for the class value the value of this control will be written into a cookie with the key ‘us_states’.



141
142
143
144
145
# File 'lib/muck-engine/form_builder.rb', line 141

def us_state_select(method, options = {}, html_options = {}, additional_state = nil)
  @@country_id ||= Country.find_by_abbreviation('US')
  @states = (additional_state ? [additional_state] : []) + State.find(:all, :conditions => ["country_id = ?", @@country_id], :order => "name asc")
  self.menu_select(method, I18n.t('muck.engine.choose_state'), @states, options.merge(:prompt => I18n.t('muck.engine.select_state_prompt'), :wrapper_id => 'us-states-container'), html_options.merge(:id => 'us-states'))
end