Compare commits

...

2 Commits

Author SHA1 Message Date
Masen Furer
ec91c85c80
add docstring for new getElementValue function 2024-10-23 16:10:20 -07:00
Masen Furer
bb597cf7d6
Handle named form controls similarly to ID'd form controls 2024-10-23 14:51:35 -07:00
3 changed files with 27 additions and 14 deletions

View File

@ -860,23 +860,32 @@ export const getRefValue = (ref) => {
if (!ref || !ref.current) {
return;
}
if (ref.current.type == "checkbox") {
return ref.current.checked; // chakra
return getElementValue(ref.current)
}
/**
* Get the form submission value for a given element.
* @param el The element to get the value from.
* @returns The value.
*/
export const getElementValue = (el) => {
if (el.type == "checkbox") {
return el.checked; // chakra
} else if (
ref.current.className?.includes("rt-CheckboxRoot") ||
ref.current.className?.includes("rt-SwitchRoot")
el.className?.includes("rt-CheckboxRoot") ||
el.className?.includes("rt-SwitchRoot")
) {
return ref.current.ariaChecked == "true"; // radix
} else if (ref.current.className?.includes("rt-SliderRoot")) {
return el.ariaChecked == "true"; // radix
} else if (el.className?.includes("rt-SliderRoot")) {
// find the actual slider
return ref.current.querySelector(".rt-SliderThumb")?.ariaValueNow;
return el.querySelector(".rt-SliderThumb")?.ariaValueNow;
} else {
//querySelector(":checked") is needed to get value from radio_group
return (
ref.current.value ||
(ref.current.querySelector &&
ref.current.querySelector(":checked") &&
ref.current.querySelector(":checked")?.value)
el.value ||
(el.querySelector &&
el.querySelector(":checked") &&
el.querySelector(":checked")?.value)
);
}
};

View File

@ -29,7 +29,11 @@ HANDLE_SUBMIT_JS_JINJA2 = Environment().from_string(
const handleSubmit_{{ handle_submit_unique_name }} = useCallback((ev) => {
const $form = ev.target
ev.preventDefault()
const {{ form_data }} = {...Object.fromEntries(new FormData($form).entries()), ...{{ field_ref_mapping }}};
const {{ form_data }} = {
...Object.fromEntries(new FormData($form).entries()),
...{{ field_ref_mapping }},
...Object.fromEntries(Array.from($form.children).filter(el => el.name).map(el => [el.name, getElementValue(el)])),
};
({{ on_submit_event_chain }}());
@ -187,7 +191,7 @@ class Form(BaseHTML):
"""
return {
"react": "useCallback",
f"/{Dirs.STATE_PATH}": ["getRefValue", "getRefValues"],
f"/{Dirs.STATE_PATH}": ["getRefValue", "getRefValues", "getElementValue"],
}
def add_hooks(self) -> list[str]:

View File

@ -17,7 +17,7 @@ from .base import BaseHTML
FORM_DATA = Var(_js_expr="form_data")
HANDLE_SUBMIT_JS_JINJA2 = Environment().from_string(
"\n const handleSubmit_{{ handle_submit_unique_name }} = useCallback((ev) => {\n const $form = ev.target\n ev.preventDefault()\n const {{ form_data }} = {...Object.fromEntries(new FormData($form).entries()), ...{{ field_ref_mapping }}};\n\n ({{ on_submit_event_chain }}());\n\n if ({{ reset_on_submit }}) {\n $form.reset()\n }\n })\n "
"\n const handleSubmit_{{ handle_submit_unique_name }} = useCallback((ev) => {\n const $form = ev.target\n ev.preventDefault()\n const {{ form_data }} = {\n ...Object.fromEntries(new FormData($form).entries()),\n ...{{ field_ref_mapping }},\n ...Object.fromEntries(Array.from($form.children).filter(el => el.name).map(el => [el.name, getElementValue(el)])),\n };\n\n ({{ on_submit_event_chain }}());\n\n if ({{ reset_on_submit }}) {\n $form.reset()\n }\n })\n "
)
class Button(BaseHTML):