view_component_reflex 1.5.0 → 1.7.2
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 +4 -4
- data/README.md +8 -3
- data/app/components/view_component_reflex/component.rb +41 -19
- data/lib/view_component_reflex.rb +8 -7
- data/lib/view_component_reflex/engine.rb +13 -13
- data/lib/view_component_reflex/state_adapter/memory.rb +25 -0
- data/lib/view_component_reflex/version.rb +3 -3
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e5577d7e345a14f59567739802588506a300b2caa96bba74bd4f12a93752a04
|
4
|
+
data.tar.gz: be4d877d89d50555bde7f1ba929ef4fd5b1e60c72f2e7e921e33e2623574bfa7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 60530d55c39126bd6be3d5be688f08cbe4e84e0b16e444334e438d99ec1a6b05a1f08c102407bea04b9c73ca5ace4bbb4ec013529810bc5363c6bd09e4224d70
|
7
|
+
data.tar.gz: ceebff13ff2407be15ad1d3e851f78130a7bec2d00cdd260bd3ed78d32ebfce596f1763d6608b822d628f0ce91b164a53c47ee2296755733ddac01888ae1bf8c
|
data/README.md
CHANGED
@@ -30,7 +30,7 @@ end
|
|
30
30
|
# counter_component.html.erb
|
31
31
|
<%= component_controller do %>
|
32
32
|
<p><%= @count %></p>
|
33
|
-
|
33
|
+
<%= reflex_tag :increment, :button, "Click" %>
|
34
34
|
<% end %>
|
35
35
|
```
|
36
36
|
|
@@ -70,8 +70,8 @@ end
|
|
70
70
|
```
|
71
71
|
|
72
72
|
### omitted_from_state
|
73
|
-
Return an array of instance variables you want to omit from state.
|
74
|
-
|
73
|
+
Return an array of instance variables you want to omit from state. Only really useful if you're using the session state
|
74
|
+
adapter, and you have an instance variable that can't be serialized.
|
75
75
|
|
76
76
|
```ruby
|
77
77
|
def omitted_from_state
|
@@ -181,6 +181,11 @@ end
|
|
181
181
|
<% end
|
182
182
|
```
|
183
183
|
|
184
|
+
## State
|
185
|
+
|
186
|
+
By default, view_component_reflex stores component state in memory. You can optionally set the state adapter
|
187
|
+
to use the session by changing `config.state_adapter` to `ViewComponentReflex::StateAdapter::Session`
|
188
|
+
|
184
189
|
## Custom State Adapters
|
185
190
|
|
186
191
|
ViewComponentReflex uses session for its state by default. To change this, add
|
@@ -85,7 +85,7 @@ module ViewComponentReflex
|
|
85
85
|
|
86
86
|
def save_state
|
87
87
|
new_state = {}
|
88
|
-
component.
|
88
|
+
component.safe_instance_variables.each do |k|
|
89
89
|
new_state[k] = component.instance_variable_get(k)
|
90
90
|
end
|
91
91
|
set_state(new_state)
|
@@ -102,15 +102,23 @@ module ViewComponentReflex
|
|
102
102
|
helpers.controller.instance_variable_get(:@stimulus_reflex)
|
103
103
|
end
|
104
104
|
|
105
|
-
def component_controller(opts = {}, &blk)
|
105
|
+
def component_controller(opts_or_tag = :div, opts = {}, &blk)
|
106
106
|
self.class.init_stimulus_reflex
|
107
107
|
init_key
|
108
|
-
|
108
|
+
|
109
|
+
tag = :div
|
110
|
+
if opts_or_tag.is_a? Hash
|
111
|
+
options = opts_or_tag
|
112
|
+
else
|
113
|
+
tag = opts_or_tag
|
114
|
+
options = opts
|
115
|
+
end
|
116
|
+
options[:data] = {
|
109
117
|
controller: self.class.stimulus_controller,
|
110
118
|
key: key,
|
111
|
-
**(
|
119
|
+
**(options[:data] || {})
|
112
120
|
}
|
113
|
-
content_tag
|
121
|
+
content_tag tag, capture(&blk), options
|
114
122
|
end
|
115
123
|
|
116
124
|
# key is required if you're using state
|
@@ -125,8 +133,8 @@ module ViewComponentReflex
|
|
125
133
|
@key = key
|
126
134
|
end
|
127
135
|
|
128
|
-
def reflex_tag(reflex, name, content_or_options_with_block =
|
129
|
-
action, method = reflex.split("->")
|
136
|
+
def reflex_tag(reflex, name, content_or_options_with_block = {}, options = {}, escape = true, &block)
|
137
|
+
action, method = reflex.to_s.split("->")
|
130
138
|
if method.nil?
|
131
139
|
method = action
|
132
140
|
action = "click"
|
@@ -157,18 +165,10 @@ module ViewComponentReflex
|
|
157
165
|
|
158
166
|
def key
|
159
167
|
# initialize session state
|
160
|
-
if !stimulus_reflex? ||
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
blacklist = [
|
165
|
-
:@view_context, :@lookup_context, :@view_renderer, :@view_flow,
|
166
|
-
:@virtual_path, :@variant, :@current_template, :@output_buffer, :@key,
|
167
|
-
:@helpers, :@controller, :@request, :@content
|
168
|
-
]
|
169
|
-
instance_variables.reject { |k| blacklist.include?(k) }.each do |k|
|
170
|
-
new_state[k] = instance_variable_get(k) unless omitted_from_state.include?(k)
|
171
|
-
end
|
168
|
+
if !stimulus_reflex? || ViewComponentReflex::Engine.state_adapter.state(request, @key).empty?
|
169
|
+
|
170
|
+
new_state = create_safe_state
|
171
|
+
|
172
172
|
ViewComponentReflex::Engine.state_adapter.store_state(request, @key, new_state)
|
173
173
|
ViewComponentReflex::Engine.state_adapter.store_state(request, "#{@key}_initial", new_state)
|
174
174
|
else
|
@@ -182,8 +182,30 @@ module ViewComponentReflex
|
|
182
182
|
@key
|
183
183
|
end
|
184
184
|
|
185
|
+
def safe_instance_variables
|
186
|
+
instance_variables - unsafe_instance_variables
|
187
|
+
end
|
188
|
+
|
185
189
|
private
|
186
190
|
|
191
|
+
def unsafe_instance_variables
|
192
|
+
[
|
193
|
+
:@view_context, :@lookup_context, :@view_renderer, :@view_flow,
|
194
|
+
:@virtual_path, :@variant, :@current_template, :@output_buffer, :@key,
|
195
|
+
:@helpers, :@controller, :@request, :@content, :@tag_builder
|
196
|
+
]
|
197
|
+
end
|
198
|
+
|
199
|
+
def create_safe_state
|
200
|
+
new_state = {}
|
201
|
+
|
202
|
+
# this will almost certainly break
|
203
|
+
safe_instance_variables.each do |k|
|
204
|
+
new_state[k] = instance_variable_get(k) unless omitted_from_state.include?(k)
|
205
|
+
end
|
206
|
+
new_state
|
207
|
+
end
|
208
|
+
|
187
209
|
def merge_data_attributes(options, attributes)
|
188
210
|
data = options[:data]
|
189
211
|
if data.nil?
|
@@ -1,7 +1,8 @@
|
|
1
|
-
require "view_component_reflex/state_adapter/session"
|
2
|
-
require "view_component_reflex/
|
3
|
-
require
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
require "view_component_reflex/state_adapter/session"
|
2
|
+
require "view_component_reflex/state_adapter/memory"
|
3
|
+
require "view_component_reflex/engine"
|
4
|
+
require 'stimulus_reflex'
|
5
|
+
|
6
|
+
module ViewComponentReflex
|
7
|
+
# Your code goes here...
|
8
|
+
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
module ViewComponentReflex
|
2
|
-
class Engine < ::Rails::Engine
|
3
|
-
class << self
|
4
|
-
mattr_accessor :state_adapter
|
5
|
-
|
6
|
-
self.state_adapter = StateAdapter::
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.configure
|
10
|
-
yield self if block_given?
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
1
|
+
module ViewComponentReflex
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
class << self
|
4
|
+
mattr_accessor :state_adapter
|
5
|
+
|
6
|
+
self.state_adapter = StateAdapter::Memory
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.configure
|
10
|
+
yield self if block_given?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
VIEW_COMPONENT_REFLEX_MEMORY_STATE = {}
|
2
|
+
module ViewComponentReflex
|
3
|
+
module StateAdapter
|
4
|
+
class Memory
|
5
|
+
def self.state(request, key)
|
6
|
+
VIEW_COMPONENT_REFLEX_MEMORY_STATE[request.session.id.to_s] ||= {}
|
7
|
+
VIEW_COMPONENT_REFLEX_MEMORY_STATE[request.session.id.to_s][key] ||= {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.set_state(request, _, key, new_state)
|
11
|
+
new_state.each do |k, v|
|
12
|
+
state(request, key)[k] = v
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.store_state(request, key, new_state = {})
|
17
|
+
VIEW_COMPONENT_REFLEX_MEMORY_STATE[request.session.id.to_s] ||= {}
|
18
|
+
VIEW_COMPONENT_REFLEX_MEMORY_STATE[request.session.id.to_s][key] ||= {}
|
19
|
+
new_state.each do |k, v|
|
20
|
+
VIEW_COMPONENT_REFLEX_MEMORY_STATE[request.session.id.to_s][key][k] = v
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,3 +1,3 @@
|
|
1
|
-
module ViewComponentReflex
|
2
|
-
VERSION = '1.
|
3
|
-
end
|
1
|
+
module ViewComponentReflex
|
2
|
+
VERSION = '1.7.2'
|
3
|
+
end
|
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: 1.
|
4
|
+
version: 1.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua LeBlanc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06
|
11
|
+
date: 2020-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -71,6 +71,7 @@ files:
|
|
71
71
|
- app/components/view_component_reflex/component.rb
|
72
72
|
- lib/view_component_reflex.rb
|
73
73
|
- lib/view_component_reflex/engine.rb
|
74
|
+
- lib/view_component_reflex/state_adapter/memory.rb
|
74
75
|
- lib/view_component_reflex/state_adapter/session.rb
|
75
76
|
- lib/view_component_reflex/version.rb
|
76
77
|
homepage: https://github.com/joshleblanc/view_component_reflex
|