Skip to content

Commit f59adeb

Browse files
committed
Add bookmarking capabilities for sidebar and accordion
1 parent 9d56dd8 commit f59adeb

File tree

4 files changed

+84
-3
lines changed

4 files changed

+84
-3
lines changed

shiny/ui/_accordion.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
from htmltools import Tag, TagAttrs, TagAttrValue, TagChild, css, tags
66

7+
from shiny.bookmark._restore_state import restore_input
8+
79
from .._docstring import add_example
810
from .._namespaces import resolve_id_or_none
911
from .._utils import drop_none, private_random_id
@@ -274,7 +276,7 @@ def accordion(
274276
for panel, open in zip(panels, is_open):
275277
panel._accordion_id = accordion_id
276278
panel._is_multiple = multiple
277-
panel._is_open = open
279+
panel._is_open = restore_input(accordion_id, open)
278280

279281
panel_tags = [panel.resolve() for panel in panels]
280282

shiny/ui/_sidebar.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
tags,
1717
)
1818

19+
from shiny.bookmark._restore_state import restore_input
20+
1921
from .._docstring import add_example, no_example
2022
from .._namespaces import resolve_id_or_none
2123
from .._typing_extensions import TypedDict
@@ -545,13 +547,15 @@ def sidebar(
545547

546548
attrs, children = consolidate_attrs(*args, **kwargs)
547549

550+
resolved_id = resolve_id_or_none(id)
551+
548552
return Sidebar(
549553
children=children,
550554
attrs=attrs,
551555
width=width,
552556
position=position,
553-
open=open,
554-
id=id,
557+
open=restore_input(resolved_id, open),
558+
id=resolved_id,
555559
title=title,
556560
fg=fg,
557561
bg=bg,
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from shiny.express import app_opts, expressify, input, module, render, session, ui
2+
3+
app_opts(bookmark_store="url")
4+
5+
6+
@expressify
7+
def my_accordion(**kwargs):
8+
with ui.accordion(**kwargs):
9+
for letter in "ABCDE":
10+
with ui.accordion_panel(f"Section {letter}"):
11+
f"Some narrative for section {letter}"
12+
13+
14+
ui.h2("Accordion with bookmarking")
15+
16+
with ui.card():
17+
ui.h3("Accordion non-module bookmarking")
18+
my_accordion(multiple=False, id="acc_single")
19+
20+
@render.text
21+
def accordion_global():
22+
return f"input.accordion(): {input.acc_single()}"
23+
24+
# Module section in sidebar
25+
@module
26+
def accordion_module(input, output, session):
27+
my_accordion(multiple=False, id="acc_mod")
28+
29+
@render.text
30+
def accordion_module():
31+
return f"input.acc_mod(): {input.acc_mod()}"
32+
33+
ui.h3("Accordion module bookmarking")
34+
accordion_module("first")
35+
36+
ui.input_bookmark_button()
37+
38+
39+
@session.bookmark.on_bookmarked
40+
async def _(url: str):
41+
await session.bookmark.update_query_string(url)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from shiny.express import app_opts, input, module, render, session, ui
2+
3+
app_opts(bookmark_store="url")
4+
5+
with ui.card():
6+
with ui.layout_sidebar():
7+
with ui.sidebar(id="sidebar_left", open="open", bg="#f74f7a"):
8+
"Left sidebar content"
9+
10+
@render.text
11+
def state_left():
12+
return f"input.sidebar_left(): {input.sidebar_left()}"
13+
14+
# Module section in sidebar
15+
@module
16+
def sidebar_module(input, output, session):
17+
with ui.layout_sidebar():
18+
with ui.sidebar(
19+
id="sidebar_right", position="right", open="open", bg="#4fa3f7"
20+
):
21+
"Right sidebar content"
22+
23+
@render.text
24+
def state_right():
25+
return f"input.sidebar_right(): {input.sidebar_right()}"
26+
27+
sidebar_module("first")
28+
29+
ui.input_bookmark_button()
30+
31+
32+
@session.bookmark.on_bookmarked
33+
async def _(url: str):
34+
await session.bookmark.update_query_string(url)

0 commit comments

Comments
 (0)