view_component_reflex 3.0.3 → 3.1.0
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 +11 -0
- data/app/components/view_component_reflex/component.rb +2 -2
- data/lib/view_component_reflex.rb +1 -0
- data/lib/view_component_reflex/reflex.rb +58 -31
- data/lib/view_component_reflex/state_adapter/base.rb +18 -0
- data/lib/view_component_reflex/state_adapter/memory.rb +1 -12
- data/lib/view_component_reflex/state_adapter/redis.rb +4 -3
- data/lib/view_component_reflex/state_adapter/session.rb +1 -1
- data/lib/view_component_reflex/version.rb +1 -1
- 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: c044811ae2dc2de577c5d2c358bc47717c6db79e833537ffe30912b1324ed67e
|
4
|
+
data.tar.gz: 776a2f724d7b32dbf742bbaf3a7ffb14755767f01c13702313b5cf6f40950e4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b941db2658a7764e881383582d5244855dd09f8ec336d20165c07a9d9104d2ece87e0a4309f91b293f4329e70f0b22019f8fe8e31469dd3edb26519ff6d575b2
|
7
|
+
data.tar.gz: 3180e0b52a0709ecba31fc9200d5265646b8149d8e10ec45a674cf87d229a7bb706663edda3ad06a1a0cc22c707b570daea15c4ae58779c9e430e12d189a894f
|
data/README.md
CHANGED
@@ -176,6 +176,17 @@ def do_some_global_action
|
|
176
176
|
end
|
177
177
|
```
|
178
178
|
|
179
|
+
### stream_to(channel)
|
180
|
+
Stream to a custom channel, rather than the default stimulus reflex one
|
181
|
+
|
182
|
+
```ruby
|
183
|
+
def do_something
|
184
|
+
stream_to MyChannel
|
185
|
+
|
186
|
+
@foo = :bar
|
187
|
+
end
|
188
|
+
```
|
189
|
+
|
179
190
|
### key
|
180
191
|
This is a key unique to a particular component. It's used to reconcile state between renders, and should be passed as a data attribute whenever a reflex is called
|
181
192
|
|
@@ -47,7 +47,7 @@ module ViewComponentReflex
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def self.stimulus_controller
|
50
|
-
name.chomp("Component").underscore.dasherize
|
50
|
+
name.chomp("Component").underscore.dasherize.gsub("/", "--")
|
51
51
|
end
|
52
52
|
|
53
53
|
def stimulus_reflex?
|
@@ -57,7 +57,7 @@ module ViewComponentReflex
|
|
57
57
|
def component_controller(opts_or_tag = :div, opts = {}, &blk)
|
58
58
|
init_key
|
59
59
|
|
60
|
-
tag = :
|
60
|
+
tag = :di
|
61
61
|
options = if opts_or_tag.is_a? Hash
|
62
62
|
opts_or_tag
|
63
63
|
else
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "stimulus_reflex"
|
2
2
|
require 'view_component_reflex/reflex_factory'
|
3
|
+
require "view_component_reflex/state_adapter/base"
|
3
4
|
require "view_component_reflex/state_adapter/session"
|
4
5
|
require "view_component_reflex/state_adapter/memory"
|
5
6
|
require "view_component_reflex/state_adapter/redis"
|
@@ -19,21 +19,12 @@ module ViewComponentReflex
|
|
19
19
|
[primary_selector, *rest].each do |s|
|
20
20
|
html = document.css(s)
|
21
21
|
if html.present?
|
22
|
-
CableReady::Channels.instance[
|
22
|
+
CableReady::Channels.instance[stream].morph(
|
23
23
|
selector: s,
|
24
24
|
html: html.inner_html,
|
25
25
|
children_only: true,
|
26
26
|
permanent_attribute_name: "data-reflex-permanent",
|
27
|
-
stimulus_reflex:
|
28
|
-
reflex_id: reflex_id,
|
29
|
-
xpath: xpath,
|
30
|
-
c_xpath: c_xpath,
|
31
|
-
target: target,
|
32
|
-
reflex_controller: reflex_controller,
|
33
|
-
url: url,
|
34
|
-
morph: :page,
|
35
|
-
attrs: {key: element.dataset[:key]}
|
36
|
-
}
|
27
|
+
stimulus_reflex: stimulus_reflex_data
|
37
28
|
)
|
38
29
|
end
|
39
30
|
end
|
@@ -43,6 +34,14 @@ module ViewComponentReflex
|
|
43
34
|
cable_ready.broadcast
|
44
35
|
end
|
45
36
|
|
37
|
+
def stream
|
38
|
+
@stream ||= stream_name
|
39
|
+
end
|
40
|
+
|
41
|
+
def stream_to(channel)
|
42
|
+
@stream = channel
|
43
|
+
end
|
44
|
+
|
46
45
|
def refresh_component!
|
47
46
|
component.tap do |k|
|
48
47
|
k.define_singleton_method(:key) do
|
@@ -50,24 +49,30 @@ module ViewComponentReflex
|
|
50
49
|
end
|
51
50
|
end
|
52
51
|
document = Nokogiri::HTML(component.render_in(controller.view_context))
|
53
|
-
CableReady::Channels.instance[
|
52
|
+
CableReady::Channels.instance[stream].morph(
|
54
53
|
selector: selector,
|
55
54
|
children_only: true,
|
56
55
|
html: document.css(selector).inner_html,
|
57
56
|
permanent_attribute_name: "data-reflex-permanent",
|
58
|
-
stimulus_reflex:
|
59
|
-
reflex_id: reflex_id,
|
60
|
-
xpath: xpath,
|
61
|
-
target: target,
|
62
|
-
c_xpath: c_xpath,
|
63
|
-
reflex_controller: reflex_controller,
|
64
|
-
url: url,
|
65
|
-
morph: :page,
|
66
|
-
attrs: {key: element.dataset[:key]}
|
67
|
-
}
|
57
|
+
stimulus_reflex: stimulus_reflex_data
|
68
58
|
)
|
69
59
|
end
|
70
60
|
|
61
|
+
def stimulus_reflex_data
|
62
|
+
{
|
63
|
+
reflex_id: reflex_id,
|
64
|
+
xpath: xpath,
|
65
|
+
target: target,
|
66
|
+
c_xpath: c_xpath,
|
67
|
+
reflex_controller: reflex_controller,
|
68
|
+
url: url,
|
69
|
+
morph: :page,
|
70
|
+
attrs: {
|
71
|
+
key: element.dataset[:key]
|
72
|
+
}
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
71
76
|
def target
|
72
77
|
"#{component_class}##{method_name}"
|
73
78
|
end
|
@@ -127,27 +132,49 @@ module ViewComponentReflex
|
|
127
132
|
end
|
128
133
|
|
129
134
|
def stimulate(target, data)
|
130
|
-
|
131
|
-
|
132
|
-
|
135
|
+
data_to_receive = {}
|
136
|
+
|
137
|
+
stimulus_reflex_data.each do |k, v|
|
138
|
+
data_to_receive[k.to_s.camelize(:lower)] = v
|
139
|
+
end
|
140
|
+
|
141
|
+
data_to_receive["dataset"] = data.each_with_object({}) do |(k, v), o|
|
142
|
+
o["data-#{k}"] = v
|
133
143
|
end
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
144
|
+
|
145
|
+
data_to_receive["attrs"] = element.attributes.to_h.symbolize_keys
|
146
|
+
data_to_receive["target"] = target
|
147
|
+
|
148
|
+
channel.receive data_to_receive
|
139
149
|
end
|
140
150
|
|
141
151
|
def component
|
142
152
|
return @component if @component
|
143
153
|
@component = component_class.allocate
|
144
154
|
reflex = self
|
145
|
-
exposed_methods = [
|
155
|
+
exposed_methods = [
|
156
|
+
:params,
|
157
|
+
:request,
|
158
|
+
:connection,
|
159
|
+
:element,
|
160
|
+
:refresh!,
|
161
|
+
:refresh_all!,
|
162
|
+
:stimulus_controller,
|
163
|
+
:session,
|
164
|
+
:prevent_refresh!,
|
165
|
+
:selector,
|
166
|
+
:stimulate
|
167
|
+
]
|
146
168
|
exposed_methods.each do |meth|
|
147
169
|
@component.define_singleton_method(meth) do |*a|
|
148
170
|
reflex.send(meth, *a)
|
149
171
|
end
|
150
172
|
end
|
173
|
+
|
174
|
+
@component.define_singleton_method(:reflex) do
|
175
|
+
reflex
|
176
|
+
end
|
177
|
+
|
151
178
|
@component
|
152
179
|
end
|
153
180
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
VIEW_COMPONENT_REFLEX_MEMORY_STATE = {}
|
2
2
|
module ViewComponentReflex
|
3
3
|
module StateAdapter
|
4
|
-
class Memory
|
4
|
+
class Memory < Base
|
5
5
|
def self.state(request, key)
|
6
6
|
id = extract_id(request)
|
7
7
|
|
@@ -28,17 +28,6 @@ module ViewComponentReflex
|
|
28
28
|
def self.wrap_write_async
|
29
29
|
yield
|
30
30
|
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def self.extract_id(request)
|
35
|
-
session = request&.session
|
36
|
-
if session.respond_to? :id
|
37
|
-
session.id.to_s
|
38
|
-
else
|
39
|
-
nil
|
40
|
-
end
|
41
|
-
end
|
42
31
|
end
|
43
32
|
end
|
44
33
|
end
|
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
module ViewComponentReflex
|
12
12
|
module StateAdapter
|
13
|
-
class Redis
|
13
|
+
class Redis < Base
|
14
14
|
attr_reader :client, :ttl
|
15
15
|
|
16
16
|
def initialize(redis_opts:, ttl: 3600)
|
@@ -67,8 +67,9 @@ module ViewComponentReflex
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def get_key(request, key)
|
70
|
-
|
70
|
+
id = Redis.extract_id(request)
|
71
|
+
"#{id}_#{key}_session_reflex_redis"
|
71
72
|
end
|
72
73
|
end
|
73
74
|
end
|
74
|
-
end
|
75
|
+
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: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua LeBlanc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -87,6 +87,7 @@ files:
|
|
87
87
|
- lib/view_component_reflex/engine.rb
|
88
88
|
- lib/view_component_reflex/reflex.rb
|
89
89
|
- lib/view_component_reflex/reflex_factory.rb
|
90
|
+
- lib/view_component_reflex/state_adapter/base.rb
|
90
91
|
- lib/view_component_reflex/state_adapter/memory.rb
|
91
92
|
- lib/view_component_reflex/state_adapter/redis.rb
|
92
93
|
- lib/view_component_reflex/state_adapter/session.rb
|