activeadmin_dynamic_fields 0.3.0 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +46 -21
- data/Rakefile +13 -0
- data/app/assets/javascripts/activeadmin/dynamic_fields.js +127 -71
- data/lib/activeadmin/dynamic_fields/version.rb +1 -1
- metadata +49 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64bede8d2c37bae18d72078be390d20e182035f02496f797a30acf02bf025329
|
4
|
+
data.tar.gz: 5629d5a20bc6e9f36f1873127971d01cbaf979159fac4e81c62b7e60f4eb5c7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9e4f26043ed9970de78044eda0ab671b005b92b612efcc6912604cefb46078dcac839f75f004982e501bd079167caf58ecf35be7a68cbdf2968a7e98fd9907a
|
7
|
+
data.tar.gz: 62888b36a03b0945c7fb7e9defae7ea429570158c6cc70b2e171ccf5de65bd85301838ff88c864ba5faad1cfc5f6e1d32e00541f18a8ee3f77d369151fb75198
|
data/LICENSE.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2017 Mattia Roccoberton
|
1
|
+
Copyright (c) 2017-2020 Mattia Roccoberton
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
4
4
|
|
data/README.md
CHANGED
@@ -20,26 +20,37 @@ The easiest way to show how this plugin works is looking the examples [below](#e
|
|
20
20
|
```
|
21
21
|
|
22
22
|
## Options
|
23
|
-
Options are passed to fields using *input_html* parameter as *data* attributes
|
23
|
+
Options are passed to fields using *input_html* parameter as *data* attributes.
|
24
|
+
|
25
|
+
Conditions:
|
24
26
|
- **data-if**: check a condition, values:
|
25
|
-
+ **checked**: check if a checkbox is checked
|
27
|
+
+ **checked**: check if a checkbox is checked (ex. `"data-if": "checked"`)
|
26
28
|
+ **not_checked**: check if a checkbox is not checked
|
27
29
|
+ **blank**: check if a field is blank
|
28
30
|
+ **not_blank**: check if a field is not blank
|
29
31
|
+ **changed**: check if the value of an input is changed (dirty)
|
30
|
-
- **data-eq**: check if a field has a specific value
|
31
|
-
- **data-not**: check if a field
|
32
|
-
- **data-
|
33
|
-
- **data-
|
34
|
-
- **data-
|
35
|
-
|
32
|
+
- **data-eq**: check if a field has a specific value (ex. `"data-eq": "42"`)
|
33
|
+
- **data-not**: check if a field has not a specific value
|
34
|
+
- **data-match**: check if a field match a regexp
|
35
|
+
- **data-mismatch**: check if a field doesn't match a regexp (ex. `"data-mismatch": "^\d+$"`)
|
36
|
+
- **data-function**: check the return value of a custom function (ex. `"data-function": "my_check"`)
|
37
|
+
|
38
|
+
Actions:
|
39
|
+
- **data-then**: action to trigger (alias **data-action**), values:
|
40
|
+
+ **hide**: hides elements (ex. `"data-then": "hide", "data-target": ".errors"`)
|
36
41
|
+ **slide**: hides elements (using sliding)
|
37
42
|
+ **fade**: hides elements (using fading)
|
38
|
-
+ **addClass**: adds classes
|
39
|
-
+ **
|
40
|
-
+ **
|
41
|
-
|
42
|
-
|
43
|
+
+ **addClass**: adds classes (ex. `"data-then": "addClass red"`)
|
44
|
+
+ **addStyle**: adds some styles (ex. `"data-then": "addStyle color: #fb1; font-size: 12px"`)
|
45
|
+
+ **setText**: set the text of an element (ex. `"data-then": "setText A sample text"`)
|
46
|
+
+ **setValue**: set the value of an input element (ex. `"data-then": "setValue A sample value"`)
|
47
|
+
+ **callback**: call a function (with arguments: **data-args**) (ex. `"data-then": "callback a_fun"`)
|
48
|
+
- **data-else**: action to trigger when the condition check is not true
|
49
|
+
- **data-args**: arguments passed to the callback function
|
50
|
+
|
51
|
+
Targets:
|
52
|
+
- **data-target**: target css selector (from parent fieldset, look for the closest match)
|
53
|
+
- **data-gtarget**: target css selector globally
|
43
54
|
|
44
55
|
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
56
|
|
@@ -59,17 +70,25 @@ form do |f|
|
|
59
70
|
end
|
60
71
|
```
|
61
72
|
|
62
|
-
- Add 3 classes (*first*, *second*, *third*) if a checkbox is not checked:
|
73
|
+
- Add 3 classes (*first*, *second*, *third*) if a checkbox is not checked, else add "forth" class:
|
63
74
|
|
64
|
-
|
75
|
+
```rb
|
76
|
+
data = { if: 'not_checked', then: 'addClass first second third', target: '.grp1', else: 'addClass forth' }
|
77
|
+
f.input :published, input_html: { data: data }
|
78
|
+
```
|
65
79
|
|
66
80
|
- Set another field value if a string field is blank:
|
67
81
|
|
68
|
-
|
82
|
+
```rb
|
83
|
+
f.input :title, input_html: { data: { if: 'blank', then: 'setValue 10', target: '#article_position' } }
|
84
|
+
```
|
69
85
|
|
70
86
|
- Use a custom function for conditional check (*title_not_empty()* must be available on global scope) (with alternative syntax for data attributes):
|
71
87
|
|
72
|
-
|
88
|
+
```rb
|
89
|
+
attrs = { 'data-function': 'title_empty', 'data-then': 'slide', 'data-target': '#article_description_input' }
|
90
|
+
f.input :title, input_html: attrs
|
91
|
+
```
|
73
92
|
|
74
93
|
```js
|
75
94
|
function title_empty(el) {
|
@@ -79,7 +98,10 @@ function title_empty(el) {
|
|
79
98
|
|
80
99
|
- Call a callback function as action:
|
81
100
|
|
82
|
-
|
101
|
+
```rb
|
102
|
+
data = { if: 'checked', then: 'callback set_title', args: '["Unpublished !"]' }
|
103
|
+
f.input :published, input_html: { data: data }
|
104
|
+
```
|
83
105
|
|
84
106
|
```js
|
85
107
|
function set_title(args) {
|
@@ -92,7 +114,10 @@ function set_title(args) {
|
|
92
114
|
|
93
115
|
- Custom function without action:
|
94
116
|
|
95
|
-
|
117
|
+
```rb
|
118
|
+
collection = [['Cat 1', 'cat1'], ['Cat 2', 'cat2'], ['Cat 3', 'cat3']]
|
119
|
+
f2.input :category, as: :select, collection: collection, input_html: { 'data-function': 'on_change_category' }
|
120
|
+
```
|
96
121
|
|
97
122
|
```js
|
98
123
|
function on_change_category(el) {
|
@@ -183,9 +208,9 @@ end
|
|
183
208
|
The link url is loaded via AJAX before opening the dialog.
|
184
209
|
|
185
210
|
## Do you like it? Star it!
|
186
|
-
If you use this component just star it. A developer is more motivated to improve a project when there is some interest.
|
211
|
+
If you use this component just star it. A developer is more motivated to improve a project when there is some interest. My other [Active Admin components](https://github.com/blocknotes?utf8=✓&tab=repositories&q=activeadmin&type=source).
|
187
212
|
|
188
|
-
|
213
|
+
Or consider offering me a coffee, it's a small thing but it is greatly appreciated: [about me](https://www.blocknot.es/about-me).
|
189
214
|
|
190
215
|
## Contributors
|
191
216
|
- [Mattia Roccoberton](http://blocknot.es): author
|
data/Rakefile
CHANGED
@@ -1,3 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'bundler/gem_tasks'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'rspec/core/rake_task'
|
7
|
+
|
8
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
9
|
+
# t.ruby_opts = %w[-w]
|
10
|
+
t.rspec_opts = ['--color', '--format documentation']
|
11
|
+
end
|
12
|
+
|
13
|
+
task default: :spec
|
14
|
+
rescue LoadError
|
15
|
+
puts '! LoadError: no RSpec available'
|
16
|
+
end
|
@@ -1,10 +1,19 @@
|
|
1
1
|
(function () {
|
2
2
|
'use strict'
|
3
3
|
|
4
|
+
// noinspection JSUnusedGlobalSymbols
|
4
5
|
const ACTIONS = {
|
5
6
|
addClass: (el, name) => el.addClass(name),
|
7
|
+
addStyle: (el, extra_style) => {
|
8
|
+
let style = (el.attr('style') || '').trim()
|
9
|
+
if (!style.includes(extra_style)) {
|
10
|
+
if (style) style = style.replace(/;$/, '') + '; ' // ensure style ends with ;
|
11
|
+
el.attr('style', `${style}${extra_style}`)
|
12
|
+
}
|
13
|
+
},
|
6
14
|
callback: (el, name) => {
|
7
|
-
|
15
|
+
const cb_function = window.hasOwnProperty(name) ? window[name] : null
|
16
|
+
if (typeof cb_function === 'function') cb_function(el.data('args'))
|
8
17
|
else {
|
9
18
|
el.attr('data-df-errors', 'callback function not found')
|
10
19
|
console.warn(`activeadmin_dynamic_fields callback function not found: ${name}`)
|
@@ -12,15 +21,23 @@
|
|
12
21
|
},
|
13
22
|
fade: el => el.fadeOut(),
|
14
23
|
hide: el => el.hide(),
|
15
|
-
|
24
|
+
setText: (el, text) => el.text(text),
|
25
|
+
setValue: (el, value) => {
|
26
|
+
if (el.attr('type') === 'checkbox') el.prop('checked', value === '1')
|
27
|
+
else el.val(value)
|
28
|
+
el.trigger('change')
|
29
|
+
},
|
16
30
|
slide: el => el.slideUp()
|
17
31
|
}
|
18
32
|
|
33
|
+
// noinspection EqualityComparisonWithCoercionJS, JSUnusedGlobalSymbols
|
19
34
|
const CONDITIONS = {
|
20
35
|
blank: el => el.val().length === 0 || !el.val().trim(),
|
21
36
|
changed: _el => true,
|
22
37
|
checked: el => el.is(':checked'),
|
23
38
|
eq: (el, value) => el.val() == value,
|
39
|
+
match: (el, regexp) => regexp.test(el.val()),
|
40
|
+
mismatch: (el, regexp) => !regexp.test(el.val()),
|
24
41
|
not: (el, value) => el.val() != value,
|
25
42
|
not_blank: el => el.val().trim(),
|
26
43
|
not_checked: el => !el.is(':checked')
|
@@ -28,74 +45,108 @@
|
|
28
45
|
|
29
46
|
const REVERSE_ACTIONS = {
|
30
47
|
addClass: (el, name) => el.removeClass(name),
|
48
|
+
addStyle: (el, extra_style) => {
|
49
|
+
if(el.attr('style')) el.attr('style', el.attr('style').replace(extra_style, ''))
|
50
|
+
},
|
31
51
|
fade: el => el.fadeIn(),
|
32
52
|
hide: el => el.show(),
|
33
53
|
slide: el => el.slideDown()
|
34
54
|
}
|
35
55
|
|
36
|
-
|
37
|
-
|
38
|
-
|
56
|
+
class Field {
|
57
|
+
constructor(el) {
|
58
|
+
this.el = el
|
59
|
+
const action_name = this.evaluateAction()
|
60
|
+
const result = this.evaluateCondition()
|
61
|
+
this.condition = result.condition
|
62
|
+
this.condition_arg = result.condition_arg
|
63
|
+
this.evaluateTarget(action_name)
|
64
|
+
}
|
39
65
|
|
40
|
-
|
41
|
-
condition
|
42
|
-
|
66
|
+
apply() {
|
67
|
+
if (this.condition(this.el, this.condition_arg)) {
|
68
|
+
if (this.else_reverse_action) this.else_reverse_action(this.target, this.else_action_arg)
|
69
|
+
this.action(this.target, this.action_arg)
|
70
|
+
}
|
71
|
+
else {
|
72
|
+
if (this.reverse_action) this.reverse_action(this.target, this.action_arg)
|
73
|
+
if (this.else_action) this.else_action(this.target, this.else_action_arg)
|
74
|
+
}
|
43
75
|
}
|
44
|
-
|
45
|
-
|
46
|
-
|
76
|
+
|
77
|
+
evaluateAction() {
|
78
|
+
const action = this.el.data('then') || this.el.data('action') || ''
|
79
|
+
const action_name = action.split(' ', 1)[0]
|
80
|
+
const else_action = this.el.data('else') || ''
|
81
|
+
const else_action_name = else_action.split(' ', 1)[0]
|
82
|
+
|
83
|
+
this.action = ACTIONS[action_name]
|
84
|
+
this.action_arg = action.substring(action.indexOf(' ') + 1)
|
85
|
+
this.reverse_action = REVERSE_ACTIONS[action_name]
|
86
|
+
this.else_action = ACTIONS[else_action_name]
|
87
|
+
this.else_action_arg = else_action.substring(else_action.indexOf(' ') + 1)
|
88
|
+
this.else_reverse_action = REVERSE_ACTIONS[else_action_name]
|
89
|
+
|
90
|
+
return action_name
|
47
91
|
}
|
48
|
-
|
49
|
-
|
50
|
-
if(
|
51
|
-
|
52
|
-
|
92
|
+
|
93
|
+
evaluateCondition() {
|
94
|
+
let value = CONDITIONS[this.el.data('if')?.trim()]
|
95
|
+
if (value) return { condition: value }
|
96
|
+
|
97
|
+
value = this.el.data('eq')
|
98
|
+
if (value) return { condition: CONDITIONS['eq'], condition_arg: value }
|
99
|
+
|
100
|
+
value = this.el.data('not')
|
101
|
+
if (value) return { condition: CONDITIONS['not'], condition_arg: value }
|
102
|
+
|
103
|
+
value = this.el.data('match')
|
104
|
+
if (value) return { condition: CONDITIONS['match'], condition_arg: new RegExp(value) }
|
105
|
+
|
106
|
+
value = this.el.data('mismatch')
|
107
|
+
if (value) return { condition: CONDITIONS['mismatch'], condition_arg: new RegExp(value) }
|
108
|
+
|
109
|
+
this.custom_function = this.el.data('function')
|
110
|
+
if (this.custom_function) {
|
111
|
+
value = window[this.custom_function]
|
112
|
+
if (value) return { condition: value }
|
113
|
+
else {
|
114
|
+
this.el.attr('data-df-errors', 'custom function not found')
|
115
|
+
console.warn(`activeadmin_dynamic_fields custom function not found: ${this.custom_function}`)
|
116
|
+
}
|
53
117
|
}
|
118
|
+
|
119
|
+
return {}
|
54
120
|
}
|
55
121
|
|
56
|
-
|
57
|
-
|
122
|
+
evaluateTarget(action_name) {
|
123
|
+
// closest find for has many associations
|
124
|
+
if (this.el.data('target')) this.target = this.el.closest('fieldset').find(this.el.data('target'))
|
125
|
+
else if (this.el.data('gtarget')) this.target = $(this.el.data('gtarget'))
|
126
|
+
if (action_name === 'callback') this.target = this.el
|
127
|
+
}
|
58
128
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
-
})
|
81
|
-
}
|
129
|
+
isValid() {
|
130
|
+
if (!this.condition) return false
|
131
|
+
return (this.action || this.custom_function)
|
132
|
+
}
|
82
133
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
134
|
+
setup() {
|
135
|
+
if (!this.isValid()) return
|
136
|
+
if (this.el.data('if') !== 'changed') this.apply()
|
137
|
+
this.el.on('change', () => this.apply())
|
138
|
+
}
|
88
139
|
}
|
89
140
|
|
90
|
-
// Inline update - must be called
|
141
|
+
// Inline update - must be called bound on the editing element
|
91
142
|
function dfUpdateField() {
|
92
|
-
if ($(this).data('loading')
|
143
|
+
if ($(this).data('loading') !== '1') {
|
93
144
|
$(this).data('loading', '1');
|
94
145
|
let _this = $(this);
|
95
146
|
let type = $(this).data('field-type');
|
96
147
|
let new_value;
|
97
|
-
if (type
|
98
|
-
else if (type
|
148
|
+
if (type === 'boolean') new_value = !$(this).data('field-value');
|
149
|
+
else if (type === 'select') new_value = $(this).val();
|
99
150
|
else new_value = $(this).text();
|
100
151
|
let data = {};
|
101
152
|
data[$(this).data('field')] = new_value;
|
@@ -104,16 +155,16 @@
|
|
104
155
|
data: { data: data },
|
105
156
|
method: 'POST',
|
106
157
|
url: $(this).data('save-url'),
|
107
|
-
complete: function (
|
158
|
+
complete: function (_req, _status) {
|
108
159
|
$(this).data('loading', '0');
|
109
160
|
},
|
110
|
-
success: function (data,
|
111
|
-
if (data.status
|
161
|
+
success: function (data, _status, _req) {
|
162
|
+
if (data.status === 'error') {
|
112
163
|
if ($(this).data('show-errors')) {
|
113
164
|
let result = '';
|
114
165
|
let message = data.message;
|
115
166
|
for (let key in message) {
|
116
|
-
if (typeof (message[key]) === 'object') {
|
167
|
+
if (message.hasOwnProperty(key) && typeof (message[key]) === 'object') {
|
117
168
|
if (result) result += ' - ';
|
118
169
|
result += key + ': ' + message[key].join('; ');
|
119
170
|
}
|
@@ -139,19 +190,18 @@
|
|
139
190
|
}
|
140
191
|
}
|
141
192
|
|
142
|
-
|
143
|
-
$(document).ready(function () {
|
193
|
+
function dfInit() {
|
144
194
|
// 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]'
|
195
|
+
const selectors = '.active_admin .input [data-if], .active_admin .input [data-eq], .active_admin .input [data-not], .active_admin .input [data-match], .active_admin .input [data-mismatch], .active_admin .input [data-function]'
|
146
196
|
$(selectors).each(function () {
|
147
|
-
|
197
|
+
new Field($(this)).setup()
|
148
198
|
})
|
149
199
|
|
150
200
|
// Setup dynamic fields for associations
|
151
201
|
$('.active_admin .has_many_container').on('has_many_add:after', () => {
|
152
202
|
$(selectors).each(function () {
|
153
|
-
|
154
|
-
})
|
203
|
+
new Field($(this)).setup()
|
204
|
+
})
|
155
205
|
})
|
156
206
|
|
157
207
|
// Set dialog icon link
|
@@ -163,20 +213,23 @@
|
|
163
213
|
$('.active_admin [data-df-dialog]').on('click', function (event) {
|
164
214
|
event.preventDefault()
|
165
215
|
$(this).blur()
|
166
|
-
|
167
|
-
|
168
|
-
|
216
|
+
const df_dialog = $('#df-dialog')
|
217
|
+
|
218
|
+
if (df_dialog.data('loading') !== '1') {
|
219
|
+
df_dialog.data('loading', '1')
|
220
|
+
if (df_dialog.length === 0) $('body').append('<div id="df-dialog"></div>')
|
169
221
|
let title = $(this).attr('title')
|
170
222
|
$.ajax({
|
171
223
|
url: $(this).attr('href'),
|
172
|
-
complete: function (
|
224
|
+
complete: function (_req, _status) {
|
173
225
|
$('#df-dialog').data('loading', '0')
|
174
226
|
},
|
175
|
-
success: function (data,
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
227
|
+
success: function (data, _status, _req) {
|
228
|
+
const dialog = $('#df-dialog')
|
229
|
+
if (title) dialog.attr('title', title)
|
230
|
+
dialog.html(data)
|
231
|
+
dialog.dialog({ modal: true })
|
232
|
+
}
|
180
233
|
})
|
181
234
|
}
|
182
235
|
})
|
@@ -189,11 +242,14 @@
|
|
189
242
|
$(this).data('field-value', $(this).text())
|
190
243
|
let fnUpdate = $.proxy(dfUpdateField, $(this))
|
191
244
|
$(this).on('blur', function () {
|
192
|
-
if ($(this).data('field-value')
|
245
|
+
if ($(this).data('field-value') !== $(this).text()) fnUpdate()
|
193
246
|
})
|
194
247
|
})
|
195
248
|
$('[data-field][data-field-type="select"][data-save-url]').each(function () {
|
196
249
|
$(this).on('change', $.proxy(dfUpdateField, $(this)))
|
197
250
|
})
|
198
|
-
}
|
251
|
+
}
|
252
|
+
|
253
|
+
$(document).ready(dfInit)
|
254
|
+
$(document).on('turbolinks:load', dfInit)
|
199
255
|
})()
|
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.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mattia Roccoberton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activeadmin
|
@@ -30,126 +30,154 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 6.0
|
33
|
+
version: '6.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 6.0
|
40
|
+
version: '6.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: capybara
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 3.33
|
47
|
+
version: '3.33'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 3.33
|
54
|
+
version: '3.33'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: pry
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.13
|
61
|
+
version: '0.13'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.13
|
68
|
+
version: '0.13'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: puma
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 4.3
|
75
|
+
version: '4.3'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 4.3
|
82
|
+
version: '4.3'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec_junit_formatter
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.4
|
89
|
+
version: '0.4'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.4
|
96
|
+
version: '0.4'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rspec-rails
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 4.0
|
103
|
+
version: '4.0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 4.0
|
110
|
+
version: '4.0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rubocop
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.90
|
117
|
+
version: '0.90'
|
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: 0.90
|
124
|
+
version: '0.90'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: sassc
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '2.4'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '2.4'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: selenium-webdriver
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
143
|
- - "~>"
|
130
144
|
- !ruby/object:Gem::Version
|
131
|
-
version: 3.142
|
145
|
+
version: '3.142'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '3.142'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: sprockets-rails
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '3.2'
|
132
160
|
type: :development
|
133
161
|
prerelease: false
|
134
162
|
version_requirements: !ruby/object:Gem::Requirement
|
135
163
|
requirements:
|
136
164
|
- - "~>"
|
137
165
|
- !ruby/object:Gem::Version
|
138
|
-
version: 3.
|
166
|
+
version: '3.2'
|
139
167
|
- !ruby/object:Gem::Dependency
|
140
168
|
name: sqlite3
|
141
169
|
requirement: !ruby/object:Gem::Requirement
|
142
170
|
requirements:
|
143
171
|
- - "~>"
|
144
172
|
- !ruby/object:Gem::Version
|
145
|
-
version: 1.4
|
173
|
+
version: '1.4'
|
146
174
|
type: :development
|
147
175
|
prerelease: false
|
148
176
|
version_requirements: !ruby/object:Gem::Requirement
|
149
177
|
requirements:
|
150
178
|
- - "~>"
|
151
179
|
- !ruby/object:Gem::Version
|
152
|
-
version: 1.4
|
180
|
+
version: '1.4'
|
153
181
|
description: An Active Admin plugin to add dynamic behaviors to fields
|
154
182
|
email: mat@blocknot.es
|
155
183
|
executables: []
|
@@ -183,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
211
|
- !ruby/object:Gem::Version
|
184
212
|
version: '0'
|
185
213
|
requirements: []
|
186
|
-
rubygems_version: 3.
|
214
|
+
rubygems_version: 3.1.4
|
187
215
|
signing_key:
|
188
216
|
specification_version: 4
|
189
217
|
summary: Dynamic fields for ActiveAdmin
|