view_component_reflex 2.0.2 → 2.1.4

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: d6da4b2d9e532fefeb33b06d18081a1be6a281545a7716dc0650f2e5facd44d3
4
- data.tar.gz: f267ea6850f2fd12250d19af6183ca4b48266b38c37d0486375efa11871ab391
3
+ metadata.gz: 2fdf34d064e1a90d42f689dbeac337bfcefdecb34da14005a3333985de710d32
4
+ data.tar.gz: 8de6a22148047c13913d7363fb87c61cee167c7cb7d6b3ddc841f4d5af259233
5
5
  SHA512:
6
- metadata.gz: 9bfecb324ea02fc969beba3a393752d73881a6fd917e16bcbbc49a0082113c46c4a2a0c27e1c2f9a8eb501f6429b992a0eff4ce078cc32ebc87cec1f589f0612
7
- data.tar.gz: 45b0510fea9923a7edc82eef3ade6d01459134627c9e505c0c92aadd2c16be05c11ab08aa9220e363d3ee79b8f73a9885138777f963b9e38bf4252178312a3f4
6
+ metadata.gz: 0f4f49aca8e48a7addfdc6590cff4d2e8bf21c2aca5c9588af7ed673b90614f12d043cdfdd760a6653efaa6a064c536c693e1373be1d89130e78c4d21fc3845b
7
+ data.tar.gz: b0e40d72439efa641a044eef1c36842a6d3532a27ff6c029b7d0fa0798a61c72e468879289c5f85f4f2cb95db561c35f39af0d59653ad110e54f1ee2f620f35c
data/README.md CHANGED
@@ -108,6 +108,20 @@ def collection_key
108
108
  end
109
109
  ```
110
110
 
111
+ ### stimulate(target, data)
112
+ Stimulate another reflex from within your component. This typically requires the key of the component you're stimulating
113
+ which can be passed in via parameters.
114
+
115
+ ```ruby
116
+ def initialize(parent_key)
117
+ @parent_key = parent_key
118
+ end
119
+
120
+ def stimulate_other
121
+ stimulate("OtherComponent#method", { key: @parent_key })
122
+ end
123
+ ```
124
+
111
125
  ### refresh!(selectors)
112
126
  Refresh a specific element on the page. Using this will implicitly run `prevent_render!`.
113
127
  If you want to render a specific element, as well as the component, a common pattern would be to pass `selector` as one of the parameters
@@ -205,7 +219,7 @@ ViewComponentReflex uses session for its state by default. To change this, add
205
219
  an initializer to `config/initializers/view_component_reflex.rb`.
206
220
 
207
221
  ```ruby
208
- ViewComponentReflex.configure do |config|
222
+ ViewComponentReflex::Engine.configure do |config|
209
223
  config.state_adapter = YourAdapter
210
224
  end
211
225
  ```
@@ -265,9 +279,19 @@ Or install it yourself as:
265
279
  $ gem install view_component_reflex
266
280
  ```
267
281
 
282
+ ## Common problems
283
+
284
+ # Uninitialized constants \<component\>Reflex
285
+ A component needs to be wrapped in `<%= component_controller do %>` in order to properly initialize, otherwise the Reflex class won't get created.
286
+
268
287
  ## License
269
288
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
270
289
 
271
290
  ## Caveats
272
291
 
273
292
  State uses session to maintain state as of right now. It also assumes your component view is written with the file extension `.html.erb`
293
+
294
+ ## Support me
295
+
296
+ <a href="https://www.buymeacoffee.com/jleblanc" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="40" ></a>
297
+
@@ -2,7 +2,11 @@ module ViewComponentReflex
2
2
  class Component < ViewComponent::Base
3
3
  class << self
4
4
  def init_stimulus_reflex
5
- @stimulus_reflex ||= Object.const_set(name + "Reflex", Class.new(Reflex))
5
+ @stimulus_reflex ||= if name.include? "::"
6
+ module_parent.const_set(name.split("::").last + "Reflex", Class.new(Reflex))
7
+ else
8
+ Object.const_set(name + "Reflex", Class.new(Reflex))
9
+ end
6
10
  @stimulus_reflex.component_class = self
7
11
  end
8
12
  end
@@ -20,11 +24,11 @@ module ViewComponentReflex
20
24
  init_key
21
25
 
22
26
  tag = :div
23
- if opts_or_tag.is_a? Hash
24
- options = opts_or_tag
27
+ options = if opts_or_tag.is_a? Hash
28
+ opts_or_tag
25
29
  else
26
30
  tag = opts_or_tag
27
- options = opts
31
+ opts
28
32
  end
