view_component_reflex 1.4.0 → 1.5.0

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: f79604a043d4aa353ade5fec1bb3c1d7f263352304555fe3fe70dfd35fc921b9
4
- data.tar.gz: 88259eb0924cf1508df64f5bb3565fac61134871d2ac210c3166c560bb0f028e
3
+ metadata.gz: aed815b44b0d4708ba9bb85e9a08912f15f4d66442432df5d0933866f66e3aba
4
+ data.tar.gz: 96262b95434700007b142be8411d115dc50cdd0d5b94baf5200b582317ce858b
5
5
  SHA512:
6
- metadata.gz: 30d400ca7ace85a4f9bc9b25b6e4cdddfceb6518c980cbcb35f6e6f2216b03a5615cb882b91f9f9097bbce2b2495d306698b4c5bbedecae4259e97750d396bc9
7
- data.tar.gz: 1c70cda5b7f89057079b86729d97a47a5b429e5f0bdd56732c4695841fe933c0ff57bf1b5143ec0fb7c54cac67bbc8a9c32d031337f33ec91949eb420eba67ac
6
+ metadata.gz: 8cdd11ece267f4cc206af3e12d3e62b4881fdde56afb28a23b078437448842eb54e7aa1da43a68dd4f071544bb360e95c15db2b4ea4599da9ee7e57e7887a2d8
7
+ data.tar.gz: 64c8053422748319fd6460881170c3b5a9b84da0577180ebbf8a3dd3e62e5b1563c5d9e17c617de798141466f85894b42b281377aa553ff9a3840d9c522564d8
data/README.md CHANGED
@@ -39,7 +39,7 @@ end
39
39
  In order to reconcile state to components in collections, you can specify a `collection_key` method that returns some
40
40
  value unique to that component.
41
41
 
42
- ```
42
+ ```ruby
43
43
  class TodoComponent < ViewComponentReflex::Component
44
44
  def initialize(todo:)
45
45
  @todo = todo
@@ -59,16 +59,127 @@ end
59
59
  If a new parameter is passed to the component during rendering, it is used instead of what's in state.
60
60
  If you're storing instances in state, you can use this to properly compare them.
61
61
 
62
+ ```ruby
63
+ def permit_parameter?(initial_param, new_param)
64
+ if new_param.instance_of? MyModel
65
+ new_param.id == @my_model.id
66
+ else
67
+ super
68
+ end
69
+ end
70
+ ```
71
+
62
72
  ### omitted_from_state
63
73
  Return an array of instance variables you want to omit from state. Useful if you have an object
64
74
  that isn't serializable as an instance variable, like a form.
65
75
 
66
- ```
76
+ ```ruby
67
77
  def omitted_from_state
68
78
  [:@form]
69
79
  end
