Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update _pages.py - fix sorting for > 10 pages #2565

Merged
merged 2 commits into from
Jun 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@
All notable changes to `dash` will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/).

## [UNRELEASED]

## Fixed

- [#2565](https://github.com/plotly/dash/pull/2565) Fix sorting for > 10 pages, fix [#2564](https://github.com/plotly/dash/issues/2564)

## [2.10.2] - 2023-05-31

## Changed
Expand Down
10 changes: 8 additions & 2 deletions dash/_pages.py
Original file line number Diff line number Diff line change
Expand Up @@ -355,10 +355,16 @@ def register_page(
)
p["relative_path"] = get_relative_path(p["path"])

# Sort by order and module, then by module
# Sort numeric orders first, then string orders, then no order,
# finally by module name for matching orders
for page in sorted(
PAGE_REGISTRY.values(),
key=lambda i: (str(i.get("order", i["module"])), i["module"]),
key=lambda i: (
i["order"] is None, # False (order given) sorts before True
i["order"] if isinstance(i["order"], (int, float)) else float("inf"),
str(i["order"]),
i["module"],
),
):
PAGE_REGISTRY.move_to_end(page["module"])

Expand Down
64 changes: 63 additions & 1 deletion tests/integration/multi_page/test_pages_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@


def test_paor001_order(dash_duo, clear_pages_state):

app = Dash(__name__, use_pages=True, suppress_callback_exceptions=True)

dash.register_page(
Expand All @@ -24,6 +23,53 @@ def test_paor001_order(dash_duo, clear_pages_state):
order=0,
id="multi_layout3",
)
# Test more than 10 pages to ensure the supplied order is sorted correctly
for order_int in range(3, 13):
dash.register_page(
f"multi_layout{order_int + 1}",
layout=html.Div(
f"text for multi_layout{order_int + 1}",
id=f"text_multi_layout{order_int + 1}",
),
order=order_int,
id=f"multi_layout{order_int + 1}",
)
# Test fractional ordering
dash.register_page(
"multi_layout3.5",
layout=html.Div("text for multi_layout3.5", id="text_multi_layout3.5"),
order=3.5,
id="multi_layout3.5",
)
# Test no order given
dash.register_page(
"multi_layout14",
layout=html.Div("text for multi_layout14", id="text_multi_layout14"),
id="multi_layout14",
)
dash.register_page(
"multi_layout15",
layout=html.Div("text for multi_layout15", id="text_multi_layout15"),
id="multi_layout15",
)
gothicVI marked this conversation as resolved.
Show resolved Hide resolved
# Test string for order
dash.register_page(
"first_string_order",
layout=html.Div("text for string_order", id="text_string_order"),
order="2a",
id="first_string_order",
)
dash.register_page(
"aaa_first_with_no_order",
layout=html.Div("text for aaa", id="text_aaa"),
id="aaa_first_with_no_order",
)
dash.register_page(
"yyy_last_string_order",
layout=html.Div("text for yyy", id="text_yyy"),
order="zzz",
id="yyy_last_string_order",
)

app.layout = html.Div(
[
Expand All @@ -48,6 +94,22 @@ def test_paor001_order(dash_duo, clear_pages_state):
"multi_layout3",
"multi_layout2",
"multi_layout1",
"multi_layout4",
"multi_layout3.5",
"multi_layout5",
"multi_layout6",
"multi_layout7",
"multi_layout8",
"multi_layout9",
"multi_layout10",
"multi_layout11",
"multi_layout12",
"multi_layout13",
"first_string_order",
"yyy_last_string_order",
"aaa_first_with_no_order",
"multi_layout14",
"multi_layout15",
"pages.defaults",
"pages.metas",
"pages.not_found_404",
Expand Down