29
33
  options[:data] = {
30
34
  controller: self.class.stimulus_controller,
@@ -91,7 +95,11 @@ module ViewComponentReflex
91
95
  else
92
96
  initial_state = ViewComponentReflex::Engine.state_adapter.state(request, "#{@key}_initial")
93
97
  ViewComponentReflex::Engine.state_adapter.state(request, @key).each do |k, v|
94
- unless permit_parameter?(initial_state[k], instance_variable_get(k))
98
+ instance_value = instance_variable_get(k)
99
+ if permit_parameter?(initial_state[k], instance_value)
100
+ ViewComponentReflex::Engine.state_adapter.set_state(request, controller, "#{@key}_initial", { k => instance_value })
101
+ ViewComponentReflex::Engine.state_adapter.set_state(request, controller, @key, { k => instance_value })
102
+ else
95
103
  instance_variable_set(k, v)
96
104
  end
97
105
  end
@@ -2,6 +2,7 @@ require "view_component_reflex/state_adapter/session"
2
2
  require "view_component_reflex/state_adapter/memory"
3
3
  require "view_component_reflex/engine"
4
4
  require "stimulus_reflex"
5
+ require "view_component_reflex/reflex"
5
6
 
6
7
  module ViewComponentReflex
7
8
  # Your code goes here...
@@ -61,19 +61,26 @@ module ViewComponentReflex
61
61
  # uses method to gather the method parameters, but since we're abusing
62
62
  # method_missing here, that'll always fail
63
63
  def method(name)
64
- name.to_sym.to_proc
64
+ component.method(name.to_sym)
65
65
  end
66
66
 
67
67
  def respond_to_missing?(name, _ = false)
68
68
  !!name.to_proc
69
69
  end
70
70
 
71
- before_reflex do |a|
72
- a.send a.method_name
73
- throw :abort
71
+ # this is copied out of stimulus_reflex/reflex.rb and modified
72
+ def morph(selectors, html = "")
73
+ case selectors
74
+ when :nothing
75
+ @broadcaster = StimulusReflex::NothingBroadcaster.new(self)
76
+ else
77
+ @broadcaster = StimulusReflex::SelectorBroadcaster.new(self) unless broadcaster.selector?
78
+ broadcaster.morphs << [selectors, html]
79
+ end
74
80
  end
75
81
 
76
82
  def method_missing(name, *args)
83
+ morph :nothing
77
84
  super unless respond_to_missing?(name)
78
85
  state.each do |k, v|
79
86
  component.instance_variable_set(k, v)
@@ -96,11 +103,23 @@ module ViewComponentReflex
96
103
  component_class.stimulus_controller
97
104
  end
98
105
 
106
+ def stimulate(target, data)
107
+ dataset = {}
108
+ data.each do |k, v|
109
+ dataset["data-#{k}"] = v.to_s
110
+ end
111
+ channel.receive({
112
+ "target" => target,
113
+ "attrs" => element.attributes.to_h.symbolize_keys,
114
+ "dataset" => dataset
115
+ })
116
+ end
117
+
99
118
  def component
100
119
  return @component if @component
101
120
  @component = component_class.allocate
102
121
  reflex = self
103
- exposed_methods = [:params, :request, :element, :refresh!, :refresh_all!, :stimulus_controller, :session, :prevent_refresh!, :selector]
122
+ exposed_methods = [:params, :request, :element, :refresh!, :refresh_all!, :stimulus_controller, :session, :prevent_refresh!, :selector, :stimulate]
104
123
  exposed_methods.each do |meth|
105
124
  @component.define_singleton_method(meth) do |*a|
106
125
  reflex.send(meth, *a)
@@ -15,7 +15,7 @@ module ViewComponentReflex
15
15
 
16
16
  def self.store_state(request, key, new_state = {})
17
17
  VIEW_COMPONENT_REFLEX_MEMORY_STATE[request.session.id.to_s] ||= {}
18
- VIEW_COMPONENT_REFLEX_MEMORY_STATE[request.session.id.to_s][key] ||= {}
18
+ VIEW_COMPONENT_REFLEX_MEMORY_STATE[request.session.id.to_s][key] = {}
19
19
  new_state.each do |k, v|
20
20
  VIEW_COMPONENT_REFLEX_MEMORY_STATE[request.session.id.to_s][key][k] = v
21
21
  end
@@ -1,3 +1,3 @@
1
1
  module ViewComponentReflex
2
- VERSION = '2.0.2'
2
+ VERSION = '2.1.4'
3
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: 2.0.2
4
+ version: 2.1.4
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-07-07 00:00:00.000000000 Z
11
+ date: 2020-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -69,9 +69,9 @@ files:
69
69
  - README.md
70
70
  - Rakefile
71
71
  - app/components/view_component_reflex/component.rb
72
- - app/reflexes/view_component_reflex/reflex.rb
73
72
  - lib/view_component_reflex.rb
74
73
  - lib/view_component_reflex/engine.rb
74
+ - lib/view_component_reflex/reflex.rb
75
75
  - lib/view_component_reflex/state_adapter/memory.rb
76
76
  - lib/view_component_reflex/state_adapter/session.rb
77
77
  - lib/view_component_reflex/version.rb