Commit 4c6e563fb10b24118e026aeec8e9608da41735ab
1 parent
f4fab949
Exists in
master
and in
29 other branches
ActionItem501: moved all form related helpers to forms_helper.rb
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2107 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
2 changed files
with
126 additions
and
126 deletions
Show diff stats
app/helpers/application_helper.rb
| ... | ... | @@ -154,108 +154,6 @@ module ApplicationHelper |
| 154 | 154 | @controller.send(:profile) || raise("There is no current profile") |
| 155 | 155 | end |
| 156 | 156 | |
| 157 | - # create a form field structure (as if it were generated with | |
| 158 | - # labelled_form_for), but with a customized control and label. | |
| 159 | - # | |
| 160 | - # If +field_id+ is not given, the underlying implementation will try to guess | |
| 161 | - # it from +field_html+ using a regular expression. In this case, make sure | |
| 162 | - # that the first ocurrance of id=['"]([^'"]*)['"] in +field_html+ if the one | |
| 163 | - # you want (i.e. the correct id for the control ) | |
| 164 | - def labelled_form_field(label, field_html, field_id = nil) | |
| 165 | - NoosferoFormBuilder::output_field(label, field_html, field_id) | |
| 166 | - end | |
| 167 | - | |
| 168 | - alias_method :display_form_field, :labelled_form_field | |
| 169 | - | |
| 170 | - def labelled_fields_for(name, object = nil, options = {}, &proc) | |
| 171 | - object ||= instance_variable_get("@#{name}") | |
| 172 | - fields_for(name, object, { :builder => NoosferoFormBuilder }.merge(options), &proc) | |
| 173 | - end | |
| 174 | - | |
| 175 | - def labelled_form_for(name, object = nil, options = {}, &proc) | |
| 176 | - object ||= instance_variable_get("@#{name}") | |
| 177 | - form_for(name, object, { :builder => NoosferoFormBuilder }.merge(options), &proc) | |
| 178 | - end | |
| 179 | - | |
| 180 | - class NoosferoFormBuilder < ActionView::Helpers::FormBuilder | |
| 181 | - include GetText | |
| 182 | - extend ActionView::Helpers::TagHelper | |
| 183 | - | |
| 184 | - def self.output_field(text, field_html, field_id = nil) | |
| 185 | - # try to guess an id if none given | |
| 186 | - if field_id.nil? | |
| 187 | - field_html =~ /id=['"]([^'"]*)['"]/ | |
| 188 | - field_id = $1 | |
| 189 | - end | |
| 190 | - field_html =~ /type=['"]([^'"]*)['"]/ | |
| 191 | - field_html =~ /<(\w*)/ unless $1 | |
| 192 | - field_type = $1 | |
| 193 | - field_class = 'formfield type-' + field_type if field_type | |
| 194 | - | |
| 195 | - label_html = content_tag('label', _(text), :class => 'formlabel', :for => field_id) | |
| 196 | - control_html = content_tag('div', field_html, :class => field_class ) | |
| 197 | - | |
| 198 | - content_tag('div', label_html + control_html, :class => 'formfieldline' ) | |
| 199 | - end | |
| 200 | - | |
| 201 | - (field_helpers - %w(hidden_field)).each do |selector| | |
| 202 | - src = <<-END_SRC | |
| 203 | - def #{selector}(field, *args, &proc) | |
| 204 | - column = object.class.columns_hash[field.to_s] | |
| 205 | - text = | |
| 206 | - ( column ? | |
| 207 | - column.human_name : | |
| 208 | - _(field.to_s.humanize) | |
| 209 | - ) | |
| 210 | - | |
| 211 | - NoosferoFormBuilder::output_field(text, super) | |
| 212 | - end | |
| 213 | - END_SRC | |
| 214 | - class_eval src, __FILE__, __LINE__ | |
| 215 | - end | |
| 216 | - | |
| 217 | - # Create a formatable radio collection | |
| 218 | - # Tha values parameter is a array of [value, label] arrays like this: | |
| 219 | - # [ ['en',_('English')], ['pt',_('Portuguese')], ['es',_('Spanish')] ] | |
| 220 | - # The option :size will set how many radios will be showed in each line | |
| 221 | - # Example: use :size => 3 as option if you want 3 radios by line | |
| 222 | - def radio_group( object_name, method, values, options = {} ) | |
| 223 | - line_size = options[:size] || 0 | |
| 224 | - line_item = 0 | |
| 225 | - html = "\n" | |
| 226 | - values.each { |val, h_val| | |
| 227 | - id = object_name.to_s() +'_'+ method.to_s() +'_'+ val.to_s() | |
| 228 | - # Não está apresentando o sexo selecionado ao revisitar | |
| 229 | - # http://localhost:3000/myprofile/manuel/profile_editor/edit :-( | |
| 230 | - html += self.class.content_tag( 'span', | |
| 231 | - @template.radio_button( object_name, method, val, | |
| 232 | - :id => id, :object => @object ) + | |
| 233 | - self.class.content_tag( 'label', h_val, :for => id ), | |
| 234 | - :class => 'lineitem' + (line_item+=1).to_s() ) +"\n" | |
| 235 | - if line_item == line_size | |
| 236 | - line_item = 0 | |
| 237 | - html += "<br />\n" | |
| 238 | - end | |
| 239 | - } | |
| 240 | - html += "<br />\n" if line_size == 0 || ( values.size % line_size ) > 0 | |
| 241 | - column = object.class.columns_hash[method.to_s] | |
| 242 | - text = | |
| 243 | - ( column ? | |
| 244 | - column.human_name : | |
| 245 | - _(method.to_s.humanize) | |
| 246 | - ) | |
| 247 | - label_html = self.class.content_tag 'label', text, | |
| 248 | - :class => 'formlabel' | |
| 249 | - control_html = self.class.content_tag 'div', html, | |
| 250 | - :class => 'formfield type-radio '+ | |
| 251 | - 'fieldgroup linesize'+line_size.to_s() | |
| 252 | - | |
| 253 | - self.class.content_tag 'div', label_html + control_html, | |
| 254 | - :class => 'formfieldline' | |
| 255 | - end | |
| 256 | - | |
| 257 | - end | |
| 258 | - | |
| 259 | 157 | def category_color |
| 260 | 158 | if @category.nil? |
| 261 | 159 | "" |
| ... | ... | @@ -314,21 +212,6 @@ module ApplicationHelper |
| 314 | 212 | end |
| 315 | 213 | alias icon_button button_without_text |
| 316 | 214 | |
| 317 | - def submit_button(type, label, html_options = {}) | |
| 318 | - bt_cancel = html_options[:cancel] ? button(:cancel, _('Cancel'), html_options[:cancel]) : '' | |
| 319 | - | |
| 320 | - html_options[:class] = [html_options[:class], 'submit'].compact.join(' ') | |
| 321 | - | |
| 322 | - the_class = "button with-text icon-#{type}" | |
| 323 | - if html_options.has_key?(:class) | |
| 324 | - the_class << ' ' << html_options[:class] | |
| 325 | - end | |
| 326 | - | |
| 327 | - bt_submit = submit_tag(label, html_options.merge(:class => the_class)) | |
| 328 | - | |
| 329 | - bt_submit + bt_cancel | |
| 330 | - end | |
| 331 | - | |
| 332 | 215 | def button_to_function(type, label, js_code, html_options = {}) |
| 333 | 216 | html_options[:class] = "" unless html_options[:class] |
| 334 | 217 | html_options[:class] << " button #{type}" |
| ... | ... | @@ -473,15 +356,6 @@ module ApplicationHelper |
| 473 | 356 | :class => 'vcard' |
| 474 | 357 | end |
| 475 | 358 | |
| 476 | - def text_field_with_local_autocomplete(name, choices, html_options = {}) | |
| 477 | - id = html_options[:id] || name | |
| 478 | - | |
| 479 | - text_field_tag(name, '', html_options) + | |
| 480 | - content_tag('div', '', :id => "autocomplete-for-#{id}", :class => 'auto-complete', :style => 'display: none;') + | |
| 481 | - javascript_tag('new Autocompleter.Local(%s, %s, %s)' % [ id.to_json, "autocomplete-for-#{id}".to_json, choices.to_json ] ) | |
| 482 | - | |
| 483 | - end | |
| 484 | - | |
| 485 | 359 | def gravatar_url_for(email, options = {}) |
| 486 | 360 | # Ta dando erro de roteamento |
| 487 | 361 | url_for( { :gravatar_id => Digest::MD5.hexdigest(email), | ... | ... |
app/helpers/forms_helper.rb
| 1 | 1 | module FormsHelper |
| 2 | 2 | |
| 3 | + # create a form field structure (as if it were generated with | |
| 4 | + # labelled_form_for), but with a customized control and label. | |
| 5 | + # | |
| 6 | + # If +field_id+ is not given, the underlying implementation will try to guess | |
| 7 | + # it from +field_html+ using a regular expression. In this case, make sure | |
| 8 | + # that the first ocurrance of id=['"]([^'"]*)['"] in +field_html+ if the one | |
| 9 | + # you want (i.e. the correct id for the control ) | |
| 10 | + def labelled_form_field(label, field_html, field_id = nil) | |
| 11 | + NoosferoFormBuilder::output_field(label, field_html, field_id) | |
| 12 | + end | |
| 13 | + | |
| 14 | + alias_method :display_form_field, :labelled_form_field | |
| 15 | + | |
| 16 | + def labelled_fields_for(name, object = nil, options = {}, &proc) | |
| 17 | + object ||= instance_variable_get("@#{name}") | |
| 18 | + fields_for(name, object, { :builder => NoosferoFormBuilder }.merge(options), &proc) | |
| 19 | + end | |
| 20 | + | |
| 21 | + def labelled_form_for(name, object = nil, options = {}, &proc) | |
| 22 | + object ||= instance_variable_get("@#{name}") | |
| 23 | + form_for(name, object, { :builder => NoosferoFormBuilder }.merge(options), &proc) | |
| 24 | + end | |
| 25 | + | |
| 26 | + class NoosferoFormBuilder < ActionView::Helpers::FormBuilder | |
| 27 | + include GetText | |
| 28 | + extend ActionView::Helpers::TagHelper | |
| 29 | + | |
| 30 | + def self.output_field(text, field_html, field_id = nil) | |
| 31 | + # try to guess an id if none given | |
| 32 | + if field_id.nil? | |
| 33 | + field_html =~ /id=['"]([^'"]*)['"]/ | |
| 34 | + field_id = $1 | |
| 35 | + end | |
| 36 | + field_html =~ /type=['"]([^'"]*)['"]/ | |
| 37 | + field_html =~ /<(\w*)/ unless $1 | |
| 38 | + field_type = $1 | |
| 39 | + field_class = 'formfield type-' + field_type if field_type | |
| 40 | + | |
| 41 | + label_html = content_tag('label', _(text), :class => 'formlabel', :for => field_id) | |
| 42 | + control_html = content_tag('div', field_html, :class => field_class ) | |
| 43 | + | |
| 44 | + content_tag('div', label_html + control_html, :class => 'formfieldline' ) | |
| 45 | + end | |
| 46 | + | |
| 47 | + (field_helpers - %w(hidden_field)).each do |selector| | |
| 48 | + src = <<-END_SRC | |
| 49 | + def #{selector}(field, *args, &proc) | |
| 50 | + column = object.class.columns_hash[field.to_s] | |
| 51 | + text = | |
| 52 | + ( column ? | |
| 53 | + column.human_name : | |
| 54 | + _(field.to_s.humanize) | |
| 55 | + ) | |
| 56 | + | |
| 57 | + NoosferoFormBuilder::output_field(text, super) | |
| 58 | + end | |
| 59 | + END_SRC | |
| 60 | + class_eval src, __FILE__, __LINE__ | |
| 61 | + end | |
| 62 | + | |
| 63 | + # Create a formatable radio collection | |
| 64 | + # Tha values parameter is a array of [value, label] arrays like this: | |
| 65 | + # [ ['en',_('English')], ['pt',_('Portuguese')], ['es',_('Spanish')] ] | |
| 66 | + # The option :size will set how many radios will be showed in each line | |
| 67 | + # Example: use :size => 3 as option if you want 3 radios by line | |
| 68 | + def radio_group( object_name, method, values, options = {} ) | |
| 69 | + line_size = options[:size] || 0 | |
| 70 | + line_item = 0 | |
| 71 | + html = "\n" | |
| 72 | + values.each { |val, h_val| | |
| 73 | + id = object_name.to_s() +'_'+ method.to_s() +'_'+ val.to_s() | |
| 74 | + # Não está apresentando o sexo selecionado ao revisitar | |
| 75 | + # http://localhost:3000/myprofile/manuel/profile_editor/edit :-( | |
| 76 | + html += self.class.content_tag( 'span', | |
| 77 | + @template.radio_button( object_name, method, val, | |
| 78 | + :id => id, :object => @object ) + | |
| 79 | + self.class.content_tag( 'label', h_val, :for => id ), | |
| 80 | + :class => 'lineitem' + (line_item+=1).to_s() ) +"\n" | |
| 81 | + if line_item == line_size | |
| 82 | + line_item = 0 | |
| 83 | + html += "<br />\n" | |
| 84 | + end | |
| 85 | + } | |
| 86 | + html += "<br />\n" if line_size == 0 || ( values.size % line_size ) > 0 | |
| 87 | + column = object.class.columns_hash[method.to_s] | |
| 88 | + text = | |
| 89 | + ( column ? | |
| 90 | + column.human_name : | |
| 91 | + _(method.to_s.humanize) | |
| 92 | + ) | |
| 93 | + label_html = self.class.content_tag 'label', text, | |
| 94 | + :class => 'formlabel' | |
| 95 | + control_html = self.class.content_tag 'div', html, | |
| 96 | + :class => 'formfield type-radio '+ | |
| 97 | + 'fieldgroup linesize'+line_size.to_s() | |
| 98 | + | |
| 99 | + self.class.content_tag 'div', label_html + control_html, | |
| 100 | + :class => 'formfieldline' | |
| 101 | + end | |
| 102 | + | |
| 103 | + end | |
| 104 | + | |
| 105 | + | |
| 3 | 106 | def generate_form( name, obj, fields={} ) |
| 4 | 107 | labelled_form_for name, obj do |f| |
| 5 | 108 | f.text_field(:name) |
| ... | ... | @@ -30,6 +133,29 @@ module FormsHelper |
| 30 | 133 | select_tag( name, options_from_collection_for_select(collection, value_method, text_method, selected), options) |
| 31 | 134 | end |
| 32 | 135 | |
| 136 | + def submit_button(type, label, html_options = {}) | |
| 137 | + bt_cancel = html_options[:cancel] ? button(:cancel, _('Cancel'), html_options[:cancel]) : '' | |
| 138 | + | |
| 139 | + html_options[:class] = [html_options[:class], 'submit'].compact.join(' ') | |
| 140 | + | |
| 141 | + the_class = "button with-text icon-#{type}" | |
| 142 | + if html_options.has_key?(:class) | |
| 143 | + the_class << ' ' << html_options[:class] | |
| 144 | + end | |
| 145 | + | |
| 146 | + bt_submit = submit_tag(label, html_options.merge(:class => the_class)) | |
| 147 | + | |
| 148 | + bt_submit + bt_cancel | |
| 149 | + end | |
| 150 | + | |
| 151 | + def text_field_with_local_autocomplete(name, choices, html_options = {}) | |
| 152 | + id = html_options[:id] || name | |
| 153 | + | |
| 154 | + text_field_tag(name, '', html_options) + | |
| 155 | + content_tag('div', '', :id => "autocomplete-for-#{id}", :class => 'auto-complete', :style => 'display: none;') + | |
| 156 | + javascript_tag('new Autocompleter.Local(%s, %s, %s)' % [ id.to_json, "autocomplete-for-#{id}".to_json, choices.to_json ] ) | |
| 157 | + end | |
| 158 | + | |
| 33 | 159 | protected |
| 34 | 160 | def self.next_id_number |
| 35 | 161 | if defined? @@id_num | ... | ... |