storefront 0.2.1 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/Rakefile +2 -2
  2. data/lib/storefront.rb +21 -3
  3. data/lib/storefront/configuration.rb +154 -0
  4. data/lib/storefront/dashboard.rb +8 -7
  5. data/lib/storefront/form.rb +70 -53
  6. data/lib/storefront/form/base.rb +50 -0
  7. data/lib/storefront/form/builder.rb +124 -0
  8. data/lib/storefront/form/errors.rb +20 -46
  9. data/lib/storefront/form/field.rb +102 -0
  10. data/lib/storefront/form/fieldset.rb +44 -0
  11. data/lib/storefront/form/hint.rb +34 -0
  12. data/lib/storefront/form/input.rb +191 -0
  13. data/lib/storefront/form/inputs/checkbox.rb +12 -0
  14. data/lib/storefront/form/inputs/date.rb +16 -0
  15. data/lib/storefront/form/inputs/file.rb +12 -0
  16. data/lib/storefront/form/inputs/hidden.rb +11 -0
  17. data/lib/storefront/form/inputs/radio.rb +11 -0
  18. data/lib/storefront/form/inputs/range.rb +15 -0
  19. data/lib/storefront/form/inputs/select.rb +68 -0
  20. data/lib/storefront/form/inputs/string.rb +89 -0
  21. data/lib/storefront/form/inputs/submit.rb +24 -0
  22. data/lib/storefront/form/inputs/textarea.rb +19 -0
  23. data/lib/storefront/form/inputs/value.rb +16 -0
  24. data/lib/storefront/form/label.rb +35 -0
  25. data/lib/storefront/helpers/attribute_helper.rb +29 -8
  26. data/lib/storefront/helpers/body_helper.rb +1 -1
  27. data/lib/storefront/helpers/cache_helper.rb +2 -2
  28. data/lib/storefront/helpers/component_helper.rb +34 -19
  29. data/lib/storefront/helpers/dashboard_helper.rb +9 -17
  30. data/lib/storefront/helpers/definition_list_helper.rb +82 -14
  31. data/lib/storefront/helpers/form_helper.rb +7 -2
  32. data/lib/storefront/helpers/head_helper.rb +2 -2
  33. data/lib/storefront/helpers/image_helper.rb +1 -25
  34. data/lib/storefront/helpers/list_helper.rb +120 -32
  35. data/lib/storefront/helpers/locale_helper.rb +98 -28
  36. data/lib/storefront/helpers/page_helper.rb +78 -60
  37. data/lib/storefront/helpers/request_helper.rb +3 -0
  38. data/lib/storefront/helpers/table_helper.rb +1 -1
  39. data/lib/storefront/helpers/template_helper.rb +11 -0
  40. data/lib/storefront/helpers/time_helper.rb +2 -2
  41. data/lib/storefront/helpers/widget_helper.rb +153 -2
  42. data/lib/storefront/model_helper.rb +17 -0
  43. data/lib/storefront/proxies/attribute_proxy.rb +150 -0
  44. data/lib/storefront/proxies/model_proxy.rb +249 -0
  45. data/lib/storefront/railtie.rb +4 -2
  46. data/lib/storefront/table.rb +7 -0
  47. data/test/form_helper_test.rb +1 -1
  48. metadata +25 -27
  49. data/init.rb +0 -1
  50. data/lib/storefront/form/elements.rb +0 -101
  51. data/lib/storefront/form/fields.rb +0 -420
  52. data/lib/storefront/form/hints.rb +0 -18
  53. data/lib/storefront/form/inputs.rb +0 -258
  54. data/lib/storefront/form/labels.rb +0 -81
  55. data/lib/storefront/form/model.rb +0 -84
  56. data/lib/storefront/microdata/address.rb +0 -7
  57. data/lib/storefront/microdata/event.rb +0 -13
  58. data/lib/storefront/microdata/geo.rb +0 -7
  59. data/lib/storefront/microdata/organization.rb +0 -7
  60. data/lib/storefront/microdata/person.rb +0 -7
  61. data/lib/storefront/microformat/event.rb +0 -7
  62. data/lib/storefront/microformat/person.rb +0 -7
  63. data/lib/storefront/models/container.rb +0 -0
  64. data/lib/storefront/models/element.rb +0 -15
  65. data/lib/storefront/models/form.rb +0 -0
  66. data/lib/storefront/models/form_element.rb +0 -0
  67. data/lib/storefront/models/link.rb +0 -0
  68. data/lib/storefront/models/list.rb +0 -0
  69. data/lib/storefront/models/list_element.rb +0 -0
  70. data/lib/storefront/models/table.rb +0 -0
  71. data/lib/storefront/models/term.rb +0 -0
  72. data/lib/storefront/models/term_list.rb +0 -0
  73. data/lib/storefront/models/validation.rb +0 -0
