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.
Files changed (3) hide show
  1. package/README.md +5 -1
  2. package/index.js +35 -35
  3. 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
- const handler = (event) => {
105
- if (filter && event.key !== (KEY_MAP[filter] || filter)) return
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
- const handler = (event) => {
114
- if (filter && event.key !== (KEY_MAP[filter] || filter)) return
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
- const handler = (event) => {
112
+ listenTarget = controller.element
113
+ guard = (event) => {
125
114
  const matched = event.target.closest(selector)
126
- if (!matched || !controller.element.contains(matched)) return
127
- if (filter && event.key !== (KEY_MAP[filter] || filter)) return
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
- connect() {
150
- super.connect()
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stimulus-use-actions",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
4
4
  "description": "Stimulus mixin for declaring actions in the controller",
5
5
  "type": "module",
6
6
  "main": "index.js",