diff --git a/lib/phlex_ui/attribute_merger.rb b/lib/phlex_ui/attribute_merger.rb index 378fd374f..2e4be008c 100644 --- a/lib/phlex_ui/attribute_merger.rb +++ b/lib/phlex_ui/attribute_merger.rb @@ -1,6 +1,7 @@ module PhlexUI class AttributeMerger attr_reader :default_attrs, :user_attrs + OVERRIDE_KEY = "!".freeze def initialize(default_attrs, user_attrs) @default_attrs = flatten_hash(default_attrs) @@ -12,8 +13,8 @@ def initialize(default_attrs, user_attrs) # ex: if default_attrs = { class: "text-right" }, user_attrs = { class!: "text-left" } # the result will be { class: "text-left } def call - merged_attrs = merge_hashes(default_attrs, user_attrs) - mix(merged_attrs, user_attrs) + merged_attrs = merge_hashes(default_attrs, non_override_attrs) + mix(merged_attrs, override_attrs) end private @@ -28,7 +29,8 @@ def mix(*args) when Array old.is_a?(Array) ? (old + new) : new when String - old.is_a?(String) ? "#{old} #{new}" : new + value = "#{old} #{new}".split.uniq.join(" ") + old.is_a?(String) ? value : new else new end @@ -40,6 +42,18 @@ def mix(*args) end end + def override_attrs + user_attrs.select do |key, value| + key.to_s[-1] == OVERRIDE_KEY + end + end + + def non_override_attrs + user_attrs.reject do |key, value| + key.to_s[-1] == OVERRIDE_KEY + end + end + def flatten_hash(hash, parent_key = "", result_hash = {}) hash.each do |key, value| new_key = parent_key.empty? ? key : :"#{parent_key}_#{key}" diff --git a/lib/phlex_ui/base.rb b/lib/phlex_ui/base.rb index be1db559a..ac6d3c922 100644 --- a/lib/phlex_ui/base.rb +++ b/lib/phlex_ui/base.rb @@ -4,11 +4,13 @@ module PhlexUI class Base < Phlex::HTML + TAILWIND_MERGER = TailwindMerge::Merger.new.freeze + attr_reader :attrs def initialize(**user_attrs) @attrs = PhlexUI::AttributeMerger.new(default_attrs, user_attrs).call - @attrs[:class] = ::TailwindMerge::Merger.new.merge(@attrs[:class]) if @attrs[:class] + @attrs[:class] = TAILWIND_MERGER.merge(@attrs[:class]) if @attrs[:class] end if defined?(Rails) && Rails.env.development? diff --git a/test/phlex_ui/input_test.rb b/test/phlex_ui/input_test.rb index cc64868a8..4c91de62e 100644 --- a/test/phlex_ui/input_test.rb +++ b/test/phlex_ui/input_test.rb @@ -10,7 +10,7 @@ def test_render_with_all_items PhlexUI.Input(type: "email", placeholder: "Email") end - assert_match(/Email/, output) + assert_match(/placeholder="Email"/, output) end def test_no_destructive_classes_when_error_absent diff --git a/test/phlex_ui/select_test.rb b/test/phlex_ui/select_test.rb index 1c31cac38..6f7617df9 100644 --- a/test/phlex_ui/select_test.rb +++ b/test/phlex_ui/select_test.rb @@ -14,7 +14,7 @@ def test_render_with_all_items output = phlex_context do PhlexUI.Select do - PhlexUI.SelectInput + PhlexUI.SelectInput(name: "NAME") PhlexUI.SelectTrigger do PhlexUI.SelectValue(placeholder: "Placeholder") end @@ -29,5 +29,6 @@ def test_render_with_all_items end assert_match(/John/, output) + assert_match('name="NAME"', output) end end