Skip to content

Commit 64de7bd

Browse files
committed
Setup an admin specific importmap instance
- The helper is identical to the original one except for defaults and passing a custom importmap (see rails/importmap-rails#187) - The reloading configuration is a simplified version of the one in importmap-rails, same for the reloader
1 parent c7602ec commit 64de7bd

File tree

10 files changed

+81
-1
lines changed

10 files changed

+81
-1
lines changed

.rubocop.yml

+1
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ Style/FrozenStringLiteralComment:
314314
- '*/lib/generators/**/*'
315315
- '**/bin/**/*'
316316
- '*/db/migrate/**/*'
317+
- '*/config/importmap.rb'
317318

318319
# json.() is idiomatic in jbuilder files
319320
Style/LambdaCall:

admin/app/controllers/solidus_admin/base_controller.rb

+1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ module SolidusAdmin
44
class BaseController < Spree::BaseController
55
layout 'solidus_admin/application'
66
helper 'solidus_admin/container'
7+
helper 'solidus_admin/importmap'
78
end
89
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# frozen_string_literal: true
2+
3+
module SolidusAdmin::ImportmapHelper
4+
def javascript_solidus_admin_importmap_tags(entry_point = "solidus_admin/application", shim: false, importmap: SolidusAdmin.importmap)
5+
safe_join [
6+
javascript_inline_importmap_tag(importmap.to_json(resolver: self)),
7+
javascript_importmap_module_preload_tags(importmap),
8+
(javascript_importmap_shim_nonce_configuration_tag if shim),
9+
(javascript_importmap_shim_tag if shim),
10+
javascript_import_module_tag(entry_point)
11+
].compact, "\n"
12+
end
13+
end

admin/app/views/layouts/solidus_admin/application.html.erb

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html>
33
<head>
44
<%= stylesheet_link_tag "solidus_admin/application.css", "data-turbo-track": "reload" %>
5-
<%= javascript_link_tag "solidus_admin/application.js", "data-turbo-track": "reload" %>
5+
<%= javascript_solidus_admin_importmap_tags %>
66
</head>
77
<body class="
88
grid grid-cols-4 gap-4

admin/config/importmap.rb

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pin "solidus_admin/application", preload: true

admin/lib/solidus_admin.rb

+8
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,11 @@
22

33
require 'solidus_admin/version'
44
require 'solidus_admin/engine'
5+
6+
require 'importmap-rails'
7+
8+
module SolidusAdmin
9+
singleton_class.attr_accessor :importmap
10+
11+
self.importmap = Importmap::Map.new
12+
end

admin/lib/solidus_admin/configuration.rb

+9
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,15 @@ class Configuration < Spree::Preferences::Configuration
3838
#
3939
# Recompile with `bin/rails solidus_admin:tailwindcss:build` after changing this list.
4040
preference :tailwind_stylesheets, :array, default: []
41+
42+
preference :importmap_cache_sweepers, :array, default: [
43+
SolidusAdmin::Engine.root.join("app", "assets", "javascripts"),
44+
SolidusAdmin::Engine.root.join("app", "javascript"),
45+
]
46+
47+
preference :importmap_paths, :array, default: [
48+
SolidusAdmin::Engine.root.join("config", "importmap.rb"),
49+
]
4150
end
4251
end
4352

admin/lib/solidus_admin/engine.rb

+27
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
require "view_component"
44
require "solidus_admin/container"
5+
require "solidus_admin/importmap_reloader"
56

67
module SolidusAdmin
78
class Engine < ::Rails::Engine
@@ -11,10 +12,36 @@ class Engine < ::Rails::Engine
1112
require "solidus_admin/configuration"
1213
end
1314

15+
initializer "solidus_admin.importmap" do
16+
SolidusAdmin::Config.importmap_paths.each { |path| SolidusAdmin.importmap.draw(path) }
17+
end
18+
19+
initializer "solidus_admin.importmap.reloader" do |app|
20+
ImportmapReloader.new.tap do |reloader|
21+
reloader.execute
22+
app.reloaders << reloader
23+
app.reloader.to_run { reloader.execute }
24+
end
25+
end
26+
1427
initializer "solidus_admin.assets" do |app|
1528
app.config.assets.precompile += %w[solidus_admin_manifest.js]
1629
end
1730

31+
initializer "solidus_admin.importmap.cache_sweeper" do |app|
32+
if app.config.importmap.sweep_cache
33+
SolidusAdmin.importmap.cache_sweeper(watches: SolidusAdmin::Config.importmap_cache_sweepers)
34+
35+
ActiveSupport.on_load(:action_controller_base) do
36+
before_action { SolidusAdmin.importmap.cache_sweeper.execute_if_updated }
37+
end
38+
end
39+
end
40+
41+
initializer "solidus_admin.importmap.assets" do |app|
42+
app.config.assets.paths << SolidusAdmin::Engine.root.join("app/javascript")
43+
end
44+
1845
initializer "solidus_admin.main_nav_items_provider" do
1946
require "solidus_admin/system/providers/main_nav"
2047

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# frozen_string_literal: true
2+
3+
class SolidusAdmin::ImportmapReloader
4+
delegate :execute_if_updated, :execute, :updated?, to: :updater
5+
6+
def reload!
7+
importmap_paths.each { |path| SolidusAdmin.importmap.draw(path) }
8+
end
9+
10+
private
11+
12+
def importmap_paths
13+
SolidusAdmin::Config.importmap_paths
14+
end
15+
16+
def updater
17+
@updater ||= Rails.application.config.file_watcher.new(importmap_paths) { reload! }
18+
end
19+
end

admin/solidus_admin.gemspec

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Gem::Specification.new do |s|
2424
s.required_rubygems_version = '>= 1.8.23'
2525

2626
s.add_dependency 'dry-system', '~> 1.0'
27+
s.add_dependency 'importmap-rails', '~> 1.1'
2728
s.add_dependency 'solidus_core', s.version
2829
s.add_dependency 'tailwindcss-rails', '~> 2.0'
2930
s.add_dependency 'view_component', '~> 3.0'

0 commit comments

Comments
 (0)