stimulus_reflex 3.2.3 → 3.3.0.pre0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of stimulus_reflex might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +46 -2
- data/Gemfile.lock +59 -59
- data/lib/generators/USAGE +1 -1
- data/lib/generators/stimulus_reflex_generator.rb +10 -21
- data/lib/generators/templates/{custom_controller.js → app/javascript/controllers/%file_name%_controller.js.tt} +20 -0
- data/lib/generators/templates/{application_controller.js → app/javascript/controllers/application_controller.js.tt} +0 -0
- data/lib/generators/templates/{custom_reflex.rb → app/reflexes/%file_name%_reflex.rb.tt} +6 -0
- data/lib/generators/templates/{application_reflex.rb → app/reflexes/application_reflex.rb.tt} +0 -0
- data/lib/stimulus_reflex.rb +5 -0
- data/lib/stimulus_reflex/broadcaster.rb +53 -0
- data/lib/stimulus_reflex/channel.rb +7 -45
- data/lib/stimulus_reflex/morph_mode.rb +19 -0
- data/lib/stimulus_reflex/morph_mode/nothing_morph_mode.rb +15 -0
- data/lib/stimulus_reflex/morph_mode/page_morph_mode.rb +15 -0
- data/lib/stimulus_reflex/morph_mode/selector_morph_mode.rb +15 -0
- data/lib/stimulus_reflex/reflex.rb +36 -2
- data/lib/stimulus_reflex/version.rb +1 -1
- data/lib/tasks/stimulus_reflex/install.rake +10 -5
- data/test/generators/stimulus_reflex_generator_test.rb +23 -0
- data/test/tmp/app/reflexes/{posts_reflex.rb → demo_reflex.rb} +2 -1
- metadata +18 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 541ecc905c542c182d7abd3989aee4e0b7e2cbcc0708a741d292af0447f657b7
|
4
|
+
data.tar.gz: 47b2665deb288d4f63e99ab3a72256f7f39c095f57cc3c71444038f91ebdc170
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e63680e0a55bfff333385be622ab7bca8850846896befc9269b5d806a8baea6906cd0b29df90f65d586b6ad50f057575d8bce1b8fc3cf09c4a877c7692324209
|
7
|
+
data.tar.gz: 0e748c92fef73ad6038c334348eaf38e40e11dcad3edfab69c4e5f6bef6286d594d100357af95a69cbcaf69a04ee31ad579e562d7389f651a2e56af26eb114c2
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,51 @@
|
|
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.
|
5
|
+
[Full Changelog](https://github.com/hopsoft/stimulus_reflex/compare/v3.2.3...HEAD)
|
6
|
+
|
7
|
+
**Implemented enhancements:**
|
8
|
+
|
9
|
+
- Returns more helpful error message if Reflex doesn't exist [\#254](https://github.com/hopsoft/stimulus_reflex/pull/254) ([leastbad](https://github.com/leastbad))
|
10
|
+
- Update install.rake to handle Typescript [\#241](https://github.com/hopsoft/stimulus_reflex/pull/241) ([iv-mexx](https://github.com/iv-mexx))
|
11
|
+
- Morph Modes: page, selector and nothing [\#211](https://github.com/hopsoft/stimulus_reflex/pull/211) ([leastbad](https://github.com/leastbad))
|
12
|
+
|
13
|
+
**Fixed bugs:**
|
14
|
+
|
15
|
+
- Limit MutationObserver mutations [\#256](https://github.com/hopsoft/stimulus_reflex/pull/256) ([jasoncharnes](https://github.com/jasoncharnes))
|
16
|
+
|
17
|
+
**Closed issues:**
|
18
|
+
|
19
|
+
- beforeUpdate/updateSuccess/updateError functions deprecated? [\#255](https://github.com/hopsoft/stimulus_reflex/issues/255)
|
20
|
+
- Error handling will fail if reflex is not defined [\#253](https://github.com/hopsoft/stimulus_reflex/issues/253)
|
21
|
+
- Select with data-reflex in Firefox flickers [\#251](https://github.com/hopsoft/stimulus_reflex/issues/251)
|
22
|
+
- data-reflex-attributes vs data-reflex-dataset [\#237](https://github.com/hopsoft/stimulus_reflex/issues/237)
|
23
|
+
- Shorthand action notations corresponding to stimulus [\#233](https://github.com/hopsoft/stimulus_reflex/issues/233)
|
24
|
+
- Lifecycle methods only called for one reflex [\#225](https://github.com/hopsoft/stimulus_reflex/issues/225)
|
25
|
+
- Tweak the generator so we can specify reflex actions [\#219](https://github.com/hopsoft/stimulus_reflex/issues/219)
|
26
|
+
- Docs: Clarify forcing DOM update with authentication [\#123](https://github.com/hopsoft/stimulus_reflex/issues/123)
|
27
|
+
- ActiveJob integration example [\#112](https://github.com/hopsoft/stimulus_reflex/issues/112)
|
28
|
+
|
29
|
+
**Merged pull requests:**
|
30
|
+
|
31
|
+
- Prep for pre release of 3.3.0 [\#259](https://github.com/hopsoft/stimulus_reflex/pull/259) ([hopsoft](https://github.com/hopsoft))
|
32
|
+
- Fallback to first Stimulus controller in array [\#257](https://github.com/hopsoft/stimulus_reflex/pull/257) ([jasoncharnes](https://github.com/jasoncharnes))
|
33
|
+
- Fix cases where plural reflexes were unresolved [\#252](https://github.com/hopsoft/stimulus_reflex/pull/252) ([joshleblanc](https://github.com/joshleblanc))
|
34
|
+
- warn against collections of identical elements that trigger reflexes [\#250](https://github.com/hopsoft/stimulus_reflex/pull/250) ([leastbad](https://github.com/leastbad))
|
35
|
+
- always calls params to persist them into controller action [\#249](https://github.com/hopsoft/stimulus_reflex/pull/249) ([RolandStuder](https://github.com/RolandStuder))
|
36
|
+
- Update deployment.md [\#248](https://github.com/hopsoft/stimulus_reflex/pull/248) ([user073](https://github.com/user073))
|
37
|
+
- Update reflexes.md [\#247](https://github.com/hopsoft/stimulus_reflex/pull/247) ([user073](https://github.com/user073))
|
38
|
+
- 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))
|
39
|
+
- 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))
|
40
|
+
- 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))
|
41
|
+
- 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))
|
42
|
+
- 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))
|
43
|
+
- adds params documentation [\#230](https://github.com/hopsoft/stimulus_reflex/pull/230) ([RolandStuder](https://github.com/RolandStuder))
|
44
|
+
- Fix calling wrong controller lifecycle methods [\#226](https://github.com/hopsoft/stimulus_reflex/pull/226) ([davidalejandroaguilar](https://github.com/davidalejandroaguilar))
|
45
|
+
- Allow to pass reflex action names to reflex generator [\#224](https://github.com/hopsoft/stimulus_reflex/pull/224) ([marcoroth](https://github.com/marcoroth))
|
46
|
+
|
47
|
+
## [v3.2.3](https://github.com/hopsoft/stimulus_reflex/tree/v3.2.3) (2020-06-15)
|
48
|
+
|
49
|
+
[Full Changelog](https://github.com/hopsoft/stimulus_reflex/compare/v3.2.2...v3.2.3)
|
6
50
|
|
7
51
|
**Fixed bugs:**
|
8
52
|
|
@@ -285,7 +329,6 @@
|
|
285
329
|
**Implemented enhancements:**
|
286
330
|
|
287
331
|
- Explicit and implicit registering of the ActionCable consumer [\#116](https://github.com/hopsoft/stimulus_reflex/pull/116) ([hopsoft](https://github.com/hopsoft))
|
288
|
-
- Add schema support [\#94](https://github.com/hopsoft/stimulus_reflex/pull/94) ([hopsoft](https://github.com/hopsoft))
|
289
332
|
|
290
333
|
## [v2.1.9](https://github.com/hopsoft/stimulus_reflex/tree/v2.1.9) (2020-02-20)
|
291
334
|
|
@@ -340,6 +383,7 @@
|
|
340
383
|
**Implemented enhancements:**
|
341
384
|
|
342
385
|
- Custom Stimulus schema breaks Reflex [\#91](https://github.com/hopsoft/stimulus_reflex/issues/91)
|
386
|
+
- Add schema support [\#94](https://github.com/hopsoft/stimulus_reflex/pull/94) ([hopsoft](https://github.com/hopsoft))
|
343
387
|
- inherit stimulus schema [\#92](https://github.com/hopsoft/stimulus_reflex/pull/92) ([nickyvanurk](https://github.com/nickyvanurk))
|
344
388
|
- Single source of truth [\#76](https://github.com/hopsoft/stimulus_reflex/pull/76) ([leastbad](https://github.com/leastbad))
|
345
389
|
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
stimulus_reflex (3.
|
4
|
+
stimulus_reflex (3.3.0.pre0)
|
5
5
|
cable_ready (>= 4.1.2)
|
6
6
|
nokogiri
|
7
7
|
rack
|
@@ -10,56 +10,56 @@ PATH
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
actioncable (6.0.3.
|
14
|
-
actionpack (= 6.0.3.
|
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.
|
18
|
-
actionpack (= 6.0.3.
|
19
|
-
activejob (= 6.0.3.
|
20
|
-
activerecord (= 6.0.3.
|
21
|
-
activestorage (= 6.0.3.
|
22
|
-
activesupport (= 6.0.3.
|
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.
|
25
|
-
actionpack (= 6.0.3.
|
26
|
-
actionview (= 6.0.3.
|
27
|
-
activejob (= 6.0.3.
|
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.
|
31
|
-
actionview (= 6.0.3.
|
32
|
-
activesupport (= 6.0.3.
|
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.
|
38
|
-
actionpack (= 6.0.3.
|
39
|
-
activerecord (= 6.0.3.
|
40
|
-
activestorage (= 6.0.3.
|
41
|
-
activesupport (= 6.0.3.
|
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.
|
44
|
-
activesupport (= 6.0.3.
|
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.
|
50
|
-
activesupport (= 6.0.3.
|
49
|
+
activejob (6.0.3.2)
|
50
|
+
activesupport (= 6.0.3.2)
|
51
51
|
globalid (>= 0.3.6)
|
52
|
-
activemodel (6.0.3.
|
53
|
-
activesupport (= 6.0.3.
|
54
|
-
activerecord (6.0.3.
|
55
|
-
activemodel (= 6.0.3.
|
56
|
-
activesupport (= 6.0.3.
|
57
|
-
activestorage (6.0.3.
|
58
|
-
actionpack (= 6.0.3.
|
59
|
-
activejob (= 6.0.3.
|
60
|
-
activerecord (= 6.0.3.
|
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.
|
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)
|
@@ -67,7 +67,7 @@ GEM
|
|
67
67
|
zeitwerk (~> 2.2, >= 2.2.2)
|
68
68
|
ast (2.4.1)
|
69
69
|
builder (3.2.4)
|
70
|
-
cable_ready (4.
|
70
|
+
cable_ready (4.3.0)
|
71
71
|
rails (>= 5.2)
|
72
72
|
coderay (1.1.3)
|
73
73
|
concurrent-ruby (1.1.6)
|
@@ -77,7 +77,7 @@ GEM
|
|
77
77
|
activesupport (>= 4.2.0)
|
78
78
|
i18n (1.8.3)
|
79
79
|
concurrent-ruby (~> 1.0)
|
80
|
-
loofah (2.
|
80
|
+
loofah (2.6.0)
|
81
81
|
crass (~> 1.0.2)
|
82
82
|
nokogiri (>= 1.5.9)
|
83
83
|
mail (2.7.1)
|
@@ -92,40 +92,40 @@ GEM
|
|
92
92
|
nio4r (2.5.2)
|
93
93
|
nokogiri (1.10.9)
|
94
94
|
mini_portile2 (~> 2.4.0)
|
95
|
-
parallel (1.19.
|
96
|
-
parser (2.7.1.
|
97
|
-
ast (~> 2.4.
|
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.
|
103
|
+
rack (2.2.3)
|
104
104
|
rack-test (1.1.0)
|
105
105
|
rack (>= 1.0, < 3)
|
106
|
-
rails (6.0.3.
|
107
|
-
actioncable (= 6.0.3.
|
108
|
-
actionmailbox (= 6.0.3.
|
109
|
-
actionmailer (= 6.0.3.
|
110
|
-
actionpack (= 6.0.3.
|
111
|
-
actiontext (= 6.0.3.
|
112
|
-
actionview (= 6.0.3.
|
113
|
-
activejob (= 6.0.3.
|
114
|
-
activemodel (= 6.0.3.
|
115
|
-
activerecord (= 6.0.3.
|
116
|
-
activestorage (= 6.0.3.
|
117
|
-
activesupport (= 6.0.3.
|
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.
|
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.
|
127
|
-
actionpack (= 6.0.3.
|
128
|
-
activesupport (= 6.0.3.
|
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)
|
@@ -142,7 +142,7 @@ GEM
|
|
142
142
|
rubocop-ast (>= 0.0.3)
|
143
143
|
ruby-progressbar (~> 1.7)
|
144
144
|
unicode-display_width (>= 1.4.0, < 2.0)
|
145
|
-
rubocop-ast (0.0
|
145
|
+
rubocop-ast (0.1.0)
|
146
146
|
parser (>= 2.7.0.1)
|
147
147
|
rubocop-performance (1.6.1)
|
148
148
|
rubocop (>= 0.71.0)
|
@@ -167,7 +167,7 @@ GEM
|
|
167
167
|
websocket-driver (0.7.2)
|
168
168
|
websocket-extensions (>= 0.1.0)
|
169
169
|
websocket-extensions (0.1.5)
|
170
|
-
zeitwerk (2.3.
|
170
|
+
zeitwerk (2.3.1)
|
171
171
|
|
172
172
|
PLATFORMS
|
173
173
|
ruby
|
data/lib/generators/USAGE
CHANGED
@@ -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
|
-
|
9
|
-
|
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
|
-
|
11
|
+
def execute
|
12
|
+
actions.map!(&:underscore)
|
21
13
|
|
22
|
-
|
23
|
-
REFLEX_BASE_PATH = "app/reflexes"
|
14
|
+
copy_application_files if behavior == :invoke
|
24
15
|
|
25
|
-
|
26
|
-
template "
|
16
|
+
template "app/reflexes/%file_name%_reflex.rb"
|
17
|
+
template "app/javascript/controllers/%file_name%_controller.js"
|
27
18
|
end
|
28
19
|
|
29
|
-
|
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"
|
35
|
-
template "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
|
}
|
File without changes
|
data/lib/generators/templates/{application_reflex.rb → app/reflexes/application_reflex.rb.tt}
RENAMED
File without changes
|
data/lib/stimulus_reflex.rb
CHANGED
@@ -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
|
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,19 +21,20 @@ 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.
|
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
32
|
begin
|
32
33
|
reflex_class = reflex_name.constantize.tap { |klass| raise ArgumentError.new("#{reflex_name} is not a StimulusReflex::Reflex") unless is_reflex?(klass) }
|
33
|
-
reflex = reflex_class.new(self, url: url, element: element, selectors: selectors, method_name: method_name, params: params)
|
34
|
+
reflex = reflex_class.new(self, url: url, element: element, selectors: selectors, method_name: method_name, permanent_attribute_name: permanent_attribute_name, params: params)
|
34
35
|
delegate_call_to_reflex reflex, method_name, arguments
|
35
36
|
rescue => invoke_error
|
36
|
-
reflex
|
37
|
+
reflex&.rescue_with_handler(invoke_error)
|
37
38
|
message = exception_message_with_backtrace(invoke_error)
|
38
39
|
return broadcast_message subject: "error", body: "StimulusReflex::Channel Failed to invoke #{target}! #{url} #{message}", data: data
|
39
40
|
end
|
@@ -42,7 +43,8 @@ class StimulusReflex::Channel < ActionCable::Channel::Base
|
|
42
43
|
broadcast_message subject: "halted", data: data
|
43
44
|
else
|
44
45
|
begin
|
45
|
-
|
46
|
+
reflex.morph_mode.stream_name = stream_name
|
47
|
+
reflex.morph_mode.broadcast(reflex, selectors, data)
|
46
48
|
rescue => render_error
|
47
49
|
reflex.rescue_with_handler(render_error)
|
48
50
|
message = exception_message_with_backtrace(render_error)
|
@@ -80,11 +82,6 @@ class StimulusReflex::Channel < ActionCable::Channel::Base
|
|
80
82
|
end
|
81
83
|
end
|
82
84
|
|
83
|
-
def render_page_and_broadcast_morph(reflex, selectors, data = {})
|
84
|
-
html = render_page(reflex)
|
85
|
-
broadcast_morphs selectors, data, html if html.present?
|
86
|
-
end
|
87
|
-
|
88
85
|
def commit_session(reflex)
|
89
86
|
store = reflex.request.session.instance_variable_get("@by")
|
90
87
|
store.commit_session reflex.request, reflex.controller.response
|
@@ -93,41 +90,6 @@ class StimulusReflex::Channel < ActionCable::Channel::Base
|
|
93
90
|
logger.error "\e[31m#{message}\e[0m"
|
94
91
|
end
|
95
92
|
|
96
|
-
def render_page(reflex)
|
97
|
-
reflex.controller.process reflex.url_params[:action]
|
98
|
-
reflex.controller.response.body
|
99
|
-
end
|
100
|
-
|
101
|
-
def broadcast_morphs(selectors, data, html)
|
102
|
-
document = Nokogiri::HTML(html)
|
103
|
-
selectors = selectors.select { |s| document.css(s).present? }
|
104
|
-
selectors.each do |selector|
|
105
|
-
cable_ready[stream_name].morph(
|
106
|
-
selector: selector,
|
107
|
-
html: document.css(selector).inner_html,
|
108
|
-
children_only: true,
|
109
|
-
permanent_attribute_name: data["permanent_attribute_name"],
|
110
|
-
stimulus_reflex: data.merge(last: selector == selectors.last)
|
111
|
-
)
|
112
|
-
end
|
113
|
-
cable_ready.broadcast
|
114
|
-
end
|
115
|
-
|
116
|
-
def broadcast_message(subject:, body: nil, data: {})
|
117
|
-
message = {
|
118
|
-
subject: subject,
|
119
|
-
body: body
|
120
|
-
}
|
121
|
-
|
122
|
-
logger.error "\e[31m#{body}\e[0m" if subject == "error"
|
123
|
-
|
124
|
-
cable_ready[stream_name].dispatch_event(
|
125
|
-
name: "stimulus-reflex:server-message",
|
126
|
-
detail: {stimulus_reflex: data.merge(server_message: message)}
|
127
|
-
)
|
128
|
-
cable_ready.broadcast
|
129
|
-
end
|
130
|
-
|
131
93
|
def exception_message_with_backtrace(exception)
|
132
94
|
"#{exception} #{exception.backtrace.first}"
|
133
95
|
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
|
@@ -82,6 +86,36 @@ class StimulusReflex::Reflex
|
|
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
|
+
cable_ready[channel.stream_name].morph(
|
112
|
+
selector: selector,
|
113
|
+
html: html,
|
114
|
+
children_only: true,
|
115
|
+
permanent_attribute_name: permanent_attribute_name
|
116
|
+
)
|
117
|
+
end
|
118
|
+
|
85
119
|
def controller
|
86
120
|
@controller ||= begin
|
87
121
|
request.controller_class.new.tap do |c|
|
@@ -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 =
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
class
|
3
|
+
class DemoReflex < ApplicationReflex
|
4
4
|
# Add Reflex methods in this file.
|
5
5
|
#
|
6
6
|
# All Reflex instances expose the following properties:
|
@@ -21,4 +21,5 @@ class PostsReflex < 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.
|
4
|
+
version: 3.3.0.pre0
|
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-
|
11
|
+
date: 2020-07-04 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/
|
161
|
-
- lib/generators/templates/
|
162
|
-
- lib/generators/templates/
|
163
|
-
- lib/generators/templates/
|
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
|
@@ -172,7 +177,7 @@ files:
|
|
172
177
|
- test/generators/stimulus_reflex_generator_test.rb
|
173
178
|
- test/test_helper.rb
|
174
179
|
- test/tmp/app/reflexes/application_reflex.rb
|
175
|
-
- test/tmp/app/reflexes/
|
180
|
+
- test/tmp/app/reflexes/demo_reflex.rb
|
176
181
|
homepage: https://github.com/hopsoft/stimulus_reflex
|
177
182
|
licenses:
|
178
183
|
- MIT
|
@@ -197,16 +202,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
197
202
|
version: '0'
|
198
203
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
199
204
|
requirements:
|
200
|
-
- - "
|
205
|
+
- - ">"
|
201
206
|
- !ruby/object:Gem::Version
|
202
|
-
version:
|
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:
|
209
214
|
- test/test_helper.rb
|
210
215
|
- test/generators/stimulus_reflex_generator_test.rb
|
216
|
+
- test/tmp/app/reflexes/demo_reflex.rb
|
211
217
|
- test/tmp/app/reflexes/application_reflex.rb
|
212
|
-
- test/tmp/app/reflexes/posts_reflex.rb
|