Skip to content

Commit

Permalink
Setup an admin specific importmap instance
Browse files Browse the repository at this point in the history
- 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
  • Loading branch information
elia committed Jun 19, 2023
1 parent c7602ec commit 64de7bd
Show file tree
Hide file tree
Showing 10 changed files with 81 additions and 1 deletion.
1 change: 1 addition & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ Style/FrozenStringLiteralComment:
- '*/lib/generators/**/*'
- '**/bin/**/*'
- '*/db/migrate/**/*'
- '*/config/importmap.rb'

# json.() is idiomatic in jbuilder files
Style/LambdaCall:
Expand Down
1 change: 1 addition & 0 deletions admin/app/controllers/solidus_admin/base_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ module SolidusAdmin
class BaseController < Spree::BaseController
layout 'solidus_admin/application'
helper 'solidus_admin/container'
helper 'solidus_admin/importmap'
end
end
13 changes: 13 additions & 0 deletions admin/app/helpers/solidus_admin/importmap_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

module SolidusAdmin::ImportmapHelper
def javascript_solidus_admin_importmap_tags(entry_point = "solidus_admin/application", shim: false, importmap: SolidusAdmin.importmap)
safe_join [
javascript_inline_importmap_tag(importmap.to_json(resolver: self)),
javascript_importmap_module_preload_tags(importmap),
(javascript_importmap_shim_nonce_configuration_tag if shim),
(javascript_importmap_shim_tag if shim),
javascript_import_module_tag(entry_point)
].compact, "\n"
end
end
2 changes: 1 addition & 1 deletion admin/app/views/layouts/solidus_admin/application.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<html>
<head>
<%= stylesheet_link_tag "solidus_admin/application.css", "data-turbo-track": "reload" %>
<%= javascript_link_tag "solidus_admin/application.js", "data-turbo-track": "reload" %>
<%= javascript_solidus_admin_importmap_tags %>
</head>
<body class="
grid grid-cols-4 gap-4
Expand Down
1 change: 1 addition & 0 deletions admin/config/importmap.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pin "solidus_admin/application", preload: true
8 changes: 8 additions & 0 deletions admin/lib/solidus_admin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,11 @@

require 'solidus_admin/version'
require 'solidus_admin/engine'

require 'importmap-rails'

module SolidusAdmin
singleton_class.attr_accessor :importmap

self.importmap = Importmap::Map.new
end
9 changes: 9 additions & 0 deletions admin/lib/solidus_admin/configuration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@ class Configuration < Spree::Preferences::Configuration
#
# Recompile with `bin/rails solidus_admin:tailwindcss:build` after changing this list.
preference :tailwind_stylesheets, :array, default: []

preference :importmap_cache_sweepers, :array, default: [
SolidusAdmin::Engine.root.join("app", "assets", "javascripts"),
SolidusAdmin::Engine.root.join("app", "javascript"),
]

preference :importmap_paths, :array, default: [
SolidusAdmin::Engine.root.join("config", "importmap.rb"),
]
end
end

Expand Down
27 changes: 27 additions & 0 deletions admin/lib/solidus_admin/engine.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

require "view_component"
require "solidus_admin/container"
require "solidus_admin/importmap_reloader"

module SolidusAdmin
class Engine < ::Rails::Engine
Expand All @@ -11,10 +12,36 @@ class Engine < ::Rails::Engine
require "solidus_admin/configuration"
end

initializer "solidus_admin.importmap" do
SolidusAdmin::Config.importmap_paths.each { |path| SolidusAdmin.importmap.draw(path) }
end

initializer "solidus_admin.importmap.reloader" do |app|
ImportmapReloader.new.tap do |reloader|
reloader.execute
app.reloaders << reloader
app.reloader.to_run { reloader.execute }
end
end

initializer "solidus_admin.assets" do |app|
app.config.assets.precompile += %w[solidus_admin_manifest.js]
end

initializer "solidus_admin.importmap.cache_sweeper" do |app|
if app.config.importmap.sweep_cache
SolidusAdmin.importmap.cache_sweeper(watches: SolidusAdmin::Config.importmap_cache_sweepers)

ActiveSupport.on_load(:action_controller_base) do
before_action { SolidusAdmin.importmap.cache_sweeper.execute_if_updated }
end
end
end

initializer "solidus_admin.importmap.assets" do |app|
app.config.assets.paths << SolidusAdmin::Engine.root.join("app/javascript")
end

initializer "solidus_admin.main_nav_items_provider" do
require "solidus_admin/system/providers/main_nav"

Expand Down
19 changes: 19 additions & 0 deletions admin/lib/solidus_admin/importmap_reloader.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# frozen_string_literal: true

class SolidusAdmin::ImportmapReloader
delegate :execute_if_updated, :execute, :updated?, to: :updater

def reload!
importmap_paths.each { |path| SolidusAdmin.importmap.draw(path) }
end

private

def importmap_paths
SolidusAdmin::Config.importmap_paths
end

def updater
@updater ||= Rails.application.config.file_watcher.new(importmap_paths) { reload! }
end
end
1 change: 1 addition & 0 deletions admin/solidus_admin.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Gem::Specification.new do |s|
s.required_rubygems_version = '>= 1.8.23'

s.add_dependency 'dry-system', '~> 1.0'
s.add_dependency 'importmap-rails', '~> 1.1'
s.add_dependency 'solidus_core', s.version
s.add_dependency 'tailwindcss-rails', '~> 2.0'
s.add_dependency 'view_component', '~> 3.0'
Expand Down

0 comments on commit 64de7bd

Please sign in to comment.