rails_admin 3.3.0 → 4.0.0.beta

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 (214) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +7 -5
  3. data/README.md +11 -11
  4. data/Rakefile +3 -11
  5. data/app/assets/builds/rails_admin.css +10 -0
  6. data/app/assets/builds/rails_admin.js +34 -0
  7. data/app/controllers/rails_admin/main_controller.rb +3 -3
  8. data/app/helpers/rails_admin/application_helper.rb +3 -15
  9. data/app/helpers/rails_admin/form_builder.rb +10 -9
  10. data/app/views/layouts/rails_admin/_head.html.erb +10 -27
  11. data/app/views/layouts/rails_admin/_head_custom.html.erb +3 -0
  12. data/app/views/layouts/rails_admin/_secondary_navigation.html.erb +1 -1
  13. data/app/views/rails_admin/main/_dashboard_history.html.erb +1 -1
  14. data/app/views/rails_admin/main/_delete_notice.html.erb +3 -3
  15. data/app/views/rails_admin/main/_form_boolean.html.erb +9 -13
  16. data/app/views/rails_admin/main/_submit_buttons.html.erb +4 -4
  17. data/app/views/rails_admin/main/bulk_delete.html.erb +2 -2
  18. data/app/views/rails_admin/main/dashboard.html.erb +3 -3
  19. data/app/views/rails_admin/main/delete.html.erb +2 -2
  20. data/app/views/rails_admin/main/export.html.erb +2 -2
  21. data/app/views/rails_admin/main/history.html.erb +2 -2
  22. data/app/views/rails_admin/main/index.html.erb +3 -3
  23. data/config/initializers/active_record_extensions.rb +1 -4
  24. data/lib/generators/rails_admin/install_generator.rb +37 -92
  25. data/lib/generators/rails_admin/templates/rails_admin.scss.erb +1 -1
  26. data/lib/rails_admin/abstract_model.rb +69 -191
  27. data/lib/rails_admin/adapters/active_record/association.rb +1 -1
  28. data/lib/rails_admin/adapters/active_record/property.rb +7 -0
  29. data/lib/rails_admin/adapters/active_record/reflection.rb +87 -0
  30. data/lib/rails_admin/adapters/active_record/repository.rb +216 -0
  31. data/lib/rails_admin/adapters/active_record/statement_builder.rb +148 -0
  32. data/lib/rails_admin/adapters/active_record/where_builder.rb +40 -0
  33. data/lib/rails_admin/adapters/active_record.rb +7 -356
  34. data/lib/rails_admin/adapters/mongoid/association.rb +1 -1
  35. data/lib/rails_admin/adapters/mongoid/extension.rb +16 -6
  36. data/lib/rails_admin/adapters/mongoid/property.rb +7 -0
  37. data/lib/rails_admin/adapters/mongoid/reflection.rb +58 -0
  38. data/lib/rails_admin/adapters/mongoid/repository.rb +237 -0
  39. data/lib/rails_admin/adapters/mongoid/statement_builder.rb +93 -0
  40. data/lib/rails_admin/adapters/mongoid.rb +7 -300
  41. data/lib/rails_admin/adapters/reflection.rb +105 -0
  42. data/lib/rails_admin/adapters/repository.rb +169 -0
  43. data/lib/rails_admin/adapters/statement_builder.rb +109 -0
  44. data/lib/rails_admin/adapters.rb +94 -0
  45. data/lib/rails_admin/config/actions/base.rb +8 -0
  46. data/lib/rails_admin/config/actions/bulk_delete.rb +4 -4
  47. data/lib/rails_admin/config/actions/dashboard.rb +1 -1
  48. data/lib/rails_admin/config/actions/edit.rb +3 -2
  49. data/lib/rails_admin/config/actions/index.rb +1 -1
  50. data/lib/rails_admin/config/actions/new.rb +3 -2
  51. data/lib/rails_admin/config/actions/show.rb +1 -1
  52. data/lib/rails_admin/config/configurable.rb +4 -3
  53. data/lib/rails_admin/config/fields/association.rb +9 -8
  54. data/lib/rails_admin/config/fields/base.rb +55 -37
  55. data/lib/rails_admin/config/fields/collection_association.rb +2 -2
  56. data/lib/rails_admin/config/fields/factories/carrierwave.rb +35 -20
  57. data/lib/rails_admin/config/fields/factories/dragonfly.rb +30 -18
  58. data/lib/rails_admin/config/fields/factories/enum.rb +14 -8
  59. data/lib/rails_admin/config/fields/factories/paperclip.rb +29 -19
  60. data/lib/rails_admin/config/fields/factories/shrine.rb +19 -8
  61. data/lib/rails_admin/config/fields/singular_association.rb +6 -1
  62. data/lib/rails_admin/config/fields/types/active_record_enum.rb +3 -7
  63. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +8 -4
  64. data/lib/rails_admin/config/fields/types/bson_object_id.rb +1 -1
  65. data/lib/rails_admin/config/fields/types/datetime.rb +0 -4
  66. data/lib/rails_admin/config/fields/types/dragonfly.rb +1 -1
  67. data/lib/rails_admin/config/fields/types/enum.rb +11 -2
  68. data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +0 -2
  69. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +4 -4
  70. data/lib/rails_admin/config/fields/types/time.rb +1 -1
  71. data/lib/rails_admin/config/model.rb +27 -5
  72. data/lib/rails_admin/config/sections/list.rb +0 -8
  73. data/lib/rails_admin/config.rb +7 -21
  74. data/lib/rails_admin/criteria/path.rb +66 -0
  75. data/lib/rails_admin/criteria/period.rb +67 -0
  76. data/lib/rails_admin/engine.rb +11 -15
  77. data/lib/rails_admin/extensions/pundit/authorization_adapter.rb +2 -2
  78. data/lib/rails_admin/extensions/url_for_extension.rb +8 -0
  79. data/lib/rails_admin/support/asset_source.rb +42 -0
  80. data/lib/rails_admin/support/composite_keys_serializer.rb +28 -2
  81. data/lib/rails_admin/support/csv_converter.rb +3 -10
  82. data/lib/rails_admin/version.rb +7 -6
  83. data/lib/rails_admin.rb +7 -0
  84. data/lib/tasks/assets.rake +23 -0
  85. data/package.json +12 -7
  86. data/src/rails_admin/base.js +18 -15
  87. data/src/rails_admin/filter-box.js +7 -4
  88. data/src/rails_admin/filtering-multiselect.js +1 -1
  89. data/src/rails_admin/filtering-select.js +8 -8
  90. data/src/rails_admin/flatpickr.js +14 -0
  91. data/src/rails_admin/remote-form.js +74 -48
  92. data/src/rails_admin/styles/base/theming.scss +48 -25
  93. data/src/rails_admin/styles/base.scss +25 -1
  94. data/src/rails_admin/styles/filtering-select.scss +23 -62
  95. data/src/rails_admin/ui.js +1 -1
  96. data/src/rails_admin/vendor/jquery_nested_form.js +4 -4
  97. data/src/rails_admin/widgets.js +44 -11
  98. metadata +32 -128
  99. data/app/assets/javascripts/rails_admin/application.js.erb +0 -30
  100. data/app/assets/javascripts/rails_admin/custom/ui.js +0 -1
  101. data/app/assets/stylesheets/rails_admin/application.scss.erb +0 -35
  102. data/app/assets/stylesheets/rails_admin/custom/mixins.scss +0 -11
  103. data/app/assets/stylesheets/rails_admin/custom/theming.scss +0 -13
  104. data/app/assets/stylesheets/rails_admin/custom/variables.scss +0 -15
  105. data/lib/generators/rails_admin/importmap_formatter.rb +0 -28
  106. data/lib/generators/rails_admin/templates/rails_admin.vite.js +0 -2
  107. data/lib/generators/rails_admin/templates/rails_admin.webpacker.js +0 -2
  108. data/lib/rails_admin/adapters/active_record/object_extension.rb +0 -13
  109. data/lib/rails_admin/adapters/active_record.rb.bak +0 -348
  110. data/lib/rails_admin/adapters/mongoid/object_extension.rb +0 -29
  111. data/lib/rails_admin/support/es_module_processor.rb +0 -23
  112. data/vendor/assets/fonts/rails_admin/fa-solid-900.ttf +0 -0
  113. data/vendor/assets/javascripts/rails_admin/bootstrap.js +0 -5046
  114. data/vendor/assets/javascripts/rails_admin/flatpickr-with-locales.js +0 -11246
  115. data/vendor/assets/javascripts/rails_admin/jquery-ui/data.js +0 -41
  116. data/vendor/assets/javascripts/rails_admin/jquery-ui/effect.js +0 -1637
  117. data/vendor/assets/javascripts/rails_admin/jquery-ui/ie.js +0 -17
  118. data/vendor/assets/javascripts/rails_admin/jquery-ui/keycode.js +0 -47
  119. data/vendor/assets/javascripts/rails_admin/jquery-ui/position.js +0 -500
  120. data/vendor/assets/javascripts/rails_admin/jquery-ui/safe-active-element.js +0 -42
  121. data/vendor/assets/javascripts/rails_admin/jquery-ui/scroll-parent.js +0 -47
  122. data/vendor/assets/javascripts/rails_admin/jquery-ui/unique-id.js +0 -51
  123. data/vendor/assets/javascripts/rails_admin/jquery-ui/version.js +0 -17
  124. data/vendor/assets/javascripts/rails_admin/jquery-ui/widget.js +0 -735
  125. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/autocomplete.js +0 -689
  126. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/menu.js +0 -680
  127. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/mouse.js +0 -230
  128. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/sortable.js +0 -1561
  129. data/vendor/assets/javascripts/rails_admin/jquery3.js +0 -10881
  130. data/vendor/assets/javascripts/rails_admin/popper.js +0 -1974
  131. data/vendor/assets/stylesheets/rails_admin/bootstrap/_accordion.scss +0 -118
  132. data/vendor/assets/stylesheets/rails_admin/bootstrap/_alert.scss +0 -57
  133. data/vendor/assets/stylesheets/rails_admin/bootstrap/_badge.scss +0 -29
  134. data/vendor/assets/stylesheets/rails_admin/bootstrap/_breadcrumb.scss +0 -28
  135. data/vendor/assets/stylesheets/rails_admin/bootstrap/_button-group.scss +0 -139
  136. data/vendor/assets/stylesheets/rails_admin/bootstrap/_buttons.scss +0 -111
  137. data/vendor/assets/stylesheets/rails_admin/bootstrap/_card.scss +0 -216
  138. data/vendor/assets/stylesheets/rails_admin/bootstrap/_carousel.scss +0 -229
  139. data/vendor/assets/stylesheets/rails_admin/bootstrap/_close.scss +0 -40
  140. data/vendor/assets/stylesheets/rails_admin/bootstrap/_containers.scss +0 -41
  141. data/vendor/assets/stylesheets/rails_admin/bootstrap/_dropdown.scss +0 -240
  142. data/vendor/assets/stylesheets/rails_admin/bootstrap/_forms.scss +0 -9
  143. data/vendor/assets/stylesheets/rails_admin/bootstrap/_functions.scss +0 -302
  144. data/vendor/assets/stylesheets/rails_admin/bootstrap/_grid.scss +0 -33
  145. data/vendor/assets/stylesheets/rails_admin/bootstrap/_helpers.scss +0 -9
  146. data/vendor/assets/stylesheets/rails_admin/bootstrap/_images.scss +0 -42
  147. data/vendor/assets/stylesheets/rails_admin/bootstrap/_list-group.scss +0 -174
  148. data/vendor/assets/stylesheets/rails_admin/bootstrap/_mixins.scss +0 -43
  149. data/vendor/assets/stylesheets/rails_admin/bootstrap/_modal.scss +0 -209
  150. data/vendor/assets/stylesheets/rails_admin/bootstrap/_nav.scss +0 -139
  151. data/vendor/assets/stylesheets/rails_admin/bootstrap/_navbar.scss +0 -335
  152. data/vendor/assets/stylesheets/rails_admin/bootstrap/_offcanvas.scss +0 -83
  153. data/vendor/assets/stylesheets/rails_admin/bootstrap/_pagination.scss +0 -64
  154. data/vendor/assets/stylesheets/rails_admin/bootstrap/_placeholders.scss +0 -51
  155. data/vendor/assets/stylesheets/rails_admin/bootstrap/_popover.scss +0 -158
  156. data/vendor/assets/stylesheets/rails_admin/bootstrap/_progress.scss +0 -48
  157. data/vendor/assets/stylesheets/rails_admin/bootstrap/_reboot.scss +0 -625
  158. data/vendor/assets/stylesheets/rails_admin/bootstrap/_root.scss +0 -54
  159. data/vendor/assets/stylesheets/rails_admin/bootstrap/_spinners.scss +0 -69
  160. data/vendor/assets/stylesheets/rails_admin/bootstrap/_tables.scss +0 -155
  161. data/vendor/assets/stylesheets/rails_admin/bootstrap/_toasts.scss +0 -51
  162. data/vendor/assets/stylesheets/rails_admin/bootstrap/_tooltip.scss +0 -115
  163. data/vendor/assets/stylesheets/rails_admin/bootstrap/_transitions.scss +0 -27
  164. data/vendor/assets/stylesheets/rails_admin/bootstrap/_type.scss +0 -104
  165. data/vendor/assets/stylesheets/rails_admin/bootstrap/_utilities.scss +0 -630
  166. data/vendor/assets/stylesheets/rails_admin/bootstrap/_variables.scss +0 -1641
  167. data/vendor/assets/stylesheets/rails_admin/bootstrap/bootstrap.scss +0 -53
  168. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_floating-labels.scss +0 -63
  169. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_form-check.scss +0 -152
  170. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_form-control.scss +0 -219
  171. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_form-range.scss +0 -91
  172. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_form-select.scss +0 -72
  173. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_form-text.scss +0 -11
  174. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_input-group.scss +0 -121
  175. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_labels.scss +0 -36
  176. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_validation.scss +0 -12
  177. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_clearfix.scss +0 -3
  178. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_colored-links.scss +0 -12
  179. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_position.scss +0 -30
  180. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_ratio.scss +0 -26
  181. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_stacks.scss +0 -15
  182. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_stretched-link.scss +0 -15
  183. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_text-truncation.scss +0 -7
  184. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_visually-hidden.scss +0 -8
  185. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_vr.scss +0 -8
  186. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_alert.scss +0 -11
  187. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_backdrop.scss +0 -14
  188. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_border-radius.scss +0 -78
  189. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_box-shadow.scss +0 -18
  190. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_breakpoints.scss +0 -127
  191. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_buttons.scss +0 -133
  192. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_caret.scss +0 -64
  193. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_clearfix.scss +0 -9
  194. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_color-scheme.scss +0 -7
  195. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_container.scss +0 -9
  196. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_deprecate.scss +0 -10
  197. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_forms.scss +0 -144
  198. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_gradients.scss +0 -47
  199. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_grid.scss +0 -151
  200. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_image.scss +0 -16
  201. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_list-group.scss +0 -24
  202. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_lists.scss +0 -7
  203. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_pagination.scss +0 -31
  204. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_reset-text.scss +0 -17
  205. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_resize.scss +0 -6
  206. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_table-variants.scss +0 -21
  207. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_text-truncate.scss +0 -8
  208. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_transition.scss +0 -26
  209. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_utilities.scss +0 -89
  210. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_visually-hidden.scss +0 -29
  211. data/vendor/assets/stylesheets/rails_admin/bootstrap/utilities/_api.scss +0 -47
  212. data/vendor/assets/stylesheets/rails_admin/bootstrap/vendor/_rfs.scss +0 -354
  213. data/vendor/assets/stylesheets/rails_admin/flatpickr.css +0 -791
  214. data/vendor/assets/stylesheets/rails_admin/font-awesome.scss +0 -6351
