rails_admin 1.4.3 → 2.0.2

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.
Files changed (222) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +12 -4
  3. data/README.md +4 -7
  4. data/app/assets/javascripts/rails_admin/custom/ui.js +1 -0
  5. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +1 -1
  6. data/app/assets/javascripts/rails_admin/ra.filtering-select.js +9 -7
  7. data/app/assets/javascripts/rails_admin/ra.i18n.js +28 -0
  8. data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.js +59 -0
  9. data/app/assets/javascripts/rails_admin/ra.sidescroll.js +31 -0
  10. data/app/assets/javascripts/rails_admin/ra.widgets.js +379 -0
  11. data/app/assets/javascripts/rails_admin/rails_admin.js +1 -0
  12. data/app/assets/javascripts/rails_admin/ui.js +135 -0
  13. data/app/assets/stylesheets/rails_admin/ra.sidescroll.scss +29 -0
  14. data/app/assets/stylesheets/rails_admin/ra.widgets.scss +4 -0
  15. data/app/assets/stylesheets/rails_admin/rails_admin.scss.erb +2 -1
  16. data/app/controllers/rails_admin/application_controller.rb +2 -0
  17. data/app/helpers/rails_admin/application_helper.rb +19 -4
  18. data/app/helpers/rails_admin/main_helper.rb +4 -4
  19. data/app/views/layouts/rails_admin/_head.html.haml +7 -0
  20. data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +1 -1
  21. data/app/views/layouts/rails_admin/_sidebar_navigation.html.haml +2 -1
  22. data/app/views/layouts/rails_admin/application.html.haml +3 -11
  23. data/app/views/layouts/rails_admin/pjax.html.haml +1 -5
  24. data/app/views/rails_admin/main/_form_action_text.html.haml +7 -0
  25. data/app/views/rails_admin/main/_form_file_upload.html.haml +4 -4
  26. data/app/views/rails_admin/main/_form_filtering_select.html.haml +1 -1
  27. data/app/views/rails_admin/main/_form_multiple_file_upload.html.haml +7 -5
  28. data/app/views/rails_admin/main/_form_polymorphic_association.html.haml +18 -3
  29. data/app/views/rails_admin/main/dashboard.html.haml +1 -2
  30. data/app/views/rails_admin/main/export.html.haml +2 -2
  31. data/app/views/rails_admin/main/index.html.haml +19 -15
  32. data/app/views/rails_admin/main/show.html.haml +6 -7
  33. data/config/locales/rails_admin.en.yml +3 -0
  34. data/lib/generators/rails_admin/templates/initializer.erb +2 -2
  35. data/lib/rails_admin/abstract_model.rb +3 -3
  36. data/lib/rails_admin/adapters/active_record/abstract_object.rb +2 -2
  37. data/lib/rails_admin/adapters/active_record/property.rb +1 -5
  38. data/lib/rails_admin/adapters/active_record.rb +23 -10
  39. data/lib/rails_admin/adapters/mongoid/association.rb +1 -1
  40. data/lib/rails_admin/adapters/mongoid.rb +30 -13
  41. data/lib/rails_admin/bootstrap-sass/sass_functions.rb +1 -3
  42. data/lib/rails_admin/bootstrap-sass.rb +7 -3
  43. data/lib/rails_admin/config/actions/base.rb +17 -1
  44. data/lib/rails_admin/config/actions/edit.rb +1 -3
  45. data/lib/rails_admin/config/actions/index.rb +3 -3
  46. data/lib/rails_admin/config/actions/new.rb +1 -3
  47. data/lib/rails_admin/config/configurable.rb +6 -4
  48. data/lib/rails_admin/config/fields/association.rb +1 -1
  49. data/lib/rails_admin/config/fields/base.rb +2 -2
  50. data/lib/rails_admin/config/fields/factories/action_text.rb +12 -0
  51. data/lib/rails_admin/config/fields/factories/dragonfly.rb +1 -1
  52. data/lib/rails_admin/config/fields/factories/shrine.rb +27 -0
  53. data/lib/rails_admin/config/fields/types/action_text.rb +30 -0
  54. data/lib/rails_admin/config/fields/types/active_record_enum.rb +3 -19
  55. data/lib/rails_admin/config/fields/types/active_storage.rb +1 -0
  56. data/lib/rails_admin/config/fields/types/all.rb +2 -1
  57. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +4 -0
  58. data/lib/rails_admin/config/fields/types/ck_editor.rb +7 -7
  59. data/lib/rails_admin/config/fields/types/code_mirror.rb +10 -12
  60. data/lib/rails_admin/config/fields/types/color.rb +2 -2
  61. data/lib/rails_admin/config/fields/types/file_upload.rb +6 -2
  62. data/lib/rails_admin/config/fields/types/froala.rb +9 -11
  63. data/lib/rails_admin/config/fields/types/hidden.rb +2 -2
  64. data/lib/rails_admin/config/fields/types/multiple_active_storage.rb +1 -1
  65. data/lib/rails_admin/config/fields/types/multiple_carrierwave.rb +15 -3
  66. data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +17 -3
  67. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +7 -0
  68. data/lib/rails_admin/config/fields/types/shrine.rb +52 -0
  69. data/lib/rails_admin/config/fields/types/simple_mde.rb +8 -5
  70. data/lib/rails_admin/config/fields/types/string.rb +2 -2
  71. data/lib/rails_admin/config/fields/types/string_like.rb +19 -0
  72. data/lib/rails_admin/config/fields/types/text.rb +2 -20
  73. data/lib/rails_admin/config/fields/types/wysihtml5.rb +14 -10
  74. data/lib/rails_admin/config/fields.rb +2 -1
  75. data/lib/rails_admin/config/has_groups.rb +1 -1
  76. data/lib/rails_admin/config/lazy_model.rb +4 -4
  77. data/lib/rails_admin/config/model.rb +5 -4
  78. data/lib/rails_admin/config/proxyable/proxy.rb +7 -9
  79. data/lib/rails_admin/config/proxyable.rb +13 -1
  80. data/lib/rails_admin/config/sections/list.rb +23 -0
  81. data/lib/rails_admin/config.rb +9 -7
  82. data/lib/rails_admin/engine.rb +1 -2
  83. data/lib/rails_admin/extension.rb +16 -4
  84. data/lib/rails_admin/extensions/cancancan/authorization_adapter.rb +45 -21
  85. data/lib/rails_admin/extensions/controller_extension.rb +6 -0
  86. data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +27 -10
  87. data/lib/rails_admin/extensions/pundit/authorization_adapter.rb +1 -3
  88. data/lib/rails_admin/support/csv_converter.rb +1 -1
  89. data/lib/rails_admin/version.rb +3 -3
  90. data/lib/rails_admin.rb +0 -1
  91. data/vendor/assets/fonts/rails_admin/FontAwesome.otf +0 -0
  92. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.eot +0 -0
  93. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.svg +2671 -0
  94. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.ttf +0 -0
  95. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.woff +0 -0
  96. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.woff2 +0 -0
  97. data/{app → vendor}/assets/images/rails_admin/bootstrap/glyphicons-halflings-white.png +0 -0
  98. data/{app → vendor}/assets/images/rails_admin/bootstrap/glyphicons-halflings.png +0 -0
  99. data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_background.png +0 -0
  100. data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_hex.png +0 -0
  101. data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_hsb_b.png +0 -0
  102. data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_hsb_h.png +0 -0
  103. data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_hsb_s.png +0 -0
  104. data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_indic.gif +0 -0
  105. data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_overlay.png +0 -0
  106. data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_rgb_b.png +0 -0
  107. data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_rgb_g.png +0 -0
  108. data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_rgb_r.png +0 -0
  109. data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_select.gif +0 -0
  110. data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_submit.png +0 -0
  111. data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_background.png +0 -0
  112. data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_hex.png +0 -0
  113. data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_hsb_b.png +0 -0
  114. data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_hsb_h.png +0 -0
  115. data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_hsb_s.png +0 -0
  116. data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_indic.gif +0 -0
  117. data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_rgb_b.png +0 -0
  118. data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_rgb_g.png +0 -0
  119. data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_rgb_r.png +0 -0
  120. data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_submit.png +0 -0
  121. data/{app → vendor}/assets/images/rails_admin/colorpicker/select.png +0 -0
  122. data/{app → vendor}/assets/images/rails_admin/colorpicker/select2.png +0 -0
  123. data/{app → vendor}/assets/images/rails_admin/colorpicker/slider.png +0 -0
  124. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-affix.js +0 -0
  125. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-alert.js +0 -0
  126. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-button.js +0 -0
  127. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-carousel.js +0 -0
  128. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-collapse.js +0 -0
  129. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-dropdown.js +0 -0
  130. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-modal.js +0 -0
  131. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-popover.js +0 -0
  132. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-scrollspy.js +0 -0
  133. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-tab.js +0 -0
  134. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-tooltip.js +0 -0
  135. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-transition.js +0 -0
  136. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-typeahead.js +0 -0
  137. data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap.js +0 -0
  138. data/{app → vendor}/assets/javascripts/rails_admin/jquery.colorpicker.js +0 -0
  139. data/{app → vendor}/assets/javascripts/rails_admin/jquery.pjax.js +1 -3
  140. data/vendor/assets/javascripts/rails_admin/moment-with-locales.js +9451 -3263
  141. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_alerts.scss +0 -0
  142. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_badges.scss +0 -0
  143. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_breadcrumbs.scss +0 -0
  144. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_button-groups.scss +0 -0
  145. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_buttons.scss +0 -0
  146. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_carousel.scss +0 -0
  147. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_close.scss +0 -0
  148. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_code.scss +0 -0
  149. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_component-animations.scss +0 -0
  150. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_dropdowns.scss +0 -0
  151. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_forms.scss +0 -0
  152. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_glyphicons.scss +0 -0
  153. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_grid.scss +0 -0
  154. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_input-groups.scss +0 -0
  155. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_jumbotron.scss +0 -0
  156. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_labels.scss +0 -0
  157. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_list-group.scss +0 -0
  158. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_media.scss +0 -0
  159. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_mixins.scss +0 -0
  160. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_modals.scss +0 -0
  161. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_navbar.scss +0 -0
  162. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_navs.scss +0 -0
  163. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_normalize.scss +0 -0
  164. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_pager.scss +0 -0
  165. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_pagination.scss +0 -0
  166. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_panels.scss +0 -0
  167. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_popovers.scss +0 -0
  168. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_print.scss +0 -0
  169. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_progress-bars.scss +0 -0
  170. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_responsive-embed.scss +0 -0
  171. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_responsive-utilities.scss +0 -0
  172. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_scaffolding.scss +0 -0
  173. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_tables.scss +0 -0
  174. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_theme.scss +0 -0
  175. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_thumbnails.scss +0 -0
  176. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_tooltip.scss +0 -0
  177. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_type.scss +0 -0
  178. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_utilities.scss +0 -0
  179. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_variables.scss +0 -0
  180. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_wells.scss +0 -0
  181. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/bootstrap.scss +0 -0
  182. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_alerts.scss +0 -0
  183. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_background-variant.scss +0 -0
  184. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_border-radius.scss +0 -0
  185. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_buttons.scss +0 -0
  186. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_center-block.scss +0 -0
  187. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_clearfix.scss +0 -0
  188. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_forms.scss +0 -0
  189. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_gradients.scss +0 -0
  190. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_grid-framework.scss +0 -0
  191. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_grid.scss +0 -0
  192. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_hide-text.scss +0 -0
  193. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_image.scss +0 -0
  194. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_labels.scss +0 -0
  195. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_list-group.scss +0 -0
  196. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_nav-divider.scss +0 -0
  197. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_nav-vertical-align.scss +0 -0
  198. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_opacity.scss +0 -0
  199. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_pagination.scss +0 -0
  200. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_panels.scss +0 -0
  201. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_progress-bar.scss +0 -0
  202. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_reset-filter.scss +0 -0
  203. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_resize.scss +0 -0
  204. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_responsive-visibility.scss +0 -0
  205. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_size.scss +0 -0
  206. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_tab-focus.scss +0 -0
  207. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_table-row.scss +0 -0
  208. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_text-emphasis.scss +0 -0
  209. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_text-overflow.scss +0 -0
  210. data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_vendor-prefixes.scss +0 -0
  211. data/vendor/assets/stylesheets/rails_admin/font-awesome.scss +2342 -0
  212. data/{app → vendor}/assets/stylesheets/rails_admin/jquery.colorpicker.scss +0 -0
  213. metadata +163 -170
  214. data/app/assets/javascripts/rails_admin/custom/ui.coffee +0 -1
  215. data/app/assets/javascripts/rails_admin/ra.i18n.coffee +0 -10
  216. data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.coffee +0 -58
  217. data/app/assets/javascripts/rails_admin/ra.widgets.coffee +0 -359
  218. data/app/assets/javascripts/rails_admin/ui.coffee +0 -102
  219. data/lib/rails_admin/config/fields/factories/refile.rb +0 -25
  220. data/lib/rails_admin/config/fields/types/refile.rb +0 -27
  221. data/lib/rails_admin/extensions/cancan/authorization_adapter.rb +0 -57
  222. data/lib/rails_admin/extensions/cancan.rb +0 -3
@@ -0,0 +1,135 @@
1
+ (function($) {
2
+ $(document).on("click", "#list input.toggle", function() {
3
+ $("#list [name='bulk_ids[]']").prop("checked", $(this).is(":checked"));
4
+ });
5
+
6
+ $(document).on('click', '.pjax', function(event) {
7
+ if (event.which > 1 || event.metaKey || event.ctrlKey) {
8
+ return;
9
+ }
10
+
11
+ if ($.support.pjax) {
12
+ event.preventDefault();
13
+ $.pjax({
14
+ container: $(this).data('pjax-container') || '[data-pjax-container]',
15
+ url: $(this).data('href') || $(this).attr('href'),
16
+ timeout: 2000
17
+ });
18
+ return;
19
+ }
20
+
21
+ if ($(this).data('href')) {
22
+ window.location = $(this).data('href');
23
+ }
24
+ });
25
+
26
+ $(document).on('submit', '.pjax-form', function(event) {
27
+ if ($.support.pjax) {
28
+ event.preventDefault();
29
+ $.pjax({
30
+ container: $(this).data('pjax-container') || '[data-pjax-container]',
31
+ url: this.action + (this.action.indexOf('?') !== -1 ? '&' : '?') + $(this).serialize(),
32
+ timeout: 2000
33
+ });
34
+ }
35
+ });
36
+
37
+ $(document).on('pjax:start', function() {
38
+ return $('#loading').show();
39
+ }).on('pjax:end', function() {
40
+ return $('#loading').hide();
41
+ });
42
+
43
+ $(document).on('click', '[data-target]', function() {
44
+ if (!$(this).hasClass('disabled')) {
45
+ if ($(this).has('i.icon-chevron-down').length) {
46
+ $(this).removeClass('active').children('i').toggleClass('icon-chevron-down icon-chevron-right');
47
+ $($(this).data('target')).select(':visible').hide('slow');
48
+ } else {
49
+ if ($(this).has('i.icon-chevron-right').length) {
50
+ $(this).addClass('active').children('i').toggleClass('icon-chevron-down icon-chevron-right');
51
+ $($(this).data('target')).select(':hidden').show('slow');
52
+ }
53
+ }
54
+ }
55
+ });
56
+
57
+ $(document).on('click', '.form-horizontal legend', function() {
58
+ if ($(this).has('i.icon-chevron-down').length) {
59
+ $(this).siblings('.control-group:visible').hide('slow');
60
+ $(this).children('i').toggleClass('icon-chevron-down icon-chevron-right');
61
+ } else {
62
+ if ($(this).has('i.icon-chevron-right').length) {
63
+ $(this).siblings('.control-group:hidden').show('slow');
64
+ $(this).children('i').toggleClass('icon-chevron-down icon-chevron-right');
65
+ }
66
+ }
67
+ });
68
+
69
+ $(document).on('click', 'form .tab-content .tab-pane a.remove_nested_one_fields', function() {
70
+ $(this).children('input[type="hidden"]').val($(this).hasClass('active')).siblings('i').toggleClass('icon-check icon-trash');
71
+ });
72
+
73
+ $(document).ready(function() {
74
+ RailsAdmin.I18n.init($('html').attr('lang'), $("#admin-js").data('i18nOptions'));
75
+ $(document).trigger('rails_admin.dom_ready');
76
+ });
77
+
78
+ $(document).on('pjax:end', function() {
79
+ $(document).trigger('rails_admin.dom_ready');
80
+ });
81
+
82
+ $(document).on('rails_admin.dom_ready', function() {
83
+ $('.nav.nav-pills li.active').removeClass('active');
84
+ $(".nav.nav-pills li[data-model=\"" + ($('.page-header').data('model')) + "\"]").addClass('active');
85
+ $('.animate-width-to').each(function() {
86
+ var length, width;
87
+ length = $(this).data("animate-length");
88
+ width = $(this).data("animate-width-to");
89
+ $(this).animate({
90
+ width: width
91
+ }, length, 'easeOutQuad');
92
+ });
93
+ $('.form-horizontal legend').has('i.icon-chevron-right').each(function() {
94
+ $(this).siblings('.control-group').hide();
95
+ });
96
+ $(".table").tooltip({
97
+ selector: "th[rel=tooltip]"
98
+ });
99
+ $('[formnovalidate]').on('click', function() {
100
+ $(this).closest('form').attr('novalidate', true);
101
+ });
102
+ $.each($('#filters_box').data('options'), function() {
103
+ $.filters.append(this);
104
+ });
105
+ });
106
+
107
+ $(document).on('click', ".bulk-link", function(event) {
108
+ event.preventDefault();
109
+ $('#bulk_action').val($(this).data('action'));
110
+ $('#bulk_form').submit();
111
+ });
112
+
113
+ $(document).on('click', "#remove_filter", function(event) {
114
+ event.preventDefault();
115
+ $("#filters_box").html("");
116
+ $("hr.filters_box").hide();
117
+ $(this).parent().siblings("input[type='search']").val("");
118
+ $(this).parents("form").submit();
119
+ });
120
+
121
+ $(document).on('click', '#fields_to_export label input#check_all', function() {
122
+ var elems;
123
+ elems = $('#fields_to_export label input');
124
+ if ($('#fields_to_export label input#check_all').is(':checked')) {
125
+ $(elems).prop('checked', true);
126
+ } else {
127
+ $(elems).prop('checked', false);
128
+ }
129
+ });
130
+
131
+ $(document).on('click', '#fields_to_export .reverse-selection', function() {
132
+ $(this).closest(".control-group").find(".controls").find("input").click();
133
+ });
134
+
135
+ }(jQuery));
@@ -0,0 +1,29 @@
1
+ .ra-sidescroll {
2
+ margin-bottom: 20px;
3
+ overflow-x: auto;
4
+ .table {
5
+ margin-bottom: 0;
6
+ }
7
+
8
+ .ra-sidescroll-frozen {
9
+ position: sticky;
10
+
11
+ // border-right isn't sticky
12
+ &.last-of-frozen {
13
+ box-shadow: -1px 0 0 0 $table-border-color inset;
14
+ padding-right: $table-condensed-cell-padding + 1px;
15
+ }
16
+ }
17
+
18
+ // Remove transparency on frozen cells.
19
+ $table-bg-default: if($table-bg == transparent, if($body-bg == transparent, #fff, $body-bg), $table-bg) !default;
20
+ .table-striped > tbody > tr:nth-child(even) > td, .table-striped > thead > tr > th {
21
+ background-color: $table-bg-default;
22
+ }
23
+ $table-bg-header-sort: #e2eff6 !default;
24
+ .table .ra-sidescroll-frozen {
25
+ &.headerSortUp, &.headerSortDown {
26
+ background-color: $table-bg-header-sort;
27
+ }
28
+ }
29
+ }
@@ -11,3 +11,7 @@ iframe.wysihtml5-sandbox, .wysihtml5-editor{
11
11
  max-height: 200px;
12
12
  max-width: 300px;
13
13
  }
14
+
15
+ .controls.ui-sortable .sortables{
16
+ cursor: move;
17
+ }
@@ -55,12 +55,13 @@
55
55
  @import "rails_admin/bootstrap-datetimepicker-build";
56
56
  @import "rails_admin/ra.filtering-multiselect";
57
57
  @import "rails_admin/ra.widgets";
58
+ @import "rails_admin/ra.sidescroll";
58
59
  @import "rails_admin/jquery.colorpicker";
59
60
 
60
61
 
61
62
  /*** Font-awesome ***/
62
63
 
63
- @import 'font-awesome';
64
+ @import 'rails_admin/font-awesome';
64
65
  @import 'rails_admin/base/font-awesome-4-compability';
65
66
 
66
67
  /*** Bootstrap Theming ***/
@@ -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!
@@ -84,9 +84,24 @@ module RailsAdmin
84
84
  end.join.html_safe
85
85
  end
86
86
 
87
+ def root_navigation
88
+ actions(:root).select(&:show_in_sidebar).group_by(&:sidebar_label).collect do |label, nodes|
89
+ li_stack = nodes.map do |node|
90
+ url = rails_admin.url_for(action: node.action_name, controller: "rails_admin/main")
91
+ nav_icon = node.link_icon ? %(<i class="#{node.link_icon}"></i>).html_safe : ''
92
+ content_tag :li do
93
+ link_to nav_icon + " " + wording_for(:menu, node), url, class: "pjax"
94
+ end
95
+ end.join.html_safe
96
+ label ||= t('admin.misc.root_navigation')
97
+
98
+ %(<li class='dropdown-header'>#{capitalize_first_letter label}</li>#{li_stack}) if li_stack.present?
99
+ end.join.html_safe
100
+ end
101
+
87
102
  def static_navigation
88
103
  li_stack = RailsAdmin::Config.navigation_static_links.collect do |title, url|
89
- content_tag(:li, link_to(title.to_s, url, target: '_blank'))
104
+ content_tag(:li, link_to(title.to_s, url, target: '_blank', rel: 'noopener noreferrer'))
90
105
  end.join
91
106
 
92
107
  label = RailsAdmin::Config.navigation_static_label || t('admin.misc.navigation_static_label')
@@ -110,7 +125,7 @@ module RailsAdmin
110
125
  def breadcrumb(action = @action, _acc = [])
111
126
  begin
112
127
  (parent_actions ||= []) << action
113
- 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
114
129
 
115
130
  content_tag(:ol, class: 'breadcrumb') do
116
131
  parent_actions.collect do |a|
@@ -138,7 +153,7 @@ module RailsAdmin
138
153
 
139
154
  # parent => :root, :collection, :member
140
155
  def menu_for(parent, abstract_model = nil, object = nil, only_icon = false) # perf matters here (no action view trickery)
141
- actions = actions(parent, abstract_model, object).select { |a| a.http_methods.include?(:get) }
156
+ actions = actions(parent, abstract_model, object).select { |a| a.http_methods.include?(:get) && a.show_in_menu }
142
157
  actions.collect do |action|
143
158
  wording = wording_for(:menu, action)
144
159
  %(
@@ -160,7 +175,7 @@ module RailsAdmin
160
175
  content_tag(:ul, class: 'dropdown-menu', style: 'left:auto; right:0;') do
161
176
  actions.collect do |action|
162
177
  content_tag :li do
163
- link_to wording_for(:bulk_link, action), '#', onclick: "jQuery('#bulk_action').val('#{action.action_name}'); jQuery('#bulk_form').submit(); return false;"
178
+ link_to wording_for(:bulk_link, action, abstract_model), '#', class: 'bulk-link', data: {action: action.action_name}
164
179
  end
165
180
  end.join.html_safe
166
181
  end
@@ -56,8 +56,8 @@ module RailsAdmin
56
56
  end.to_a.sort_by(&:first)
57
57
  end
58
58
 
59
- def ordered_filter_string
60
- @ordered_filter_string ||= ordered_filters.map do |duplet|
59
+ def ordered_filter_options
60
+ @ordered_filter_options ||= ordered_filters.map do |duplet|
61
61
  options = {index: duplet[0]}
62
62
  filter_for_field = duplet[1]
63
63
  filter_name = filter_for_field.keys.first
@@ -77,8 +77,8 @@ module RailsAdmin
77
77
  options[:value] = filter_hash['v']
78
78
  options[:label] = field.label
79
79
  options[:operator] = filter_hash['o']
80
- %{$.filters.append(#{options.to_json});}
81
- end.join("\n").html_safe if ordered_filters
80
+ options
81
+ end if ordered_filters
82
82
  end
83
83
  end
84
84
  end
@@ -0,0 +1,7 @@
1
+ %meta{content: "IE=edge", "http-equiv" => "X-UA-Compatible"}
2
+ %meta{content: "text/html; charset=utf-8", "http-equiv" => "Content-Type"}
3
+ %meta{content: "width=device-width, initial-scale=1", name: "viewport; charset=utf-8"}
4
+ %meta{content: "NONE,NOARCHIVE", name: "robots"}
5
+ = csrf_meta_tag
6
+ = stylesheet_link_tag "rails_admin/rails_admin.css", media: :all
7
+ = javascript_include_tag "rails_admin/rails_admin.js"
@@ -1,5 +1,5 @@
1
1
  %ul.nav.navbar-nav.navbar-right.root_links
2
- - actions(:root).each do |action|
2
+ - actions(:root).select(&:show_in_navigation).each do |action|
3
3
  %li{class: "#{action.action_name}_root_link"}= link_to wording_for(:menu, action), { action: action.action_name, controller: 'rails_admin/main' }, class: action.pjax? ? "pjax" : ""
4
4
  - if main_app_root_path = (main_app.root_path rescue false)
5
5
  %li= link_to t('admin.home.name'), main_app_root_path
@@ -1,2 +1,3 @@
1
1
  %ul.nav.nav-pills.nav-stacked= main_navigation
2
- %ul.nav.nav-pills.nav-stacked= static_navigation
2
+ %ul.nav.nav-pills.nav-stacked= root_navigation
3
+ %ul.nav.nav-pills.nav-stacked= static_navigation
@@ -1,18 +1,9 @@
1
1
  !!! 5
2
2
  %html{lang: I18n.locale}
3
3
  %head
4
- %meta{content: "IE=edge", "http-equiv" => "X-UA-Compatible"}
5
- %meta{content: "text/html; charset=utf-8", "http-equiv" => "Content-Type"}
6
- %meta{content: "width=device-width, initial-scale=1", name: "viewport; charset=utf-8"}
7
- %meta{content: "NONE,NOARCHIVE", name: "robots"}
8
- = csrf_meta_tag
9
- = stylesheet_link_tag "rails_admin/rails_admin.css", media: :all
10
- = javascript_include_tag "rails_admin/rails_admin.js"
4
+ = render "layouts/rails_admin/head"
11
5
  %body.rails_admin
12
6
  #admin-js{:'data-i18n-options' => I18n.t("admin.js").to_json}
13
- -# Initialize JS simple i18n
14
- :javascript
15
- RailsAdmin.I18n.init('#{I18n.locale}', document.getElementById("admin-js").dataset.i18nOptions);
16
7
  #loading.label.label-warning{style: 'display:none; position:fixed; right:20px; bottom:20px; z-index:100000'}= t('admin.loading')
17
8
  %nav.navbar.navbar-default.navbar-fixed-top
18
9
  = render "layouts/rails_admin/navigation"
@@ -21,4 +12,5 @@
21
12
  .col-sm-3.col-md-2.sidebar-nav
22
13
  = render "layouts/rails_admin/sidebar_navigation"
23
14
  .col-sm-9.col-sm-offset-3.col-md-10.col-md-offset-2
24
- .content{:'data-pjax-container' => true}= render template: 'layouts/rails_admin/pjax'
15
+ .content{:'data-pjax-container' => true}
16
+ = render template: 'layouts/rails_admin/pjax'
@@ -1,9 +1,5 @@
1
- :javascript
2
- $('.nav.nav-pills li.active').removeClass('active');
3
- $('.nav.nav-pills li[data-model="#{@abstract_model.to_param}"]').addClass('active');
4
-
5
1
  %title= "#{@abstract_model.try(:pretty_name) || @page_name} | #{[_get_plugin_name[0] || 'Rails', _get_plugin_name[1] || 'Admin'].join(' ')}"
6
- .page-header
2
+ .page-header{data: {model: @abstract_model.to_param}}
7
3
  %h1= @page_name
8
4
  - flash && flash.each do |key, value|
9
5
  .alert.alert-dismissible{class: flash_alert_class(key)}
@@ -0,0 +1,7 @@
1
+ :ruby
2
+ js_data = {
3
+ csspath: field.css_location,
4
+ jspath: field.js_location
5
+ }
6
+
7
+ = form.rich_text_area field.method_name, field.html_attributes.reverse_merge(data: { options: js_data.to_json })
@@ -1,5 +1,8 @@
1
1
  - file = field.value
2
2
 
3
+ - if field.cache_method
4
+ = form.hidden_field(field.cache_method, value: field.cache_value)
5
+
3
6
  .toggle{style: ('display:none;' if file && field.delete_method && form.object.send(field.delete_method) == '1')}
4
7
  - if value = field.pretty_value
5
8
  = value
@@ -7,11 +10,8 @@
7
10
  = form.file_field(field.name, field.html_attributes.reverse_merge({ data: { fileupload: true }}))
8
11
 
9
12
  - if field.optional? && field.errors.blank? && file && field.delete_method
10
- %a.btn.btn-info.btn-remove-image{href: '#', :'data-toggle' => 'button', role: 'button', onclick: "$(this).siblings('[type=checkbox]').click(); $(this).siblings('.toggle').toggle('slow'); jQuery(this).toggleClass('btn-danger btn-info'); return false;"}
13
+ %a.btn.btn-info.btn-remove-image{href: '#', :'data-toggle' => 'button', role: 'button'}
11
14
  %i.icon-white.icon-trash
12
15
  = I18n.t('admin.actions.delete.menu').capitalize + " #{field.label.downcase}"
13
16
 
14
17
  = form.check_box(field.delete_method, style: 'display:none;')
15
-
16
- - if field.cache_method
17
- = form.hidden_field(field.cache_method)
@@ -26,7 +26,7 @@
26
26
  }
27
27
 
28
28
  - selected_id = (hdv = field.form_default_value).nil? ? selected_id : hdv
29
- = form.select field.method_name, collection, { selected: selected_id, include_blank: true }, field.html_attributes.reverse_merge({ data: { filteringselect: true, options: js_data.to_json }, placeholder: t('admin.misc.search') })
29
+ = form.select field.method_name, collection, { selected: selected_id, include_blank: true }, field.html_attributes.reverse_merge({ data: { filteringselect: true, options: js_data.to_json }, placeholder: t('admin.misc.search'), style: "float: left" })
30
30
 
31
31
  - if authorized?(:new, config.abstract_model) && field.inline_add
32
32
  - path_hash = { model_name: config.abstract_model.to_param, modal: true }
@@ -1,12 +1,14 @@
1
1
  - field.attachments.each_with_index do |attachment, i|
2
- .toggle
2
+ .toggle{class: field.reorderable? ? 'sortables' : ''}
3
3
  = attachment.pretty_value
4
- - if field.delete_method
5
- %a.btn.btn-info.btn-remove-image{href: '#', :'data-toggle' => 'button', role: 'button', onclick: "$(this).siblings('[type=checkbox]').click(); $(this).parent('.toggle').toggle('slow'); jQuery(this).toggleClass('btn-danger btn-info'); return false;"}
4
+ - if field.delete_method || field.keep_method
5
+ %a.btn.btn-info.btn-remove-image{href: '#', :'data-toggle' => 'button', role: 'button'}
6
6
  %i.icon-white.icon-trash
7
7
  = I18n.t('admin.actions.delete.menu').capitalize + " #{field.label.downcase} ##{i + 1}"
8
-
9
- = form.check_box(field.delete_method, {multiple:true, style: 'display:none;'}, attachment.delete_key, nil)
8
+ - if field.keep_method
9
+ = form.check_box(field.keep_method, {multiple:true, checked: true, style: 'display:none;'}, attachment.keep_value, nil)
10
+ - elsif field.delete_method
11
+ = form.check_box(field.delete_method, {multiple:true, style: 'display:none;'}, attachment.delete_value, nil)
10
12
 
11
13
  = form.file_field(field.name, field.html_attributes.reverse_merge({ data: { :"multiple-fileupload" => true }, multiple: true }))
12
14
 
@@ -2,10 +2,25 @@
2
2
  type_collection = field.polymorphic_type_collection
3
3
  type_column = field.association.foreign_type.to_s
4
4
  selected_type = field.bindings[:object].send(type_column)
5
- collection = field.associated_collection(selected_type)
6
5
  selected = field.bindings[:object].send(field.association.name)
6
+ collection = selected ? [[field.formatted_value, selected.id]] : [[]]
7
7
  column_type_dom_id = form.dom_id(field).sub(field.method_name.to_s, type_column)
8
+ current_action = params[:action].in?(['create', 'new']) ? 'create' : 'update'
9
+
10
+ default_options = { float_left: false }
11
+
12
+ js_data = type_collection.inject({}) do |options, model|
13
+ model_name = model.second.underscore.downcase
14
+ source_abstract_model = RailsAdmin.config(form.object.class).abstract_model
15
+ options.merge(model_name.gsub("_", "") => {
16
+ xhr: true,
17
+ remote_source: index_path(model_name, source_object_id: form.object.id, source_abstract_model: source_abstract_model.to_param, current_action: current_action, compact: true),
18
+ float_left: false
19
+ })
20
+ end
8
21
 
9
22
  .form-inline
10
- = form.select type_column, type_collection, {include_blank: true, selected: selected_type}, class: "form-control", id: column_type_dom_id, data: { polymorphic: true, urls: field.polymorphic_type_urls.to_json }
11
- = form.select field.method_name, collection, {include_blank: true, selected: selected.try(:id)}, class: "form-control"
23
+ - js_data.each do |model, value|
24
+ %div{id: "#{model}-js-options", data: { options: value.to_json } }
25
+ = form.select type_column, type_collection, {include_blank: true, selected: selected_type}, class: "form-control", id: column_type_dom_id, data: { polymorphic: true, urls: field.polymorphic_type_urls.to_json }, style: "float: left; margin-right: 10px;"
26
+ = form.select field.method_name, collection, {include_blank: true, selected: selected.try(:id)}, class: "form-control", data: { filteringselect: true, options: js_data[selected_type.try(:downcase)] || default_options }, placeholder: 'Search'
@@ -18,8 +18,7 @@
18
18
  %span.show= link_to capitalize_first_letter(abstract_model.config.label_plural), index_path, class: 'pjax'
19
19
  %td
20
20
  - if last_created
21
- = time_ago_in_words last_created
22
- = t "admin.misc.ago"
21
+ = t "admin.misc.time_ago", time: time_ago_in_words(last_created), default: "#{time_ago_in_words(last_created)} #{t("admin.misc.ago")}"
23
22
  %td
24
23
  - count = @count[abstract_model.model.name]
25
24
  - percent = count > 0 ? (@max <= 1 ? count : ((Math.log(count+1) * 100.0) / Math.log(@max+1)).to_i) : -1
@@ -16,7 +16,7 @@
16
16
  %b= t('admin.export.select_all_fields')
17
17
  .form-group.control-group
18
18
  .col-sm-12
19
- .well.well-sm{rel: 'tooltip', :'data-original-title' => t('admin.export.click_to_reverse_selection'), onclick: 'jQuery(this).closest(".control-group").find(".controls").find("input").click()', style: 'margin: 0; cursor: pointer;'}
19
+ .well.well-sm.reverse-selection{rel: 'tooltip', title: t('admin.export.click_to_reverse_selection'), style: 'margin: 0; cursor: pointer;'}
20
20
  %b= t('admin.export.fields_from', name: @model_config.label_plural.downcase)
21
21
  .controls
22
22
  .row
@@ -40,7 +40,7 @@
40
40
  - fields = field.associated_model_config.export.with(controller: self.controller, view: self, object: (associated_model = field.associated_model_config.abstract_model.model).new).visible_fields.select{ |f| !f.association? }
41
41
  .form-group.control-group
42
42
  .col-sm-12
43
- .well.well-sm{rel: 'tooltip', :'data-original-title' => t('admin.export.click_to_reverse_selection'), onclick: 'jQuery(this).closest(".control-group").find(".controls").find("input").click()', style: 'margin: 0; cursor: pointer;'}
43
+ .well.well-sm.reverse-selection{rel: 'tooltip', title: t('admin.export.click_to_reverse_selection'), style: 'margin: 0; cursor: pointer;'}
44
44
  %b= t('admin.export.fields_from_associated', name: field.label.downcase)
45
45
  .controls
46
46
  .row
@@ -12,10 +12,12 @@
12
12
  properties = @model_config.list.with(controller: self.controller, view: self, object: @abstract_model.model.new).visible_fields
13
13
  checkboxes = @model_config.list.checkboxes?
14
14
  # columns paginate
15
- sets = get_column_sets(properties)
16
- properties = sets[params[:set].to_i] || []
17
- other_left = ((params[:set].to_i - 1) >= 0) && sets[params[:set].to_i - 1].present?
18
- other_right = sets[params[:set].to_i + 1].present?
15
+ unless (frozen_columns = @model_config.list.sidescroll_frozen_columns)
16
+ sets = get_column_sets(properties)
17
+ properties = sets[params[:set].to_i] || []
18
+ other_left = ((params[:set].to_i - 1) >= 0) && sets[params[:set].to_i - 1].present?
19
+ other_right = sets[params[:set].to_i + 1].present?
20
+ end
19
21
 
20
22
  - content_for :contextual_tabs do
21
23
  - if checkboxes
@@ -35,11 +37,6 @@
35
37
  %li
36
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)
37
39
 
38
- :javascript
39
- jQuery(function($) {
40
- #{ordered_filter_string}
41
- });
42
-
43
40
  %style
44
41
  - properties.select{ |p| p.column_width.present? }.each do |property|
45
42
  = "#list th.#{property.css_class} { width: #{property.column_width}px; min-width: #{property.column_width}px; }"
@@ -48,7 +45,7 @@
48
45
  #list
49
46
  = form_tag(index_path(params.except(*%w[page f query])), method: :get, class: "pjax-form form-inline") do
50
47
  .well
51
- %span#filters_box
48
+ %span#filters_box{data: {options: ordered_filter_options.to_json}}
52
49
  %hr.filters_box{style: "display:#{ordered_filters.empty? ? 'none' : 'block'}"}
53
50
  .input-group
54
51
  %input.form-control.input-small{name: "query", type: "search", value: query, placeholder: t("admin.misc.filter")}
@@ -56,7 +53,7 @@
56
53
  %button.btn.btn-primary{type: 'submit', :'data-disable-with' => '<i class="icon-white icon-refresh"></i> '.html_safe + t('admin.misc.refresh')}
57
54
  %i.icon-white.icon-refresh
58
55
  = t('admin.misc.refresh')
59
- %button#remove_filter.btn.btn-info{title: "Reset filters"}
56
+ %button#remove_filter.btn.btn-info{title: t('admin.misc.reset_filters')}
60
57
  %i.icon-white.icon-remove
61
58
  - if export_action
62
59
  %span{style: 'float:right'}= link_to wording_for(:link, export_action), export_path(params.except('set').except('page')), class: 'btn btn-info'
@@ -68,7 +65,7 @@
68
65
  %li{class: "#{'active' if scope.to_s == params[:scope] || (params[:scope].blank? && index == 0)}"}
69
66
  %a{href: index_path(params.merge(scope: scope, page: nil)), class: 'pjax'}= I18n.t("admin.scopes.#{@abstract_model.to_param}.#{scope}", default: I18n.t("admin.scopes.#{scope}", default: scope.to_s.titleize))
70
67
 
71
- = form_tag bulk_action_path(model_name: @abstract_model.to_param), method: :post, id: "bulk_form", class: "form" do
68
+ = form_tag bulk_action_path(model_name: @abstract_model.to_param), method: :post, id: "bulk_form", class: ["form", frozen_columns ? 'ra-sidescroll' : nil], data: (frozen_columns ? {ra_sidescroll: frozen_columns} : {}) do
72
69
  = hidden_field_tag :bulk_action
73
70
  - if description.present?
74
71
  %p
@@ -80,6 +77,8 @@
80
77
  - if checkboxes
81
78
  %th.shrink
82
79
  %input.toggle{type: "checkbox"}
80
+ - if frozen_columns
81
+ %th.last.shrink
83
82
  - if other_left
84
83
  %th.other.left.shrink= "..."
85
84
  - properties.each do |property|
@@ -90,12 +89,16 @@
90
89
  %th{class: "#{property.sortable && "header pjax" || nil} #{sort_direction if property.sortable && sort_direction} #{property.css_class} #{property.type_css_class}", :'data-href' => (property.sortable && sort_location), rel: "tooltip", title: "#{property.hint}"}= capitalize_first_letter(property.label)
91
90
  - if other_right
92
91
  %th.other.right.shrink= "..."
93
- %th.last.shrink
92
+ - unless frozen_columns
93
+ %th.last.shrink
94
94
  %tbody
95
95
  - @objects.each do |object|
96
96
  %tr{class: "#{@abstract_model.param_key}_row #{@model_config.list.with(object: object).row_css_class}"}
97
97
  - if checkboxes
98
98
  %td= check_box_tag "bulk_ids[]", object.id, false
99
+ - if frozen_columns
100
+ %td.last.links
101
+ %ul.inline.list-inline= menu_for :member, @abstract_model, object, true
99
102
  - if @other_left_link ||= other_left && index_path(params.except('set').merge(params[:set].to_i != 1 ? {set: (params[:set].to_i - 1)} : {}))
100
103
  %td.other.left= link_to "...", @other_left_link, class: 'pjax'
101
104
  - properties.map{ |property| property.bind(:object, object) }.each do |property|
@@ -103,8 +106,9 @@
103
106
  %td{class: "#{property.css_class} #{property.type_css_class}", title: strip_tags(value.to_s)}= value
104
107
  - if @other_right_link ||= other_right && index_path(params.merge(set: (params[:set].to_i + 1)))
105
108
  %td.other.right= link_to "...", @other_right_link, class: 'pjax'
106
- %td.last.links
107
- %ul.inline.list-inline= menu_for :member, @abstract_model, object, true
109
+ - unless frozen_columns
110
+ %td.last.links
111
+ %ul.inline.list-inline= menu_for :member, @abstract_model, object, true
108
112
 
109
113
  - if @model_config.list.limited_pagination
110
114
  .row
@@ -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
- - if !(values = fields.map{ |f| f.formatted_value.presence }).compact.empty? || !RailsAdmin::config.compact_show_view
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
@@ -8,9 +8,8 @@
8
8
  %p= fieldset.help
9
9
  %dl
10
10
  - fields.each_with_index do |field, index|
11
- - unless values[index].nil? && RailsAdmin::config.compact_show_view
12
- %dt
13
- %span.label.label-info{class: "#{field.type_css_class} #{field.css_class}"}
14
- = field.label
15
- %dd.well
16
- = field.pretty_value
11
+ %dt
12
+ %span.label.label-info{class: "#{field.type_css_class} #{field.css_class}"}
13
+ = field.label
14
+ %dd.well
15
+ = field.pretty_value
@@ -29,6 +29,7 @@ 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"
@@ -41,8 +42,10 @@ en:
41
42
  up: "Up"
42
43
  down: "Down"
43
44
  navigation: "Navigation"
45
+ root_navigation: "Actions"
44
46
  navigation_static_label: "Links"
45
47
  log_out: "Log out"
48
+ time_ago: "%{time} ago"
46
49
  ago: "ago"
47
50
  more: "Plus %{count} more %{models_name}"
48
51
  flash:
@@ -8,8 +8,8 @@ RailsAdmin.config do |config|
8
8
  # end
9
9
  # config.current_user_method(&:current_user)
10
10
 
11
- ## == Cancan ==
12
- # config.authorize_with :cancan
11
+ ## == CancanCan ==
12
+ # config.authorize_with :cancancan
13
13
 
14
14
  ## == Pundit ==
15
15
  # config.authorize_with :pundit
@@ -46,7 +46,7 @@ module RailsAdmin
46
46
  def initialize(model_or_model_name)
47
47
  @model_name = model_or_model_name.to_s
48
48
  ancestors = model.ancestors.collect(&:to_s)
49
- if ancestors.include?('ActiveRecord::Base') && !model.abstract_class?
49
+ if ancestors.include?('ActiveRecord::Base') && !model.abstract_class? && model.table_exists?
50
50
  initialize_active_record
51
51
  elsif ancestors.include?('Mongoid::Document')
52
52
  initialize_mongoid
@@ -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
 
@@ -23,8 +23,8 @@ module RailsAdmin
23
23
  object.save(options)
24
24
  end
25
25
 
26
- def method_missing(name, *args, &block)
27
- object.send(name, *args, &block)
26
+ def method_missing(method_name, *args, &block)
27
+ object.send(method_name, *args, &block)
28
28
  end
29
29
  end
30
30
  end