From f583c4f9421e909e9c2ed5dc6440ad8f12d65580 Mon Sep 17 00:00:00 2001 From: Nikhil Rao Date: Sat, 7 Jan 2023 20:02:01 -0800 Subject: [PATCH] Support nested foreach (#223) --- pynecone/components/tags/iter_tag.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/pynecone/components/tags/iter_tag.py b/pynecone/components/tags/iter_tag.py index d2887d445..92769733b 100644 --- a/pynecone/components/tags/iter_tag.py +++ b/pynecone/components/tags/iter_tag.py @@ -57,16 +57,30 @@ class IterTag(Tag): Returns: The rendered component. """ + # Import here to avoid circular imports. + from pynecone.components.layout.foreach import Foreach + from pynecone.components.layout.fragment import Fragment + + # Get the render function arguments. args = inspect.getfullargspec(render_fn).args index = IterTag.get_index_var() + if len(args) == 1: + # If the render function doesn't take the index as an argument. component = render_fn(arg) else: + # If the render function takes the index as an argument. assert len(args) == 2 component = render_fn(arg, index) + + # Nested foreach components must be wrapped in fragments. + if isinstance(component, Foreach): + component = Fragment.create(component) + + # Set the component key. if component.key is None: component.key = index - # component.key = utils.wrap(str(index), "{", check_first=False) + return component def __str__(self) -> str: