Skip to content

Commit 8b6d6d5

Browse files
authored
Merge pull request #27 from github/bubbbbbles
Update events and docs (breaking change)
2 parents a14629f + f431c09 commit 8b6d6d5

File tree

3 files changed

+26
-11
lines changed

3 files changed

+26
-11
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ Use `label[tabindex="0"][role=menuitemradio/menuitemcheckbox]` when dealing with
5959

6060
### Events
6161

62-
- `details-menu-select` - An item is to be select (cancelable).
63-
- `details-menu-selected` - An item is selected, label updated, menu closed.
62+
- `details-menu-select` (cancelable) - fired on `<details-menu>` with `event.detail.relatedTarget` being the item to be selected.
63+
- `details-menu-selected` - fired on `<details-menu>` with `event.detail.relatedTarget` being the item selected, after label is updated and menu is closed.
6464

6565
### Deferred loading
6666

index.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,14 +185,25 @@ function updateChecked(selected: Element, details: Element) {
185185

186186
function commit(selected: Element, details: Element) {
187187
if (selected.hasAttribute('disabled') || selected.getAttribute('aria-disabled') === 'true') return
188+
const menu = selected.closest('details-menu')
189+
if (!menu) return
188190

189-
const dispatched = selected.dispatchEvent(new CustomEvent('details-menu-select', {bubbles: true, cancelable: true}))
191+
const dispatched = menu.dispatchEvent(
192+
new CustomEvent('details-menu-select', {
193+
cancelable: true,
194+
detail: {relatedTarget: selected}
195+
})
196+
)
190197
if (!dispatched) return
191198

192199
updateLabel(selected, details)
193200
updateChecked(selected, details)
194201
if (selected.getAttribute('role') !== 'menuitemcheckbox') close(details)
195-
selected.dispatchEvent(new CustomEvent('details-menu-selected', {bubbles: true}))
202+
menu.dispatchEvent(
203+
new CustomEvent('details-menu-selected', {
204+
detail: {relatedTarget: selected}
205+
})
206+
)
196207
}
197208

198209
function keydown(event: KeyboardEvent) {

test/test.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -143,15 +143,18 @@ describe('details-menu element', function() {
143143
it('fires events in order', function(done) {
144144
const details = document.querySelector('details')
145145
const summary = details.querySelector('summary')
146+
const menu = details.querySelector('details-menu')
146147
const item = details.querySelector('button')
147148

148-
item.addEventListener('details-menu-select', () => {
149+
menu.addEventListener('details-menu-select', event => {
149150
assert(details.open, 'menu is still open')
151+
assert.equal(event.detail.relatedTarget, item)
150152
assert.equal(summary.textContent, 'Click')
151153
})
152154

153-
item.addEventListener('details-menu-selected', () => {
155+
menu.addEventListener('details-menu-selected', event => {
154156
assert(!details.open, 'menu is closed')
157+
assert.equal(event.detail.relatedTarget, item)
155158
assert.equal(summary.textContent, 'Hubot')
156159
done()
157160
})
@@ -164,10 +167,11 @@ describe('details-menu element', function() {
164167
it('fires cancellable select event', function(done) {
165168
const details = document.querySelector('details')
166169
const summary = details.querySelector('summary')
170+
const menu = details.querySelector('details-menu')
167171
const item = details.querySelector('button')
168172
let selectedEventCounter = 0
169173

170-
item.addEventListener('details-menu-select', event => {
174+
menu.addEventListener('details-menu-select', event => {
171175
event.preventDefault()
172176
assert(details.open, 'menu is still open')
173177
assert.equal(summary.textContent, 'Click')
@@ -177,7 +181,7 @@ describe('details-menu element', function() {
177181
}, 0)
178182
})
179183

180-
item.addEventListener('details-menu-selected', () => {
184+
menu.addEventListener('details-menu-selected', () => {
181185
selectedEventCounter++
182186
})
183187

@@ -199,7 +203,7 @@ describe('details-menu element', function() {
199203
assert.equal(notDisabled, document.activeElement, 'arrow focuses on the last non-disabled item')
200204

201205
const disabled = details.querySelector('[aria-disabled="true"]')
202-
disabled.addEventListener('details-menu-selected', () => eventCounter++)
206+
document.addEventListener('details-menu-selected', () => eventCounter++, true)
203207
disabled.dispatchEvent(new MouseEvent('click', {bubbles: true}))
204208

205209
assert.equal(eventCounter, 0, 'selected event is not fired')
@@ -216,7 +220,7 @@ describe('details-menu element', function() {
216220
details.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowUp'}))
217221

218222
const disabled = details.querySelector('[disabled]')
219-
disabled.addEventListener('details-menu-selected', () => eventCounter++)
223+
document.addEventListener('details-menu-selected', () => eventCounter++, true)
220224
disabled.dispatchEvent(new MouseEvent('click', {bubbles: true}))
221225

222226
assert.equal(eventCounter, 0, 'selected event is not fired')
@@ -309,7 +313,7 @@ describe('details-menu element', function() {
309313
const summary = document.querySelector('summary')
310314
const item = details.querySelector('label')
311315
let eventCounter = 0
312-
details.addEventListener('details-menu-selected', () => eventCounter++)
316+
document.addEventListener('details-menu-selected', () => eventCounter++, true)
313317

314318
summary.dispatchEvent(new MouseEvent('click', {bubbles: true}))
315319
assert(details.open, 'menu opens')

0 commit comments

Comments
 (0)