active_form 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data.tar.gz.sig +2 -0
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/MIT-LICENSE +19 -0
- data/Manifest.txt +181 -0
- data/README.txt +1 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +71 -0
- data/config/requirements.rb +17 -0
- data/init.rb +5 -0
- data/lib/active_form.rb +86 -0
- data/lib/active_form/core_extensions.rb +179 -0
- data/lib/active_form/definition.rb +72 -0
- data/lib/active_form/element.rb +50 -0
- data/lib/active_form/elements/base.rb +67 -0
- data/lib/active_form/elements/builder.rb +103 -0
- data/lib/active_form/elements/button.rb +15 -0
- data/lib/active_form/elements/checkbox.rb +18 -0
- data/lib/active_form/elements/file.rb +15 -0
- data/lib/active_form/elements/hidden.rb +9 -0
- data/lib/active_form/elements/image.rb +7 -0
- data/lib/active_form/elements/input.rb +23 -0
- data/lib/active_form/elements/password.rb +12 -0
- data/lib/active_form/elements/radio.rb +18 -0
- data/lib/active_form/elements/reset.rb +15 -0
- data/lib/active_form/elements/section.rb +37 -0
- data/lib/active_form/elements/select.rb +42 -0
- data/lib/active_form/elements/submit.rb +19 -0
- data/lib/active_form/elements/text.rb +9 -0
- data/lib/active_form/elements/textarea.rb +18 -0
- data/lib/active_form/errors.rb +73 -0
- data/lib/active_form/facets/checkbox_group.rb +11 -0
- data/lib/active_form/facets/collection_input.rb +96 -0
- data/lib/active_form/facets/radio_group.rb +11 -0
- data/lib/active_form/facets/select_date.rb +10 -0
- data/lib/active_form/facets/select_datetime.rb +10 -0
- data/lib/active_form/facets/select_day.rb +17 -0
- data/lib/active_form/facets/select_from_model.rb +60 -0
- data/lib/active_form/facets/select_hour.rb +17 -0
- data/lib/active_form/facets/select_minute.rb +17 -0
- data/lib/active_form/facets/select_month.rb +46 -0
- data/lib/active_form/facets/select_numeric_range.rb +59 -0
- data/lib/active_form/facets/select_second.rb +17 -0
- data/lib/active_form/facets/select_time.rb +10 -0
- data/lib/active_form/facets/select_timebased.rb +145 -0
- data/lib/active_form/facets/select_weekday.rb +46 -0
- data/lib/active_form/facets/select_year.rb +24 -0
- data/lib/active_form/mixins/attribute_methods.rb +33 -0
- data/lib/active_form/mixins/casting.rb +152 -0
- data/lib/active_form/mixins/collection_element_methods.rb +204 -0
- data/lib/active_form/mixins/common_methods.rb +350 -0
- data/lib/active_form/mixins/container_methods.rb +417 -0
- data/lib/active_form/mixins/css_methods.rb +70 -0
- data/lib/active_form/mixins/element_methods.rb +314 -0
- data/lib/active_form/mixins/javascript_methods.rb +99 -0
- data/lib/active_form/mixins/loader_methods.rb +72 -0
- data/lib/active_form/mixins/option_element_methods.rb +61 -0
- data/lib/active_form/mixins/validation_methods.rb +253 -0
- data/lib/active_form/validator.rb +47 -0
- data/lib/active_form/validators/alpha.rb +9 -0
- data/lib/active_form/validators/alphanum.rb +9 -0
- data/lib/active_form/validators/base.rb +132 -0
- data/lib/active_form/validators/digits.rb +9 -0
- data/lib/active_form/validators/email.rb +29 -0
- data/lib/active_form/validators/format.rb +15 -0
- data/lib/active_form/validators/length_range.rb +24 -0
- data/lib/active_form/validators/number.rb +9 -0
- data/lib/active_form/validators/option_count.rb +24 -0
- data/lib/active_form/validators/proc.rb +22 -0
- data/lib/active_form/validators/required.rb +9 -0
- data/lib/active_form/validators/set.rb +21 -0
- data/lib/active_form/validators/time_range.rb +30 -0
- data/lib/active_form/validators/uri.rb +54 -0
- data/lib/active_form/version.rb +9 -0
- data/lib/active_form/views/fieldsets.rb +34 -0
- data/lib/active_form/views/plain.rb +32 -0
- data/lib/active_form/views/tables.rb +28 -0
- data/lib/active_form/widget.rb +43 -0
- data/lib/active_form/widgets/base.rb +28 -0
- data/lib/loob/uri_validator.rb +140 -0
- data/lib/rails/acts_as_dropdown/MIT-LICENSE +20 -0
- data/lib/rails/acts_as_dropdown/acts_as_dropdown.rb +119 -0
- data/lib/rails/acts_as_dropdown/dropdown.rb +27 -0
- data/lib/rails/controller_helper.rb +19 -0
- data/lib/rails/model/loader.rb +206 -0
- data/lib/rails/view_helper.rb +20 -0
- data/samples/html/css/style.css +175 -0
- data/samples/html/js/effects.js +958 -0
- data/samples/html/js/prototype.js +2006 -0
- data/samples/html/js/validation.js +228 -0
- data/samples/html/plain_view.html +77 -0
- data/samples/html/sample001.html +158 -0
- data/samples/html/sample002.html +76 -0
- data/samples/html/sample003.html +34 -0
- data/samples/layouts/default.rhtml +18 -0
- data/samples/layouts/plain.rhtml +21 -0
- data/samples/layouts/sample003.rhtml +25 -0
- data/samples/plain_view.rb +58 -0
- data/samples/sample001.rb +111 -0
- data/samples/sample002.rb +92 -0
- data/samples/sample003.rb +30 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +74 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +17 -0
- data/test/elements/test_base_element.rb +159 -0
- data/test/elements/test_builder_element.rb +81 -0
- data/test/elements/test_button_element.rb +12 -0
- data/test/elements/test_checkbox_element.rb +233 -0
- data/test/elements/test_file_element.rb +20 -0
- data/test/elements/test_hidden_element.rb +11 -0
- data/test/elements/test_image_element.rb +11 -0
- data/test/elements/test_input_element.rb +39 -0
- data/test/elements/test_password_element.rb +16 -0
- data/test/elements/test_radio_element.rb +197 -0
- data/test/elements/test_reset_element.rb +12 -0
- data/test/elements/test_section_element.rb +162 -0
- data/test/elements/test_select_element.rb +364 -0
- data/test/elements/test_submit_element.rb +12 -0
- data/test/elements/test_text_element.rb +91 -0
- data/test/elements/test_textarea_element.rb +23 -0
- data/test/facets/test_checkbox_group_element.rb +388 -0
- data/test/facets/test_radio_group_element.rb +312 -0
- data/test/facets/test_select_date_element.rb +211 -0
- data/test/facets/test_select_datetime_element.rb +56 -0
- data/test/facets/test_select_day_element.rb +37 -0
- data/test/facets/test_select_from_model_element.rb +86 -0
- data/test/facets/test_select_hour_element.rb +37 -0
- data/test/facets/test_select_minute_element.rb +52 -0
- data/test/facets/test_select_month_element.rb +79 -0
- data/test/facets/test_select_numeric_range_element.rb +14 -0
- data/test/facets/test_select_second_element.rb +48 -0
- data/test/facets/test_select_time_element.rb +148 -0
- data/test/facets/test_select_weekday_element.rb +71 -0
- data/test/facets/test_select_year_element.rb +73 -0
- data/test/fixtures/author.rb +11 -0
- data/test/fixtures/authors.yml +0 -0
- data/test/fixtures/book.rb +14 -0
- data/test/fixtures/books.yml +8 -0
- data/test/fixtures/categories.yml +0 -0
- data/test/fixtures/categorization.rb +2 -0
- data/test/fixtures/categorizations.yml +0 -0
- data/test/fixtures/category.rb +8 -0
- data/test/fixtures/publisher.rb +5 -0
- data/test/fixtures/publishers.yml +10 -0
- data/test/fixtures/schema.rb +43 -0
- data/test/rails/test_model_autodefinition.rb +121 -0
- data/test/rails/test_model_loader.rb +61 -0
- data/test/resources/elements/chunky.rb +11 -0
- data/test/resources/forms/demo.rb +5 -0
- data/test/resources/models/book.rb +8 -0
- data/test/resources/models/register_publisher.rb +5 -0
- data/test/resources/sections/demo.rb +6 -0
- data/test/resources/sections/foo.rb +6 -0
- data/test/resources/validators/foo.rb +9 -0
- data/test/resources/widgets/custom.rb +13 -0
- data/test/test_active_form.rb +1050 -0
- data/test/test_casting.rb +124 -0
- data/test/test_definition.rb +68 -0
- data/test/test_definition_class.rb +118 -0
- data/test/test_element_class.rb +201 -0
- data/test/test_helper.rb +74 -0
- data/test/test_javascript.rb +234 -0
- data/test/test_load_definition.rb +68 -0
- data/test/test_load_element.rb +35 -0
- data/test/test_load_section_element.rb +43 -0
- data/test/test_load_validator.rb +31 -0
- data/test/test_load_widget.rb +93 -0
- data/test/test_validation.rb +722 -0
- data/test/validators/test_validates_as_alpha.rb +26 -0
- data/test/validators/test_validates_as_alphanum.rb +26 -0
- data/test/validators/test_validates_as_digits.rb +26 -0
- data/test/validators/test_validates_as_email.rb +29 -0
- data/test/validators/test_validates_as_number.rb +26 -0
- data/test/validators/test_validates_as_uri.rb +128 -0
- data/test/validators/test_validates_with_format.rb +26 -0
- data/test/validators/test_validates_within_length_range.rb +46 -0
- data/test/validators/test_validates_within_set.rb +46 -0
- data/test/validators/test_validates_within_time_range.rb +53 -0
- metadata +307 -0
- metadata.gz.sig +4 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
module ActiveForm::Mixins::CollectionElementMethods
|
|
2
|
+
|
|
3
|
+
def self.included(base)
|
|
4
|
+
base.send(:include, Enumerable)
|
|
5
|
+
|
|
6
|
+
base.send(:alias_method, :values, :element_value)
|
|
7
|
+
base.send(:alias_method, :value, :element_value)
|
|
8
|
+
|
|
9
|
+
base.send(:alias_method, :selected=, :element_value=)
|
|
10
|
+
base.send(:alias_method, :update_from_params, :element_value=)
|
|
11
|
+
base.send(:alias_method, :params=, :element_value=)
|
|
12
|
+
base.send(:alias_method, :initial_value=, :element_value=)
|
|
13
|
+
base.send(:alias_method, :update_value, :element_value=)
|
|
14
|
+
base.send(:alias_method, :values=, :element_value=)
|
|
15
|
+
base.send(:alias_method, :value=, :element_value=)
|
|
16
|
+
base.send(:alias_method, :binding=, :element_value=)
|
|
17
|
+
base.send(:alias_method, :bind_to, :element_value=)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def each(&block)
|
|
21
|
+
options.each(&block)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def recurse(&block)
|
|
25
|
+
options.each do |option|
|
|
26
|
+
if option.kind_of?(ActiveForm::Element::CollectionOptionGroup)
|
|
27
|
+
option.options.each(&block)
|
|
28
|
+
else
|
|
29
|
+
block.call(option)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def element_name
|
|
35
|
+
elem_name = super
|
|
36
|
+
elem_name << '[]' if multiple?
|
|
37
|
+
elem_name
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def element_value
|
|
41
|
+
multiple? ? [*super].compact.flatten : [*super].compact.first
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def element_value=(val)
|
|
45
|
+
super(cast_value(multiple? ? [*val].compact.flatten : val.respond_to?(:compact) ? [*val].compact.first : val))
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def default_value
|
|
49
|
+
multiple? ? [] : super
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def fallback_value=(value)
|
|
53
|
+
if multiple?
|
|
54
|
+
@fallback_value = value.respond_to?(:to_a) ? value.to_a : [value].flatten
|
|
55
|
+
else
|
|
56
|
+
@fallback_value = [*value].compact.first
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def option_labels
|
|
61
|
+
results = []
|
|
62
|
+
self.recurse { |option| results << option.label }
|
|
63
|
+
results
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def option_values
|
|
67
|
+
results = []
|
|
68
|
+
self.recurse { |option| results << option.value }
|
|
69
|
+
results
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def valid_option?(value)
|
|
73
|
+
(option_values + [*fallback_value] + [*default_value]).compact.include?(value)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def valid_value?
|
|
77
|
+
raw_values = [*element_value]
|
|
78
|
+
(raw_values & option_values).length == raw_values.length
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def options
|
|
82
|
+
@options ||= []
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def options=(values)
|
|
86
|
+
reset_options!
|
|
87
|
+
add_options(values)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def add_options(values)
|
|
91
|
+
values.each { |value| add_option(value) }
|
|
92
|
+
end
|
|
93
|
+
alias :append :add_options
|
|
94
|
+
|
|
95
|
+
def add_option(value)
|
|
96
|
+
if value.kind_of?(ActiveForm::Element::CollectionOption)
|
|
97
|
+
self.options << value
|
|
98
|
+
elsif (value.kind_of?(Array) || value.kind_of?(Set))
|
|
99
|
+
self.options << ActiveForm::Element::CollectionOption.new(value.first, value.last)
|
|
100
|
+
else
|
|
101
|
+
self.options << ActiveForm::Element::CollectionOption.new(value, value)
|
|
102
|
+
end
|
|
103
|
+
self
|
|
104
|
+
end
|
|
105
|
+
alias :<< :add_option
|
|
106
|
+
|
|
107
|
+
def option(label, value = nil)
|
|
108
|
+
self << [label, (value || label)]
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def reset_options!
|
|
112
|
+
@options = []
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def empty_option=(label = '--')
|
|
116
|
+
add_empty_option(label)
|
|
117
|
+
end
|
|
118
|
+
alias :empty= :empty_option=
|
|
119
|
+
|
|
120
|
+
def add_empty=(value)
|
|
121
|
+
add_empty_option if value
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def add_empty_option(label = '--', value = :blank)
|
|
125
|
+
self.options.unshift(ActiveForm::Element::CollectionOption.new(label, value))
|
|
126
|
+
end
|
|
127
|
+
alias :add_empty :add_empty_option
|
|
128
|
+
|
|
129
|
+
def add_optgroup(*args, &block)
|
|
130
|
+
self.options << ActiveForm::Element::CollectionOptionGroup.new(*args, &block)
|
|
131
|
+
end
|
|
132
|
+
alias :option_group :add_optgroup
|
|
133
|
+
|
|
134
|
+
def select_first=(bool = true)
|
|
135
|
+
self.element_value = option_values.first if bool
|
|
136
|
+
end
|
|
137
|
+
alias :select_first :select_first=
|
|
138
|
+
|
|
139
|
+
def selected_value?(value)
|
|
140
|
+
multiple? ? (element_value || []).include?(value) : element_value == value
|
|
141
|
+
end
|
|
142
|
+
alias :selected? :selected_value?
|
|
143
|
+
|
|
144
|
+
def selected_option_label
|
|
145
|
+
self.options.inject([]) { |ary, opt| ary << opt.label if selected_value?(opt.value); ary }.join(', ')
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def blank?
|
|
149
|
+
element_value.blank? || !valid_value?
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def required=(value)
|
|
153
|
+
if value.kind_of?(Numeric)
|
|
154
|
+
min_required = value.kind_of?(Numeric) ? value.to_i : 0
|
|
155
|
+
max_required = min_required
|
|
156
|
+
elsif value.respond_to?(:first) && value.respond_to?(:last)
|
|
157
|
+
min_required = value.first.to_i
|
|
158
|
+
max_required = value.last.to_i
|
|
159
|
+
else
|
|
160
|
+
min_required = 0
|
|
161
|
+
max_required = 0
|
|
162
|
+
end
|
|
163
|
+
validate_with_count = (min_required > 0 || (min_required == 0 && max_required > 0))
|
|
164
|
+
self.option_flags[:required] = value.to_s.to_boolean || validate_with_count
|
|
165
|
+
if self.option_flags[:required]
|
|
166
|
+
if validate_with_count
|
|
167
|
+
validates_with_option_count :code => 'required', :range => (min_required..max_required)
|
|
168
|
+
else
|
|
169
|
+
validates_as_required
|
|
170
|
+
end
|
|
171
|
+
else
|
|
172
|
+
validators.delete_if { |v| v.code == 'required' }
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
class ActiveForm::Element::CollectionOption
|
|
179
|
+
|
|
180
|
+
attr_accessor :label, :value
|
|
181
|
+
|
|
182
|
+
def initialize(label, value)
|
|
183
|
+
@label, @value = label.to_s, value
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
class ActiveForm::Element::CollectionOptionGroup
|
|
189
|
+
|
|
190
|
+
include ActiveForm::Mixins::CollectionElementMethods
|
|
191
|
+
|
|
192
|
+
attr_accessor :label
|
|
193
|
+
|
|
194
|
+
def initialize(label, options = [], &block)
|
|
195
|
+
@label = label.to_s
|
|
196
|
+
self.options = options
|
|
197
|
+
block.call(self) if block_given?
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def value
|
|
201
|
+
@options.collect(&:value)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
end
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
module ActiveForm::Mixins::CommonMethods
|
|
2
|
+
|
|
3
|
+
def self.included(base)
|
|
4
|
+
base.send(:attr_reader, :name)
|
|
5
|
+
base.send(:attr_writer, :label, :description)
|
|
6
|
+
base.send(:attr_accessor, :group)
|
|
7
|
+
|
|
8
|
+
base.send(:include, ActiveForm::Mixins::CssMethods)
|
|
9
|
+
base.send(:include, ActiveForm::Mixins::JavascriptMethods)
|
|
10
|
+
base.send(:include, ActiveForm::Mixins::ValidationMethods)
|
|
11
|
+
|
|
12
|
+
base.send(:include, StubInstanceMethods)
|
|
13
|
+
base.send(:extend, StubClassMethods)
|
|
14
|
+
base.send(:extend, ClassMethods)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def initialize(*args, &block)
|
|
18
|
+
setup
|
|
19
|
+
initialize_element(*args, &block)
|
|
20
|
+
after_initialize
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def setup
|
|
24
|
+
self.class.setup_method(self) if self.class.respond_to?(:setup_method)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def after_initialize
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def rebuild!
|
|
31
|
+
after_initialize
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def definition?
|
|
35
|
+
self.class.definition?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def element?
|
|
39
|
+
self.class.element?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def container?
|
|
43
|
+
self.class.container?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def group?
|
|
47
|
+
self.class.group?
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def is_element?(arg)
|
|
51
|
+
arg.respond_to?(:element?) && arg.element?
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def is_container?(arg)
|
|
55
|
+
arg.respond_to?(:container?) && arg.container?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def blank?
|
|
59
|
+
element_value.blank?
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def option_flags
|
|
63
|
+
@option_flags ||= HashWithIndifferentAccess.new
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def option_flag_names
|
|
67
|
+
self.class.element_option_flag_names
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def option_flag_attributes
|
|
71
|
+
Hash.new
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def html_flags
|
|
75
|
+
@html_flags ||= HashWithIndifferentAccess.new
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def html_flag_names
|
|
79
|
+
self.class.element_html_flag_names
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def html_flag_attributes
|
|
83
|
+
html_flag_names.inject({}) { |attrs, flag| attrs[flag.to_s] = flag.to_s if send("#{flag}?"); attrs }
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def render_input(builder = create_builder, wrapped = false)
|
|
87
|
+
render_call(builder, wrapped).call
|
|
88
|
+
end
|
|
89
|
+
alias :to_input :render_input
|
|
90
|
+
|
|
91
|
+
def to_html(builder = create_builder, &block)
|
|
92
|
+
render_wrapper, wrapped = wrapper(&block)
|
|
93
|
+
render_wrapper.call(builder, self, render_call(builder, wrapped))
|
|
94
|
+
end
|
|
95
|
+
alias :to_s :to_html
|
|
96
|
+
alias :to_element :to_html
|
|
97
|
+
|
|
98
|
+
def render(builder = create_builder, &block)
|
|
99
|
+
html = "<!--o" + "[ #{identifier} ]".center(64, '-') + "o-->\n"
|
|
100
|
+
html << validation_advice.to_s
|
|
101
|
+
html << to_html(builder, &block)
|
|
102
|
+
html << script_tag
|
|
103
|
+
html << "<!--x" + "[ #{identifier} ]".center(64, '-') + "x-->\n"
|
|
104
|
+
html
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def display(builder = create_builder, &block)
|
|
108
|
+
puts render(builder, &block)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def render_call(builder = create_builder, wrapped = false)
|
|
112
|
+
if wrapped
|
|
113
|
+
lambda do
|
|
114
|
+
skipclass = skip_css_class?
|
|
115
|
+
skipstyle = skip_css_style?
|
|
116
|
+
self.skip_css_class = true
|
|
117
|
+
self.skip_css_style = true
|
|
118
|
+
frozen? ? render_frozen(builder) : render_element(builder)
|
|
119
|
+
self.skip_css_class = skipclass
|
|
120
|
+
self.skip_css_style = skipstyle
|
|
121
|
+
end
|
|
122
|
+
else
|
|
123
|
+
lambda do
|
|
124
|
+
frozen? ? render_frozen(builder) : render_element(builder)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def wrapper(&block)
|
|
130
|
+
if container? && !contained?
|
|
131
|
+
wrapper_name, default_name = :container_wrapper, :default_container_wrapper
|
|
132
|
+
else
|
|
133
|
+
wrapper_name, default_name = :element_wrapper, :default_element_wrapper
|
|
134
|
+
end
|
|
135
|
+
wrapped, wrapper = [true, block ] if block_given?
|
|
136
|
+
wrapped, wrapper = [true, self.method_to_proc(wrapper_name) ] if wrapper.nil? && self.respond_to?(wrapper_name)
|
|
137
|
+
wrapped, wrapper = [true, self.class.method_to_proc(wrapper_name) ] if wrapper.nil? && self.class.respond_to?(wrapper_name)
|
|
138
|
+
wrapped, wrapper = [false, self.class.method_to_proc(default_name) ] if wrapper.nil?
|
|
139
|
+
[wrapper, wrapped]
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def define_container_wrapper(prc = nil, &block)
|
|
143
|
+
define_singleton_method(:container_wrapper, &(block_given? ? block : prc)) if container?
|
|
144
|
+
end
|
|
145
|
+
alias :container_wrapper= :define_container_wrapper
|
|
146
|
+
|
|
147
|
+
def reset_container_wrapper
|
|
148
|
+
undefine_singleton_method(:container_wrapper) rescue nil
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def define_element_wrapper(prc = nil, &block)
|
|
152
|
+
define_singleton_method(:element_wrapper, &(block_given? ? block : prc))
|
|
153
|
+
end
|
|
154
|
+
alias :element_wrapper= :define_element_wrapper
|
|
155
|
+
|
|
156
|
+
def reset_element_wrapper
|
|
157
|
+
undefine_singleton_method(:element_wrapper) rescue nil
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def value_to_identifier(value)
|
|
161
|
+
str = value.to_s.downcase.strip
|
|
162
|
+
str.gsub!(/\s+/, '_')
|
|
163
|
+
str.gsub!(/[\x00-\x1f]|[\xc0-\xfd][\x80-\xbf]+/) { "#{$&.unpack('U')[0]}" rescue '_' }
|
|
164
|
+
str.gsub!(/[^a-z0-9_]/, ' ')
|
|
165
|
+
str.gsub!(/^([\s_]+)/, '')
|
|
166
|
+
str.gsub!(/([\s_]+)$/, '')
|
|
167
|
+
str.gsub!(/\s+/, '_')
|
|
168
|
+
str.gsub!(/_{2,}/, '_')
|
|
169
|
+
str.strip
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
module ClassMethods
|
|
173
|
+
|
|
174
|
+
def definition?
|
|
175
|
+
self.kind_of?(ActiveForm::Definition)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def element?
|
|
179
|
+
self.included_modules.include?(ActiveForm::Mixins::ElementMethods)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def container?
|
|
183
|
+
self.included_modules.include?(ActiveForm::Mixins::ContainerMethods)
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def group?
|
|
187
|
+
false
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def define_html_flags(*flags)
|
|
191
|
+
skip_methods = (flags.last == false ? !flags.pop : false)
|
|
192
|
+
flags.flatten.each do |flag|
|
|
193
|
+
self.element_html_flag_names += [flag.to_sym]
|
|
194
|
+
unless skip_methods
|
|
195
|
+
define_method("#{flag}=") { |value| self.html_flags[flag.to_sym] = value.to_s.to_boolean } unless instance_methods.include?("#{flag}=")
|
|
196
|
+
define_method("#{flag}?") { self.html_flags[flag.to_sym] == true } unless instance_methods.include?("#{flag}?")
|
|
197
|
+
define_method("#{flag}") { self.html_flags[flag.to_sym] } unless instance_methods.include?("#{flag}")
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def define_option_flags(*flags)
|
|
203
|
+
skip_methods = (flags.last == false ? !flags.pop : false)
|
|
204
|
+
flags.flatten.each do |flag|
|
|
205
|
+
self.element_option_flag_names += [flag.to_sym]
|
|
206
|
+
unless skip_methods
|
|
207
|
+
define_method("#{flag}=") { |value| self.option_flags[flag.to_sym] = value.to_s.to_boolean } unless instance_methods.include?("#{flag}=")
|
|
208
|
+
define_method("#{flag}?") { self.option_flags[flag.to_sym] == true } unless instance_methods.include?("#{flag}?")
|
|
209
|
+
define_method("#{flag}") { self.option_flags[flag.to_sym] } unless instance_methods.include?("#{flag}")
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def default_container_wrapper(builder, elem, render)
|
|
215
|
+
render.call
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def define_container_wrapper(prc = nil, &block)
|
|
219
|
+
define_singleton_method(:container_wrapper, &(block_given? ? block : prc)) if container?
|
|
220
|
+
end
|
|
221
|
+
alias :container_wrapper= :define_container_wrapper
|
|
222
|
+
|
|
223
|
+
def reset_container_wrapper
|
|
224
|
+
undefine_singleton_method(:container_wrapper) rescue nil
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def default_element_wrapper(builder, elem, render)
|
|
228
|
+
render.call
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def define_element_wrapper(prc = nil, &block)
|
|
232
|
+
define_singleton_method(:element_wrapper, &(block_given? ? block : prc))
|
|
233
|
+
end
|
|
234
|
+
alias :element_wrapper= :define_element_wrapper
|
|
235
|
+
|
|
236
|
+
def reset_element_wrapper
|
|
237
|
+
undefine_singleton_method(:element_wrapper) rescue nil
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
module StubInstanceMethods
|
|
243
|
+
|
|
244
|
+
def label
|
|
245
|
+
raise ActiveForm::StubException
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def title
|
|
249
|
+
raise ActiveForm::StubException
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def description
|
|
253
|
+
raise ActiveForm::StubException
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def initialize_element(*args)
|
|
257
|
+
raise ActiveForm::StubException
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def initialize_properties
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def identifier
|
|
264
|
+
raise ActiveForm::StubException
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def element_name
|
|
268
|
+
raise ActiveForm::StubException
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def export_value
|
|
272
|
+
raise ActiveForm::StubException
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def element_value
|
|
276
|
+
raise ActiveForm::StubException
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def element_value=(value)
|
|
280
|
+
raise ActiveForm::StubException
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
def label_attributes
|
|
284
|
+
raise ActiveForm::StubException
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def render_label(builder = create_builder)
|
|
288
|
+
raise ActiveForm::StubException
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
def render_frozen(builder = create_builder)
|
|
292
|
+
raise ActiveForm::StubException
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
def render_element(builder = create_builder)
|
|
296
|
+
raise ActiveForm::StubException
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def frozen?
|
|
300
|
+
raise ActiveForm::StubException
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def hidden?
|
|
304
|
+
raise ActiveForm::StubException
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
def disabled?
|
|
308
|
+
raise ActiveForm::StubException
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def required?
|
|
312
|
+
raise ActiveForm::StubException
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def contained?
|
|
316
|
+
raise ActiveForm::StubException
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def localized?
|
|
320
|
+
raise ActiveForm::StubException
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def localize(*args)
|
|
324
|
+
raise ActiveForm::StubException
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def create_builder
|
|
328
|
+
Builder::XhtmlMarkup.new(:indent => 2)
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
module StubClassMethods
|
|
334
|
+
|
|
335
|
+
def create(*args, &block)
|
|
336
|
+
raise ActiveForm::StubException
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def setup(prc = nil, &block)
|
|
340
|
+
define_singleton_method(:setup_method, &(block_given? ? block : prc))
|
|
341
|
+
end
|
|
342
|
+
alias :setup_proc= :setup
|
|
343
|
+
|
|
344
|
+
def reset_setup
|
|
345
|
+
undefine_singleton_method(:setup_method) rescue nil
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
end
|