simple_form_nested_fields 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +1 -1
- data/README.md +14 -7
- data/lib/assets/javascripts/simple_form_nested_fields__links.coffee +6 -1
- data/lib/simple_form_nested_fields/nested_fields_builder.rb +68 -20
- data/lib/simple_form_nested_fields/version.rb +1 -1
- data/package.json +1 -1
- data/package/dist/index.js +16 -3
- data/package/src/__links.coffee +6 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 777df20aaed96a6a38e9a46763102c7f14bf64e729a7ccf20dda5f12fb3fc389
|
4
|
+
data.tar.gz: c0e99aa18e7cfabfba0dc388efe87bbaffa171bd5e929ad30f163b43c544d8cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db98c8de682982c7491974f975d6bcb9adf294c750b6b0255a5b0d9b50726aea3ad10112e62b48232f0985857fef1a77305a8640028c31527ac9f34dc6bc5e13
|
7
|
+
data.tar.gz: f33490c2edb4542051188f4131805445fa19bdb8df917b21b0b757917ae35b05ac8704cbe142635c52017476c96fc0b84fa52dba8120cff219f79d605616459e
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 0.3.0
|
4
|
+
|
5
|
+
* added support for inheritance and multiple item types (configurable via the `item_classes` option)
|
6
|
+
* with subclasses, the `_type` hidden field is inserted automatically
|
7
|
+
* when sortable, the `position` hidden field is inserted automatically
|
8
|
+
|
3
9
|
## 0.2.1
|
4
10
|
|
5
11
|
* [PR#3](https://github.com/tomasc/simple_form_nested_fields/pull/3) fix duplicate dom classes
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -83,6 +83,19 @@ helper:
|
|
83
83
|
= fields.input :body
|
84
84
|
```
|
85
85
|
|
86
|
+
### Inheritance
|
87
|
+
|
88
|
+
Subclassing of the relation class is handled automatically by default with:
|
89
|
+
|
90
|
+
* partials corresponding to each subclass
|
91
|
+
* select input next to the add link that allows the user choose the subclass to be added
|
92
|
+
|
93
|
+
The choice of classes can be configured as follows:
|
94
|
+
|
95
|
+
```slim
|
96
|
+
= f.nested_fields_for :variants, nil, item_classes: [MyDoc::Variant::One, MyDoc::Variant::Two]
|
97
|
+
```
|
98
|
+
|
86
99
|
### Sortable
|
87
100
|
|
88
101
|
Making the nested fields sortable is straight forward.
|
@@ -117,13 +130,7 @@ have to pass the second parameter: the collection/record object):
|
|
117
130
|
= f.submit
|
118
131
|
```
|
119
132
|
|
120
|
-
|
121
|
-
|
122
|
-
```slim
|
123
|
-
// app/views/my_docs/texts/_fields.html.slim
|
124
|
-
= fields.input :position, as: :hidden
|
125
|
-
= fields.input :body
|
126
|
-
```
|
133
|
+
Please note the `position` input is automatically added to the partial.
|
127
134
|
|
128
135
|
### Configuration
|
129
136
|
|
@@ -25,8 +25,13 @@ do ($ = jQuery, window, document) ->
|
|
25
25
|
@$element.off "click.#{@_name}", '.simple_form_nested_fields__link--add'
|
26
26
|
|
27
27
|
get_index: -> new Date().getTime()
|
28
|
-
|
28
|
+
get_item_class_name: -> @get_select().val()
|
29
29
|
get_items_container: -> @$element.find('.simple_form_nested_fields__items')
|
30
|
+
get_template: (link) ->
|
31
|
+
item_class_name = @get_item_class_name()
|
32
|
+
$template = @$element.find("template[data-class='#{item_class_name}']").first()
|
33
|
+
$template.html().replace(@options.regexp, @get_index())
|
34
|
+
get_select: -> @$element.find('.simple_form_nested_fields__select--add')
|
30
35
|
|
31
36
|
add_new_item: (link) ->
|
32
37
|
$template = $(@get_template(link))
|
@@ -16,13 +16,17 @@ module SimpleFormNestedFields
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def_delegators :builder, :object, :object_name, :simple_fields_for
|
19
|
-
def_delegators :template, :concat, :content_tag, :hidden_field_tag, :link_to, :render
|
19
|
+
def_delegators :template, :concat, :content_tag, :hidden_field_tag, :select_tag, :options_for_select, :link_to, :render
|
20
20
|
|
21
21
|
def nested_fields_for
|
22
22
|
content_tag(:div, class: wrapper_class) do
|
23
23
|
concat nested_fields_title
|
24
24
|
concat nested_fields_items
|
25
25
|
concat nested_fields_links
|
26
|
+
|
27
|
+
item_classes.each do |cls|
|
28
|
+
concat nested_fields_template(cls)
|
29
|
+
end
|
26
30
|
end
|
27
31
|
end
|
28
32
|
|
@@ -34,11 +38,24 @@ module SimpleFormNestedFields
|
|
34
38
|
end
|
35
39
|
|
36
40
|
def is_sortable?
|
37
|
-
options
|
41
|
+
options.fetch(:sortable, false)
|
42
|
+
end
|
43
|
+
|
44
|
+
def multiple_item_classes?
|
45
|
+
item_classes.length > 1
|
46
|
+
end
|
47
|
+
|
48
|
+
def item_classes
|
49
|
+
options.fetch(:item_classes) do
|
50
|
+
return relation.klass.descendants if relation.klass.descendants.present?
|
51
|
+
[relation.klass]
|
52
|
+
end
|
38
53
|
end
|
39
54
|
|
40
|
-
def partial_path
|
41
|
-
options.fetch(:partial
|
55
|
+
def partial_path(cls)
|
56
|
+
options.fetch(:partial) do
|
57
|
+
File.join(object.model_name.collection, cls.model_name.collection, 'fields')
|
58
|
+
end
|
42
59
|
end
|
43
60
|
|
44
61
|
def relation
|
@@ -51,15 +68,24 @@ module SimpleFormNestedFields
|
|
51
68
|
content_tag(:div, title, class: dom_class).html_safe
|
52
69
|
end
|
53
70
|
|
71
|
+
def nested_fields_item_class_name(cls)
|
72
|
+
return unless multiple_item_classes?
|
73
|
+
dom_class = bem_class(e: :item_class_name)
|
74
|
+
content_tag(:div, cls.model_name.human, class: dom_class).html_safe
|
75
|
+
end
|
76
|
+
|
54
77
|
def nested_fields_items
|
55
78
|
content_tag(:div, class: bem_class(e: :items)) do
|
56
79
|
simple_fields_for(record_name, record_object, options) do |fields|
|
57
|
-
dom_class = bem_class(e: :item
|
58
|
-
dom_data = { id: fields.object.id.to_s }
|
80
|
+
dom_class = bem_class(e: :item)
|
81
|
+
dom_data = { id: fields.object.id.to_s, class: fields.object.class.to_s }
|
59
82
|
|
60
83
|
content_tag(:div, class: dom_class, data: dom_data) do
|
84
|
+
concat nested_fields_item_class_name(fields.object.class)
|
61
85
|
concat nested_fields_item_handle
|
62
|
-
concat
|
86
|
+
concat nested_fields__type_input(fields)
|
87
|
+
concat nested_fields_position_input(fields)
|
88
|
+
concat render(partial_path(fields.object.class), fields: fields)
|
63
89
|
concat link_to_remove(fields)
|
64
90
|
end
|
65
91
|
end
|
@@ -68,13 +94,23 @@ module SimpleFormNestedFields
|
|
68
94
|
|
69
95
|
def nested_fields_links
|
70
96
|
dom_class = bem_class(e: :links)
|
71
|
-
content_tag(:div,
|
97
|
+
content_tag(:div, class: dom_class) do
|
98
|
+
concat select_for_add
|
99
|
+
concat link_to_add
|
100
|
+
end.html_safe
|
101
|
+
end
|
102
|
+
|
103
|
+
def select_for_add
|
104
|
+
dom_class = bem_class(e: :select, m: :add)
|
105
|
+
dom_style = ""
|
106
|
+
dom_style = "display: none;" unless multiple_item_classes?
|
107
|
+
select_tag nil, options_for_select(item_classes.map { |kls| [kls.model_name.human, kls.to_s] }), class: dom_class, style: dom_style
|
72
108
|
end
|
73
109
|
|
74
110
|
def link_to_add
|
75
111
|
label = options.fetch(:label_add, ::I18n.t(:add, scope: %i[simple_form_nested_fields links], model_name: relation.klass.model_name.human))
|
76
|
-
dom_class =
|
77
|
-
dom_data = {
|
112
|
+
dom_class = bem_class(e: :link, m: :add)
|
113
|
+
dom_data = { turbolinks: 'false' }
|
78
114
|
link_to(label, '#', class: dom_class, data: dom_data).html_safe
|
79
115
|
end
|
80
116
|
|
@@ -84,17 +120,29 @@ module SimpleFormNestedFields
|
|
84
120
|
content_tag(:div, nil, class: dom_class).html_safe
|
85
121
|
end
|
86
122
|
|
87
|
-
def
|
88
|
-
|
89
|
-
|
123
|
+
def nested_fields_position_input(fields)
|
124
|
+
return unless is_sortable?
|
125
|
+
fields.input(:position, as: :hidden).html_safe
|
126
|
+
end
|
127
|
+
|
128
|
+
def nested_fields__type_input(fields)
|
129
|
+
return unless fields.object.respond_to?(:_type)
|
130
|
+
fields.input(:_type, as: :hidden).html_safe
|
90
131
|
end
|
91
132
|
|
92
|
-
def
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
133
|
+
def nested_fields_template(cls)
|
134
|
+
content_tag :template, data: { class: cls.to_s } do
|
135
|
+
content_tag :div, class: bem_class(e: :item), data: { class: cls.to_s } do
|
136
|
+
simple_fields_for(record_name, cls.new, child_index: CHILD_INDEX_STRING) do |fields|
|
137
|
+
concat nested_fields_item_class_name(cls)
|
138
|
+
concat nested_fields_item_handle
|
139
|
+
concat nested_fields__type_input(fields)
|
140
|
+
concat nested_fields_position_input(fields)
|
141
|
+
concat render(partial_path(cls), fields: fields)
|
142
|
+
concat link_to_remove(fields)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
98
146
|
end
|
99
147
|
|
100
148
|
def destroy_field_tag(fields)
|
@@ -104,7 +152,7 @@ module SimpleFormNestedFields
|
|
104
152
|
|
105
153
|
def link_to_remove(fields, options = {})
|
106
154
|
label = options.fetch(:label, ::I18n.t(:remove, scope: %i[simple_form_nested_fields links]))
|
107
|
-
dom_class =
|
155
|
+
dom_class = bem_class(e: :link, m: :remove)
|
108
156
|
dom_data = { turbolinks: 'false' }
|
109
157
|
[
|
110
158
|
destroy_field_tag(fields),
|
data/package.json
CHANGED
data/package/dist/index.js
CHANGED
@@ -154,15 +154,28 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
|
|
154
154
|
return new Date().getTime();
|
155
155
|
}
|
156
156
|
}, {
|
157
|
-
key: '
|
158
|
-
value: function
|
159
|
-
return
|
157
|
+
key: 'get_item_class_name',
|
158
|
+
value: function get_item_class_name() {
|
159
|
+
return this.get_select().val();
|
160
160
|
}
|
161
161
|
}, {
|
162
162
|
key: 'get_items_container',
|
163
163
|
value: function get_items_container() {
|
164
164
|
return this.$element.find('.simple_form_nested_fields__items');
|
165
165
|
}
|
166
|
+
}, {
|
167
|
+
key: 'get_template',
|
168
|
+
value: function get_template(link) {
|
169
|
+
var $template, item_class_name;
|
170
|
+
item_class_name = this.get_item_class_name();
|
171
|
+
$template = this.$element.find('template[data-class=\'' + item_class_name + '\']').first();
|
172
|
+
return $template.html().replace(this.options.regexp, this.get_index());
|
173
|
+
}
|
174
|
+
}, {
|
175
|
+
key: 'get_select',
|
176
|
+
value: function get_select() {
|
177
|
+
return this.$element.find('.simple_form_nested_fields__select--add');
|
178
|
+
}
|
166
179
|
}, {
|
167
180
|
key: 'add_new_item',
|
168
181
|
value: function add_new_item(link) {
|
data/package/src/__links.coffee
CHANGED
@@ -24,8 +24,13 @@ do ($ = jQuery, window, document) ->
|
|
24
24
|
@$element.off "click.#{@_name}", '.simple_form_nested_fields__link--add'
|
25
25
|
|
26
26
|
get_index: -> new Date().getTime()
|
27
|
-
|
27
|
+
get_item_class_name: -> @get_select().val()
|
28
28
|
get_items_container: -> @$element.find('.simple_form_nested_fields__items')
|
29
|
+
get_template: (link) ->
|
30
|
+
item_class_name = @get_item_class_name()
|
31
|
+
$template = @$element.find("template[data-class='#{item_class_name}']").first()
|
32
|
+
$template.html().replace(@options.regexp, @get_index())
|
33
|
+
get_select: -> @$element.find('.simple_form_nested_fields__select--add')
|
29
34
|
|
30
35
|
add_new_item: (link) ->
|
31
36
|
$template = $(@get_template(link))
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_form_nested_fields
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomas Celizna
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-12-
|
12
|
+
date: 2018-12-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: simple_form
|