stimulus_reflex 3.2.2.pre0 → 3.3.0.pre1

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: dd9af85e63dfa792a38d7dd4a560f86c1bcca6898aa8f38882ccfea57e726dbd
4
- data.tar.gz: d4fdcadaae536283af5db9e98551a5dbd1cd9aa3100bba806be82e5cf6aecd18
3
+ metadata.gz: cb3ab10321ba245b37a1c1c930f48218146079db9b3448adf6ec86511a8eee27
4
+ data.tar.gz: f9e891d1775eca3787f9d95c3860d1cab43fec42895cb97a25f698636d7912e7
5
5
  SHA512:
6
- metadata.gz: a64205414cfc3630ecb2c537abe5f0deacd0737f5abcf9d33873d57b317d5bf0dfccee6ae09706fdf1e38a5ca7ea6d3159272abd4a293523f9451600ce8d43f7
7
- data.tar.gz: 81792f053d071fe1fc63db27609a53b4147b9d0f02f85714ba8c81f7cf7e937f94aca5037845badcdbb7b24e78992152549a991a3a1db5a1e1563d9b1f574713
6
+ metadata.gz: 6bba44eda7278bf6b54fd3ce3ee511169d6a1170164bea35ec8cf0f3df0b2c55bedd4c4030ee37c650af35c52761e386192e2b1844bd9676244bb67206b2097d
7
+ data.tar.gz: 8887eb98ce990e7c70e508628850c0955dc81d8a03ec02c94d8e4150a65c708274e7450eb00f81bf7d4be7e8b9f4ca53a201791381a85700c3eec6d26f27de5d
@@ -2,7 +2,98 @@
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.2.1...HEAD)
5
+ [Full Changelog](https://github.com/hopsoft/stimulus_reflex/compare/v3.3.0.pre0...HEAD)
6
+
7
+ **Merged pull requests:**
8
+
9
+ - alternate solution [\#262](https://github.com/hopsoft/stimulus_reflex/pull/262) ([leastbad](https://github.com/leastbad))
10
+
11
+ ## [v3.3.0.pre0](https://github.com/hopsoft/stimulus_reflex/tree/v3.3.0.pre0) (2020-07-04)
12
+
13
+ [Full Changelog](https://github.com/hopsoft/stimulus_reflex/compare/v3.2.3...v3.3.0.pre0)
14
+
15
+ **Implemented enhancements:**
16
+
17
+ - Returns more helpful error message if Reflex doesn't exist [\#254](https://github.com/hopsoft/stimulus_reflex/pull/254) ([leastbad](https://github.com/leastbad))
18
+ - Update install.rake to handle Typescript [\#241](https://github.com/hopsoft/stimulus_reflex/pull/241) ([iv-mexx](https://github.com/iv-mexx))
19
+ - Morph Modes: page, selector and nothing [\#211](https://github.com/hopsoft/stimulus_reflex/pull/211) ([leastbad](https://github.com/leastbad))
20
+
21
+ **Fixed bugs:**
22
+
23
+ - Limit MutationObserver mutations [\#256](https://github.com/hopsoft/stimulus_reflex/pull/256) ([jasoncharnes](https://github.com/jasoncharnes))
24
+
25
+ **Closed issues:**
26
+
27
+ - beforeUpdate/updateSuccess/updateError functions deprecated? [\#255](https://github.com/hopsoft/stimulus_reflex/issues/255)
28
+ - Error handling will fail if reflex is not defined [\#253](https://github.com/hopsoft/stimulus_reflex/issues/253)
29
+ - Select with data-reflex in Firefox flickers [\#251](https://github.com/hopsoft/stimulus_reflex/issues/251)
30
+ - data-reflex-attributes vs data-reflex-dataset [\#237](https://github.com/hopsoft/stimulus_reflex/issues/237)
31
+ - Shorthand action notations corresponding to stimulus [\#233](https://github.com/hopsoft/stimulus_reflex/issues/233)
32
+ - Lifecycle methods only called for one reflex [\#225](https://github.com/hopsoft/stimulus_reflex/issues/225)
33
+ - Tweak the generator so we can specify reflex actions [\#219](https://github.com/hopsoft/stimulus_reflex/issues/219)
34
+ - Docs: Clarify forcing DOM update with authentication [\#123](https://github.com/hopsoft/stimulus_reflex/issues/123)
35
+ - ActiveJob integration example [\#112](https://github.com/hopsoft/stimulus_reflex/issues/112)
36
+
37
+ **Merged pull requests:**
38
+
39
+ - Prep for pre release of 3.3.0 [\#259](https://github.com/hopsoft/stimulus_reflex/pull/259) ([hopsoft](https://github.com/hopsoft))
40
+ - Fallback to first Stimulus controller in array [\#257](https://github.com/hopsoft/stimulus_reflex/pull/257) ([jasoncharnes](https://github.com/jasoncharnes))
41
+ - Fix cases where plural reflexes were unresolved [\#252](https://github.com/hopsoft/stimulus_reflex/pull/252) ([joshleblanc](https://github.com/joshleblanc))
42
+ - warn against collections of identical elements that trigger reflexes [\#250](https://github.com/hopsoft/stimulus_reflex/pull/250) ([leastbad](https://github.com/leastbad))
43
+ - always calls params to persist them into controller action [\#249](https://github.com/hopsoft/stimulus_reflex/pull/249) ([RolandStuder](https://github.com/RolandStuder))
44
+ - Update deployment.md [\#248](https://github.com/hopsoft/stimulus_reflex/pull/248) ([user073](https://github.com/user073))
45
+ - Update reflexes.md [\#247](https://github.com/hopsoft/stimulus_reflex/pull/247) ([user073](https://github.com/user073))
46
+ - Bump actionpack from 6.0.3.1 to 6.0.3.2 [\#245](https://github.com/hopsoft/stimulus_reflex/pull/245) ([dependabot[bot]](https://github.com/apps/dependabot))
47
+ - Bump rack from 2.2.2 to 2.2.3 [\#244](https://github.com/hopsoft/stimulus_reflex/pull/244) ([dependabot[bot]](https://github.com/apps/dependabot))
48
+ - Revert "Revert "Add instructions for pulling the user id out of session storage"" [\#240](https://github.com/hopsoft/stimulus_reflex/pull/240) ([leastbad](https://github.com/leastbad))
49
+ - Revert "Add instructions for pulling the user id out of session storage" [\#239](https://github.com/hopsoft/stimulus_reflex/pull/239) ([leastbad](https://github.com/leastbad))
50
+ - Add instructions for pulling the user id out of session storage [\#238](https://github.com/hopsoft/stimulus_reflex/pull/238) ([mtomov](https://github.com/mtomov))
51
+ - adds params documentation [\#230](https://github.com/hopsoft/stimulus_reflex/pull/230) ([RolandStuder](https://github.com/RolandStuder))
52
+ - Fix calling wrong controller lifecycle methods [\#226](https://github.com/hopsoft/stimulus_reflex/pull/226) ([davidalejandroaguilar](https://github.com/davidalejandroaguilar))
53
+ - Allow to pass reflex action names to reflex generator [\#224](https://github.com/hopsoft/stimulus_reflex/pull/224) ([marcoroth](https://github.com/marcoroth))
54
+
55
+ ## [v3.2.3](https://github.com/hopsoft/stimulus_reflex/tree/v3.2.3) (2020-06-15)
56
+
57
+ [Full Changelog](https://github.com/hopsoft/stimulus_reflex/compare/v3.2.2...v3.2.3)
58
+
59
+ **Fixed bugs:**
60
+
61
+ - Add more smarts to \_\_perform [\#235](https://github.com/hopsoft/stimulus_reflex/pull/235) ([hopsoft](https://github.com/hopsoft))
62
+ - \_\_perform had a bug where it was only ever calling the first event [\#234](https://github.com/hopsoft/stimulus_reflex/pull/234) ([leastbad](https://github.com/leastbad))
63
+ - merges insteads of overwrites params for reflex actions with form data [\#231](https://github.com/hopsoft/stimulus_reflex/pull/231) ([RolandStuder](https://github.com/RolandStuder))
64
+
65
+ **Closed issues:**
66
+
67
+ - "Uncaught \(in promise\)" error after failed declarative reflex [\#170](https://github.com/hopsoft/stimulus_reflex/issues/170)
68
+
69
+ **Merged pull requests:**
70
+
71
+ - Fix typos in the documentation [\#228](https://github.com/hopsoft/stimulus_reflex/pull/228) ([dlt](https://github.com/dlt))
72
+
73
+ ## [v3.2.2](https://github.com/hopsoft/stimulus_reflex/tree/v3.2.2) (2020-06-06)
74
+
75
+ [Full Changelog](https://github.com/hopsoft/stimulus_reflex/compare/v3.2.2.pre1...v3.2.2)
76
+
77
+ **Closed issues:**
78
+
79
+ - Issue with doing a partial dom update [\#223](https://github.com/hopsoft/stimulus_reflex/issues/223)
80
+
81
+ ## [v3.2.2.pre1](https://github.com/hopsoft/stimulus_reflex/tree/v3.2.2.pre1) (2020-05-30)
82
+
83
+ [Full Changelog](https://github.com/hopsoft/stimulus_reflex/compare/v3.2.2.pre0...v3.2.2.pre1)
84
+
85
+ **Fixed bugs:**
86
+
87
+ - Session lost after throw :abort [\#221](https://github.com/hopsoft/stimulus_reflex/issues/221)
88
+ - Fix multipleInstances convenience method [\#220](https://github.com/hopsoft/stimulus_reflex/pull/220) ([julianrubisch](https://github.com/julianrubisch))
89
+
90
+ **Merged pull requests:**
91
+
92
+ - Always commit session [\#222](https://github.com/hopsoft/stimulus_reflex/pull/222) ([hopsoft](https://github.com/hopsoft))
93
+
94
+ ## [v3.2.2.pre0](https://github.com/hopsoft/stimulus_reflex/tree/v3.2.2.pre0) (2020-05-27)
95
+
96
+ [Full Changelog](https://github.com/hopsoft/stimulus_reflex/compare/v3.2.1...v3.2.2.pre0)
6
97
 
7
98
  **Implemented enhancements:**
8
99
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- stimulus_reflex (3.2.2.pre0)
4
+ stimulus_reflex (3.3.0.pre1)
5
5
  cable_ready (>= 4.1.2)
6
6
  nokogiri
7
7
  rack
@@ -10,74 +10,74 @@ PATH
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- actioncable (6.0.3.1)
14
- actionpack (= 6.0.3.1)
13
+ actioncable (6.0.3.2)
14
+ actionpack (= 6.0.3.2)
15
15
  nio4r (~> 2.0)
16
16
  websocket-driver (>= 0.6.1)
17
- actionmailbox (6.0.3.1)
18
- actionpack (= 6.0.3.1)
19
- activejob (= 6.0.3.1)
20
- activerecord (= 6.0.3.1)
21
- activestorage (= 6.0.3.1)
22
- activesupport (= 6.0.3.1)
17
+ actionmailbox (6.0.3.2)
18
+ actionpack (= 6.0.3.2)
19
+ activejob (= 6.0.3.2)
20
+ activerecord (= 6.0.3.2)
21
+ activestorage (= 6.0.3.2)
22
+ activesupport (= 6.0.3.2)
23
23
  mail (>= 2.7.1)
24
- actionmailer (6.0.3.1)
25
- actionpack (= 6.0.3.1)
26
- actionview (= 6.0.3.1)
27
- activejob (= 6.0.3.1)
24
+ actionmailer (6.0.3.2)
25
+ actionpack (= 6.0.3.2)
26
+ actionview (= 6.0.3.2)
27
+ activejob (= 6.0.3.2)
28
28
  mail (~> 2.5, >= 2.5.4)
29
29
  rails-dom-testing (~> 2.0)
30
- actionpack (6.0.3.1)
31
- actionview (= 6.0.3.1)
32
- activesupport (= 6.0.3.1)
30
+ actionpack (6.0.3.2)
31
+ actionview (= 6.0.3.2)
32
+ activesupport (= 6.0.3.2)
33
33
  rack (~> 2.0, >= 2.0.8)
34
34
  rack-test (>= 0.6.3)
35
35
  rails-dom-testing (~> 2.0)
36
36
  rails-html-sanitizer (~> 1.0, >= 1.2.0)
37
- actiontext (6.0.3.1)
38
- actionpack (= 6.0.3.1)
39
- activerecord (= 6.0.3.1)
40
- activestorage (= 6.0.3.1)
41
- activesupport (= 6.0.3.1)
37
+ actiontext (6.0.3.2)
38
+ actionpack (= 6.0.3.2)
39
+ activerecord (= 6.0.3.2)
40
+ activestorage (= 6.0.3.2)
41
+ activesupport (= 6.0.3.2)
42
42
  nokogiri (>= 1.8.5)
43
- actionview (6.0.3.1)
44
- activesupport (= 6.0.3.1)
43
+ actionview (6.0.3.2)
44
+ activesupport (= 6.0.3.2)
45
45
  builder (~> 3.1)
46
46
  erubi (~> 1.4)
47
47
  rails-dom-testing (~> 2.0)
48
48
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
49
- activejob (6.0.3.1)
50
- activesupport (= 6.0.3.1)
49
+ activejob (6.0.3.2)
50
+ activesupport (= 6.0.3.2)
51
51
  globalid (>= 0.3.6)
52
- activemodel (6.0.3.1)
53
- activesupport (= 6.0.3.1)
54
- activerecord (6.0.3.1)
55
- activemodel (= 6.0.3.1)
56
- activesupport (= 6.0.3.1)
57
- activestorage (6.0.3.1)
58
- actionpack (= 6.0.3.1)
59
- activejob (= 6.0.3.1)
60
- activerecord (= 6.0.3.1)
52
+ activemodel (6.0.3.2)
53
+ activesupport (= 6.0.3.2)
54
+ activerecord (6.0.3.2)
55
+ activemodel (= 6.0.3.2)
56
+ activesupport (= 6.0.3.2)
57
+ activestorage (6.0.3.2)
58
+ actionpack (= 6.0.3.2)
59
+ activejob (= 6.0.3.2)
60
+ activerecord (= 6.0.3.2)
61
61
  marcel (~> 0.3.1)
62
- activesupport (6.0.3.1)
62
+ activesupport (6.0.3.2)
63
63
  concurrent-ruby (~> 1.0, >= 1.0.2)
64
64
  i18n (>= 0.7, < 2)
65
65
  minitest (~> 5.1)
66
66
  tzinfo (~> 1.1)
67
67
  zeitwerk (~> 2.2, >= 2.2.2)
68
- ast (2.4.0)
68
+ ast (2.4.1)
69
69
  builder (3.2.4)
70
- cable_ready (4.1.2)
70
+ cable_ready (4.3.0)
71
71
  rails (>= 5.2)
72
- coderay (1.1.2)
72
+ coderay (1.1.3)
73
73
  concurrent-ruby (1.1.6)
74
74
  crass (1.0.6)
75
75
  erubi (1.9.0)
76
76
  globalid (0.4.2)
77
77
  activesupport (>= 4.2.0)
78
- i18n (1.8.2)
78
+ i18n (1.8.3)
79
79
  concurrent-ruby (~> 1.0)
80
- loofah (2.5.0)
80
+ loofah (2.6.0)
81
81
  crass (~> 1.0.2)
82
82
  nokogiri (>= 1.5.9)
83
83
  mail (2.7.1)
@@ -90,68 +90,73 @@ GEM
90
90
  mini_portile2 (2.4.0)
91
91
  minitest (5.14.1)
92
92
  nio4r (2.5.2)
93
- nokogiri (1.10.9)
93
+ nokogiri (1.10.10)
94
94
  mini_portile2 (~> 2.4.0)
95
- parallel (1.19.1)
96
- parser (2.7.1.3)
97
- ast (~> 2.4.0)
95
+ parallel (1.19.2)
96
+ parser (2.7.1.4)
97
+ ast (~> 2.4.1)
98
98
  pry (0.12.2)
99
99
  coderay (~> 1.1.0)
100
100
  method_source (~> 0.9.0)
101
101
  pry-nav (0.3.0)
102
102
  pry (>= 0.9.10, < 0.13.0)
103
- rack (2.2.2)
103
+ rack (2.2.3)
104
104
  rack-test (1.1.0)
105
105
  rack (>= 1.0, < 3)
106
- rails (6.0.3.1)
107
- actioncable (= 6.0.3.1)
108
- actionmailbox (= 6.0.3.1)
109
- actionmailer (= 6.0.3.1)
110
- actionpack (= 6.0.3.1)
111
- actiontext (= 6.0.3.1)
112
- actionview (= 6.0.3.1)
113
- activejob (= 6.0.3.1)
114
- activemodel (= 6.0.3.1)
115
- activerecord (= 6.0.3.1)
116
- activestorage (= 6.0.3.1)
117
- activesupport (= 6.0.3.1)
106
+ rails (6.0.3.2)
107
+ actioncable (= 6.0.3.2)
108
+ actionmailbox (= 6.0.3.2)
109
+ actionmailer (= 6.0.3.2)
110
+ actionpack (= 6.0.3.2)
111
+ actiontext (= 6.0.3.2)
112
+ actionview (= 6.0.3.2)
113
+ activejob (= 6.0.3.2)
114
+ activemodel (= 6.0.3.2)
115
+ activerecord (= 6.0.3.2)
116
+ activestorage (= 6.0.3.2)
117
+ activesupport (= 6.0.3.2)
118
118
  bundler (>= 1.3.0)
119
- railties (= 6.0.3.1)
119
+ railties (= 6.0.3.2)
120
120
  sprockets-rails (>= 2.0.0)
121
121
  rails-dom-testing (2.0.3)
122
122
  activesupport (>= 4.2.0)
123
123
  nokogiri (>= 1.6)
124
124
  rails-html-sanitizer (1.3.0)
125
125
  loofah (~> 2.3)
126
- railties (6.0.3.1)
127
- actionpack (= 6.0.3.1)
128
- activesupport (= 6.0.3.1)
126
+ railties (6.0.3.2)
127
+ actionpack (= 6.0.3.2)
128
+ activesupport (= 6.0.3.2)
129
129
  method_source
130
130
  rake (>= 0.8.7)
131
131
  thor (>= 0.20.3, < 2.0)
132
132
  rainbow (3.0.0)
133
133
  rake (13.0.1)
134
+ regexp_parser (1.7.1)
134
135
  rexml (3.2.4)
135
- rubocop (0.83.0)
136
+ rubocop (0.85.1)
136
137
  parallel (~> 1.10)
137
138
  parser (>= 2.7.0.1)
138
139
  rainbow (>= 2.2.2, < 4.0)
140
+ regexp_parser (>= 1.7)
139
141
  rexml
142
+ rubocop-ast (>= 0.0.3)
140
143
  ruby-progressbar (~> 1.7)
141
144
  unicode-display_width (>= 1.4.0, < 2.0)
142
- rubocop-performance (1.5.2)
145
+ rubocop-ast (0.1.0)
146
+ parser (>= 2.7.0.1)
147
+ rubocop-performance (1.6.1)
143
148
  rubocop (>= 0.71.0)
144
149
  ruby-progressbar (1.10.1)
145
- sprockets (4.0.0)
150
+ sprockets (4.0.2)
146
151
  concurrent-ruby (~> 1.0)
147
152
  rack (> 1, < 3)
148
153
  sprockets-rails (3.2.1)
149
154
  actionpack (>= 4.0)
150
155
  activesupport (>= 4.0)
151
156
  sprockets (>= 3.0.0)
152
- standard (0.4.6)
153
- rubocop (~> 0.83.0)
154
- rubocop-performance (~> 1.5.2)
157
+ standard (0.4.7)
158
+ rubocop (~> 0.85.0)
159
+ rubocop-performance (~> 1.6.0)
155
160
  standardrb (1.0.0)
156
161
  standard
157
162
  thor (1.0.1)
@@ -161,8 +166,8 @@ GEM
161
166
  unicode-display_width (1.7.0)
162
167
  websocket-driver (0.7.2)
163
168
  websocket-extensions (>= 0.1.0)
164
- websocket-extensions (0.1.4)
165
- zeitwerk (2.3.0)
169
+ websocket-extensions (0.1.5)
170
+ zeitwerk (2.3.1)
166
171
 
167
172
  PLATFORMS
168
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-923-brightgreen.svg?style=flat" />
14
+ <img alt="Lines of Code" src="https://img.shields.io/badge/lines_of_code-1084-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" />
@@ -2,7 +2,7 @@ Description:
2
2
  Generate boilerplate files to help get you up and running with StimulusReflex
3
3
 
4
4
  Example:
5
- rails generate stimulus_reflex User
5
+ rails generate stimulus_reflex User update do_stuff [options]
6
6
 
7
7
  This will create, but not overwrite the following files:
8
8
 
@@ -5,33 +5,22 @@ require "rails/generators"
5
5
  class StimulusReflexGenerator < Rails::Generators::NamedBase
6
6
  source_root File.expand_path("templates", __dir__)
7
7
 
8
- def initialize_application_reflexes
9
- copy_application_files if behavior == :invoke
10
- end
11
-
12
- def initialize_reflexes
13
- copy_reflex_files
14
- end
15
-
16
- def initialize_controllers
17
- copy_controller_files
18
- end
8
+ argument :name, type: :string, required: true, banner: "NAME"
9
+ argument :actions, type: :array, default: [], banner: "action action"
19
10
 
20
- private
11
+ def execute
12
+ actions.map!(&:underscore)
21
13
 
22
- CONTROLLER_BASE_PATH = "app/javascript/controllers"
23
- REFLEX_BASE_PATH = "app/reflexes"
14
+ copy_application_files if behavior == :invoke
24
15
 
25
- def copy_reflex_files
26
- template "custom_reflex.rb", File.join(REFLEX_BASE_PATH, "#{name.underscore}_reflex.rb")
16
+ template "app/reflexes/%file_name%_reflex.rb"
17
+ template "app/javascript/controllers/%file_name%_controller.js"
27
18
  end
28
19
 
29
- def copy_controller_files
30
- template "custom_controller.js", File.join(CONTROLLER_BASE_PATH, "#{name.underscore}_controller.js")
31
- end
20
+ private
32
21
 
33
22
  def copy_application_files
34
- template "application_reflex.rb", File.join(REFLEX_BASE_PATH, "application_reflex.rb")
35
- template "application_controller.js", File.join(CONTROLLER_BASE_PATH, "application_controller.js")
23
+ template "app/reflexes/application_reflex.rb"
24
+ template "app/javascript/controllers/application_controller.js"
36
25
  end
37
26
  end
@@ -22,6 +22,7 @@ export default class extends ApplicationController {
22
22
  * error - error message from the server
23
23
  */
24
24
 
25
+ <% if actions.empty? -%>
25
26
  // beforeUpdate(element, reflex) {
26
27
  // element.innerText = 'Updating...'
27
28
  // }
@@ -34,4 +35,23 @@ export default class extends ApplicationController {
34
35
  // console.error('updateError', error);
35
36
  // element.innerText = 'Update Failed!'
36
37
  // }
38
+ <% end -%>
39
+ <% actions.each do |action| -%>
40
+ // <%= "before_#{action}".camelize(:lower) %>(element, reflex) {
41
+ // console.log("before <%= action %>", element, reflex)
42
+ // }
43
+
44
+ // <%= "#{action}_success".camelize(:lower) %>(element, reflex) {
45
+ // console.log("<%= action %> success", element, reflex)
46
+ // }
47
+
48
+ // <%= "#{action}_error".camelize(:lower) %>(element, reflex, error) {
49
+ // console.error("<%= action %> error", element, reflex, error)
50
+ // }
51
+
52
+ // <%= "after_#{action}".camelize(:lower) %>(element, reflex, error) {
53
+ // console.log("after <%= action %>", element, reflex, error)
54
+ // }
55
+ <%= "\n" unless action == actions.last -%>
56
+ <% end -%>
37
57
  }
@@ -21,4 +21,10 @@ class <%= class_name %>Reflex < ApplicationReflex
21
21
  # end
22
22
  #
23
23
  # Learn more at: https://docs.stimulusreflex.com
24
+
25
+ <% actions.each do |action| -%>
26
+ def <%= action %>
27
+ end
28
+ <%= "\n" unless action == actions.last -%>
29
+ <% end -%>
24
30
  end
@@ -11,7 +11,12 @@ 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"
14
16
  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
20
  require "generators/stimulus_reflex_generator"
16
21
 
17
22
  module StimulusReflex
@@ -0,0 +1,53 @@
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,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class StimulusReflex::Channel < ActionCable::Channel::Base
4
- include CableReady::Broadcaster
4
+ include StimulusReflex::Broadcaster
5
5
 
6
6
  def stream_name
7
7
  ids = connection.identifiers.map { |identifier| send(identifier).try(:id) || send(identifier) }
@@ -21,32 +21,38 @@ class StimulusReflex::Channel < ActionCable::Channel::Base
21
21
  selectors = data["selectors"] = ["body"] if selectors.blank?
22
22
  target = data["target"].to_s
23
23
  reflex_name, method_name = target.split("#")
24
- reflex_name = reflex_name.classify
24
+ reflex_name = reflex_name.camelize
25
25
  reflex_name = reflex_name.end_with?("Reflex") ? reflex_name : "#{reflex_name}Reflex"
26
26
  arguments = (data["args"] || []).map { |arg| object_with_indifferent_access arg }
27
27
  element = StimulusReflex::Element.new(data)
28
+ permanent_attribute_name = data["permanent_attribute_name"]
28
29
  params = data["params"] || {}
29
30
 
30
31
  begin
31
- reflex_class = reflex_name.constantize.tap { |klass| raise ArgumentError.new("#{reflex_name} is not a StimulusReflex::Reflex") unless is_reflex?(klass) }
32
- reflex = reflex_class.new(self, url: url, element: element, selectors: selectors, method_name: method_name, params: params)
33
- delegate_call_to_reflex reflex, method_name, arguments
34
- rescue => invoke_error
35
- reflex.rescue_with_handler(invoke_error)
36
- message = exception_message_with_backtrace(invoke_error)
37
- return broadcast_message subject: "error", body: "StimulusReflex::Channel Failed to invoke #{target}! #{url} #{message}", data: data
38
- end
39
-
40
- if reflex.halted?
41
- broadcast_message subject: "halted", data: data
42
- else
43
32
  begin
44
- render_page_and_broadcast_morph reflex, selectors, data
45
- rescue => render_error
46
- reflex.rescue_with_handler(render_error)
47
- message = exception_message_with_backtrace(render_error)
48
- broadcast_message subject: "error", body: "StimulusReflex::Channel Failed to re-render #{url} #{message}", data: data
33
+ reflex_class = reflex_name.constantize.tap { |klass| raise ArgumentError.new("#{reflex_name} is not a StimulusReflex::Reflex") unless is_reflex?(klass) }
34
+ reflex = reflex_class.new(self, url: url, element: element, selectors: selectors, method_name: method_name, permanent_attribute_name: permanent_attribute_name, params: params)
35
+ delegate_call_to_reflex reflex, method_name, arguments
36
+ rescue => invoke_error
37
+ reflex&.rescue_with_handler(invoke_error)
38
+ message = exception_message_with_backtrace(invoke_error)
39
+ return broadcast_message subject: "error", body: "StimulusReflex::Channel Failed to invoke #{target}! #{url} #{message}", data: data
40
+ end
41
+
42
+ if reflex.halted?
43
+ broadcast_message subject: "halted", data: data
44
+ else
45
+ begin
46
+ reflex.morph_mode.stream_name = stream_name
47
+ reflex.morph_mode.broadcast(reflex, selectors, data)
48
+ rescue => render_error
49
+ reflex.rescue_with_handler(render_error)
50
+ message = exception_message_with_backtrace(render_error)
51
+ broadcast_message subject: "error", body: "StimulusReflex::Channel Failed to re-render #{url} #{message}", data: data
52
+ end
49
53
  end
54
+ ensure
55
+ commit_session reflex if reflex
50
56
  end
51
57
  end
52
58
 
@@ -76,63 +82,14 @@ class StimulusReflex::Channel < ActionCable::Channel::Base
76
82
  end
77
83
  end
78
84
 
79
- def render_page_and_broadcast_morph(reflex, selectors, data = {})
80
- html = render_page(reflex)
81
- broadcast_morphs selectors, data, html if html.present?
82
- end
83
-
84
- def commit_session(request, response)
85
- store = request.session.instance_variable_get("@by")
86
- store.commit_session request, response
85
+ def commit_session(reflex)
86
+ store = reflex.request.session.instance_variable_get("@by")
87
+ store.commit_session reflex.request, reflex.controller.response
87
88
  rescue => e
88
89
  message = "Failed to commit session! #{exception_message_with_backtrace(e)}"
89
90
  logger.error "\e[31m#{message}\e[0m"
90
91
  end
91
92
 
92
- def render_page(reflex)
93
- controller = reflex.request.controller_class.new
94
- controller.instance_variable_set :"@stimulus_reflex", true
95
- reflex.instance_variables.each do |name|
96
- controller.instance_variable_set name, reflex.instance_variable_get(name)
97
- end
98
-
99
- controller.request = reflex.request
100
- controller.response = ActionDispatch::Response.new
101
- controller.process reflex.url_params[:action]
102
- commit_session reflex.request, controller.response
103
- controller.response.body
104
- end
105
-
106
- def broadcast_morphs(selectors, data, html)
107
- document = Nokogiri::HTML(html)
108
- selectors = selectors.select { |s| document.css(s).present? }
109
- selectors.each do |selector|
110
- cable_ready[stream_name].morph(
111
- selector: selector,
112
- html: document.css(selector).inner_html,
113
- children_only: true,
114
- permanent_attribute_name: data["permanent_attribute_name"],
115
- stimulus_reflex: data.merge(last: selector == selectors.last)
116
- )
117
- end
118
- cable_ready.broadcast
119
- end
120
-
121
- def broadcast_message(subject:, body: nil, data: {})
122
- message = {
123
- subject: subject,
124
- body: body
125
- }
126
-
127
- logger.error "\e[31m#{body}\e[0m" if subject == "error"
128
-
129
- cable_ready[stream_name].dispatch_event(
130
- name: "stimulus-reflex:server-message",
131
- detail: {stimulus_reflex: data.merge(server_message: message)}
132
- )
133
- cable_ready.broadcast
134
- end
135
-
136
93
  def exception_message_with_backtrace(exception)
137
94
  "#{exception} #{exception.backtrace.first}"
138
95
  end
@@ -0,0 +1,19 @@
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
@@ -0,0 +1,15 @@
1
+ module StimulusReflex
2
+ class NothingMorphMode < MorphMode
3
+ def broadcast(reflex, selectors, data)
4
+ broadcast_message subject: "nothing", data: data
5
+ end
6
+
7
+ def to_sym
8
+ :nothing
9
+ end
10
+
11
+ def nothing?
12
+ true
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
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
@@ -0,0 +1,15 @@
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
@@ -3,6 +3,7 @@
3
3
  class StimulusReflex::Reflex
4
4
  include ActiveSupport::Rescuable
5
5
  include ActiveSupport::Callbacks
6
+ include CableReady::Broadcaster
6
7
 
7
8
  define_callbacks :process, skip_after_callbacks_if_terminated: true
8
9
 
@@ -42,18 +43,21 @@ class StimulusReflex::Reflex
42
43
  end
43
44
  end
44
45
 
45
- attr_reader :channel, :url, :element, :selectors, :method_name
46
+ attr_reader :channel, :url, :element, :selectors, :method_name, :morph_mode, :permanent_attribute_name
46
47
 
47
48
  delegate :connection, to: :channel
48
49
  delegate :session, to: :request
49
50
 
50
- def initialize(channel, url: nil, element: nil, selectors: [], method_name: nil, params: {})
51
+ def initialize(channel, url: nil, element: nil, selectors: [], method_name: nil, stream_name: nil, permanent_attribute_name: nil, params: {})
51
52
  @channel = channel
52
53
  @url = url
53
54
  @element = element
54
55
  @selectors = selectors
55
56
  @method_name = method_name
56
57
  @params = params
58
+ @permanent_attribute_name = permanent_attribute_name
59
+ @morph_mode = StimulusReflex::PageMorphMode.new
60
+ self.params
57
61
  end
58
62
 
59
63
  def request
@@ -77,11 +81,54 @@ class StimulusReflex::Reflex
77
81
  )
78
82
  path_params = Rails.application.routes.recognize_path_with_request(req, url, req.env[:extras] || {})
79
83
  req.env.merge(ActionDispatch::Http::Parameters::PARAMETERS_KEY => path_params)
80
- req.env["action_dispatch.request.parameters"] = @params
84
+ req.env["action_dispatch.request.parameters"] = req.parameters.merge(@params)
81
85
  req.tap { |r| r.session.send :load! }
82
86
  end
83
87
  end
84
88
 
89
+ def morph(selectors, html = "")
90
+ case selectors
91
+ when :page
92
+ raise StandardError.new("Cannot call :page morph after :#{@morph_mode.to_sym} morph") unless @morph_mode.page?
93
+ when :nothing
94
+ raise StandardError.new("Cannot call :nothing morph after :selector morph") if @morph_mode.selector?
95
+ @morph_mode = StimulusReflex::NothingMorphMode.new
96
+ 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
107
+ end
108
+ end
109
+
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
+ def controller
122
+ @controller ||= begin
123
+ request.controller_class.new.tap do |c|
124
+ c.instance_variable_set :"@stimulus_reflex", true
125
+ instance_variables.each { |name| c.instance_variable_set name, instance_variable_get(name) }
126
+ c.request = request
127
+ c.response = ActionDispatch::Response.new
128
+ end
129
+ end
130
+ end
131
+
85
132
  def url_params
86
133
  @url_params ||= Rails.application.routes.recognize_path_with_request(request, request.path, request.env[:extras] || {})
87
134
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StimulusReflex
4
- VERSION = "3.2.2.pre0"
4
+ VERSION = "3.3.0.pre1"
5
5
  end
@@ -11,11 +11,16 @@ namespace :stimulus_reflex do
11
11
  FileUtils.mkdir_p Rails.root.join("app/javascript/controllers"), verbose: true
12
12
  FileUtils.mkdir_p Rails.root.join("app/reflexes"), verbose: true
13
13
 
14
- filepath = if File.exist? Rails.root.join("app/javascript/controllers/index.js")
15
- Rails.root.join("app/javascript/controllers/index.js")
16
- else
17
- Rails.root.join("app/javascript/packs/application.js")
18
- end
14
+ filepath = %w[
15
+ app/javascript/controllers/index.js
16
+ app/javascript/controllers/index.ts
17
+ app/javascript/packs/application.js
18
+ app/javascript/packs/application.ts
19
+ ]
20
+ .select { |path| File.exist?(path) }
21
+ .map { |path| Rails.root.join(path) }
22
+ .first
23
+
19
24
  puts "Updating #{filepath}"
20
25
  lines = File.open(filepath, "r") { |f| f.readlines }
21
26
 
@@ -23,4 +23,27 @@ class StimulusReflexGeneratorTest < Rails::Generators::TestCase
23
23
  assert_file "app/reflexes/application_reflex.rb"
24
24
  assert_file "app/reflexes/posts_reflex.rb", /PostsReflex/
25
25
  end
26
+
27
+ test "creates reflex with given reflex actions" do
28
+ run_generator %w[User update do_stuff DoMoreStuff]
29
+ assert_file "app/reflexes/user_reflex.rb" do |reflex|
30
+ assert_instance_method :update, reflex
31
+ assert_instance_method :do_stuff, reflex
32
+ assert_instance_method :do_more_stuff, reflex
33
+ end
34
+ assert_file "app/javascript/controllers/user_controller.js" do |controller|
35
+ assert_match(/beforeUpdate/, controller)
36
+ assert_match(/updateSuccess/, controller)
37
+ assert_match(/updateError/, controller)
38
+ assert_match(/afterUpdate/, controller)
39
+ assert_match(/beforeDoStuff/, controller)
40
+ assert_match(/doStuffSuccess/, controller)
41
+ assert_match(/doStuffError/, controller)
42
+ assert_match(/afterDoStuff/, controller)
43
+ assert_match(/beforeDoMoreStuff/, controller)
44
+ assert_match(/doMoreStuffSuccess/, controller)
45
+ assert_match(/doMoreStuffError/, controller)
46
+ assert_match(/afterDoMoreStuff/, controller)
47
+ end
48
+ end
26
49
  end
@@ -21,4 +21,5 @@ class DemoReflex < ApplicationReflex
21
21
  # end
22
22
  #
23
23
  # Learn more at: https://docs.stimulusreflex.com
24
+
24
25
  end
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.2.2.pre0
4
+ version: 3.3.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Hopkins
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-27 00:00:00.000000000 Z
11
+ date: 2020-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -136,7 +136,7 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
- description:
139
+ description:
140
140
  email:
141
141
  - natehop@gmail.com
142
142
  executables: []
@@ -157,13 +157,18 @@ files:
157
157
  - bin/standardize
158
158
  - lib/generators/USAGE
159
159
  - lib/generators/stimulus_reflex_generator.rb
160
- - lib/generators/templates/application_controller.js
161
- - lib/generators/templates/application_reflex.rb
162
- - lib/generators/templates/custom_controller.js
163
- - lib/generators/templates/custom_reflex.rb
160
+ - lib/generators/templates/app/javascript/controllers/%file_name%_controller.js.tt
161
+ - lib/generators/templates/app/javascript/controllers/application_controller.js.tt
162
+ - lib/generators/templates/app/reflexes/%file_name%_reflex.rb.tt
163
+ - lib/generators/templates/app/reflexes/application_reflex.rb.tt
164
164
  - lib/stimulus_reflex.rb
165
+ - lib/stimulus_reflex/broadcaster.rb
165
166
  - lib/stimulus_reflex/channel.rb
166
167
  - 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
167
172
  - lib/stimulus_reflex/reflex.rb
168
173
  - lib/stimulus_reflex/version.rb
169
174
  - lib/tasks/stimulus_reflex/install.rake
@@ -202,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
207
  version: 1.3.1
203
208
  requirements: []
204
209
  rubygems_version: 3.0.3
205
- signing_key:
210
+ signing_key:
206
211
  specification_version: 4
207
212
  summary: Build reactive applications with the Rails tooling you already know and love.
208
213
  test_files: