Skip to content

Commit b84d065

Browse files
committed
Add installer support for webpack/webpacker
1 parent 7918dc7 commit b84d065

File tree

11 files changed

+131
-6
lines changed

11 files changed

+131
-6
lines changed

.prettierignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
coverage
2+
lib/generators/rails_admin/templates
23
spec/dummy_app/public
34
spec/dummy_app/tmp
45
spec/support/jquery.simulate.drag-sortable.js

app/helpers/rails_admin/application_helper.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,5 +195,17 @@ def flash_alert_class(flash_key)
195195
else "alert-#{flash_key}"
196196
end
197197
end
198+
199+
def handle_asset_dependency_error
200+
yield
201+
rescue LoadError => e
202+
if e.message =~ /sassc/
203+
e = e.exception <<-MSG.gsub(/^\s{10}/, '')
204+
#{e.message}
205+
RailsAdmin requires the gem sassc-rails, make sure to put `gem 'sassc-rails'` to Gemfile.
206+
MSG
207+
end
208+
raise e
209+
end
198210
end
199211
end

app/views/layouts/rails_admin/_head.html.erb

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@
33
<meta content="width=device-width, initial-scale=1" name="viewport; charset=utf-8"/>
44
<meta content="NONE,NOARCHIVE" name="robots"/>
55
<%= csrf_meta_tag %>
6-
<% if RailsAdmin::config.asset_source == :webpacker %>
7-
<%= javascript_pack_tag "rails_admin" %>
6+
<% case RailsAdmin::config.asset_source
7+
when :webpacker %>
88
<%= stylesheet_pack_tag "rails_admin" %>
9-
<% else %>
10-
<%= stylesheet_link_tag "rails_admin.css", media: :all %>
11-
<%= javascript_include_tag "rails_admin.js" %>
12-
<% end %>
9+
<%= javascript_pack_tag "rails_admin" %>
10+
<% when :webpack, :sprockets %>
11+
<% handle_asset_dependency_error do %>
12+
<%= stylesheet_link_tag "rails_admin.css", media: :all %>
13+
<%= javascript_include_tag "rails_admin.js", defer: true %>
14+
<% end %>
15+
<% else
16+
raise "Unknown asset_source: #{RailsAdmin::config.asset_source}"
17+
end %>

lib/generators/rails_admin/install_generator.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,56 @@ class InstallGenerator < Rails::Generators::Base
77
include Generators::Utils::InstanceMethods
88

99
argument :_namespace, type: :string, required: false, desc: 'RailsAdmin url namespace'
10+
class_option :asset, type: :string, required: false, default: nil, desc: 'Asset delivery method [options: webpack, webpacker, sprockets]'
1011
desc 'RailsAdmin installation generator'
1112

1213
def install
1314
namespace = ask_for('Where do you want to mount rails_admin?', 'admin', _namespace)
1415
route("mount RailsAdmin::Engine => '/#{namespace}', as: 'rails_admin'")
1516
template 'initializer.erb', 'config/initializers/rails_admin.rb'
17+
display "Using [#{asset}] for asset delivery method"
18+
case asset
19+
when 'webpack'
20+
configure_for_webpack
21+
when 'webpacker'
22+
configure_for_webpacker5
23+
when 'sprockets'
24+
configure_for_sprockets
25+
end
26+
end
27+
28+
private
29+
30+
def asset
31+
return options['asset'] if options['asset']
32+
33+
if Rails.root.join('webpack.config.js').exist?
34+
'webpack'
35+
elsif defined?(Webpacker)
36+
'webpacker'
37+
else
38+
'sprockets'
39+
end
40+
end
41+
42+
def configure_for_sprockets
43+
gem 'sassc-rails'
44+
end
45+
46+
def configure_for_webpacker5
47+
run "yarn add rails_admin@#{RailsAdmin::Version.js}"
48+
@scss_relative_dir = '../stylesheets/'
49+
template 'rails_admin.js.erb', 'app/javascript/packs/rails_admin.js'
50+
template 'rails_admin.scss', 'app/javascript/stylesheets/rails_admin.scss'
51+
template 'environment.js', 'config/webpack/environment.js'
52+
end
53+
54+
def configure_for_webpack
55+
run "yarn add rails_admin@#{RailsAdmin::Version.js} css-loader mini-css-extract-plugin sass sass-loader"
56+
@scss_relative_dir = './'
57+
template 'rails_admin.js.erb', 'app/javascript/rails_admin.js'
58+
template 'rails_admin.scss', 'app/javascript/rails_admin.scss'
59+
template 'webpack.config.js', 'webpack.config.js'
1660
end
1761
end
1862
end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const webpack = require('webpack');
2+
const { environment } = require('@rails/webpacker')
3+
4+
environment.plugins.append('ProvidePlugin-jQuery', new webpack.ProvidePlugin({jQuery: 'jquery'}));
5+
6+
module.exports = environment

lib/generators/rails_admin/templates/initializer.erb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
RailsAdmin.config do |config|
2+
config.asset_source = :<%= asset %>
23

34
### Popular gems integration
45

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import "rails_admin/src/rails_admin/base";
2+
import "<%= @scss_relative_dir %>rails_admin.scss";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@import "~rails_admin/src/rails_admin/styles/base";
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
const path = require("path")
2+
const webpack = require('webpack')
3+
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
4+
5+
module.exports = {
6+
mode: "production",
7+
entry: {
8+
application: "./app/javascript/application.js",
9+
rails_admin: "./app/javascript/rails_admin.js",
10+
},
11+
output: {
12+
filename: "[name].js",
13+
path: path.resolve(__dirname, "app/assets/builds"),
14+
},
15+
module: {
16+
rules: [
17+
{
18+
test: /.s?css$/,
19+
use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"],
20+
},
21+
],
22+
},
23+
plugins: [
24+
new webpack.optimize.LimitChunkCountPlugin({
25+
maxChunks: 1
26+
}),
27+
new webpack.ProvidePlugin({
28+
jQuery: "jquery"
29+
}),
30+
new MiniCssExtractPlugin(),
31+
]
32+
}

lib/rails_admin/version.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ class << self
1010
def to_s
1111
[MAJOR, MINOR, PATCH, PRE].compact.join('.')
1212
end
13+
14+
def js
15+
JSON.parse(File.read("#{__dir__}/../../package.json"))['version']
16+
end
1317
end
1418
end
1519
end

0 commit comments

Comments
 (0)