70
80
  ```
71
81
 
82
+ ### reflex_tag(reflex, name, content_or_options_with_block = nil, options = nil, escape = true, &block)
83
+ This shares the same definition as `content_tag`, except it accepts a reflex as the first parameter.
84
+
85
+ ```erb
86
+ <%= reflex_tag :increment, :button, "Click me!" %>
87
+ ```
88
+
89
+ Would add a click handler to the `increment` method on your component.
90
+
91
+ To use a non-click event, specific that with `->` notiation
92
+
93
+ ```erb
94
+ <%= reflex_tag "mouseenter->increment", :button, "Click me!" %>
95
+ ```
96
+
97
+ ### collection_key
98
+ If you're rendering a component as a collection with `MyComponent.with_collection(SomeCollection)`, you must define this method to return some unique value for the component.
99
+ This is used to reconcile state in the background.
100
+
101
+ ```ruby
102
+ def initialize
103
+ @my_model = MyModel.new
104
+ end
105
+
106
+ def collection_key
107
+ @my_model.id
108
+ end
109
+ ```
110
+
111
+ ### prevent_refresh!
112
+ By default, VCR will re-render your component after it executes your method. `revent_refresh!` prevents this from happening.
113
+
114
+ ```ruby
115
+ def my_method
116
+ prevent_refresh!
117
+ @foo = Lbar
118
+ end # the rendered page will not reflect this change
119
+ ```
120
+
121
+ ### refresh_all!
122
+ Refresh the entire body of the page
123
+
124
+ ```ruby
125
+ def do_some_global_action
126
+ prevent_refresh!
127
+ session[:model] = MyModel.new
128
+ refresh_all!
129
+ end
130
+ ```
131
+
132
+ ### key
133
+ 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
134
+
135
+ ```erb
136
+ <button type="button" data-reflex="click->MyComponent#do_something" data-key="<%= key %>">Click me!</button>
137
+ ```
138
+
139
+ ### component_controller(options = {}, &blk)
140
+ This is a view helper to properly connect VCR to the component. It outputs `<div data-controller="my-controller" key=<%= key %></div>`
141
+ You *must* wrap your component in this for everything to work properly.
142
+
143
+ ```erb
144
+ <%= component_controller do %>
145
+ <p><%= @count %></p
146
+ <% end %>
147
+ ```
148
+
149
+ ## Common patterns
150
+ A lot of the time, you only need to update specific components when changing instance variables. For example, changing `@loading` might only need
151
+ to display a spinner somewhere on the page. You can define setters to implicitly render the appropriate pieces of dom whenever that variable is set
152
+
153
+ ```ruby
154
+ def initialize
155
+ @loading = false
156
+ end
157
+
158
+ def loading=(new_value)
159
+ @loading = new_value
160
+ refresh! '#loader'
161
+ end
162
+
163
+ def do_expensive_action
164
+ prevent_refresh!
165
+
166
+ self.loading = true
167
+ execute_it
168
+ self.loading = false
169
+ end
170
+ ```
171
+
172
+ ```erb
173
+ <%= component_controller do %>
174
+ <div id="loader">
175
+ <% if @loading %>
176
+ <p>Loading...</p>
177
+ <% end %>
178
+ </div>
179
+
180
+ <button type="button" data-reflex="click->MyComponent#do_expensive_action" data-key="<%= key %>">Click me!</button>
181
+ <% end
182
+ ```
72
183
 
73
184
  ## Custom State Adapters
74
185
 
@@ -125,6 +125,24 @@ module ViewComponentReflex
125
125
  @key = key
126
126
  end
127
127
 
128
+ def reflex_tag(reflex, name, content_or_options_with_block = nil, options = nil, escape = true, &block)
129
+ action, method = reflex.split("->")
130
+ if method.nil?
131
+ method = action
132
+ action = "click"
133
+ end
134
+ data_attributes = {
135
+ reflex: "#{action}->#{self.class.name}##{method}",
136
+ key: key
137
+ }
138
+ if content_or_options_with_block.is_a?(Hash)
139
+ merge_data_attributes(content_or_options_with_block, data_attributes)
140
+ else
141
+ merge_data_attributes(options, data_attributes)
142
+ end
143
+ content_tag(name, content_or_options_with_block, options, escape, &block)
144
+ end
145
+
128
146
  def collection_key
129
147
  nil
130
148
  end
@@ -163,5 +181,16 @@ module ViewComponentReflex
163
181
  end
164
182
  @key
165
183
  end
184
+
185
+ private
186
+
187
+ def merge_data_attributes(options, attributes)
188
+ data = options[:data]
189
+ if data.nil?
190
+ options[:data] = attributes
191
+ else
192
+ options[:data].merge! attributes
193
+ end
194
+ end
166
195
  end
167
196
  end
@@ -1,3 +1,3 @@
1
1
  module ViewComponentReflex
2
- VERSION = '1.4.0'
2
+ VERSION = '1.5.0'
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: 1.4.0
4
+ version: 1.5.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: 2020-06-21 00:00:00.000000000 Z
11
+ date: 2020-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails