stimulus-use-actions 0.3.3 → 0.3.4
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.
- package/README.md +5 -1
- package/index.js +35 -35
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,11 +20,13 @@ export default class extends Controller {
|
|
|
20
20
|
static actions = {
|
|
21
21
|
field: "input->update",
|
|
22
22
|
checkbox: "change->rerender",
|
|
23
|
+
element: "submit->save",
|
|
23
24
|
window: "resize->layout",
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
update(event) { /* ... */ }
|
|
27
28
|
rerender(event) { /* ... */ }
|
|
29
|
+
save(event) { /* ... */ }
|
|
28
30
|
layout(event) { /* ... */ }
|
|
29
31
|
}
|
|
30
32
|
```
|
|
@@ -45,6 +47,7 @@ Each key in `static actions` is a **target name** matching an entry in
|
|
|
45
47
|
| Key | Listens on | Matches events from |
|
|
46
48
|
| --------- | ------------------- | -------------------------------------------- |
|
|
47
49
|
| `field` | controller element | descendants with `data-<id>-target="field"` |
|
|
50
|
+
| `element` | controller element | the controller element itself |
|
|
48
51
|
| `window` | `window` | the window itself |
|
|
49
52
|
|
|
50
53
|
### Values
|
|
@@ -74,6 +77,7 @@ export default class extends Controller {
|
|
|
74
77
|
connect() {
|
|
75
78
|
useActions(this, {
|
|
76
79
|
buttonTargets: ["click->submit", "keyup->preview"],
|
|
80
|
+
element: "submit->save",
|
|
77
81
|
window: "resize->reflow",
|
|
78
82
|
})
|
|
79
83
|
}
|
|
@@ -92,7 +96,7 @@ observer.
|
|
|
92
96
|
|
|
93
97
|
- **controller** -- your Stimulus controller instance (`this`)
|
|
94
98
|
- **actions** -- map of target keys to action descriptors
|
|
95
|
-
- Keys: `<name>Target`, `<name>Targets`, or `window`
|
|
99
|
+
- Keys: `<name>Target`, `<name>Targets`, `element`, or `window`
|
|
96
100
|
- Values: a string or array of `"event->method"` strings
|
|
97
101
|
- Event inference (e.g. `"submit"` without `click->`) is supported here --
|
|
98
102
|
Stimulus infers the default event for the element
|
package/index.js
CHANGED
|
@@ -100,39 +100,33 @@ function bindDelegatedActions(controller) {
|
|
|
100
100
|
if (!parsed) return
|
|
101
101
|
const { eventName, filter, methodName, options } = parsed
|
|
102
102
|
|
|
103
|
+
let listenTarget, guard
|
|
103
104
|
if (isWindow) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
if (options.includes("stop")) event.stopPropagation()
|
|
107
|
-
if (options.includes("prevent")) event.preventDefault()
|
|
108
|
-
controller[methodName](event)
|
|
109
|
-
}
|
|
110
|
-
window.addEventListener(eventName, handler)
|
|
111
|
-
listeners.push({ target: window, eventName, handler })
|
|
105
|
+
listenTarget = window
|
|
106
|
+
guard = () => true
|
|
112
107
|
} else if (isElement) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (options.includes("self") && event.target !== controller.element) return
|
|
116
|
-
if (options.includes("stop")) event.stopPropagation()
|
|
117
|
-
if (options.includes("prevent")) event.preventDefault()
|
|
118
|
-
controller[methodName](event)
|
|
119
|
-
}
|
|
120
|
-
controller.element.addEventListener(eventName, handler)
|
|
121
|
-
listeners.push({ target: controller.element, eventName, handler })
|
|
108
|
+
listenTarget = controller.element
|
|
109
|
+
guard = (event) => !options.includes("self") || event.target === controller.element
|
|
122
110
|
} else {
|
|
123
111
|
const selector = `[data-${identifier}-target~="${targetName}"]`
|
|
124
|
-
|
|
112
|
+
listenTarget = controller.element
|
|
113
|
+
guard = (event) => {
|
|
125
114
|
const matched = event.target.closest(selector)
|
|
126
|
-
if (!matched || !controller.element.contains(matched)) return
|
|
127
|
-
|
|
128
|
-
if (options.includes("self") && event.target !== matched) return
|
|
129
|
-
if (options.includes("stop")) event.stopPropagation()
|
|
130
|
-
if (options.includes("prevent")) event.preventDefault()
|
|
131
|
-
controller[methodName](event)
|
|
115
|
+
if (!matched || !controller.element.contains(matched)) return false
|
|
116
|
+
return !options.includes("self") || event.target === matched
|
|
132
117
|
}
|
|
133
|
-
controller.element.addEventListener(eventName, handler)
|
|
134
|
-
listeners.push({ target: controller.element, eventName, handler })
|
|
135
118
|
}
|
|
119
|
+
|
|
120
|
+
const handler = (event) => {
|
|
121
|
+
if (!guard(event)) return
|
|
122
|
+
if (filter && event.key !== (KEY_MAP[filter] || filter)) return
|
|
123
|
+
if (options.includes("stop")) event.stopPropagation()
|
|
124
|
+
if (options.includes("prevent")) event.preventDefault()
|
|
125
|
+
controller[methodName](event)
|
|
126
|
+
}
|
|
127
|
+
const capture = !isWindow && !isElement
|
|
128
|
+
listenTarget.addEventListener(eventName, handler, capture)
|
|
129
|
+
listeners.push({ target: listenTarget, eventName, handler, capture })
|
|
136
130
|
})
|
|
137
131
|
})
|
|
138
132
|
|
|
@@ -140,19 +134,25 @@ function bindDelegatedActions(controller) {
|
|
|
140
134
|
}
|
|
141
135
|
|
|
142
136
|
function unbindDelegatedActions(listeners) {
|
|
143
|
-
listeners.forEach(({ target, eventName, handler }) => {
|
|
144
|
-
target.removeEventListener(eventName, handler)
|
|
137
|
+
listeners.forEach(({ target, eventName, handler, capture }) => {
|
|
138
|
+
target.removeEventListener(eventName, handler, capture)
|
|
145
139
|
})
|
|
146
140
|
}
|
|
147
141
|
|
|
148
142
|
export class Controller extends StimulusController {
|
|
149
|
-
|
|
150
|
-
super.
|
|
151
|
-
this._useActionListeners = bindDelegatedActions(this)
|
|
152
|
-
}
|
|
153
|
-
disconnect() {
|
|
154
|
-
super.disconnect()
|
|
155
|
-
unbindDelegatedActions(this._useActionListeners)
|
|
143
|
+
initialize() {
|
|
144
|
+
super.initialize()
|
|
156
145
|
this._useActionListeners = []
|
|
146
|
+
const userConnect = this.connect
|
|
147
|
+
const userDisconnect = this.disconnect
|
|
148
|
+
this.connect = () => {
|
|
149
|
+
userConnect.call(this)
|
|
150
|
+
this._useActionListeners = bindDelegatedActions(this)
|
|
151
|
+
}
|
|
152
|
+
this.disconnect = () => {
|
|
153
|
+
unbindDelegatedActions(this._useActionListeners)
|
|
154
|
+
this._useActionListeners = []
|
|
155
|
+
userDisconnect.call(this)
|
|
156
|
+
}
|
|
157
157
|
}
|
|
158
158
|
}
|