Skip to content

Commit 3ddf938

Browse files
authored
Fix NestedSelect stretch_width (#681)
* fix stretch width * test * per level
1 parent 4a416ce commit 3ddf938

2 files changed

Lines changed: 32 additions & 4 deletions

File tree

src/panel_material_ui/widgets/select.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -757,12 +757,20 @@ def _extract_level_metadata(self, i):
757757
Extract the widget type and keyword arguments from the level metadata.
758758
"""
759759
level = self._levels[i]
760+
widget_kwargs = self._collect_layoutable_kwargs()
761+
widget_kwargs.pop("visible", None) # this will be set dynamically
760762
if isinstance(level, int):
761-
return Select, {}
763+
return Select, widget_kwargs
762764
elif isinstance(level, str):
763-
return Select, {"name": level}
765+
return Select, {"label": level, **widget_kwargs}
764766
widget_type = level.get("type", Select)
765-
widget_kwargs = {k: v for k, v in level.items() if k != "type"}
767+
overrides = {k: v for k, v in level.items() if k != "type"}
768+
# Per-level sizing takes precedence over inherited layout kwargs to avoid
769+
# conflicts (e.g. a fixed width alongside an inherited responsive sizing_mode).
770+
if {"width", "height", "sizing_mode"} & overrides.keys():
771+
for k in ("sizing_mode", "width", "height"):
772+
widget_kwargs.pop(k, None)
773+
widget_kwargs.update(overrides)
766774
return widget_type, widget_kwargs
767775

768776

tests/ui/widgets/test_select.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
pytest.importorskip('playwright')
44

5+
from panel import Column
56
from panel.tests.util import serve_component, wait_until
6-
from panel_material_ui.widgets import MultiSelect, Select
7+
from panel_material_ui.widgets import MultiSelect, NestedSelect, Select
78
from playwright.sync_api import expect
89

910
pytestmark = pytest.mark.ui
@@ -180,6 +181,25 @@ def test_select_clear_selection(page):
180181
page.locator(".select").click()
181182
expect(page.locator(".MuiMenuItem-root")).to_have_count(2) # No empty option
182183

184+
def test_nestedselect_stretch_width(page):
185+
widget = NestedSelect(options={"a": [1, 2]}, sizing_mode="stretch_width")
186+
serve_component(page, Column(widget, width=600))
187+
188+
select = page.locator(".select").first
189+
assert select.bounding_box()["width"] > 500
190+
191+
192+
def test_nestedselect_level_width_overrides_stretch(page):
193+
widget = NestedSelect(
194+
options={"a": [1, 2]},
195+
levels=[{"width": 150}, {}],
196+
sizing_mode="stretch_width",
197+
)
198+
serve_component(page, Column(widget, width=600))
199+
200+
assert page.locator(".select").first.bounding_box()["width"] < 200
201+
202+
183203
def test_multiselect_focus(page):
184204
widget = MultiSelect(options=["Option 1", "Option 2", "Option 3"], value=["Option 1"])
185205
serve_component(page, widget)

0 commit comments

Comments
 (0)