rails_admin 3.3.1 → 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 (213) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -3
  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 -14
  8. data/app/helpers/rails_admin/application_helper.rb +3 -15
  9. data/app/helpers/rails_admin/form_builder.rb +6 -6
  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/property.rb +7 -0
  28. data/lib/rails_admin/adapters/active_record/reflection.rb +87 -0
  29. data/lib/rails_admin/adapters/active_record/repository.rb +216 -0
  30. data/lib/rails_admin/adapters/active_record/statement_builder.rb +148 -0
  31. data/lib/rails_admin/adapters/active_record/where_builder.rb +40 -0
  32. data/lib/rails_admin/adapters/active_record.rb +7 -360
  33. data/lib/rails_admin/adapters/mongoid/extension.rb +16 -6
  34. data/lib/rails_admin/adapters/mongoid/property.rb +7 -0
  35. data/lib/rails_admin/adapters/mongoid/reflection.rb +58 -0
  36. data/lib/rails_admin/adapters/mongoid/repository.rb +237 -0
  37. data/lib/rails_admin/adapters/mongoid/statement_builder.rb +93 -0
  38. data/lib/rails_admin/adapters/mongoid.rb +7 -305
  39. data/lib/rails_admin/adapters/reflection.rb +105 -0
  40. data/lib/rails_admin/adapters/repository.rb +169 -0
  41. data/lib/rails_admin/adapters/statement_builder.rb +109 -0
  42. data/lib/rails_admin/adapters.rb +94 -0
  43. data/lib/rails_admin/config/actions/base.rb +8 -0
  44. data/lib/rails_admin/config/actions/bulk_delete.rb +4 -4
  45. data/lib/rails_admin/config/actions/dashboard.rb +1 -1
  46. data/lib/rails_admin/config/actions/edit.rb +3 -2
  47. data/lib/rails_admin/config/actions/export.rb +1 -2
  48. data/lib/rails_admin/config/actions/index.rb +3 -3
  49. data/lib/rails_admin/config/actions/new.rb +3 -2
  50. data/lib/rails_admin/config/actions/show.rb +1 -1
  51. data/lib/rails_admin/config/configurable.rb +3 -2
  52. data/lib/rails_admin/config/fields/association.rb +9 -8
  53. data/lib/rails_admin/config/fields/base.rb +55 -37
  54. data/lib/rails_admin/config/fields/collection_association.rb +2 -2
  55. data/lib/rails_admin/config/fields/factories/carrierwave.rb +35 -20
  56. data/lib/rails_admin/config/fields/factories/dragonfly.rb +30 -18
  57. data/lib/rails_admin/config/fields/factories/enum.rb +14 -8
  58. data/lib/rails_admin/config/fields/factories/paperclip.rb +29 -19
  59. data/lib/rails_admin/config/fields/factories/shrine.rb +19 -8
  60. data/lib/rails_admin/config/fields/singular_association.rb +6 -1
  61. data/lib/rails_admin/config/fields/types/active_record_enum.rb +3 -7
  62. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +8 -4
  63. data/lib/rails_admin/config/fields/types/bson_object_id.rb +1 -1
  64. data/lib/rails_admin/config/fields/types/datetime.rb +0 -4
  65. data/lib/rails_admin/config/fields/types/dragonfly.rb +1 -1
  66. data/lib/rails_admin/config/fields/types/enum.rb +11 -2
  67. data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +0 -2
  68. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +4 -4
  69. data/lib/rails_admin/config/fields/types/time.rb +1 -1
  70. data/lib/rails_admin/config/model.rb +27 -5
  71. data/lib/rails_admin/config/sections/list.rb +0 -8
  72. data/lib/rails_admin/config.rb +7 -21
  73. data/lib/rails_admin/criteria/path.rb +66 -0
  74. data/lib/rails_admin/criteria/period.rb +67 -0
  75. data/lib/rails_admin/engine.rb +11 -15
  76. data/lib/rails_admin/extensions/pundit/authorization_adapter.rb +2 -3
  77. data/lib/rails_admin/extensions/url_for_extension.rb +8 -0
  78. data/lib/rails_admin/support/asset_source.rb +42 -0
  79. data/lib/rails_admin/support/composite_keys_serializer.rb +28 -2
  80. data/lib/rails_admin/support/csv_converter.rb +3 -10
  81. data/lib/rails_admin/version.rb +8 -7
  82. data/lib/rails_admin.rb +7 -1
  83. data/lib/tasks/assets.rake +23 -0
  84. data/package.json +12 -7
  85. data/src/rails_admin/base.js +18 -15
  86. data/src/rails_admin/filter-box.js +7 -4
  87. data/src/rails_admin/filtering-multiselect.js +1 -1
  88. data/src/rails_admin/filtering-select.js +8 -8
  89. data/src/rails_admin/flatpickr.js +14 -0
  90. data/src/rails_admin/remote-form.js +74 -48
  91. data/src/rails_admin/styles/base/theming.scss +48 -25
  92. data/src/rails_admin/styles/base.scss +25 -1
  93. data/src/rails_admin/styles/filtering-select.scss +23 -62
  94. data/src/rails_admin/ui.js +1 -1
  95. data/src/rails_admin/vendor/jquery_nested_form.js +4 -4
  96. data/src/rails_admin/widgets.js +44 -11
  97. metadata +30 -124
  98. data/app/assets/javascripts/rails_admin/application.js.erb +0 -30
  99. data/app/assets/javascripts/rails_admin/custom/ui.js +0 -1
  100. data/app/assets/stylesheets/rails_admin/application.scss.erb +0 -35
  101. data/app/assets/stylesheets/rails_admin/custom/mixins.scss +0 -11
  102. data/app/assets/stylesheets/rails_admin/custom/theming.scss +0 -13
  103. data/app/assets/stylesheets/rails_admin/custom/variables.scss +0 -15
  104. data/lib/generators/rails_admin/importmap_formatter.rb +0 -29
  105. data/lib/generators/rails_admin/templates/rails_admin.vite.js +0 -2
  106. data/lib/generators/rails_admin/templates/rails_admin.webpacker.js +0 -2
  107. data/lib/rails_admin/adapters/active_record/object_extension.rb +0 -13
  108. data/lib/rails_admin/adapters/mongoid/object_extension.rb +0 -29
  109. data/lib/rails_admin/support/es_module_processor.rb +0 -23
  110. data/lib/rails_admin/support/serialization_schema.rb +0 -72
  111. data/vendor/assets/fonts/rails_admin/fa-solid-900.ttf +0 -0
  112. data/vendor/assets/javascripts/rails_admin/bootstrap.js +0 -5046
  113. data/vendor/assets/javascripts/rails_admin/flatpickr-with-locales.js +0 -11246
  114. data/vendor/assets/javascripts/rails_admin/jquery-ui/data.js +0 -41
  115. data/vendor/assets/javascripts/rails_admin/jquery-ui/effect.js +0 -1637
  116. data/vendor/assets/javascripts/rails_admin/jquery-ui/ie.js +0 -17
  117. data/vendor/assets/javascripts/rails_admin/jquery-ui/keycode.js +0 -47
  118. data/vendor/assets/javascripts/rails_admin/jquery-ui/position.js +0 -500
  119. data/vendor/assets/javascripts/rails_admin/jquery-ui/safe-active-element.js +0 -42
  120. data/vendor/assets/javascripts/rails_admin/jquery-ui/scroll-parent.js +0 -47
  121. data/vendor/assets/javascripts/rails_admin/jquery-ui/unique-id.js +0 -51
  122. data/vendor/assets/javascripts/rails_admin/jquery-ui/version.js +0 -17
  123. data/vendor/assets/javascripts/rails_admin/jquery-ui/widget.js +0 -735
  124. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/autocomplete.js +0 -689
  125. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/menu.js +0 -680
  126. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/mouse.js +0 -230
  127. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/sortable.js +0 -1561
  128. data/vendor/assets/javascripts/rails_admin/jquery3.js +0 -10881
  129. data/vendor/assets/javascripts/rails_admin/popper.js +0 -1974
  130. data/vendor/assets/stylesheets/rails_admin/bootstrap/_accordion.scss +0 -118
  131. data/vendor/assets/stylesheets/rails_admin/bootstrap/_alert.scss +0 -57
  132. data/vendor/assets/stylesheets/rails_admin/bootstrap/_badge.scss +0 -29
  133. data/vendor/assets/stylesheets/rails_admin/bootstrap/_breadcrumb.scss +0 -28
  134. data/vendor/assets/stylesheets/rails_admin/bootstrap/_button-group.scss +0 -139
  135. data/vendor/assets/stylesheets/rails_admin/bootstrap/_buttons.scss +0 -111
  136. data/vendor/assets/stylesheets/rails_admin/bootstrap/_card.scss +0 -216
  137. data/vendor/assets/stylesheets/rails_admin/bootstrap/_carousel.scss +0 -229
  138. data/vendor/assets/stylesheets/rails_admin/bootstrap/_close.scss +0 -40
  139. data/vendor/assets/stylesheets/rails_admin/bootstrap/_containers.scss +0 -41
  140. data/vendor/assets/stylesheets/rails_admin/bootstrap/_dropdown.scss +0 -240
  141. data/vendor/assets/stylesheets/rails_admin/bootstrap/_forms.scss +0 -9
  142. data/vendor/assets/stylesheets/rails_admin/bootstrap/_functions.scss +0 -302
  143. data/vendor/assets/stylesheets/rails_admin/bootstrap/_grid.scss +0 -33
  144. data/vendor/assets/stylesheets/rails_admin/bootstrap/_helpers.scss +0 -9
  145. data/vendor/assets/stylesheets/rails_admin/bootstrap/_images.scss +0 -42
  146. data/vendor/assets/stylesheets/rails_admin/bootstrap/_list-group.scss +0 -174
  147. data/vendor/assets/stylesheets/rails_admin/bootstrap/_mixins.scss +0 -43
  148. data/vendor/assets/stylesheets/rails_admin/bootstrap/_modal.scss +0 -209
  149. data/vendor/assets/stylesheets/rails_admin/bootstrap/_nav.scss +0 -139
  150. data/vendor/assets/stylesheets/rails_admin/bootstrap/_navbar.scss +0 -335
  151. data/vendor/assets/stylesheets/rails_admin/bootstrap/_offcanvas.scss +0 -83
  152. data/vendor/assets/stylesheets/rails_admin/bootstrap/_pagination.scss +0 -64
  153. data/vendor/assets/stylesheets/rails_admin/bootstrap/_placeholders.scss +0 -51
  154. data/vendor/assets/stylesheets/rails_admin/bootstrap/_popover.scss +0 -158
  155. data/vendor/assets/stylesheets/rails_admin/bootstrap/_progress.scss +0 -48
  156. data/vendor/assets/stylesheets/rails_admin/bootstrap/_reboot.scss +0 -625
  157. data/vendor/assets/stylesheets/rails_admin/bootstrap/_root.scss +0 -54
  158. data/vendor/assets/stylesheets/rails_admin/bootstrap/_spinners.scss +0 -69
  159. data/vendor/assets/stylesheets/rails_admin/bootstrap/_tables.scss +0 -155
  160. data/vendor/assets/stylesheets/rails_admin/bootstrap/_toasts.scss +0 -51
  161. data/vendor/assets/stylesheets/rails_admin/bootstrap/_tooltip.scss +0 -115
  162. data/vendor/assets/stylesheets/rails_admin/bootstrap/_transitions.scss +0 -27
  163. data/vendor/assets/stylesheets/rails_admin/bootstrap/_type.scss +0 -104
  164. data/vendor/assets/stylesheets/rails_admin/bootstrap/_utilities.scss +0 -630
  165. data/vendor/assets/stylesheets/rails_admin/bootstrap/_variables.scss +0 -1641
  166. data/vendor/assets/stylesheets/rails_admin/bootstrap/bootstrap.scss +0 -53
  167. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_floating-labels.scss +0 -63
  168. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_form-check.scss +0 -152
  169. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_form-control.scss +0 -219
  170. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_form-range.scss +0 -91
  171. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_form-select.scss +0 -72
  172. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_form-text.scss +0 -11
  173. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_input-group.scss +0 -121
  174. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_labels.scss +0 -36
  175. data/vendor/assets/stylesheets/rails_admin/bootstrap/forms/_validation.scss +0 -12
  176. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_clearfix.scss +0 -3
  177. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_colored-links.scss +0 -12
  178. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_position.scss +0 -30
  179. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_ratio.scss +0 -26
  180. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_stacks.scss +0 -15
  181. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_stretched-link.scss +0 -15
  182. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_text-truncation.scss +0 -7
  183. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_visually-hidden.scss +0 -8
  184. data/vendor/assets/stylesheets/rails_admin/bootstrap/helpers/_vr.scss +0 -8
  185. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_alert.scss +0 -11
  186. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_backdrop.scss +0 -14
  187. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_border-radius.scss +0 -78
  188. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_box-shadow.scss +0 -18
  189. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_breakpoints.scss +0 -127
  190. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_buttons.scss +0 -133
  191. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_caret.scss +0 -64
  192. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_clearfix.scss +0 -9
  193. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_color-scheme.scss +0 -7
  194. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_container.scss +0 -9
  195. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_deprecate.scss +0 -10
  196. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_forms.scss +0 -144
  197. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_gradients.scss +0 -47
  198. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_grid.scss +0 -151
  199. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_image.scss +0 -16
  200. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_list-group.scss +0 -24
  201. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_lists.scss +0 -7
  202. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_pagination.scss +0 -31
  203. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_reset-text.scss +0 -17
  204. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_resize.scss +0 -6
  205. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_table-variants.scss +0 -21
  206. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_text-truncate.scss +0 -8
  207. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_transition.scss +0 -26
  208. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_utilities.scss +0 -89
  209. data/vendor/assets/stylesheets/rails_admin/bootstrap/mixins/_visually-hidden.scss +0 -29
  210. data/vendor/assets/stylesheets/rails_admin/bootstrap/utilities/_api.scss +0 -47
  211. data/vendor/assets/stylesheets/rails_admin/bootstrap/vendor/_rfs.scss +0 -354
  212. data/vendor/assets/stylesheets/rails_admin/flatpickr.css +0 -791
  213. 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'
@@ -94,17 +94,6 @@ module RailsAdmin
94
94
  model_config.send(action).with(controller: self, view: view_context, object: @object).visible_fields
95
95
  end
96
96
 
97
- # Memoized, as export renders through index, which switches @action
98
- def serialization_schema
99
- @serialization_schema ||= begin
100
- section = %i[export show].include?(@action.key) ? @model_config.send(@action.key) : @model_config.list
101
- RailsAdmin::SerializationSchema.new(
102
- section.with(controller: self, view: view_context, object: @object || @abstract_model.model.new),
103
- include_associations: @action.key == :export,
104
- )
105
- end
106
- end
107
-
108
97
  def sanitize_params_for!(action, model_config = @model_config, target_params = params[@abstract_model.param_key])
109
98
  return unless target_params.present?
110
99
 
@@ -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
@@ -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";