phlex-reactive 0.14.3 → 0.15.0

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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +107 -0
  3. data/README.md +258 -5
  4. data/app/controllers/phlex/reactive/actions_controller.rb +28 -18
  5. data/app/javascript/phlex/reactive/core.js +7 -1
  6. data/app/javascript/phlex/reactive/core.min.js +6 -2
  7. data/app/javascript/phlex/reactive/core.min.js.map +4 -4
  8. data/app/javascript/phlex/reactive/early.js +28 -9
  9. data/app/javascript/phlex/reactive/early.min.js +2 -2
  10. data/app/javascript/phlex/reactive/early.min.js.map +3 -3
  11. data/app/javascript/phlex/reactive/features/bindings.js +188 -107
  12. data/app/javascript/phlex/reactive/features/bindings.min.js +2 -2
  13. data/app/javascript/phlex/reactive/features/bindings.min.js.map +3 -3
  14. data/app/javascript/phlex/reactive/features/form.js +75 -46
  15. data/app/javascript/phlex/reactive/features/form.min.js +2 -2
  16. data/app/javascript/phlex/reactive/features/form.min.js.map +3 -3
  17. data/app/javascript/phlex/reactive/features/persist.js +12 -3
  18. data/app/javascript/phlex/reactive/features/persist.min.js +2 -2
  19. data/app/javascript/phlex/reactive/features/persist.min.js.map +3 -3
  20. data/app/javascript/phlex/reactive/features/presence.js +205 -0
  21. data/app/javascript/phlex/reactive/features/presence.min.js +4 -0
  22. data/app/javascript/phlex/reactive/features/presence.min.js.map +10 -0
  23. data/app/javascript/phlex/reactive/features/sortable.js +463 -0
  24. data/app/javascript/phlex/reactive/features/sortable.min.js +4 -0
  25. data/app/javascript/phlex/reactive/features/sortable.min.js.map +10 -0
  26. data/app/javascript/phlex/reactive/inspect.js +5 -1
  27. data/app/javascript/phlex/reactive/inspect.min.js +2 -2
  28. data/app/javascript/phlex/reactive/inspect.min.js.map +3 -3
  29. data/app/javascript/phlex/reactive/reactive_controller.js +5 -1
  30. data/app/javascript/phlex/reactive/reactive_controller.min.js +6 -2
  31. data/app/javascript/phlex/reactive/reactive_controller.min.js.map +10 -8
  32. data/app/javascript/phlex/reactive/runtime.js +286 -18
  33. data/lib/phlex/reactive/component/dsl.rb +5 -0
  34. data/lib/phlex/reactive/component/editable.rb +78 -0
  35. data/lib/phlex/reactive/component/helpers.rb +81 -8
  36. data/lib/phlex/reactive/component/presence_declaration.rb +118 -0
  37. data/lib/phlex/reactive/component/registry.rb +3 -1
  38. data/lib/phlex/reactive/component/sortable.rb +212 -0
  39. data/lib/phlex/reactive/component.rb +1 -0
  40. data/lib/phlex/reactive/defer.rb +5 -0
  41. data/lib/phlex/reactive/engine.rb +9 -4
  42. data/lib/phlex/reactive/js.rb +24 -0
  43. data/lib/phlex/reactive/presence/component_methods.rb +130 -0
  44. data/lib/phlex/reactive/presence/roster.rb +90 -0
  45. data/lib/phlex/reactive/presence/transport.rb +154 -0
  46. data/lib/phlex/reactive/presence.rb +162 -0
  47. data/lib/phlex/reactive/presence_render_job.rb +26 -0
  48. data/lib/phlex/reactive/shortcut.rb +105 -0
  49. data/lib/phlex/reactive/streamable.rb +7 -3
  50. data/lib/phlex/reactive/version.rb +1 -1
  51. data/lib/phlex/reactive.rb +10 -0
  52. metadata +16 -1
@@ -37,10 +37,13 @@ module Phlex
37
37
  # Focus ops steal focus in every subscriber's tab (issue #96); submit
38
38
  # (issue #226) would force-submit every subscriber's form; paste_into
39
39
  # (issue #228) would read every subscriber's clipboard; check_group
40
- # (issue #342) would tick or clear every subscriber's selection. They
40
+ # (issue #342) would tick or clear every subscriber's selection; presence
41
+ # (issue #358) would write every subscriber's presence state. They
41
42
  # belong to the actor's own reply (reply.js) or gesture (on_client / a
42
43
  # reducer's $ops), never a broadcast. Names mirror Phlex::Reactive::JS's verbs.
43
- BROADCAST_REFUSED_OPS = %w[focus focus_first submit paste_into persist_state persist_clear check_group].freeze
44
+ BROADCAST_REFUSED_OPS = %w[
45
+ focus focus_first submit paste_into persist_state persist_clear check_group presence
46
+ ].freeze
44
47
 
45
48
  # The broadcast_to verb kwargs (issue #185) → their Turbo stream action.
46
49
  # SELF-TARGETING verbs derive the target from the component's #id (require a
@@ -193,7 +196,8 @@ module Phlex
193
196
  "broadcast_to(js:) refuses actor-only op(s) #{refused.join(", ")} — broadcasting focus " \
