Skip to content

Commit

Permalink
add slots to top level of context in component
Browse files Browse the repository at this point in the history
  • Loading branch information
joshuadavidthomas committed Oct 4, 2024
1 parent 4c6561f commit dd58933
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 3 deletions.
6 changes: 3 additions & 3 deletions src/django_bird/templatetags/django_bird.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,12 @@ def get_component_context_data(self, context: Context) -> dict[str, Any]:
rendered_slots = self.render_slots(context)
flat_attrs = self.flatten_attrs(context)
default_slot = rendered_slots.get(self.default_slot) or context.get("slot")
slots = {name: mark_safe(content) for name, content in rendered_slots.items()}
return {
"attrs": mark_safe(flat_attrs),
"slot": mark_safe(default_slot),
"slots": {
name: mark_safe(content) for name, content in rendered_slots.items()
},
"slots": slots,
**slots,
}

def render_slots(self, context: Context) -> dict[str, str]:
Expand Down
32 changes: 32 additions & 0 deletions tests/test_templatetags.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
import pytest
from django.template import Context
from django.template import Template
from django.template.base import NodeList
from django.template.base import Parser
from django.template.base import TextNode
from django.template.base import Token
from django.template.base import TokenType
from django.template.exceptions import TemplateSyntaxError

from django_bird.templatetags.django_bird import BirdNode
from django_bird.templatetags.django_bird import SlotNode
from django_bird.templatetags.django_bird import do_bird
from django_bird.templatetags.django_bird import parse_slot_name

Expand Down Expand Up @@ -139,6 +142,35 @@ def test_dynamic_attrs(self, create_bird_template):


class TestBirdNode:
def test_get_component_context_data(self, create_bird_template):
create_bird_template(
name="button",
content="<button>{% slot %}{% endslot %}{% slot not-default %}{% endslot %}</button>",
)
node = BirdNode(
name="button",
attrs=[],
nodelist=NodeList(
[
SlotNode(name="default", nodelist=NodeList([TextNode("default")])),
SlotNode(
name="not-default", nodelist=NodeList([TextNode("not default")])
),
]
),
)

component_context = node.get_component_context_data(Context({}))

assert all(
key in component_context.keys() for key in ["attrs", "slot", "slots"]
)
assert component_context["slot"] == "default"
assert component_context["slots"]["default"] == "default"
assert component_context["slots"]["not-default"] == "not default"
assert component_context["default"] == "default"
assert component_context["not-default"] == "not default"

@pytest.mark.parametrize(
"subdir,filename,component,nodename,expected",
[
Expand Down

0 comments on commit dd58933

Please sign in to comment.