diff --git a/assets/js/phoenix_live_view/view.js b/assets/js/phoenix_live_view/view.js index 56a8d99aec..9fb8a087dd 100644 --- a/assets/js/phoenix_live_view/view.js +++ b/assets/js/phoenix_live_view/view.js @@ -14,6 +14,7 @@ import { PHX_CLIENT_ERROR_CLASS, PHX_SERVER_ERROR_CLASS, PHX_FEEDBACK_FOR, + PHX_FEEDBACK_GROUP, PHX_HAS_FOCUSED, PHX_HAS_SUBMITTED, PHX_HOOK, @@ -104,7 +105,8 @@ let serializeForm = (form, metadata, onlyNames = []) => { for(let [key, val] of formData.entries()){ if(onlyNames.length === 0 || onlyNames.indexOf(key) >= 0){ let input = elements.find(input => input.name === key) - if(!(DOM.private(input, PHX_HAS_FOCUSED) || DOM.private(input, PHX_HAS_SUBMITTED))){ + let isUnused = !(DOM.private(input, PHX_HAS_FOCUSED) || DOM.private(input, PHX_HAS_SUBMITTED)) + if(isUnused && !(submitter && submitter.name == key)){ params.append(prependFormDataKey(key, "_unused_"), "") } params.append(key, val) diff --git a/assets/test/view_test.js b/assets/test/view_test.js index b502007f12..d44c7d9f5b 100644 --- a/assets/test/view_test.js +++ b/assets/test/view_test.js @@ -1049,7 +1049,6 @@ describe("View + Component", function(){ expect(el.querySelector(`[phx-feedback-for="${last_name.name}"`).classList.contains("phx-no-feedback")).toBeTruthy() view.channel.nextValidate({"user[first_name]": null, "user[last_name]": null, "_target": "user[last_name]"}) - DOM.putPrivate(last_name, "phx-has-focused", true) view.pushInput(last_name, el, null, "validate", {_target: last_name.name}) window.requestAnimationFrame(() => { expect(el.querySelector(`[phx-feedback-for="${first_name.name}"`).classList.contains("phx-no-feedback")).toBeFalsy() @@ -1133,7 +1132,6 @@ describe("View + Component", function(){ expect(el.querySelector("[phx-feedback-for=\"mygroup\"]").classList.contains("phx-no-feedback")).toBeTruthy() view.channel.nextValidate({"user[first_name]": null, "user[last_name]": null, "user[email]": null, "_target": "user[first_name]"}) - DOM.putPrivate(first_name, "phx-has-focused", true) view.pushInput(first_name, el, null, "validate", {_target: first_name.name}) window.requestAnimationFrame(() => { expect(el.querySelector(`[phx-feedback-for="${first_name.name}"`).classList.contains("phx-no-feedback")).toBeFalsy() @@ -1412,4 +1410,4 @@ describe("DOM", function(){ expect(target.checked).toEqual(true) expect(target.id).toEqual("bar") }) -}) \ No newline at end of file +})