custom-attributes 0.2.5 → 0.2.12
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/README.markdown +9 -0
- data/VERSION +1 -1
- data/lib/active_record/custom_attributes/custom_attribute.rb +7 -7
- data/lib/active_record/custom_attributes/custom_attribute_list.rb +6 -10
- data/lib/formtastic/custom_attributes.rb +32 -22
- data/spec/custom_attributes/has_custom_attributes_spec.rb +13 -5
- metadata +4 -4
data/README.markdown
CHANGED
@@ -7,6 +7,15 @@ or weight and size measurements to products.
|
|
7
7
|
Most of these fields can be used purely dynamic and objects could have multiples of them (think telephone numbers, or email
|
8
8
|
addresses)
|
9
9
|
|
10
|
+
This code is *NOT* production ready yet!
|
11
|
+
|
12
|
+
TODO
|
13
|
+
====
|
14
|
+
- Make Formtastic extension better
|
15
|
+
- Supply specs for the formtastic part
|
16
|
+
- Make custom extensions work as nested forms (accept_attributes_for stuff)
|
17
|
+
|
18
|
+
|
10
19
|
Contents of the package
|
11
20
|
=======================
|
12
21
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.12
|
@@ -4,7 +4,7 @@ class ActiveRecord::CustomAttributes::CustomAttribute
|
|
4
4
|
@main_model = main_model
|
5
5
|
@item_list = item_list
|
6
6
|
@attribute_model = attribute_model
|
7
|
-
@
|
7
|
+
@marked_for_destruction = false
|
8
8
|
load if @attribute_model
|
9
9
|
end
|
10
10
|
|
@@ -12,7 +12,7 @@ class ActiveRecord::CustomAttributes::CustomAttribute
|
|
12
12
|
attr_accessor property
|
13
13
|
|
14
14
|
define_method "#{property}_with_activation=" do |new_value|
|
15
|
-
@
|
15
|
+
@marked_for_destruction = false
|
16
16
|
send("#{property}_without_activation=".to_sym, new_value)
|
17
17
|
end
|
18
18
|
alias_method_chain "#{property}=".to_sym, :activation
|
@@ -22,16 +22,16 @@ class ActiveRecord::CustomAttributes::CustomAttribute
|
|
22
22
|
item_list.rename_label_of self, new_name
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
26
|
-
@
|
25
|
+
def mark_for_destruction
|
26
|
+
@marked_for_destruction = true
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
30
|
-
@
|
29
|
+
def marked_for_destruction?
|
30
|
+
@marked_for_destruction
|
31
31
|
end
|
32
32
|
|
33
33
|
def save
|
34
|
-
attribute_model.destroy and return if
|
34
|
+
attribute_model.destroy and return if marked_for_destruction?
|
35
35
|
|
36
36
|
attribute_model.value_type = type.to_s
|
37
37
|
attribute_model.field_name = internal_label.to_s
|
@@ -8,18 +8,14 @@ class ActiveRecord::CustomAttributes::CustomAttributeList
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def set_post_data(post_data)
|
11
|
-
loaded_attributes.each(&:
|
11
|
+
loaded_attributes.each(&:mark_for_destruction)
|
12
12
|
post_data.each do |attribute_type, values|
|
13
13
|
attribute_type = attribute_type.to_sym
|
14
14
|
if supported_attribute_types.keys.include? attribute_type
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
label_list.each_with_index do |label, index|
|
19
|
-
add attribute_type, label, value_list[index]
|
15
|
+
values.each do |key, attributes|
|
16
|
+
add attribute_type, attributes["label"], attributes["value"] unless key == "%nr%"
|
20
17
|
end
|
21
|
-
|
22
|
-
end # TODO: Now what? Custom defined attributes also come here. Or should that be changed?
|
18
|
+
end
|
23
19
|
end
|
24
20
|
end
|
25
21
|
|
@@ -75,7 +71,7 @@ class ActiveRecord::CustomAttributes::CustomAttributeList
|
|
75
71
|
end
|
76
72
|
|
77
73
|
def attributes_of_type(type)
|
78
|
-
loaded_attributes.select { |i| i.type == type.to_sym and !i.
|
74
|
+
loaded_attributes.select { |i| i.type == type.to_sym and !i.marked_for_destruction? }
|
79
75
|
end
|
80
76
|
|
81
77
|
private
|
@@ -121,7 +117,7 @@ class ActiveRecord::CustomAttributes::CustomAttributeList
|
|
121
117
|
|
122
118
|
def get_value_of(type, internal_label)
|
123
119
|
found = get_attribute(type, internal_label)
|
124
|
-
return nil if found and found.
|
120
|
+
return nil if found and found.marked_for_destruction?
|
125
121
|
found.value if found
|
126
122
|
end
|
127
123
|
|
@@ -36,10 +36,12 @@ module Formtastic
|
|
36
36
|
storage_type = @object.custom_attributes.supported_attribute_types[attribute_type]
|
37
37
|
i18n_scope = [:activerecord, :custom_attributes, @object.class.model_name.underscore.to_sym]
|
38
38
|
|
39
|
+
index = 0
|
39
40
|
value_fields = @object.custom_attributes.attributes_of_type(attribute_type).collect do |attribute|
|
40
|
-
custom_field_input(attribute_type, [attribute_type, storage_type], attribute.label, attribute.value)
|
41
|
+
custom_field_input(attribute_type, [attribute_type, storage_type], attribute.label, attribute.value, index, {})
|
42
|
+
index += 1
|
41
43
|
end
|
42
|
-
field_template = custom_field_input(attribute_type, [attribute_type, storage_type], "", nil, :template => true)
|
44
|
+
field_template = custom_field_input(attribute_type, [attribute_type, storage_type], "", nil, "%nr%", :template => true)
|
43
45
|
|
44
46
|
attribute_human_name = ::I18n.t(attribute_type,
|
45
47
|
:count => 1,
|
@@ -51,7 +53,8 @@ module Formtastic
|
|
51
53
|
:class => "add-link",
|
52
54
|
:title => ::I18n.t(:add, :scope => :default_actions, :model => attribute_human_name),
|
53
55
|
:'data-attribute-type' => attribute_type
|
54
|
-
) <<
|
56
|
+
) << inline_hints_for(attribute_type, {}) <<
|
57
|
+
field_template << label_data_list_for(attribute_type, @object.custom_attributes.defined_labels_for(attribute_type)),
|
55
58
|
:class => "field-addition"
|
56
59
|
)
|
57
60
|
|
@@ -69,10 +72,13 @@ module Formtastic
|
|
69
72
|
association = @object.class.reflect_on_association(association_name)
|
70
73
|
storage_type = association.klass.model_name.underscore.to_sym
|
71
74
|
|
75
|
+
index = 0
|
72
76
|
value_fields = @object.send(association_name).collect do |item|
|
73
|
-
custom_field_input(storage_type, [storage_type], item.name, item)
|
77
|
+
result = custom_field_input(storage_type, [storage_type], item.name, item, index, {})
|
78
|
+
index += 1
|
79
|
+
result
|
74
80
|
end
|
75
|
-
field_template = custom_field_input(
|
81
|
+
field_template = custom_field_input(association_name, [storage_type], "", nil, "%nr%", :template => true)
|
76
82
|
|
77
83
|
attribute_human_name = association.klass.model_name.human
|
78
84
|
value_fields << content_tag(:li,
|
@@ -122,24 +128,28 @@ module Formtastic
|
|
122
128
|
|
123
129
|
end
|
124
130
|
|
125
|
-
def field_name_for(attribute_type, field_type)
|
131
|
+
def field_name_for(attribute_type, field_type, index)
|
126
132
|
if @object.custom_attributes.supported_attribute_types.keys.include? attribute_type
|
127
|
-
"#{@object.class.model_name.underscore}[custom_attributes][#{attribute_type}][#{
|
133
|
+
"#{@object.class.model_name.underscore}[custom_attributes][#{attribute_type}][#{index}][#{field_type}]"
|
128
134
|
else
|
129
|
-
"#{@object.class.model_name.underscore}[#{attribute_type}][#{
|
135
|
+
"#{@object.class.model_name.underscore}[#{attribute_type}_attributes][#{index}][#{field_type}]"
|
130
136
|
end
|
131
137
|
end
|
132
138
|
|
133
|
-
def custom_field_input(attribute_type, field_method_priority, label, value, options
|
134
|
-
label_name = field_name_for attribute_type, "label"
|
139
|
+
def custom_field_input(attribute_type, field_method_priority, label, value, index, options)
|
140
|
+
label_name = field_name_for attribute_type, "label", index
|
135
141
|
label_field = template.text_field_tag(label_name, label, :list => "#{attribute_type}-label-suggestions", :autocomplete => "off")
|
136
142
|
|
137
143
|
input_field_method = field_method_priority.collect { |m| "custom_#{m}_input".to_sym }.find { |m| self.respond_to? m, true }
|
138
|
-
input_field = send(input_field_method, attribute_type, value, options)
|
144
|
+
input_field = send(input_field_method, attribute_type, value, index, options)
|
139
145
|
|
140
|
-
|
141
|
-
|
142
|
-
|
146
|
+
field_contents = Formtastic::Util.html_safe(
|
147
|
+
content_tag(:div, label_field, :class => "label") << input_field
|
148
|
+
)
|
149
|
+
field_contents << template.hidden_field_tag(field_name_for(attribute_type, "_destroy", index),
|
150
|
+
false, :class => "delete_check") unless options[:template]
|
151
|
+
|
152
|
+
content_tag(options[:template] ? :div : :li, field_contents,
|
143
153
|
:class => options[:template] ? "template" : "value optional #{attribute_type}"
|
144
154
|
)
|
145
155
|
end
|
@@ -151,22 +161,22 @@ module Formtastic
|
|
151
161
|
|
152
162
|
## Field addition support
|
153
163
|
|
154
|
-
def custom_string_input(attribute_type, value, options = {})
|
155
|
-
default_custom_field_handler(:text_field_tag, attribute_type, value)
|
164
|
+
def custom_string_input(attribute_type, value, index, options = {})
|
165
|
+
default_custom_field_handler(:text_field_tag, attribute_type, value, index)
|
156
166
|
end
|
157
167
|
|
158
|
-
def custom_email_input(attribute_type, value, options = {})
|
159
|
-
default_custom_field_handler(:email_field_tag, attribute_type, value)
|
168
|
+
def custom_email_input(attribute_type, value, index, options = {})
|
169
|
+
default_custom_field_handler(:email_field_tag, attribute_type, value, index)
|
160
170
|
end
|
161
171
|
|
162
|
-
def custom_url_input(attribute_type, value, options = {})
|
163
|
-
default_custom_field_handler(:url_field_tag, attribute_type, value)
|
172
|
+
def custom_url_input(attribute_type, value, index, options = {})
|
173
|
+
default_custom_field_handler(:url_field_tag, attribute_type, value, index)
|
164
174
|
end
|
165
175
|
|
166
|
-
def default_custom_field_handler(method, attribute_type, value)
|
176
|
+
def default_custom_field_handler(method, attribute_type, value, index)
|
167
177
|
i18n_scope = [:activerecord, :custom_attributes, @object.class.model_name.underscore.to_sym]
|
168
178
|
attribute_human_name = ::I18n.t(attribute_type, :count => 1, :scope => i18n_scope + [:attribute_names]).capitalize
|
169
|
-
template.send(method, field_name_for(attribute_type, "value"), value) <<
|
179
|
+
template.send(method, field_name_for(attribute_type, "value", index), value) <<
|
170
180
|
custom_attribute_delete_link(attribute_human_name)
|
171
181
|
end
|
172
182
|
|
@@ -88,7 +88,7 @@ describe "Custom attributes of a person" do
|
|
88
88
|
|
89
89
|
fields = @person.custom_attributes.telephone_attributes
|
90
90
|
fields.should have(1).item
|
91
|
-
fields[0].
|
91
|
+
fields[0].mark_for_destruction
|
92
92
|
|
93
93
|
deleted_fields = @person.custom_attributes.telephone_attributes
|
94
94
|
deleted_fields.should have(0).items
|
@@ -102,12 +102,20 @@ describe "Custom attributes of a person" do
|
|
102
102
|
|
103
103
|
custom_attribute_post_data = {
|
104
104
|
"telephone" => {
|
105
|
-
"
|
106
|
-
|
105
|
+
"0" => {
|
106
|
+
"label" => "Prive",
|
107
|
+
"value" => "06 28 61 06 28"
|
108
|
+
},
|
109
|
+
"1" => {
|
110
|
+
"label" => "Werk",
|
111
|
+
"value" => "1234567890"
|
112
|
+
}
|
107
113
|
},
|
108
114
|
"email" => {
|
109
|
-
"
|
110
|
-
|
115
|
+
"0" => {
|
116
|
+
"label" => "Prive",
|
117
|
+
"value" => "matthijs.groen@gmail.com"
|
118
|
+
}
|
111
119
|
}
|
112
120
|
}
|
113
121
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: custom-attributes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 12
|
10
|
+
version: 0.2.12
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Matthijs Groen
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-10-
|
18
|
+
date: 2010-10-13 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|