view_component_reflex 2.0.2 → 2.1.4

Sign up to get free protection for your applications and to get access to all the features.
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