Skip to content

Commit 2eae131

Browse files
authored
Merge pull request #3643 from AnnMarieW/fix-multi-select-dropdown-with-components-as-labels
fix multiselect dropdown with components as labels
2 parents 91e05f4 + 6076bb8 commit 2eae131

File tree

3 files changed

+46
-4
lines changed

3 files changed

+46
-4
lines changed

components/dash-core-components/src/utils/optionRendering.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export const OptionLabel: React.FC<OptionLabelProps> = ({
4949
<ExternalWrapper
5050
key={i}
5151
component={label}
52-
componentPath={[...ctx.componentPath, index, i]}
52+
componentPath={[...ctx.componentPath, String(value), i]}
5353
/>
5454
))}
5555
</>

components/dash-core-components/tests/integration/dropdown/test_a11y.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
22
from dash import Dash, Input, Output
33
from dash.dcc import Dropdown
4-
from dash.html import Div, Label, P
4+
from dash.html import Div, Label, P, Span
55
from selenium.common.exceptions import TimeoutException
66
from selenium.webdriver.common.keys import Keys
77
from selenium.webdriver.common.action_chains import ActionChains
@@ -730,3 +730,40 @@ def is_visible(el):
730730
)
731731

732732
return all([is_visible(el) for el in elements])
733+
734+
735+
def test_a11y009_dropdown_component_labels_render_correctly(dash_duo):
736+
app = Dash(__name__)
737+
app.layout = Div(
738+
[
739+
Dropdown(
740+
options=[
741+
{"label": Span("red"), "value": "red"},
742+
{"label": Span("yellow"), "value": "yellow"},
743+
{"label": Span("blue"), "value": "blue"},
744+
],
745+
value=["red", "yellow", "blue"],
746+
id="components-label-dropdown",
747+
multi=True,
748+
),
749+
]
750+
)
751+
752+
dash_duo.start_server(app)
753+
754+
dash_duo.find_element("#components-label-dropdown").click()
755+
dash_duo.wait_for_element(".dash-dropdown-options")
756+
757+
# Click on the "yellow" option
758+
yellow_option = dash_duo.find_element(
759+
'.dash-dropdown-option:has(input[value="yellow"])'
760+
)
761+
yellow_option.click()
762+
763+
# After interaction, verify the options render correctly
764+
option_elements = dash_duo.find_elements(".dash-dropdown-option")
765+
rendered_labels = [el.text.strip() for el in option_elements]
766+
767+
assert rendered_labels == ["red", "yellow", "blue"]
768+
769+
assert dash_duo.get_logs() == []

components/dash-core-components/tests/integration/dropdown/test_clearable_false.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,13 @@ def update_value(val):
190190

191191
# Attempt to deselect all items. Everything should deselect until we get to
192192
# the last item which cannot be cleared.
193-
selected = dash_duo.find_elements(".dash-dropdown-options input[checked]")
194-
[el.click() for el in selected]
193+
# Click MTL option container
194+
mtl_option = dash_duo.find_element('.dash-dropdown-option:has(input[value="MTL"])')
195+
mtl_option.click()
196+
197+
# Click SF option container
198+
sf_option = dash_duo.find_element('.dash-dropdown-option:has(input[value="SF"])')
199+
sf_option.click()
195200

196201
assert dash_duo.find_element("#dropdown-value").text == "SF"
197202

0 commit comments

Comments
 (0)