rails_admin 2.0.0.rc → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +10 -7
  3. data/README.md +7 -7
  4. data/app/assets/javascripts/rails_admin/ra.filter-box.js +38 -16
  5. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +7 -7
  6. data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.js +4 -2
  7. data/app/assets/javascripts/rails_admin/ra.widgets.js +11 -3
  8. data/app/controllers/rails_admin/application_controller.rb +2 -0
  9. data/app/helpers/rails_admin/application_helper.rb +1 -1
  10. data/app/helpers/rails_admin/form_builder.rb +8 -9
  11. data/app/helpers/rails_admin/main_helper.rb +2 -1
  12. data/app/views/rails_admin/main/_form_enumeration.html.haml +4 -3
  13. data/app/views/rails_admin/main/_form_filtering_multiselect.html.haml +7 -6
  14. data/app/views/rails_admin/main/index.html.haml +2 -2
  15. data/app/views/rails_admin/main/show.html.haml +1 -1
  16. data/config/locales/rails_admin.en.yml +2 -1
  17. data/lib/rails_admin/abstract_model.rb +2 -2
  18. data/lib/rails_admin/adapters/active_record.rb +9 -3
  19. data/lib/rails_admin/adapters/active_record/abstract_object.rb +9 -3
  20. data/lib/rails_admin/adapters/mongoid/association.rb +1 -1
  21. data/lib/rails_admin/bootstrap-sass.rb +2 -0
  22. data/lib/rails_admin/config.rb +1 -5
  23. data/lib/rails_admin/config/actions/index.rb +1 -1
  24. data/lib/rails_admin/config/configurable.rb +1 -1
  25. data/lib/rails_admin/config/fields/base.rb +5 -1
  26. data/lib/rails_admin/config/fields/types/active_storage.rb +5 -1
  27. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +4 -0
  28. data/lib/rails_admin/config/fields/types/file_upload.rb +5 -1
  29. data/lib/rails_admin/config/fields/types/multiple_active_storage.rb +5 -1
  30. data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +2 -1
  31. data/lib/rails_admin/config/fields/types/shrine.rb +13 -11
  32. data/lib/rails_admin/config/has_groups.rb +1 -1
  33. data/lib/rails_admin/config/lazy_model.rb +4 -4
  34. data/lib/rails_admin/config/model.rb +2 -2
  35. data/lib/rails_admin/config/proxyable/proxy.rb +4 -4
  36. data/lib/rails_admin/extension.rb +16 -4
  37. data/lib/rails_admin/extensions/controller_extension.rb +6 -0
  38. data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +8 -6
  39. data/lib/rails_admin/extensions/pundit/authorization_adapter.rb +1 -3
  40. data/lib/rails_admin/support/csv_converter.rb +1 -1
  41. data/lib/rails_admin/version.rb +3 -3
  42. data/lib/tasks/rails_admin.rake +16 -7
  43. data/vendor/assets/javascripts/rails_admin/moment-with-locales.js +9451 -3263
  44. data/vendor/assets/stylesheets/rails_admin/{font-awesome.css.erb → font-awesome.scss} +3 -3
  45. metadata +7 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b0f4ab7caf68837692964e8e69e90d167282dafa55a35aaaa3d76eb93f97b9d
4
- data.tar.gz: 9a6407f79b492dffafd49568675b7982122c76e080519c0f6b3156abbeb3e71a
3
+ metadata.gz: e91bcbfc9a80b1718903e12a7a806f295115aab1917a5613632a9ee50a9b7973
4
+ data.tar.gz: 278d75adfbb87dbfc1751f9c510eba68a13809873fce08dc6ed6e53355f0b9c8
5
5
  SHA512:
6
- metadata.gz: 127e444d5dee93ccb6cd28c210368bc143d06732f5683917b0b969eac3717a3a606d5415891d5e768385cc3fd445ce2d754c39f97daec21b50ee49595a5ecde2
7
- data.tar.gz: 14ff533ab2205b78c5d3529bd0b16166af4b2ad54547c6c67d20ffde399ed17defe559dc53c7e34a3c3457ef16bf4de8b4122211c6ea663090946ca84e687380
6
+ metadata.gz: 7a8fefb5416435b1e0a7622f6c6fc547b356b8d9e33fc30ea715030a33f4957952a587830a68565c574e50c1b3f6c98327a039accf75389a6d053a03c884be84
7
+ data.tar.gz: 85258795ff168eff5d247eb77cec0a8fd1b630e830eb17b8144914592e3d3fd50808c924248cca101c13a8a21683e75eb5a6407b768d3580bd04daef412b339f
data/Gemfile CHANGED
@@ -8,7 +8,7 @@ gem 'devise'
8
8
  group :active_record do