@@ -17,8 +17,8 @@ module RailsAdmin
17
17
  scope = model_config.scope
18
18
  auth_scope = @authorization_adapter&.query(auth_scope_key, model_config.abstract_model)
19
19
  scope = scope.merge(auth_scope) if auth_scope
20
- scope = scope.instance_eval(&additional_scope) if additional_scope
21
- get_collection(model_config, scope, pagination)
20
+ scope = get_collection(model_config, scope, pagination)
21
+ additional_scope ? scope.instance_eval(&additional_scope) : scope
22
22
  end
23
23
 
24
24
  private
@@ -72,7 +72,7 @@ module RailsAdmin
72
72
  if field.nil? || field.sortable == false # use default sort, asked field does not exist or is not sortable
73
73
  model_config.list.sort_by
74
74
  else
75
- field.sort_column
75
+ field.sort_order
76
76
  end
77
77
 
78
78
  params[:sort_reverse] ||= 'false'
@@ -75,7 +75,7 @@ module RailsAdmin
75
75
  "admin.actions.#{action.i18n_key}.#{label}",
76
76
  model_label: model_config&.label,
77
77
  model_label_plural: model_config&.label_plural,
78
- object_label: model_config && object.try(model_config.object_label_method),
78
+ object_label: object && model_config&.object_label(object),
79
79
  )
