reflex/pynecone/components/forms/form.py
2023-05-25 09:52:57 -07:00

117 lines
2.9 KiB
Python

"""Form components."""
from typing import Dict
from pynecone.components.component import Component
from pynecone.components.libs.chakra import ChakraComponent
from pynecone.vars import Var
class Form(ChakraComponent):
"""A form component."""
tag = "Box"
# What the form renders to.
as_: Var[str] = "form" # type: ignore
def get_controlled_triggers(self) -> Dict[str, Dict]:
"""Get the event triggers that pass the component's value to the handler.
Returns:
A dict mapping the event trigger to the var that is passed to the handler.
"""
# Send all the input refs to the handler.
return {
"on_submit": {
ref[4:]: Var.create(f"getRefValue({ref})", is_local=False)
for ref in self.get_refs()
}
}
class FormControl(ChakraComponent):
"""Provide context to form components."""
tag = "FormControl"
# If true, the form control will be disabled.
is_disabled: Var[bool]
# If true, the form control will be invalid.
is_invalid: Var[bool]
# If true, the form control will be readonly
is_read_only: Var[bool]
# If true, the form control will be required.
is_required: Var[bool]
# The label text used to inform users as to what information is requested for a text field.
label: Var[str]
@classmethod
def create(
cls,
*children,
label=None,
input=None,
help_text=None,
error_message=None,
**props,
) -> Component:
"""Create a form control component.
Args:
children: The children of the form control.
label: The label of the form control.
input: The input of the form control.
help_text: The help text of the form control.
error_message: The error message of the form control.
props: The properties of the form control.
Raises:
AttributeError: raise an error if missing required kwargs.
Returns:
The form control component.
"""
if len(children) == 0:
children = []
if label:
children.append(FormLabel.create(*label))
if not input:
raise AttributeError("input keyword argument is required")
children.append(input)
if help_text:
children.append(FormHelperText.create(*help_text))
if error_message:
children.append(FormErrorMessage.create(*error_message))
return super().create(*children, **props)
class FormHelperText(ChakraComponent):
"""A form helper text component."""
tag = "FormHelperText"
class FormLabel(ChakraComponent):
"""A form label component."""
tag = "FormLabel"
# Link
html_for: Var[str]
class FormErrorMessage(ChakraComponent):
"""A form error message component."""
tag = "FormErrorMessage"