rails_admin 3.0.0 → 3.1.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.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Rakefile +2 -0
- data/app/controllers/rails_admin/application_controller.rb +2 -0
- data/app/controllers/rails_admin/main_controller.rb +7 -13
- data/app/helpers/rails_admin/application_helper.rb +8 -4
- data/app/helpers/rails_admin/form_builder.rb +10 -0
- data/app/helpers/rails_admin/main_helper.rb +2 -0
- data/app/views/layouts/rails_admin/_head.html.erb +9 -0
- data/app/views/layouts/rails_admin/_secondary_navigation.html.erb +3 -1
- data/app/views/layouts/rails_admin/application.html.erb +1 -1
- data/app/views/rails_admin/main/_form_filtering_multiselect.html.erb +2 -2
- data/app/views/rails_admin/main/_form_filtering_select.html.erb +1 -1
- data/app/views/rails_admin/main/index.html.erb +1 -1
- data/config/initializers/active_record_extensions.rb +25 -0
- data/config/initializers/mongoid_extensions.rb +2 -0
- data/config/routes.rb +2 -0
- data/lib/generators/rails_admin/importmap_formatter.rb +28 -0
- data/lib/generators/rails_admin/install_generator.rb +68 -9
- data/lib/generators/rails_admin/templates/rails_admin.js +1 -0
- data/lib/generators/rails_admin/templates/rails_admin.scss.erb +1 -0
- data/lib/generators/rails_admin/templates/rails_admin.webpacker.js +2 -0
- data/lib/generators/rails_admin/utils.rb +2 -0
- data/lib/rails_admin/abstract_model.rb +9 -2
- data/lib/rails_admin/adapters/active_record/association.rb +10 -0
- data/lib/rails_admin/adapters/active_record/object_extension.rb +2 -0
- data/lib/rails_admin/adapters/active_record/property.rb +2 -0
- data/lib/rails_admin/adapters/active_record.rb +25 -2
- data/lib/rails_admin/adapters/composite_primary_keys/association.rb +45 -0
- data/lib/rails_admin/adapters/composite_primary_keys.rb +40 -0
- data/lib/rails_admin/adapters/mongoid/association.rb +14 -4
- data/lib/rails_admin/adapters/mongoid/bson.rb +2 -0
- data/lib/rails_admin/adapters/mongoid/extension.rb +2 -0
- data/lib/rails_admin/adapters/mongoid/object_extension.rb +2 -0
- data/lib/rails_admin/adapters/mongoid/property.rb +2 -0
- data/lib/rails_admin/adapters/mongoid.rb +3 -1
- data/lib/rails_admin/config/actions/base.rb +2 -0
- data/lib/rails_admin/config/actions/bulk_delete.rb +2 -0
- data/lib/rails_admin/config/actions/dashboard.rb +2 -0
- data/lib/rails_admin/config/actions/delete.rb +2 -0
- data/lib/rails_admin/config/actions/edit.rb +2 -0
- data/lib/rails_admin/config/actions/export.rb +2 -0
- data/lib/rails_admin/config/actions/history_index.rb +2 -0
- data/lib/rails_admin/config/actions/history_show.rb +2 -0
- data/lib/rails_admin/config/actions/index.rb +2 -0
- data/lib/rails_admin/config/actions/new.rb +2 -0
- data/lib/rails_admin/config/actions/show.rb +2 -0
- data/lib/rails_admin/config/actions/show_in_app.rb +2 -0
- data/lib/rails_admin/config/actions.rb +2 -0
- data/lib/rails_admin/config/configurable.rb +2 -0
- data/lib/rails_admin/config/fields/association.rb +2 -0
- data/lib/rails_admin/config/fields/base.rb +24 -8
- data/lib/rails_admin/config/fields/factories/action_text.rb +2 -0
- data/lib/rails_admin/config/fields/factories/active_storage.rb +2 -0
- data/lib/rails_admin/config/fields/factories/association.rb +6 -5
- data/lib/rails_admin/config/fields/factories/carrierwave.rb +2 -0
- data/lib/rails_admin/config/fields/factories/devise.rb +2 -0
- data/lib/rails_admin/config/fields/factories/dragonfly.rb +2 -0
- data/lib/rails_admin/config/fields/factories/enum.rb +2 -0
- data/lib/rails_admin/config/fields/factories/paperclip.rb +2 -0
- data/lib/rails_admin/config/fields/factories/password.rb +2 -0
- data/lib/rails_admin/config/fields/factories/shrine.rb +2 -0
- data/lib/rails_admin/config/fields/group.rb +2 -0
- data/lib/rails_admin/config/fields/types/action_text.rb +2 -0
- data/lib/rails_admin/config/fields/types/active_record_enum.rb +2 -0
- data/lib/rails_admin/config/fields/types/active_storage.rb +2 -0
- data/lib/rails_admin/config/fields/types/all.rb +3 -0
- data/lib/rails_admin/config/fields/types/belongs_to_association.rb +3 -5
- data/lib/rails_admin/config/fields/types/boolean.rb +3 -1
- data/lib/rails_admin/config/fields/types/bson_object_id.rb +2 -0
- data/lib/rails_admin/config/fields/types/carrierwave.rb +2 -0
- data/lib/rails_admin/config/fields/types/citext.rb +2 -0
- data/lib/rails_admin/config/fields/types/ck_editor.rb +2 -0
- data/lib/rails_admin/config/fields/types/code_mirror.rb +2 -0
- data/lib/rails_admin/config/fields/types/color.rb +2 -0
- data/lib/rails_admin/config/fields/types/composite_keys_belongs_to_association.rb +31 -0
- data/lib/rails_admin/config/fields/types/date.rb +2 -0
- data/lib/rails_admin/config/fields/types/datetime.rb +2 -0
- data/lib/rails_admin/config/fields/types/decimal.rb +2 -0
- data/lib/rails_admin/config/fields/types/dragonfly.rb +2 -0
- data/lib/rails_admin/config/fields/types/enum.rb +2 -0
- data/lib/rails_admin/config/fields/types/file_upload.rb +2 -0
- data/lib/rails_admin/config/fields/types/float.rb +2 -0
- data/lib/rails_admin/config/fields/types/froala.rb +2 -0
- data/lib/rails_admin/config/fields/types/has_and_belongs_to_many_association.rb +2 -0
- data/lib/rails_admin/config/fields/types/has_many_association.rb +2 -0
- data/lib/rails_admin/config/fields/types/has_one_association.rb +3 -1
- data/lib/rails_admin/config/fields/types/hidden.rb +2 -0
- data/lib/rails_admin/config/fields/types/inet.rb +2 -0
- data/lib/rails_admin/config/fields/types/integer.rb +2 -0
- data/lib/rails_admin/config/fields/types/json.rb +2 -0
- data/lib/rails_admin/config/fields/types/multiple_active_storage.rb +10 -0
- data/lib/rails_admin/config/fields/types/multiple_carrierwave.rb +2 -0
- data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +2 -0
- data/lib/rails_admin/config/fields/types/numeric.rb +2 -0
- data/lib/rails_admin/config/fields/types/paperclip.rb +2 -0
- data/lib/rails_admin/config/fields/types/password.rb +2 -0
- data/lib/rails_admin/config/fields/types/polymorphic_association.rb +2 -0
- data/lib/rails_admin/config/fields/types/serialized.rb +2 -0
- data/lib/rails_admin/config/fields/types/shrine.rb +2 -0
- data/lib/rails_admin/config/fields/types/simple_mde.rb +2 -0
- data/lib/rails_admin/config/fields/types/string.rb +2 -0
- data/lib/rails_admin/config/fields/types/string_like.rb +2 -0
- data/lib/rails_admin/config/fields/types/text.rb +2 -0
- data/lib/rails_admin/config/fields/types/time.rb +2 -0
- data/lib/rails_admin/config/fields/types/timestamp.rb +2 -0
- data/lib/rails_admin/config/fields/types/uuid.rb +2 -0
- data/lib/rails_admin/config/fields/types/wysihtml5.rb +2 -0
- data/lib/rails_admin/config/fields/types.rb +2 -0
- data/lib/rails_admin/config/fields.rb +3 -1
- data/lib/rails_admin/config/groupable.rb +2 -0
- data/lib/rails_admin/config/has_description.rb +2 -0
- data/lib/rails_admin/config/has_fields.rb +3 -1
- data/lib/rails_admin/config/has_groups.rb +2 -0
- data/lib/rails_admin/config/hideable.rb +2 -0
- data/lib/rails_admin/config/inspectable.rb +2 -0
- data/lib/rails_admin/config/model.rb +2 -0
- data/lib/rails_admin/config/proxyable/proxy.rb +2 -0
- data/lib/rails_admin/config/proxyable.rb +2 -0
- data/lib/rails_admin/config/sections/base.rb +2 -0
- data/lib/rails_admin/config/sections/create.rb +2 -0
- data/lib/rails_admin/config/sections/edit.rb +2 -0
- data/lib/rails_admin/config/sections/export.rb +2 -0
- data/lib/rails_admin/config/sections/list.rb +2 -0
- data/lib/rails_admin/config/sections/modal.rb +2 -0
- data/lib/rails_admin/config/sections/nested.rb +2 -0
- data/lib/rails_admin/config/sections/show.rb +2 -0
- data/lib/rails_admin/config/sections/update.rb +2 -0
- data/lib/rails_admin/config/sections.rb +2 -0
- data/lib/rails_admin/config.rb +7 -1
- data/lib/rails_admin/engine.rb +28 -17
- data/lib/rails_admin/extension.rb +2 -0
- data/lib/rails_admin/extensions/cancancan/authorization_adapter.rb +2 -0
- data/lib/rails_admin/extensions/cancancan.rb +2 -0
- data/lib/rails_admin/extensions/controller_extension.rb +2 -0
- data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +3 -1
- data/lib/rails_admin/extensions/paper_trail.rb +2 -0
- data/lib/rails_admin/extensions/pundit/authorization_adapter.rb +2 -0
- data/lib/rails_admin/extensions/pundit.rb +2 -0
- data/lib/rails_admin/support/csv_converter.rb +2 -1
- data/lib/rails_admin/support/datetime.rb +3 -1
- data/lib/rails_admin/support/esmodule_preprocessor.rb +4 -0
- data/lib/rails_admin/support/hash_helper.rb +2 -0
- data/lib/rails_admin/version.rb +4 -2
- data/lib/rails_admin.rb +3 -1
- data/lib/tasks/rails_admin.rake +2 -0
- data/package.json +1 -1
- data/src/rails_admin/base.js +13 -1
- data/src/rails_admin/filtering-multiselect.js +5 -10
- data/src/rails_admin/filtering-select.js +2 -2
- data/src/rails_admin/nested-form-hooks.js +1 -1
- data/src/rails_admin/remote-form.js +4 -5
- data/src/rails_admin/styles/base/theming.scss +10 -0
- data/src/rails_admin/styles/base.scss +5 -5
- data/src/rails_admin/ui.js +1 -1
- data/src/rails_admin/widgets.js +2 -2
- data/vendor/assets/javascripts/rails_admin/jquery3.js +118 -109
- metadata +11 -7
- data/lib/generators/rails_admin/templates/rails_admin.js.erb +0 -2
- data/lib/generators/rails_admin/templates/rails_admin.scss +0 -1
- data/lib/generators/rails_admin/templates/webpack.config.js +0 -29
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2594ac2920ab0902ebfd266356904760c4cdfe6160dbc0e7a8924a3351e1835a
|
|
4
|
+
data.tar.gz: 252ab9a0d237488762f8a9b7a2c8c91af3dd0e048e598570722c818da78c075b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5ee9f27798eace802666b89d15cd92fcdf120ba44e317a87f15c5be0971d869fd6a897bbf24d0aab0dcb74859cb3dc450c098ad1af9eae4c51a4919dcd019da7
|
|
7
|
+
data.tar.gz: 7b649a4777d4647b6154f5a35560330200d5203390c5b79771cf0cc95e7ba1aa9eab8d6414f680226f3ccc2e5cbbfb5325f4a8654f5191514214c5880cd8ed59
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module RailsAdmin
|
|
2
4
|
class MainController < RailsAdmin::ApplicationController
|
|
3
5
|
include ActionView::Helpers::TextHelper
|
|
@@ -58,23 +60,15 @@ module RailsAdmin
|
|
|
58
60
|
end
|
|
59
61
|
|
|
60
62
|
def get_sort_hash(model_config)
|
|
61
|
-
abstract_model = model_config.abstract_model
|
|
62
63
|
field = model_config.list.fields.detect { |f| f.name.to_s == params[:sort] }
|
|
64
|
+
# If no sort param, default to the `sort_by` specified in the list config
|
|
65
|
+
field ||= model_config.list.possible_fields.detect { |f| f.name == model_config.list.sort_by.try(:to_sym) }
|
|
63
66
|
|
|
64
67
|
column =
|
|
65
68
|
if field.nil? || field.sortable == false # use default sort, asked field does not exist or is not sortable
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"#{abstract_model.table_name}.#{field.name}"
|
|
70
|
-
elsif (field.sortable.is_a?(String) || field.sortable.is_a?(Symbol)) && field.sortable.to_s.include?('.') # just provide sortable, don't do anything smart
|
|
71
|
-
field.sortable
|
|
72
|
-
elsif field.sortable.is_a?(Hash) # just join sortable hash, don't do anything smart
|
|
73
|
-
"#{field.sortable.keys.first}.#{field.sortable.values.first}"
|
|
74
|
-
elsif field.association? # use column on target table
|
|
75
|
-
"#{field.associated_model_config.abstract_model.table_name}.#{field.sortable}"
|
|
76
|
-
else # use described column in the field conf.
|
|
77
|
-
"#{abstract_model.table_name}.#{field.sortable}"
|
|
69
|
+
model_config.list.sort_by
|
|
70
|
+
else
|
|
71
|
+
field.sort_column
|
|
78
72
|
end
|
|
79
73
|
|
|
80
74
|
params[:sort_reverse] ||= 'false'
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module RailsAdmin
|
|
2
4
|
module ApplicationHelper
|
|
3
5
|
def authorized?(action_name, abstract_model = nil, object = nil)
|
|
@@ -29,7 +31,7 @@ module RailsAdmin
|
|
|
29
31
|
|
|
30
32
|
if authorized
|
|
31
33
|
edit_url = rails_admin.url_for(
|
|
32
|
-
|
|
34
|
+
action: edit_action.action_name,
|
|
33
35
|
model_name: abstract_model.to_param,
|
|
34
36
|
controller: 'rails_admin/main',
|
|
35
37
|
id: _current_user.id,
|
|
@@ -118,10 +120,12 @@ module RailsAdmin
|
|
|
118
120
|
abstract_model = node.abstract_model
|
|
119
121
|
model_param = abstract_model.to_param
|
|
120
122
|
url = rails_admin.url_for(action: :index, controller: 'rails_admin/main', model_name: model_param)
|
|
121
|
-
level_class = " nav-level-#{level}" if level > 0
|
|
122
123
|
nav_icon = node.navigation_icon ? %(<i class="#{node.navigation_icon}"></i>).html_safe : ''
|
|
124
|
+
css_classes = ['nav-link']
|
|
125
|
+
css_classes.push("nav-level-#{level}") if level > 0
|
|
126
|
+
css_classes.push('active') if defined?(@action) && current_action?(@action, model_param)
|
|
123
127
|
li = content_tag :li, data: {model: model_param} do
|
|
124
|
-
link_to nav_icon + node.label_plural, url, class:
|
|
128
|
+
link_to nav_icon + " " + node.label_plural, url, class: css_classes.join(' ')
|
|
125
129
|
end
|
|
126
130
|
child_nodes = parent_groups[abstract_model.model_name]
|
|
127
131
|
child_nodes ? li + navigation(parent_groups, child_nodes, level + 1) : li
|
|
@@ -206,7 +210,7 @@ module RailsAdmin
|
|
|
206
210
|
yield
|
|
207
211
|
rescue LoadError => e
|
|
208
212
|
if /sassc/.match?(e.message)
|
|
209
|
-
e = e.exception
|
|
213
|
+
e = e.exception <<~MSG
|
|
210
214
|
#{e.message}
|
|
211
215
|
RailsAdmin requires the gem sassc-rails, make sure to put `gem 'sassc-rails'` to Gemfile.
|
|
212
216
|
MSG
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'nested_form/builder_mixin'
|
|
2
4
|
|
|
3
5
|
module RailsAdmin
|
|
@@ -105,6 +107,14 @@ module RailsAdmin
|
|
|
105
107
|
(@dom_name ||= {})[field.name] ||= %(#{@object_name}#{options[:index] && "[#{options[:index]}]"}[#{field.method_name}]#{field.is_a?(Config::Fields::Association) && field.multiple? ? '[]' : ''})
|
|
106
108
|
end
|
|
107
109
|
|
|
110
|
+
def hidden_field(method, options = {})
|
|
111
|
+
if method == :id
|
|
112
|
+
super method, {value: object.id.to_s}
|
|
113
|
+
else
|
|
114
|
+
super
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
108
118
|
protected
|
|
109
119
|
|
|
110
120
|
def generator_action(action, nested)
|
|
@@ -15,6 +15,15 @@
|
|
|
15
15
|
<% when :webpack %>
|
|
16
16
|
<%= stylesheet_link_tag "rails_admin.css", media: :all, data: {'turbo-track': 'reload'} %>
|
|
17
17
|
<%= javascript_include_tag "rails_admin.js", async: true, data: {'turbo-track': 'reload'} %>
|
|
18
|
+
<% when :importmap %>
|
|
19
|
+
<%= stylesheet_link_tag "rails_admin.css", media: :all, data: {'turbo-track': 'reload'} %>
|
|
20
|
+
<%= javascript_inline_importmap_tag(RailsAdmin::Engine.importmap.to_json(resolver: self)) %>
|
|
21
|
+
<%= javascript_importmap_module_preload_tags(RailsAdmin::Engine.importmap) %>
|
|
22
|
+
<%= javascript_importmap_shim_nonce_configuration_tag %>
|
|
23
|
+
<%= javascript_importmap_shim_tag %>
|
|
24
|
+
<%= # Preload jQuery and make it global, unless jQuery UI fails to initialize
|
|
25
|
+
tag.script "import jQuery from 'jquery'; window.jQuery = jQuery;".html_safe, type: "module" %>
|
|
26
|
+
<%= javascript_import_module_tag 'rails_admin' %>
|
|
18
27
|
<% else
|
|
19
28
|
raise "Unknown asset_source: #{RailsAdmin::config.asset_source}"
|
|
20
29
|
end %>
|
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
<% end %>
|
|
18
18
|
<% if logout_path.present? %>
|
|
19
19
|
<li class="nav-item">
|
|
20
|
-
<%= link_to
|
|
20
|
+
<%= link_to logout_path, method: logout_method, class: 'nav-link', data: {turbo: 'false'} do %>
|
|
21
|
+
<span class="badge bg-danger"><%= t('admin.misc.log_out') %></span>
|
|
22
|
+
<% end %>
|
|
21
23
|
</li>
|
|
22
24
|
<% end %>
|
|
23
25
|
<% end %>
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
</head>
|
|
6
6
|
<body class="rails_admin">
|
|
7
7
|
<div data-i18n-options="<%= I18n.t("admin.js").to_json %>" id="admin-js"></div>
|
|
8
|
-
<nav class="navbar navbar-expand-md fixed-top
|
|
8
|
+
<nav class="navbar navbar-expand-md fixed-top <%= RailsAdmin::Config.navbar_css_classes.join(' ') %>">
|
|
9
9
|
<%= render "layouts/rails_admin/navigation" %>
|
|
10
10
|
</nav>
|
|
11
11
|
<div class="container-fluid">
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
source_abstract_model = RailsAdmin.config(form.object.class).abstract_model
|
|
4
4
|
|
|
5
5
|
selected = form.object.send(field.name)
|
|
6
|
-
selected_ids = selected.map{|s| s.send(field.associated_primary_key)}
|
|
6
|
+
selected_ids = selected.map{|s| s.send(field.associated_primary_key).to_s}
|
|
7
7
|
|
|
8
8
|
current_action = params[:action].in?(['create', 'new']) ? 'create' : 'update'
|
|
9
9
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
selected.map { |o| [o.send(field.associated_object_label_method), o.send(field.associated_primary_key)] }
|
|
14
14
|
else
|
|
15
15
|
i = 0
|
|
16
|
-
controller.list_entries(config, :index, field.associated_collection_scope, false).map { |o| [o.send(field.associated_object_label_method), o.send(field.associated_primary_key)] }.sort_by {|a| [selected_ids.index(a[1]) || selected_ids.size, i+=1] }
|
|
16
|
+
controller.list_entries(config, :index, field.associated_collection_scope, false).map { |o| [o.send(field.associated_object_label_method), o.send(field.associated_primary_key).to_s] }.sort_by {|a| [selected_ids.index(a[1]) || selected_ids.size, i+=1] }
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
js_data = {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
xhr = !field.associated_collection_cache_all
|
|
10
10
|
|
|
11
|
-
collection = xhr ? [[field.formatted_value, field.selected_id]] : controller.list_entries(config, :index, field.associated_collection_scope, false).map { |o| [o.send(field.associated_object_label_method), o.send(field.associated_primary_key)] }
|
|
11
|
+
collection = xhr ? [[field.formatted_value, field.selected_id]] : controller.list_entries(config, :index, field.associated_collection_scope, false).map { |o| [o.send(field.associated_object_label_method), o.send(field.associated_primary_key).to_s] }
|
|
12
12
|
|
|
13
13
|
js_data = {
|
|
14
14
|
xhr: xhr,
|
|
@@ -140,7 +140,7 @@
|
|
|
140
140
|
<tr class="<%= @abstract_model.param_key %>_row <%= @model_config.list.with(object: object).row_css_class %>">
|
|
141
141
|
<% if checkboxes %>
|
|
142
142
|
<td class="sticky">
|
|
143
|
-
<%= check_box_tag "bulk_ids[]", object.id, false %>
|
|
143
|
+
<%= check_box_tag "bulk_ids[]", object.id.to_s, false %>
|
|
144
144
|
</td>
|
|
145
145
|
<% end %>
|
|
146
146
|
<% properties.map{ |property| property.bind(:object, object) }.each do |property| %>
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
ActiveSupport.on_load(:active_record) do
|
|
2
4
|
module ActiveRecord
|
|
3
5
|
class Base
|
|
@@ -20,4 +22,27 @@ ActiveSupport.on_load(:active_record) do
|
|
|
20
22
|
end
|
|
21
23
|
end
|
|
22
24
|
end
|
|
25
|
+
|
|
26
|
+
if defined?(CompositePrimaryKeys)
|
|
27
|
+
# Apply patch until the fix is released:
|
|
28
|
+
# https://github.com/composite-primary-keys/composite_primary_keys/pull/572
|
|
29
|
+
CompositePrimaryKeys::CompositeKeys.class_eval do
|
|
30
|
+
alias_method :to_param, :to_s
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
CompositePrimaryKeys::CollectionAssociation.prepend(Module.new do
|
|
34
|
+
def ids_writer(ids)
|
|
35
|
+
if reflection.association_primary_key.is_a? Array
|
|
36
|
+
ids = CompositePrimaryKeys.normalize(Array(ids).reject(&:blank?), reflection.association_primary_key.size)
|
|
37
|
+
reflection.association_primary_key.each_with_index do |primary_key, i|
|
|
38
|
+
pk_type = klass.type_for_attribute(primary_key)
|
|
39
|
+
ids.each do |id|
|
|
40
|
+
id[i] = pk_type.cast(id[i]) if id.is_a? Array
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
super ids
|
|
45
|
+
end
|
|
46
|
+
end)
|
|
47
|
+
end
|
|
23
48
|
end
|
data/config/routes.rb
CHANGED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'importmap/packager'
|
|
4
|
+
|
|
5
|
+
module RailsAdmin
|
|
6
|
+
class ImportmapFormatter
|
|
7
|
+
attr_reader :packager
|
|
8
|
+
|
|
9
|
+
def initialize(path = 'confing/importmap.rails_admin.rb')
|
|
10
|
+
@packager = Importmap::Packager.new(path)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def format
|
|
14
|
+
imports = packager.import("rails_admin@#{RailsAdmin::Version.js}")
|
|
15
|
+
|
|
16
|
+
# Use ESM compatible version to work around https://github.com/cljsjs/packages/issues/1579
|
|
17
|
+
imports['@popperjs/core'].gsub!('lib/index.js', 'dist/esm/popper.js')
|
|
18
|
+
|
|
19
|
+
# Tidy up jQuery UI dependencies
|
|
20
|
+
jquery_uis = imports.keys.filter { |key, _| key =~ /jquery-ui/ }
|
|
21
|
+
imports['jquery-ui/'] = imports[jquery_uis.first].gsub(%r{(@[^/@]+)/[^@]+$}, '\1/')
|
|
22
|
+
imports.reject! { |key, _| jquery_uis.include? key }
|
|
23
|
+
|
|
24
|
+
pins = ['pin "rails_admin", preload: true', packager.pin_for('rails_admin/src/rails_admin/base', imports.delete('rails_admin'))]
|
|
25
|
+
(pins + imports.map { |package, url| packager.pin_for(package, url) }).join("\n")
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'rails/generators'
|
|
2
4
|
require 'rails_admin/version'
|
|
3
5
|
require File.expand_path('utils', __dir__)
|
|
@@ -8,7 +10,7 @@ module RailsAdmin
|
|
|
8
10
|
include Generators::Utils::InstanceMethods
|
|
9
11
|
|
|
10
12
|
argument :_namespace, type: :string, required: false, desc: 'RailsAdmin url namespace'
|
|
11
|
-
class_option :asset, type: :string, required: false, default: nil, desc: 'Asset delivery method [options: webpacker, sprockets]'
|
|
13
|
+
class_option :asset, type: :string, required: false, default: nil, desc: 'Asset delivery method [options: webpacker, webpack, sprockets, importmap]'
|
|
12
14
|
desc 'RailsAdmin installation generator'
|
|
13
15
|
|
|
14
16
|
def install
|
|
@@ -27,10 +29,14 @@ module RailsAdmin
|
|
|
27
29
|
case asset
|
|
28
30
|
when 'webpack'
|
|
29
31
|
configure_for_webpack
|
|
32
|
+
when 'importmap'
|
|
33
|
+
configure_for_importmap
|
|
30
34
|
when 'webpacker'
|
|
31
35
|
configure_for_webpacker5
|
|
32
36
|
when 'sprockets'
|
|
33
37
|
configure_for_sprockets
|
|
38
|
+
else
|
|
39
|
+
raise "Unknown asset source: #{asset}"
|
|
34
40
|
end
|
|
35
41
|
end
|
|
36
42
|
|
|
@@ -41,6 +47,10 @@ module RailsAdmin
|
|
|
41
47
|
|
|
42
48
|
if defined?(Webpacker)
|
|
43
49
|
'webpacker'
|
|
50
|
+
elsif Rails.root.join('webpack.config.js').exist?
|
|
51
|
+
'webpack'
|
|
52
|
+
elsif Rails.root.join('config/importmap.rb').exist?
|
|
53
|
+
'importmap'
|
|
44
54
|
else
|
|
45
55
|
'sprockets'
|
|
46
56
|
end
|
|
@@ -52,17 +62,66 @@ module RailsAdmin
|
|
|
52
62
|
|
|
53
63
|
def configure_for_webpacker5
|
|
54
64
|
run "yarn add rails_admin@#{RailsAdmin::Version.js}"
|
|
55
|
-
|
|
56
|
-
template 'rails_admin.
|
|
57
|
-
template 'rails_admin.scss', 'app/javascript/stylesheets/rails_admin.scss'
|
|
65
|
+
template 'rails_admin.webpacker.js', 'app/javascript/packs/rails_admin.js'
|
|
66
|
+
template 'rails_admin.scss.erb', 'app/javascript/stylesheets/rails_admin.scss'
|
|
58
67
|
end
|
|
59
68
|
|
|
60
69
|
def configure_for_webpack
|
|
61
|
-
run "yarn add rails_admin@#{RailsAdmin::Version.js}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
70
|
+
run "yarn add rails_admin@#{RailsAdmin::Version.js}"
|
|
71
|
+
template 'rails_admin.js', 'app/javascript/rails_admin.js'
|
|
72
|
+
webpack_config = File.join(destination_root, 'webpack.config.js')
|
|
73
|
+
marker = %r{application: ["']./app/javascript/application.js["']}
|
|
74
|
+
if File.exist?(webpack_config) && File.read(webpack_config) =~ marker
|
|
75
|
+
insert_into_file 'webpack.config.js', %(,\n rails_admin: "./app/javascript/rails_admin.js"), after: marker
|
|
76
|
+
else
|
|
77
|
+
say 'Add `rails_admin: "./app/javascript/rails_admin.js"` to the entry section in your webpack.config.js.', :red
|
|
78
|
+
end
|
|
79
|
+
setup_css({'build' => 'webpack --config webpack.config.js'})
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def configure_for_importmap
|
|
83
|
+
run "yarn add rails_admin@#{RailsAdmin::Version.js}"
|
|
84
|
+
template 'rails_admin.js', 'app/javascript/rails_admin.js'
|
|
85
|
+
require_relative 'importmap_formatter'
|
|
86
|
+
add_file 'config/importmap.rails_admin.rb', ImportmapFormatter.new.format
|
|
87
|
+
setup_css
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def setup_css(additional_script_entries = {})
|
|
91
|
+
gem 'cssbundling-rails'
|
|
92
|
+
rake 'css:install:sass'
|
|
93
|
+
|
|
94
|
+
@fa_font_path = '.'
|
|
95
|
+
template 'rails_admin.scss.erb', 'app/assets/stylesheets/rails_admin.scss'
|
|
96
|
+
asset_config = %{Rails.application.config.assets.paths << Rails.root.join("node_modules/@fortawesome/fontawesome-free/webfonts")\n}
|
|
97
|
+
if File.exist? File.join(destination_root, 'config/initializers/assets.rb')
|
|
98
|
+
append_to_file 'config/initializers/assets.rb', asset_config
|
|
99
|
+
else
|
|
100
|
+
add_file 'config/initializers/assets.rb', asset_config
|
|
101
|
+
end
|
|
102
|
+
add_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'}))
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def add_scripts(entries)
|
|
106
|
+
display 'Add scripts to package.json'
|
|
107
|
+
package = begin
|
|
108
|
+
JSON.parse(File.read(File.join(destination_root, 'package.json')))
|
|
109
|
+
rescue Errno::ENOENT, JSON::ParserError
|
|
110
|
+
{}
|
|
111
|
+
end
|
|
112
|
+
if package['scripts'] && (package['scripts'].keys & entries.keys).any?
|
|
113
|
+
say <<-MESSAGE.gsub(/^ {10}/, ''), :red
|
|
114
|
+
You need to merge "scripts": #{JSON.pretty_generate(entries)} into the existing scripts in your package.json .
|
|
115
|
+
Taking 'build:css' as an example, if you're already have application.sass.css for the sass build, the resulting script would look like:
|
|
116
|
+
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
|
|
117
|
+
MESSAGE
|
|
118
|
+
else
|
|
119
|
+
package['scripts'] ||= {}
|
|
120
|
+
entries.each do |entry, build_script|
|
|
121
|
+
package['scripts'][entry] = build_script
|
|
122
|
+
end
|
|
123
|
+
add_file 'package.json', JSON.pretty_generate(package)
|
|
124
|
+
end
|
|
66
125
|
end
|
|
67
126
|
end
|
|
68
127
|
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "rails_admin/src/rails_admin/base";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= instance_variable_defined?(:@fa_font_path) ? %{$fa-font-path: "#{@fa_font_path}";\n} : '' %>@import "rails_admin/src/rails_admin/styles/base";
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'rails_admin/support/datetime'
|
|
2
4
|
|
|
3
5
|
module RailsAdmin
|
|
@@ -99,8 +101,13 @@ module RailsAdmin
|
|
|
99
101
|
|
|
100
102
|
def initialize_active_record
|
|
101
103
|
@adapter = :active_record
|
|
102
|
-
|
|
103
|
-
|
|
104
|
+
if defined?(::CompositePrimaryKeys)
|
|
105
|
+
require 'rails_admin/adapters/composite_primary_keys'
|
|
106
|
+
extend Adapters::CompositePrimaryKeys
|
|
107
|
+
else
|
|
108
|
+
require 'rails_admin/adapters/active_record'
|
|
109
|
+
extend Adapters::ActiveRecord
|
|
110
|
+
end
|
|
104
111
|
end
|
|
105
112
|
|
|
106
113
|
def initialize_mongoid
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module RailsAdmin
|
|
2
4
|
module Adapters
|
|
3
5
|
module ActiveRecord
|
|
@@ -21,6 +23,14 @@ module RailsAdmin
|
|
|
21
23
|
association.macro
|
|
22
24
|
end
|
|
23
25
|
|
|
26
|
+
def field_type
|
|
27
|
+
if polymorphic?
|
|
28
|
+
:polymorphic_association
|
|
29
|
+
else
|
|
30
|
+
:"#{association.macro}_association"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
24
34
|
def klass
|
|
25
35
|
if options[:polymorphic]
|
|
26
36
|
polymorphic_parents(:active_record, model.name.to_s, name) || []
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'active_record'
|
|
2
4
|
require 'rails_admin/adapters/active_record/association'
|
|
3
5
|
require 'rails_admin/adapters/active_record/object_extension'
|
|
@@ -31,11 +33,11 @@ module RailsAdmin
|
|
|
31
33
|
scope ||= scoped
|
|
32
34
|
scope = scope.includes(options[:include]) if options[:include]
|
|
33
35
|
scope = scope.limit(options[:limit]) if options[:limit]
|
|
34
|
-
scope = scope
|
|
36
|
+
scope = bulk_scope(scope, options) if options[:bulk_ids]
|
|
35
37
|
scope = query_scope(scope, options[:query]) if options[:query]
|
|
36
38
|
scope = filter_scope(scope, options[:filters]) if options[:filters]
|
|
37
39
|
scope = scope.send(Kaminari.config.page_method_name, options[:page]).per(options[:per]) if options[:page] && options[:per]
|
|
38
|
-
scope = scope
|
|
40
|
+
scope = sort_scope(scope, options) if options[:sort]
|
|
39
41
|
scope
|
|
40
42
|
end
|
|
41
43
|
|
|
@@ -105,6 +107,27 @@ module RailsAdmin
|
|
|
105
107
|
true
|
|
106
108
|
end
|
|
107
109
|
|
|
110
|
+
private
|
|
111
|
+
|
|
112
|
+
def bulk_scope(scope, options)
|
|
113
|
+
scope.where(primary_key => options[:bulk_ids])
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def sort_scope(scope, options)
|
|
117
|
+
direction = options[:sort_reverse] ? :asc : :desc
|
|
118
|
+
case options[:sort]
|
|
119
|
+
when String, Symbol
|
|
120
|
+
scope.reorder("#{options[:sort]} #{direction}")
|
|
121
|
+
when Array
|
|
122
|
+
scope.reorder(options[:sort].zip(Array.new(options[:sort].size) { direction }).to_h)
|
|
123
|
+
when Hash
|
|
124
|
+
scope.reorder(options[:sort].map { |table_name, column| "#{table_name}.#{column}" }.
|
|
125
|
+
zip(Array.new(options[:sort].size) { direction }).to_h)
|
|
126
|
+
else
|
|
127
|
+
raise ArgumentError.new("Unsupported sort value: #{options[:sort]}")
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
108
131
|
class WhereBuilder
|
|
109
132
|
def initialize(scope)
|
|
110
133
|
@statements = []
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RailsAdmin
|
|
4
|
+
module Adapters
|
|
5
|
+
module CompositePrimaryKeys
|
|
6
|
+
class Association < RailsAdmin::Adapters::ActiveRecord::Association
|
|
7
|
+
def field_type
|
|
8
|
+
if type == :belongs_to && association.foreign_key.is_a?(Array)
|
|
9
|
+
:composite_keys_belongs_to_association
|
|
10
|
+
else
|
|
11
|
+
super
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def primary_key
|
|
16
|
+
return nil if polymorphic?
|
|
17
|
+
|
|
18
|
+
value = association.association_primary_key
|
|
19
|
+
|
|
20
|
+
if value.is_a? Array
|
|
21
|
+
:id
|
|
22
|
+
else
|
|
23
|
+
value.to_sym
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def foreign_key
|
|
28
|
+
if association.foreign_key.is_a? Array
|
|
29
|
+
association.foreign_key.map(&:to_sym)
|
|
30
|
+
else
|
|
31
|
+
super
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def key_accessor
|
|
36
|
+
if type == :belongs_to && foreign_key.is_a?(Array)
|
|
37
|
+
:"#{name}_id"
|
|
38
|
+
else
|
|
39
|
+
super
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rails_admin/adapters/active_record'
|
|
4
|
+
require 'rails_admin/adapters/composite_primary_keys/association'
|
|
5
|
+
|
|
6
|
+
module RailsAdmin
|
|
7
|
+
module Adapters
|
|
8
|
+
module CompositePrimaryKeys
|
|
9
|
+
include RailsAdmin::Adapters::ActiveRecord
|
|
10
|
+
|
|
11
|
+
def get(id, scope = scoped)
|
|
12
|
+
begin
|
|
13
|
+
object = scope.find(id)
|
|
14
|
+
rescue ::ActiveRecord::RecordNotFound
|
|
15
|
+
return nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
object.extend(RailsAdmin::Adapters::ActiveRecord::ObjectExtension)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def associations
|
|
22
|
+
model.reflect_on_all_associations.collect do |association|
|
|
23
|
+
RailsAdmin::Adapters::CompositePrimaryKeys::Association.new(association, model)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def bulk_scope(scope, options)
|
|
30
|
+
if primary_key.is_a? Array
|
|
31
|
+
options[:bulk_ids].map do |id|
|
|
32
|
+
scope.where(primary_key.zip(::CompositePrimaryKeys::CompositeKeys.parse(id)).to_h)
|
|
33
|
+
end.reduce(&:or)
|
|
34
|
+
else
|
|
35
|
+
super
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module RailsAdmin
|
|
2
4
|
module Adapters
|
|
3
5
|
module Mongoid
|
|
@@ -34,6 +36,14 @@ module RailsAdmin
|
|
|
34
36
|
end
|
|
35
37
|
end
|
|
36
38
|
|
|
39
|
+
def field_type
|
|
40
|
+
if polymorphic?
|
|
41
|
+
:polymorphic_association
|
|
42
|
+
else
|
|
43
|
+
:"#{type}_association"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
37
47
|
def klass
|
|
38
48
|
if polymorphic? && %i[referenced_in belongs_to].include?(macro)
|
|
39
49
|
polymorphic_parents(:mongoid, model.name, name) || []
|
|
@@ -111,10 +121,10 @@ module RailsAdmin
|
|
|
111
121
|
def nested_options
|
|
112
122
|
nested = nested_attributes_options.try { |o| o[name] }
|
|
113
123
|
if !nested && %i[embeds_one embeds_many].include?(macro.to_sym) && !cyclic?
|
|
114
|
-
raise
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
124
|
+
raise <<~MSG
|
|
125
|
+
Embedded association without accepts_nested_attributes_for can't be handled by RailsAdmin,
|
|
126
|
+
because embedded model doesn't have top-level access.
|
|
127
|
+
Please add `accepts_nested_attributes_for :#{association.name}' line to `#{model}' model.
|
|
118
128
|
MSG
|
|
119
129
|
end
|
|
120
130
|
|