activeadmin_dynamic_fields 0.2.8 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b1a35cc8fb49264ee130c088dd680bde833cecdcb1fd5f2544b7111369c4f74
4
- data.tar.gz: 5d72305f05e98728adcb05d03e2d3ffea6fc3c5707544de12c3a045691d45467
3
+ metadata.gz: 1af148e7cd9d7704c902e17fdb022acbb1c0c2012bf423f9be6e4ae92cdb6f5f
4
+ data.tar.gz: ad108b3ae42ba846251dcab61487e68809e4cfaf21e453039a7ad3cb0cb22bd8
5
5
  SHA512:
6
- metadata.gz: a334732f34e9636c60dd6ba376fe0331fc7dbfddb50e5e7c78b7b294758381dacd85ca51a6a61b85b936a937e4d140a467b2f6fd6baf4952599878cbc7ffbfac
7
- data.tar.gz: c9dd461761fff9e2194368ff22404fca87c688399798ea67ab17bdd292c5dcd2aff7eedd7f16fe44b30a17bc3eb4d76d43ada098ba4b25f57557844d9807a6e6
6
+ metadata.gz: 0c76b4cb42b90bf7c88c4cafbbab1bb40f8fa61efbaa8acef0cb3230c6dd2f3eea3b0bf88413431c2a275538ef7c1f37aa0463a2445f0e2a61eae17b189955b5
7
+ data.tar.gz: d09b1cfe869567e5634236a31385608800375be5cef690b5ee1c420d2cba8a5018f642c5bec0d2996078338a8bdfa0499c02d839e264b9704fb5581e5659d44d
data/README.md CHANGED
@@ -1,27 +1,26 @@
1
- # ActiveAdmin Dynamic Fields [![Gem Version](https://badge.fury.io/rb/activeadmin_dynamic_fields.svg)](https://badge.fury.io/rb/activeadmin_dynamic_fields)
1
+ # ActiveAdmin Dynamic Fields [![Gem Version](https://badge.fury.io/rb/activeadmin_dynamic_fields.svg)](https://badge.fury.io/rb/activeadmin_dynamic_fields) [![CircleCI](https://circleci.com/gh/blocknotes/activeadmin_dynamic_fields.svg?style=svg)](https://circleci.com/gh/blocknotes/activeadmin_dynamic_fields)
2
2
 
3
- An Active Admin plugin to add dynamic behaviors to fields.
3
+ An Active Admin plugin to add dynamic behaviors to some fields.
4
4
 
5
5
  Features:
6
-
7
6
  - set conditional checks on fields
8
- - trigger some actions on other fields
7
+ - trigger actions on target elements
9
8
  - inline field editing
10
9
  - create links to load some content in a dialog
11
10
 
