Identify the current tenant in the <html> tag

This way it will be possible to write CSS and JavaScript code that will
only apply to specific tenants.

Note that CSS customization is still limited because it isn't possible
to use different SCSS variables per tenant.
This commit is contained in:
Javi Martín
2022-10-06 17:48:42 +02:00
parent 2c0ede3aaa
commit 5c61b72d21
3 changed files with 50 additions and 10 deletions

View File

@@ -4,7 +4,7 @@ class Layout::CommonHTMLAttributesComponent < ApplicationComponent
private private
def attributes def attributes
sanitize([dir, lang].compact.join(" ")) sanitize([dir, lang, html_class].compact.join(" "))
end end
def dir def dir
@@ -14,4 +14,8 @@ class Layout::CommonHTMLAttributesComponent < ApplicationComponent
def lang def lang
"lang=\"#{I18n.locale}\"" "lang=\"#{I18n.locale}\""
end end
def html_class
"class=\"tenant-#{Tenant.current_schema}\"" if Rails.application.config.multitenancy
end
end end

View File

@@ -3,16 +3,36 @@ require "rails_helper"
describe Layout::CommonHTMLAttributesComponent do describe Layout::CommonHTMLAttributesComponent do
let(:component) { Layout::CommonHTMLAttributesComponent.new } let(:component) { Layout::CommonHTMLAttributesComponent.new }
it "includes the default language by default" do context "with multitenancy disabled" do
render_inline component before { allow(Rails.application.config).to receive(:multitenancy).and_return(false) }
expect(page.text).to eq 'lang="en"' it "includes the default language by default" do
render_inline component
expect(page.text).to eq 'lang="en"'
end
it "includes the current language" do
I18n.with_locale(:es) { render_inline component }
expect(page.text).to eq 'lang="es"'
end
end end
it "includes the current language" do context "with multitenancy enabled" do
I18n.with_locale(:es) { render_inline component } it "includes a class with the 'public' suffix for the default tenant" do
render_inline component
expect(page.text).to eq 'lang="es"' expect(page.text).to eq 'lang="en" class="tenant-public"'
end
it "includes a class with the schema name as suffix for other tenants" do
allow(Tenant).to receive(:current_schema).and_return "private"
render_inline component
expect(page.text).to eq 'lang="en" class="tenant-private"'
end
end end
context "RTL languages" do context "RTL languages" do
@@ -25,10 +45,22 @@ describe Layout::CommonHTMLAttributesComponent do
after { I18n.enforce_available_locales = default_enforce } after { I18n.enforce_available_locales = default_enforce }
it "includes the dir attribute" do context "with multitenancy disabled" do
I18n.with_locale(:ar) { render_inline component } before { allow(Rails.application.config).to receive(:multitenancy).and_return(false) }
expect(page.text).to eq 'dir="rtl" lang="ar"' it "includes the dir attribute" do
I18n.with_locale(:ar) { render_inline component }
expect(page.text).to eq 'dir="rtl" lang="ar"'
end
end
context "with multitenancy enabled" do
it "includes the dir and the class attributes" do
I18n.with_locale(:ar) { render_inline component }
expect(page.text).to eq 'dir="rtl" lang="ar" class="tenant-public"'
end
end end
end end
end end

View File

@@ -28,12 +28,16 @@ describe "Multitenancy" do
visit polls_path visit polls_path
expect(page).to have_content "Human rights for Martians?" expect(page).to have_content "Human rights for Martians?"
expect(page).to have_css "html.tenant-mars"
expect(page).not_to have_css "html.tenant-venus"
end end
with_subdomain("venus") do with_subdomain("venus") do
visit polls_path visit polls_path
expect(page).to have_content "There are no open votings" expect(page).to have_content "There are no open votings"
expect(page).to have_css "html.tenant-venus"
expect(page).not_to have_css "html.tenant-mars"
end end
end end