194
197
  "steals it in every subscriber's tab; broadcasting submit force-submits every " \
195
198
  "subscriber's form; broadcasting paste_into reads every subscriber's clipboard; " \
196
- "broadcasting check_group ticks or clears every subscriber's selection. " \
199
+ "broadcasting check_group ticks or clears every subscriber's selection; " \
200
+ "broadcasting presence writes every subscriber's presence state. " \
197
201
  "These are actor concerns (reply.js / on_client / $ops)."
198
202
  end
199
203
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Phlex
4
4
  module Reactive
5
- VERSION = "0.14.3"
5
+ VERSION = "0.15.0"
6
6
  end
7
7
  end
@@ -66,6 +66,12 @@ module Phlex
66
66
  # authorization method / mark_authorized! / declare skip_verify_authorized).
67
67
  class AuthorizationNotVerified < Error; end
68
68
 
69
+ # Raised when a feature needs a transport capability the app does not have
70
+ # (issue #358: reactive_presence without a pgbus that keys presence by
71
+ # connection). Loud at first render, with the requirement in the message —
72
+ # there is no degraded mode to fall back to.
73
+ class ConfigurationError < Error; end
74
+
69
75
  # Purpose string bound into every identity token's signature so a token
70
76
  # minted for phlex-reactive can't be replayed against another verifier use.
71
77
  IDENTITY_PURPOSE = "phlex-reactive/identity"
@@ -1283,6 +1289,10 @@ loader.do_not_eager_load("#{__dir__}/reactive/engine.rb")
1283
1289
  # boot. The constant autoloads on first reference, which only happens behind
1284
1290
  # Phlex::Reactive.defer_push_capable? (that gate requires ActiveJob::Base).
1285
1291
  loader.do_not_eager_load("#{__dir__}/reactive/deferred_render_job.rb")
1292
+ # The presence roster's render job (issue #358), for the same reason: it is
1293
+ # only referenced behind Phlex::Reactive::Presence.capable? (which requires
1294
+ # ActiveJob::Base).
1295
+ loader.do_not_eager_load("#{__dir__}/reactive/presence_render_job.rb")
1286
1296
  loader.setup
1287
1297
 
1288
1298
  require "phlex/reactive/engine" if defined?(Rails::Engine)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phlex-reactive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.3
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikael Henriksson
@@ -158,6 +158,12 @@ files:
158
158
  - app/javascript/phlex/reactive/features/persist.js
159
159
  - app/javascript/phlex/reactive/features/persist.min.js
160
160
  - app/javascript/phlex/reactive/features/persist.min.js.map
161
+ - app/javascript/phlex/reactive/features/presence.js
162
+ - app/javascript/phlex/reactive/features/presence.min.js
163
+ - app/javascript/phlex/reactive/features/presence.min.js.map
164
+ - app/javascript/phlex/reactive/features/sortable.js
165
+ - app/javascript/phlex/reactive/features/sortable.min.js
166
+ - app/javascript/phlex/reactive/features/sortable.min.js.map
161
167
  - app/javascript/phlex/reactive/inspect.js
162
168
  - app/javascript/phlex/reactive/inspect.min.js
163
169
  - app/javascript/phlex/reactive/inspect.min.js.map
@@ -188,11 +194,14 @@ files:
188
194
  - lib/phlex/reactive/collections.rb
189
195
  - lib/phlex/reactive/component.rb
190
196
  - lib/phlex/reactive/component/dsl.rb
197
+ - lib/phlex/reactive/component/editable.rb
191
198
  - lib/phlex/reactive/component/helpers.rb
192
199
  - lib/phlex/reactive/component/identity.rb
193
200
  - lib/phlex/reactive/component/lazy.rb
201
+ - lib/phlex/reactive/component/presence_declaration.rb
194
202
  - lib/phlex/reactive/component/registry.rb
195
203
  - lib/phlex/reactive/component/selection.rb
204
+ - lib/phlex/reactive/component/sortable.rb
196
205
  - lib/phlex/reactive/defer.rb
197
206
  - lib/phlex/reactive/deferred_render_job.rb
198
207
  - lib/phlex/reactive/doctor.rb
@@ -217,10 +226,16 @@ files:
217
226
  - lib/phlex/reactive/param_schema.rb
218
227
  - lib/phlex/reactive/pending.rb
219
228
  - lib/phlex/reactive/pending/markup.rb
229
+ - lib/phlex/reactive/presence.rb
230
+ - lib/phlex/reactive/presence/component_methods.rb
231
+ - lib/phlex/reactive/presence/roster.rb
232
+ - lib/phlex/reactive/presence/transport.rb
233
+ - lib/phlex/reactive/presence_render_job.rb
220
234
  - lib/phlex/reactive/reply.rb
221
235
  - lib/phlex/reactive/response.rb
222
236
  - lib/phlex/reactive/settle.rb
223
237
  - lib/phlex/reactive/settles.rb
238
+ - lib/phlex/reactive/shortcut.rb
224
239
  - lib/phlex/reactive/show_conditions.rb
225
240
  - lib/phlex/reactive/stream.rb
226
241
  - lib/phlex/reactive/streamable.rb