Skip to content

Commit 2273d98

Browse files
cpsievertschloerke
andauthored
Make navset id more robust to collisions (#1359)
Co-authored-by: Barret Schloerke <barret@posit.co>
1 parent 4c28e91 commit 2273d98

File tree

2 files changed

+38
-34
lines changed

2 files changed

+38
-34
lines changed

shiny/ui/_navs.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,7 +1039,7 @@ def layout(self, nav: Tag, content: Tag) -> TagList:
10391039
tags.span({"class": "navbar-brand"}, self.title),
10401040
)
10411041
if self.collapsible:
1042-
collapse_id = "navbar-collapse-" + private_random_int(1000, 10000)
1042+
collapse_id = "navbar-collapse-" + nav_random_int()
10431043
nav_container.append(
10441044
tags.button(
10451045
tags.span(class_="navbar-toggler-icon"),
@@ -1289,7 +1289,7 @@ def render_navset(
12891289
selected: Optional[str],
12901290
context: dict[str, Any],
12911291
) -> tuple[Tag, Tag]:
1292-
tabsetid = private_random_int(1000, 10000)
1292+
tabsetid = nav_random_int()
12931293

12941294
# Separate MetadataNodes from NavSetArgs.
12951295
metadata_args: list[MetadataNode] = []
@@ -1356,6 +1356,10 @@ def navset_title(
13561356
return [title_attrs, tags.span(title)]
13571357

13581358

1359+
def nav_random_int() -> str:
1360+
return private_random_int(1000, 1000000)
1361+
1362+
13591363
##############################################
13601364
# Deprecated
13611365
##############################################

tests/pytest/test_navs.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,19 @@ def test_navset_tab_markup():
3838

3939
assert TagList(x).render()["html"] == textwrap.dedent(
4040
"""\
41-
<ul class="nav nav-tabs" data-tabsetid="7311">
41+
<ul class="nav nav-tabs" data-tabsetid="886440">
4242
<li class="nav-item">
43-
<a data-bs-toggle="tab" data-toggle="tab" data-value="a" role="tab" class="nav-link active" href="#tab-7311-0">a</a>
43+
<a data-bs-toggle="tab" data-toggle="tab" data-value="a" role="tab" class="nav-link active" href="#tab-886440-0">a</a>
4444
</li>
4545
<li class="nav-item">
46-
<a data-bs-toggle="tab" data-toggle="tab" data-value="b" role="tab" class="nav-link" href="#tab-7311-1">b</a>
46+
<a data-bs-toggle="tab" data-toggle="tab" data-value="b" role="tab" class="nav-link" href="#tab-886440-1">b</a>
4747
</li>
4848
<li>Some item</li>
4949
<li class="nav-item dropdown">
5050
<a class="nav-link dropdown-toggle " data-bs-toggle="dropdown" data-value="Menu" href="#" role="button">Menu</a>
51-
<ul class="dropdown-menu" data-tabsetid="7890">
51+
<ul class="dropdown-menu" data-tabsetid="404958">
5252
<li>
53-
<a data-bs-toggle="tab" data-toggle="tab" data-value="c" role="tab" class="dropdown-item" href="#tab-7890-0">c</a>
53+
<a data-bs-toggle="tab" data-toggle="tab" data-value="c" role="tab" class="dropdown-item" href="#tab-404958-0">c</a>
5454
</li>
5555
<li class="dropdown-divider"></li>
5656
<li class="dropdown-header">Plain text</li>
@@ -59,10 +59,10 @@ def test_navset_tab_markup():
5959
</ul>
6060
</li>
6161
</ul>
62-
<div class="tab-content" data-tabsetid="7311">
63-
<div class="tab-pane active" role="tabpanel" data-value="a" id="tab-7311-0">a</div>
64-
<div class="tab-pane" role="tabpanel" data-value="b" id="tab-7311-1">b</div>
65-
<div class="tab-pane" role="tabpanel" data-value="c" id="tab-7890-0">c</div>
62+
<div class="tab-content" data-tabsetid="886440">
63+
<div class="tab-pane active" role="tabpanel" data-value="a" id="tab-886440-0">a</div>
64+
<div class="tab-pane" role="tabpanel" data-value="b" id="tab-886440-1">b</div>
65+
<div class="tab-pane" role="tabpanel" data-value="c" id="tab-404958-0">c</div>
6666
</div>"""
6767
)
6868

@@ -73,12 +73,12 @@ def test_navset_pill_markup():
7373

7474
assert TagList(x).render()["html"] == textwrap.dedent(
7575
"""\
76-
<ul class="nav nav-pills shiny-tab-input" id="navset_pill_id" data-tabsetid="7311">
76+
<ul class="nav nav-pills shiny-tab-input" id="navset_pill_id" data-tabsetid="886440">
7777
<li class="nav-item dropdown">
7878
<a class="nav-link dropdown-toggle active" data-bs-toggle="dropdown" data-value="Menu" href="#" role="button">Menu</a>
79-
<ul class="dropdown-menu" data-tabsetid="7890">
79+
<ul class="dropdown-menu" data-tabsetid="404958">
8080
<li>
81-
<a data-bs-toggle="tab" data-toggle="tab" data-value="c" role="tab" class="dropdown-item active" href="#tab-7890-0">c</a>
81+
<a data-bs-toggle="tab" data-toggle="tab" data-value="c" role="tab" class="dropdown-item active" href="#tab-404958-0">c</a>
8282
</li>
8383
<li class="dropdown-divider"></li>
8484
<li class="dropdown-header">Plain text</li>
@@ -87,12 +87,12 @@ def test_navset_pill_markup():
8787
</ul>
8888
</li>
8989
<li class="nav-item">
90-
<a data-bs-toggle="tab" data-toggle="tab" data-value="a" role="tab" class="nav-link" href="#tab-7311-1">a</a>
90+
<a data-bs-toggle="tab" data-toggle="tab" data-value="a" role="tab" class="nav-link" href="#tab-886440-1">a</a>
9191
</li>
9292
</ul>
93-
<div class="tab-content" data-tabsetid="7311">
94-
<div class="tab-pane active" role="tabpanel" data-value="c" id="tab-7890-0">c</div>
95-
<div class="tab-pane" role="tabpanel" data-value="a" id="tab-7311-1">a</div>
93+
<div class="tab-content" data-tabsetid="886440">
94+
<div class="tab-pane active" role="tabpanel" data-value="c" id="tab-404958-0">c</div>
95+
<div class="tab-pane" role="tabpanel" data-value="a" id="tab-886440-1">a</div>
9696
</div>"""
9797
)
9898

@@ -110,28 +110,28 @@ def test_navset_card_pill_markup():
110110
"""\
111111
<div class="card bslib-card bslib-mb-spacing html-fill-item html-fill-container" data-bslib-card-init="">
112112
<div class="card-header">
113-
<ul class="nav nav-pills card-header-pills" data-tabsetid="7311">
113+
<ul class="nav nav-pills card-header-pills" data-tabsetid="886440">
114114
<li class="nav-item">
115-
<a data-bs-toggle="tab" data-toggle="tab" data-value="a" role="tab" class="nav-link" href="#tab-7311-0">a</a>
115+
<a data-bs-toggle="tab" data-toggle="tab" data-value="a" role="tab" class="nav-link" href="#tab-886440-0">a</a>
116116
</li>
117117
<li class="nav-item dropdown">
118118
<a class="nav-link dropdown-toggle active" data-bs-toggle="dropdown" data-value="Menu" href="#" role="button">Menu</a>
119-
<ul class="dropdown-menu" data-tabsetid="7890">
119+
<ul class="dropdown-menu" data-tabsetid="404958">
120120
<li>
121-
<a data-bs-toggle="tab" data-toggle="tab" data-value="c" role="tab" class="dropdown-item active" href="#tab-7890-0">c</a>
121+
<a data-bs-toggle="tab" data-toggle="tab" data-value="c" role="tab" class="dropdown-item active" href="#tab-404958-0">c</a>
122122
</li>
123123
</ul>
124124
</li>
125125
<li class="nav-item">
126-
<a data-bs-toggle="tab" data-toggle="tab" data-value="b" role="tab" class="nav-link" href="#tab-7311-2">b</a>
126+
<a data-bs-toggle="tab" data-toggle="tab" data-value="b" role="tab" class="nav-link" href="#tab-886440-2">b</a>
127127
</li>
128128
</ul>
129129
</div>
130130
<div class="card-body bslib-gap-spacing html-fill-item html-fill-container" style="margin-top:auto;margin-bottom:auto;flex:1 1 auto;">
131-
<div class="tab-content html-fill-item html-fill-container" data-tabsetid="7311">
132-
<div class="tab-pane html-fill-item html-fill-container bslib-gap-spacing" role="tabpanel" data-value="a" id="tab-7311-0" style="gap:0;padding:0;">a</div>
133-
<div class="tab-pane active html-fill-item html-fill-container bslib-gap-spacing" role="tabpanel" data-value="c" id="tab-7890-0" style="gap:0;padding:0;">c</div>
134-
<div class="tab-pane html-fill-item html-fill-container bslib-gap-spacing" role="tabpanel" data-value="b" id="tab-7311-2" style="gap:0;padding:0;">b</div>
131+
<div class="tab-content html-fill-item html-fill-container" data-tabsetid="886440">
132+
<div class="tab-pane html-fill-item html-fill-container bslib-gap-spacing" role="tabpanel" data-value="a" id="tab-886440-0" style="gap:0;padding:0;">a</div>
133+
<div class="tab-pane active html-fill-item html-fill-container bslib-gap-spacing" role="tabpanel" data-value="c" id="tab-404958-0" style="gap:0;padding:0;">c</div>
134+
<div class="tab-pane html-fill-item html-fill-container bslib-gap-spacing" role="tabpanel" data-value="b" id="tab-886440-2" style="gap:0;padding:0;">b</div>
135135
</div>
136136
</div>
137137
<script data-bslib-card-init="">window.bslib.Card.initializeAllCards();</script>
@@ -152,15 +152,15 @@ def test_navset_bar_markup():
152152
"""\
153153
<nav class="navbar navbar-expand-md navbar-default">
154154
<div class="container-fluid">
155-
<span class="navbar-brand">Page title</span><button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-collapse-1663" aria-controls="navbar-collapse-1663" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>
156-
<div id="navbar-collapse-1663" class="collapse navbar-collapse">
157-
<ul class="nav navbar-nav nav-underline" data-tabsetid="7311">
155+
<span class="navbar-brand">Page title</span><button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-collapse-795772" aria-controls="navbar-collapse-795772" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>
156+
<div id="navbar-collapse-795772" class="collapse navbar-collapse">
157+
<ul class="nav navbar-nav nav-underline" data-tabsetid="886440">
158158
<li class="nav-item dropdown">
159159
<a class="nav-link dropdown-toggle active" data-bs-toggle="dropdown" data-value="Menu" href="#" role="button">Menu</a>
160-
<ul class="dropdown-menu" data-tabsetid="7890">
160+
<ul class="dropdown-menu" data-tabsetid="404958">
161161
<li class="dropdown-header">Plain text</li>
162162
<li>
163-
<a data-bs-toggle="tab" data-toggle="tab" data-value="c" role="tab" class="dropdown-item active" href="#tab-7890-1">c</a>
163+
<a data-bs-toggle="tab" data-toggle="tab" data-value="c" role="tab" class="dropdown-item active" href="#tab-404958-1">c</a>
164164
</li>
165165
</ul>
166166
</li>
@@ -170,8 +170,8 @@ def test_navset_bar_markup():
170170
</nav>
171171
<div class="container-fluid html-fill-item html-fill-container">
172172
Page header
173-
<div class="tab-content html-fill-item html-fill-container" data-tabsetid="7311">
174-
<div class="tab-pane active html-fill-item html-fill-container bslib-gap-spacing" role="tabpanel" data-value="c" id="tab-7890-1" style="--bslib-navbar-margin:0;;">c</div>
173+
<div class="tab-content html-fill-item html-fill-container" data-tabsetid="886440">
174+
<div class="tab-pane active html-fill-item html-fill-container bslib-gap-spacing" role="tabpanel" data-value="c" id="tab-404958-1" style="--bslib-navbar-margin:0;;">c</div>
175175
</div>
176176
Page footer
177177
</div>"""

0 commit comments

Comments
 (0)