stimulus_reflex 3.3.0.pre1 → 3.3.0.pre2

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.

Potentially problematic release.


This version of stimulus_reflex might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb3ab10321ba245b37a1c1c930f48218146079db9b3448adf6ec86511a8eee27
4
- data.tar.gz: f9e891d1775eca3787f9d95c3860d1cab43fec42895cb97a25f698636d7912e7
3
+ metadata.gz: 16b54837068db127425aef4bb7d055fb461ed06cfd1693a1303f4b2e7c8e94d2
4
+ data.tar.gz: 23cb0849034978ecae65551b069f0173d9a63fd78db7233b11e4453be752cb48
5
5
  SHA512:
6
- metadata.gz: 6bba44eda7278bf6b54fd3ce3ee511169d6a1170164bea35ec8cf0f3df0b2c55bedd4c4030ee37c650af35c52761e386192e2b1844bd9676244bb67206b2097d
7
- data.tar.gz: 8887eb98ce990e7c70e508628850c0955dc81d8a03ec02c94d8e4150a65c708274e7450eb00f81bf7d4be7e8b9f4ca53a201791381a85700c3eec6d26f27de5d
6
+ metadata.gz: 88f1f347aad5757ee0f2420f4d781626f759f2bd00ed8392f101d52fd813e1e6e1ae9cbfde1fa3954332ad55766569cb1bcf33a56d1dc26b952057e60f97ad7b
7
+ data.tar.gz: eadb6be440d20ab3183e373e07579fbd7462d2b2fab06c60a80a0d9991c7003f10674e6696eb34e30e320e359b544bc8d25b9c0252bb251cb0d8a32f5946d766
@@ -2,11 +2,30 @@
2
2
 
3
3
  ## [Unreleased](https://github.com/hopsoft/stimulus_reflex/tree/HEAD)
4
4
 
