turbo_overlay 0.3.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +436 -0
- data/LICENSE.txt +21 -0
- data/README.md +330 -0
- data/Rakefile +35 -0
- data/app/assets/stylesheets/turbo_overlay.css +234 -0
- data/app/javascript/turbo_overlay/dialog_utils.js +46 -0
- data/app/javascript/turbo_overlay/hint.js +670 -0
- data/app/javascript/turbo_overlay/history.js +184 -0
- data/app/javascript/turbo_overlay/index.js +53 -0
- data/app/javascript/turbo_overlay/options.js +152 -0
- data/app/javascript/turbo_overlay/overlay_controller.js +882 -0
- data/app/javascript/turbo_overlay/popover_position.js +64 -0
- data/app/javascript/turbo_overlay/setup.js +885 -0
- data/app/javascript/turbo_overlay/stack_controller.js +131 -0
- data/app/javascript/turbo_overlay/submit_close.js +49 -0
- data/app/javascript/turbo_overlay/visit.js +52 -0
- data/app/views/layouts/turbo_overlay/drawer.html.erb +5 -0
- data/app/views/layouts/turbo_overlay/hint.html.erb +10 -0
- data/app/views/layouts/turbo_overlay/modal.html.erb +5 -0
- data/app/views/layouts/turbo_overlay/popover.html.erb +5 -0
- data/app/views/turbo_overlay/_drawer.html.erb +49 -0
- data/app/views/turbo_overlay/_hint.html.erb +6 -0
- data/app/views/turbo_overlay/_loading.html.erb +12 -0
- data/app/views/turbo_overlay/_modal.html.erb +46 -0
- data/app/views/turbo_overlay/_popover.html.erb +54 -0
- data/config/importmap.rb +11 -0
- data/lib/generators/turbo_overlay/eject_generator.rb +115 -0
- data/lib/generators/turbo_overlay/install_generator.rb +443 -0
- data/lib/generators/turbo_overlay/templates/chrome/bootstrap3/_confirm.html.erb +13 -0
- data/lib/generators/turbo_overlay/templates/chrome/bootstrap3/_drawer.html.erb +50 -0
- data/lib/generators/turbo_overlay/templates/chrome/bootstrap3/_hint.html.erb +9 -0
- data/lib/generators/turbo_overlay/templates/chrome/bootstrap3/_loading.html.erb +9 -0
- data/lib/generators/turbo_overlay/templates/chrome/bootstrap3/_modal.html.erb +49 -0
- data/lib/generators/turbo_overlay/templates/chrome/bootstrap3/_popover.html.erb +54 -0
- data/lib/generators/turbo_overlay/templates/chrome/bootstrap5/_confirm.html.erb +13 -0
- data/lib/generators/turbo_overlay/templates/chrome/bootstrap5/_drawer.html.erb +55 -0
- data/lib/generators/turbo_overlay/templates/chrome/bootstrap5/_hint.html.erb +9 -0
- data/lib/generators/turbo_overlay/templates/chrome/bootstrap5/_loading.html.erb +9 -0
- data/lib/generators/turbo_overlay/templates/chrome/bootstrap5/_modal.html.erb +58 -0
- data/lib/generators/turbo_overlay/templates/chrome/bootstrap5/_popover.html.erb +53 -0
- data/lib/generators/turbo_overlay/templates/chrome/plain/_confirm.html.erb +14 -0
- data/lib/generators/turbo_overlay/templates/chrome/tailwind/_confirm.html.erb +17 -0
- data/lib/generators/turbo_overlay/templates/chrome/tailwind/_drawer.html.erb +55 -0
- data/lib/generators/turbo_overlay/templates/chrome/tailwind/_hint.html.erb +6 -0
- data/lib/generators/turbo_overlay/templates/chrome/tailwind/_loading.html.erb +9 -0
- data/lib/generators/turbo_overlay/templates/chrome/tailwind/_modal.html.erb +46 -0
- data/lib/generators/turbo_overlay/templates/chrome/tailwind/_popover.html.erb +54 -0
- data/lib/generators/turbo_overlay/templates/initializer.rb.tt +67 -0
- data/lib/turbo_overlay/configuration.rb +226 -0
- data/lib/turbo_overlay/controller.rb +405 -0
- data/lib/turbo_overlay/engine.rb +52 -0
- data/lib/turbo_overlay/helpers/stream_helper.rb +77 -0
- data/lib/turbo_overlay/helpers/view_helper.rb +651 -0
- data/lib/turbo_overlay/version.rb +3 -0
- data/lib/turbo_overlay.rb +20 -0
- metadata +161 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
module TurboOverlay
|
|
2
|
+
module Helpers
|
|
3
|
+
# Adds `turbo_stream.overlay(:close, …)` (alias `:hide`,
|
|
4
|
+
# `:dismiss`) so server responses can dismiss open overlays.
|
|
5
|
+
#
|
|
6
|
+
# turbo_stream.overlay(:close) # close top
|
|
7
|
+
# turbo_stream.overlay(:close, scope: :all) # close everything
|
|
8
|
+
# turbo_stream.overlay(:close, scope: :all, type: :modal) # close all modals
|
|
9
|
+
# turbo_stream.overlay(:close, id: "edit_user_42") # close one by id
|
|
10
|
+
#
|
|
11
|
+
# Pair the close with a host-page navigation via `visit:` —
|
|
12
|
+
# closes the overlay, awaits the close animation, then runs
|
|
13
|
+
# `Turbo.visit` on the host page. Useful for stream-driven
|
|
14
|
+
# flows where there's no form submission to ride a redirect on
|
|
15
|
+
# (ActionCable broadcasts, async job completion):
|
|
16
|
+
#
|
|
17
|
+
# turbo_stream.overlay(:close, visit: widgets_path)
|
|
18
|
+
# turbo_stream.overlay(:close, visit: widgets_path, visit_action: :replace)
|
|
19
|
+
#
|
|
20
|
+
# The custom turbo-stream action dispatches a `turbo-overlay:close`
|
|
21
|
+
# window event with `scope`, `type`, `id`, `visit`, and
|
|
22
|
+
# `visitAction` details; the stack Stimulus controller routes the
|
|
23
|
+
# close and performs the visit after the close animation resolves.
|
|
24
|
+
module StreamHelper
|
|
25
|
+
ALLOWED_MESSAGES = %i[close hide dismiss].freeze
|
|
26
|
+
ALLOWED_SCOPES = %i[top all].freeze
|
|
27
|
+
# :hint is intentionally absent — hints dismiss client-side on
|
|
28
|
+
# mouseout and don't participate in the server-driven close path.
|
|
29
|
+
ALLOWED_TYPES = %i[modal drawer popover].freeze
|
|
30
|
+
ALLOWED_VISIT_ACTIONS = %i[advance replace].freeze
|
|
31
|
+
|
|
32
|
+
def overlay(message = :close, scope: :top, type: nil, id: nil,
|
|
33
|
+
visit: nil, visit_action: nil)
|
|
34
|
+
normalized_message = message.to_s.downcase.to_sym
|
|
35
|
+
unless ALLOWED_MESSAGES.include?(normalized_message)
|
|
36
|
+
raise ArgumentError,
|
|
37
|
+
"Unknown overlay message: #{message.inspect} (expected :close, :hide, or :dismiss)"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
normalized_scope = scope.to_s.downcase.to_sym
|
|
41
|
+
unless ALLOWED_SCOPES.include?(normalized_scope)
|
|
42
|
+
raise ArgumentError,
|
|
43
|
+
"Unknown overlay scope: #{scope.inspect} (expected :top or :all)"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
if type
|
|
47
|
+
normalized_type = type.to_s.downcase.to_sym
|
|
48
|
+
unless ALLOWED_TYPES.include?(normalized_type)
|
|
49
|
+
raise ArgumentError,
|
|
50
|
+
"Unknown overlay type: #{type.inspect} (expected :modal, :drawer, or :popover)"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
if visit_action
|
|
55
|
+
normalized_visit_action = visit_action.to_s.downcase.to_sym
|
|
56
|
+
unless ALLOWED_VISIT_ACTIONS.include?(normalized_visit_action)
|
|
57
|
+
raise ArgumentError,
|
|
58
|
+
"Unknown visit_action: #{visit_action.inspect} (expected :advance or :replace)"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
if visit_action && !visit
|
|
63
|
+
raise ArgumentError, "visit_action: requires a visit: URL"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
attrs = { message: "close" }
|
|
67
|
+
attrs[:scope] = normalized_scope.to_s
|
|
68
|
+
attrs[:type] = normalized_type.to_s if type
|
|
69
|
+
attrs[:"overlay-id"] = id.to_s if id
|
|
70
|
+
attrs[:visit] = visit.to_s if visit
|
|
71
|
+
attrs[:"visit-action"] = normalized_visit_action.to_s if visit_action
|
|
72
|
+
|
|
73
|
+
turbo_stream_action_tag("overlay", **attrs)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|