80
80
  end
81
81
 
@@ -147,7 +147,7 @@ module RailsAdmin
147
147
  content_tag(:li, class: ['breadcrumb-item', current_action?(a, am, o) && 'active']) do
148
148
  if current_action?(a, am, o)
149
149
  wording_for(:breadcrumb, a, am, o)
150
- elsif a.http_methods.include?(:get)
150
+ elsif a.linkable?
151
151
  link_to rails_admin.url_for(action: a.action_name, controller: 'rails_admin/main', model_name: am.try(:to_param), id: (o.try(:persisted?) && o.try(:id) || nil)) do
152
152
  wording_for(:breadcrumb, a, am, o)
153
153
  end
@@ -162,7 +162,7 @@ module RailsAdmin
162
162
  # parent => :root, :collection, :member
163
163
  # perf matters here (no action view trickery)
164
164
  def menu_for(parent, abstract_model = nil, object = nil, only_icon = false)
165
- actions = actions(parent, abstract_model, object).select { |a| a.http_methods.include?(:get) && a.show_in_menu }
165
+ actions = actions(parent, abstract_model, object).select { |a| a.linkable? && a.show_in_menu }
166
166
  actions.collect do |action|
167
167
  wording = wording_for(:menu, action)
168
168
  li_class = ['nav-item', 'icon', "#{action.key}_#{parent}_link"].