5
- [Full Changelog](https://github.com/hopsoft/stimulus_reflex/compare/v3.3.0.pre0...HEAD)
5
+ [Full Changelog](https://github.com/hopsoft/stimulus_reflex/compare/v3.3.0.pre1...HEAD)
6
+
7
+ **Closed issues:**
8
+
9
+ - afterReflex not always firing on morph with selectors [\#269](https://github.com/hopsoft/stimulus_reflex/issues/269)
10
+ - Lifecycle hooks [\#266](https://github.com/hopsoft/stimulus_reflex/issues/266)
11
+ - Stimulus Reflex with Rspec not working [\#263](https://github.com/hopsoft/stimulus_reflex/issues/263)
12
+
13
+ **Merged pull requests:**
14
+
15
+ - Smarter warnings when element not found [\#274](https://github.com/hopsoft/stimulus_reflex/pull/274) ([hopsoft](https://github.com/hopsoft))
16
+ - Add the attributes to the warning message when element not found [\#273](https://github.com/hopsoft/stimulus_reflex/pull/273) ([hopsoft](https://github.com/hopsoft))
17
+ - Update find element to ignore SR attrs [\#272](https://github.com/hopsoft/stimulus_reflex/pull/272) ([hopsoft](https://github.com/hopsoft))
18
+ - Refactor of the morph feature [\#270](https://github.com/hopsoft/stimulus_reflex/pull/270) ([hopsoft](https://github.com/hopsoft))
19
+ - coerce html arguments to string type [\#268](https://github.com/hopsoft/stimulus_reflex/pull/268) ([leastbad](https://github.com/leastbad))
20
+ - Update deployment docs after the official AnyCable 1.0 release [\#267](https://github.com/hopsoft/stimulus_reflex/pull/267) ([rmacklin](https://github.com/rmacklin))
21
+
22
+ ## [v3.3.0.pre1](https://github.com/hopsoft/stimulus_reflex/tree/v3.3.0.pre1) (2020-07-08)
23
+
24
+ [Full Changelog](https://github.com/hopsoft/stimulus_reflex/compare/v3.3.0.pre0...v3.3.0.pre1)
6
25
 
7
26
  **Merged pull requests:**
8
27
 
9
- - alternate solution [\#262](https://github.com/hopsoft/stimulus_reflex/pull/262) ([leastbad](https://github.com/leastbad))
28
+ - Fix selector morphs for updating partials and ViewComponents [\#262](https://github.com/hopsoft/stimulus_reflex/pull/262) ([leastbad](https://github.com/leastbad))
10
29
 
11
30
  ## [v3.3.0.pre0](https://github.com/hopsoft/stimulus_reflex/tree/v3.3.0.pre0) (2020-07-04)
12
31
 
@@ -181,6 +200,7 @@
181
200
  - Some housekeeping [\#189](https://github.com/hopsoft/stimulus_reflex/pull/189) ([hopsoft](https://github.com/hopsoft))
182
201
  - Allow to call stimulate without a reflex target [\#188](https://github.com/hopsoft/stimulus_reflex/pull/188) ([marcoroth](https://github.com/marcoroth))
183
202
  - Fix bug in super documentation [\#174](https://github.com/hopsoft/stimulus_reflex/pull/174) ([silva96](https://github.com/silva96))
203
+ - Support devise authenticated routes [\#172](https://github.com/hopsoft/stimulus_reflex/pull/172) ([db0sch](https://github.com/db0sch))
184
204
 
185
205
  ## [v3.1.4](https://github.com/hopsoft/stimulus_reflex/tree/v3.1.4) (2020-04-27)
186
206
 
@@ -208,7 +228,6 @@
208
228
 
209
229
  - prettier-standard: include all js files in the project [\#177](https://github.com/hopsoft/stimulus_reflex/pull/177) ([marcoroth](https://github.com/marcoroth))
210
230
  - Remove implicit permanent for text inputs [\#176](https://github.com/hopsoft/stimulus_reflex/pull/176) ([hopsoft](https://github.com/hopsoft))
211
- - Support devise authenticated routes [\#172](https://github.com/hopsoft/stimulus_reflex/pull/172) ([db0sch](https://github.com/db0sch))
212
231
  - setupDeclarativeReflexes export with UJS support [\#169](https://github.com/hopsoft/stimulus_reflex/pull/169) ([leastbad](https://github.com/leastbad))
213
232
  - Fix compilation issue [\#168](https://github.com/hopsoft/stimulus_reflex/pull/168) ([jonathan-s](https://github.com/jonathan-s))
214
233
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- stimulus_reflex (3.3.0.pre1)
4
+ stimulus_reflex (3.3.0.pre2)
5
5
  cable_ready (>= 4.1.2)
6
6
  nokogiri
7
7
  rack
@@ -164,10 +164,10 @@ GEM
164
164
  tzinfo (1.2.7)
165
165
  thread_safe (~> 0.1)
166
166
  unicode-display_width (1.7.0)
167
- websocket-driver (0.7.2)
167
+ websocket-driver (0.7.3)
168
168
  websocket-extensions (>= 0.1.0)
169
169
  websocket-extensions (0.1.5)
170
- zeitwerk (2.3.1)
170
+ zeitwerk (2.4.0)
171
171
 
172
172
  PLATFORMS
173
173
  ruby
data/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  <img alt="License: MIT" src="https://img.shields.io/badge/license-MIT-brightgreen.svg" target="_blank" />
12
12
  </a>
13
13
  <a href="http://blog.codinghorror.com/the-best-code-is-no-code-at-all/" target="_blank">
14
- <img alt="Lines of Code" src="https://img.shields.io/badge/lines_of_code-1084-brightgreen.svg?style=flat" />
14
+ <img alt="Lines of Code" src="https://img.shields.io/badge/lines_of_code-1098-brightgreen.svg?style=flat" />
15
15
  </a>
16
16
  <a href="https://docs.stimulusreflex.com/" target="_blank">
17
17
  <img alt="Documentation" src="https://img.shields.io/badge/documentation-yes-brightgreen.svg" />
@@ -11,12 +11,11 @@ require "cable_ready"
11
11
  require "stimulus_reflex/version"
12
12
  require "stimulus_reflex/reflex"
13
13
  require "stimulus_reflex/element"
14
- require "stimulus_reflex/broadcaster"
15
- require "stimulus_reflex/morph_mode"
16
14
  require "stimulus_reflex/channel"
17
- require "stimulus_reflex/morph_mode/nothing_morph_mode"
18
- require "stimulus_reflex/morph_mode/page_morph_mode"
19
- require "stimulus_reflex/morph_mode/selector_morph_mode"
15
+ require "stimulus_reflex/broadcasters/broadcaster"
16
+ require "stimulus_reflex/broadcasters/nothing_broadcaster"
17
+ require "stimulus_reflex/broadcasters/page_broadcaster"
18
+ require "stimulus_reflex/broadcasters/selector_broadcaster"
20
19
  require "generators/stimulus_reflex_generator"
21
20
 
22
21
  module StimulusReflex
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusReflex
4
+ class Broadcaster
5
+ include CableReady::Broadcaster
6
+
7
+ attr_reader :reflex, :logger
8
+ delegate :permanent_attribute_name, :stream_name, to: :reflex
9
+
10
+ def initialize(reflex)
11
+ @reflex = reflex
12
+ @logger = Rails.logger
13
+ end
14
+
15
+ def nothing?
16
+ false
17
+ end
18
+
19
+ def page?
20
+ false
21
+ end
22
+
23
+ def selector?
24
+ false
25
+ end
26
+
27
+ def enqueue_message(subject:, body: nil, data: {})
28
+ logger.error "\e[31m#{body}\e[0m" if subject == "error"
29
+ cable_ready[stream_name].dispatch_event(
30
+ name: "stimulus-reflex:server-message",
31
+ detail: {
32
+ stimulus_reflex: data.merge(
33
+ broadcaster: to_sym,
34
+ server_message: {subject: subject, body: body}
35
+ )
36
+ }
37
+ )
38
+ end
39
+
40
+ def broadcast_message(subject:, body: nil, data: {})
41
+ enqueue_message subject: subject, body: body, data: data
42
+ cable_ready.broadcast
43
+ end
44
+
45
+ # abstract method to be implemented by subclasses
46
+ def broadcast(*args)
47
+ raise NotImplementedError
48
+ end
49
+
50
+ # abstract method to be implemented by subclasses
51
+ def to_sym
52
+ raise NotImplementedError
53
+ end
54
+ end
55
+ end
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module StimulusReflex
2
- class NothingMorphMode < MorphMode
3
- def broadcast(reflex, selectors, data)
4
+ class NothingBroadcaster < Broadcaster
5
+ def broadcast(_, data)
4
6
  broadcast_message subject: "nothing", data: data
5
7
  end
6
8
 
7
- def to_sym
8
- :nothing
9
- end
10
-
11
9
  def nothing?
12
10
  true
13
11
  end
12
+
13
+ def to_sym
14
+ :nothing
15
+ end
14
16
  end
15
17
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusReflex
4
+ class PageBroadcaster < Broadcaster
5
+ def broadcast(selectors, data)
6
+ reflex.controller.process reflex.url_params[:action]
7
+ page_html = reflex.controller.response.body
8
+
9
+ return unless page_html.present?
10
+
11
+ document = Nokogiri::HTML(page_html)
12
+ selectors = selectors.select { |s| document.css(s).present? }
13
+ selectors.each do |selector|
14
+ html = document.css(selector).inner_html
15
+ cable_ready[stream_name].morph(
16
+ selector: selector,
17
+ html: html,
18
+ children_only: true,
19
+ permanent_attribute_name: permanent_attribute_name,
20
+ stimulus_reflex: data.merge({
21
+ last: selector == selectors.last,
22
+ broadast_type: to_sym
23
+ })
24
+ )
25
+ end
26
+ cable_ready.broadcast
27
+ end
28
+
29
+ def to_sym
30
+ :page
31
+ end
32
+
33
+ def page?
34
+ true
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusReflex
4
+ class SelectorBroadcaster < Broadcaster
5
+ def broadcast(_, data = {})
6
+ morphs.each do |morph|
7
+ selectors, html = morph
8
+ updates = selectors.is_a?(Hash) ? selectors : Hash[selectors, html]
9
+ updates.each do |selector, html|
10
+ last = morph == morphs.last && selector == updates.keys.last
11
+ html = html.to_s
12
+ fragment = Nokogiri::HTML.fragment(html)
13
+ match = fragment.at_css(selector)
14
+ if match.present?
15
+ cable_ready[stream_name].morph(
16
+ selector: selector,
17
+ html: match.inner_html,
18
+ children_only: true,
19
+ permanent_attribute_name: permanent_attribute_name,
20
+ stimulus_reflex: data.merge({
21
+ last: last,
22
+ broadast_type: to_sym
23
+ })
24
+ )
25
+ else
26
+ cable_ready[stream_name].inner_html(
27
+ selector: selector,
28
+ html: fragment.to_html,
29
+ stimulus_reflex: data.merge({
30
+ last: last,
31
+ broadast_type: to_sym
32
+ })
33
+ )
34
+ end
35
+ end
36
+ end
37
+
38
+ cable_ready.broadcast
39
+ morphs.clear
40
+ end
41
+
42
+ def morphs
43
+ @morphs ||= []
44
+ end
45
+
46
+ def to_sym
47
+ :selector
48
+ end
49
+
50
+ def selector?
51
+ true
52
+ end
53
+ end
54
+ end
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class StimulusReflex::Channel < ActionCable::Channel::Base
4
- include StimulusReflex::Broadcaster
5
-
6
4
  def stream_name
7
5
  ids = connection.identifiers.map { |identifier| send(identifier).try(:id) || send(identifier) }
8
6
  [
@@ -36,19 +34,18 @@ class StimulusReflex::Channel < ActionCable::Channel::Base
36
34
  rescue => invoke_error
37
35
  reflex&.rescue_with_handler(invoke_error)
38
36
  message = exception_message_with_backtrace(invoke_error)
39
- return broadcast_message subject: "error", body: "StimulusReflex::Channel Failed to invoke #{target}! #{url} #{message}", data: data
37
+ return reflex.broadcast_message subject: "error", body: "StimulusReflex::Channel Failed to invoke #{target}! #{url} #{message}", data: data
40
38
  end
41
39
 
42
40
  if reflex.halted?
43
- broadcast_message subject: "halted", data: data
41
+ reflex.broadcast_message subject: "halted", data: data
44
42
  else
45
43
  begin
46
- reflex.morph_mode.stream_name = stream_name
47
- reflex.morph_mode.broadcast(reflex, selectors, data)
44
+ reflex.broadcast(selectors, data)
48
45
  rescue => render_error
49
46
  reflex.rescue_with_handler(render_error)
50
47
  message = exception_message_with_backtrace(render_error)
51
- broadcast_message subject: "error", body: "StimulusReflex::Channel Failed to re-render #{url} #{message}", data: data
48
+ reflex.broadcast_message subject: "error", body: "StimulusReflex::Channel Failed to re-render #{url} #{message}", data: data
52
49
  end
53
50
  end
54
51
  ensure
@@ -43,12 +43,13 @@ class StimulusReflex::Reflex
43
43
  end
44
44
  end
45
45
 
46
- attr_reader :channel, :url, :element, :selectors, :method_name, :morph_mode, :permanent_attribute_name
46
+ attr_reader :channel, :url, :element, :selectors, :method_name, :broadcaster, :permanent_attribute_name
47
47
 
48
- delegate :connection, to: :channel
48
+ delegate :connection, :stream_name, to: :channel
49
49
  delegate :session, to: :request
50
+ delegate :broadcast, :broadcast_message, to: :broadcaster
50
51
 
51
- def initialize(channel, url: nil, element: nil, selectors: [], method_name: nil, stream_name: nil, permanent_attribute_name: nil, params: {})
52
+ def initialize(channel, url: nil, element: nil, selectors: [], method_name: nil, permanent_attribute_name: nil, params: {})
52
53
  @channel = channel
53
54
  @url = url
54
55
  @element = element
@@ -56,7 +57,7 @@ class StimulusReflex::Reflex
56
57
  @method_name = method_name
57
58
  @params = params
58
59
  @permanent_attribute_name = permanent_attribute_name
59
- @morph_mode = StimulusReflex::PageMorphMode.new
60
+ @broadcaster = StimulusReflex::PageBroadcaster.new(self)
60
61
  self.params
61
62
  end
62
63
 
@@ -89,35 +90,17 @@ class StimulusReflex::Reflex
89
90
  def morph(selectors, html = "")
90
91
  case selectors
91
92
  when :page
92
- raise StandardError.new("Cannot call :page morph after :#{@morph_mode.to_sym} morph") unless @morph_mode.page?
93
+ raise StandardError.new("Cannot call :page morph after :#{broadcaster.to_sym} morph") unless broadcaster.page?
93
94
  when :nothing
94
- raise StandardError.new("Cannot call :nothing morph after :selector morph") if @morph_mode.selector?
95
- @morph_mode = StimulusReflex::NothingMorphMode.new
95
+ raise StandardError.new("Cannot call :nothing morph after :selector morph") if broadcaster.selector?
96
+ @broadcaster = StimulusReflex::NothingBroadcaster.new(self) unless broadcaster.nothing?
96
97
  else
97
- raise StandardError.new("Cannot call :selector morph after :nothing morph") if @morph_mode.nothing?
98
- @morph_mode = StimulusReflex::SelectorMorphMode.new
99
- if selectors.is_a?(Hash)
100
- selectors.each do |selector, html|
101
- enqueue_selector_broadcast selector, html
102
- end
103
- else
104
- enqueue_selector_broadcast selectors, html
105
- end
106
- cable_ready.broadcast
98
+ raise StandardError.new("Cannot call :selector morph after :nothing morph") if broadcaster.nothing?
99
+ @broadcaster = StimulusReflex::SelectorBroadcaster.new(self) unless broadcaster.selector?
100
+ broadcaster.morphs << [selectors, html]
107
101
  end
108
102
  end
109
103
 
110
- def enqueue_selector_broadcast(selector, html)
111
- fragment = Nokogiri::HTML(html)
112
- parent = fragment.at_css(selector)
113
- cable_ready[channel.stream_name].morph(
114
- selector: selector,
115
- html: parent.present? ? parent.inner_html : fragment.to_html,
116
- children_only: true,
117
- permanent_attribute_name: permanent_attribute_name
118
- )
119
- end
120
-
121
104
  def controller
122
105
  @controller ||= begin
123
106
  request.controller_class.new.tap do |c|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StimulusReflex
4
- VERSION = "3.3.0.pre1"
4
+ VERSION = "3.3.0.pre2"
5
5
  end
data/tags CHANGED
@@ -4,39 +4,73 @@
4
4
  !_TAG_PROGRAM_NAME Exuberant Ctags //
5
5
  !_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
6
6
  !_TAG_PROGRAM_VERSION 5.8 //
7
- ApplicationReflex lib/generators/templates/application_reflex.rb /^class ApplicationReflex < StimulusReflex::Reflex$/;" c
8
7
  ApplicationReflex test/tmp/app/reflexes/application_reflex.rb /^class ApplicationReflex < StimulusReflex::Reflex$/;" c
8
+ Broadcaster lib/stimulus_reflex/broadcasters/broadcaster.rb /^ class Broadcaster$/;" c class:StimulusReflex
9
9
  DemoReflex test/tmp/app/reflexes/demo_reflex.rb /^class DemoReflex < ApplicationReflex$/;" c
10
10
  Engine lib/stimulus_reflex.rb /^ class Engine < Rails::Engine$/;" c class:StimulusReflex
11
+ NothingBroadcaster lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb /^ class NothingBroadcaster < Broadcaster$/;" c class:StimulusReflex
12
+ PageBroadcaster lib/stimulus_reflex/broadcasters/page_broadcaster.rb /^ class PageBroadcaster < Broadcaster$/;" c class:StimulusReflex
13
+ SelectorBroadcaster lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^ class SelectorBroadcaster < Broadcaster$/;" c class:StimulusReflex
11
14
  StimulusReflex lib/stimulus_reflex.rb /^module StimulusReflex$/;" m
15
+ StimulusReflex lib/stimulus_reflex/broadcasters/broadcaster.rb /^module StimulusReflex$/;" m
16
+ StimulusReflex lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb /^module StimulusReflex$/;" m
17
+ StimulusReflex lib/stimulus_reflex/broadcasters/page_broadcaster.rb /^module StimulusReflex$/;" m
18
+ StimulusReflex lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^module StimulusReflex$/;" m
12
19
  StimulusReflex lib/stimulus_reflex/channel.rb /^class StimulusReflex::Channel < ActionCable::Channel::Base$/;" c
13
- StimulusReflex lib/stimulus_reflex/element.rb /^class StimulusReflex::Element$/;" c
20
+ StimulusReflex lib/stimulus_reflex/element.rb /^class StimulusReflex::Element < OpenStruct$/;" c
14
21
  StimulusReflex lib/stimulus_reflex/reflex.rb /^class StimulusReflex::Reflex$/;" c
15
22
  StimulusReflex lib/stimulus_reflex/version.rb /^module StimulusReflex$/;" m
16
23
  StimulusReflexGenerator lib/generators/stimulus_reflex_generator.rb /^class StimulusReflexGenerator < Rails::Generators::NamedBase$/;" c
17
24
  StimulusReflexGeneratorTest test/generators/stimulus_reflex_generator_test.rb /^class StimulusReflexGeneratorTest < Rails::Generators::TestCase$/;" c
18
- broadcast_error lib/stimulus_reflex/channel.rb /^ def broadcast_error(message, data = {})$/;" f class:StimulusReflex
19
- broadcast_morphs lib/stimulus_reflex/channel.rb /^ def broadcast_morphs(selectors, data, html)$/;" f class:StimulusReflex
20
- build_request lib/stimulus_reflex/channel.rb /^ def build_request$/;" f class:StimulusReflex
21
- commit_session lib/stimulus_reflex/channel.rb /^ def commit_session(request, response)$/;" f class:StimulusReflex
22
- copy_controller_files lib/generators/stimulus_reflex_generator.rb /^ def copy_controller_files$/;" f class:StimulusReflexGenerator
23
- copy_reflex_files lib/generators/stimulus_reflex_generator.rb /^ def copy_reflex_files$/;" f class:StimulusReflexGenerator
25
+ add_callback lib/stimulus_reflex/reflex.rb /^ def add_callback(kind, *args, &block)$/;" f class:StimulusReflex
26
+ after_reflex lib/stimulus_reflex/reflex.rb /^ def after_reflex(*args, &block)$/;" f class:StimulusReflex
27
+ around_reflex lib/stimulus_reflex/reflex.rb /^ def around_reflex(*args, &block)$/;" f class:StimulusReflex
28
+ before_reflex lib/stimulus_reflex/reflex.rb /^ def before_reflex(*args, &block)$/;" f class:StimulusReflex
29
+ broadcast lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def broadcast(*args)$/;" f class:StimulusReflex.Broadcaster
30
+ broadcast lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb /^ def broadcast(_, data)$/;" f class:StimulusReflex.NothingBroadcaster
31
+ broadcast lib/stimulus_reflex/broadcasters/page_broadcaster.rb /^ def broadcast(selectors, data)$/;" f class:StimulusReflex.PageBroadcaster
32
+ broadcast lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^ def broadcast(_, data = {})$/;" f class:StimulusReflex.SelectorBroadcaster
33
+ broadcast_message lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def broadcast_message(subject:, body: nil, data: {})$/;" f class:StimulusReflex.Broadcaster
34
+ commit_session lib/stimulus_reflex/channel.rb /^ def commit_session(reflex)$/;" f class:StimulusReflex
35
+ controller lib/stimulus_reflex/reflex.rb /^ def controller$/;" f
36
+ copy_application_files lib/generators/stimulus_reflex_generator.rb /^ def copy_application_files$/;" f class:StimulusReflexGenerator
24
37
  dataset lib/stimulus_reflex/element.rb /^ def dataset$/;" f class:StimulusReflex
38
+ default_reflex lib/stimulus_reflex/reflex.rb /^ def default_reflex$/;" f
25
39
  delegate_call_to_reflex lib/stimulus_reflex/channel.rb /^ def delegate_call_to_reflex(reflex, method_name, arguments = [])$/;" f class:StimulusReflex
40
+ enqueue_message lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def enqueue_message(subject:, body: nil, data: {})$/;" f class:StimulusReflex.Broadcaster
41
+ error javascript/log.js /^function error (response) {$/;" f
26
42
  exception_message_with_backtrace lib/stimulus_reflex/channel.rb /^ def exception_message_with_backtrace(exception)$/;" f class:StimulusReflex
43
+ execute lib/generators/stimulus_reflex_generator.rb /^ def execute$/;" f class:StimulusReflexGenerator
27
44
  export.reflexAttribute javascript/schema.js /^ reflexAttribute: 'data-reflex',$/;" p
45
+ export.reflexDatasetAttribute javascript/schema.js /^ reflexDatasetAttribute: 'data-reflex-dataset'$/;" p
28
46
  export.reflexPermanentAttribute javascript/schema.js /^ reflexPermanentAttribute: 'data-reflex-permanent',$/;" p
29
- export.reflexRootAttribute javascript/schema.js /^ reflexRootAttribute: 'data-reflex-root'$/;" p
47
+ export.reflexRootAttribute javascript/schema.js /^ reflexRootAttribute: 'data-reflex-root',$/;" p
30
48
  findConsumer javascript/consumer.js /^function findConsumer (object, depth = 0) {$/;" f
31
- initialize lib/stimulus_reflex/element.rb /^ def initialize(attrs = {})$/;" f class:StimulusReflex
32
- initialize lib/stimulus_reflex/reflex.rb /^ def initialize(channel, url: nil, element: nil, selectors: [])$/;" f class:StimulusReflex
33
- initialize_controllers lib/generators/stimulus_reflex_generator.rb /^ def initialize_controllers$/;" f class:StimulusReflexGenerator
34
- initialize_reflexes lib/generators/stimulus_reflex_generator.rb /^ def initialize_reflexes$/;" f class:StimulusReflexGenerator
49
+ function.success javascript/log.js /^function success (response, options = { halted: false }) {$/;" f
50
+ halted? lib/stimulus_reflex/reflex.rb /^ def halted?$/;" f
51
+ initialize lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def initialize(reflex)$/;" f class:StimulusReflex.Broadcaster
52
+ initialize lib/stimulus_reflex/element.rb /^ def initialize(data = {})$/;" f class:StimulusReflex
53
+ initialize lib/stimulus_reflex/reflex.rb /^ def initialize(channel, url: nil, element: nil, selectors: [], method_name: nil, permanent_attribute_name: nil, params: {})$/;" f
35
54
  is_reflex? lib/stimulus_reflex/channel.rb /^ def is_reflex?(reflex_class)$/;" f class:StimulusReflex
55
+ morph lib/stimulus_reflex/reflex.rb /^ def morph(selectors, html = "")$/;" f
56
+ morphs lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^ def morphs$/;" f class:StimulusReflex.SelectorBroadcaster
57
+ normalize_callback_option! lib/stimulus_reflex/reflex.rb /^ def normalize_callback_option!(options, from, to)$/;" f class:StimulusReflex
58
+ normalize_callback_options! lib/stimulus_reflex/reflex.rb /^ def normalize_callback_options!(options)$/;" f class:StimulusReflex
59
+ nothing? lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def nothing?$/;" f class:StimulusReflex.Broadcaster
60
+ nothing? lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb /^ def nothing?$/;" f class:StimulusReflex.NothingBroadcaster
61
+ object_with_indifferent_access lib/stimulus_reflex/channel.rb /^ def object_with_indifferent_access(object)$/;" f class:StimulusReflex
62
+ page? lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def page?$/;" f class:StimulusReflex.Broadcaster
63
+ page? lib/stimulus_reflex/broadcasters/page_broadcaster.rb /^ def page?$/;" f class:StimulusReflex.PageBroadcaster
64
+ params lib/stimulus_reflex/reflex.rb /^ def params$/;" f
65
+ process lib/stimulus_reflex/reflex.rb /^ def process(name, *args)$/;" f
36
66
  receive lib/stimulus_reflex/channel.rb /^ def receive(data)$/;" f class:StimulusReflex
37
- render_page lib/stimulus_reflex/channel.rb /^ def render_page(reflex)$/;" f class:StimulusReflex
38
- render_page_and_broadcast_morph lib/stimulus_reflex/channel.rb /^ def render_page_and_broadcast_morph(reflex, selectors, data = {})$/;" f class:StimulusReflex
39
- request lib/stimulus_reflex/reflex.rb /^ def request$/;" f class:StimulusReflex
67
+ request lib/stimulus_reflex/reflex.rb /^ def request$/;" f
68
+ selector? lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def selector?$/;" f class:StimulusReflex.Broadcaster
69
+ selector? lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^ def selector?$/;" f class:StimulusReflex.SelectorBroadcaster
40
70
  stream_name lib/stimulus_reflex/channel.rb /^ def stream_name$/;" f class:StimulusReflex
41
71
  subscribed lib/stimulus_reflex/channel.rb /^ def subscribed$/;" f class:StimulusReflex
42
- url_params lib/stimulus_reflex/reflex.rb /^ def url_params$/;" f class:StimulusReflex
72
+ to_sym lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def to_sym$/;" f class:StimulusReflex.Broadcaster
73
+ to_sym lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb /^ def to_sym$/;" f class:StimulusReflex.NothingBroadcaster
74
+ to_sym lib/stimulus_reflex/broadcasters/page_broadcaster.rb /^ def to_sym$/;" f class:StimulusReflex.PageBroadcaster
75
+ to_sym lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^ def to_sym$/;" f class:StimulusReflex.SelectorBroadcaster
76
+ url_params lib/stimulus_reflex/reflex.rb /^ def url_params$/;" f
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stimulus_reflex
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0.pre1
4
+ version: 3.3.0.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Hopkins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-08 00:00:00.000000000 Z
11
+ date: 2020-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -162,13 +162,12 @@ files:
162
162
  - lib/generators/templates/app/reflexes/%file_name%_reflex.rb.tt
163
163
  - lib/generators/templates/app/reflexes/application_reflex.rb.tt
164
164
  - lib/stimulus_reflex.rb
165
- - lib/stimulus_reflex/broadcaster.rb
165
+ - lib/stimulus_reflex/broadcasters/broadcaster.rb
166
+ - lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb
167
+ - lib/stimulus_reflex/broadcasters/page_broadcaster.rb
168
+ - lib/stimulus_reflex/broadcasters/selector_broadcaster.rb
166
169
  - lib/stimulus_reflex/channel.rb
167
170
  - lib/stimulus_reflex/element.rb
168
- - lib/stimulus_reflex/morph_mode.rb
169
- - lib/stimulus_reflex/morph_mode/nothing_morph_mode.rb
170
- - lib/stimulus_reflex/morph_mode/page_morph_mode.rb
171
- - lib/stimulus_reflex/morph_mode/selector_morph_mode.rb
172
171
  - lib/stimulus_reflex/reflex.rb
173
172
  - lib/stimulus_reflex/version.rb
174
173
  - lib/tasks/stimulus_reflex/install.rake
@@ -1,53 +0,0 @@
1
- module StimulusReflex
2
- module Broadcaster
3
- include CableReady::Broadcaster
4
-
5
- def render_page_and_broadcast_morph(reflex, selectors, data = {})
6
- html = render_page(reflex)
7
- broadcast_morphs selectors, data, html if html.present?
8
- end
9
-
10
- def render_page(reflex)
11
- reflex.controller.process reflex.url_params[:action]
12
- reflex.controller.response.body
13
- end
14
-
15
- def broadcast_morphs(selectors, data, html)
16
- document = Nokogiri::HTML(html)
17
- selectors = selectors.select { |s| document.css(s).present? }
18
- selectors.each do |selector|
19
- cable_ready[stream_name].morph(
20
- selector: selector,
21
- html: document.css(selector).inner_html,
22
- children_only: true,
23
- permanent_attribute_name: data["permanent_attribute_name"],
24
- stimulus_reflex: data.merge({
25
- last: selector == selectors.last,
26
- morph_mode: "page"
27
- })
28
- )
29
- end
30
- cable_ready.broadcast
31
- end
32
-
33
- def broadcast_message(subject:, body: nil, data: {})
34
- message = {
35
- subject: subject,
36
- body: body
37
- }
38
-
39
- logger.error "\e[31m#{body}\e[0m" if subject == "error"
40
-
41
- data[:morph_mode] = "page"
42
- data[:server_message] = message
43
- data[:morph_mode] = "selector" if subject == "selector"
44
- data[:morph_mode] = "nothing" if subject == "nothing"
45
-
46
- cable_ready[stream_name].dispatch_event(
47
- name: "stimulus-reflex:server-message",
48
- detail: {stimulus_reflex: data}
49
- )
50
- cable_ready.broadcast
51
- end
52
- end
53
- end
@@ -1,19 +0,0 @@
1
- module StimulusReflex
2
- class MorphMode
3
- include StimulusReflex::Broadcaster
4
-
5
- attr_accessor :stream_name
6
-
7
- def page?
8
- false
9
- end
10
-
11
- def nothing?
12
- false
13
- end
14
-
15
- def selector?
16
- false
17
- end
18
- end
19
- end
@@ -1,15 +0,0 @@
1
- module StimulusReflex
2
- class PageMorphMode < MorphMode
3
- def broadcast(reflex, selectors, data)
4
- render_page_and_broadcast_morph reflex, selectors, data
5
- end
6
-
7
- def to_sym
8
- :page
9
- end
10
-
11
- def page?
12
- true
13
- end
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- module StimulusReflex
2
- class SelectorMorphMode < MorphMode
3
- def broadcast(reflex, selectors, data)
4
- broadcast_message subject: "selector", data: data
5
- end
6
-
7
- def to_sym
8
- :selector
9
- end
10
-
11
- def selector?
12
- true
13
- end
14
- end
15
- end