Skip to content

Commit

Permalink
Merge pull request #2588 from tvdeyen/admin-js-imports
Browse files Browse the repository at this point in the history
Allow to import additional admin JS modules
  • Loading branch information
tvdeyen authored Oct 4, 2023
2 parents 5ffc6c3 + 79131fc commit 97a9ac5
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 0 deletions.
7 changes: 7 additions & 0 deletions app/views/layouts/alchemy/admin.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@
<%= render 'alchemy/admin/partials/routes' %>
<%= javascript_include_tag('alchemy/admin/all', 'data-turbo-track' => true) %>
<%= javascript_importmap_tags("alchemy_admin", importmap: Alchemy.importmap) %>
<% if Alchemy.admin_js_imports.any? %>
<script type="module">
<% Alchemy.admin_js_imports.each do |path| %>
import "<%= path %>"
<% end %>
</script>
<% end %>
<%= yield :javascript_includes %>
</head>
<%= content_tag :body, id: 'alchemy', class: alchemy_body_class do %>
Expand Down
19 changes: 19 additions & 0 deletions lib/alchemy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,25 @@ def self.preview_sources=(sources)
@_preview_sources = Array(sources)
end

# Additional JS modules to be imported in the Alchemy admin UI
#
# Be sure to also pin the modules with +Alchemy.importmap+.
#
# == Example
#
# Alchemy.importmap.pin "flatpickr/de",
# to: "https://ga.jspm.io/npm:[email protected]/dist/l10n/de.js"
#
# Alchemy.admin_js_imports << "flatpickr/de"
#
def self.admin_js_imports
@_admin_js_imports ||= Set.new
end

def self.admin_js_imports=(sources)
@_admin_js_imports = Set[sources]
end

# Define page publish targets
#
# A publish target is a ActiveJob that gets performed
Expand Down
36 changes: 36 additions & 0 deletions spec/views/layouts/alchemy/admin.html.erb.spec
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# frozen_string_literal: true

require "rails_helper"

RSpec.describe "layouts/alchemy/admin.html.erb" do
before do
view.extend Alchemy::Admin::BaseHelper
allow(view).to receive(:alchemy_modules).and_return([])
allow(view).to receive(:current_alchemy_user).and_return(DummyUser.new)
allow(view).to receive(:configuration).and_return({})
end

subject do
render template: "layouts/alchemy/admin"
rendered
end

context "with Alchemy.admin_js_imports" do
around do |example|
current = Alchemy.admin_js_imports
Alchemy.admin_js_imports << "foo"
example.run
Alchemy.admin_js_imports = current
end

it "renders the given javascripts module imports" do
expect(subject).to have_selector("script[type=\"module\"]:last-of-type", text: /import "foo"/)
end
end

context "without Alchemy.admin_js_imports" do
it "does not render the given javascripts module imports" do
expect(subject).to_not have_selector("script[type=\"module\"]:last-of-type", text: /import "foo"/)
end
end
end

0 comments on commit 97a9ac5

Please sign in to comment.