@@ -209,18 +209,6 @@ module RailsAdmin
209
209
  end
210
210
  end
211
211
 
212
- def handle_asset_dependency_error
213
- yield
214
- rescue LoadError => e
215
- if /sassc/.match?(e.message)
216
- e = e.exception <<~MSG
217
- #{e.message}
218
- RailsAdmin requires the gem sassc-rails, make sure to put `gem 'sassc-rails'` to Gemfile.
219
- MSG
220
- end
221
- raise e
222
- end
223
-
224
212
  # Workaround for https://github.com/rails/rails/issues/31325
225
213
  def image_tag(source, options = {})
226
214
  if %w[ActiveStorage::Variant ActiveStorage::VariantWithRecord ActiveStorage::Preview].include? source.class.to_s
@@ -84,7 +84,9 @@ module RailsAdmin
84
84
  if object.new_record?
85
85
  I18n.t('admin.form.new_model', name: model_label)
86
86
  else
87
- object.send(model_config.object_label_method).presence || "#{model_config.label} ##{object.id}"
87
+ # A record whose label method has nothing to say is named after the
88
+ # model label here, where the rest of the admin uses the class name.
89
+ model_config.object_label(object, "#{model_label} ##{object.id}")
88
90
  end
89
91
 
90
92
  %(<span style="display:none" class="object-infos" data-model-label="#{model_label}" data-object-label="#{CGI.escapeHTML(object_label.to_s)}"></span>).html_safe
@@ -108,11 +110,9 @@ module RailsAdmin
108
110
  end
109
111
 
110
112
  def hidden_field(method, options = {})
111
- if method == :id && object.id.is_a?(Array)
112
- super method, {value: RailsAdmin.config.composite_keys_serializer.serialize(object.id)}
113
- else
114
- super
115
- end
113
+ return super unless method == :id && object.id.is_a?(Array)
114
+
115
+ super method, {value: RailsAdmin.config(object.class).abstract_model.format_id(object.id)}
116
116
  end
117
117
 
118
118
  protected
@@ -149,9 +149,10 @@ module RailsAdmin
149
149
  private
150
150
 
151
151
  def nested_field_association?(field, nested_in)
152
- field.inverse_of.presence && nested_in.presence && field.inverse_of == nested_in.name &&
153
- (@template.instance_variable_get(:@model_config).abstract_model == field.abstract_model ||
154
- field.name == nested_in.inverse_of)
152
+ nested_in.presence &&
153
+ (field.name == nested_in.inverse_of ||
154
+ (field.inverse_of.presence && field.inverse_of == nested_in.name &&
155
+ @template.instance_variable_get(:@model_config).abstract_model == field.abstract_model))
155
156
  end
156
157
  end
157
158
  end
@@ -1,32 +1,15 @@
1
1
  <meta content="IE=edge" http-equiv="X-UA-Compatible">
2
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">
3
+ <meta content="width=device-width, initial-scale=1" name="viewport">
4
4
  <meta content="NONE,NOARCHIVE" name="robots">
5
5
  <meta content="false" name="turbo-prefetch">
6
6
  <%= csrf_meta_tag %>
7
- <% case RailsAdmin::config.asset_source
8
- when :webpacker %>
9
- <%= stylesheet_pack_tag "rails_admin", data: {'turbo-track': 'reload'} %>
10
- <%= javascript_pack_tag "rails_admin", defer: true, data: {'turbo-track': 'reload'} %>
11
- <% when :sprockets %>
12
- <% handle_asset_dependency_error do %>
13
- <%= stylesheet_link_tag "rails_admin/application.css", media: :all, data: {'turbo-track': 'reload'} %>
14
- <%= javascript_include_tag "rails_admin/application.js", defer: true, data: {'turbo-track': 'reload'} %>
15
- <% end %>
16
- <% when :vite %>
17
- <%= vite_javascript_tag "rails_admin", defer: true, data: {'turbo-track': 'reload'} %>
18
- <% when :webpack %>
19
- <%= stylesheet_link_tag "rails_admin.css", media: :all, data: {'turbo-track': 'reload'} %>
20
- <%= javascript_include_tag "rails_admin.js", defer: true, data: {'turbo-track': 'reload'} %>
21
- <% when :importmap %>
22
- <%= stylesheet_link_tag "rails_admin.css", media: :all, data: {'turbo-track': 'reload'} %>
23
- <%= javascript_inline_importmap_tag(RailsAdmin::Engine.importmap.to_json(resolver: self)) %>
24
- <%= javascript_importmap_module_preload_tags(RailsAdmin::Engine.importmap) %>
25
- <%= javascript_importmap_shim_nonce_configuration_tag if respond_to? :javascript_importmap_shim_nonce_configuration_tag %>
26
- <%= javascript_importmap_shim_tag if respond_to? :javascript_importmap_shim_tag %>
27
- <%= # Preload jQuery and make it global, unless jQuery UI fails to initialize
28
- tag.script "import jQuery from 'jquery'; window.jQuery = jQuery;".html_safe, type: "module" %>
29
- <%= javascript_import_module_tag 'rails_admin' %>
30
- <% else
31
- raise "Unknown asset_source: #{RailsAdmin::config.asset_source}"
32
- end %>
7
+ <%= csp_meta_tag %>
8
+ <% asset_source = RailsAdmin.config.asset_source %>
9
+ <% if asset_source.respond_to?(:call) %>
10
+ <%= asset_source.call(self) %>
11
+ <% else %>
12
+ <%= stylesheet_link_tag "rails_admin", media: :all, data: {'turbo-track': 'reload'}, nonce: true %>
13
+ <%= javascript_include_tag "rails_admin", defer: true, data: {'turbo-track': 'reload'}, nonce: true %>
14
+ <% end %>
15
+ <%= render "layouts/rails_admin/head_custom" %>
@@ -0,0 +1,3 @@
1
+ <%# Override this partial in your application to add your own <link>/<script>
2
+ tags (or inline styles/scripts) to the RailsAdmin <head>. It is rendered
3
+ right after the bundled RailsAdmin assets, regardless of asset_source. %>
@@ -17,7 +17,7 @@
17
17
  <% end %>
