Skip to content

Commit f4644c0

Browse files
authored
Merge pull request #52 from github/close-popup-on-checked-clicked
Close popup when checked item is clicked.
2 parents cdcc019 + 855225b commit f4644c0

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

src/index.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,16 @@ function shouldCommit(details: Element, event: Event) {
170170

171171
if (event.type === 'click') {
172172
const menuitem = target.closest('[role="menuitem"], [role="menuitemradio"]')
173-
const onlyCommitOnChangeEvent = menuitem && menuitem.tagName === 'LABEL' && menuitem.querySelector('input')
174-
if (menuitem && !onlyCommitOnChangeEvent) {
173+
if (!menuitem) return
174+
175+
// Ignore double event caused by inputs nested in labels
176+
if (menuitem.tagName === 'LABEL' && target !== menuitem) return
177+
178+
const input = menuitem.querySelector('input')
179+
// An input inside a label will be committed as a change event (we assume it's a radio input),
180+
// unless the input is already checked, so we need to commit on click (to close the popup)
181+
const onlyCommitOnChangeEvent = menuitem.tagName === 'LABEL' && input && !input.checked
182+
if (!onlyCommitOnChangeEvent) {
175183
commit(menuitem, details)
176184
}
177185
} else if (event.type === 'change') {

test/test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@ describe('details-menu element', function () {
279279
assert.equal(item.getAttribute('aria-checked'), 'true')
280280
assert.equal(details.querySelectorAll('[aria-checked="true"]').length, 1)
281281
assert.equal(eventCounter, 1, 'selected event is fired once')
282+
283+
item.dispatchEvent(new MouseEvent('click', {bubbles: true}))
284+
assert.equal(item.getAttribute('aria-checked'), 'true')
285+
assert.equal(details.querySelectorAll('[aria-checked="true"]').length, 1)
286+
assert.equal(eventCounter, 2, 'selected event is fired again')
282287
})
283288
})
284289

@@ -313,6 +318,11 @@ describe('details-menu element', function () {
313318
assert.equal(item.getAttribute('aria-checked'), 'true')
314319
assert.equal(details.querySelectorAll('[aria-checked="true"]').length, 1)
315320
assert.equal(eventCounter, 1, 'selected event is fired once')
321+
322+
item.dispatchEvent(new MouseEvent('click', {bubbles: true}))
323+
assert.equal(item.getAttribute('aria-checked'), 'true')
324+
assert.equal(details.querySelectorAll('[aria-checked="true"]').length, 1)
325+
assert.equal(eventCounter, 2, 'selected event is fired again')
316326
})
317327
})
318328

0 commit comments

Comments
 (0)