-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Properly resolve referenced forms. #3094
Properly resolve referenced forms. #3094
Conversation
@@ -3523,7 +3523,7 @@ var htmx = (function() { | |||
|
|||
// for a non-GET include the closest form | |||
if (verb !== 'get') { | |||
processInputValue(processed, priorityFormData, errors, closest(elt, 'form'), validate) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
would you mind extracting this to a local variable to avoid the complicated expression in the parameter position, w/ maybe a comment explaining the situation?
thank you, PR looks great love the tests!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I addressed your request, but also there's been some discussion about a better way forward on #issues-and-pull-requests that I'm happy to implement (I am ironbeard on discord).
One thing that might need clarifying is the original intent of the sentence in the docs that this PR changes. Specifically, what kind of elements inside a form should also be sending form values on non-GET?
<select hx-post=/foo>
?<input type=text hx-post=/foo>
?<input type=submit hx-post=/foo>
?<div hx-post=/foo>
?
Furthermore, personally I'm wondering why this is being limited to non-GET? Wouldn't we want to submit the entire form for e.g.
<form method=get action=/foo>
<input name=bar value=baz>
<button hx-get=/foo>Submit</button>
</form>
I'm actually not 100% on whether HTMX currently submits bar=baz
in this situation or not (I haven't been able to find an associated test and I'm on mobile now), but the docs and the code appear to indicate that it won't. I will make sure to cover any of those situations with tests once I understand the specifics of that line in the docs.
In case it's helpful, here's the original PR of that line in the docs: a3c9cf6#diff-c7d06af83d22e155470d44a366cc1ba76cd5dc9da3405fc9e54a237174736b6aR962
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
htmx has not submitted values for GET
s that occur within a form so that link-like things do not include them when navigating. This behavior may not be ideal but we can't change it without breaking backwards compatibility. (In general at this point backwards compatibility is becoming more important than correctness in htmx.)
I think the situation where the user has explicitly called out a form via the form attribute is obvious enough to fix so I'm in favor of this change so long as it minimizes any additional changes, in particular with an eye towards backwards compatibility.
I refactored a bit based on some much appreciated input from @dz4k and @MichaelWest22 , would appreciate their eyes on this result if possible. |
@MichaelWest22 suggested on discord that we use |
There's some ongoing discussion here: https://discord.com/channels/725789699527933952/1324452338429067316 |
This PR will slightly change existing behavior. Previously, something like |
I suspect that reset doesn't get used much and this a bugfix as much as anything. |
* Properly resolve referenced forms. * Clarify variable. * Cast elt to avoid TS exceptions. * Refactor for JSDoc. * Clarify shouldCancel. * Remove complicated JSDoc in favor of ts-ignore. * More coverage for button scenarios. * Use properties instead of matching. * Mention reset button change.
* Enforce no-op on submit buttons with formmethod=dialog. * Properly resolve referenced forms. (#3094) * Properly resolve referenced forms. * Clarify variable. * Cast elt to avoid TS exceptions. * Refactor for JSDoc. * Clarify shouldCancel. * Remove complicated JSDoc in favor of ts-ignore. * More coverage for button scenarios. * Use properties instead of matching. * Mention reset button change. * Mention formmethod=dialog change.
Description
I would like to start off by thanking @scrhartley for their help with this PR.
When a non-GET htmx request is triggered on an element inside a form, htmx includes the other values in the form. However, it is currently including incorrect values when e.g. a
<button form="referenced">
is inside a different form. This PR addresses that bug. Details are explained in the documentation change and the added test.Corresponding issue: None
Testing
Using standard HTML behavior as a reference, consider the following:
clicking
#submit
will result in a request whose body containst1=textValue&b1=inputValue&b1=buttonValue
, which agrees with the new tests.Checklist
master
for website changes,dev
forsource changes)
approved via an issue
npm run test
) and verified that it succeeded