18
18
  <% if logout_path.present? %>
19
19
  <li class="nav-item">
20
- <%= link_to logout_path, method: logout_method, class: 'nav-link', data: {turbo: 'false'} do %>
20
+ <%= link_to logout_path, class: 'nav-link', data: {turbo_method: logout_method} do %>
21
21
  <span class="badge bg-danger"><%= t('admin.misc.log_out') %></span>
22
22
  <% end %>
23
23
  </li>
@@ -20,7 +20,7 @@
20
20
  <%= t.try :username %>
21
21
  </td>
22
22
  <% if o = abstract_model.try(:get, t.item) %>
23
- <% label = o.send(abstract_model.config.object_label_method) %>
23
+ <% label = abstract_model.config.object_label(o) %>
24
24
  <% if show_action = action(:show, abstract_model, o) %>
25
25
  <td>
26
26
  <%= link_to(label, url_for(action: show_action.action_name, model_name: abstract_model.to_param, id: o.id)) %>
@@ -3,7 +3,7 @@
3
3
  <span class="label label-default">
4
4
  <%= @abstract_model.pretty_name %>
5
5
  </span>
6
- <% wording = object.send(@model_config.object_label_method) %>
6
+ <% wording = @model_config.object_label(object) %>
7
7
  <% if show_action = action(:show, @abstract_model, object) %>
8
8
  <%= link_to(wording, url_for(action: show_action.action_name, model_name: @abstract_model.to_param, id: object.id)) %>
9
9
  <% else %>
@@ -11,13 +11,13 @@
11
11
  <% end %>
12
12
  <ul>
13
13
  <% @abstract_model.each_associated_children(object) do |association, children| %>
14
- <% humanized_association = @abstract_model.model.human_attribute_name association.name %>
14
+ <% humanized_association = @abstract_model.human_attribute_name association.name %>
15
15
  <% limit = children.count > 12 ? 10 : children.count %>
16
16
  <% children.first(limit).each do |child| %>
17
17
  <%= content_tag :li, class: dom_class(child) do %>
18
18
  <% child_config = RailsAdmin.config(child) %>
19
19
  <%= humanized_association.singularize %>
20
- <% wording = child.send(child_config.object_label_method) %>
20
+ <% wording = child_config.object_label(child) %>
21
21
  <% if child.id && (show_action = action(:show, child_config.abstract_model, child)) %>
22
22
  <%= link_to(wording, url_for(action: show_action.action_name, model_name: child_config.abstract_model.to_param, id: child.id)) %>
23
23
  <% else %>
@@ -1,14 +1,10 @@
1
- <% if field.nullable? %>
2
- <div class="btn-group" role="group">
3
- <% {'1': [true, 'btn-outline-success'], '0': [false, 'btn-outline-danger'], '': [nil, 'btn-outline-secondary']}.each do |text, (value, btn_class)| %>
4
- <%= form.radio_button field.method_name, text, field.html_attributes.reverse_merge({ checked: field.form_value == value, required: field.required, class: 'btn-check' }) %>
5
- <%= form.label "#{field.method_name}_#{text}", class: "#{field.css_classes[value]} btn #{btn_class}" do %>
6
- <%= field.labels[value].html_safe %>
7
- <% end %>
1
+ <% cases = {'1': [true, 'btn-outline-success'], '0': [false, 'btn-outline-danger']} %>
2
+ <% cases[:''] = [nil, 'btn-outline-secondary'] if field.nullable? %>
3
+ <div class="btn-group" role="group">
4
+ <% cases.each do |text, (value, btn_class)| %>
5
+ <%= form.radio_button field.method_name, text, field.html_attributes.reverse_merge({ checked: field.form_value == value, required: field.required, class: 'btn-check' }) %>
6
+ <%= form.label "#{field.method_name}_#{text}", class: "#{field.css_classes[value]} btn #{btn_class}" do %>
7
+ <%= field.labels[value].html_safe %>
8
8
  <% end %>
9
- </div>
10
- <% else %>
11
- <div class="col-form-label">
12
- <%= form.send field.view_helper, field.method_name, field.html_attributes.reverse_merge({ value: field.form_value, checked: field.form_value.in?([true, '1']), required: field.required, class: 'form-check-input' }) %>
13
- </div>
14
- <% end %>
9
+ <% end %>
10
+ </div>
@@ -1,22 +1,22 @@
1
1
  <div class="form-actions row justify-content-end my-3">
2
2
  <div class="col-sm-10">
3
3
  <input name="return_to" type="<%= :hidden %>" value="<%= (params[:return_to].presence || request.referer) %>" />
4
- <button class="btn btn-primary" data-disable-with="<%= t("admin.form.save") %>" name="_save" type="submit"<%= ' disabled' unless @action.enabled? %>>
4
+ <button class="btn btn-primary" data-turbo-submits-with="<%= t("admin.form.save") %>" name="_save" type="submit"<%= ' disabled' unless @action.enabled? %>>
5
5
  <i class="fas fa-check"></i>
6
6
  <%= t("admin.form.save") %>
7
7
  </button>
8
8
  <span class="extra_buttons">
9
9
  <% if @action.enabled? && authorized?(:new, @abstract_model) %>
10
- <button class="btn btn-info" data-disable-with="<%= t("admin.form.save_and_add_another") %>" name="_add_another" type="submit">
10
+ <button class="btn btn-info" data-turbo-submits-with="<%= t("admin.form.save_and_add_another") %>" name="_add_another" type="submit">
11
11
  <%= t("admin.form.save_and_add_another") %>
12
12
  </button>
13
13
  <% end %>
14
14
  <% if @action.enabled? && authorized?(:edit, @abstract_model) %>
15
- <button class="btn btn-info" data-disable-with="<%= t("admin.form.save_and_edit") %>" name="_add_edit" type="submit"<%= ' disabled' unless @action.enabled? %>>
15
+ <button class="btn btn-info" data-turbo-submits-with="<%= t("admin.form.save_and_edit") %>" name="_add_edit" type="submit"<%= ' disabled' unless @action.enabled? %>>
16
16
  <%= t("admin.form.save_and_edit") %>
17
17
  </button>
18
18
  <% end %>
19
- <button class="btn btn-light" data-disable-with="<%= t("admin.form.cancel") %>" formnovalidate="<%= true %>" name="_continue" type="submit">
19
+ <button class="btn btn-light" data-turbo-submits-with="<%= t("admin.form.cancel") %>" formnovalidate="<%= true %>" name="_continue" type="submit">
20
20
  <i class="fas fa-times"></i>
21
21
  <%= t("admin.form.cancel") %>
22
22
  </button>
@@ -7,11 +7,11 @@
7
7
  <%= form_tag bulk_delete_path(model_name: @abstract_model.to_param, bulk_ids: @objects.map(&:id)), method: :delete do %>
8
8
  <div class="form-actions">
9
9
  <input name="return_to" type="<%= :hidden %>" value="<%= (params[:return_to].presence || request.referer) %>" />
10
- <button class="btn btn-danger" data-disable-with="<%= t("admin.form.confirmation") %>" type="submit">
10
+ <button class="btn btn-danger" data-turbo-submits-with="<%= t("admin.form.confirmation") %>" type="submit">
11
11
  <i class="fas fa-check"></i>
12
12
  <%= t("admin.form.confirmation") %>
13
13
  </button>
14
- <button class="btn" data-disable-with="<%= t("admin.form.cancel") %>" name="_continue" type="submit">
14
+ <button class="btn" data-turbo-submits-with="<%= t("admin.form.cancel") %>" name="_continue" type="submit">
15
15
  <i class="fas fa-times"></i>
16
16
  <%= t("admin.form.cancel") %>
17
17
  </button>
@@ -20,7 +20,7 @@
20
20
  <% index_path = index_path(model_name: abstract_model.to_param) %>
21
21
  <% row_class = "#{cycle("odd", "even")}#{" link" if index_path} #{abstract_model.param_key}_links" %>
22
22
  <tr class="<%= row_class %>" data-link="<%= index_path %>">
23
- <% last_created = @most_recent_created[abstract_model.model.name] %>
23
+ <% last_created = @most_recent_created[abstract_model.model_name] %>
24
24
  <% active = last_created.try(:today?) %>
25
25
  <td>
26
26
  <span class="show">
@@ -33,11 +33,11 @@
33
33
  <% end %>
34
34
  </td>
35
35
  <td>
36
- <% count = @count[abstract_model.model.name] %>
36
+ <% count = @count[abstract_model.model_name] %>
37
37
  <% percent = count > 0 ? (@max <= 1 ? count : ((Math.log(count+1) * 100.0) / Math.log(@max+1)).to_i) : -1 %>
38
38
  <div class="<%= active ? 'active progress-bar-striped ' : '' %>progress" style="margin-bottom:0px">
39
39
  <div class="bg-<%= get_indicator(percent) %> progress-bar animate-width-to" data-animate-length="<%= ([1.0, percent].max.to_i * 20) %>" data-animate-width-to="<%= [2.0, percent].max.to_i %>%" style="width:2%">
40
- <%= @count[abstract_model.model.name] %>
40
+ <%= @count[abstract_model.model_name] %>
41
41
  </div>
42
42
  </div>
43
43
  </td>
@@ -9,11 +9,11 @@
9
9
  <%= form_for(@object, url: delete_path(model_name: @abstract_model.to_param, id: @object.id), html: {method: "delete"}) do %>
10
10
  <input name="return_to" type="<%= :hidden %>" value="<%= (params[:return_to].presence || request.referer) %>" />
11
11
  <div class="form-actions">
12
- <button class="btn btn-danger" data-disable-with="<%= t("admin.form.confirmation") %>" type="submit">
12
+ <button class="btn btn-danger" data-turbo-submits-with="<%= t("admin.form.confirmation") %>" type="submit">
13
13
  <i class="fas fa-check"></i>
14
14
  <%= t("admin.form.confirmation") %>
15
15
  </button>
16
- <button class="btn" data-disable-with="<%= t("admin.form.cancel") %>" name="_continue" type="submit">
16
+ <button class="btn" data-turbo-submits-with="<%= t("admin.form.cancel") %>" name="_continue" type="submit">
17
17
  <i class="fas fa-times"></i>
18
18
  <%= t("admin.form.cancel") %>
19
19
  </button>
@@ -1,5 +1,5 @@
1
1
  <% params = request.params.except(:action, :controller, :utf8, :page, :per_page, :format, :authenticity_token) %>
2
- <% visible_fields = @model_config.export.with(view: self, object: @abstract_model.model.new, controller: self.controller).visible_fields %>
2
+ <% visible_fields = @model_config.export.with(view: self, object: @abstract_model.dummy_record, controller: self.controller).visible_fields %>
3
3
  <%= form_tag export_path(params.merge(all: true)), method: 'post', class: "main", data: {turbo: false} do %>
4
4
  <input name="send_data" type="hidden" value="true" />
5
5
  <fieldset id="fields_to_export" class="mb-3">
@@ -54,7 +54,7 @@
54
54
  </div>
55
55
  </div>
56
56
  <% visible_fields.select{ |f| f.association? && !f.association.polymorphic? }.each do |field| %>
57
- <% 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? } %>
57
+ <% fields = field.associated_model_config.export.with(controller: self.controller, view: self, object: field.associated_model_config.abstract_model.dummy_record).visible_fields.select{ |f| !f.association? } %>
58
58
  <div class="control-group row">
59
59
  <div class="col-sm-12">
60
60
  <div class="card bg-light my-2 reverse-selection" rel="tooltip" role="button" title="<%= t('admin.export.click_to_reverse_selection') %>">
@@ -10,7 +10,7 @@
10
10
  <div class="col-sm-6">
11
11
  <div class="input-group">
12
12
  <input class="form-control" name="query" placeholder="<%= t("admin.misc.filter") %>" type="search" value="<%= query %>" />
