@@ -68,10 +68,18 @@ def initialize(extends:, placeholder:, options:)
6868 @eager = options . delete ( :eager )
6969 @broadcast_each = options . delete ( :broadcast_each )
7070 @controller = options . delete ( :controller )
71+ @updates_for_object = options . delete ( :updates_for )
7172 @html_options = options . delete ( :html_options ) || { }
7273 @data_attributes = html_options . fetch ( :data , { } ) . except ( :sgid , :signed_params )
7374 @model = options . delete ( :model )
75+ @wrapped_for_updates_for = options . delete ( :wrapped_for_updates_for )
76+ if @wrapped_for_updates_for
77+ @html_options [ :keep ] = 'keep'
78+ @data_attributes [ 'updates-for' ] = true
79+ end
7480 @options = data_attributes . any? ? options . merge ( data : data_attributes ) : options
81+
82+ warn "[Futurism] `updates_for` feature is not available for extends: :li or :tr elements." if [ :tr , :li ] . include? ( extends )
7583 end
7684
7785 def dataset
@@ -85,6 +93,53 @@ def dataset
8593 end
8694
8795 def render
96+ return render_updates_for if use_updates_for?
97+
98+ render_tag
99+ end
100+
101+ def transformed_options
102+ dump_options ( options )
103+ end
104+
105+ private
106+
107+ ############
108+ # TODO: Include CableReadyHelper
109+ include CableReady ::Compoundable
110+ include CableReady ::StreamIdentifier
111+ include ActionView ::Context
112+
113+ def updates_for ( *keys , url : nil , debounce : nil , only : nil , html_options : { } , &block )
114+ options = build_options ( *keys , html_options )
115+ options [ :url ] = url if url
116+ options [ :debounce ] = debounce if debounce
117+ options [ :only ] = only if only
118+ tag . updates_for ( **options ) { capture ( &block ) }
119+ end
120+
121+ private
122+
123+ def build_options ( *keys , html_options )
124+ keys . select! ( &:itself )
125+ { identifier : signed_stream_identifier ( compound ( keys ) ) } . merge ( html_options )
126+ end
127+ ############
128+
129+ def render_updates_for
130+ arguments = Array . wrap ( @updates_for_object )
131+ kwargs = arguments . last . is_a? ( Hash ) ? arguments . pop : { }
132+ kwargs [ :html_options ] ||= { }
133+ kwargs [ :html_options ] [ :data ] ||= { }
134+ kwargs [ :html_options ] [ :data ] [ 'ignore-morph' ] = true
135+ kwargs [ :html_options ] [ :data ] [ 'after-update-event-selector' ] = 'futurism-element'
136+
137+ updates_for ( *arguments , **kwargs ) do
138+ render_tag
139+ end
140+ end
141+
142+ def render_tag
88143 case extends
89144 when :li
90145 content_tag :li , placeholder , html_options . deep_merge ( { data : dataset , is : "futurism-li" } )
@@ -95,14 +150,24 @@ def render
95150 end
96151 end
97152
98- def transformed_options
99- dump_options ( options )
153+ def use_updates_for?
154+ @updates_for_object . present? && ! [ :tr , :li ] . include? ( extends )
100155 end
101156
102- private
103-
104157 def signed_params
105- message_verifier . generate ( transformed_options )
158+ message_verifier . generate ( transformed_options . merge ( updates_for_params ) )
159+ end
160+
161+ def updates_for_params
162+ return { } unless use_updates_for? || @wrapped_for_updates_for
163+
164+ {
165+ wrap_for_updates_for : {
166+ extends : extends ,
167+ html_options : html_options ,
168+ data_attributes : data_attributes ,
169+ }
170+ }
106171 end
107172
108173 def signed_controller
0 commit comments