From 551f6d0deae2886f87225481a29fc4035adde9b5 Mon Sep 17 00:00:00 2001 From: Carson Date: Thu, 7 Dec 2023 16:10:27 -0600 Subject: [PATCH 1/9] Close #492. Deprecate nav() in favor of nav_panel() --- CHANGELOG.md | 1 + shiny/ui/__init__.py | 6 ++++-- shiny/ui/_navs.py | 26 ++++++++++++++++++++++++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a20207b4c..46776586f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Other changes +* Closed #492: `shiny.ui.nav()` is now deprecated in favor of the more aptly named `shiny.ui.nav_panel()` (#876). * Update penguins example to credit Allison Horst and drop usage of `shiny.experimental` (#798). diff --git a/shiny/ui/__init__.py b/shiny/ui/__init__.py index 69fed6996..02793afd2 100644 --- a/shiny/ui/__init__.py +++ b/shiny/ui/__init__.py @@ -86,7 +86,7 @@ from ._markdown import markdown from ._modal import modal_button, modal, modal_show, modal_remove from ._navs import ( - nav, + nav_panel, nav_menu, nav_control, nav_spacer, @@ -102,6 +102,7 @@ # Deprecated navset_pill_card, navset_tab_card, + nav, ) from ._notification import notification_show, notification_remove from ._output import ( @@ -267,7 +268,7 @@ "modal_show", "modal_remove", # _navs - "nav", + "nav_panel", "nav_menu", "nav_control", "nav_spacer", @@ -283,6 +284,7 @@ # # Deprecated "navset_pill_card", "navset_tab_card", + "nav", # _notification "notification_show", "notification_remove", diff --git a/shiny/ui/_navs.py b/shiny/ui/_navs.py index f57338d76..48413f4e1 100644 --- a/shiny/ui/_navs.py +++ b/shiny/ui/_navs.py @@ -1,7 +1,7 @@ from __future__ import annotations __all__ = ( - "nav", + "nav_panel", "nav_menu", "nav_control", "nav_spacer", @@ -17,6 +17,7 @@ # Deprecated - 2023-08-15 "navset_pill_card", "navset_tab_card", + "nav", ) import copy @@ -98,7 +99,7 @@ def tagify(self) -> None: @add_example() -def nav( +def nav_panel( title: TagChild, *args: TagChild, value: Optional[str] = None, @@ -1394,3 +1395,24 @@ def navset_tab_card( header=header, footer=footer, ) + + +# Deprecated 2023-12-07 +def nav( + title: TagChild, + *args: TagChild, + value: Optional[str] = None, + icon: TagChild = None, +) -> Nav: + """Deprecated. Please use `nav_panel()` instead of `nav()`.""" + warn_deprecated( + "`nav()` is deprecated. " + "This method will be removed in a future version, " + "please use :func:`~shiny.ui.nav_panel` instead." + ) + return nav_panel( + title, + *args, + value=value, + icon=icon, + ) From 9f919851ec44c26f5a72adebed50f0351cc1ebd1 Mon Sep 17 00:00:00 2001 From: Carson Date: Thu, 7 Dec 2023 16:15:01 -0600 Subject: [PATCH 2/9] Rename express nav -> nav_panel --- shiny/express/layout.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shiny/express/layout.py b/shiny/express/layout.py index fe50763f8..c18b393bb 100644 --- a/shiny/express/layout.py +++ b/shiny/express/layout.py @@ -26,7 +26,7 @@ "accordion_panel", "navset_tab", "navset_card_tab", - "nav", + "nav_panel", "page_fluid", "page_fixed", "page_fillable", @@ -548,7 +548,7 @@ def navset_card_tab( ) -def nav( +def nav_panel( title: TagChild, *, value: Optional[str] = None, @@ -573,7 +573,7 @@ def nav( An icon to appear inline with the button/link. """ return RecallContextManager( - ui.nav, + ui.nav_panel, args=(title,), kwargs=dict( value=value, From cf2f65e3688906a27e86ec42d084e0c0d0517874 Mon Sep 17 00:00:00 2001 From: Carson Date: Thu, 7 Dec 2023 16:17:06 -0600 Subject: [PATCH 3/9] Update quartodoc --- docs/_quartodoc.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_quartodoc.yml b/docs/_quartodoc.yml index 503e57d74..69b1db530 100644 --- a/docs/_quartodoc.yml +++ b/docs/_quartodoc.yml @@ -26,7 +26,7 @@ quartodoc: - express.layout.accordion_panel - express.layout.navset_tab - express.layout.navset_card_tab - - express.layout.nav + - express.layout.nav_panel - express.layout.page_fluid - express.layout.page_fixed - express.layout.page_fillable @@ -87,10 +87,10 @@ quartodoc: - title: Navigation (tab) panels desc: Create segments of UI content. contents: - - ui.nav - - ui.nav_control + - ui.nav_panel - ui.nav_spacer - ui.nav_menu + - ui.nav_control - ui.navset_bar - ui.navset_tab - ui.navset_pill From 72fcc9fe7bffef9fe3a3378fec334a29fba9d258 Mon Sep 17 00:00:00 2001 From: Carson Date: Thu, 7 Dec 2023 16:18:00 -0600 Subject: [PATCH 4/9] Update examples and tests --- examples/event/app.py | 4 +- examples/express/nav_app.py | 8 +- examples/inputs-update/app.py | 4 +- examples/inputs/app.py | 162 ++++++++++++++++++ examples/inputs/rstudio-logo.png | Bin 0 -> 9784 bytes examples/static_plots/app.py | 14 +- shiny/api-examples/nav/app.py | 6 +- shiny/api-examples/navset_hidden/app.py | 6 +- shiny/api-examples/update_navs/app.py | 6 +- .../app-templates/multi-page/modules.py | 4 +- tests/e2e/TODO/navbar/app.py | 2 +- tests/e2e/bugs/0696-resolve-id/app.py | 2 +- tests/e2e/navs/nav/app.py | 6 +- tests/e2e/navs/navset_hidden/app.py | 6 +- tests/e2e/plot-sizing/app.py | 8 +- tests/pytest/test_navs.py | 6 +- 16 files changed, 203 insertions(+), 41 deletions(-) create mode 100644 examples/inputs/app.py create mode 100644 examples/inputs/rstudio-logo.png diff --git a/examples/event/app.py b/examples/event/app.py index 20adf5d25..31ee8eb26 100644 --- a/examples/event/app.py +++ b/examples/event/app.py @@ -12,12 +12,12 @@ """ ), ui.navset_card_tab( - ui.nav( + ui.nav_panel( "Sync", ui.input_action_button("btn", "Click me"), ui.output_ui("btn_value"), ), - ui.nav( + ui.nav_panel( "Async", ui.input_action_button("btn_async", "Click me"), ui.output_ui("btn_async_value"), diff --git a/examples/express/nav_app.py b/examples/express/nav_app.py index 07fb07b34..092184121 100644 --- a/examples/express/nav_app.py +++ b/examples/express/nav_app.py @@ -6,10 +6,10 @@ with layout.column(width=6): with layout.navset_tab(): - with layout.nav(title="One"): + with layout.nav_panel(title="One"): ui.input_slider("n", "N", 1, 100, 50) - with layout.nav(title="Two"): + with layout.nav_panel(title="Two"): @render.plot def histogram(): @@ -20,10 +20,10 @@ def histogram(): with layout.column(width=6): with layout.navset_card_tab(): - with layout.nav(title="One"): + with layout.nav_panel(title="One"): ui.input_slider("n2", "N", 1, 100, 50) - with layout.nav(title="Two"): + with layout.nav_panel(title="Two"): @render.plot def histogram2(): diff --git a/examples/inputs-update/app.py b/examples/inputs-update/app.py index 133bdbfa9..be210a807 100644 --- a/examples/inputs-update/app.py +++ b/examples/inputs-update/app.py @@ -78,8 +78,8 @@ ), ), ui.navset_tab( - ui.nav("panel1", ui.h2("This is the first panel.")), - ui.nav("panel2", ui.h2("This is the second panel.")), + ui.nav_panel("panel1", ui.h2("This is the first panel.")), + ui.nav_panel("panel2", ui.h2("This is the second panel.")), id="inTabset", ), ), diff --git a/examples/inputs/app.py b/examples/inputs/app.py new file mode 100644 index 000000000..8e4e9c571 --- /dev/null +++ b/examples/inputs/app.py @@ -0,0 +1,162 @@ +from faicons import icon_svg + +from shiny import * +from shiny.types import ImgData +from shiny.ui import HTML, Tag, tags + +app_ui = ui.page_fluid( + ui.panel_title("Hello Shiny UI"), + ui.layout_sidebar( + ui.panel_sidebar( + ui.input_slider( + "n", "input_slider()", min=10, max=100, value=50, step=5, animate=True + ), + ui.input_date("date", "input_date()"), + ui.input_date_range("date_rng", "input_date_range()"), + ui.input_text("txt", "input_text()", placeholder="Input some text"), + ui.input_text_area( + "txt_area", "input_text_area()", placeholder="Input some text" + ), + ui.input_numeric("num", "input_numeric()", 20), + ui.input_password("password", "input_password()"), + ui.input_checkbox("checkbox", "input_checkbox()"), + ui.input_checkbox_group( + "checkbox_group", + "input_checkbox_group()", + {"a": "Choice 1", "b": "Choice 2"}, + selected=["a", "b"], + inline=True, + ), + ui.input_radio_buttons( + "radio", "input_radio()", {"a": "Choice 1", "b": "Choice 2"} + ), + ui.input_select( + "select", + "input_select()", + { + "a": "Choice A", + "Group B": {"b1": "Choice B1", "b2": "Choice B2"}, + "Group C": {"c1": "c1", "c2": "c2"}, + }, + ), + ui.input_action_button( + "button", + "input_action_button()", + icon=icon_svg("check"), + class_="btn-primary", + ), + ui.input_file("file", "File upload"), + ), + ui.panel_main( + # ui.output_plot("plot"), + ui.navset_tab_card( + # TODO: output_plot() within a tab not working? + ui.nav_panel("Inputs", ui.output_ui("inputs"), icon=icon_svg("code")), + ui.nav_panel( + "Image", + ui.output_plot("plot"), + icon=icon_svg("image"), + ), + ui.nav_panel( + "Misc", + ui.input_action_link( + "link", "Show notification/progress", icon=icon_svg("info") + ), + tags.br(), + ui.input_action_button( + "btn", + "Show modal", + icon=icon_svg("info"), + class_="btn-primary", + ), + ui.panel_fixed( + ui.panel_well( + "A fixed, draggable, panel", + ui.input_checkbox("checkbox2", "Check me!"), + ui.panel_conditional( + "input.checkbox2 == true", "Thanks for checking!" + ), + ), + draggable=True, + width="fit-content", + height="50px", + top="50px", + right="50px", + ), + # icon=icon_svg("code"), + ), + ), + ), + ), +) + + +import matplotlib.pyplot as plt +import numpy as np + + +def server(input: Inputs, output: Outputs, session: Session): + @output() + @render.ui() + def inputs() -> Tag: + vals = [ + f"input_date() {input.date()}", + f"input_date_range(): {input.date_rng()}", + f"input_text(): {input.txt()}", + f"input_text_area(): {input.txt_area()}", + f"input_numeric(): {input.num()}", + f"input_password(): {input.password()}", + f"input_checkbox(): {input.checkbox()}", + f"input_checkbox_group(): {input.checkbox_group()}", + f"input_radio(): {input.radio()}", + f"input_select(): {input.select()}", + f"input_action_button(): {input.button()}", + ] + return tags.pre(HTML("\n".join(vals))) + + np.random.seed(19680801) + x_rand = 100 + 15 * np.random.randn(437) + + @output() + @render.plot(alt="A histogram") + def plot(): + fig, ax = plt.subplots() + ax.hist(x_rand, int(input.n()), density=True) + return fig + + @output() + @render.image() + def image(): + from pathlib import Path + + dir = Path(__file__).resolve().parent + img: ImgData = {"src": str(dir / "rstudio-logo.png"), "width": "150px"} + return img + + @reactive.Effect() + def _(): + btn = input.btn() + if btn and btn > 0: + ui.modal_show( + ui.modal( + "Hello there!", + easy_close=True, + footer=ui.modal_button("Dismiss", class_="btn-primary"), + ) + ) + + @reactive.Effect() + def _(): + link = input.link() + if link and link > 0: + ui.notification_show("A notification!") + p = ui.Progress() + import time + + for i in range(30): + p.set(i / 30, message="Computing") + time.sleep(0.1) + p.close() + + +app = App(app_ui, server) diff --git a/examples/inputs/rstudio-logo.png b/examples/inputs/rstudio-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..58ad39141417a94ca6f3539837fd61eb89a4db2c GIT binary patch literal 9784 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
  • n;QxljuL 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 SeIXM70000 List[NavSetArg]: return [ - ui.nav("a", prefix + ": tab a content"), - ui.nav("b", prefix + ": tab b content"), - ui.nav("c", prefix + ": tab c content"), + ui.nav_panel("a", prefix + ": tab a content"), + ui.nav_panel("b", prefix + ": tab b content"), + ui.nav_panel("c", prefix + ": tab c content"), ui.nav_spacer(), ui.nav_menu( "Links", diff --git a/shiny/api-examples/navset_hidden/app.py b/shiny/api-examples/navset_hidden/app.py index 09ff8d859..014869a97 100644 --- a/shiny/api-examples/navset_hidden/app.py +++ b/shiny/api-examples/navset_hidden/app.py @@ -9,9 +9,9 @@ ), ui.panel_main( ui.navset_hidden( - ui.nav(None, "Panel 1 content", value="panel1"), - ui.nav(None, "Panel 2 content", value="panel2"), - ui.nav(None, "Panel 3 content", value="panel3"), + ui.nav_panel(None, "Panel 1 content", value="panel1"), + ui.nav_panel(None, "Panel 2 content", value="panel2"), + ui.nav_panel(None, "Panel 3 content", value="panel3"), id="hidden_tabs", ), ), diff --git a/shiny/api-examples/update_navs/app.py b/shiny/api-examples/update_navs/app.py index e319eba51..6a8e392a9 100644 --- a/shiny/api-examples/update_navs/app.py +++ b/shiny/api-examples/update_navs/app.py @@ -7,9 +7,9 @@ ), ui.panel_main( ui.navset_card_tab( - ui.nav("Panel 1", "Panel 1 content", value="panel1"), - ui.nav("Panel 2", "Panel 2 content", value="panel2"), - ui.nav("Panel 3", "Panel 3 content", value="panel3"), + ui.nav_panel("Panel 1", "Panel 1 content", value="panel1"), + ui.nav_panel("Panel 2", "Panel 2 content", value="panel2"), + ui.nav_panel("Panel 3", "Panel 3 content", value="panel3"), id="inTabset", ), ), diff --git a/shiny/templates/app-templates/multi-page/modules.py b/shiny/templates/app-templates/multi-page/modules.py index c8df0bfd2..d6d758c99 100644 --- a/shiny/templates/app-templates/multi-page/modules.py +++ b/shiny/templates/app-templates/multi-page/modules.py @@ -8,7 +8,7 @@ @module.ui def training_ui(): - return ui.nav( + return ui.nav_panel( "Training Dashboard", ui.row( ui.layout_column_wrap( @@ -52,7 +52,7 @@ def metric(): @module.ui def data_view_ui(): - return ui.nav( + return ui.nav_panel( "View Data", ui.row( ui.layout_column_wrap( diff --git a/tests/e2e/TODO/navbar/app.py b/tests/e2e/TODO/navbar/app.py index e380cb70d..a6a8c3970 100644 --- a/tests/e2e/TODO/navbar/app.py +++ b/tests/e2e/TODO/navbar/app.py @@ -7,7 +7,7 @@ def nav_with_content(letter: str, prefix: str) -> ui._navs.Nav: - return ui.nav(letter, ui.markdown(f"`{prefix}`: tab {letter} content")) + return ui.nav_panel(letter, ui.markdown(f"`{prefix}`: tab {letter} content")) def nav_items(prefix: str) -> list[NavSetArg]: diff --git a/tests/e2e/bugs/0696-resolve-id/app.py b/tests/e2e/bugs/0696-resolve-id/app.py index 0365ae5b7..a215f44fe 100644 --- a/tests/e2e/bugs/0696-resolve-id/app.py +++ b/tests/e2e/bugs/0696-resolve-id/app.py @@ -76,7 +76,7 @@ def mod_x_ui(label: str) -> ui.TagChild: def ui_navs(label: str) -> list[ui._navs.Nav]: return [ - ui.nav( + ui.nav_panel( letter.capitalize(), f"{label} - {letter.capitalize()} content", value=letter, diff --git a/tests/e2e/navs/nav/app.py b/tests/e2e/navs/nav/app.py index d71038cc2..57279c44c 100644 --- a/tests/e2e/navs/nav/app.py +++ b/tests/e2e/navs/nav/app.py @@ -16,9 +16,9 @@ def nav_controls(prefix: str) -> List[NavSetArg]: return [ - ui.nav("a", prefix + ": tab a content"), - ui.nav("b", prefix + ": tab b content"), - ui.nav("c", prefix + ": tab c content"), + ui.nav_panel("a", prefix + ": tab a content"), + ui.nav_panel("b", prefix + ": tab b content"), + ui.nav_panel("c", prefix + ": tab c content"), ui.nav_spacer(), ui.nav_menu( "Links", diff --git a/tests/e2e/navs/navset_hidden/app.py b/tests/e2e/navs/navset_hidden/app.py index 82771e41e..35462dcc9 100644 --- a/tests/e2e/navs/navset_hidden/app.py +++ b/tests/e2e/navs/navset_hidden/app.py @@ -9,9 +9,9 @@ ), ui.panel_main( ui.navset_hidden( - ui.nav(None, "Panel 1 content", value="panel1"), - ui.nav(None, "Panel 2 content", value="panel2"), - ui.nav(None, "Panel 3 content", value="panel3"), + ui.nav_panel(None, "Panel 1 content", value="panel1"), + ui.nav_panel(None, "Panel 2 content", value="panel2"), + ui.nav_panel(None, "Panel 3 content", value="panel3"), id="hidden_tabs", ), ), diff --git a/tests/e2e/plot-sizing/app.py b/tests/e2e/plot-sizing/app.py index f090980e7..646fe7fe4 100644 --- a/tests/e2e/plot-sizing/app.py +++ b/tests/e2e/plot-sizing/app.py @@ -61,7 +61,7 @@ def plot_native_size(): app_ui = ui.page_navbar( - ui.nav( + ui.nav_panel( "matplotlib", ui.p( "The following four plots should all be the same size. The last one should have larger text." @@ -69,7 +69,7 @@ def plot_native_size(): plot_ui("mpl"), value="mpl", ), - ui.nav( + ui.nav_panel( "seaborn", ui.p( "The following four plots should all be the same size. The last one should have larger text." @@ -77,14 +77,14 @@ def plot_native_size(): plot_ui("sns"), value="sns", ), - ui.nav( + ui.nav_panel( "plotnine", ui.p( "The following four plots should all be the same size. The last one should have larger text." ), plot_ui("plotnine"), ), - ui.nav( + ui.nav_panel( "pil", ui.p("The following three images should all be the same size."), plot_ui("pil"), diff --git a/tests/pytest/test_navs.py b/tests/pytest/test_navs.py index 0bbce0813..d6631eddd 100644 --- a/tests/pytest/test_navs.py +++ b/tests/pytest/test_navs.py @@ -20,9 +20,9 @@ def with_private_seed(func: Callable[[], NavSet], *args: Any, **kwargs: Any): def test_nav_markup(): - a = ui.nav("a", "a") - b = ui.nav("b", "b") - c = ui.nav("c", "c") + a = ui.nav_panel("a", "a") + b = ui.nav_panel("b", "b") + c = ui.nav_panel("c", "c") menu = ui.nav_menu( "Menu", c, From 414571208034685276870866b859a5c657fbbbae Mon Sep 17 00:00:00 2001 From: Carson Date: Thu, 7 Dec 2023 16:21:32 -0600 Subject: [PATCH 5/9] Update docstrings --- shiny/ui/_navs.py | 72 +++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/shiny/ui/_navs.py b/shiny/ui/_navs.py index 48413f4e1..6f7b0a1d1 100644 --- a/shiny/ui/_navs.py +++ b/shiny/ui/_navs.py @@ -169,7 +169,7 @@ def nav_control(*args: TagChild) -> Nav: See Also -------- - * ~shiny.ui.nav + * ~shiny.ui.nav_panel * ~shiny.ui.nav_menu * ~shiny.ui.nav_spacer * ~shiny.ui.navset_bar @@ -184,7 +184,7 @@ def nav_control(*args: TagChild) -> Nav: Example ------- - See :func:`~shiny.ui.nav` + See :func:`~shiny.ui.nav_panel` """ return Nav(tags.li(*args)) @@ -195,7 +195,7 @@ def nav_spacer() -> Nav: See Also -------- - * ~shiny.ui.nav + * ~shiny.ui.nav_panel * ~shiny.ui.nav_menu * ~shiny.ui.nav_control * ~shiny.ui.navset_bar @@ -210,7 +210,7 @@ def nav_spacer() -> Nav: Example ------- - See :func:`~shiny.ui.nav` + See :func:`~shiny.ui.nav_panel` """ return Nav(tags.li(components_dependency(), class_="bslib-nav-spacer")) @@ -310,7 +310,7 @@ def nav_menu( title A title to display. Can be a character string or UI elements (i.e., tags). *args - A collection of nav items (e.g., :func:`~shiny.ui.nav`) and/or strings. + A collection of nav items (e.g., :func:`~shiny.ui.nav_panel`) and/or strings. Strings will be rendered as a section header unless the string is a set of two or more hyphens (e.g., ``---``), in which case it will be rendered as a divider. @@ -332,7 +332,7 @@ def nav_menu( See Also ------- - * ~shiny.ui.nav + * ~shiny.ui.nav_panel * ~shiny.ui.nav_control * ~shiny.ui.nav_spacer * ~shiny.ui.navset_bar @@ -347,7 +347,7 @@ def nav_menu( Example ------- - See :func:`~shiny.ui.nav` + See :func:`~shiny.ui.nav_panel` """ if value is None: value = str(title) @@ -415,7 +415,7 @@ def navset_tab( Parameters ---------- *args - A collection of nav items (e.g., :func:`shiny.ui.nav`). + A collection of nav items (e.g., :func:`shiny.ui.nav_panel`). id If provided, will create an input value that holds the currently selected nav item. @@ -430,7 +430,7 @@ def navset_tab( See Also -------- - * ~shiny.ui.nav + * ~shiny.ui.nav_panel * ~shiny.ui.nav_menu * ~shiny.ui.nav_control * ~shiny.ui.nav_spacer @@ -445,7 +445,7 @@ def navset_tab( Example ------- - See :func:`~shiny.ui.nav` + See :func:`~shiny.ui.nav_panel` """ return NavSet( @@ -471,7 +471,7 @@ def navset_pill( Parameters ---------- *args - A collection of nav items (e.g., :func:`shiny.ui.nav`). + A collection of nav items (e.g., :func:`shiny.ui.nav_panel`). id If provided, will create an input value that holds the currently selected nav item. @@ -485,7 +485,7 @@ def navset_pill( See Also -------- - * ~shiny.ui.nav + * ~shiny.ui.nav_panel * ~shiny.ui.nav_menu * ~shiny.ui.nav_control * ~shiny.ui.nav_spacer @@ -500,7 +500,7 @@ def navset_pill( Example ------- - See :func:`~shiny.ui.nav` + See :func:`~shiny.ui.nav_panel` """ return NavSet( @@ -526,7 +526,7 @@ def navset_underline( Parameters ---------- *args - A collection of nav items (e.g., :func:`shiny.ui.nav`). + A collection of nav items (e.g., :func:`shiny.ui.nav_panel`). id If provided, will create an input value that holds the currently selected nav item. @@ -540,7 +540,7 @@ def navset_underline( See Also -------- - * ~shiny.ui.nav + * ~shiny.ui.nav_panel * ~shiny.ui.nav_menu * ~shiny.ui.nav_control * ~shiny.ui.nav_spacer @@ -555,7 +555,7 @@ def navset_underline( Example ------- - See :func:`~shiny.ui.nav` + See :func:`~shiny.ui.nav_panel` """ return NavSet( *args, @@ -581,7 +581,7 @@ def navset_hidden( Parameters ---------- *args - A collection of nav items (e.g., :func:`shiny.ui.nav`). + A collection of nav items (e.g., :func:`shiny.ui.nav_panel`). id If provided, will create an input value that holds the currently selected nav item. @@ -595,7 +595,7 @@ def navset_hidden( See Also -------- - * ~shiny.ui.nav + * ~shiny.ui.nav_panel * ~shiny.ui.nav_menu * ~shiny.ui.nav_control * ~shiny.ui.nav_spacer @@ -694,7 +694,7 @@ def navset_card_tab( Parameters ---------- *args - A collection of nav items (e.g., :func:`shiny.ui.nav`). + A collection of nav items (e.g., :func:`shiny.ui.nav_panel`). id If provided, will create an input value that holds the currently selected nav item. @@ -727,7 +727,7 @@ def navset_card_tab( See Also -------- - * ~shiny.ui.nav + * ~shiny.ui.nav_panel * ~shiny.ui.nav_menu * ~shiny.ui.nav_control * ~shiny.ui.nav_spacer @@ -742,7 +742,7 @@ def navset_card_tab( Example ------- - See :func:`~shiny.ui.nav` + See :func:`~shiny.ui.nav_panel` """ return NavSetCard( @@ -774,7 +774,7 @@ def navset_card_pill( Parameters ---------- *args - A collection of nav items (e.g., :func:`shiny.ui.nav`). + A collection of nav items (e.g., :func:`shiny.ui.nav_panel`). id If provided, will create an input value that holds the currently selected nav item. @@ -782,7 +782,7 @@ def navset_card_pill( Choose a particular nav item to select by default value (should match it's ``value``). sidebar - A :class:`shiny.ui.Sidebar` component to display on every :func:`~shiny.ui.nav` page. + A :class:`shiny.ui.Sidebar` component to display on every :func:`~shiny.ui.nav_panel` page. header UI to display above the selected content. footer @@ -792,7 +792,7 @@ def navset_card_pill( See Also -------- - * ~shiny.ui.nav + * ~shiny.ui.nav_panel * ~shiny.ui.nav_menu * ~shiny.ui.nav_control * ~shiny.ui.nav_spacer @@ -807,7 +807,7 @@ def navset_card_pill( Example ------- - See :func:`~shiny.ui.nav` + See :func:`~shiny.ui.nav_panel` """ return NavSetCard( @@ -839,7 +839,7 @@ def navset_card_underline( Parameters ---------- *args - A collection of nav items (e.g., :func:`shiny.ui.nav`). + A collection of nav items (e.g., :func:`shiny.ui.nav_panel`). id If provided, will create an input value that holds the currently selected nav item. @@ -847,7 +847,7 @@ def navset_card_underline( Choose a particular nav item to select by default value (should match it's ``value``). sidebar - A :class:`shiny.ui.Sidebar` component to display on every :func:`~shiny.ui.nav` page. + A :class:`shiny.ui.Sidebar` component to display on every :func:`~shiny.ui.nav_panel` page. header UI to display above the selected content. footer @@ -857,7 +857,7 @@ def navset_card_underline( See Also -------- - * ~shiny.ui.nav + * ~shiny.ui.nav_panel * ~shiny.ui.nav_menu * ~shiny.ui.nav_control * ~shiny.ui.nav_spacer @@ -872,7 +872,7 @@ def navset_card_underline( Example ------- - See :func:`~shiny.ui.nav` + See :func:`~shiny.ui.nav_panel` """ return NavSetCard( *args, @@ -936,7 +936,7 @@ def navset_pill_list( Parameters ---------- *args - A collection of nav items (e.g., :func:`shiny.ui.nav`). + A collection of nav items (e.g., :func:`shiny.ui.nav_panel`). id If provided, will create an input value that holds the currently selected nav item. @@ -954,7 +954,7 @@ def navset_pill_list( See Also -------- - * ~shiny.ui.nav + * ~shiny.ui.nav_panel * ~shiny.ui.nav_menu * ~shiny.ui.nav_control * ~shiny.ui.nav_spacer @@ -969,7 +969,7 @@ def navset_pill_list( Example ------- - See :func:`~shiny.ui.nav` + See :func:`~shiny.ui.nav_panel` """ return NavSetPillList( @@ -1181,7 +1181,7 @@ def navset_bar( Parameters ---------- *args - A collection of nav items (e.g., :func:`shiny.ui.nav`). + A collection of nav items (e.g., :func:`shiny.ui.nav_panel`). title Title to display in the navbar. id @@ -1191,7 +1191,7 @@ def navset_bar( Choose a particular nav item to select by default value (should match it's ``value``). sidebar - A :class:`~shiny.ui.Sidebar` component to display on every :func:`~shiny.ui.nav` page. + A :class:`~shiny.ui.Sidebar` component to display on every :func:`~shiny.ui.nav_panel` page. fillable Whether or not to allow fill items to grow/shrink to fit the browser window. If `True`, all `nav()` pages are fillable. A character vector, matching the value @@ -1231,7 +1231,7 @@ def navset_bar( See Also -------- * ~shiny.ui.page_navbar - * ~shiny.ui.nav + * ~shiny.ui.nav_panel * ~shiny.ui.nav_menu * ~shiny.ui.nav_control * ~shiny.ui.nav_spacer @@ -1246,7 +1246,7 @@ def navset_bar( Example ------- - See :func:`~shiny.ui.nav`. + See :func:`~shiny.ui.nav_panel`. """ # If args contains any lists, flatten them into args. From 53005912b5a395bafaf0516ac435cf65354c08c7 Mon Sep 17 00:00:00 2001 From: Carson Date: Thu, 7 Dec 2023 16:23:39 -0600 Subject: [PATCH 6/9] Remove file committed by mistake --- examples/inputs/app.py | 162 ------------------------------- examples/inputs/rstudio-logo.png | Bin 9784 -> 0 bytes 2 files changed, 162 deletions(-) delete mode 100644 examples/inputs/app.py delete mode 100644 examples/inputs/rstudio-logo.png diff --git a/examples/inputs/app.py b/examples/inputs/app.py deleted file mode 100644 index 8e4e9c571..000000000 --- a/examples/inputs/app.py +++ /dev/null @@ -1,162 +0,0 @@ -from faicons import icon_svg - -from shiny import * -from shiny.types import ImgData -from shiny.ui import HTML, Tag, tags - -app_ui = ui.page_fluid( - ui.panel_title("Hello Shiny UI"), - ui.layout_sidebar( - ui.panel_sidebar( - ui.input_slider( - "n", "input_slider()", min=10, max=100, value=50, step=5, animate=True - ), - ui.input_date("date", "input_date()"), - ui.input_date_range("date_rng", "input_date_range()"), - ui.input_text("txt", "input_text()", placeholder="Input some text"), - ui.input_text_area( - "txt_area", "input_text_area()", placeholder="Input some text" - ), - ui.input_numeric("num", "input_numeric()", 20), - ui.input_password("password", "input_password()"), - ui.input_checkbox("checkbox", "input_checkbox()"), - ui.input_checkbox_group( - "checkbox_group", - "input_checkbox_group()", - {"a": "Choice 1", "b": "Choice 2"}, - selected=["a", "b"], - inline=True, - ), - ui.input_radio_buttons( - "radio", "input_radio()", {"a": "Choice 1", "b": "Choice 2"} - ), - ui.input_select( - "select", - "input_select()", - { - "a": "Choice A", - "Group B": {"b1": "Choice B1", "b2": "Choice B2"}, - "Group C": {"c1": "c1", "c2": "c2"}, - }, - ), - ui.input_action_button( - "button", - "input_action_button()", - icon=icon_svg("check"), - class_="btn-primary", - ), - ui.input_file("file", "File upload"), - ), - ui.panel_main( - # ui.output_plot("plot"), - ui.navset_tab_card( - # TODO: output_plot() within a tab not working? - ui.nav_panel("Inputs", ui.output_ui("inputs"), icon=icon_svg("code")), - ui.nav_panel( - "Image", - ui.output_plot("plot"), - icon=icon_svg("image"), - ), - ui.nav_panel( - "Misc", - ui.input_action_link( - "link", "Show notification/progress", icon=icon_svg("info") - ), - tags.br(), - ui.input_action_button( - "btn", - "Show modal", - icon=icon_svg("info"), - class_="btn-primary", - ), - ui.panel_fixed( - ui.panel_well( - "A fixed, draggable, panel", - ui.input_checkbox("checkbox2", "Check me!"), - ui.panel_conditional( - "input.checkbox2 == true", "Thanks for checking!" - ), - ), - draggable=True, - width="fit-content", - height="50px", - top="50px", - right="50px", - ), - # icon=icon_svg("code"), - ), - ), - ), - ), -) - - -import matplotlib.pyplot as plt -import numpy as np - - -def server(input: Inputs, output: Outputs, session: Session): - @output() - @render.ui() - def inputs() -> Tag: - vals = [ - f"input_date() {input.date()}", - f"input_date_range(): {input.date_rng()}", - f"input_text(): {input.txt()}", - f"input_text_area(): {input.txt_area()}", - f"input_numeric(): {input.num()}", - f"input_password(): {input.password()}", - f"input_checkbox(): {input.checkbox()}", - f"input_checkbox_group(): {input.checkbox_group()}", - f"input_radio(): {input.radio()}", - f"input_select(): {input.select()}", - f"input_action_button(): {input.button()}", - ] - return tags.pre(HTML("\n".join(vals))) - - np.random.seed(19680801) - x_rand = 100 + 15 * np.random.randn(437) - - @output() - @render.plot(alt="A histogram") - def plot(): - fig, ax = plt.subplots() - ax.hist(x_rand, int(input.n()), density=True) - return fig - - @output() - @render.image() - def image(): - from pathlib import Path - - dir = Path(__file__).resolve().parent - img: ImgData = {"src": str(dir / "rstudio-logo.png"), "width": "150px"} - return img - - @reactive.Effect() - def _(): - btn = input.btn() - if btn and btn > 0: - ui.modal_show( - ui.modal( - "Hello there!", - easy_close=True, - footer=ui.modal_button("Dismiss", class_="btn-primary"), - ) - ) - - @reactive.Effect() - def _(): - link = input.link() - if link and link > 0: - ui.notification_show("A notification!") - p = ui.Progress() - import time - - for i in range(30): - p.set(i / 30, message="Computing") - time.sleep(0.1) - p.close() - - -app = App(app_ui, server) diff --git a/examples/inputs/rstudio-logo.png b/examples/inputs/rstudio-logo.png deleted file mode 100644 index 58ad39141417a94ca6f3539837fd61eb89a4db2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9784 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
  • n;QxljuL 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 SeIXM70000 Date: Thu, 7 Dec 2023 16:43:16 -0600 Subject: [PATCH 7/9] Add nav to deprecated section of API reference --- docs/_quartodoc.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_quartodoc.yml b/docs/_quartodoc.yml index 69b1db530..8036f07af 100644 --- a/docs/_quartodoc.yml +++ b/docs/_quartodoc.yml @@ -306,6 +306,7 @@ quartodoc: contents: - ui.panel_main - ui.panel_sidebar + - ui.nav - title: Experimental desc: "These methods are under consideration and are considered unstable. However, if there is a method you are excited about, please let us know!" contents: From 977c6d2b86f0af6b59ac18543e1aaeda7bb6a574 Mon Sep 17 00:00:00 2001 From: Carson Date: Thu, 14 Dec 2023 12:32:35 -0600 Subject: [PATCH 8/9] Change Nav -> NavPanel class names --- shiny/ui/_navs.py | 20 +++++++++---------- tests/playwright/shiny/TODO/navbar/app.py | 2 +- .../shiny/bugs/0696-resolve-id/app.py | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/shiny/ui/_navs.py b/shiny/ui/_navs.py index 336e16797..7a16b2823 100644 --- a/shiny/ui/_navs.py +++ b/shiny/ui/_navs.py @@ -42,7 +42,7 @@ # ----------------------------------------------------------------------------- # Navigation items # ----------------------------------------------------------------------------- -class Nav: +class NavPanel: nav: Tag content: Optional[Tag] @@ -103,7 +103,7 @@ def nav_panel( *args: TagChild, value: Optional[str] = None, icon: TagChild = None, -) -> Nav: +) -> NavPanel: """ Create a nav item pointing to some internal content. @@ -151,13 +151,13 @@ def nav_panel( role="tab", ) - return Nav( + return NavPanel( tags.li(link), div(*args, class_="tab-pane", role="tabpanel", data_value=value), ) -def nav_control(*args: TagChild) -> Nav: +def nav_control(*args: TagChild) -> NavPanel: """ Place a control in the navigation container. @@ -185,10 +185,10 @@ def nav_control(*args: TagChild) -> Nav: ------- See :func:`~shiny.ui.nav_panel` """ - return Nav(tags.li(*args)) + return NavPanel(tags.li(*args)) -def nav_spacer() -> Nav: +def nav_spacer() -> NavPanel: """ Create space between nav items. @@ -212,7 +212,7 @@ def nav_spacer() -> Nav: See :func:`~shiny.ui.nav_panel` """ - return Nav(tags.li(components_dependency(), class_="bslib-nav-spacer")) + return NavPanel(tags.li(components_dependency(), class_="bslib-nav-spacer")) class NavMenu: @@ -291,12 +291,12 @@ def menu_string_as_nav(x: str | NavSetArg) -> NavSetArg: else: nav = tags.li(x, class_="dropdown-header") - return Nav(nav) + return NavPanel(nav) def nav_menu( title: TagChild, - *args: Nav | str, + *args: NavPanel | str, value: Optional[str] = None, icon: TagChild = None, align: Literal["left", "right"] = "left", @@ -1404,7 +1404,7 @@ def nav( *args: TagChild, value: Optional[str] = None, icon: TagChild = None, -) -> Nav: +) -> NavPanel: """Deprecated. Please use `nav_panel()` instead of `nav()`.""" warn_deprecated( "`nav()` is deprecated. " diff --git a/tests/playwright/shiny/TODO/navbar/app.py b/tests/playwright/shiny/TODO/navbar/app.py index a6a8c3970..d1a750dbc 100644 --- a/tests/playwright/shiny/TODO/navbar/app.py +++ b/tests/playwright/shiny/TODO/navbar/app.py @@ -6,7 +6,7 @@ my_sidebar = ui.sidebar("Sidebar content", open="open", title="Sidebar title") -def nav_with_content(letter: str, prefix: str) -> ui._navs.Nav: +def nav_with_content(letter: str, prefix: str) -> ui._navs.NavPanel: return ui.nav_panel(letter, ui.markdown(f"`{prefix}`: tab {letter} content")) diff --git a/tests/playwright/shiny/bugs/0696-resolve-id/app.py b/tests/playwright/shiny/bugs/0696-resolve-id/app.py index a215f44fe..d1117b688 100644 --- a/tests/playwright/shiny/bugs/0696-resolve-id/app.py +++ b/tests/playwright/shiny/bugs/0696-resolve-id/app.py @@ -74,7 +74,7 @@ # ============================================================ @module.ui def mod_x_ui(label: str) -> ui.TagChild: - def ui_navs(label: str) -> list[ui._navs.Nav]: + def ui_navs(label: str) -> list[ui._navs.NavPanel]: return [ ui.nav_panel( letter.capitalize(), From b5f71fd804eca2b39c0834324c6cb08e0ea09459 Mon Sep 17 00:00:00 2001 From: Carson Date: Thu, 14 Dec 2023 12:45:47 -0600 Subject: [PATCH 9/9] Update new express test --- tests/playwright/shiny/shiny-express/page_default/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/playwright/shiny/shiny-express/page_default/app.py b/tests/playwright/shiny/shiny-express/page_default/app.py index 3ee2c02c3..6318139ef 100644 --- a/tests/playwright/shiny/shiny-express/page_default/app.py +++ b/tests/playwright/shiny/shiny-express/page_default/app.py @@ -29,7 +29,7 @@ with layout.column(width=6): # check height is below 300px - bounding box with layout.navset_card(id="express_navset_card_tab", type="tab"): - with layout.nav(title="Two"): + with layout.nav_panel(title="Two"): ... @@ -41,7 +41,7 @@ ("div", layout.div), ("span", layout.span), ]: - with layout.nav(title=fn_txt): + with layout.nav_panel(title=fn_txt): for i in range(3): with fn(): ui.HTML(f"{fn_txt} {i}")