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 +4 -4
 - data/README.md +25 -1
 - data/app/components/view_component_reflex/component.rb +13 -5
 - data/lib/view_component_reflex.rb +1 -0
 - data/{app/reflexes → lib}/view_component_reflex/reflex.rb +24 -5
 - data/lib/view_component_reflex/state_adapter/memory.rb +1 -1
 - data/lib/view_component_reflex/version.rb +1 -1
 - metadata +3 -3
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 2fdf34d064e1a90d42f689dbeac337bfcefdecb34da14005a3333985de710d32
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 8de6a22148047c13913d7363fb87c61cee167c7cb7d6b3ddc841f4d5af259233
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 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 ||=  
     | 
| 
      
 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 
     | 
    
         
            -
                     
     | 
| 
      
 27 
     | 
    
         
            +
                  options = if opts_or_tag.is_a? Hash
         
     | 
| 
      
 28 
     | 
    
         
            +
                    opts_or_tag
         
     | 
| 
       25 
29 
     | 
    
         
             
                  else
         
     | 
| 
       26 
30 
     | 
    
         
             
                    tag = opts_or_tag
         
     | 
| 
       27 
     | 
    
         
            -
                     
     | 
| 
      
 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 
     | 
    
         
            -
                       
     | 
| 
      
 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 
     | 
| 
      
 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 
     | 
    
         
            -
                 
     | 
| 
       72 
     | 
    
         
            -
             
     | 
| 
       73 
     | 
    
         
            -
                   
     | 
| 
      
 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
         
     | 
    
        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. 
     | 
| 
      
 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- 
     | 
| 
      
 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
         
     |