rails_admin 1.2.0 → 1.3.0
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.
Potentially problematic release.
This version of rails_admin might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +3 -2
- data/README.md +4 -4
- data/app/assets/javascripts/rails_admin/ra.filter-box.js +123 -59
- data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +12 -12
- data/app/assets/javascripts/rails_admin/ra.filtering-select.js +5 -0
- data/app/assets/javascripts/rails_admin/ra.i18n.coffee +2 -0
- data/app/assets/javascripts/rails_admin/ra.widgets.coffee +25 -0
- data/app/controllers/rails_admin/application_controller.rb +1 -1
- data/app/views/kaminari/ra-twitter-bootstrap/without_count/_next_page.html.haml +4 -0
- data/app/views/kaminari/ra-twitter-bootstrap/without_count/_paginator.html.haml +4 -0
- data/app/views/kaminari/ra-twitter-bootstrap/without_count/_prev_page.html.haml +4 -0
- data/app/views/rails_admin/main/_form_simple_mde.haml +8 -0
- data/app/views/rails_admin/main/history.html.haml +1 -1
- data/app/views/rails_admin/main/index.html.haml +13 -6
- data/lib/rails_admin/adapters/active_record.rb +2 -7
- data/lib/rails_admin/config.rb +5 -0
- data/lib/rails_admin/config/actions/dashboard.rb +5 -1
- data/lib/rails_admin/config/fields/types/active_record_enum.rb +17 -3
- data/lib/rails_admin/config/fields/types/all.rb +1 -0
- data/lib/rails_admin/config/fields/types/datetime.rb +1 -1
- data/lib/rails_admin/config/fields/types/json.rb +5 -1
- data/lib/rails_admin/config/fields/types/simple_mde.rb +33 -0
- data/lib/rails_admin/config/sections/list.rb +10 -0
- data/lib/rails_admin/extensions/history/auditing_adapter.rb +2 -2
- data/lib/rails_admin/extensions/history/history.rb +2 -2
- data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +4 -2
- data/lib/rails_admin/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33d3dadad1730dcd25eec2e13d09c6f46e8b580c
|
4
|
+
data.tar.gz: 2f14072f95732283cf691142d80c65a47335e31e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b820c08a510d01a62f8e6ba65b48ea6c2c37243b5202bb86e51f74303bd1ff370789259623d3b8aaaf41d19c6408fc0d694ed3f4f20c76ae24e034d1f4991724
|
7
|
+
data.tar.gz: 22557c8d0ab68e47e48be789f7b813a32f50af4e2f194c7710d71557b105c14af9fd6956c4aeecc6aca889ab5d404493dc1a6c8ad0cf7488542cae812ac52070
|
data/Gemfile
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
gem 'appraisal', '>= 2.0'
|
4
|
-
gem 'rails', '~> 5.
|
4
|
+
gem 'rails', '~> 5.1.0'
|
5
5
|
gem 'haml'
|
6
6
|
gem 'devise'
|
7
7
|
|
8
8
|
group :active_record do
|
9
|
+
gem 'paper_trail'
|
10
|
+
|
9
11
|
platforms :ruby, :mswin, :mingw do
|
10
12
|
gem 'mysql2', '~> 0.3.14'
|
11
|
-
gem 'pg', '>= 0.14'
|
12
13
|
gem 'sqlite3', '>= 1.3'
|
13
14
|
end
|
14
15
|
end
|
data/README.md
CHANGED
@@ -20,9 +20,9 @@ RailsAdmin is a Rails engine that provides an easy-to-use interface for managing
|
|
20
20
|
|
21
21
|
### [Action required] Security issue
|
22
22
|
|
23
|
-
**RailsAdmin
|
23
|
+
**RailsAdmin prior to 1.3.0 have been reported to have XSS vulnerability.** We strongly recommend that you upgrade RailsAdmin to 1.3.0 or later as soon as possible, if you are on those versions. See [#2985](https://github.com/sferik/rails_admin/issues/2985) for the detail.
|
24
24
|
|
25
|
-
|
25
|
+
Also, 1.0.0 and 1.1.0 is known to have [CSRF vulnerability](https://github.com/sferik/rails_admin/commit/b13e879eb93b661204e9fb5e55f7afa4f397537a), too.
|
26
26
|
|
27
27
|
|
28
28
|
## Features
|
@@ -42,7 +42,7 @@ This problem was reported by SourceClear, Inc.
|
|
42
42
|
|
43
43
|
## Installation
|
44
44
|
|
45
|
-
1. On your gemfile: `gem 'rails_admin', '~> 1.
|
45
|
+
1. On your gemfile: `gem 'rails_admin', '~> 1.3'`
|
46
46
|
2. Run `bundle install`
|
47
47
|
3. Run `rails g rails_admin:install`
|
48
48
|
4. Provide a namespace for the routes when asked
|
@@ -50,7 +50,7 @@ This problem was reported by SourceClear, Inc.
|
|
50
50
|
|
51
51
|
## Configuration
|
52
52
|
### Global
|
53
|
-
In `config/initializers/rails_admin`:
|
53
|
+
In `config/initializers/rails_admin.rb`:
|
54
54
|
|
55
55
|
[Details](https://github.com/sferik/rails_admin/wiki/Base-configuration)
|
56
56
|
|
@@ -19,90 +19,154 @@
|
|
19
19
|
|
20
20
|
switch(field_type) {
|
21
21
|
case 'boolean':
|
22
|
-
|
23
|
-
'
|
24
|
-
'<option value="
|
25
|
-
'<option value="
|
26
|
-
'<option
|
27
|
-
'<option
|
28
|
-
'<option
|
29
|
-
|
22
|
+
control = $('<select class="input-sm form-control"></select>')
|
23
|
+
.prop('name', value_name)
|
24
|
+
.append('<option value="_discard">...</option>')
|
25
|
+
.append($('<option value="true"></option>').prop('selected', field_value == "true").text(RailsAdmin.I18n.t("true")))
|
26
|
+
.append($('<option value="false"></option>').prop('selected', field_value == "false").text(RailsAdmin.I18n.t("false")))
|
27
|
+
.append('<option disabled="disabled">---------</option>')
|
28
|
+
.append($('<option value="_present"></option>').prop('selected', field_value == "_present").text(RailsAdmin.I18n.t("is_present")))
|
29
|
+
.append($('<option value="_blank"></option>').prop('selected', field_value == "_blank").text(RailsAdmin.I18n.t("is_blank")));
|
30
30
|
break;
|
31
31
|
case 'date':
|
32
32
|
additional_control =
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
$('<input size="20" class="date additional-fieldset default input-sm form-control" type="text" />')
|
34
|
+
.css('display', (!field_operator || field_operator == "default") ? 'inline-block' : 'none')
|
35
|
+
.prop('name', value_name + '[]')
|
36
|
+
.prop('value', field_value[0] || '')
|
37
|
+
.add(
|
38
|
+
$('<input size="20" placeholder="-∞" class="date additional-fieldset between input-sm form-control" type="text" />')
|
39
|
+
.css('display', (field_operator == "between") ? 'inline-block' : 'none')
|
40
|
+
.prop('name', value_name + '[]')
|
41
|
+
.prop('value', field_value[1] || '')
|
42
|
+
)
|
43
|
+
.add(
|
44
|
+
$('<input size="20" placeholder="∞" class="date additional-fieldset between input-sm form-control" type="text" />')
|
45
|
+
.css('display', (field_operator == "between") ? 'inline-block' : 'none')
|
46
|
+
.prop('name', value_name + '[]')
|
47
|
+
.prop('value', field_value[2] || '')
|
48
|
+
);
|
36
49
|
case 'datetime':
|
37
50
|
case 'timestamp':
|
38
|
-
control = control || '<select class="switch-additionnal-fieldsets input-sm form-control"
|
39
|
-
|
40
|
-
'<option
|
41
|
-
'<option
|
42
|
-
'<option
|
43
|
-
'<option
|
44
|
-
'<option
|
45
|
-
'<option
|
46
|
-
'<option
|
47
|
-
'<option
|
48
|
-
|
51
|
+
control = control || $('<select class="switch-additionnal-fieldsets input-sm form-control"></select>')
|
52
|
+
.prop('name', operator_name)
|
53
|
+
.append($('<option data-additional-fieldset="default" value="default"></option>').prop('selected', field_operator == "default").text(RailsAdmin.I18n.t("date")))
|
54
|
+
.append($('<option data-additional-fieldset="between" value="between"></option>').prop('selected', field_operator == "between").text(RailsAdmin.I18n.t("between_and_")))
|
55
|
+
.append($('<option value="today"></option>').prop('selected', field_operator == "today").text(RailsAdmin.I18n.t("today")))
|
56
|
+
.append($('<option value="yesterday"></option>').prop('selected', field_operator == "yesterday").text(RailsAdmin.I18n.t("yesterday")))
|
57
|
+
.append($('<option value="this_week"></option>').prop('selected', field_operator == "this_week").text(RailsAdmin.I18n.t("this_week")))
|
58
|
+
.append($('<option value="last_week"></option>').prop('selected', field_operator == "last_week").text(RailsAdmin.I18n.t("last_week")))
|
59
|
+
.append('<option disabled="disabled">---------</option>')
|
60
|
+
.append($('<option value="_not_null"></option>').prop('selected', field_operator == "_not_null").text(RailsAdmin.I18n.t("is_present")))
|
61
|
+
.append($('<option value="_null"></option>').prop('selected', field_operator == "_null").text(RailsAdmin.I18n.t("is_blank")));
|
49
62
|
additional_control = additional_control ||
|
50
|
-
|
51
|
-
|
52
|
-
|
63
|
+
$('<input size="25" class="datetime additional-fieldset default input-sm form-control" type="text" />')
|
64
|
+
.css('display', (!field_operator || field_operator == "default") ? 'inline-block' : 'none')
|
65
|
+
.prop('name', value_name + '[]')
|
66
|
+
.prop('value', field_value[0] || '')
|
67
|
+
.add(
|
68
|
+
$('<input size="25" placeholder="-∞" class="datetime additional-fieldset between input-sm form-control" type="text" />')
|
69
|
+
.css('display', (field_operator == "between") ? 'inline-block' : 'none')
|
70
|
+
.prop('name', value_name + '[]')
|
71
|
+
.prop('value', field_value[1] || '')
|
72
|
+
)
|
73
|
+
.add(
|
74
|
+
$('<input size="25" placeholder="∞" class="datetime additional-fieldset between input-sm form-control" type="text" />')
|
75
|
+
.css('display', (field_operator == "between") ? 'inline-block' : 'none')
|
76
|
+
.prop('name', value_name + '[]')
|
77
|
+
.prop('value', field_value[2] || '')
|
78
|
+
);
|
53
79
|
break;
|
54
80
|
case 'enum':
|
55
81
|
var multiple_values = ((field_value instanceof Array) ? true : false)
|
56
|
-
control = '<select
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
'
|
63
|
-
'<
|
64
|
-
|
65
|
-
|
66
|
-
|
82
|
+
control = $('<select class="select-single input-sm form-control"></select>')
|
83
|
+
.css('display', multiple_values ? 'none' : 'inline-block')
|
84
|
+
.prop('name', multiple_values ? undefined : value_name)
|
85
|
+
.data('name', value_name)
|
86
|
+
.append('<option value="_discard">...</option>')
|
87
|
+
.append($('<option value="_present"></option>').prop('selected', field_value == "_present").text(RailsAdmin.I18n.t("is_present")))
|
88
|
+
.append($('<option value="_blank"></option>').prop('selected', field_value == "_blank").text(RailsAdmin.I18n.t("is_blank")))
|
89
|
+
.append('<option disabled="disabled">---------</option>')
|
90
|
+
.append(select_options)
|
91
|
+
.add(
|
92
|
+
$('<select multiple="multiple" class="select-multiple input-sm form-control"></select>')
|
93
|
+
.css('display', multiple_values ? 'inline-block' : 'none')
|
94
|
+
.prop('name', multiple_values ? value_name + '[]' : undefined)
|
95
|
+
.data('name', value_name + '[]')
|
96
|
+
.append(select_options)
|
97
|
+
)
|
98
|
+
.add(
|
99
|
+
$('<a href="#" class="switch-select"></a>')
|
100
|
+
.append($('<i></i>').addClass('icon-' + (multiple_values ? 'minus' : 'plus')))
|
101
|
+
);
|
67
102
|
break;
|
68
103
|
case 'string':
|
69
104
|
case 'text':
|
70
105
|
case 'belongs_to_association':
|
71
|
-
control = '<select class="switch-additionnal-fieldsets input-sm form-control"
|
72
|
-
|
73
|
-
|
74
|
-
'<option
|
75
|
-
'<option data-additional-fieldset="additional-fieldset"
|
76
|
-
'<option
|
77
|
-
'<option
|
78
|
-
'<option
|
79
|
-
|
80
|
-
|
106
|
+
control = $('<select class="switch-additionnal-fieldsets input-sm form-control"></select>')
|
107
|
+
.prop('value', field_operator)
|
108
|
+
.prop('name', operator_name)
|
109
|
+
.append('<option value="_discard">...</option>')
|
110
|
+
.append($('<option data-additional-fieldset="additional-fieldset" value="like"></option>').prop('selected', field_operator == "like").text(RailsAdmin.I18n.t("contains")))
|
111
|
+
.append($('<option data-additional-fieldset="additional-fieldset" value="is"></option>').prop('selected', field_operator == "is").text(RailsAdmin.I18n.t("is_exactly")))
|
112
|
+
.append($('<option data-additional-fieldset="additional-fieldset" value="starts_with"></option>').prop('selected', field_operator == "starts_with").text(RailsAdmin.I18n.t("starts_with")))
|
113
|
+
.append($('<option data-additional-fieldset="additional-fieldset" value="ends_with"></option>').prop('selected', field_operator == "ends_with").text(RailsAdmin.I18n.t("ends_with")))
|
114
|
+
.append('<option disabled="disabled">---------</option>')
|
115
|
+
.append($('<option value="_present"></option>').prop('selected', field_operator == "_present").text(RailsAdmin.I18n.t("is_present")))
|
116
|
+
.append($('<option value="_blank"></option>').prop('selected', field_operator == "_blank").text(RailsAdmin.I18n.t("is_blank")));
|
117
|
+
additional_control = $('<input class="additional-fieldset input-sm form-control" type="text" />')
|
118
|
+
.css('display', field_operator == "_present" || field_operator == "_blank" ? 'none' : 'inline-block')
|
119
|
+
.prop('name', value_name)
|
120
|
+
.prop('value', field_value);
|
81
121
|
break;
|
82
122
|
case 'integer':
|
83
123
|
case 'decimal':
|
84
124
|
case 'float':
|
85
|
-
control = '<select class="switch-additionnal-fieldsets input-sm form-control"
|
86
|
-
|
87
|
-
'<option
|
88
|
-
'<option
|
89
|
-
'<option
|
90
|
-
'<option
|
91
|
-
|
125
|
+
control = $('<select class="switch-additionnal-fieldsets input-sm form-control"></select>')
|
126
|
+
.prop('name', operator_name)
|
127
|
+
.append($('<option data-additional-fieldset="default" value="default"></option>').prop('selected', field_operator == "default").text(RailsAdmin.I18n.t("number")))
|
128
|
+
.append($('<option data-additional-fieldset="between" value="between"></option>').prop('selected', field_operator == "between").text(RailsAdmin.I18n.t("between_and_")))
|
129
|
+
.append('<option disabled="disabled">---------</option>')
|
130
|
+
.append($('<option value="_not_null"></option>').prop('selected', field_operator == "_not_null").text(RailsAdmin.I18n.t("is_present")))
|
131
|
+
.append($('<option value="_null"></option>').prop('selected', field_operator == "_null").text(RailsAdmin.I18n.t("is_blank")));
|
92
132
|
additional_control =
|
93
|
-
|
94
|
-
|
95
|
-
|
133
|
+
$('<input class="additional-fieldset default input-sm form-control" type="text" />')
|
134
|
+
.css('display', (!field_operator || field_operator == "default") ? 'inline-block' : 'none')
|
135
|
+
.prop('type', field_type)
|
136
|
+
.prop('name', value_name + '[]')
|
137
|
+
.prop('value', field_value[0] || '')
|
138
|
+
.add(
|
139
|
+
$('<input placeholder="-∞" class="additional-fieldset between input-sm form-control" />')
|
140
|
+
.css('display', (field_operator == "between") ? 'inline-block' : 'none')
|
141
|
+
.prop('type', field_type)
|
142
|
+
.prop('name', value_name + '[]')
|
143
|
+
.prop('value', field_value[1] || '')
|
144
|
+
)
|
145
|
+
.add(
|
146
|
+
$('<input placeholder="∞" class="additional-fieldset between input-sm form-control" />')
|
147
|
+
.css('display', (field_operator == "between") ? 'inline-block' : 'none')
|
148
|
+
.prop('type', field_type)
|
149
|
+
.prop('name', value_name + '[]')
|
150
|
+
.prop('value', field_value[2] || '')
|
151
|
+
);
|
96
152
|
break;
|
97
153
|
default:
|
98
|
-
control = '<input type="text" class="input-sm form-control"
|
154
|
+
control = $('<input type="text" class="input-sm form-control" />')
|
155
|
+
.prop('name', value_name)
|
156
|
+
.prop('value', field_value);
|
99
157
|
break;
|
100
158
|
}
|
101
159
|
|
102
160
|
var $content = $('<p>')
|
103
161
|
.addClass('filter form-search')
|
104
|
-
.append(
|
105
|
-
|
162
|
+
.append(
|
163
|
+
$('<span class="label label-info form-label"></span>')
|
164
|
+
.append($('<a href="#delete" class="delete"></a>').append('<i class="fa fa-trash-o fa-fw icon-white"></i>').append(document.createTextNode(field_label)))
|
165
|
+
)
|
166
|
+
.append(' ')
|
167
|
+
.append(control)
|
168
|
+
.append(' ')
|
169
|
+
.append(additional_control);
|
106
170
|
|
107
171
|
$('#filters_box').append($content);
|
108
172
|
|
@@ -186,12 +186,13 @@
|
|
186
186
|
}
|
187
187
|
if (filtered.length > 0) {
|
188
188
|
widget.collection[0].innerHTML = '';
|
189
|
-
var filteredContainer = [];
|
190
189
|
for (i = 0; i < filtered.length; i++) {
|
191
|
-
var newOptions = '<option
|
192
|
-
|
190
|
+
var newOptions = $('<option></option>')
|
191
|
+
.prop('value', matches[filtered[i]].id)
|
192
|
+
.prop('title', matches[filtered[i]].label)
|
193
|
+
.text(matches[filtered[i]].label);
|
194
|
+
$(widget.collection[0]).append(newOptions);
|
193
195
|
}
|
194
|
-
widget.collection[0].innerHTML = filteredContainer.join("");
|
195
196
|
} else {
|
196
197
|
widget.collection[0].innerHTML = widget.noObjectsPlaceholder;
|
197
198
|
}
|
@@ -212,12 +213,11 @@
|
|
212
213
|
var widget = this;
|
213
214
|
|
214
215
|
this.element.find("option").each(function(i, option) {
|
216
|
+
widget._cache['o_' + option.value] = {id: option.value, value: $(option).text()};
|
215
217
|
if (option.selected) {
|
216
|
-
widget.
|
217
|
-
$(option).clone().appendTo(widget.selection).attr("selected", false).attr("title", $(option).text());
|
218
|
+
$(option).clone().appendTo(widget.selection).prop("selected", false).prop("title", $(option).text());
|
218
219
|
} else {
|
219
|
-
widget.
|
220
|
-
$(option).clone().appendTo(widget.collection).attr("selected", false).attr("title", $(option).text());
|
220
|
+
$(option).clone().appendTo(widget.collection).prop("selected", false).prop("title", $(option).text());
|
221
221
|
}
|
222
222
|
});
|
223
223
|
},
|
@@ -227,7 +227,7 @@
|
|
227
227
|
options.each(function(i, option) {
|
228
228
|
widget.element.find('option[value="' + option.value + '"]').removeAttr("selected");
|
229
229
|
});
|
230
|
-
$(options).appendTo(this.collection).
|
230
|
+
$(options).appendTo(this.collection).prop('selected', false);
|
231
231
|
},
|
232
232
|
|
233
233
|
_query: function(query, success) {
|
@@ -282,12 +282,12 @@
|
|
282
282
|
options.each(function(i, option) {
|
283
283
|
var el = widget.element.find('option[value="' + option.value + '"]');
|
284
284
|
if (el.length) {
|
285
|
-
el.
|
285
|
+
el.prop("selected", true);
|
286
286
|
} else {
|
287
|
-
widget.element.append($('<option></option>').
|
287
|
+
widget.element.append($('<option></option>').prop('value', option.value).prop('selected', true));
|
288
288
|
}
|
289
289
|
});
|
290
|
-
$(options).appendTo(this.selection).
|
290
|
+
$(options).appendTo(this.selection).prop('selected', false);
|
291
291
|
},
|
292
292
|
|
293
293
|
_move: function(direction, options) {
|
@@ -189,6 +189,11 @@
|
|
189
189
|
input.attr('placeholder', this.element.attr('placeholder'));
|
190
190
|
}
|
191
191
|
|
192
|
+
if (this.element.attr('required')) {
|
193
|
+
input.attr('required', this.element.attr('required'));
|
194
|
+
this.element.attr('required', false);
|
195
|
+
}
|
196
|
+
|
192
197
|
return input;
|
193
198
|
},
|
194
199
|
|
@@ -2,6 +2,8 @@
|
|
2
2
|
@RailsAdmin.I18n = class Locale
|
3
3
|
@init: (@locale, @translations)->
|
4
4
|
moment.locale(@locale)
|
5
|
+
if typeof(@translations) == "string"
|
6
|
+
@translations = JSON.parse(@translations)
|
5
7
|
|
6
8
|
@t:(key) ->
|
7
9
|
humanize = key.charAt(0).toUpperCase() + key.replace(/_/g, " ").slice(1)
|
@@ -171,6 +171,31 @@ $(document).on 'rails_admin.dom_ready', (e, content) ->
|
|
171
171
|
html = html.add(option)
|
172
172
|
object_select.html(html)
|
173
173
|
|
174
|
+
|
175
|
+
# simplemde
|
176
|
+
|
177
|
+
goSimpleMDEs = ->
|
178
|
+
content.find('[data-richtext=simplemde]').not('.simplemded').each (index, domEle) ->
|
179
|
+
options = $(this).data('options')
|
180
|
+
instance_config = options.instance_config
|
181
|
+
new window.SimpleMDE($.extend(true, {
|
182
|
+
element: document.getElementById(this.id),
|
183
|
+
autosave: {
|
184
|
+
uniqueId: this.id
|
185
|
+
}
|
186
|
+
}, instance_config))
|
187
|
+
$(this).addClass('simplemded')
|
188
|
+
|
189
|
+
$editors = content.find('[data-richtext=simplemde]').not('.simplemded')
|
190
|
+
if $editors.length
|
191
|
+
if not window.SimpleMDE
|
192
|
+
options = $editors.first().data('options')
|
193
|
+
$('head').append('<link href="' + options['css_location'] + '" rel="stylesheet" media="all" type="text\/css">')
|
194
|
+
$.getScript options['js_location'], (script, textStatus, jqXHR) ->
|
195
|
+
goSimpleMDEs()
|
196
|
+
else
|
197
|
+
goSimpleMDEs()
|
198
|
+
|
174
199
|
# ckeditor
|
175
200
|
|
176
201
|
goCkeditors = ->
|
@@ -11,7 +11,7 @@ module RailsAdmin
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class ApplicationController < Config.parent_controller.constantize
|
14
|
-
protect_from_forgery
|
14
|
+
protect_from_forgery(Config.forgery_protection_settings)
|
15
15
|
|
16
16
|
before_action :_authenticate!
|
17
17
|
before_action :_authorize!
|
@@ -0,0 +1,8 @@
|
|
1
|
+
:ruby
|
2
|
+
js_data = {
|
3
|
+
js_location: field.js_location,
|
4
|
+
css_location: field.css_location,
|
5
|
+
instance_config: field.instance_config
|
6
|
+
}
|
7
|
+
|
8
|
+
= form.text_area field.method_name, field.html_attributes.reverse_merge(data: { richtext: 'simplemde', options: js_data.to_json }).reverse_merge({ value: field.form_value })
|
@@ -10,7 +10,7 @@
|
|
10
10
|
.input-group
|
11
11
|
%input.form-control.input-small{name: "query", type: "search", value: query, placeholder: "#{t("admin.misc.filter")}", class: 'input-small'}
|
12
12
|
%span.input-group-btn
|
13
|
-
%button.btn.btn-primary{type:
|
13
|
+
%button.btn.btn-primary{type: 'submit', :'data-disable-with' => '<i class="icon-white icon-refresh"></i> '.html_safe + t('admin.misc.refresh')}
|
14
14
|
%i.icon-white.icon-refresh
|
15
15
|
= t("admin.misc.refresh")
|
16
16
|
%table#history.table.table-striped.table-condensed
|
@@ -10,6 +10,7 @@
|
|
10
10
|
export_action = nil unless export_action && authorized?(export_action.authorization_key, @abstract_model)
|
11
11
|
description = RailsAdmin.config(@abstract_model.model_name).description
|
12
12
|
properties = @model_config.list.with(controller: self.controller, view: self, object: @abstract_model.model.new).visible_fields
|
13
|
+
checkboxes = @model_config.list.checkboxes?
|
13
14
|
# columns paginate
|
14
15
|
sets = get_column_sets(properties)
|
15
16
|
properties = sets[params[:set].to_i] || []
|
@@ -17,7 +18,8 @@
|
|
17
18
|
other_right = sets[params[:set].to_i + 1].present?
|
18
19
|
|
19
20
|
- content_for :contextual_tabs do
|
20
|
-
|
21
|
+
- if checkboxes
|
22
|
+
= bulk_menu
|
21
23
|
- if filterable_fields.present?
|
22
24
|
%li.dropdown{style: 'float:right'}
|
23
25
|
%a.dropdown-toggle{href: '#', :'data-toggle' => "dropdown"}
|
@@ -75,8 +77,9 @@
|
|
75
77
|
%table.table.table-condensed.table-striped
|
76
78
|
%thead
|
77
79
|
%tr
|
78
|
-
|
79
|
-
%
|
80
|
+
- if checkboxes
|
81
|
+
%th.shrink
|
82
|
+
%input.toggle{type: "checkbox"}
|
80
83
|
- if other_left
|
81
84
|
%th.other.left.shrink= "..."
|
82
85
|
- properties.each do |property|
|
@@ -91,8 +94,8 @@
|
|
91
94
|
%tbody
|
92
95
|
- @objects.each do |object|
|
93
96
|
%tr{class: "#{@abstract_model.param_key}_row #{@model_config.list.with(object: object).row_css_class}"}
|
94
|
-
|
95
|
-
= check_box_tag "bulk_ids[]", object.id, false
|
97
|
+
- if checkboxes
|
98
|
+
%td= check_box_tag "bulk_ids[]", object.id, false
|
96
99
|
- if @other_left_link ||= other_left && index_path(params.except('set').merge(params[:set].to_i != 1 ? {set: (params[:set].to_i - 1)} : {}))
|
97
100
|
%td.other.left= link_to "...", @other_left_link, class: 'pjax'
|
98
101
|
- properties.map{ |property| property.bind(:object, object) }.each do |property|
|
@@ -103,7 +106,11 @@
|
|
103
106
|
%td.last.links
|
104
107
|
%ul.inline.list-inline= menu_for :member, @abstract_model, object, true
|
105
108
|
|
106
|
-
- if @
|
109
|
+
- if @model_config.list.limited_pagination
|
110
|
+
.row
|
111
|
+
.col-md-6= paginate(@objects, theme: 'ra-twitter-bootstrap/without_count', total_pages: Float::INFINITY, remote: true)
|
112
|
+
|
113
|
+
- elsif @objects.respond_to?(:total_count)
|
107
114
|
- total_count = @objects.total_count.to_i
|
108
115
|
.row
|
109
116
|
.col-md-6= paginate(@objects, theme: 'ra-twitter-bootstrap', remote: true)
|
@@ -101,12 +101,6 @@ module RailsAdmin
|
|
101
101
|
|
102
102
|
def add(field, value, operator)
|
103
103
|
field.searchable_columns.flatten.each do |column_infos|
|
104
|
-
value =
|
105
|
-
if value.is_a?(Array)
|
106
|
-
value.map { |v| field.parse_value(v) }
|
107
|
-
else
|
108
|
-
field.parse_value(value)
|
109
|
-
end
|
110
104
|
statement, value1, value2 = StatementBuilder.new(column_infos[:column], column_infos[:type], value, operator).to_statement
|
111
105
|
@statements << statement if statement.present?
|
112
106
|
@values << value1 unless value1.nil?
|
@@ -126,7 +120,8 @@ module RailsAdmin
|
|
126
120
|
def query_scope(scope, query, fields = config.list.fields.select(&:queryable?))
|
127
121
|
wb = WhereBuilder.new(scope)
|
128
122
|
fields.each do |field|
|
129
|
-
|
123
|
+
value = parse_field_value(field, query)
|
124
|
+
wb.add(field, value, field.search_operator)
|
130
125
|
end
|
131
126
|
# OR all query statements
|
132
127
|
wb.build
|
data/lib/rails_admin/config.rb
CHANGED
@@ -62,6 +62,10 @@ module RailsAdmin
|
|
62
62
|
# set parent controller
|
63
63
|
attr_accessor :parent_controller
|
64
64
|
|
65
|
+
# set settings for `protect_from_forgery` method
|
66
|
+
# By default, it raises exception upon invalid CSRF tokens
|
67
|
+
attr_accessor :forgery_protection_settings
|
68
|
+
|
65
69
|
# Stores model configuration objects in a hash identified by model's class
|
66
70
|
# name.
|
67
71
|
#
|
@@ -288,6 +292,7 @@ module RailsAdmin
|
|
288
292
|
@navigation_static_links = {}
|
289
293
|
@navigation_static_label = nil
|
290
294
|
@parent_controller = '::ActionController::Base'
|
295
|
+
@forgery_protection_settings = {with: :exception}
|
291
296
|
RailsAdmin::Config::Actions.reset
|
292
297
|
end
|
293
298
|
|
@@ -12,9 +12,13 @@ module RailsAdmin
|
|
12
12
|
nil
|
13
13
|
end
|
14
14
|
|
15
|
+
register_instance_option :auditing_versions_limit do
|
16
|
+
100
|
17
|
+
end
|
18
|
+
|
15
19
|
register_instance_option :controller do
|
16
20
|
proc do
|
17
|
-
@history = @auditing_adapter && @auditing_adapter.latest || []
|
21
|
+
@history = @auditing_adapter && @auditing_adapter.latest(@action.auditing_versions_limit) || []
|
18
22
|
if @action.statistics?
|
19
23
|
@abstract_models = RailsAdmin::Config.visible_models(controller: self).collect(&:abstract_model)
|
20
24
|
|
@@ -30,14 +30,20 @@ module RailsAdmin
|
|
30
30
|
def parse_value(value)
|
31
31
|
return unless value.present?
|
32
32
|
if ::Rails.version >= '5'
|
33
|
-
abstract_model.model.attribute_types[name.to_s].
|
33
|
+
abstract_model.model.attribute_types[name.to_s].serialize(value)
|
34
34
|
else
|
35
|
-
|
35
|
+
# Depending on the colum type and AR version, we might get a
|
36
|
+
# string or an integer, so we need to handle both cases.
|
37
|
+
enum.fetch(value) do
|
38
|
+
type_cast_value(value)
|
39
|
+
end
|
36
40
|
end
|
37
41
|
end
|
38
42
|
|
39
43
|
def parse_input(params)
|
40
|
-
|
44
|
+
value = params[name]
|
45
|
+
return unless value
|
46
|
+
params[name] = parse_input_value(value)
|
41
47
|
end
|
42
48
|
|
43
49
|
def form_value
|
@@ -46,6 +52,14 @@ module RailsAdmin
|
|
46
52
|
|
47
53
|
private
|
48
54
|
|
55
|
+
def parse_input_value(value)
|
56
|
+
if ::Rails.version >= '5'
|
57
|
+
abstract_model.model.attribute_types[name.to_s].deserialize(value)
|
58
|
+
else
|
59
|
+
enum.invert[type_cast_value(value)]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
49
63
|
def type_cast_value(value)
|
50
64
|
if ::Rails.version >= '4.2'
|
51
65
|
abstract_model.model.column_types[name.to_s].type_cast_from_user(value)
|
@@ -25,6 +25,7 @@ require 'rails_admin/config/fields/types/serialized'
|
|
25
25
|
require 'rails_admin/config/fields/types/time'
|
26
26
|
require 'rails_admin/config/fields/types/timestamp'
|
27
27
|
require 'rails_admin/config/fields/types/color'
|
28
|
+
require 'rails_admin/config/fields/types/simple_mde'
|
28
29
|
require 'rails_admin/config/fields/types/ck_editor'
|
29
30
|
require 'rails_admin/config/fields/types/code_mirror'
|
30
31
|
require 'rails_admin/config/fields/types/wysihtml5'
|
@@ -10,7 +10,11 @@ module RailsAdmin
|
|
10
10
|
RailsAdmin::Config::Fields::Types.register(:jsonb, self)
|
11
11
|
|
12
12
|
register_instance_option :formatted_value do
|
13
|
-
value
|
13
|
+
value ? JSON.pretty_generate(value) : nil
|
14
|
+
end
|
15
|
+
|
16
|
+
register_instance_option :pretty_value do
|
17
|
+
bindings[:view].content_tag(:pre) { formatted_value }.html_safe
|
14
18
|
end
|
15
19
|
|
16
20
|
def parse_value(value)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rails_admin/config/fields/base'
|
2
|
+
|
3
|
+
module RailsAdmin
|
4
|
+
module Config
|
5
|
+
module Fields
|
6
|
+
module Types
|
7
|
+
class SimpleMDE < RailsAdmin::Config::Fields::Types::Text
|
8
|
+
# Register field type for the type loader
|
9
|
+
RailsAdmin::Config::Fields::Types.register(self)
|
10
|
+
|
11
|
+
# If you want to have a different SimpleMDE config for each instance
|
12
|
+
# you can override this option with these values: https://github.com/sparksuite/simplemde-markdown-editor#configuration
|
13
|
+
register_instance_option :instance_config do
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
# Use this if you want to point to a cloud instance of the base SimpleMDE
|
18
|
+
register_instance_option :js_location do
|
19
|
+
"#{Rails.application.config.assets.prefix}/simplemde.min.js"
|
20
|
+
end
|
21
|
+
|
22
|
+
register_instance_option :css_location do
|
23
|
+
"#{Rails.application.config.assets.prefix}/simplemde.min.css"
|
24
|
+
end
|
25
|
+
|
26
|
+
register_instance_option :partial do
|
27
|
+
:form_simple_mde
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -5,6 +5,10 @@ module RailsAdmin
|
|
5
5
|
module Sections
|
6
6
|
# Configuration of the list view
|
7
7
|
class List < RailsAdmin::Config::Sections::Base
|
8
|
+
register_instance_option :checkboxes? do
|
9
|
+
true
|
10
|
+
end
|
11
|
+
|
8
12
|
register_instance_option :filters do
|
9
13
|
[]
|
10
14
|
end
|
@@ -14,6 +18,12 @@ module RailsAdmin
|
|
14
18
|
RailsAdmin::Config.default_items_per_page
|
15
19
|
end
|
16
20
|
|
21
|
+
# Positive value shows only prev, next links in pagination.
|
22
|
+
# This is for avoiding count(*) query.
|
23
|
+
register_instance_option :limited_pagination do
|
24
|
+
false
|
25
|
+
end
|
26
|
+
|
17
27
|
register_instance_option :sort_by do
|
18
28
|
parent.abstract_model.primary_key
|
19
29
|
end
|
@@ -63,8 +63,10 @@ module RailsAdmin
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
-
def latest
|
67
|
-
@version_class.
|
66
|
+
def latest(count = 100)
|
67
|
+
@version_class.
|
68
|
+
order(id: :desc).includes(:item).limit(count).
|
69
|
+
collect { |version| VersionProxy.new(version, @user_class) }
|
68
70
|
end
|
69
71
|
|
70
72
|
def delete_object(_object, _model, _user)
|
data/lib/rails_admin/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_admin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erik Michaels-Ober
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date:
|
15
|
+
date: 2018-02-18 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: builder
|
@@ -421,6 +421,9 @@ files:
|
|
421
421
|
- app/views/kaminari/ra-twitter-bootstrap/_page.html.haml
|
422
422
|
- app/views/kaminari/ra-twitter-bootstrap/_paginator.html.haml
|
423
423
|
- app/views/kaminari/ra-twitter-bootstrap/_prev_page.html.haml
|
424
|
+
- app/views/kaminari/ra-twitter-bootstrap/without_count/_next_page.html.haml
|
425
|
+
- app/views/kaminari/ra-twitter-bootstrap/without_count/_paginator.html.haml
|
426
|
+
- app/views/kaminari/ra-twitter-bootstrap/without_count/_prev_page.html.haml
|
424
427
|
- app/views/layouts/rails_admin/_navigation.html.haml
|
425
428
|
- app/views/layouts/rails_admin/_secondary_navigation.html.haml
|
426
429
|
- app/views/layouts/rails_admin/_sidebar_navigation.html.haml
|
@@ -442,6 +445,7 @@ files:
|
|
442
445
|
- app/views/rails_admin/main/_form_nested_many.html.haml
|
443
446
|
- app/views/rails_admin/main/_form_nested_one.html.haml
|
444
447
|
- app/views/rails_admin/main/_form_polymorphic_association.html.haml
|
448
|
+
- app/views/rails_admin/main/_form_simple_mde.haml
|
445
449
|
- app/views/rails_admin/main/_form_text.html.haml
|
446
450
|
- app/views/rails_admin/main/_form_wysihtml5.html.haml
|
447
451
|
- app/views/rails_admin/main/_submit_buttons.html.haml
|
@@ -535,6 +539,7 @@ files:
|
|
535
539
|
- lib/rails_admin/config/fields/types/polymorphic_association.rb
|
536
540
|
- lib/rails_admin/config/fields/types/refile.rb
|
537
541
|
- lib/rails_admin/config/fields/types/serialized.rb
|
542
|
+
- lib/rails_admin/config/fields/types/simple_mde.rb
|
538
543
|
- lib/rails_admin/config/fields/types/string.rb
|
539
544
|
- lib/rails_admin/config/fields/types/text.rb
|
540
545
|
- lib/rails_admin/config/fields/types/time.rb
|