Skip to content

Commit 834aa06

Browse files
committed
Merge branch 'dev' into jupyter
2 parents 08b038d + ebc6988 commit 834aa06

File tree

3 files changed

+77
-3
lines changed

3 files changed

+77
-3
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
All notable changes to `dash` will be documented in this file.
33
This project adheres to [Semantic Versioning](https://semver.org/).
44

5+
## [UNRELEASED]
6+
7+
## Fixed
8+
9+
- [#2565](https://github.com/plotly/dash/pull/2565) Fix sorting for > 10 pages, fix [#2564](https://github.com/plotly/dash/issues/2564)
10+
511
## [2.10.2] - 2023-05-31
612

713
## Changed

dash/_pages.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,10 +355,16 @@ def register_page(
355355
)
356356
p["relative_path"] = get_relative_path(p["path"])
357357

358-
# Sort by order and module, then by module
358+
# Sort numeric orders first, then string orders, then no order,
359+
# finally by module name for matching orders
359360
for page in sorted(
360361
PAGE_REGISTRY.values(),
361-
key=lambda i: (str(i.get("order", i["module"])), i["module"]),
362+
key=lambda i: (
363+
i["order"] is None, # False (order given) sorts before True
364+
i["order"] if isinstance(i["order"], (int, float)) else float("inf"),
365+
str(i["order"]),
366+
i["module"],
367+
),
362368
):
363369
PAGE_REGISTRY.move_to_end(page["module"])
364370

tests/integration/multi_page/test_pages_order.py

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44

55
def test_paor001_order(dash_duo, clear_pages_state):
6-
76
app = Dash(__name__, use_pages=True, suppress_callback_exceptions=True)
87

98
dash.register_page(
@@ -24,6 +23,53 @@ def test_paor001_order(dash_duo, clear_pages_state):
2423
order=0,
2524
id="multi_layout3",
2625
)
26+
# Test more than 10 pages to ensure the supplied order is sorted correctly
27+
for order_int in range(3, 13):
28+
dash.register_page(
29+
f"multi_layout{order_int + 1}",
30+
layout=html.Div(
31+
f"text for multi_layout{order_int + 1}",
32+
id=f"text_multi_layout{order_int + 1}",
33+
),
34+
order=order_int,
35+
id=f"multi_layout{order_int + 1}",
36+
)
37+
# Test fractional ordering
38+
dash.register_page(
39+
"multi_layout3.5",
40+
layout=html.Div("text for multi_layout3.5", id="text_multi_layout3.5"),
41+
order=3.5,
42+
id="multi_layout3.5",
43+
)
44+
# Test no order given
45+
dash.register_page(
46+
"multi_layout14",
47+
layout=html.Div("text for multi_layout14", id="text_multi_layout14"),
48+
id="multi_layout14",
49+
)
50+
dash.register_page(
51+
"multi_layout15",
52+
layout=html.Div("text for multi_layout15", id="text_multi_layout15"),
53+
id="multi_layout15",
54+
)
55+
# Test string for order
56+
dash.register_page(
57+
"first_string_order",
58+
layout=html.Div("text for string_order", id="text_string_order"),
59+
order="2a",
60+
id="first_string_order",
61+
)
62+
dash.register_page(
63+
"aaa_first_with_no_order",
64+
layout=html.Div("text for aaa", id="text_aaa"),
65+
id="aaa_first_with_no_order",
66+
)
67+
dash.register_page(
68+
"yyy_last_string_order",
69+
layout=html.Div("text for yyy", id="text_yyy"),
70+
order="zzz",
71+
id="yyy_last_string_order",
72+
)
2773

2874
app.layout = html.Div(
2975
[
@@ -48,6 +94,22 @@ def test_paor001_order(dash_duo, clear_pages_state):
4894
"multi_layout3",
4995
"multi_layout2",
5096
"multi_layout1",
97+
"multi_layout4",
98+
"multi_layout3.5",
99+
"multi_layout5",
100+
"multi_layout6",
101+
"multi_layout7",
102+
"multi_layout8",
103+
"multi_layout9",
104+
"multi_layout10",
105+
"multi_layout11",
106+
"multi_layout12",
107+
"multi_layout13",
108+
"first_string_order",
109+
"yyy_last_string_order",
110+
"aaa_first_with_no_order",
111+
"multi_layout14",
112+
"multi_layout15",
51113
"pages.defaults",
52114
"pages.metas",
53115
"pages.not_found_404",

0 commit comments

Comments
 (0)