activeadmin_dynamic_fields 0.1.5 → 0.2.8
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.
- checksums.yaml +5 -5
- data/README.md +65 -16
- data/Rakefile +2 -2
- data/app/assets/javascripts/activeadmin/dynamic_fields.js +156 -77
- data/lib/activeadmin/dynamic_fields.rb +2 -0
- data/lib/activeadmin/dynamic_fields/engine.rb +44 -0
- data/lib/activeadmin/dynamic_fields/version.rb +3 -1
- data/lib/activeadmin_dynamic_fields.rb +2 -0
- metadata +134 -12
- data/.gitignore +0 -3
- data/Gemfile +0 -4
- data/activeadmin_dynamic_fields.gemspec +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3b1a35cc8fb49264ee130c088dd680bde833cecdcb1fd5f2544b7111369c4f74
|
4
|
+
data.tar.gz: 5d72305f05e98728adcb05d03e2d3ffea6fc3c5707544de12c3a045691d45467
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a334732f34e9636c60dd6ba376fe0331fc7dbfddb50e5e7c78b7b294758381dacd85ca51a6a61b85b936a937e4d140a467b2f6fd6baf4952599878cbc7ffbfac
|
7
|
+
data.tar.gz: c9dd461761fff9e2194368ff22404fca87c688399798ea67ab17bdd292c5dcd2aff7eedd7f16fe44b30a17bc3eb4d76d43ada098ba4b25f57557844d9807a6e6
|
data/README.md
CHANGED
@@ -6,9 +6,10 @@ Features:
|
|
6
6
|
|
7
7
|
- set conditional checks on fields
|
8
8
|
- trigger some actions on other fields
|
9
|
+
- inline field editing
|
9
10
|
- create links to load some content in a dialog
|
10
11
|
|
11
|
-
The easiest way to show how this plugin works is looking the examples [below](#examples
|
12
|
+
The easiest way to show how this plugin works is looking the examples [below](#examples).
|
12
13
|
|
13
14
|
## Install
|
14
15
|
|
@@ -26,9 +27,11 @@ Options are passed to fields using *input_html* parameter as *data* attributes:
|
|
26
27
|
+ **not_checked**: check if a checkbox is not checked
|
27
28
|
+ **blank**: check if a field is blank
|
28
29
|
+ **not_blank**: check if a field is not blank
|
30
|
+
+ **changed**: check if the value of an input is changed (dirty)
|
29
31
|
- **data-eq**: check if a field has a specific value
|
30
32
|
- **data-not**: check if a field hasn't a specific value
|
31
|
-
- **data-target**: target css selector
|
33
|
+
- **data-target**: target css selector (from parent fieldset, look for the closest match)
|
34
|
+
- **data-gtarget**: target css selector globally
|
32
35
|
- **data-action**: the action to trigger, values:
|
33
36
|
+ **hide**: hides elements
|
34
37
|
+ **slide**: hides elements (using sliding)
|
@@ -39,24 +42,26 @@ Options are passed to fields using *input_html* parameter as *data* attributes:
|
|
39
42
|
- **data-function**: check the return value of a custom function
|
40
43
|
- **data-arg**: argument passed to the custom set function (as array of strings)
|
41
44
|
|
42
|
-
## Examples
|
45
|
+
## Examples
|
43
46
|
|
44
|
-
|
47
|
+
### Dynamic fields examples
|
48
|
+
|
49
|
+
- A checkbox that hides other fields if is checked (ex. model *Article*):
|
45
50
|
|
46
51
|
```rb
|
47
52
|
form do |f|
|
48
53
|
f.inputs 'Article' do
|
49
|
-
f.input :published, input_html: { data: { if: '
|
54
|
+
f.input :published, input_html: { data: { if: 'checked', action: 'hide', target: '.grp1' } }
|
50
55
|
f.input :online_date, wrapper_html: { class: 'grp1' }
|
51
|
-
f.input :
|
56
|
+
f.input :draft_notes, wrapper_html: { class: 'grp1' }
|
52
57
|
end
|
53
58
|
f.actions
|
54
59
|
end
|
55
60
|
```
|
56
61
|
|
57
|
-
- Add 3 classes (*first*, *second*, *third*) if a checkbox is
|
62
|
+
- Add 3 classes (*first*, *second*, *third*) if a checkbox is not checked:
|
58
63
|
|
59
|
-
`f.input :published, input_html: { data: { if: '
|
64
|
+
`f.input :published, input_html: { data: { if: 'not_checked', action: 'addClass first second third', target: '.grp1' } }`
|
60
65
|
|
61
66
|
- Set another field value if a string field is blank:
|
62
67
|
|
@@ -97,7 +102,45 @@ function on_change_category( el ) {
|
|
97
102
|
}
|
98
103
|
```
|
99
104
|
|
100
|
-
|
105
|
+
### Inline editing examples
|
106
|
+
|
107
|
+
- Prepare a custom member action to save data, an *update* helper function is available (third parameter is optional, allow to filter using strong parameters):
|
108
|
+
|
109
|
+
```rb
|
110
|
+
member_action :save, method: [:post] do
|
111
|
+
render ActiveAdmin::DynamicFields.update(resource, params)
|
112
|
+
# render ActiveAdmin::DynamicFields.update(resource, params, [:published])
|
113
|
+
# render ActiveAdmin::DynamicFields.update(resource, params, Article::permit_params)
|
114
|
+
end
|
115
|
+
```
|
116
|
+
|
117
|
+
- In *index* config:
|
118
|
+
|
119
|
+
```rb
|
120
|
+
# Edit a string:
|
121
|
+
column :title do |row|
|
122
|
+
div row.title, ActiveAdmin::DynamicFields.edit_string(:title, save_admin_article_path(row.id))
|
123
|
+
end
|
124
|
+
# Edit a boolean:
|
125
|
+
column :published do |row|
|
126
|
+
status_tag row.published, ActiveAdmin::DynamicFields.edit_boolean(:published, save_admin_article_path(row.id), row.published)
|
127
|
+
end
|
128
|
+
# Edit a select ([''] allow to have a blank value):
|
129
|
+
column :author do |row|
|
130
|
+
select ActiveAdmin::DynamicFields.edit_select(:author_id, save_admin_article_path(row.id)) do
|
131
|
+
options_for_select([''] + Author.pluck(:name, :id), row.author_id)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
```
|
135
|
+
|
136
|
+
- In *show* config (inside `attributes_table` block):
|
137
|
+
```rb
|
138
|
+
row :title do |row|
|
139
|
+
div row.title, ActiveAdmin::DynamicFields.edit_string(:title, save_admin_article_path(row.id))
|
140
|
+
end
|
141
|
+
```
|
142
|
+
|
143
|
+
### Dialog example
|
101
144
|
|
102
145
|
Example with 2 models: *Author* and *Article*
|
103
146
|
|
@@ -107,12 +150,16 @@ Prepare the content dialog - in Active Admin Author config:
|
|
107
150
|
ActiveAdmin.register Author do
|
108
151
|
# ...
|
109
152
|
member_action :dialog do
|
110
|
-
|
111
|
-
|
112
|
-
|
153
|
+
record = resource
|
154
|
+
context = Arbre::Context.new do
|
155
|
+
dl do
|
156
|
+
%i[name age created_at].each do |field|
|
157
|
+
dt "#{Author.human_attribute_name(field)}:"
|
158
|
+
dd record[field]
|
159
|
+
end
|
160
|
+
end
|
113
161
|
end
|
114
|
-
|
115
|
-
render plain: content
|
162
|
+
render plain: context
|
116
163
|
end
|
117
164
|
# ...
|
118
165
|
end
|
@@ -127,7 +174,7 @@ ActiveAdmin.register Article do
|
|
127
174
|
attributes_table do
|
128
175
|
# ...
|
129
176
|
row :author do
|
130
|
-
link_to object.author.name, dialog_admin_author_path(
|
177
|
+
link_to object.author.name, dialog_admin_author_path(object.author), title: object.author.name, 'data-df-dialog': true, 'data-df-icon': true
|
131
178
|
end
|
132
179
|
end
|
133
180
|
end
|
@@ -141,9 +188,11 @@ The link url is loaded via AJAX before opening the dialog.
|
|
141
188
|
|
142
189
|
If you use this component just star it. A developer is more motivated to improve a project when there is some interest.
|
143
190
|
|
191
|
+
Take a look at [other ActiveAdmin components](https://github.com/blocknotes?utf8=✓&tab=repositories&q=activeadmin&type=source) that I made if you are curious.
|
192
|
+
|
144
193
|
## Contributors
|
145
194
|
|
146
|
-
- [Mattia Roccoberton](http://blocknot.es)
|
195
|
+
- [Mattia Roccoberton](http://blocknot.es): author
|
147
196
|
|
148
197
|
## License
|
149
198
|
|
data/Rakefile
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'bundler/gem_tasks'
|
@@ -1,130 +1,209 @@
|
|
1
1
|
// Evaluate a condition
|
2
|
-
function dfEvalCondition(
|
3
|
-
if(
|
4
|
-
if(
|
5
|
-
else console.log(
|
2
|
+
function dfEvalCondition(el, args, on_change) {
|
3
|
+
if(args.fn) {
|
4
|
+
if(args.fn && window[args.fn]) return !window[args.fn](el);
|
5
|
+
else console.log('Warning - activeadmin_dynamic_fields: ' + args.fn + '() not available [1]');
|
6
6
|
}
|
7
|
-
else if(
|
8
|
-
return !el.is(':checked');
|
9
|
-
}
|
10
|
-
else if( args.if == 'not_checked' ) {
|
7
|
+
else if(args.if == 'checked') {
|
11
8
|
return el.is(':checked');
|
12
9
|
}
|
13
|
-
else if(
|
10
|
+
else if(args.if == 'not_checked') {
|
11
|
+
return !el.is(':checked');
|
12
|
+
}
|
13
|
+
else if(args.if == 'blank') {
|
14
14
|
return el.val().length === 0 || !el.val().trim();
|
15
15
|
}
|
16
|
-
else if(
|
16
|
+
else if(args.if == 'not_blank') {
|
17
17
|
return el.val().length !== 0 && el.val().trim();
|
18
18
|
}
|
19
|
-
else if(
|
19
|
+
else if(args.if == 'changed') {
|
20
|
+
return on_change;
|
21
|
+
}
|
22
|
+
else if(args.eq) {
|
20
23
|
return el.val() == args.eq;
|
21
24
|
}
|
22
|
-
else if(
|
25
|
+
else if(args.not) {
|
23
26
|
return el.val() != args.not;
|
24
27
|
}
|
25
28
|
return undefined;
|
26
29
|
}
|
27
30
|
|
28
31
|
// Prepare a field
|
29
|
-
function dfSetupField(
|
30
|
-
var action = el.data(
|
32
|
+
function dfSetupField(el) {
|
33
|
+
var action = el.data('action');
|
31
34
|
var target, args = {};
|
32
|
-
args.if = el.data(
|
33
|
-
args.eq = el.data(
|
34
|
-
args.not = el.data(
|
35
|
-
args.fn = el.data(
|
36
|
-
if(
|
37
|
-
if(
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
35
|
+
args.if = el.data('if');
|
36
|
+
args.eq = el.data('eq');
|
37
|
+
args.not = el.data('not');
|
38
|
+
args.fn = el.data('function');
|
39
|
+
if(el.data('target')) target = el.closest('fieldset').find(el.data('target')); // closest find for has many associations
|
40
|
+
else if(el.data('gtarget')) target = $(el.data('gtarget'));
|
41
|
+
if(action == 'hide') {
|
42
|
+
if(dfEvalCondition(el, args, false)) target.hide();
|
43
|
+
else target.show();
|
44
|
+
el.on('change', function(event) {
|
45
|
+
if(dfEvalCondition($(this), args, true)) target.hide();
|
46
|
+
else target.show();
|
43
47
|
});
|
44
48
|
}
|
45
|
-
else if(
|
46
|
-
if(
|
49
|
+
else if(action == 'slide') {
|
50
|
+
if(dfEvalCondition(el, args, false)) target.slideDown();
|
47
51
|
else target.slideUp();
|
48
|
-
el.on(
|
49
|
-
if(
|
52
|
+
el.on('change', function(event) {
|
53
|
+
if(dfEvalCondition($(this), args, true)) target.slideDown();
|
50
54
|
else target.slideUp();
|
51
55
|
});
|
52
56
|
}
|
53
|
-
else if(
|
54
|
-
if(
|
57
|
+
else if(action == 'fade') {
|
58
|
+
if(dfEvalCondition(el, args, false)) target.fadeIn();
|
55
59
|
else target.fadeOut();
|
56
|
-
el.on(
|
57
|
-
if(
|
60
|
+
el.on('change', function(event) {
|
61
|
+
if(dfEvalCondition($(this), args, true)) target.fadeIn();
|
58
62
|
else target.fadeOut();
|
59
63
|
});
|
60
64
|
}
|
61
|
-
else if(
|
62
|
-
var val = action.substr(
|
63
|
-
if(
|
64
|
-
el.on(
|
65
|
-
if(
|
65
|
+
else if(action.substr(0, 8) == 'setValue') {
|
66
|
+
var val = action.substr(8).trim();
|
67
|
+
if(dfEvalCondition(el, args, false)) dfSetValue(target, val);
|
68
|
+
el.on('change', function(event) {
|
69
|
+
if(dfEvalCondition($(this), args, true)) dfSetValue(target, val);
|
66
70
|
});
|
67
71
|
}
|
68
|
-
else if(
|
69
|
-
var cb = action.substr(
|
70
|
-
if(
|
71
|
-
if(
|
72
|
-
el.on(
|
73
|
-
if(
|
72
|
+
else if(action.substr(0, 8) == 'callback') {
|
73
|
+
var cb = action.substr(8).trim();
|
74
|
+
if(cb && window[cb]) {
|
75
|
+
if(dfEvalCondition(el, args, false)) window[cb](el.data('args'));
|
76
|
+
el.on('change', function(event) {
|
77
|
+
if(dfEvalCondition($(this), args, true)) window[cb](el.data('args'));
|
74
78
|
});
|
75
79
|
}
|
76
|
-
else console.log(
|
77
|
-
}
|
78
|
-
else if(
|
79
|
-
var classes = action.substr(
|
80
|
-
if(
|
81
|
-
else target.addClass(
|
82
|
-
el.on(
|
83
|
-
if(
|
84
|
-
else target.addClass(
|
80
|
+
else console.log('Warning - activeadmin_dynamic_fields: ' + cb + '() not available [2]');
|
81
|
+
}
|
82
|
+
else if(action.substr(0, 8) == 'addClass') {
|
83
|
+
var classes = action.substr(8).trim();
|
84
|
+
if(dfEvalCondition(el, args, false)) target.removeClass(classes);
|
85
|
+
else target.addClass(classes);
|
86
|
+
el.on('change', function(event) {
|
87
|
+
if(dfEvalCondition($(this), args, true)) target.removeClass(classes);
|
88
|
+
else target.addClass(classes);
|
85
89
|
});
|
86
90
|
}
|
87
|
-
else if(
|
88
|
-
dfEvalCondition(
|
89
|
-
el.on(
|
90
|
-
dfEvalCondition(
|
91
|
+
else if(args.fn) { // function without action
|
92
|
+
dfEvalCondition(el, args, false);
|
93
|
+
el.on('change', function(event) {
|
94
|
+
dfEvalCondition(el, args, true);
|
91
95
|
});
|
92
96
|
}
|
93
97
|
}
|
94
98
|
|
95
99
|
// Set the value of an element
|
96
|
-
function dfSetValue(
|
97
|
-
if(
|
100
|
+
function dfSetValue(el, val) {
|
101
|
+
if(el.attr('type') != 'checkbox') el.val(val);
|
98
102
|
else el.prop('checked', val == '1');
|
99
|
-
el.trigger(
|
103
|
+
el.trigger('change');
|
104
|
+
}
|
105
|
+
|
106
|
+
// Inline update - must be called binded on the editing element
|
107
|
+
function dfUpdateField() {
|
108
|
+
if($(this).data('loading') != '1') {
|
109
|
+
$(this).data('loading', '1');
|
110
|
+
var _this = $(this);
|
111
|
+
var type = $(this).data('field-type');
|
112
|
+
var new_value;
|
113
|
+
if(type == 'boolean') new_value = !$(this).data('field-value');
|
114
|
+
else if(type == 'select') new_value = $(this).val();
|
115
|
+
else new_value = $(this).text();
|
116
|
+
var data = {};
|
117
|
+
data[$(this).data('field')] = new_value;
|
118
|
+
$.ajax({
|
119
|
+
context: _this,
|
120
|
+
data: { data: data },
|
121
|
+
method: 'POST',
|
122
|
+
url: $(this).data('save-url'),
|
123
|
+
complete: function(req, status) {
|
124
|
+
$(this).data('loading', '0');
|
125
|
+
},
|
126
|
+
success: function(data, status, req) {
|
127
|
+
if(data.status == 'error') {
|
128
|
+
if($(this).data('show-errors')) {
|
129
|
+
var result = '';
|
130
|
+
var message = data.message;
|
131
|
+
for(var key in message) {
|
132
|
+
if(typeof(message[key]) === 'object') {
|
133
|
+
if(result) result += ' - ';
|
134
|
+
result += key + ': ' + message[key].join('; ');
|
135
|
+
}
|
136
|
+
}
|
137
|
+
if(result) alert(result);
|
138
|
+
}
|
139
|
+
}
|
140
|
+
else {
|
141
|
+
$(this).data('field-value', new_value);
|
142
|
+
if($(this).data('content')) {
|
143
|
+
var old_text = $(this).text();
|
144
|
+
var old_class = $(this).attr('class');
|
145
|
+
var content = $($(this).data('content'));
|
146
|
+
$(this).text(content.text());
|
147
|
+
$(this).attr('class', content.attr('class'));
|
148
|
+
content.text(old_text);
|
149
|
+
content.attr('class', old_class);
|
150
|
+
$(this).data('content', content);
|
151
|
+
}
|
152
|
+
}
|
153
|
+
}
|
154
|
+
});
|
155
|
+
}
|
100
156
|
}
|
101
157
|
|
102
158
|
// Init
|
103
|
-
$(document).ready(
|
159
|
+
$(document).ready(function() {
|
104
160
|
// Setup dynamic fields
|
105
|
-
$('.active_admin .input [data-if], .active_admin .input [data-function], .active_admin .input [data-eq], .active_admin .input [data-not]').each(
|
106
|
-
dfSetupField(
|
161
|
+
$('.active_admin .input [data-if], .active_admin .input [data-function], .active_admin .input [data-eq], .active_admin .input [data-not]').each(function() {
|
162
|
+
dfSetupField($(this));
|
107
163
|
});
|
108
164
|
// Setup dynamic fields for has many associations
|
109
|
-
$('.active_admin .has_many_container').on(
|
110
|
-
$('.active_admin .input [data-if], .active_admin .input [data-function], .active_admin .input [data-eq], .active_admin .input [data-not]').each(
|
111
|
-
dfSetupField(
|
165
|
+
$('.active_admin .has_many_container').on('has_many_add:after', function(e, fieldset, container) {
|
166
|
+
$('.active_admin .input [data-if], .active_admin .input [data-function], .active_admin .input [data-eq], .active_admin .input [data-not]').each(function() {
|
167
|
+
dfSetupField($(this));
|
112
168
|
});
|
113
169
|
});
|
170
|
+
// Set dialog icon link
|
171
|
+
$('.active_admin [data-df-icon]').each(function() {
|
172
|
+
$(this).append(' »'); // ' •'
|
173
|
+
});
|
114
174
|
// Open content in dialog
|
115
|
-
$('.active_admin [data-df-dialog]').on(
|
175
|
+
$('.active_admin [data-df-dialog]').on('click', function(event) {
|
116
176
|
event.preventDefault();
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
177
|
+
$(this).blur();
|
178
|
+
if($('#df-dialog').data('loading') != '1') {
|
179
|
+
$('#df-dialog').data('loading', '1');
|
180
|
+
if($('#df-dialog').length == 0) $('body').append('<div id="df-dialog"></div>');
|
181
|
+
var title = $(this).attr('title');
|
182
|
+
$.ajax({
|
183
|
+
url: $(this).attr('href'),
|
184
|
+
complete: function(req, status) {
|
185
|
+
$('#df-dialog').data('loading', '0');
|
186
|
+
},
|
187
|
+
success: function(data, status, req) {
|
188
|
+
if(title) $('#df-dialog').attr('title', title);
|
189
|
+
$('#df-dialog').html(data);
|
190
|
+
$('#df-dialog').dialog({ modal: true });
|
191
|
+
},
|
192
|
+
});
|
193
|
+
}
|
194
|
+
});
|
195
|
+
// Inline editing
|
196
|
+
$('[data-field][data-field-type="boolean"][data-save-url]').each(function() {
|
197
|
+
$(this).on('click', $.proxy(dfUpdateField, $(this)));
|
198
|
+
});
|
199
|
+
$('[data-field][data-field-type="string"][data-save-url]').each(function() {
|
200
|
+
$(this).data('field-value', $(this).text());
|
201
|
+
var fnUpdate = $.proxy(dfUpdateField, $(this));
|
202
|
+
$(this).on('blur', function() {
|
203
|
+
if($(this).data('field-value') != $(this).text()) fnUpdate();
|
125
204
|
});
|
126
205
|
});
|
127
|
-
$('
|
128
|
-
$(this).
|
206
|
+
$('[data-field][data-field-type="select"][data-save-url]').each(function() {
|
207
|
+
$(this).on('change', $.proxy(dfUpdateField, $(this)));
|
129
208
|
});
|
130
209
|
});
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_admin'
|
2
4
|
|
3
5
|
module ActiveAdmin
|
@@ -5,5 +7,47 @@ module ActiveAdmin
|
|
5
7
|
class Engine < ::Rails::Engine
|
6
8
|
engine_name 'activeadmin_dynamic_fields'
|
7
9
|
end
|
10
|
+
|
11
|
+
def self.edit_boolean(field, url, value)
|
12
|
+
{
|
13
|
+
'data-field': field,
|
14
|
+
'data-field-type': 'boolean',
|
15
|
+
'data-field-value': value,
|
16
|
+
'data-content': "<span class=\"status_tag changed\">#{value ? 'no' : 'yes'}</span>",
|
17
|
+
'data-save-url': url,
|
18
|
+
'data-show-errors': '1'
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.edit_select(field, url)
|
23
|
+
{
|
24
|
+
'data-field': field,
|
25
|
+
'data-field-type': 'select',
|
26
|
+
'data-save-url': url,
|
27
|
+
'data-show-errors': '1'
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.edit_string(field, url)
|
32
|
+
{
|
33
|
+
contenteditable: true,
|
34
|
+
'data-field': field,
|
35
|
+
'data-field-type': 'string',
|
36
|
+
'data-save-url': url,
|
37
|
+
'data-show-errors': '1'
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.update(resource, params, permit_params = nil)
|
42
|
+
if params[:data]
|
43
|
+
if resource.update(permit_params ? params[:data].permit(permit_params) : params[:data].permit!)
|
44
|
+
{ json: { status: 'ok' } }
|
45
|
+
else
|
46
|
+
{ json: { status: 'error', message: resource.errors } }
|
47
|
+
end
|
48
|
+
else
|
49
|
+
{ json: { status: 'error', message: 'No data' }, status: 400 }
|
50
|
+
end
|
51
|
+
end
|
8
52
|
end
|
9
53
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activeadmin_dynamic_fields
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mattia Roccoberton
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activeadmin
|
@@ -16,26 +16,149 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activestorage
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 6.0.3.2
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 6.0.3.2
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: capybara
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.33.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.33.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.13.1
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.13.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: puma
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 4.3.5
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 4.3.5
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec_junit_formatter
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.4.1
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.4.1
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec-rails
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 4.0.1
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 4.0.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: selenium-webdriver
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 3.142.7
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 3.142.7
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.19.0
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.19.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: sqlite3
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 1.4.2
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 1.4.2
|
27
153
|
description: An Active Admin plugin to add dynamic behaviors to fields
|
28
154
|
email: mat@blocknot.es
|
29
155
|
executables: []
|
30
156
|
extensions: []
|
31
157
|
extra_rdoc_files: []
|
32
158
|
files:
|
33
|
-
- ".gitignore"
|
34
|
-
- Gemfile
|
35
159
|
- LICENSE.txt
|
36
160
|
- README.md
|
37
161
|
- Rakefile
|
38
|
-
- activeadmin_dynamic_fields.gemspec
|
39
162
|
- app/assets/javascripts/activeadmin/dynamic_fields.js
|
40
163
|
- lib/activeadmin/dynamic_fields.rb
|
41
164
|
- lib/activeadmin/dynamic_fields/engine.rb
|
@@ -45,7 +168,7 @@ homepage: https://github.com/blocknotes/activeadmin_dynamic_fields
|
|
45
168
|
licenses:
|
46
169
|
- MIT
|
47
170
|
metadata: {}
|
48
|
-
post_install_message:
|
171
|
+
post_install_message:
|
49
172
|
rdoc_options: []
|
50
173
|
require_paths:
|
51
174
|
- lib
|
@@ -60,9 +183,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
60
183
|
- !ruby/object:Gem::Version
|
61
184
|
version: '0'
|
62
185
|
requirements: []
|
63
|
-
|
64
|
-
|
65
|
-
signing_key:
|
186
|
+
rubygems_version: 3.0.3
|
187
|
+
signing_key:
|
66
188
|
specification_version: 4
|
67
189
|
summary: Dynamic fields for ActiveAdmin
|
68
190
|
test_files: []
|
data/.gitignore
DELETED
data/Gemfile
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
lib = File.expand_path('../lib', __FILE__)
|
2
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require 'activeadmin/dynamic_fields/version'
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = 'activeadmin_dynamic_fields'
|
7
|
-
spec.version = ActiveAdmin::DynamicFields::VERSION
|
8
|
-
spec.summary = 'Dynamic fields for ActiveAdmin'
|
9
|
-
spec.description = 'An Active Admin plugin to add dynamic behaviors to fields'
|
10
|
-
spec.license = 'MIT'
|
11
|
-
spec.authors = ['Mattia Roccoberton']
|
12
|
-
spec.email = 'mat@blocknot.es'
|
13
|
-
spec.homepage = 'https://github.com/blocknotes/activeadmin_dynamic_fields'
|
14
|
-
|
15
|
-
spec.files = `git ls-files -z`.split("\x0")
|
16
|
-
spec.require_paths = ['lib']
|
17
|
-
|
18
|
-
spec.add_runtime_dependency 'activeadmin', '~> 1.0'
|
19
|
-
end
|