@@ -1,420 +0,0 @@
1
- # http://stackoverflow.com/questions/2731735/formtastic-own-as-input-type
2
- # to convert this from formtastic back to normal, remove @template, and pass "form" in as a param
3
- module Storefront
4
- module OldFormHelper
5
- def action(label, options = {})
6
- self.next label, options
7
- end
8
-
9
- def watched_input(method, options = {})
10
- options[:input_html] ||= {}
11
- options[:input_html].merge!(:class => "watch-characters", "data-character-count" => (options.delete(:count) || 100))
12
- text_input method, options
13
- end
14
-
15
- def live_update_input(method, options = {})
16
- options[:input_html] ||= {}
17
- options[:input_html].merge!(:class => "watch-characters live-update", "data-character-count" => (options.delete(:count) || 100))
18
- text_input method, options
19
- end
20
-
21
- def phone_input(method, options = {})
22
- options[:input_html] ||= {}
23
- options[:input_html].merge!(:class => "phone")
24
- string_input method, options
25
- end
26
-
27
- def security_code_input(method, options = {})
28
- options[:input_html] ||= {}
29
- options[:input_html].merge!(:class => "security_code")
30
- string_input method, options
31
- end
32
-
33
- def filter_input(method, options = {})
34
- expression = options.delete(:match)
35
- expression = expression.source if expression.is_a?(::Regexp)
36
- filter = options.delete(:filter) || method.to_s
37
- boolean_input method, options.merge("data-filter-attribute" => filter, "data-filter-expression" => expression)
38
- end
39
-
40
- def money_input(method, options = {})
41
- options[:input_html] ||= {}
42
- classes = options.delete(:class)
43
- if classes.blank?
44
- classes = "money"
45
- else
46
- classes = [classes, "money"].join(" ")
47
- end
48
- options[:input_html].reverse_merge!("data-accepts" => Regexp.new('^[\d\.\,\$]$').source, :class => classes, :maxlength => nil, :size => nil, :value => @template.format_money(object.send(method)))
49
- string_input method, options
50
- end
51
-
52
- def percent_input(method, options = {})
53
- options[:input_html] ||= {}
54
- options[:input_html].reverse_merge!(:class => "percent", :maxlength => nil, :size => nil, :value => @template.format_percent(object.send(method)))
55
- string_input method, options
56
- end
57
-
58
- def card_input(method, options = {})
59
- options[:input_html] ||= {}
60
- options[:input_html].merge!(:class => "card", :maxlength => nil, :size => nil)
61
- string_input method, options
62
- end
63
-
64
- def birthday_input(method, options = {})
65
- string_input method, options.reverse_merge(:hint => "MM/DD/YYYY", :input_html => {:class => "birthday"})
66
- end
67
-
68
- def datepicker_input(method, options = {})
69
- input_html = options[:input_html] || {}
70
- input_html[:class] = ["string", input_html[:class], "datepicker-deal", method.to_s.gsub("_", "-")].compact.uniq.join(" ")
71
- input_html[:value] = I18n.l(object.send(method), :format => options.delete(:format) || :pretty)
72
- options[:input_html] = input_html
73
- string_input method, options
74
- end
75
-
76
- def simple_datepicker_input(method, options = {})
77
- string_input method, options.reverse_merge(:input_html => {:class => 'datepicker'})
78
- end
79
-
80
- # merge with above
81
- def deal_datepicker_input(method, options = {})
82
- options[:input_html] ||= {}
83
- classes = ["datepicker-deal", options.delete(:class)].flatten.join(" ")
84
- options[:input_html].merge!(:readonly => true, :class => classes, :value => options.delete(:value))
85
- string_input method, options
86
- end
87
-
88
- def slider_input(method, options = {})
89
- slider_classes = options.delete(:class) || method.to_s
90
- inner_html = options.delete(:input_html) || {}
91
- inner_html[:class] = "with-slider #{slider_classes}"
92
- inner_html["data-meter"] = slider_classes.split(/\s+/).first
93
- inner_html["data-min"] = options[:min] if options[:min].present?
94
- inner_html["data-max"] = options[:max] if options[:max].present?
95
- inner_html["data-step"] = options[:step] if options[:step].present?
96
- inner_html["data-accepts"] = Regexp.new('\\d').source
97
- inner_html[:value] = options[:value]
98
- string_input method, :input_html => inner_html
99
- end
100
-
101
- def cash_input(method, options = {})
102
- string_input method, options.reverse_merge(:input_html => {:class => "money"})
103
- end
104
-
105
- def image_input(method, options = {})
106
- label = options[:label] || method.to_s.humanize
107
- image = options[:resource] || object
108
- @template.render :partial => "shared/forms/image", :locals => {:form => self, :brandable => image, :as => method, :label => label, :required => (options[:required] || false)}
109
- end
110
-
111
- def submit_center(label, options = {})
112
- @template.render :partial => "shared/forms/submit_center", :locals => options.reverse_merge(:reject => nil, :form => self, :label => label)
113
- end
114
-
115
- def state(name)
116
- @template.hidden_field_tag :event, @template.workflow_state(name)
117
- end
118
-
119
- def hours
120
- @template.render :partial => "shared/forms/hours", :locals => {:form => self}
121
- end
122
-
123
- def group(name, options = {})
124
- scoping = options.delete(:scoped)
125
- scoping = nil if scoping.is_a?(User) && scoping.admin?
126
- as = options.delete(:as) || :parent
127
- if scoping.blank?
128
- items = @template.select_attributes(name, :name, :id)
129
- else
130
- items = scoping.send(name.to_s.pluralize)
131
- end
132
- hidden = options.delete(:hidden) || false
133
- if hidden
134
- input "#{name}_id".to_sym, :as => :hidden, :input_html => {:value => default_id_for(@template.parent)}
135
- else
136
- input_select "#{name}_id".to_sym, :collection => items, :label_method => :name, :default => @template.parent, :required => true
137
- end
138
- end
139
-
140
- def has_one(model, options = {})
141
- conditions = (options.delete(:conditions) || {})
142
- collection = options.delete(:collection) || @template.select_attributes(model, :name, :id, conditions)
143
- default = options.delete(:default) || @template.params["#{model}_id".to_sym] || @template.resource.send(model)
144
- input_select "#{model}_id", {:collection => collection, :default => default}.merge(options)
145
- end
146
-
147
- def logo(brandable)
148
- image(brandable, :logo)
149
- end
150
-
151
- def image(attribute, brandable, options = {})
152
- label = options[:label] || attribute.to_s.humanize
153
- has_one_association = brandable.class.belongs_to?(attribute) || brandable.class.has_one?(attribute)
154
- single_file = (options[:single_file] == true) || (has_one_association == true)
155
- @template.render :partial => "shared/forms/image", :locals => {:form => self, :brandable => brandable, :as => attribute, :label => label, :required => (options[:required] || false), :single_file => single_file, :hint => options[:hint]}
156
- end
157
-
158
- def images(attribute, brandable, options = {})
159
- label = options[:label] || attribute.to_s.humanize
160
- @template.render :partial => "shared/forms/images", :locals => {:form => self, :brandable => brandable, :as => attribute, :label => label}
161
- end
162
-
163
- def store(options = {})
164
- label = options[:label] || "Primary Location"
165
- defaults = (options[:defaults] || []).flatten.compact
166
- @template.render :partial => "shared/forms/store", :locals => {:form => self, :label => label, :defaults => defaults}
167
- end
168
-
169
- def address(options = {})
170
- label = options[:label] || "Address"
171
- defaults = (options[:defaults] || []).flatten.compact
172
- include_details = options[:include_details] == true
173
- @template.render :partial => "shared/forms/address", :locals => {:form => self, :label => label, :defaults => defaults, :include_details => include_details}
174
- end
175
-
176
- def inline_address(options = {})
177
- default = options[:default]
178
- @template.render :partial => "shared/forms/inline_address", :locals => {:form => self, :default => default}
179
- end
180
-
181
- def location(attribute, options = {})
182
- label = options[:label] || "Address"
183
- defaults = (options[:defaults] || []).flatten.compact
184
- options[:input_html] = {}
185
- if options.delete(:read_only) == true
186
- options[:input_html][:readonly] = true
187
- end
188
- if options.delete(:disabled) == true
189
- options[:input_html][:disabled] = true
190
- end
191
- id = options.delete(:id)
192
- @template.render :partial => "shared/forms/location", :locals => {:form => self, :id => id, :label => label, :defaults => defaults, :attribute => attribute, :input_html => options[:input_html], :disabled => (options[:disabled] == false)}
193
- end
194
-
195
- def default(model, attribute, object = nil)
196
- (object || self.object).send(attribute) || model.to_s.camelize.constantize.new
197
- end
198
-
199
- def submit_to(path, options = {})
200
- label = options[:label] || "Save Changes"
201
- cancel = options[:cancel] || "Cancel"
202
- label_class = (Array(options[:class]) + ["round-green"]).compact.join(" ")
203
- @template.render :partial => "shared/forms/submit", :locals => {:form => self, :path => path, :label => label, :cancel => cancel, :label_class => label_class, :agree => options[:agree]}
204
- end
205
-
206
- def contact(attribute, options = {})
207
- label = options[:label] || attribute.to_s.humanize
208
- include_logo = options[:include_logo] == true
209
- @template.render :partial => "shared/forms/contact", :locals => {:form => self, :label => label, :attribute => attribute, :no_address => options[:no_address] == true ? true : false, :include_logo => include_logo}
210
- end
211
-
212
- def hidden_select(attribute, options = {})
213
- options[:value] = default_id_for(options[:default])
214
- if !options[:value].blank?
215
- input attribute.to_sym, :as => :hidden, :input_html => {:value => options[:value]}
216
- else
217
- input_select attribute.to_sym, options.except(:value)
218
- end
219
- end
220
-
221
- def next(label, options = {})
222
- submit_to(@template.send(:root_path), options.reverse_merge(:label => label, :deal => nil, :agree => nil))
223
- end
224
-
225
- def input_select(attribute, options = {})
226
- default = default_id_for(options.delete(:default))
227
- result = input(attribute, options.reverse_merge(:as => :select, :include_blank => true))
228
- result.gsub!(/selected=['"]([^'"]+)['"]/, "")
229
- result.gsub!(/(value=['"]#{default.to_s}['"])/, "\\1 selected='selected'") unless default.blank?
230
- result
231
- end
232
-
233
- def default_password
234
- result = input :password, :as => :hidden, :value => "biglobby"
235
- result += input :password_confirmation, :as => :hidden, :value => "biglobby"
236
- result
237
- end
238
-
239
- def autocomplete(attribute, options = {})
240
- value = object.work_name.to_s if object.respond_to?(:work_name)
241
- value ||= object.group_name.to_s if object.respond_to?(:group_name)
242
- result = input(attribute, :as => :hidden, :input_html => {:class => "hidden-autocomplete", :value => value})
243
- result += input(attribute, options.merge(:input_html => {:class => "autocomplete", :maxlength => nil, :size => nil}, :as => :string))
244
- result
245
- end
246
-
247
- def autocomplete_two(attribute, options = {})
248
- default = options[:default]
249
- #attribute = "#{attribute}".gsub(/_id$/, "")
250
- if default.present?
251
- name = default.name rescue ""
252
- else
253
- name = (object.send("#{attribute}".gsub(/_id$/, "")).name || "") rescue ""
254
- end
255
-
256
- options[:value] ||= default_id_for(default || object.send("#{attribute}".gsub(/_id$/, "")))
257
- value = User.find_by_id(options[:value])
258
- name = value.name if value
259
- value = value.id if value
260
-
261
- result = input(attribute, :as => :hidden, :input_html => {:class => "hidden-autocomplete", :value => value})
262
-
263
- options[:input_html] ||= {}
264
- options[:input_html].merge!(:class => "autocomplete-two", :value => name)
265
-
266
- result += input("#{attribute}".gsub(/_id$/, ""), options)
267
-
268
- result
269
- end
270
-
271
- def partial(method, options = {})
272
- send(:"#{options.delete(:as)}_partial", method, options)
273
- end
274
-
275
- def select_partial(method, options = {})
276
- default = default_id_for(options.delete(:default))
277
- result = input(method, options.merge(:as => :select, :include_blank => true))
278
- result.gsub!(/selected=['"]([^'"]+)['"]/, "")
279
- result.gsub!(/(value=['"]#{default.to_s}['"])/, "\\1 selected='selected'") unless default.blank?
280
- result
281
- end
282
-
283
- def partial_for(method, options = {})
284
- send("#{method}_partial", options)
285
- end
286
-
287
- def conditions_partial(options = {})
288
- @template.render :partial => "shared/forms/conditions", :locals => options.reverse_merge(:form => self, :locale => "group")
289
- end
290
-
291
- def cost_partial(options = {})
292
- @template.render :partial => "shared/forms/cost", :locals => {:form => self}
293
- end
294
-
295
- def value_input(method, options)
296
- basic_input_helper(:value_field, :string, method, options.merge(:input_html => options))
297
- end
298
-
299
- def value_field(method, html_options = {})
300
- @template.content_tag(:output, html_options.delete(:value) || object.send(method), html_options)
301
- end
302
-
303
- private
304
- def default_id_for(value)
305
- result = (value && !value.is_a?(Fixnum) && !value.is_a?(String)) ? value.id : value
306
- result.blank? ? nil : result
307
- end
308
- end
309
- end
310
-
311
-
312
- Dir["#{File.expand_path(File.dirname(__FILE__))}/**/*"].each do |path|
313
- require path unless ::File.directory?(path) || File.basename(path) =~ /fields/
314
- end
315
-
316
- module Storefront
317
- class Form
318
- class Fields
319
- include Haml::Helpers
320
- include Storefront::Form::Model
321
- include Storefront::Form::Elements
322
- include Storefront::Form::Inputs
323
- include Storefront::Form::Labels
324
- include Storefront::Form::Errors
325
- include Storefront::Form::Hints
326
- include Storefront::AttributeHelper
327
- include Storefront::OldFormHelper
328
-
329
- attr_accessor :template, :object, :parent, :tabindex, :access_keys, :keys
330
-
331
- def initialize(template, options, &block)
332
- @template = template
333
- @tabindex = options[:tabindex]
334
- @access_keys = options[:access_keys]
335
- @parent = options[:parent]
336
- @object = options[:object]
337
- @attribute = options[:attribute]
338
- @macro = options[:macro]
339
- if @attribute.present?
340
- @keys = [options[:keys], "#{@attribute}_attributes"]
341
- else
342
- @keys = Array(options[:keys])
343
- end
344
- if @parent && @object.blank? && @attribute.present? && @parent.respond_to?("#{@attribute}_or_default")
345
- @object = @parent.send("#{@attribute}_or_default")
346
- end
347
-
348
- if @macro == :has_many && @object
349
- @index = @parent.send(@attribute).index(@object)
350
- end
351
- yield(self)
352
- end
353
-
354
- def inputs(*args, &block)
355
- options = args.extract_options!
356
- label = args.shift
357
- template.capture_haml do
358
- template.haml_tag :fieldset, options do
359
- template.haml_tag :legend do
360
- template.haml_tag :span, label
361
- end if label.present?
362
- template.haml_tag :ol, &block
363
- end
364
- end
365
- end
366
- alias fieldset inputs
367
-
368
- def fields_for(*args, &block)
369
- options = args.extract_options!
370
- attribute = args.shift
371
- if block_given?
372
- reflection = reflection_for(attribute)
373
- fields = Storefront::Form::Fields.new(@template, options.merge(
374
- :access_keys => @access_keys,
375
- :tabindex => @tabindex,
376
- :parent => @object,
377
- :object => args.shift || @object.send(attribute),
378
- :keys => @keys,
379
- :macro => reflection ? reflection.macro : nil,
380
- :attribute => attribute
381
- ), &block)
382
-
383
- @tabindex = fields.tabindex
384
- end
385
- nil
386
- end
387
- alias semantic_fields_for fields_for
388
-
389
- def access_key_for(attribute)
390
- attribute.to_s[0,1]
391
- end
392
-
393
- def options
394
-
395
- end
396
-
397
- def options_for(attribute, options = {})
398
-
399
- end
400
-
401
- def param_for(*parts)
402
- parts = parts.flatten.compact
403
- parts[0].to_s + parts[1..-1].map {|i| "[#{i}]"}.join("")
404
- end
405
-
406
- # get rid of this, don't like
407
- def default(model, attribute, object = nil)
408
- (object || self.object).send(attribute) || model.to_s.camelize.constantize.new
409
- end
410
-
411
- def method_missing(method, *args, &block)
412
- if @template.respond_to?(method)
413
- @template.send(method, *args, &block)
414
- else
415
- super
416
- end
417
- end
418
- end
419
- end
420
- end
@@ -1,18 +0,0 @@
1
- module Storefront
2
- class Form
3
- module Hints
4
- def hints_for(key, options = {})
5
- value = options[:hint_attributes].delete(:value)
6
- template.capture_haml do
7
- if value.present?
8
- template.haml_tag :figure, options[:hint_attributes] do
9
- template.haml_concat value.html_safe
10
- end
11
- else
12
- template.haml_tag :figure, options[:hint_attributes]
13
- end
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,258 +0,0 @@
1
- module Storefront
2
- class Form
3
- module Inputs
4
- def input_for(key, options)
5
- send(:"#{options.delete(:as)}_input", key, options)
6
- end
7
-
8
- def default_input_type(method, options = {}) #:nodoc:
9
- if column = column_for(method)
10
- # Special cases where the column type doesn't map to an input method.
11
- case column.type
12
- when :string
13
- return :password if method.to_s =~ /password/
14
- return :country if method.to_s =~ /country$/
15
- return :time_zone if method.to_s =~ /time_zone/
16
- return :email if method.to_s =~ /email/
17
- return :url if method.to_s =~ /^url$|^website$|_url$/
18
- return :phone if method.to_s =~ /(phone|fax)/
19
- return :search if method.to_s =~ /^search$/
20
- when :integer
21
- return :select if reflection_for(method)
22
- return :numeric
23
- when :float, :decimal
24
- return :numeric
25
- when :timestamp
26
- return :datetime
27
- end
28
-
29
- # Try look for hints in options hash. Quite common senario: Enum keys stored as string in the database.
30
- return :select if column.type == :string && options.key?(:collection)
31
- # Try 3: Assume the input name will be the same as the column type (e.g. string_input).
32
- return column.type
33
- else
34
- if @object
35
- return :select if reflection_for(method)
36
-
37
- return :file if is_file?(method, options)
38
- end
39
-
40
- return :select if options.key?(:collection)
41
- return :password if method.to_s =~ /password/
42
- return :string
43
- end
44
- end
45
-
46
- def is_file?(method, options = {})
47
- @files ||= {}
48
- @files[method] ||= (options[:as].present? && options[:as] == :file) || begin
49
- file = @object.send(method) if @object && @object.respond_to?(method)
50
- file && file_methods.any?{|m| file.respond_to?(m)}
51
- end
52
- end
53
-
54
- def file_methods
55
- [:file?, :public_filename, :filename]
56
- end
57
-
58
-
59
- def base_input(input_type, key, options = {}, &block)
60
- if [:numeric, :string, :password, :text, :phone, :url, :email].include?(input_type)
61
- attributes = default_string_options(key, input_type).merge(options[:input_attributes])
62
- else
63
- attributes = options[:input_attributes]
64
- end
65
- merge_class! attributes, key.to_s, options[:class]
66
- attributes[:required] = true if options[:required] == true
67
- template.capture_haml do
68
- template.haml_tag :input, attributes.merge(:type => input_type), &block
69
- end
70
- end
71
-
72
- def core_input(tag, *args, &block)
73
- options = args.extract_options!
74
- attributes = options[:input_attributes]
75
- attributes[:required] = true if options[:required] == true
76
- template.capture_haml do
77
- if block_given?
78
- template.haml_tag tag, attributes, &block
79
- else
80
- template.haml_tag tag, args.shift, attributes
81
- end
82
- end
83
- end
84
-
85
- # autofocus, pattern, placeholder, title, size, data-validate, data-validate-match, data-validate-unique
86
- def string_input(key, attributes = {})
87
- base_input :string, key, attributes
88
- end
89
-
90
- # maxlength, placeholder, required, wrap, readonly
91
- def textarea_input(key, options = {})
92
- attributes = options[:input_attributes]
93
- value = attributes.delete(:value)
94
- core_input :textarea, value, attributes
95
- end
96
- alias_method :text_input, :textarea_input
97
-
98
- def checkbox_input(key, attributes = {})
99
- hidden_input key, attributes.merge(:value => 0)
100
- base_input :checkbox, key, attributes.merge(:value => 1)
101
- end
102
-
103
- # prompt, blank, multiple
104
- def select_input(key, options = {})
105
- collection = Array(options.delete(:collection) || [])
106
- if options[:include_blank] != false
107
- prompt = options[:prompt] || ""
108
- collection = [[prompt, ""]] + collection
109
- end
110
- attributes = options[:input_attributes]
111
- selected = attributes.delete(:value)
112
- core_input :select, options do
113
- collection.map do |item|
114
- name, options = item, {}
115
- case item
116
- when Array
117
- name = item[0]
118
- options[:value] = item[1]
119
- when Hash
120
- name = item[:name]
121
- options[:value] = item[:value]
122
- else
123
- options[:value] = item
124
- end
125
- options[:selected] = "true" if selected.present? && options[:value] == selected
126
- template.haml_tag :option, name, options
127
- end
128
- end
129
- end
130
-
131
- def hidden_input(key, attributes = {})
132
- base_input :hidden, key, attributes
133
- end
134
-
135
- def number_input(key, attributes = {})
136
- base_input :string, key, attributes.merge(:class => "numeric", "data-type" => "numeric")
137
- end
138
-
139
- def numeric_input(key, attributes = {})
140
- base_input :string, key, attributes.merge(:class => "numeric", "data-type" => "numeric")
141
- end
142
-
143
- def search_input(key, attributes = {})
144
- base_input :search, key, merge_class(attributes, "search").merge("data-type" => "search")
145
- end
146
-
147
- def boolean_input(key, attributes = {})
148
- select_input(key, attributes.merge(:collection => [["Yes", "1"], ["No", "0"]]))
149
- #checkbox_input(key, attributes = {})
150
- end
151
-
152
- # accept, maxlength="2"
153
- def file_input(key, attributes = {})
154
- base_input :file, key, attributes
155
- end
156
-
157
- def password_input(key, attributes = {})
158
- base_input :password, key, attributes
159
- end
160
-
161
- def email_input(key, attributes = {})
162
- base_input :email, key, attributes
163
- end
164
-
165
- def url_input(key, attributes = {})
166
- base_input :url, key, attributes
167
- end
168
-
169
- def phone_input(key, attributes = {})
170
- base_input :tel, key, attributes.merge(:class => "phone")
171
- end
172
-
173
- def fax_input(key, attributes = {})
174
- base_input :tel, key, attributes.merge(:class => "phone fax")
175
- end
176
-
177
- def date_input(key, attributes = {})
178
- base_input :string, key, attributes.merge(:class => "date", "data-type" => "date")
179
- end
180
-
181
- def money_input(key, attributes = {})
182
- base_input :string, key, merge_class(attributes, "money").merge("data-type" => "money")
183
- end
184
-
185
- def percent_input(key, attributes = {})
186
- base_input :string, key, merge_class(attributes, "percent").merge("data-type" => "percent")
187
- end
188
-
189
- def watched_input(key, attributes = {})
190
- text_input key, merge_class(attributes, "watch-characters").merge(:"data-character-count" => (attributes.delete(:count) || 100))
191
- # haml_tag :figure, :class => "watched"
192
- end
193
-
194
- def color_input(key, attributes = {})
195
-
196
- end
197
-
198
- def range_input(key, attributes = {})
199
-
200
- end
201
-
202
- def autocomplete_input(key, attributes = {})
203
-
204
- end
205
-
206
- def date_range_input(key, attributes = {})
207
-
208
- end
209
-
210
- def slider_input(key, attributes = {})
211
-
212
- end
213
-
214
- def state_input(key, attributes = {})
215
-
216
- end
217
-
218
- def partial(key, attributes = {})
219
-
220
- end
221
-
222
- def input_id(attribute, name = "input")
223
- ([keys] + [@index ? @index.to_s : nil, attribute]).compact.join("-").gsub("_", "-") + "-#{name}"
224
- end
225
-
226
- def input_name(attribute, options = {})
227
- param_for([keys] + [@index ? @index.to_s : nil, attribute])
228
- end
229
-
230
- def input_value(attribute, default = nil)
231
- return default if default.present?
232
-
233
- if object.respond_to?(attribute)
234
- object.send(attribute)
235
- else
236
- nil
237
- end
238
- end
239
-
240
- ## FORMTASTIC STUFF
241
- def create_boolean_collection(options) #:nodoc:
242
- options[:true] ||= ::Formtastic::I18n.t(:yes)
243
- options[:false] ||= ::Formtastic::I18n.t(:no)
244
- options[:value_as_class] = true unless options.key?(:value_as_class)
245
-
246
- [ [ options.delete(:true), true], [ options.delete(:false), false ] ]
247
- end
248
-
249
- def validation_max_limit
250
- 255
251
- end
252
-
253
- def default_text_field_size
254
- nil
255
- end
256
- end
257
- end
258
- end