superglue 2.0.0.alpha.1 → 2.0.0.alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/channels/superglue/streams/broadcasts.rb +16 -16
- data/app/helpers/superglue/streams_helper.rb +18 -18
- data/app/jobs/superglue/streams/action_broadcast_job.rb +2 -2
- data/app/models/concerns/superglue/broadcastable.rb +37 -37
- data/app/views/superglue/layouts/_stream_message.json.props +1 -1
- data/lib/generators/superglue/install/install_generator.rb +1 -1
- data/lib/generators/superglue/install/templates/js/flash.js +10 -6
- data/lib/generators/superglue/install/templates/stream.json.props +5 -1
- data/lib/generators/superglue/install/templates/ts/flash.ts +12 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c623e4cdef9e492b0d0bbf70ff81eaecdf6b87afdd22ff9588ec662c74c5942a
|
4
|
+
data.tar.gz: 85470818c873297c7a119dc0a7370ecedf0ac269082dfef1d663c33b44d695fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 831982e9a9100f6a335b7d4e8f565facff1e65e6bfd3cb53290aeb905e7c60ed7ea6fe00b2975327f9b9fcb46591c556a4a73b90188634eccfd836145d083fa8
|
7
|
+
data.tar.gz: d69bde09f1ed1d9665230104f61d238e4e30c22c3bf9d676d30c80e01274c2ba9a0dad64cbe3592725fa56dc8b6e8798c90b148c6f373924410c439ea497f25f
|
@@ -22,19 +22,19 @@ module Superglue::Streams::Broadcasts
|
|
22
22
|
broadcast_stream_to(*streamables, content: content)
|
23
23
|
end
|
24
24
|
|
25
|
-
def broadcast_action_to(*streamables, action:,
|
25
|
+
def broadcast_action_to(*streamables, action:, target: nil, targets: nil, save_target: nil, options: {}, **rendering)
|
26
26
|
locals = rendering[:locals] || {}
|
27
|
-
|
27
|
+
targets = (target ? [target] : targets)
|
28
28
|
|
29
|
-
|
29
|
+
targets = targets.map do |item|
|
30
30
|
convert_to_superglue_fragment_id(item)
|
31
31
|
end
|
32
32
|
|
33
|
-
if
|
34
|
-
options[:saveAs] = convert_to_superglue_fragment_id(
|
33
|
+
if save_target
|
34
|
+
options[:saveAs] = convert_to_superglue_fragment_id(save_target)
|
35
35
|
end
|
36
36
|
|
37
|
-
locals[:
|
37
|
+
locals[:broadcast_target_keys] = targets
|
38
38
|
locals[:broadcast_action] = action
|
39
39
|
locals[:broadcast_options] = options
|
40
40
|
rendering[:locals] = locals
|
@@ -69,22 +69,22 @@ module Superglue::Streams::Broadcasts
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
-
def broadcast_action_later_to(*streamables, action:,
|
72
|
+
def broadcast_action_later_to(*streamables, action:, target: nil, targets: nil, save_target: nil, options: {}, **rendering)
|
73
73
|
streamables.flatten!
|
74
74
|
streamables.compact_blank!
|
75
75
|
|
76
76
|
return unless streamables.present?
|
77
77
|
|
78
|
-
|
78
|
+
targets = (target ? [target] : targets).map do |item|
|
79
79
|
convert_to_superglue_fragment_id(item)
|
80
80
|
end
|
81
81
|
|
82
|
-
if
|
83
|
-
options[:saveAs] = convert_to_superglue_fragment_id(
|
82
|
+
if save_target
|
83
|
+
options[:saveAs] = convert_to_superglue_fragment_id(save_target)
|
84
84
|
end
|
85
85
|
|
86
86
|
Superglue::Streams::ActionBroadcastJob.perform_later \
|
87
|
-
stream_name_from(streamables), action: action,
|
87
|
+
stream_name_from(streamables), action: action, targets: targets, options: options, **rendering
|
88
88
|
end
|
89
89
|
|
90
90
|
def broadcast_stream_to(*streamables, content:)
|
@@ -102,12 +102,12 @@ module Superglue::Streams::Broadcasts
|
|
102
102
|
|
103
103
|
private
|
104
104
|
|
105
|
-
def convert_to_superglue_fragment_id(
|
106
|
-
|
107
|
-
if
|
108
|
-
ActionView::RecordIdentifier.dom_id(*
|
105
|
+
def convert_to_superglue_fragment_id(target)
|
106
|
+
target_array = Array.wrap(target)
|
107
|
+
if target_array.any? { |value| value.respond_to?(:to_key) }
|
108
|
+
ActionView::RecordIdentifier.dom_id(*target_array)
|
109
109
|
else
|
110
|
-
|
110
|
+
target
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
@@ -10,40 +10,40 @@ module Superglue::StreamsHelper
|
|
10
10
|
def fragment_id(value)
|
11
11
|
if value.respond_to?(:to_key)
|
12
12
|
ActionView::RecordIdentifier.dom_id(value)
|
13
|
-
elsif value.respond_to?(:
|
14
|
-
value.
|
13
|
+
elsif value.respond_to?(:broadcast_target_default)
|
14
|
+
value.broadcast_target_default
|
15
15
|
else
|
16
16
|
value.to_s
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
def broadcast_prepend_props(model: nil,
|
21
|
-
if
|
22
|
-
options[:saveAs] ||= fragment_id(
|
20
|
+
def broadcast_prepend_props(model: nil, target: nil, save_target: nil, options: {}, **rendering)
|
21
|
+
if save_target
|
22
|
+
options[:saveAs] ||= fragment_id(save_target)
|
23
23
|
end
|
24
24
|
|
25
|
-
broadcast_action_props(action: "prepend", model:,
|
25
|
+
broadcast_action_props(action: "prepend", model:, target:, options:, **rendering)
|
26
26
|
end
|
27
27
|
|
28
|
-
def broadcast_append_props(model: nil,
|
29
|
-
if
|
30
|
-
options[:saveAs] ||= fragment_id(
|
28
|
+
def broadcast_append_props(model: nil, target: nil, save_target: nil, options: {}, **rendering)
|
29
|
+
if save_target
|
30
|
+
options[:saveAs] ||= fragment_id(save_target)
|
31
31
|
end
|
32
32
|
|
33
|
-
broadcast_action_props(action: "append", model:,
|
33
|
+
broadcast_action_props(action: "append", model:, target:, options:, **rendering)
|
34
34
|
end
|
35
35
|
|
36
|
-
def broadcast_save_props(model: nil, partial: nil,
|
37
|
-
if model && !
|
38
|
-
|
36
|
+
def broadcast_save_props(model: nil, partial: nil, target: nil, options: {}, **rendering)
|
37
|
+
if model && !target
|
38
|
+
target = fragment_id(model)
|
39
39
|
end
|
40
40
|
|
41
|
-
broadcast_action_props(action: "save", model:,
|
41
|
+
broadcast_action_props(action: "save", model:, target:, options:, **rendering)
|
42
42
|
end
|
43
43
|
|
44
|
-
def broadcast_action_props(action:, partial: nil, model: nil,
|
44
|
+
def broadcast_action_props(action:, partial: nil, model: nil, target: nil, options: {}, **rendering)
|
45
45
|
if model
|
46
|
-
|
46
|
+
target = model.broadcast_target_default if !target
|
47
47
|
|
48
48
|
if model.respond_to?(:to_partial_path)
|
49
49
|
rendering[:locals] = (rendering[:locals] || {}).reverse_merge(model.model_name.element.to_sym => model).compact
|
@@ -51,7 +51,7 @@ module Superglue::StreamsHelper
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
|
54
|
+
target = fragment_id(target)
|
55
55
|
|
56
56
|
if !partial
|
57
57
|
raise StandardError, "A partial is needed to render a stream"
|
@@ -60,7 +60,7 @@ module Superglue::StreamsHelper
|
|
60
60
|
json = instance_variable_get(:@__json)
|
61
61
|
|
62
62
|
json.child! do
|
63
|
-
json.fragmentIds [
|
63
|
+
json.fragmentIds [target]
|
64
64
|
json.handler action
|
65
65
|
json.options(options)
|
66
66
|
json.data(partial: [partial, rendering]) do
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Superglue::Streams::ActionBroadcastJob < ActiveJob::Base
|
2
2
|
discard_on ActiveJob::DeserializationError
|
3
3
|
|
4
|
-
def perform(stream, action:,
|
5
|
-
Superglue::StreamsChannel.broadcast_action_to stream, action: action,
|
4
|
+
def perform(stream, action:, targets:, options: {}, **rendering)
|
5
|
+
Superglue::StreamsChannel.broadcast_action_to stream, action: action, targets: targets, options: options, **rendering
|
6
6
|
end
|
7
7
|
end
|
@@ -7,13 +7,13 @@ module Superglue::Broadcastable
|
|
7
7
|
end
|
8
8
|
|
9
9
|
module ClassMethods
|
10
|
-
def broadcasts_to(stream, inserts_by: :append,
|
11
|
-
after_create_commit -> { broadcast_action_later_to(stream.try(:call, self) || send(stream), action: inserts_by,
|
10
|
+
def broadcasts_to(stream, inserts_by: :append, target: broadcast_target_default, save_target: nil, **rendering)
|
11
|
+
after_create_commit -> { broadcast_action_later_to(stream.try(:call, self) || send(stream), action: inserts_by, target: target.try(:call, self) || target, save_target: save_target&.try(:call, self), **rendering) }
|
12
12
|
after_update_commit -> { broadcast_save_later_to(stream.try(:call, self) || send(stream), **rendering) }
|
13
13
|
end
|
14
14
|
|
15
|
-
def broadcasts(stream = model_name.plural, inserts_by: :append,
|
16
|
-
after_create_commit -> { broadcast_action_later_to(stream, action: inserts_by,
|
15
|
+
def broadcasts(stream = model_name.plural, inserts_by: :append, target: broadcast_target_default, save_target: nil, **rendering)
|
16
|
+
after_create_commit -> { broadcast_action_later_to(stream, action: inserts_by, target: target.try(:call, self) || target, save_target: save_target&.try(:call, self), **rendering) }
|
17
17
|
after_update_commit -> { broadcast_save_later(**rendering) }
|
18
18
|
end
|
19
19
|
|
@@ -27,7 +27,7 @@ module Superglue::Broadcastable
|
|
27
27
|
after_destroy_commit -> { broadcast_refresh }
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
30
|
+
def broadcast_target_default
|
31
31
|
model_name.plural
|
32
32
|
end
|
33
33
|
|
@@ -43,30 +43,30 @@ module Superglue::Broadcastable
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
# add
|
46
|
+
# add target?
|
47
47
|
def broadcast_save_to(*streamables, **rendering)
|
48
|
-
Superglue::StreamsChannel.broadcast_save_to(*streamables, **
|
48
|
+
Superglue::StreamsChannel.broadcast_save_to(*streamables, **extract_options_and_add_target(rendering, target: self)) unless suppressed_superglue_broadcasts?
|
49
49
|
end
|
50
50
|
|
51
51
|
def broadcast_save(**rendering)
|
52
52
|
broadcast_save_to self, **rendering
|
53
53
|
end
|
54
54
|
|
55
|
-
# todo
|
56
|
-
def broadcast_append_to(*streamables,
|
57
|
-
Superglue::StreamsChannel.broadcast_append_to(*streamables,
|
55
|
+
# todo save_target: true
|
56
|
+
def broadcast_append_to(*streamables, target: broadcast_target_default, save_target: nil, **rendering)
|
57
|
+
Superglue::StreamsChannel.broadcast_append_to(*streamables, save_target: save_target, **extract_options_and_add_target(rendering, target: target)) unless suppressed_superglue_broadcasts?
|
58
58
|
end
|
59
59
|
|
60
|
-
def broadcast_append(
|
61
|
-
broadcast_append_to self,
|
60
|
+
def broadcast_append(target: broadcast_target_default, save_target: nil, **rendering)
|
61
|
+
broadcast_append_to self, target: target, save_target: save_target, **rendering
|
62
62
|
end
|
63
63
|
|
64
|
-
def broadcast_prepend_to(*streamables,
|
65
|
-
Superglue::StreamsChannel.broadcast_prepend_to(*streamables,
|
64
|
+
def broadcast_prepend_to(*streamables, target: broadcast_target_default, save_target: nil, **rendering)
|
65
|
+
Superglue::StreamsChannel.broadcast_prepend_to(*streamables, save_target: save_target, **extract_options_and_add_target(rendering, target: target)) unless suppressed_superglue_broadcasts?
|
66
66
|
end
|
67
67
|
|
68
|
-
def broadcast_prepend(
|
69
|
-
broadcast_prepend_to self,
|
68
|
+
def broadcast_prepend(target: broadcast_target_default, save_target: nil, **rendering)
|
69
|
+
broadcast_prepend_to self, target: target, save_target: save_target, **rendering
|
70
70
|
end
|
71
71
|
|
72
72
|
def broadcast_refresh_to(*streamables)
|
@@ -78,36 +78,36 @@ module Superglue::Broadcastable
|
|
78
78
|
end
|
79
79
|
|
80
80
|
# todo rename options to js_options
|
81
|
-
def broadcast_action_to(*streamables, action:,
|
82
|
-
Superglue::StreamsChannel.broadcast_action_to(*streamables, action: action, options: options, **
|
81
|
+
def broadcast_action_to(*streamables, action:, target: broadcast_target_default, options: {}, **rendering)
|
82
|
+
Superglue::StreamsChannel.broadcast_action_to(*streamables, action: action, options: options, **extract_options_and_add_target(rendering, target: target)) unless suppressed_superglue_broadcasts?
|
83
83
|
end
|
84
84
|
|
85
|
-
def broadcast_action(action,
|
86
|
-
broadcast_action_to self, action: action,
|
85
|
+
def broadcast_action(action, target: broadcast_target_default, options: {}, **rest)
|
86
|
+
broadcast_action_to self, action: action, target: target, options: options, **rest
|
87
87
|
end
|
88
88
|
|
89
89
|
def broadcast_save_later_to(*streamables, **rendering)
|
90
|
-
Superglue::StreamsChannel.broadcast_save_later_to(*streamables, **
|
90
|
+
Superglue::StreamsChannel.broadcast_save_later_to(*streamables, **extract_options_and_add_target(rendering, target: self)) unless suppressed_superglue_broadcasts?
|
91
91
|
end
|
92
92
|
|
93
93
|
def broadcast_save_later(**rendering)
|
94
94
|
broadcast_save_later_to self, **rendering
|
95
95
|
end
|
96
96
|
|
97
|
-
def broadcast_append_later_to(*streamables,
|
98
|
-
Superglue::StreamsChannel.broadcast_append_later_to(*streamables,
|
97
|
+
def broadcast_append_later_to(*streamables, target: broadcast_target_default, save_target: nil, **rendering)
|
98
|
+
Superglue::StreamsChannel.broadcast_append_later_to(*streamables, save_target: save_target, **extract_options_and_add_target(rendering, target: target)) unless suppressed_superglue_broadcasts?
|
99
99
|
end
|
100
100
|
|
101
|
-
def broadcast_append_later(
|
102
|
-
broadcast_append_later_to self,
|
101
|
+
def broadcast_append_later(target: broadcast_target_default, save_target: nil, **rendering)
|
102
|
+
broadcast_append_later_to self, target: target, save_target: save_target, **rendering
|
103
103
|
end
|
104
104
|
|
105
|
-
def broadcast_prepend_later_to(*streamables,
|
106
|
-
Superglue::StreamsChannel.broadcast_prepend_later_to(*streamables,
|
105
|
+
def broadcast_prepend_later_to(*streamables, target: broadcast_target_default, save_target: nil, **rendering)
|
106
|
+
Superglue::StreamsChannel.broadcast_prepend_later_to(*streamables, save_target: save_target, **extract_options_and_add_target(rendering, target: target)) unless suppressed_superglue_broadcasts?
|
107
107
|
end
|
108
108
|
|
109
|
-
def broadcast_prepend_later(
|
110
|
-
broadcast_prepend_later_to self,
|
109
|
+
def broadcast_prepend_later(target: broadcast_target_default, save_target: nil, **rendering)
|
110
|
+
broadcast_prepend_later_to self, target: target, save_target: save_target, **rendering
|
111
111
|
end
|
112
112
|
|
113
113
|
def broadcast_refresh_later_to(*streamables)
|
@@ -118,23 +118,23 @@ module Superglue::Broadcastable
|
|
118
118
|
broadcast_refresh_later_to self
|
119
119
|
end
|
120
120
|
|
121
|
-
def broadcast_action_later_to(*streamables, action:,
|
122
|
-
Superglue::StreamsChannel.broadcast_action_later_to(*streamables, action: action, options: options, **
|
121
|
+
def broadcast_action_later_to(*streamables, action:, target: broadcast_target_default, options: {}, **rendering)
|
122
|
+
Superglue::StreamsChannel.broadcast_action_later_to(*streamables, action: action, options: options, **extract_options_and_add_target(rendering, target: target)) unless suppressed_superglue_broadcasts?
|
123
123
|
end
|
124
124
|
|
125
|
-
def broadcast_action_later(action:,
|
126
|
-
broadcast_action_later_to self, action: action,
|
125
|
+
def broadcast_action_later(action:, target: broadcast_target_default, options: {}, **rendering)
|
126
|
+
broadcast_action_later_to self, action: action, target: target, options: options, **rendering
|
127
127
|
end
|
128
128
|
|
129
|
-
def
|
130
|
-
self.class.
|
129
|
+
def broadcast_target_default
|
130
|
+
self.class.broadcast_target_default
|
131
131
|
end
|
132
132
|
|
133
133
|
private
|
134
134
|
|
135
|
-
def
|
135
|
+
def extract_options_and_add_target(rendering = {}, target: broadcast_target_default)
|
136
136
|
broadcast_rendering_with_defaults(rendering).tap do |options|
|
137
|
-
options[:
|
137
|
+
options[:target] = target if !options.key?(:target) && !options.key?(:targets)
|
138
138
|
end
|
139
139
|
end
|
140
140
|
|
@@ -40,7 +40,7 @@ module Superglue
|
|
40
40
|
insert_jsx_rendering_defaults
|
41
41
|
|
42
42
|
say "Installing Superglue and friends"
|
43
|
-
run "yarn add react react-dom @reduxjs/toolkit react-redux @thoughtbot/superglue@2.0.0-alpha.
|
43
|
+
run "yarn add react react-dom @reduxjs/toolkit react-redux @thoughtbot/superglue@2.0.0-alpha.2"
|
44
44
|
|
45
45
|
if use_typescript
|
46
46
|
run "yarn add -D @types/react-dom @types/react @types/node @thoughtbot/candy_wrapper"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { createSlice } from "@reduxjs/toolkit"
|
2
|
-
import {
|
2
|
+
import { receiveResponse , beforeVisit } from "@thoughtbot/superglue"
|
3
3
|
|
4
4
|
const initialState = {}
|
5
5
|
|
@@ -30,12 +30,16 @@ export const flashSlice = createSlice({
|
|
30
30
|
builder.addCase(beforeVisit, (_state, _action) => {
|
31
31
|
return {}
|
32
32
|
})
|
33
|
-
builder.addCase(
|
34
|
-
const {
|
33
|
+
builder.addCase(receiveResponse , (state, action) => {
|
34
|
+
const { response } = action.payload
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
if(response.slices) {
|
37
|
+
return {
|
38
|
+
...state,
|
39
|
+
...response.slices.flash
|
40
|
+
}
|
41
|
+
} else {
|
42
|
+
return state
|
39
43
|
}
|
40
44
|
})
|
41
45
|
}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { createSlice } from "@reduxjs/toolkit";
|
2
|
-
import {
|
2
|
+
import { receiveResponse, beforeVisit } from "@thoughtbot/superglue";
|
3
3
|
|
4
|
-
type FlashState = Record<string, any
|
4
|
+
type FlashState = Record<string, any>;
|
5
5
|
|
6
6
|
const initialState: FlashState = {};
|
7
7
|
|
@@ -32,13 +32,17 @@ export const flashSlice = createSlice({
|
|
32
32
|
builder.addCase(beforeVisit, (_state, _action) => {
|
33
33
|
return {};
|
34
34
|
});
|
35
|
-
builder.addCase(
|
36
|
-
const {
|
35
|
+
builder.addCase(receiveResponse, (state, action) => {
|
36
|
+
const { response } = action.payload;
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
if (response.slices) {
|
39
|
+
return {
|
40
|
+
...state,
|
41
|
+
...(response.slices.flash as FlashState),
|
42
|
+
};
|
43
|
+
} else {
|
44
|
+
return state;
|
45
|
+
}
|
42
46
|
});
|
43
47
|
},
|
44
48
|
});
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: superglue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.alpha.
|
4
|
+
version: 2.0.0.alpha.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johny Ho
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|