13
- <button class="btn btn-primary" data-disable-with="<%= '<i class="fas fa-sync"></i> ' + t('admin.misc.refresh') %>" type="submit">
13
+ <button class="btn btn-primary" data-turbo-submits-with="<%= '<i class="fas fa-sync"></i> ' + t('admin.misc.refresh') %>" type="submit">
14
14
  <i class="fas fa-sync"></i>
15
15
  <%= t("admin.misc.refresh") %>
16
16
  </button>
@@ -51,7 +51,7 @@
51
51
  </td>
52
52
  <% if @general %>
53
53
  <% if o = @abstract_model.get(object.item) %>
54
- <% label = o.send(@abstract_model.config.object_label_method) %>
54
+ <% label = @abstract_model.config.object_label(o) %>
55
55
  <% if show_action = action(:show, @abstract_model, o) %>
56
56
  <td>
57
57
  <%= link_to(label, url_for(action: show_action.action_name, model_name: @abstract_model.to_param, id: o.id)) %>
@@ -9,7 +9,7 @@
9
9
  export_action = RailsAdmin::Config::Actions.find(:export, { controller: self.controller, abstract_model: @abstract_model })
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
- properties = @model_config.list.with(controller: self.controller, view: self, object: @abstract_model.model.new).fields_for_table
12
+ properties = @model_config.list.with(controller: self.controller, view: self, object: @abstract_model.dummy_record).fields_for_table
13
13
  checkboxes = @model_config.list.checkboxes?
14
14
  table_table_header_count = begin
15
15
  count = checkboxes ? 1 : 0
@@ -44,7 +44,7 @@
44
44
  <% end %>
45
45
  <% end %>
46
46
 
47
- <style>
47
+ <style nonce="<%= content_security_policy_nonce %>">
48
48
  <% properties.select{ |p| p.column_width.present? }.each do |property| %>
49
49
  <%= "#list th.#{property.css_class} { width: #{property.column_width}px; min-width: #{property.column_width}px; }" %>
50
50
  <%= "#list td.#{property.css_class} { max-width: #{property.column_width}px;}" %>
@@ -60,7 +60,7 @@
60
60
  <div class="col-sm-6">
61
61
  <div class="input-group">
62
62
  <input class="form-control" name="query" placeholder="<%= t("admin.misc.filter") %>" type="search" value="<%= query %>" />
63
- <button class="btn btn-primary" data-disable-with="<%= '<i class="fas fa-sync"></i>' + t('admin.misc.refresh') %>" type="submit">
63
+ <button class="btn btn-primary" data-turbo-submits-with="<%= '<i class="fas fa-sync"></i>' + t('admin.misc.refresh') %>" type="submit">
64
64
  <i class="fas fa-sync"></i>
65
65
  <%= t('admin.misc.refresh') %>
66
66
  </button>
@@ -7,11 +7,8 @@ ActiveSupport.on_load(:active_record) do
7
7
  RailsAdmin.config(self, &block)
8
8
  end
9
9
 
10
- def rails_admin_default_object_label_method
11
- new_record? ? "new #{self.class}" : "#{self.class} ##{id}"
12
- end
13
-
14
10
  def safe_send(value)
11
+ RailsAdmin.deprecator.warn('#safe_send is deprecated, please use RailsAdmin::AbstractModel#read.')
15
12
  if has_attribute?(value)
16
13
  read_attribute(value)
17
14
  else
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rails/generators'
4
- require 'rails_admin/version'
5
4
  require File.expand_path('utils', __dir__)
6
5
 
7
6
  module RailsAdmin
@@ -10,7 +9,7 @@ module RailsAdmin
10
9
  include Generators::Utils::InstanceMethods
11
10
 
12
11
  argument :_namespace, type: :string, required: false, desc: 'RailsAdmin url namespace'
13
- class_option :asset, type: :string, required: false, default: nil, desc: 'Asset delivery method [options: webpacker, webpack, sprockets, importmap, vite]'
12
+ class_option :asset, type: :string, required: false, default: nil, desc: 'Asset delivery method [options: propshaft, sprockets, external]'
14
13
  desc 'RailsAdmin installation generator'
15
14
 
16
15
  def install
@@ -27,116 +26,62 @@ module RailsAdmin
27
26
  end
28
27
  display "Using [#{asset}] for asset delivery method"
29
28
  case asset
30
- when 'webpack'
31
- configure_for_webpack
32
- when 'importmap'
33
- configure_for_importmap
34
- when 'webpacker'
35
- configure_for_webpacker5
36
- when 'vite'
37
- configure_for_vite
38
- when 'sprockets'
39
- configure_for_sprockets
29
+ when 'sprockets', 'propshaft'
30
+ # RailsAdmin serves the bundle shipped in the gem; nothing to configure.
31
+ when 'external'
32
+ configure_for_external
40
33
  else
41
- raise "Unknown asset source: #{asset}"
34
+ raise "Unknown asset source: #{asset.inspect}. Use propshaft, sprockets or external."
42
35
  end
43
36
  end
44
37
 
45
38
  private
46
39
 
47
40
  def asset
48
- return options['asset'] if options['asset']
41
+ @asset ||= normalize_asset(options['asset'] || detect_asset)
42
+ end
49
43
 
50
- if defined?(Webpacker)
51
- 'webpacker'
52
- elsif Rails.root.join('webpack.config.js').exist?
53
- 'webpack'
54
- elsif Rails.root.join('config/importmap.rb').exist?
55
- 'importmap'
56
- elsif defined?(ViteRuby)
57
- 'vite'
44
+ def normalize_asset(value)
45
+ case value.to_s
46
+ when 'webpack', 'vite', 'shakapacker', 'jsbundling', 'cssbundling'
47
+ display "[#{value}] builds its own assets; configuring :external", :yellow
48
+ 'external'
49
+ when 'webpacker', 'importmap'
50
+ display "[#{value}] is no longer supported; RailsAdmin ships a prebuilt bundle", :yellow
51
+ detect_asset
58
52
  else
59
- 'sprockets'
53
+ value.to_s
60
54
  end
61
55
  end
62
56
 
