diff --git a/integration/test_form_submit.py b/integration/test_form_submit.py index c9eb45146..44da1b9bf 100644 --- a/integration/test_form_submit.py +++ b/integration/test_form_submit.py @@ -268,6 +268,8 @@ async def test_submit(driver, form_submit: AppHarness): form_data = format.collect_form_dict_names(form_data) + print(form_data) + assert form_data["name_input"] == "foo" assert form_data["pin_input"] == pin_values assert form_data["number_input"] == "-3" diff --git a/integration/test_tailwind.py b/integration/test_tailwind.py index c7320cb21..b58480d48 100644 --- a/integration/test_tailwind.py +++ b/integration/test_tailwind.py @@ -107,7 +107,7 @@ def test_tailwind_app(tailwind_app: AppHarness, tailwind_disabled: bool): assert len(paragraphs) == 3 for p in paragraphs: assert tailwind_app.poll_for_content(p, exp_not_equal="") == PARAGRAPH_TEXT - assert p.value_of_css_property("font-family") == "monospace" + assert p.value_of_css_property("font-family") == '"monospace"' if tailwind_disabled: # expect default color, not "text-red-500" from tailwind utility class assert p.value_of_css_property("color") not in TEXT_RED_500_COLOR diff --git a/reflex/app.py b/reflex/app.py index e1a0a8568..34b75b870 100644 --- a/reflex/app.py +++ b/reflex/app.py @@ -1113,7 +1113,11 @@ class App(MiddlewareMixin, LifespanMixin, Base): Returns: Task if the event was backgroundable, otherwise None """ + # print("Processing background", repr(event)) substate, handler = state._get_event_handler(event) + # print("Substate", substate) + # print("Handler", handler) + if not handler.is_background: return None diff --git a/reflex/components/chakra/forms/pininput.py b/reflex/components/chakra/forms/pininput.py index 7e075887e..77e11fddc 100644 --- a/reflex/components/chakra/forms/pininput.py +++ b/reflex/components/chakra/forms/pininput.py @@ -4,10 +4,12 @@ from __future__ import annotations from typing import Optional +import reflex as rx from reflex.components.chakra import ChakraComponent, LiteralInputVariant from reflex.components.component import Component from reflex.components.tags.tag import Tag from reflex.event import EventHandler +from reflex.ivars import ArrayVar from reflex.utils import format from reflex.utils.imports import ImportDict, merge_imports from reflex.vars import Var @@ -186,7 +188,10 @@ class PinInputField(ChakraComponent): props["name"] = f"{name}-{i}" return PinInputField.create(**props, index=i, key=i) - return Var.range(length).foreach(_create) # type: ignore + return rx.foreach( # type: ignore + ArrayVar.range(length), # type: ignore + _create, + ) def _get_ref_hook(self) -> Optional[str]: return None diff --git a/reflex/components/el/elements/forms.py b/reflex/components/el/elements/forms.py index de767ccb2..dfbdc4c1f 100644 --- a/reflex/components/el/elements/forms.py +++ b/reflex/components/el/elements/forms.py @@ -11,7 +11,7 @@ from reflex.components.el.element import Element from reflex.components.tags.tag import Tag from reflex.constants import Dirs, EventTriggers from reflex.event import EventChain, EventHandler -from reflex.ivars.base import ImmutableVar +from reflex.ivars.base import ImmutableVar, LiteralVar from reflex.utils.format import format_event_chain from reflex.utils.imports import ImportDict from reflex.vars import Var, VarData @@ -185,7 +185,7 @@ class Form(BaseHTML): HANDLE_SUBMIT_JS_JINJA2.render( handle_submit_unique_name=self.handle_submit_unique_name, form_data=FORM_DATA, - field_ref_mapping=str(Var.create_safe(self._get_form_refs())), + field_ref_mapping=str(LiteralVar.create(self._get_form_refs())), on_submit_event_chain=format_event_chain( self.event_triggers[EventTriggers.ON_SUBMIT] ), @@ -213,21 +213,18 @@ class Form(BaseHTML): # when ref start with refs_ it's an array of refs, so we need different method # to collect data if ref.startswith("refs_"): - ref_var = Var.create_safe(ref[:-3], _var_is_string=False).as_ref() - form_refs[ref[5:-3]] = Var.create_safe( + ref_var = ImmutableVar.create_safe(ref[:-3]).as_ref() + form_refs[ref[len("refs_") : -3]] = ImmutableVar.create_safe( f"getRefValues({str(ref_var)})", - _var_is_local=False, - _var_is_string=False, _var_data=VarData.merge(ref_var._get_all_var_data()), ) else: - ref_var = Var.create_safe(ref, _var_is_string=False).as_ref() - form_refs[ref[4:]] = Var.create_safe( + ref_var = ImmutableVar.create_safe(ref).as_ref() + form_refs[ref[4:]] = ImmutableVar.create_safe( f"getRefValue({str(ref_var)})", - _var_is_local=False, - _var_is_string=False, _var_data=VarData.merge(ref_var._get_all_var_data()), ) + # print(repr(form_refs)) return form_refs def _get_vars(self, include_children: bool = True) -> Iterator[Var]: diff --git a/reflex/ivars/base.py b/reflex/ivars/base.py index ea3682f88..089589140 100644 --- a/reflex/ivars/base.py +++ b/reflex/ivars/base.py @@ -724,7 +724,7 @@ class ImmutableVar(Var, Generic[VAR_TYPE]): } ), ).to(ObjectVar) - return refs[self] + return refs[LiteralVar.create(str(self))] def _type(self) -> StringVar: """Returns the type of the object. @@ -804,7 +804,7 @@ class LiteralVar(ImmutableVar): if isinstance(value, EventSpec): event_name = LiteralVar.create( - ".".join(get_event_handler_parts(value.handler)) + ".".join(filter(None, get_event_handler_parts(value.handler))) ) event_args = LiteralVar.create( {str(name): value for name, value in value.args} diff --git a/reflex/ivars/sequence.py b/reflex/ivars/sequence.py index 4f5226bb4..78570e9b9 100644 --- a/reflex/ivars/sequence.py +++ b/reflex/ivars/sequence.py @@ -29,7 +29,12 @@ from typing_extensions import get_origin from reflex import constants from reflex.constants.base import REFLEX_VAR_OPENING_TAG from reflex.utils.types import GenericType -from reflex.vars import ImmutableVarData, Var, VarData, _global_vars +from reflex.vars import ( + ImmutableVarData, + Var, + VarData, + _global_vars, +) from .base import ( CachedVarOperation, diff --git a/reflex/utils/format.py b/reflex/utils/format.py index fe94ffbdf..e7d85a93e 100644 --- a/reflex/utils/format.py +++ b/reflex/utils/format.py @@ -666,7 +666,7 @@ def format_queue_events( call_event_fn, call_event_handler, ) - from reflex.ivars.base import FunctionVar, ImmutableVar + from reflex.ivars import FunctionVar, ImmutableVar if not events: return ImmutableVar("(() => null)").to(FunctionVar, EventChain) @@ -804,8 +804,8 @@ def format_array_ref(refs: str, idx: Var | None) -> str: """ clean_ref = re.sub(r"[^\w]+", "_", refs) if idx is not None: - idx._var_is_local = True - return f"refs_{clean_ref}[{idx}]" + # idx._var_is_local = True + return f"refs_{clean_ref}[{str(idx)}]" return f"refs_{clean_ref}"