12
11
  The easiest way to show how this plugin works is looking the examples [below](#examples).
13
12
 
14
13
  ## Install
15
-
16
14
  - Add to your Gemfile: `gem 'activeadmin_dynamic_fields'`
17
15
  - Execute bundle
18
16
  - Add at the end of your ActiveAdmin javascripts (_app/assets/javascripts/active_admin.js_):
19
- `//= require activeadmin/dynamic_fields`
20
17
 
21
- ## Options
18
+ ```js
19
+ //= require activeadmin/dynamic_fields
20
+ ```
22
21
 
22
+ ## Options
23
23
  Options are passed to fields using *input_html* parameter as *data* attributes:
24
-
25
24
  - **data-if**: check a condition, values:
26
25
  + **checked**: check if a checkbox is checked
27
26
  + **not_checked**: check if a checkbox is not checked
@@ -32,7 +31,7 @@ Options are passed to fields using *input_html* parameter as *data* attributes:
32
31
  - **data-not**: check if a field hasn't a specific value
33
32
  - **data-target**: target css selector (from parent fieldset, look for the closest match)
34
33
  - **data-gtarget**: target css selector globally
35
- - **data-action**: the action to trigger, values:
34
+ - **data-then**: the action to trigger (alias **data-action**), values:
36
35
  + **hide**: hides elements
37
36
  + **slide**: hides elements (using sliding)
38
37
  + **fade**: hides elements (using fading)
@@ -42,16 +41,17 @@ Options are passed to fields using *input_html* parameter as *data* attributes:
42
41
  - **data-function**: check the return value of a custom function
43
42
  - **data-arg**: argument passed to the custom set function (as array of strings)
44
43
 
44
+ A check condition or a custom check function are required. A trigger action is required too, unless you are using a custom function (in that case it is optional).
45
+
45
46
  ## Examples
46
47
 
47
48
  ### Dynamic fields examples
48
-
49
49
  - A checkbox that hides other fields if is checked (ex. model *Article*):
50
50
 
51
51
  ```rb
52
52
  form do |f|
53
53
  f.inputs 'Article' do
54
- f.input :published, input_html: { data: { if: 'checked', action: 'hide', target: '.grp1' } }
54
+ f.input :published, input_html: { data: { if: 'checked', then: 'hide', target: '.grp1' } }
55
55
  f.input :online_date, wrapper_html: { class: 'grp1' }
56
56
  f.input :draft_notes, wrapper_html: { class: 'grp1' }
57
57
  end
@@ -61,31 +61,31 @@ end
61
61
 
62
62
  - Add 3 classes (*first*, *second*, *third*) if a checkbox is not checked:
63
63
 
64
- `f.input :published, input_html: { data: { if: 'not_checked', action: 'addClass first second third', target: '.grp1' } }`
64
+ `f.input :published, input_html: { data: { if: 'not_checked', then: 'addClass first second third', target: '.grp1' } }`
65
65
 
66
66
  - Set another field value if a string field is blank:
67
67
 
68
- `f.input :title, input_html: { data: { if: 'blank', action: 'setValue 10', target: '#article_position' } }`
68
+ `f.input :title, input_html: { data: { if: 'blank', then: 'setValue 10', target: '#article_position' } }`
69
69
 
70
70
  - Use a custom function for conditional check (*title_not_empty()* must be available on global scope) (with alternative syntax for data attributes):
71
71
 
72
- `f.input :title, input_html: { 'data-function': 'title_empty', 'data-action': 'slide', 'data-target': '#article_description_input' }`
72
+ `f.input :title, input_html: { 'data-function': 'title_empty', 'data-then': 'slide', 'data-target': '#article_description_input' }`
73
73
 
74
74
  ```js
75
- function title_empty( el ) {
76
- return ( $('#article_title').val().trim() === '' );
75
+ function title_empty(el) {
76
+ return ($('#article_title').val().trim() === '');
77
77
  }
78
78
  ```
79
79
 
80
80
  - Call a callback function as action:
81
81
 
82
- `f.input :published, input_html: { data: { if: 'checked', action: 'callback set_title', args: '["Unpublished !"]' } }`
82
+ `f.input :published, input_html: { data: { if: 'checked', then: 'callback set_title', args: '["Unpublished !"]' } }`
83
83
 
84
84
  ```js
85
- function set_title( args ) {
86
- if( $('#article_title').val().trim() === '' ) {
87
- $('#article_title').val( args[0] );
88
- $('#article_title').trigger( 'change' );
85
+ function set_title(args) {
86
+ if($('#article_title').val().trim() === '') {
87
+ $('#article_title').val(args[0]);
88
+ $('#article_title').trigger('change');
89
89
  }
90
90
  }
91
91
  ```
@@ -95,15 +95,14 @@ function set_title( args ) {
95
95
  `f2.input :category, as: :select, collection: [ [ 'Cat 1', 'cat1' ], [ 'Cat 2', 'cat2' ], [ 'Cat 3', 'cat3' ] ], input_html: { 'data-function': 'on_change_category' }`
96
96
 
97
97
  ```js
98
- function on_change_category( el ) {
99
- var target = el.closest( 'fieldset' ).find( '.pub' );
100
- target.prop( 'checked', ( el.val() == 'cat2' ) );
101
- target.trigger( 'change' );
98
+ function on_change_category(el) {
99
+ var target = el.closest('fieldset').find('.pub');
100
+ target.prop('checked', (el.val() == 'cat2');
101
+ target.trigger('change');
102
102
  }
103
103
  ```
104
104
 
105
105
  ### Inline editing examples
106
-
107
106
  - 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
107
 
109
108
  ```rb
@@ -141,7 +140,6 @@ end
141
140
  ```
142
141
 
143
142
  ### Dialog example
144
-
145
143
  Example with 2 models: *Author* and *Article*
146
144
 
147
145
  Prepare the content dialog - in Active Admin Author config:
@@ -185,15 +183,13 @@ end
185
183
  The link url is loaded via AJAX before opening the dialog.
186
184
 
187
185
  ## Do you like it? Star it!
188
-
189
186
  If you use this component just star it. A developer is more motivated to improve a project when there is some interest.
190
187
 
191
188
  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
189
 
193
190
  ## Contributors
194
-
195
191
  - [Mattia Roccoberton](http://blocknot.es): author
192
+ - The good guys that opened issues and pull requests from time to time
196
193
 
197
194
  ## License
198
-
199
- [MIT](LICENSE.txt)
195
+ The gem is available as open-source under the terms of the [MIT](LICENSE.txt).
@@ -1,209 +1,199 @@
1
- // Evaluate a condition
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
- }
7
- else if(args.if == 'checked') {
8
- return el.is(':checked');
9
- }
10
- else if(args.if == 'not_checked') {
11
- return !el.is(':checked');
12
- }
13
- else if(args.if == 'blank') {
14
- return el.val().length === 0 || !el.val().trim();
15
- }
16
- else if(args.if == 'not_blank') {
17
- return el.val().length !== 0 && el.val().trim();
18
- }
19
- else if(args.if == 'changed') {
20
- return on_change;
21
- }
22
- else if(args.eq) {
23
- return el.val() == args.eq;
24
- }
25
- else if(args.not) {
26
- return el.val() != args.not;
27
- }
28
- return undefined;
29
- }
30
-
31
- // Prepare a field
32
- function dfSetupField(el) {
33
- var action = el.data('action');
34
- var target, args = {};
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();
47
- });
48
- }
49
- else if(action == 'slide') {
50
- if(dfEvalCondition(el, args, false)) target.slideDown();
51
- else target.slideUp();
52
- el.on('change', function(event) {
53
- if(dfEvalCondition($(this), args, true)) target.slideDown();
54
- else target.slideUp();
55
- });
1
+ (function () {
2
+ 'use strict'
3
+
4
+ const ACTIONS = {
5
+ addClass: (el, name) => el.addClass(name),
6
+ callback: (el, name) => {
7
+ if (window[name]) window[name](el.data('args'))
8
+ else {
9
+ el.attr('data-df-errors', 'callback function not found')
10
+ console.warn(`activeadmin_dynamic_fields callback function not found: ${name}`)
11
+ }
12
+ },
13
+ fade: el => el.fadeOut(),
14
+ hide: el => el.hide(),
15
+ setValue: (el, value) => dfSetValue(el, value),
16
+ slide: el => el.slideUp()
56
17
  }
57
- else if(action == 'fade') {
58
- if(dfEvalCondition(el, args, false)) target.fadeIn();
59
- else target.fadeOut();
60
- el.on('change', function(event) {
61
- if(dfEvalCondition($(this), args, true)) target.fadeIn();
62
- else target.fadeOut();
63
- });
18
+
19
+ const CONDITIONS = {
20
+ blank: el => el.val().length === 0 || !el.val().trim(),
21
+ changed: _el => true,
22
+ checked: el => el.is(':checked'),
23
+ eq: (el, value) => el.val() == value,
24
+ not: (el, value) => el.val() != value,
25
+ not_blank: el => el.val().trim(),
26
+ not_checked: el => !el.is(':checked')
64
27
  }
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);
70
- });
28
+
29
+ const REVERSE_ACTIONS = {
30
+ addClass: (el, name) => el.removeClass(name),
31
+ fade: el => el.fadeIn(),
32
+ hide: el => el.show(),
33
+ slide: el => el.slideDown()
71
34
  }
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'));
78
- });
35
+
36
+ function dfEvalCondition(el) {
37
+ let condition = CONDITIONS[el.data('if')]
38
+ let condition_arg
39
+
40
+ if(!condition && el.data('eq')) {
41
+ condition = CONDITIONS['eq']
42
+ condition_arg = el.data('eq')
79
43
  }
80
- else console.log('Warning - activeadmin_dynamic_fields: ' + cb + '() not available [2]');
44
+ if(!condition && el.data('not')) {
45
+ condition = CONDITIONS['not']
46
+ condition_arg = el.data('not')
47
+ }
48
+ if(!condition && el.data('function')) {
49
+ condition = window[el.data('function')]
50
+ if(!condition) {
51
+ el.attr('data-df-errors', 'custom function not found')
52
+ console.warn(`activeadmin_dynamic_fields custom function not found: ${el.data('function')}`)
53
+ }
54
+ }
55
+
56
+ return [condition, condition_arg]
81
57
  }
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);
89
- });
58
+
59
+ function dfInitField(el) {
60
+ const [condition, condition_arg] = dfEvalCondition(el)
61
+ const action_name = (el.data('then') || el.data('action') || '').substr(0, 8)
62
+ const action = ACTIONS[action_name]
63
+ const arg = (el.data('then') || el.data('action') || '').substr(9)
64
+ const reverse_action = REVERSE_ACTIONS[action_name]
65
+ if (typeof condition === 'undefined') return
66
+ if (typeof action === 'undefined' && !el.data('function')) return
67
+
68
+ // closest find for has many associations
69
+ let target
70
+ if (el.data('target')) target = el.closest('fieldset').find(el.data('target'))
71
+ else if (el.data('gtarget')) target = $(el.data('gtarget'))
72
+ if (action_name == 'callback') target = el
73
+
74
+ if (condition(el, condition_arg) && el.data('if') != 'changed') action(target, arg)
75
+ else if (reverse_action) reverse_action(target, arg)
76
+
77
+ el.on('change', () => {
78
+ if (condition(el, condition_arg)) action(target, arg)
79
+ else if (reverse_action) reverse_action(target, arg)
80
+ })
90
81
  }
91
- else if(args.fn) { // function without action
92
- dfEvalCondition(el, args, false);
93
- el.on('change', function(event) {
94
- dfEvalCondition(el, args, true);
95
- });
82
+
83
+ // Set the value of an element
84
+ function dfSetValue(el, val) {
85
+ if (el.attr('type') == 'checkbox') el.prop('checked', val == '1')
86
+ else el.val(val)
87
+ el.trigger('change')
96
88
  }
97
- }
98
-
99
- // Set the value of an element
100
- function dfSetValue(el, val) {
101
- if(el.attr('type') != 'checkbox') el.val(val);
102
- else el.prop('checked', val == '1');
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('; ');
89
+
90
+ // Inline update - must be called binded on the editing element
91
+ function dfUpdateField() {
92
+ if ($(this).data('loading') != '1') {
93
+ $(this).data('loading', '1');
94
+ let _this = $(this);
95
+ let type = $(this).data('field-type');
96
+ let new_value;
97
+ if (type == 'boolean') new_value = !$(this).data('field-value');
98
+ else if (type == 'select') new_value = $(this).val();
99
+ else new_value = $(this).text();
100
+ let data = {};
101
+ data[$(this).data('field')] = new_value;
102
+ $.ajax({
103
+ context: _this,
104
+ data: { data: data },
105
+ method: 'POST',
106
+ url: $(this).data('save-url'),
107
+ complete: function (req, status) {
108
+ $(this).data('loading', '0');
109
+ },
110
+ success: function (data, status, req) {
111
+ if (data.status == 'error') {
112
+ if ($(this).data('show-errors')) {
113
+ let result = '';
114
+ let message = data.message;
115
+ for (let key in message) {
116
+ if (typeof (message[key]) === 'object') {
117
+ if (result) result += ' - ';
118
+ result += key + ': ' + message[key].join('; ');
119
+ }
135
120
  }
121
+ if (result) alert(result);
136
122
  }
137
- if(result) alert(result);
138
123
  }
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);
124
+ else {
125
+ $(this).data('field-value', new_value);
126
+ if ($(this).data('content')) {
127
+ let old_text = $(this).text();
128
+ let old_class = $(this).attr('class');
129
+ let content = $($(this).data('content'));
130
+ $(this).text(content.text());
131
+ $(this).attr('class', content.attr('class'));
132
+ content.text(old_text);
133
+ content.attr('class', old_class);
134
+ $(this).data('content', content);
135
+ }
151
136
  }
152
137
  }
153
- }
154
- });
155
- }
156
- }
157
-
158
- // Init
159
- $(document).ready(function() {
160
- // Setup dynamic fields
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));
163
- });
164
- // Setup dynamic fields for has many associations
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));
168
- });
169
- });
170
- // Set dialog icon link
171
- $('.active_admin [data-df-icon]').each(function() {
172
- $(this).append(' »'); // ' •'
173
- });
174
- // Open content in dialog
175
- $('.active_admin [data-df-dialog]').on('click', function(event) {
176
- event.preventDefault();
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
138
  });
193
139
  }
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();
204
- });
205
- });
206
- $('[data-field][data-field-type="select"][data-save-url]').each(function() {
207
- $(this).on('change', $.proxy(dfUpdateField, $(this)));
208
- });
209
- });
140
+ }
141
+
142
+ // Init
143
+ $(document).ready(function () {
144
+ // Setup dynamic fields
145
+ const selectors = '.active_admin .input [data-if], .active_admin .input [data-eq], .active_admin .input [data-not], .active_admin .input [data-function]'
146
+ $(selectors).each(function () {
147
+ dfInitField($(this))
148
+ })
149
+
150
+ // Setup dynamic fields for associations
151
+ $('.active_admin .has_many_container').on('has_many_add:after', () => {
152
+ $(selectors).each(function () {
153
+ dfInitField($(this))
154
+ })
155
+ })
156
+
157
+ // Set dialog icon link
158
+ $('.active_admin [data-df-icon]').each(function () {
159
+ $(this).append(' &raquo;')
160
+ })
161
+
162
+ // Open content in dialog
163
+ $('.active_admin [data-df-dialog]').on('click', function (event) {
164
+ event.preventDefault()
165
+ $(this).blur()
166
+ if ($('#df-dialog').data('loading') != '1') {
167
+ $('#df-dialog').data('loading', '1')
168
+ if ($('#df-dialog').length == 0) $('body').append('<div id="df-dialog"></div>')
169
+ let title = $(this).attr('title')
170
+ $.ajax({
171
+ url: $(this).attr('href'),
172
+ complete: function (req, status) {
173
+ $('#df-dialog').data('loading', '0')
174
+ },
175
+ success: function (data, status, req) {
176
+ if (title) $('#df-dialog').attr('title', title)
177
+ $('#df-dialog').html(data)
178
+ $('#df-dialog').dialog({ modal: true })
179
+ },
180
+ })
181
+ }
182
+ })
183
+
184
+ // Inline editing
185
+ $('[data-field][data-field-type="boolean"][data-save-url]').each(function () {
186
+ $(this).on('click', $.proxy(dfUpdateField, $(this)))
187
+ })
188
+ $('[data-field][data-field-type="string"][data-save-url]').each(function () {
189
+ $(this).data('field-value', $(this).text())
190
+ let fnUpdate = $.proxy(dfUpdateField, $(this))
191
+ $(this).on('blur', function () {
192
+ if ($(this).data('field-value') != $(this).text()) fnUpdate()
193
+ })
194
+ })
195
+ $('[data-field][data-field-type="select"][data-save-url]').each(function () {
196
+ $(this).on('change', $.proxy(dfUpdateField, $(this)))
197
+ })
198
+ })
199
+ })()
@@ -2,6 +2,6 @@
2
2
 
3
3
  module ActiveAdmin
4
4
  module DynamicFields
5
- VERSION = '0.2.8'
5
+ VERSION = '0.3.0'
6
6
  end
7
7
  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.2.8
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mattia Roccoberton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-28 00:00:00.000000000 Z
11
+ date: 2020-09-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activeadmin
@@ -109,33 +109,33 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: 4.0.1
111
111
  - !ruby/object:Gem::Dependency
112
- name: selenium-webdriver
112
+ name: rubocop
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 3.142.7
117
+ version: 0.90.0
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 3.142.7
124
+ version: 0.90.0
125
125
  - !ruby/object:Gem::Dependency
126
- name: simplecov
126
+ name: selenium-webdriver
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 0.19.0
131
+ version: 3.142.7
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 0.19.0
138
+ version: 3.142.7
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: sqlite3
141
141
  requirement: !ruby/object:Gem::Requirement