app/helpers/solder/application_helper.rb~ in solder-0.1.0 vs app/helpers/solder/application_helper.rb~ in solder-0.2.0

- old
+ new

@@ -1,13 +1,36 @@ module Solder module ApplicationHelper + def solder_onto(name, touch: [], attribute_safelist: ["class"], &block) + soldered_html = capture(&block).to_s.strip + fragment = Nokogiri::HTML.fragment(soldered_html) + + first_fragment_child = fragment.first_element_child + + # rehydrate + ui_state = Rails.cache.read "solder/#{solder_key(name)}" + + ui_state&.select { attribute_safelist.include?(_1) }&.each do |attribute_name, value| + first_fragment_child[attribute_name] = sanitize value + end + + # add stimulus controller and create unique key + first_fragment_child["data-controller"] = "#{first_fragment_child["data-controller"]} solder".strip + first_fragment_child["data-solder-key-value"] = solder_key(name) + + first_fragment_child["data-solder-touch"] ||= Array(touch).map(&:to_sgid).map(&:to_s).join(":") + + first_fragment_child.to_html.html_safe + end + def solder_key(name) key = cache_fragment_name(name, skip_digest: true) .flatten .compact .map(&:cache_key) .join(":") - key += ":#{caller(1..1).first}" + + key += ":#{caller.find { _1 =~ /html/ }}" ActiveSupport::Digest.hexdigest(key) end end end