turbo_modal 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +38 -13
- data/app/helpers/modal_helper.rb +13 -7
- data/app/helpers/scrim_helper.rb +5 -1
- data/app/javascript/turbo_modal/index.js +3 -3
- data/app/javascript/turbo_modal/modal_controller.js +34 -7
- data/app/javascript/turbo_modal/scrim_controller.js +30 -3
- data/lib/tasks/turbo_modal_tasks.rake +1 -1
- data/lib/turbo_modal/version.rb +1 -1
- metadata +9 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e835c5dd7c4b03134438032640085f017fda7a93143c2db85c0eb5a5a4e5d518
|
4
|
+
data.tar.gz: a2272f1546ca9584244c062df4e62fbdca5e9e72316fb18aaceefda69500afbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98ef6f9ff6f44877811222effdc0858f076ef3ef42b4f28d88dd2d83639e0fa5bfb370b57b27e9db8080ece7e452e16dcb00b16c41458b96fc33671179f0895a
|
7
|
+
data.tar.gz: 45d2e51df5a761c24719fb9e1fd068820738d9a1a4f95540c1ef48fa4569bf6aa0b902a30e9f1623d17c1ac70c048fd7492c1f1ee36315fcd1b80cdee5d657e6
|
data/README.md
CHANGED
@@ -1,28 +1,53 @@
|
|
1
1
|
# TurboModal
|
2
|
-
|
2
|
+
Turbo Frame driven modal
|
3
3
|
|
4
4
|
## Usage
|
5
|
-
How to use my plugin.
|
6
5
|
|
7
|
-
|
8
|
-
|
6
|
+
Turbo modal provides helpers to add a basic scrim and modal target frame. These should be placed inside the body:
|
7
|
+
```html
|
8
|
+
<body>
|
9
|
+
<%= scrim_tag %>
|
10
|
+
<%= modal_tag %>
|
11
|
+
</body>
|
12
|
+
```
|
13
|
+
|
14
|
+
### Import turbo_modal styles
|
15
|
+
```css
|
16
|
+
/* application.scss */
|
9
17
|
|
10
|
-
|
11
|
-
gem 'turbo_modal'
|
18
|
+
@import "~@katalyst-interactive/turbo-modal";
|
12
19
|
```
|
13
20
|
|
14
|
-
|
15
|
-
|
16
|
-
|
21
|
+
To get a modal displaying you will need 2 things:
|
22
|
+
1. A `modal_link` (or programmatic trigger)
|
23
|
+
2. Some `modal_content`
|
24
|
+
|
25
|
+
`modal_link`'s are similar to a `link_to` in rails but it will point the path of the link to target the modal turbo frame.
|
26
|
+
The resulting path will need to wrap some content in a `modal_content` helper tag.
|
27
|
+
|
28
|
+
eg:
|
29
|
+
```html
|
30
|
+
<!-- app/views/homepage/index.html.erb -->
|
31
|
+
<%= modal_link "click to open modal", modal_path("example") %>
|
32
|
+
```
|
33
|
+
|
34
|
+
```html
|
35
|
+
<!-- app/views/modals/show.html.erb -->
|
36
|
+
<%= modal_content do %>
|
37
|
+
<div>
|
38
|
+
<h1>Modal title</h1>
|
39
|
+
</div>
|
40
|
+
<% end %>
|
17
41
|
```
|
18
42
|
|
19
|
-
|
43
|
+
## Installation
|
44
|
+
Run these commands:
|
20
45
|
```bash
|
21
|
-
$
|
46
|
+
$ bundle add 'turbo_modal'
|
47
|
+
$ rails turbo_modal:install
|
22
48
|
```
|
23
49
|
|
24
|
-
|
25
|
-
Contribution directions go here.
|
50
|
+
`rails turbo_modal:install` will add the `turbo_modal` npm packages required. It also sets up stimulus and turbo packages.
|
26
51
|
|
27
52
|
## License
|
28
53
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/app/helpers/modal_helper.rb
CHANGED
@@ -2,17 +2,20 @@
|
|
2
2
|
|
3
3
|
module ModalHelper
|
4
4
|
MODAL_ID = "modal"
|
5
|
-
|
5
|
+
LINK_OPTIONS = { data: { turbo_frame: MODAL_ID, action: "modal#onLinkClick", modal_type: "" } }.freeze
|
6
6
|
|
7
7
|
def modal_tag(modal_id = MODAL_ID)
|
8
|
-
turbo_frame_tag modal_id, data: { modal_target: "turboFrame" }
|
8
|
+
turbo_frame_tag modal_id, data: { controller: "modal", modal_target: "turboFrame", action: <<~ACTIONS }
|
9
|
+
modal:open@window->modal#open
|
10
|
+
modal:close@window->modal#close
|
11
|
+
ACTIONS
|
9
12
|
end
|
10
13
|
|
11
14
|
def modal_link_to(name = nil, options = nil, html_options = nil, &block)
|
12
15
|
if block
|
13
|
-
link_to name,
|
16
|
+
link_to name, LINK_OPTIONS.deep_merge(options || {}), html_options, &block
|
14
17
|
else
|
15
|
-
link_to name, options,
|
18
|
+
link_to name, options, LINK_OPTIONS.deep_merge(html_options || {}), &block
|
16
19
|
end
|
17
20
|
end
|
18
21
|
|
@@ -27,10 +30,13 @@ module ModalHelper
|
|
27
30
|
|
28
31
|
def modal_content(options = {}, &block)
|
29
32
|
modal_id = options.fetch(:modal_id, MODAL_ID)
|
30
|
-
turbo_frame_tag modal_id,
|
33
|
+
turbo_frame_tag modal_id, data: { hidden: "" } do
|
31
34
|
tag.div(class: "modal animate-in #{options.delete(:modal_classes)}",
|
32
|
-
data:
|
33
|
-
action:
|
35
|
+
data: {
|
36
|
+
action: <<~ACTIONS
|
37
|
+
keyup@window->modal#keyup
|
38
|
+
scrim:hide@window->modal#close
|
39
|
+
ACTIONS
|
34
40
|
}) do
|
35
41
|
yield if block
|
36
42
|
end
|
data/app/helpers/scrim_helper.rb
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
module ScrimHelper
|
4
4
|
def scrim_tag
|
5
|
-
tag.div(class: "scrim", data: {
|
5
|
+
tag.div(class: "scrim", data: { controller: "scrim", scrim_target: "scrim", action: <<~ACTIONS, hidden: true })
|
6
|
+
click->scrim#onClick
|
7
|
+
scrim:hide@window->scrim#hide
|
8
|
+
scrim:show@window->scrim#show
|
9
|
+
ACTIONS
|
6
10
|
end
|
7
11
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import ModalController from "./modal_controller";
|
2
|
-
import ScrimController from "./scrim_controller";
|
1
|
+
import ModalController, { openModal, closeModal } from "./modal_controller";
|
2
|
+
import ScrimController, { showScrim, hideScrim } from "./scrim_controller";
|
3
3
|
|
4
|
-
export { ModalController, ScrimController }
|
4
|
+
export { ModalController, openModal, closeModal, ScrimController, showScrim, hideScrim };
|
@@ -1,6 +1,10 @@
|
|
1
1
|
import { Controller } from "stimulus";
|
2
|
+
import { hideScrim, showScrim } from "./scrim_controller";
|
2
3
|
|
3
|
-
|
4
|
+
/**
|
5
|
+
* Shows a Turbo modal when triggered by a `modal_link` click or a call to `openModal`.
|
6
|
+
*/
|
7
|
+
class ModalController extends Controller {
|
4
8
|
static targets = ["turboFrame"];
|
5
9
|
|
6
10
|
static values = {
|
@@ -12,7 +16,13 @@ export default class ModalController extends Controller {
|
|
12
16
|
this.turboFrameTarget.classList.add(value);
|
13
17
|
}
|
14
18
|
|
15
|
-
|
19
|
+
open(e) {
|
20
|
+
this.turboFrameTarget.src = e.detail.url;
|
21
|
+
this.typeValue = e.detail.type;
|
22
|
+
showScrim();
|
23
|
+
}
|
24
|
+
|
25
|
+
close(e) {
|
16
26
|
if (this.turboFrameTarget.src === null) return;
|
17
27
|
|
18
28
|
const modal_element = this.turboFrameTarget.querySelector(".modal")
|
@@ -26,17 +36,34 @@ export default class ModalController extends Controller {
|
|
26
36
|
this.turboFrameTarget.classList.remove(this.typeValue);
|
27
37
|
this.typeValue = "";
|
28
38
|
}
|
29
|
-
|
39
|
+
hideScrim();
|
30
40
|
}, 250);
|
31
41
|
}
|
32
42
|
|
33
43
|
keyup(event) {
|
34
|
-
if (event.key ===
|
44
|
+
if (event.key === "Escape") {
|
45
|
+
closeModal();
|
46
|
+
}
|
35
47
|
}
|
36
48
|
|
37
|
-
|
49
|
+
onLinkClick(e) {
|
38
50
|
const modal_link = e.target.closest("a[data-modal-type]")
|
39
|
-
|
40
|
-
window.dispatchEvent(new Event("show-scrim", { bubbles: true }))
|
51
|
+
openModal(modal_link.href, modal_link.dataset.modalType);
|
41
52
|
}
|
42
53
|
}
|
54
|
+
|
55
|
+
/**
|
56
|
+
* Show a modal, requires a url for a page that renders a turbo-frame with id `modal`.
|
57
|
+
*/
|
58
|
+
function openModal(url, type = "") {
|
59
|
+
window.dispatchEvent(new CustomEvent("modal:open", { detail: { url: url, type: type }}));
|
60
|
+
}
|
61
|
+
|
62
|
+
/**
|
63
|
+
* Hide the current modal (if any).
|
64
|
+
*/
|
65
|
+
function closeModal() {
|
66
|
+
window.dispatchEvent(new Event("modal:close"));
|
67
|
+
}
|
68
|
+
|
69
|
+
export { ModalController as default, openModal, closeModal }
|
@@ -1,5 +1,15 @@
|
|
1
1
|
import { Controller } from "stimulus"
|
2
2
|
|
3
|
+
/**
|
4
|
+
* Scrim controller wraps an element that creates a whole page layer.
|
5
|
+
* It is intended to be used behind a modal or nav drawer.
|
6
|
+
*
|
7
|
+
* If the Scrim element receives a click event, it automatically triggers "scrim:hide".
|
8
|
+
*
|
9
|
+
* You can show and hide the scrim programmatically by sending "scrim:show" and "scrim:hide" events to the window or by
|
10
|
+
* calling the provided methods. If you need to respond to the scrim showing or hiding you should subscribe to these
|
11
|
+
* events.
|
12
|
+
*/
|
3
13
|
class ScrimController extends Controller {
|
4
14
|
static targets = ["scrim"];
|
5
15
|
|
@@ -8,9 +18,26 @@ class ScrimController extends Controller {
|
|
8
18
|
}
|
9
19
|
|
10
20
|
hide(event) {
|
11
|
-
this.scrimTarget.dataset.hidden = "
|
12
|
-
window.dispatchEvent(new Event("scrim-hide", { bubbles: true }))
|
21
|
+
this.scrimTarget.dataset.hidden = "";
|
13
22
|
}
|
23
|
+
|
24
|
+
onClick(event) {
|
25
|
+
window.dispatchEvent(new Event("scrim:hide"));
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Show the scrim element
|
31
|
+
*/
|
32
|
+
function showScrim() {
|
33
|
+
window.dispatchEvent(new Event("scrim:show"));
|
34
|
+
}
|
35
|
+
|
36
|
+
/**
|
37
|
+
* Hide the scrim element programmatically.
|
38
|
+
*/
|
39
|
+
function hideScrim() {
|
40
|
+
window.dispatchEvent(new Event("scrim:hide"));
|
14
41
|
}
|
15
42
|
|
16
|
-
export default
|
43
|
+
export { ScrimController as default, showScrim, hideScrim }
|
data/lib/turbo_modal/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: turbo_modal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alan Cornthwaite
|
@@ -9,42 +9,36 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2022-03-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "~>"
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: 6.1.3
|
21
18
|
- - ">="
|
22
19
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
20
|
+
version: '0'
|
24
21
|
type: :runtime
|
25
22
|
prerelease: false
|
26
23
|
version_requirements: !ruby/object:Gem::Requirement
|
27
24
|
requirements:
|
28
|
-
- - "~>"
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: 6.1.3
|
31
25
|
- - ">="
|
32
26
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
27
|
+
version: '0'
|
34
28
|
- !ruby/object:Gem::Dependency
|
35
29
|
name: turbo-rails
|
36
30
|
requirement: !ruby/object:Gem::Requirement
|
37
31
|
requirements:
|
38
|
-
- - "
|
32
|
+
- - ">="
|
39
33
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
34
|
+
version: '0'
|
41
35
|
type: :runtime
|
42
36
|
prerelease: false
|
43
37
|
version_requirements: !ruby/object:Gem::Requirement
|
44
38
|
requirements:
|
45
|
-
- - "
|
39
|
+
- - ">="
|
46
40
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
41
|
+
version: '0'
|
48
42
|
description: ''
|
49
43
|
email:
|
50
44
|
- alan.cornthwaite@katalyst.com.au
|
@@ -96,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
90
|
- !ruby/object:Gem::Version
|
97
91
|
version: '0'
|
98
92
|
requirements: []
|
99
|
-
rubygems_version: 3.
|
93
|
+
rubygems_version: 3.2.32
|
100
94
|
signing_key:
|
101
95
|
specification_version: 4
|
102
96
|
summary: Modal library that uses Turbo and Stimulus because we are in the future now.
|