diff --git a/src/task-lists-element.ts b/src/task-lists-element.ts index e87ede5..a1749bd 100644 --- a/src/task-lists-element.ts +++ b/src/task-lists-element.ts @@ -3,23 +3,24 @@ import {SortEndArgs, isDragging, sortable} from './sortable' const observers = new WeakMap() export default class TaskListsElement extends HTMLElement { - connectedCallback(): void { - this.addEventListener('change', (event: Event) => { - const checkbox = event.target - if (!(checkbox instanceof HTMLInputElement)) return - if (!checkbox.classList.contains('task-list-item-checkbox')) return - - this.dispatchEvent( - new CustomEvent('task-lists-check', { - bubbles: true, - detail: { - position: position(checkbox), - checked: checkbox.checked - } - }) - ) - }) + handleEvent(event: Event): void { + const checkbox = event.target + if (!(checkbox instanceof HTMLInputElement)) return + if (!checkbox.classList.contains('task-list-item-checkbox')) return + + this.dispatchEvent( + new CustomEvent('task-lists-check', { + bubbles: true, + detail: { + position: position(checkbox), + checked: checkbox.checked + } + }) + ) + } + connectedCallback(): void { + this.addEventListener('change', this) const observer = new MutationObserver(syncState.bind(null, this)) observers.set(this, observer) diff --git a/test/test.js b/test/test.js index 6b42a92..6891b0b 100644 --- a/test/test.js +++ b/test/test.js @@ -83,6 +83,29 @@ describe('task-lists element', function () { document.body.innerHTML = '' }) + it('emits one check event per change after reconnecting', function () { + const list = document.querySelector('task-lists') + const parent = list.parentElement + list.remove() + parent.append(list) + list.remove() + parent.append(list) + const events = [] + list.addEventListener('task-lists-check', event => events.push(event.detail)) + const checkbox = list.querySelector('.task-list-item-checkbox') + + checkbox.checked = true + checkbox.dispatchEvent(new Event('change', {bubbles: true})) + assert.deepEqual(events, [{position: [0, 0], checked: true}]) + + checkbox.checked = false + checkbox.dispatchEvent(new Event('change', {bubbles: true})) + assert.deepEqual(events, [ + {position: [0, 0], checked: true}, + {position: [0, 0], checked: false} + ]) + }) + it('emits check event with position', function () { let called = false