9
9
  gem 'paper_trail'
10
10
 
11
- platforms :ruby, :mswin, :mingw do
11
+ platforms :ruby, :mswin, :mingw, :x64_mingw do
12
12
  gem 'mysql2', '>= 0.3.14'
13
13
  gem 'sqlite3', '>= 1.3'
14
14
  end
@@ -19,29 +19,32 @@ group :development, :test do
19
19
  end
20
20
 
21
21
  group :test do
22
+ gem 'cancancan', '~> 3.0'
22
23
  gem 'carrierwave', ['>= 2.0.0.rc', '< 3']
23
- gem 'coveralls'
24
- gem 'database_cleaner', ['>= 1.2', '!= 1.4.0', '!= 1.5.0']
24
+ gem 'database_cleaner', ['>= 1.2', '!= 1.4.0', '!= 1.5.0', '< 2.0']
25
25
  gem 'dragonfly', '~> 1.0'
26
26
  gem 'factory_bot', '>= 4.2'
27
27
  gem 'generator_spec', '>= 0.8'
28
28
  gem 'launchy', '>= 2.2'
29
29
  gem 'mini_magick', '>= 3.4'
30
- gem 'paperclip', ['>= 3.4', '!= 4.3.0']
31
30
  gem 'poltergeist', '~> 1.5'
32
31
  gem 'pundit'
33
32
  gem 'rack-cache', require: 'rack/cache'
34
33
  gem 'rspec-rails', '>= 2.14'
35
34
  gem 'rspec-expectations', '!= 3.8.3'
36
- gem 'rubocop', '~> 0.41.2'
35
+ gem 'rspec-retry'
36
+ gem 'rubocop', '~> 0.68.1', require: false
37
+ gem 'rubocop-performance', require: false
37
38
  gem 'simplecov', '>= 0.9', require: false
38
- gem 'shrine', '~> 2.0'
39
- gem 'shrine-memory'
39
+ gem 'simplecov-lcov', require: false
40
40
  gem 'timecop', '>= 0.5'
41
41
 
42
42
  platforms :ruby_19 do
43
43
  gem 'tins', '~> 1.6.0', require: false
44
44
  end
45
+
46
+ # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
47
+ gem 'tzinfo-data', platforms: %i(mingw mswin x64_mingw jruby)
45
48
  end
46
49
 
47
50
  gemspec
data/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # RailsAdmin
2
2
 