63
- def configure_for_sprockets
64
- gem 'sassc-rails'
65
- end
66
-
67
- def configure_for_webpacker5
68
- run "yarn add rails_admin@#{RailsAdmin::Version.js}"
69
- template 'rails_admin.webpacker.js', 'app/javascript/packs/rails_admin.js'
70
- template 'rails_admin.scss.erb', 'app/javascript/stylesheets/rails_admin.scss'
71
- # To work around https://github.com/railsadminteam/rails_admin/issues/3565
72
- add_package_json_field('resolutions', {'rails_admin/@fortawesome/fontawesome-free' => '^5.15.0'})
73
- end
74
-
75
- def configure_for_vite
76
- vite_source_code_dir = ViteRuby.config.source_code_dir
77
- run "yarn add rails_admin@#{RailsAdmin::Version.js} sass"
78
- template('rails_admin.vite.js', File.join(vite_source_code_dir, 'entrypoints', 'rails_admin.js'))
79
- @fa_font_path = '@fortawesome/fontawesome-free/webfonts'
80
- template('rails_admin.scss.erb', File.join(vite_source_code_dir, 'stylesheets', 'rails_admin.scss'))
81
- end
82
-
83
- def configure_for_webpack
84
- run "yarn add rails_admin@#{RailsAdmin::Version.js}"
85
- template 'rails_admin.js', 'app/javascript/rails_admin.js'
86
- webpack_config = File.join(destination_root, 'webpack.config.js')
87
- marker = %r{application: ["']./app/javascript/application.js["']}
88
- if File.exist?(webpack_config) && File.read(webpack_config) =~ marker
89
- insert_into_file 'webpack.config.js', %(,\n rails_admin: "./app/javascript/rails_admin.js"), after: marker
57
+ def detect_asset
58
+ if defined?(Propshaft)
59
+ 'propshaft'
60
+ elsif Rails.root.join('webpack.config.js').exist? || defined?(ViteRuby)
61
+ 'external'
90
62
  else
91
- say 'Add `rails_admin: "./app/javascript/rails_admin.js"` to the entry section in your webpack.config.js.', :red
63
+ 'sprockets'
92
64
  end
93
- setup_css({'build' => 'webpack --config webpack.config.js'})
94
65
  end
95
66
 
96
- def configure_for_importmap
97
- run "yarn add rails_admin@#{RailsAdmin::Version.js}"
67
+ def configure_for_external
98
68
  template 'rails_admin.js', 'app/javascript/rails_admin.js'
99
- require_relative 'importmap_formatter'
100
- add_file 'config/importmap.rails_admin.rb', ImportmapFormatter.new.format
101
- setup_css
102
- end
69
+ @fa_font_path = 'rails_admin'
70
+ # Not app/javascript: jsbundling builds that whole directory as JavaScript.
71
+ template 'rails_admin.scss.erb', 'app/assets/stylesheets/rails_admin.scss'
72
+ say <<~INSTRUCTIONS, :yellow
73
+ Add the `rails_admin` npm package, then wire the two entrypoints into the
74
+ build scripts your bundler runs, so they output app/assets/builds/rails_admin.js
75
+ and app/assets/builds/rails_admin.css. Going through the scripts matters:
76
+ that is what `rails assets:precompile` runs on deploy.
103
77
 
104
- def setup_css(additional_script_entries = {})
105
- gem 'cssbundling-rails'
106
- rake 'css:install:sass'
78
+ With the esbuild and sass setup jsbundling-rails and cssbundling-rails
79
+ generate, app/javascript/rails_admin.js is already covered by the "build"
80
+ script's app/javascript/*.* glob, and the stylesheet needs one more pair in
81
+ "build:css" - adapt it if you build your CSS some other way:
107
82
 
108
- @fa_font_path = '.'
109
- template 'rails_admin.scss.erb', 'app/assets/stylesheets/rails_admin.scss'
110
- asset_config = %{Rails.application.config.assets.paths << Rails.root.join("node_modules/@fortawesome/fontawesome-free/webfonts")\n}
111
- if File.exist? File.join(destination_root, 'config/initializers/assets.rb')
112
- append_to_file 'config/initializers/assets.rb', asset_config
113
- else
114
- add_file 'config/initializers/assets.rb', asset_config
115
- end
116
- add_package_json_field('scripts', additional_script_entries.merge({'build:css' => 'sass ./app/assets/stylesheets/rails_admin.scss:./app/assets/builds/rails_admin.css --no-source-map --load-path=node_modules'}), <<~INSTRUCTION)
117
- Taking 'build:css' as an example, if you're already have application.sass.css for the sass build, the resulting script would look like:
118
83
  sass ./app/assets/stylesheets/application.sass.scss:./app/assets/builds/application.css ./app/assets/stylesheets/rails_admin.scss:./app/assets/builds/rails_admin.css --no-source-map --load-path=node_modules
119
- INSTRUCTION
120
- end
121
-
122
- def add_package_json_field(name, entries, instruction = nil)
123
- display "Add #{name} to package.json"
124
- package = begin
125
- JSON.parse(File.read(File.join(destination_root, 'package.json')))
126
- rescue Errno::ENOENT, JSON::ParserError
127
- {}
128
- end
129
- if package[name] && (package[name].keys & entries.keys).any?
130
- say <<~MESSAGE, :red
131
- You need to merge "#{name}": #{JSON.pretty_generate(entries)} into the existing #{name} in your package.json.#{instruction && "\n#{instruction}"}
132
- MESSAGE
133
- else
134
- package[name] ||= {}
135
- entries.each do |entry, value|
136
- package[name][entry] = value
137
- end
138
- add_file 'package.json', "#{JSON.pretty_generate(package)}\n"
139
- end
84
+ INSTRUCTIONS
140
85
  end
141
86
  end
142
87
  end
@@ -1 +1 @@
1
- <%= @fa_font_path ? %{$fa-font-path: "#{@fa_font_path}";\n} : '' %>@import "rails_admin/src/rails_admin/styles/base";
1
+ <%= @fa_font_path ? %($fa-font-path: "#{@fa_font_path}";\n) : '' %>@import "rails_admin/src/rails_admin/styles/base";