Skip to content

Commit 505e58e

Browse files
authored
Merge pull request #18 from github/shiftkey
Ensure shift+click behavior works on label
2 parents c85ee72 + eee646d commit 505e58e

File tree

3 files changed

+25
-7
lines changed

3 files changed

+25
-7
lines changed

examples/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<title>check-all demo</title>
66
</head>
77
<body>
8-
<div data-check-all-container>
8+
<div data-check-all-container style="user-select: none; -webkit-user-select: none;">
99
Count: <span data-check-all-count>0</span>
1010
<label><input type="checkbox" data-check-all> Check All</label>
1111
<label><input type="checkbox" data-check-all-item> github/fetch</label>

src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ export default function subscribe(container: HTMLElement): Subscription {
5858

5959
function onMouseDown(event: MouseEvent): void {
6060
if (!(event.target instanceof Element)) return
61-
if (event.target.hasAttribute('data-check-all-item')) {
61+
const target = event.target instanceof HTMLLabelElement ? event.target.control || event.target : event.target
62+
if (target.hasAttribute('data-check-all-item')) {
6263
shiftKey = event.shiftKey
6364
}
6465
}

test/test.js

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,25 @@ describe('check-all', function () {
4141
})
4242

4343
it('checks range', function () {
44+
const checkAll = document.querySelector('[data-check-all]')
45+
const count = document.querySelector('[data-check-all-count]')
46+
const checkboxes = document.querySelectorAll('[data-check-all-item]')
47+
checkboxes[1].dispatchEvent(new MouseEvent('click'))
48+
assert.equal(count.textContent, '1')
49+
assert.equal(document.querySelectorAll('[data-check-all-item]:checked').length, 1)
50+
assert(checkAll.indeterminate)
51+
52+
checkboxes[3].dispatchEvent(new MouseEvent('mousedown', {shiftKey: true, bubbles: true}))
53+
checkboxes[3].dispatchEvent(new MouseEvent('click', {shiftKey: true, bubbles: true}))
54+
assert.equal(count.textContent, '3')
55+
assert.notOk(checkboxes[0].checked)
56+
assert(checkboxes[1].checked)
57+
assert(checkboxes[2].checked)
58+
assert(checkboxes[3].checked)
59+
assert(checkAll.indeterminate)
60+
})
61+
62+
it('checks range with label click', function () {
4463
const checkAll = document.querySelector('[data-check-all]')
4564
const count = document.querySelector('[data-check-all-count]')
4665
const checkboxes = document.querySelectorAll('[data-check-all-item]')
@@ -49,11 +68,9 @@ describe('check-all', function () {
4968
assert.equal(document.querySelectorAll('[data-check-all-item]:checked').length, 1)
5069
assert(checkAll.indeterminate)
5170

52-
const event = document.createEvent('Events')
53-
event.initEvent('mousedown', true, true)
54-
event.shiftKey = true
55-
checkboxes[3].dispatchEvent(event)
56-
checkboxes[3].click()
71+
const label = checkboxes[3].closest('label')
72+
label.dispatchEvent(new MouseEvent('mousedown', {shiftKey: true, bubbles: true}))
73+
label.dispatchEvent(new MouseEvent('click', {shiftKey: true, bubbles: true}))
5774
assert.equal(count.textContent, '3')
5875
assert.notOk(checkboxes[0].checked)
5976
assert(checkboxes[1].checked)

0 commit comments

Comments
 (0)