activeadmin_addons 0.10.1 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/activeadmin_addons/all.js.coffee +1 -0
- data/app/assets/javascripts/activeadmin_addons/config.js +7 -0
- data/app/assets/javascripts/activeadmin_addons/select2.js +174 -148
- data/app/inputs/ajax_filter_input.rb +12 -3
- data/app/inputs/date_time_picker_input.rb +5 -1
- data/app/inputs/search_select_input.rb +2 -1
- data/app/inputs/tags_input.rb +5 -2
- data/lib/activeadmin_addons.rb +13 -0
- data/lib/activeadmin_addons/active_admin_config.rb +8 -0
- data/lib/activeadmin_addons/engine.rb +1 -0
- data/lib/activeadmin_addons/version.rb +1 -1
- data/lib/generators/activeadmin_addons/install/install_generator.rb +6 -0
- data/lib/generators/activeadmin_addons/install/templates/initializer.rb +4 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91d4876ea2cb7334f8c2dbc40fb17e5823478982
|
4
|
+
data.tar.gz: cde3168fdf880d9a82405bbd390387bb51bbfff4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bbedf34cd625f6c3379730abd2b1b9055b044080fc4c5d6b77499a02f1c61a49441c1d82c834de2971caa554df7908fcf0c55bca452ac28aa43583500131af60
|
7
|
+
data.tar.gz: e27cbfb2b0272abe956a1f4fed8520a5e8ee898ec838d7837ad98af96d75f35bd76789377e484a4a700984114fa47ed52a829a3f7cac8526d589c1ab4ebc5ace
|
@@ -2,182 +2,208 @@
|
|
2
2
|
//= require_self
|
3
3
|
|
4
4
|
$(function() {
|
5
|
-
|
5
|
+
configureSelect2(document);
|
6
6
|
|
7
7
|
$(document).on('has_many_add:after', function(event, container){
|
8
|
-
|
8
|
+
configureSelect2(container);
|
9
9
|
});
|
10
10
|
|
11
|
-
function
|
11
|
+
function configureSelect2(container) {
|
12
12
|
var INVALID_PARENT_ID = -1;
|
13
13
|
var DEFAULT_SELECT_WIDTH = '80%';
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
15
|
+
setupDefaultBehaviour();
|
16
|
+
setupAjaxSearch();
|
17
|
+
setupTags();
|
18
|
+
|
19
|
+
function setupTags() {
|
20
|
+
$('.select2-tags', container).each(function(i, el) {
|
21
|
+
var model = $(el).data('model'),
|
22
|
+
method = $(el).data('method'),
|
23
|
+
width = $(el).data('width'),
|
24
|
+
selectOptions = {
|
25
|
+
width: width || DEFAULT_SELECT_WIDTH,
|
26
|
+
tags: $(el).data('collection')
|
27
|
+
};
|
28
|
+
|
29
|
+
if(!!model) {
|
30
|
+
selectOptions.createSearchChoice = function() { return null; };
|
31
|
+
var prefix = model + '_' + method;
|
32
|
+
$(el).on('select2-selecting', onItemAdded);
|
33
|
+
$(el).on('select2-removed', onItemRemoved);
|
34
|
+
}
|
30
35
|
|
31
|
-
|
36
|
+
$(el).select2(selectOptions);
|
32
37
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
38
|
+
function onItemRemoved(event) {
|
39
|
+
var itemId = '[id=\'' + prefix + '_' + event.val + '\']';
|
40
|
+
$(itemId).remove();
|
41
|
+
}
|
37
42
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
43
|
+
function onItemAdded(event) {
|
44
|
+
var selectedItemsContainer = $("[id='" + prefix + "_selected_values']"),
|
45
|
+
itemName = model + '[' + method + '][]',
|
46
|
+
itemId = prefix + '_' + event.val;
|
47
|
+
|
48
|
+
$('<input>').attr({
|
49
|
+
id: itemId,
|
50
|
+
name: itemName,
|
51
|
+
type: 'hidden',
|
52
|
+
value: event.val
|
53
|
+
}).appendTo(selectedItemsContainer);
|
54
|
+
}
|
55
|
+
});
|
56
|
+
}
|
57
|
+
|
58
|
+
function setupAjaxSearch() {
|
59
|
+
$('.select2-ajax', container).each(function(i, el) {
|
60
|
+
var url = $(el).data('url');
|
61
|
+
var fields = $(el).data('fields');
|
62
|
+
var displayName = $(el).data('display_name');
|
63
|
+
var parent = $(el).data('parent');
|
64
|
+
var width = $(el).data('width') || DEFAULT_SELECT_WIDTH;
|
65
|
+
var model = $(el).data('model');
|
66
|
+
var responseRoot = $(el).data('response_root');
|
67
|
+
var collection = $(el).data('collection');
|
68
|
+
var minimumInputLength = $(el).data('minimum_input_length');
|
69
|
+
var order = $(el).data('order') || (fields[0] + '_desc');
|
70
|
+
var parentId = $(el).data('parent_id') || INVALID_PARENT_ID;
|
71
|
+
var selectInstance;
|
72
|
+
|
73
|
+
var ajaxOptions = {
|
74
|
+
url: url,
|
75
|
+
dataType: 'json',
|
76
|
+
delay: 250,
|
77
|
+
data: function(term) {
|
78
|
+
var textQuery = { m: 'or' };
|
79
|
+
fields.forEach(function(field) {
|
80
|
+
if (field == "id") {
|
81
|
+
textQuery[field + '_eq'] = term;
|
82
|
+
} else {
|
83
|
+
textQuery[field + '_contains'] = term;
|
84
|
+
}
|
85
|
+
});
|
86
|
+
|
87
|
+
var query = {
|
88
|
+
order: order,
|
89
|
+
q: {
|
90
|
+
groupings: [textQuery],
|
91
|
+
combinator: 'and'
|
92
|
+
}
|
93
|
+
};
|
94
|
+
|
95
|
+
if (!!parent) {
|
96
|
+
query.q[parent + '_eq'] = parentId;
|
97
|
+
}
|
98
|
+
|
99
|
+
return query;
|
100
|
+
},
|
101
|
+
results: function(data, page) {
|
102
|
+
if(data.constructor == Object) {
|
103
|
+
data = data[responseRoot];
|
104
|
+
}
|
51
105
|
|
52
|
-
|
53
|
-
|
106
|
+
return {
|
107
|
+
results: jQuery.map(data, function(resource) {
|
108
|
+
return {
|
109
|
+
id: resource.id,
|
110
|
+
text: resource[displayName].toString()
|
111
|
+
};
|
112
|
+
})
|
113
|
+
};
|
114
|
+
},
|
115
|
+
cache: true
|
116
|
+
};
|
117
|
+
|
118
|
+
var collectionOptions = function(query) {
|
119
|
+
var data = { results: [] };
|
120
|
+
|
121
|
+
collection.forEach(function(record) {
|
122
|
+
var matched = fields.some(function(field) {
|
123
|
+
var regex = new RegExp(query.term, 'i');
|
124
|
+
return !!record[field] && !!record[field].match(regex);
|
125
|
+
});
|
126
|
+
|
127
|
+
if((!parent || record[parent] == parentId) && matched) {
|
128
|
+
data.results.push({ id: record.id, text: record[displayName].toString() });
|
129
|
+
}
|
130
|
+
});
|
131
|
+
|
132
|
+
query.callback(data);
|
133
|
+
};
|
134
|
+
|
135
|
+
var select2Config = {
|
136
|
+
width: width,
|
137
|
+
containerCssClass: 'nested-select-container',
|
138
|
+
minimumInputLength: minimumInputLength,
|
139
|
+
initSelection: function(element, callback) {
|
140
|
+
var id = $(element).val();
|
141
|
+
var text = $(element).data('selected') || '';
|
142
|
+
$(element).data('selected', '');
|
143
|
+
|
144
|
+
callback({
|
145
|
+
id: id,
|
146
|
+
text: text
|
147
|
+
});
|
148
|
+
},
|
149
|
+
placeholder: ' ',
|
150
|
+
allowClear: true
|
151
|
+
};
|
152
|
+
|
153
|
+
if (!!parent) {
|
154
|
+
var parentSelector = '#' + model + '_' + parent;
|
155
|
+
|
156
|
+
$(el).parent().find(parentSelector).on('change', function(e) {
|
157
|
+
selectInstance.val(null).trigger('change');
|
158
|
+
parentId = e.val;
|
159
|
+
|
160
|
+
if(!parentId) {
|
161
|
+
parentId = INVALID_PARENT_ID;
|
162
|
+
}
|
163
|
+
});
|
164
|
+
}
|
165
|
+
|
166
|
+
if (collection) {
|
167
|
+
select2Config.query = collectionOptions;
|
168
|
+
} else {
|
169
|
+
select2Config.ajax = ajaxOptions;
|
170
|
+
}
|
171
|
+
|
172
|
+
selectInstance = $(el).select2(select2Config);
|
173
|
+
});
|
174
|
+
}
|
175
|
+
|
176
|
+
function setupSelect2(select) {
|
177
|
+
var firstOption = $('option', select).first(),
|
54
178
|
allowClear = false;
|
55
179
|
|
56
180
|
if (firstOption.val() === "" && firstOption.text() === "") {
|
57
181
|
allowClear = true;
|
58
182
|
}
|
59
183
|
|
60
|
-
if ($(
|
61
|
-
$(
|
184
|
+
if ($(select).closest('.filter_form').length > 0) {
|
185
|
+
$(select).select2({
|
62
186
|
width: 'resolve',
|
63
187
|
allowClear: allowClear
|
64
188
|
});
|
65
189
|
} else {
|
66
|
-
$(
|
190
|
+
$(select).select2({
|
67
191
|
width: DEFAULT_SELECT_WIDTH,
|
68
192
|
allowClear: allowClear
|
69
193
|
});
|
70
194
|
}
|
71
|
-
}
|
72
|
-
|
73
|
-
$('.select2-ajax', container).each(function(i, el) {
|
74
|
-
var url = $(el).data('url');
|
75
|
-
var fields = $(el).data('fields');
|
76
|
-
var displayName = $(el).data('display_name');
|
77
|
-
var parent = $(el).data('parent');
|
78
|
-
var width = $(el).data('width') || DEFAULT_SELECT_WIDTH;
|
79
|
-
var model = $(el).data('model');
|
80
|
-
var responseRoot = $(el).data('response_root');
|
81
|
-
var collection = $(el).data('collection');
|
82
|
-
var minimumInputLength = $(el).data('minimum_input_length');
|
83
|
-
var order = fields[0] + '_desc';
|
84
|
-
var parentId = $(el).data('parent_id') || INVALID_PARENT_ID;
|
85
|
-
var selectInstance;
|
86
|
-
|
87
|
-
var ajaxOptions = {
|
88
|
-
url: url,
|
89
|
-
dataType: 'json',
|
90
|
-
delay: 250,
|
91
|
-
data: function(term) {
|
92
|
-
var textQuery = { m: 'or' };
|
93
|
-
fields.forEach(function(field) {
|
94
|
-
textQuery[field + '_contains'] = term;
|
95
|
-
});
|
96
|
-
|
97
|
-
var query = {
|
98
|
-
order: order,
|
99
|
-
q: {
|
100
|
-
groupings: [textQuery],
|
101
|
-
combinator: 'and'
|
102
|
-
}
|
103
|
-
};
|
104
|
-
|
105
|
-
if (!!parent) {
|
106
|
-
query.q[parent + '_eq'] = parentId;
|
107
|
-
}
|
108
|
-
|
109
|
-
return query;
|
110
|
-
},
|
111
|
-
results: function(data, page) {
|
112
|
-
if(data.constructor == Object) {
|
113
|
-
data = data[responseRoot];
|
114
|
-
}
|
115
|
-
|
116
|
-
return {
|
117
|
-
results: jQuery.map(data, function(resource) {
|
118
|
-
return {
|
119
|
-
id: resource.id,
|
120
|
-
text: resource[displayName].toString()
|
121
|
-
};
|
122
|
-
})
|
123
|
-
};
|
124
|
-
},
|
125
|
-
cache: true
|
126
|
-
};
|
127
|
-
|
128
|
-
var collectionOptions = function(query) {
|
129
|
-
var data = { results: [] };
|
130
|
-
|
131
|
-
collection.forEach(function(record) {
|
132
|
-
var matched = fields.some(function(field) {
|
133
|
-
var regex = new RegExp(query.term, 'i');
|
134
|
-
return !!record[field] && !!record[field].match(regex);
|
135
|
-
});
|
136
|
-
|
137
|
-
if((!parent || record[parent] == parentId) && matched) {
|
138
|
-
data.results.push({ id: record.id, text: record[displayName].toString() });
|
139
|
-
}
|
140
|
-
});
|
195
|
+
}
|
141
196
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
width: width,
|
147
|
-
containerCssClass: 'nested-select-container',
|
148
|
-
minimumInputLength: minimumInputLength,
|
149
|
-
initSelection: function(element, callback) {
|
150
|
-
var id = $(element).val();
|
151
|
-
var text = $(element).data('selected') || '';
|
152
|
-
$(element).data('selected', '');
|
153
|
-
|
154
|
-
callback({
|
155
|
-
id: id,
|
156
|
-
text: text
|
157
|
-
});
|
158
|
-
}
|
159
|
-
};
|
160
|
-
|
161
|
-
if (!!parent) {
|
162
|
-
var parentSelector = '#' + model + '_' + parent;
|
163
|
-
|
164
|
-
$(el).parent().find(parentSelector).on('change', function(e) {
|
165
|
-
selectInstance.val(null).trigger('change');
|
166
|
-
parentId = e.val;
|
167
|
-
|
168
|
-
if(!parentId) {
|
169
|
-
parentId = INVALID_PARENT_ID;
|
170
|
-
}
|
197
|
+
function setupDefaultBehaviour() {
|
198
|
+
if(ActiveadminAddons.config.defaultSelect == 'select2') {
|
199
|
+
$('select:not(.default-select)', container).each(function(i, el) {
|
200
|
+
setupSelect2(el);
|
171
201
|
});
|
172
202
|
}
|
173
203
|
|
174
|
-
|
175
|
-
|
176
|
-
}
|
177
|
-
|
178
|
-
}
|
179
|
-
|
180
|
-
selectInstance = $(el).select2(select2Config);
|
181
|
-
});
|
204
|
+
$('select.select2', container).each(function(i, el) {
|
205
|
+
setupSelect2(el);
|
206
|
+
});
|
207
|
+
}
|
182
208
|
}
|
183
209
|
});
|
@@ -19,19 +19,28 @@ class AjaxFilterInput < Formtastic::Inputs::StringInput
|
|
19
19
|
opts = {}
|
20
20
|
opts[:class] = ['select2-ajax'].concat([@options[:class]] || []).join(' ')
|
21
21
|
opts["data-fields"] = (@options[:fields] || []).to_json
|
22
|
-
opts["data-url"] =
|
22
|
+
opts["data-url"] = url
|
23
23
|
opts["data-response_root"] = @options[:response_root] || @options[:url].to_s.split('/').last
|
24
24
|
opts["data-display_name"] = @options[:display_name] || "name"
|
25
25
|
opts["data-minimum_input_length"] = @options[:minimum_input_length] || 1
|
26
26
|
opts["data-width"] = @options[:width] || "100%"
|
27
27
|
opts["data-selected"] = get_selected_value(opts["data-display_name"])
|
28
|
+
opts["data-order"] = @options[:order_by] if @options[:order_by]
|
28
29
|
super.merge opts
|
29
30
|
end
|
30
31
|
|
31
32
|
# rubocop:disable Style/RescueModifier
|
32
33
|
def get_selected_value(display_name)
|
33
|
-
filter_class = method.to_s.chomp("_id").classify.constantize
|
34
|
-
selected_value = @object.conditions.
|
34
|
+
filter_class = method.to_s.chomp("_id").classify.constantize rescue @object.klass
|
35
|
+
selected_value = @object.conditions.find { |c| c.attributes.map(&:name).include?(method.to_s) }.values.first.value rescue nil
|
35
36
|
filter_class.find(selected_value).send(display_name) if !!selected_value
|
36
37
|
end
|
38
|
+
|
39
|
+
def url
|
40
|
+
if @options[:url].is_a?(Proc)
|
41
|
+
template.instance_eval(&@options[:url]) || ""
|
42
|
+
else
|
43
|
+
@options[:url] || ""
|
44
|
+
end
|
45
|
+
end
|
37
46
|
end
|
@@ -40,7 +40,11 @@ class DateTimePickerInput < Formtastic::Inputs::StringInput
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def input_value(input_name = nil)
|
43
|
-
|
43
|
+
if options[:input_html] && options[:input_html].key?(:value)
|
44
|
+
return options[:input_html][:value]
|
45
|
+
end
|
46
|
+
|
47
|
+
v = !object.nil? ? object.public_send(input_name || method) : ''
|
44
48
|
|
45
49
|
if v.is_a?(Time)
|
46
50
|
return DateTime.new(v.year, v.month, v.day, v.hour, v.min, v.sec).strftime(format)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class SearchSelectInput < Formtastic::Inputs::StringInput
|
2
2
|
def input_html_options
|
3
|
-
relation = @object.send(attributized_method_name)
|
3
|
+
relation = !@object.nil? ? @object.send(attributized_method_name) : ''
|
4
4
|
opts = {}
|
5
5
|
opts[:class] = ['select2-ajax'].concat([@options[:class]] || []).join(' ')
|
6
6
|
opts["data-fields"] = (@options[:fields] || []).to_json
|
@@ -10,6 +10,7 @@ class SearchSelectInput < Formtastic::Inputs::StringInput
|
|
10
10
|
opts["data-minimum_input_length"] = @options[:minimum_input_length] || 1
|
11
11
|
opts["data-width"] = @options[:width] if @options[:width]
|
12
12
|
opts["data-selected"] = relation.try(opts["data-display_name"].to_sym)
|
13
|
+
opts["data-order"] = @options[:order_by] if @options[:order_by]
|
13
14
|
super.merge opts
|
14
15
|
end
|
15
16
|
end
|
data/app/inputs/tags_input.rb
CHANGED
@@ -52,7 +52,10 @@ class TagsInput < Formtastic::Inputs::StringInput
|
|
52
52
|
end
|
53
53
|
|
54
54
|
opts["data-collection"] = @options[:collection].map do |item|
|
55
|
-
{
|
55
|
+
{
|
56
|
+
id: item.send((@options[:value] || "id")),
|
57
|
+
text: item.send((@options[:display_name] || "name"))
|
58
|
+
}
|
56
59
|
end.to_json
|
57
60
|
|
58
61
|
opts
|
@@ -79,6 +82,6 @@ class TagsInput < Formtastic::Inputs::StringInput
|
|
79
82
|
end
|
80
83
|
|
81
84
|
def model_name
|
82
|
-
@object.class.to_s.underscore
|
85
|
+
@object.class.to_s.underscore.tr('/', '_')
|
83
86
|
end
|
84
87
|
end
|
data/lib/activeadmin_addons.rb
CHANGED
@@ -1,4 +1,17 @@
|
|
1
1
|
module ActiveadminAddons
|
2
|
+
extend self
|
3
|
+
|
4
|
+
attr_writer :default_select
|
5
|
+
|
6
|
+
def default_select
|
7
|
+
return "select2" unless @default_select
|
8
|
+
@default_select
|
9
|
+
end
|
10
|
+
|
11
|
+
def setup
|
12
|
+
yield self
|
13
|
+
require "activeadmin_addons"
|
14
|
+
end
|
2
15
|
end
|
3
16
|
|
4
17
|
require_relative './activeadmin_addons/engine'
|
@@ -15,6 +15,7 @@ module ActiveAdminAddons
|
|
15
15
|
require_relative './addons/list'
|
16
16
|
require_relative './support/enumerize_formtastic_support'
|
17
17
|
require_relative './support/set_datepicker'
|
18
|
+
require_relative 'active_admin_config'
|
18
19
|
app.config.assets.precompile += %w(select.scss fileicons/*.png)
|
19
20
|
end
|
20
21
|
end
|
@@ -1,6 +1,12 @@
|
|
1
1
|
module ActiveadminAddons
|
2
2
|
module Generators
|
3
3
|
class InstallGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
def create_initializer
|
7
|
+
template "initializer.rb", "config/initializers/activeadmin_addons.rb"
|
8
|
+
end
|
9
|
+
|
4
10
|
def add_javascripts
|
5
11
|
file_path = 'app/assets/javascripts/active_admin.js.coffee'
|
6
12
|
line_to_add = "#= require activeadmin_addons/all\n"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activeadmin_addons
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Platanus
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2017-04-01 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: railties
|
@@ -370,6 +370,7 @@ files:
|
|
370
370
|
- app/assets/images/fileicons/file_extension_zip.png
|
371
371
|
- app/assets/javascripts/activeadmin_addons/all.js.coffee
|
372
372
|
- app/assets/javascripts/activeadmin_addons/color-picker.js
|
373
|
+
- app/assets/javascripts/activeadmin_addons/config.js
|
373
374
|
- app/assets/javascripts/activeadmin_addons/date-time-picker.js
|
374
375
|
- app/assets/javascripts/activeadmin_addons/select2.js
|
375
376
|
- app/assets/javascripts/palette-color-picker.js
|
@@ -383,6 +384,7 @@ files:
|
|
383
384
|
- app/inputs/search_select_input.rb
|
384
385
|
- app/inputs/tags_input.rb
|
385
386
|
- lib/activeadmin_addons.rb
|
387
|
+
- lib/activeadmin_addons/active_admin_config.rb
|
386
388
|
- lib/activeadmin_addons/addons/bool_values.rb
|
387
389
|
- lib/activeadmin_addons/addons/enum_tag.rb
|
388
390
|
- lib/activeadmin_addons/addons/list.rb
|
@@ -396,6 +398,7 @@ files:
|
|
396
398
|
- lib/activeadmin_addons/support/set_datepicker.rb
|
397
399
|
- lib/activeadmin_addons/version.rb
|
398
400
|
- lib/generators/activeadmin_addons/install/install_generator.rb
|
401
|
+
- lib/generators/activeadmin_addons/install/templates/initializer.rb
|
399
402
|
- lib/tasks/activeadmin_addons_tasks.rake
|
400
403
|
homepage: https://github.com/platanus/activeadmin_addons
|
401
404
|
licenses:
|
@@ -417,7 +420,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
417
420
|
version: '0'
|
418
421
|
requirements: []
|
419
422
|
rubyforge_project:
|
420
|
-
rubygems_version: 2.4.
|
423
|
+
rubygems_version: 2.4.8
|
421
424
|
signing_key:
|
422
425
|
specification_version: 4
|
423
426
|
summary: Set of addons to help with the activeadmin ui
|