3
3
  [![Gem Version](https://img.shields.io/gem/v/rails_admin.svg)][gem]
4
- [![Build Status](https://img.shields.io/travis/sferik/rails_admin.svg)][travis]
4
+ [![Build Status](https://img.shields.io/github/workflow/status/sferik/rails_admin/Test)][ghactions]
5
5
  [![Coverage Status](https://img.shields.io/coveralls/sferik/rails_admin.svg)][coveralls]
6
6
  [![Inline docs](http://inch-ci.org/github/sferik/rails_admin.svg)][inch]
7
7
  [![Code Climate](https://codeclimate.com/github/sferik/rails_admin.svg)][codeclimate]
8
8
  [![SemVer](https://api.dependabot.com/badges/compatibility_score?dependency-name=rails_admin&package-manager=bundler&version-scheme=semver)][semver]
9
9
 
10
10
  [gem]: https://rubygems.org/gems/rails_admin
11
- [travis]: https://travis-ci.org/sferik/rails_admin
11
+ [ghactions]: https://github.com/sferik/rails_admin/actions
12
12
  [coveralls]: https://coveralls.io/r/sferik/rails_admin
13
13
  [inch]: http://inch-ci.org/github/sferik/rails_admin
14
14
  [codeclimate]: https://codeclimate.com/github/sferik/rails_admin
@@ -20,9 +20,7 @@ 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 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
- >
25
- > Also, 1.0.0 and 1.1.0 is known to have [CSRF vulnerability](https://github.com/sferik/rails_admin/commit/b13e879eb93b661204e9fb5e55f7afa4f397537a), too.
23
+ **RailsAdmin 2.0.1, 2.0.0 and up to 1.4.2 have been reported to have XSS vulnerability.** We strongly recommend that you upgrade RailsAdmin to 2.0.2 (and higher) or 1.4.3 as soon as possible, if you are on those versions. See [d72090ec](https://github.com/sferik/rails_admin/commit/d72090ec6a07c3b9b7b48ab50f3d405f91ff4375) for the detail.
26
24
 
27
25
  ## Getting started
28
26
 
@@ -50,7 +48,7 @@ RailsAdmin is a Rails engine that provides an easy-to-use interface for managing
50
48
 
51
49
  ## Installation
52
50
 
53
- 1. On your gemfile: `gem 'rails_admin', '~> 2.0.0.rc'`
51
+ 1. On your gemfile: `gem 'rails_admin', '~> 2.0'`
54
52
  2. Run `bundle install`
55
53
  3. Run `rails g rails_admin:install`
56
54
  4. Provide a namespace for the routes when asked
@@ -94,13 +92,15 @@ list][list].
94
92
  If you think you found a bug in RailsAdmin, you can [submit an issue](https://github.com/sferik/rails_admin/issues/new).
95
93
 
96
94
  ## Supported Ruby Versions
97
- This library aims to support and is [tested against][travis] the following Ruby implementations:
95
+ This library aims to support and is [tested against][ghactions] the following Ruby implementations:
98
96
 
99
97
  * Ruby 2.2
100
98
  * Ruby 2.3
101
99
  * Ruby 2.4
102
100
  * Ruby 2.5
103
101
  * Ruby 2.6
102
+ * Ruby 2.7
103
+ * Ruby 3.0
104
104
  * [JRuby][]
105
105
 
106
106
  [jruby]: http://jruby.org/
@@ -11,6 +11,7 @@
11
11
  var field_value = options['value'];
12
12
  var field_operator = options['operator'];
13
13
  var select_options = options['select_options'];
14
+ var required = options['required'];
14
15
  var index = options['index'];
15
16
  var value_name = 'f[' + field_name + '][' + index + '][v]';
16
17
  var operator_name = 'f[' + field_name + '][' + index + '][o]';
@@ -24,9 +25,13 @@
24
25
  .append('<option value="_discard">...</option>')
25
26
  .append($('<option value="true"></option>').prop('selected', field_value == "true").text(RailsAdmin.I18n.t("true")))
26
27
  .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")));
28
+ if (!required) {
29
+ control.append([
30
+ '<option disabled="disabled">---------</option>',
31
+ $('<option value="_present"></option>').prop('selected', field_value == "_present").text(RailsAdmin.I18n.t("is_present")),
32
+ $('<option value="_blank"></option>').prop('selected', field_value == "_blank").text(RailsAdmin.I18n.t("is_blank"))
33
+ ])
34
+ }
30
35
  break;
31
36
  case 'date':
32
37
  additional_control =
@@ -56,9 +61,13 @@
56
61
  .append($('<option value="yesterday"></option>').prop('selected', field_operator == "yesterday").text(RailsAdmin.I18n.t("yesterday")))
57
62
  .append($('<option value="this_week"></option>').prop('selected', field_operator == "this_week").text(RailsAdmin.I18n.t("this_week")))
58
63
  .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")));
64
+ if (!required) {
65
+ control.append([
66
+ '<option disabled="disabled">---------</option>',
67
+ $('<option value="_not_null"></option>').prop('selected', field_operator == "_not_null").text(RailsAdmin.I18n.t("is_present")),
68
+ $('<option value="_null"></option>').prop('selected', field_operator == "_null").text(RailsAdmin.I18n.t("is_blank"))
69
+ ])
70
+ }
62
71
  additional_control = additional_control ||
63
72
  $('<input size="25" class="datetime additional-fieldset default input-sm form-control" type="text" />')
64
73
  .css('display', (!field_operator || field_operator == "default") ? 'inline-block' : 'none')
@@ -84,10 +93,14 @@
84
93
  .prop('name', multiple_values ? undefined : value_name)
85
94
  .data('name', value_name)
86
95
  .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)
96
+ if (!required) {
97
+ control.append([
98
+ $('<option value="_present"></option>').prop('selected', field_value == "_present").text(RailsAdmin.I18n.t("is_present")),
99
+ $('<option value="_blank"></option>').prop('selected', field_value == "_blank").text(RailsAdmin.I18n.t("is_blank")),
100
+ '<option disabled="disabled">---------</option>'
101
+ ])
102
+ }
103
+ control.append(select_options)
91
104
  .add(
92
105
  $('<select multiple="multiple" class="select-multiple input-sm form-control"></select>')
93
106
  .css('display', multiple_values ? 'inline-block' : 'none')
@@ -111,9 +124,13 @@
111
124
  .append($('<option data-additional-fieldset="additional-fieldset" value="is"></option>').prop('selected', field_operator == "is").text(RailsAdmin.I18n.t("is_exactly")))
112
125
  .append($('<option data-additional-fieldset="additional-fieldset" value="starts_with"></option>').prop('selected', field_operator == "starts_with").text(RailsAdmin.I18n.t("starts_with")))
113
126
  .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")));
127
+ if (!required) {
128
+ control.append([
129
+ '<option disabled="disabled">---------</option>',
130
+ $('<option value="_present"></option>').prop('selected', field_operator == "_present").text(RailsAdmin.I18n.t("is_present")),
131
+ $('<option value="_blank"></option>').prop('selected', field_operator == "_blank").text(RailsAdmin.I18n.t("is_blank"))
132
+ ])
133
+ }
117
134
  additional_control = $('<input class="additional-fieldset input-sm form-control" type="text" />')
118
135
  .css('display', field_operator == "_present" || field_operator == "_blank" ? 'none' : 'inline-block')
119
136
  .prop('name', value_name)
@@ -126,9 +143,13 @@
126
143
  .prop('name', operator_name)
127
144
  .append($('<option data-additional-fieldset="default" value="default"></option>').prop('selected', field_operator == "default").text(RailsAdmin.I18n.t("number")))
128
145
  .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")));
146
+ if (!required) {
147
+ control.append([
148
+ '<option disabled="disabled">---------</option>',
149
+ $('<option value="_not_null"></option>').prop('selected', field_operator == "_not_null").text(RailsAdmin.I18n.t("is_present")),
150
+ $('<option value="_null"></option>').prop('selected', field_operator == "_null").text(RailsAdmin.I18n.t("is_blank"))
151
+ ])
152
+ }
132
153
  additional_control =
133
154
  $('<input class="additional-fieldset default input-sm form-control" type="text" />')
134
155
  .css('display', (!field_operator || field_operator == "default") ? 'inline-block' : 'none')
@@ -193,6 +214,7 @@
193
214
  value: $(this).data('field-value'),
194
215
  operator: $(this).data('field-operator'),
195
216
  select_options: $(this).data('field-options'),
217
+ required: $(this).data('field-required'),
196
218
  index: $.now().toString().slice(6,11),
197
219
  datetimepicker_format: $(this).data('field-datetimepicker-format')
198
220
  });
@@ -19,13 +19,13 @@
19
19
  sortable: false,
20
20
  removable: true,
21
21
  regional: {
22
- up: "Up",
23
- down: "Down",
24
- add: "Add",
25
- chooseAll: "Choose all",
26
- chosen: "Chosen records",
27
- clearAll: "Clear all",
28
- remove: "Remove"
22
+ add: 'Add',
23
+ chooseAll: 'Choose all',
24
+ clearAll: 'Clear all',
25
+ down: 'Down',
26
+ remove: 'Remove',
27
+ search: 'Search',
28
+ up: 'Up'
29
29
  },
30
30
  searchDelay: 400,
31
31
  remote_source: null,
@@ -11,7 +11,9 @@
11
11
  $(document).on('nested:fieldAdded', 'form', function(content) {
12
12
  var controls, field, nav, new_tab, one_to_one, parent_group, toggler;
13
13
  field = content.field.addClass('tab-pane').attr('id', 'unique-id-' + (new Date().getTime()));
14
- new_tab = $('<li><a data-toggle="tab" href="#' + field.attr('id') + '">' + field.children('.object-infos').data('object-label') + '</a></li>');
14
+ new_tab = $('<li></li>').append(
15
+ $('<a></a>').attr('data-toggle', 'tab').attr('href', '#' + field.attr('id')).text(field.children('.object-infos').data('object-label'))
16
+ )
15
17
  parent_group = field.closest('.control-group');
16
18
  controls = parent_group.children('.controls');
17
19
  one_to_one = controls.data('nestedone') !== void 0;
@@ -27,7 +29,7 @@
27
29
  content.select(':hidden').show('slow');
28
30
  toggler.addClass('active').removeClass('disabled').children('i').addClass('icon-chevron-down').removeClass('icon-chevron-right');
29
31
  if (one_to_one) {
30
- controls.find('.add_nested_fields').removeClass('add_nested_fields').html(field.children('.object-infos').data('object-label'));
32
+ controls.find('.add_nested_fields').removeClass('add_nested_fields').text(field.children('.object-infos').data('object-label'));
31
33
  }
32
34
  });
33
35
 
@@ -137,7 +137,11 @@
137
137
  toggler = field.find('> .controls > .btn-group > .toggler');
138
138
  tab_content.children('.fields:not(.tab-pane)').addClass('tab-pane').each(function() {
139
139
  $(this).attr('id', 'unique-id-' + (new Date().getTime()) + Math.floor(Math.random() * 100000));
140
- nav.append('<li><a data-toggle="tab" href="#' + this.id + '">' + $(this).children('.object-infos').data('object-label') + '</a></li>');
140
+ nav.append(
141
+ $('<li></li>').append(
142
+ $('<a></a>').attr('data-toggle', 'tab').attr('href', '#' + this.id).text($(this).children('.object-infos').data('object-label'))
143
+ )
144
+ );
141
145
  });
142
146
  if (nav.find("> li.active").length === 0) {
143
147
  nav.find("> li > a[data-toggle='tab']:first").tab('show');
@@ -165,8 +169,12 @@
165
169
  tab_content = field.find("> .tab-content");
166
170
  toggler = field.find('> .controls > .btn-group > .toggler');
167
171
  tab_content.children(".fields:not(.tab-pane)").addClass('tab-pane active').each(function() {
168
- field.find('> .controls .add_nested_fields').removeClass('add_nested_fields').html($(this).children('.object-infos').data('object-label'));
169
- nav.append('<li><a data-toggle="tab" href="#' + this.id + '">' + $(this).children('.object-infos').data('object-label') + '</a></li>');
172
+ field.find('> .controls .add_nested_fields').removeClass('add_nested_fields').text($(this).children('.object-infos').data('object-label'));
173
+ nav.append(
174
+ $('<li></li>').append(
175
+ $('<a></a>').attr('data-toggle', 'tab').attr('href', '#' + this.id).text($(this).children('.object-infos').data('object-label'))
176
+ )
177
+ );
170
178
  });
171
179
  first_tab = nav.find("> li > a[data-toggle='tab']:first");
172
180
  first_tab.tab('show');
@@ -11,6 +11,8 @@ module RailsAdmin
11
11
  end
12
12
 
13
13
  class ApplicationController < Config.parent_controller.constantize
14
+ include RailsAdmin::Extensions::ControllerExtension
15
+
14
16
  protect_from_forgery(Config.forgery_protection_settings)
15
17
 
16
18
  before_action :_authenticate!
@@ -125,7 +125,7 @@ module RailsAdmin
125
125
  def breadcrumb(action = @action, _acc = [])
126
126
  begin
127
127
  (parent_actions ||= []) << action
128
- end while action.breadcrumb_parent && (action = action(*action.breadcrumb_parent)) # rubocop:disable Loop
128
+ end while action.breadcrumb_parent && (action = action(*action.breadcrumb_parent)) # rubocop:disable Lint/Loop
129
129
 
130
130
  content_tag(:ol, class: 'breadcrumb') do
131
131
  parent_actions.collect do |a|
@@ -38,16 +38,15 @@ module RailsAdmin
38
38
  end
39
39
 
40
40
  def field_wrapper_for(field, nested_in)
41
- if field.label
42
- # do not show nested field if the target is the origin
43
- unless nested_field_association?(field, nested_in)
44
- @template.content_tag(:div, class: "form-group control-group #{field.type_css_class} #{field.css_class} #{'error' if field.errors.present?}", id: "#{dom_id(field)}_field") do
45
- label(field.method_name, capitalize_first_letter(field.label), class: 'col-sm-2 control-label') +
46
- (field.nested_form ? field_for(field) : input_for(field))
47
- end
41
+ # do not show nested field if the target is the origin
42
+ return if nested_field_association?(field, nested_in)
43
+ @template.content_tag(:div, class: "form-group control-group #{field.type_css_class} #{field.css_class} #{'error' if field.errors.present?}", id: "#{dom_id(field)}_field") do
44
+ if field.label
45
+ label(field.method_name, capitalize_first_letter(field.label), class: 'col-sm-2 control-label') +
46
+ (field.nested_form ? field_for(field) : input_for(field))
47
+ else
48
+ field.nested_form ? field_for(field) : input_for(field)
48
49
  end
49
- else
50
- field.nested_form ? field_for(field) : input_for(field)
51
50
  end
52
51
  end
53
52
 
@@ -76,7 +76,8 @@ module RailsAdmin
76
76
  options[:type] = field.type
77
77
  options[:value] = filter_hash['v']
78
78
  options[:label] = field.label
79
- options[:operator] = filter_hash['o']
79
+ options[:operator] = filter_hash['o'] || field.default_filter_operator
80
+ options[:required] = field.required
80
81
  options
81
82
  end if ordered_filters
82
83
  end
@@ -7,12 +7,13 @@
7
7
  sortable: false,
8
8
  cacheAll: true,
9
9
  regional: {
10
+ add: t("admin.misc.add_new"),
10
11
  chooseAll: t("admin.misc.chose_all"),
11
- chosen: t("admin.misc.chosen", name: config.label_plural),
12
12
  clearAll: t("admin.misc.clear_all"),
13
+ down: t("admin.misc.down"),
14
+ remove: t("admin.misc.remove"),
13
15
  search: t("admin.misc.search"),
14
- up: t("admin.misc.up"),
15
- down: t("admin.misc.down")
16
+ up: t("admin.misc.up")
16
17
  }
17
18
  }
18
19
  = form.select field.method_name, field.enum, { selected: field.form_value, object: form.object }, field.html_attributes.reverse_merge({data: { filteringmultiselect: true, options: js_data.to_json }, multiple: true})
@@ -29,12 +29,13 @@
29
29
  removable: !!field.removable,
30
30
  cacheAll: !!field.associated_collection_cache_all,
31
31
  regional: {
32
- chooseAll: t("admin.misc.chose_all"),
33
- chosen: t("admin.misc.chosen", name: config.label_plural),
34
- clearAll: t("admin.misc.clear_all"),
35
- search: t("admin.misc.search"),
36
- up: t("admin.misc.up"),
37
- down: t("admin.misc.down")
32
+ add: t('admin.misc.add_new'),
33
+ chooseAll: t('admin.misc.chose_all'),
34
+ clearAll: t('admin.misc.clear_all'),
35
+ down: t('admin.misc.down'),
36
+ remove: t('admin.misc.remove'),
37
+ search: t('admin.misc.search'),
38
+ up: t('admin.misc.up')
38
39
  }
39
40
  }
40
41
 
@@ -35,7 +35,7 @@
35
35
  - else
36
36
  - ''
37
37
  %li
38
- %a{href: '#', :"data-field-label" => field.label, :"data-field-name" => field.name, :"data-field-options" => field_options.html_safe, :"data-field-type" => field.type, :"data-field-value" => "", :"data-field-datetimepicker-format" => (field.try(:parser) && field.parser.to_momentjs)}= capitalize_first_letter(field.label)
38
+ %a{href: '#', :"data-field-label" => field.label, :"data-field-name" => field.name, :"data-field-operator" => field.default_filter_operator, :"data-field-options" => field_options.html_safe, :"data-field-required" => field.required.to_s, :"data-field-type" => field.type, :"data-field-value" => "", :"data-field-datetimepicker-format" => (field.try(:parser) && field.parser.to_momentjs)}= capitalize_first_letter(field.label)
39
39
 
40
40
  %style
41
41
  - properties.select{ |p| p.column_width.present? }.each do |property|
@@ -53,7 +53,7 @@
53
53
  %button.btn.btn-primary{type: 'submit', :'data-disable-with' => '<i class="icon-white icon-refresh"></i> '.html_safe + t('admin.misc.refresh')}
54
54
  %i.icon-white.icon-refresh
55
55
  = t('admin.misc.refresh')
56
- %button#remove_filter.btn.btn-info{title: "Reset filters"}
56
+ %button#remove_filter.btn.btn-info{title: t('admin.misc.reset_filters')}
57
57
  %i.icon-white.icon-remove
58
58
  - if export_action
59
59
  %span{style: 'float:right'}= link_to wording_for(:link, export_action), export_path(params.except('set').except('page')), class: 'btn btn-info'
@@ -1,6 +1,6 @@
1
1
  - @model_config.show.with(object: @object, view: self, controller: self.controller).visible_groups.each do |fieldset|
2
2
  - unless (fields = fieldset.with(object: @object, view: self, controller: self.controller).visible_fields).empty?
3
- - unless (fields = fields.reject{ |f| RailsAdmin::config.compact_show_view && f.formatted_value.nil? || f.formatted_value == '' }).empty?
3
+ - unless (fields = fields.reject{ |f| RailsAdmin::config.compact_show_view && (f.formatted_value.nil? || f.formatted_value == '') }).empty?
4
4
  .fieldset
5
5
  %h4
6
6
  = fieldset.label
@@ -29,13 +29,13 @@ en:
29
29
  misc:
30
30
  search: "Search"
31
31
  filter: "Filter"
32
+ reset_filters: "Reset filters"
32
33
  refresh: "Refresh"
33
34
  show_all: "Show all"
34
35
  add_filter: "Add filter"
35
36
  bulk_menu_title: "Selected items"
36
37
  remove: "Remove"
37
38
  add_new: "Add new"
38
- chosen: "Chosen %{name}"
39
39
  chose_all: "Choose all"
40
40
  clear_all: "Clear all"
41
41
  up: "Up"
@@ -45,6 +45,7 @@ en:
45
45
  navigation_static_label: "Links"
46
46
  log_out: "Log out"
47
47
  time_ago: "%{time} ago"
48
+ ago: "ago"
48
49
  more: "Plus %{count} more %{models_name}"
49
50
  flash:
50
51
  successful: "%{name} successfully %{action}"
@@ -178,8 +178,8 @@ module RailsAdmin
178
178
 
179
179
  def build_statement_for_datetime_or_timestamp
180
180
  start_date, end_date = get_filtering_duration
181
- start_date = start_date.to_time.try(:beginning_of_day) if start_date
182
- end_date = end_date.to_time.try(:end_of_day) if end_date
181
+ start_date = start_date.try(:beginning_of_day) if start_date
182
+ end_date = end_date.try(:end_of_day) if end_date
183
183
  range_filter(start_date, end_date)
184
184
  end
185
185
 
@@ -71,11 +71,17 @@ module RailsAdmin
71
71
  delegate :primary_key, :table_name, to: :model, prefix: false
72
72
 
73
73
  def encoding
74
- case ::ActiveRecord::Base.connection_config[:adapter]
74
+ adapter =
75
+ if ::ActiveRecord::Base.respond_to?(:connection_db_config)
76
+ ::ActiveRecord::Base.connection_db_config.configuration_hash[:adapter]
77
+ else
78
+ ::ActiveRecord::Base.connection_config[:adapter]
79
+ end
80
+ case adapter
75
81
  when 'postgresql'
76
82
  ::ActiveRecord::Base.connection.select_one("SELECT ''::text AS str;").values.first.encoding
77
83
  when 'mysql2'
78
- ::ActiveRecord::Base.connection.instance_variable_get(:@connection).encoding
84
+ ::ActiveRecord::Base.connection.raw_connection.encoding
79
85
  when 'oracle_enhanced'
80
86
  ::ActiveRecord::Base.connection.select_one("SELECT dummy FROM DUAL").values.first.encoding
81
87
  else
@@ -144,7 +150,7 @@ module RailsAdmin
144
150
  field = fields.detect { |f| f.name.to_s == field_name }
145
151
  value = parse_field_value(field, filter_dump[:v])
146
152
 
147
- wb.add(field, value, (filter_dump[:o] || 'default'))
153
+ wb.add(field, value, (filter_dump[:o] || RailsAdmin::Config.default_search_operator))
148
154
  # AND current filter statements to other filter statements
149
155
  scope = wb.build
150
156
  end