view_component_reflex 3.1.6 → 3.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 457de938235885451ab74f7c2a5136bc6e87443467f8ae7944eb27fb23f1dbdd
|
4
|
+
data.tar.gz: 4b6c6b6152facd010da5f74355e46a9f8db492e8b84e54563b27179f3edf7a93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 300ec189d65159384a26ee644ab7fa2deb3e9609fea703f004822cbde354af444ef2c4f4ed050b3770c4b2f19b81c1f0e710be673f1f570445d41216bb8ab2b7
|
7
|
+
data.tar.gz: 304db5f0fa2e8a98d6cf97603e17c110faa84f82fe06cfdd675f154b69bad27841474dc7ca7a048be500d65ccf957af9545599339acb35e24a8babccbe4dc07c
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module ViewComponentReflex
|
2
2
|
class Component < ViewComponent::Base
|
3
3
|
class_attribute :reflex_base_class, default: ViewComponentReflex::Reflex
|
4
|
+
attr_reader :key
|
4
5
|
|
5
6
|
class << self
|
6
7
|
def init_stimulus_reflex
|
@@ -55,7 +56,7 @@ module ViewComponentReflex
|
|
55
56
|
end
|
56
57
|
|
57
58
|
def component_controller(opts_or_tag = :div, opts = {}, &blk)
|
58
|
-
|
59
|
+
initialize_component
|
59
60
|
|
60
61
|
tag = :div
|
61
62
|
options = if opts_or_tag.is_a? Hash
|
@@ -77,11 +78,64 @@ module ViewComponentReflex
|
|
77
78
|
omitted_from_state.empty?
|
78
79
|
end
|
79
80
|
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
83
|
-
#
|
84
|
-
|
81
|
+
# We can't truly initialize the component without the view_context,
|
82
|
+
# which isn't available in the `initialize` method. We require the
|
83
|
+
# developer to wrap components in `component_controller`, so this is where
|
84
|
+
# we truly initialize the component.
|
85
|
+
# This method is overridden in reflex.rb when the component is re-rendered. The
|
86
|
+
# override simply sets @key to element.dataset[:key]
|
87
|
+
# We don't want it to initialize the state again, and since we're rendering the component
|
88
|
+
# outside of the view, we need to skip the initialize_key method as well
|
89
|
+
def initialize_component
|
90
|
+
initialize_key
|
91
|
+
initialize_state
|
92
|
+
end
|
93
|
+
|
94
|
+
# Note to self:
|
95
|
+
# This has to be in the Component class because there are situations
|
96
|
+
# where the controller is the one rendering the component
|
97
|
+
# so we can't rely on the component created by the reflex
|
98
|
+
def initialize_state
|
99
|
+
return if state_initialized?
|
100
|
+
adapter = ViewComponentReflex::Engine.state_adapter
|
101
|
+
|
102
|
+
# newly mounted
|
103
|
+
if !stimulus_reflex? || adapter.state(request, @key).empty?
|
104
|
+
|
105
|
+
new_state = create_safe_state
|
106
|
+
|
107
|
+
adapter.wrap_write_async do
|
108
|
+
adapter.store_state(request, @key, new_state)
|
109
|
+
adapter.store_state(request, "#{@key}_initial", new_state)
|
110
|
+
end
|
111
|
+
|
112
|
+
# updating a mounted component
|
113
|
+
else
|
114
|
+
initial_state = adapter.state(request, "#{@key}_initial")
|
115
|
+
|
116
|
+
parameters_changed = []
|
117
|
+
adapter.state(request, @key).each do |k, v|
|
118
|
+
instance_value = instance_variable_get(k)
|
119
|
+
if permit_parameter?(initial_state[k], instance_value)
|
120
|
+
parameters_changed << k
|
121
|
+
adapter.wrap_write_async do
|
122
|
+
adapter.set_state(request, controller, "#{@key}_initial", {k => instance_value})
|
123
|
+
adapter.set_state(request, controller, @key, {k => instance_value})
|
124
|
+
end
|
125
|
+
else
|
126
|
+
instance_variable_set(k, v)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
after_state_initialized(parameters_changed)
|
130
|
+
end
|
131
|
+
@state_initialized = true
|
132
|
+
end
|
133
|
+
|
134
|
+
def state_initialized?
|
135
|
+
@state_initialized
|
136
|
+
end
|
137
|
+
|
138
|
+
def initialize_key
|
85
139
|
# we want the erb file that renders the component. `caller` gives the file name,
|
86
140
|
# and line number, which should be unique. We hash it to make it a nice number
|
87
141
|
erb_file = caller.select { |p| p.match? /.\.html\.(haml|erb|slim)/ }[1]
|
@@ -137,44 +191,6 @@ module ViewComponentReflex
|
|
137
191
|
# # no op
|
138
192
|
# end
|
139
193
|
|
140
|
-
def key
|
141
|
-
adapter = ViewComponentReflex::Engine.state_adapter
|
142
|
-
|
143
|
-
# initialize session state
|
144
|
-
if (!stimulus_reflex? || adapter.state(request, @key).empty?) && !@initialized_state
|
145
|
-
|
146
|
-
new_state = create_safe_state
|
147
|
-
|
148
|
-
adapter.wrap_write_async do
|
149
|
-
adapter.store_state(request, @key, new_state)
|
150
|
-
adapter.store_state(request, "#{@key}_initial", new_state)
|
151
|
-
end
|
152
|
-
elsif !@initialized_state
|
153
|
-
initial_state = adapter.state(request, "#{@key}_initial")
|
154
|
-
|
155
|
-
# incoming_params = safe_instance_variables.each_with_object({}) { |var, obj| obj[var] = instance_variable_get(var) }
|
156
|
-
# receive_params(ViewComponentReflex::Engine.state_adapter.state(request, @key), incoming_params)
|
157
|
-
|
158
|
-
parameters_changed = []
|
159
|
-
adapter.state(request, @key).each do |k, v|
|
160
|
-
instance_value = instance_variable_get(k)
|
161
|
-
if permit_parameter?(initial_state[k], instance_value)
|
162
|
-
parameters_changed << k
|
163
|
-
adapter.wrap_write_async do
|
164
|
-
adapter.set_state(request, controller, "#{@key}_initial", {k => instance_value})
|
165
|
-
adapter.set_state(request, controller, @key, {k => instance_value})
|
166
|
-
end
|
167
|
-
else
|
168
|
-
instance_variable_set(k, v)
|
169
|
-
end
|
170
|
-
end
|
171
|
-
after_state_initialized(parameters_changed)
|
172
|
-
end
|
173
|
-
|
174
|
-
@initialized_state = true
|
175
|
-
@key
|
176
|
-
end
|
177
|
-
|
178
194
|
def safe_instance_variables
|
179
195
|
instance_variables - unsafe_instance_variables - omitted_from_state
|
180
196
|
end
|
@@ -185,7 +201,7 @@ module ViewComponentReflex
|
|
185
201
|
[
|
186
202
|
:@view_context, :@lookup_context, :@view_renderer, :@view_flow,
|
187
203
|
:@virtual_path, :@variant, :@current_template, :@output_buffer, :@key,
|
188
|
-
:@helpers, :@controller, :@request, :@tag_builder, :@
|
204
|
+
:@helpers, :@controller, :@request, :@tag_builder, :@state_initialized
|
189
205
|
]
|
190
206
|
end
|
191
207
|
|
@@ -196,6 +212,7 @@ module ViewComponentReflex
|
|
196
212
|
safe_instance_variables.each do |k|
|
197
213
|
new_state[k] = instance_variable_get(k)
|
198
214
|
end
|
215
|
+
|
199
216
|
new_state
|
200
217
|
end
|
201
218
|
|
@@ -24,7 +24,6 @@ module ViewComponentReflex
|
|
24
24
|
html: html.inner_html,
|
25
25
|
children_only: true,
|
26
26
|
permanent_attribute_name: "data-reflex-permanent",
|
27
|
-
stimulus_reflex: stimulus_reflex_data
|
28
27
|
)
|
29
28
|
end
|
30
29
|
end
|
@@ -44,17 +43,17 @@ module ViewComponentReflex
|
|
44
43
|
|
45
44
|
def refresh_component!
|
46
45
|
component.tap do |k|
|
47
|
-
k.define_singleton_method(:
|
48
|
-
element.dataset[:key]
|
46
|
+
k.define_singleton_method(:initialize_component) do
|
47
|
+
@key = element.dataset[:key]
|
49
48
|
end
|
50
49
|
end
|
50
|
+
|
51
51
|
document = Nokogiri::HTML(component.render_in(controller.view_context))
|
52
52
|
CableReady::Channels.instance[stream].morph(
|
53
53
|
selector: selector,
|
54
54
|
children_only: true,
|
55
55
|
html: document.css(selector).inner_html,
|
56
56
|
permanent_attribute_name: "data-reflex-permanent",
|
57
|
-
stimulus_reflex: stimulus_reflex_data
|
58
57
|
)
|
59
58
|
end
|
60
59
|
|
@@ -96,22 +95,10 @@ module ViewComponentReflex
|
|
96
95
|
!!name.to_proc
|
97
96
|
end
|
98
97
|
|
99
|
-
# this is copied out of stimulus_reflex/reflex.rb and modified
|
100
|
-
def morph(selectors, html = "")
|
101
|
-
case selectors
|
102
|
-
when :nothing
|
103
|
-
@broadcaster = StimulusReflex::NothingBroadcaster.new(self)
|
104
|
-
when :null
|
105
|
-
@broadcaster = NullBroadcaster.new(self)
|
106
|
-
else
|
107
|
-
@broadcaster = StimulusReflex::SelectorBroadcaster.new(self) unless broadcaster.selector?
|
108
|
-
broadcaster.morphs << [selectors, html]
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
98
|
def method_missing(name, *args, &blk)
|
113
|
-
morph :
|
99
|
+
morph :nothing
|
114
100
|
super unless respond_to_missing?(name)
|
101
|
+
|
115
102
|
state.each do |k, v|
|
116
103
|
component.instance_variable_set(k, v)
|
117
104
|
end
|
@@ -184,11 +171,23 @@ module ViewComponentReflex
|
|
184
171
|
end
|
185
172
|
|
186
173
|
def set_state(new_state = {})
|
187
|
-
|
174
|
+
state_adapter.set_state(request, controller, key, new_state)
|
175
|
+
end
|
176
|
+
|
177
|
+
def key
|
178
|
+
element.dataset[:key]
|
179
|
+
end
|
180
|
+
|
181
|
+
def state_adapter
|
182
|
+
ViewComponentReflex::Engine.state_adapter
|
188
183
|
end
|
189
184
|
|
190
185
|
def state
|
191
|
-
|
186
|
+
state_adapter.state(request, key)
|
187
|
+
end
|
188
|
+
|
189
|
+
def initial_state
|
190
|
+
state_adapter.state(request, "#{key}_initial")
|
192
191
|
end
|
193
192
|
|
194
193
|
def save_state
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: view_component_reflex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua LeBlanc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-02-
|
11
|
+
date: 2021-02-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -85,7 +85,6 @@ files:
|
|
85
85
|
- app/components/view_component_reflex/component.rb
|
86
86
|
- lib/view_component_reflex.rb
|
87
87
|
- lib/view_component_reflex/engine.rb
|
88
|
-
- lib/view_component_reflex/null_broadcaster.rb
|
89
88
|
- lib/view_component_reflex/reflex.rb
|
90
89
|
- lib/view_component_reflex/reflex_factory.rb
|
91
90
|
- lib/view_component_reflex/state_adapter/base.rb
|