From ad8d618a4e559acf4748d3d628b65f87018e1821 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Sat, 16 Mar 2024 22:07:21 +0100 Subject: [PATCH] tweaks, test --- .../client/dom/elements/bindings/input.js | 22 ++++++++----- .../client/dom/elements/bindings/shared.js | 18 +++++++++-- .../samples/bindings-form-reset/_config.js | 19 ++++++++++++ .../samples/bindings-form-reset/main.svelte | 31 +++++++++++++++++++ 4 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 packages/svelte/tests/runtime-runes/samples/bindings-form-reset/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/bindings-form-reset/main.svelte diff --git a/packages/svelte/src/internal/client/dom/elements/bindings/input.js b/packages/svelte/src/internal/client/dom/elements/bindings/input.js index cd52230c0e..f16124b363 100644 --- a/packages/svelte/src/internal/client/dom/elements/bindings/input.js +++ b/packages/svelte/src/internal/client/dom/elements/bindings/input.js @@ -73,16 +73,22 @@ export function bind_group(inputs, group_index, input, get_value, update) { binding_group.push(input); - listen_to_event_and_reset_event(input, 'change', () => { - // @ts-ignore - var value = input.__value; + listen_to_event_and_reset_event( + input, + 'change', + () => { + // @ts-ignore + var value = input.__value; - if (is_checkbox) { - value = get_binding_group_value(binding_group, value, input.checked); - } + if (is_checkbox) { + value = get_binding_group_value(binding_group, value, input.checked); + } - update(value); - }); + update(value); + }, + // TODO better default value handling + () => update(is_checkbox ? [] : null) + ); render_effect(() => { var value = get_value(); diff --git a/packages/svelte/src/internal/client/dom/elements/bindings/shared.js b/packages/svelte/src/internal/client/dom/elements/bindings/shared.js index 4b0c351669..c77fd77e95 100644 --- a/packages/svelte/src/internal/client/dom/elements/bindings/shared.js +++ b/packages/svelte/src/internal/client/dom/elements/bindings/shared.js @@ -34,11 +34,23 @@ let listening_to_form_reset = false; * @param {HTMLElement} element * @param {string} event * @param {() => void} handler + * @param {() => void} [on_reset] */ -export function listen_to_event_and_reset_event(element, event, handler) { +export function listen_to_event_and_reset_event(element, event, handler, on_reset = handler) { element.addEventListener(event, handler); // @ts-expect-error - element.__on_reset = handler; + const prev = element.__on_r; + if (prev) { + // special case for checkbox that can have multiple binds (group & checked) + // @ts-expect-error + element.__on_r = () => { + prev(); + on_reset(); + }; + } else { + // @ts-expect-error + element.__on_r = on_reset; + } if (!listening_to_form_reset) { listening_to_form_reset = true; @@ -47,7 +59,7 @@ export function listen_to_event_and_reset_event(element, event, handler) { if (!evt.defaultPrevented) { for (const e of /**@type {HTMLFormElement} */ (evt.target).elements) { // @ts-expect-error - e.__on_reset?.(); + e.__on_r?.(); } } }); diff --git a/packages/svelte/tests/runtime-runes/samples/bindings-form-reset/_config.js b/packages/svelte/tests/runtime-runes/samples/bindings-form-reset/_config.js new file mode 100644 index 0000000000..88c8d95d19 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/bindings-form-reset/_config.js @@ -0,0 +1,19 @@ +import { test } from '../../test'; + +export default test({ + async test({ assert, target }) { + const p = target.querySelector('p'); + + assert.htmlEqual( + p?.innerHTML || '', + `{"text":"text","checkbox":true,"radio_group":"a","checkbox_group":["a"],"select":"b","textarea":"textarea"}` + ); + + await target.querySelector('button')?.click(); + await new Promise((r) => requestAnimationFrame(r)); + assert.htmlEqual( + p?.innerHTML || '', + `{"text":"","checkbox":false,"radio_group":null,"checkbox_group":[],"select":"a","textarea":""}` + ); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/bindings-form-reset/main.svelte b/packages/svelte/tests/runtime-runes/samples/bindings-form-reset/main.svelte new file mode 100644 index 0000000000..ff13af85c8 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/bindings-form-reset/main.svelte @@ -0,0 +1,31 @@ + + +

{JSON.stringify({ text, checkbox, radio_group, checkbox_group, select, textarea })}

+ +
+ + + + + + + + + + + + + + + +