|
31 | 31 | from ._error import ErrorMiddleware |
32 | 32 | from ._shinyenv import is_pyodide |
33 | 33 | from ._utils import guess_mime_type, is_async_callable, sort_keys_length |
| 34 | +from .bookmark import _global as bookmark_global_state |
| 35 | +from .bookmark._global import as_bookmark_dir_fn |
34 | 36 | from .bookmark._restore_state import RestoreContext, restore_context |
35 | | -from .bookmark._types import BookmarkStore |
| 37 | +from .bookmark._types import ( |
| 38 | + BookmarkDirFn, |
| 39 | + BookmarkRestoreDirFn, |
| 40 | + BookmarkSaveDirFn, |
| 41 | + BookmarkStore, |
| 42 | +) |
36 | 43 | from .html_dependencies import jquery_deps, require_deps, shiny_deps |
37 | 44 | from .http_staticfiles import FileResponse, StaticFiles |
38 | 45 | from .session._session import AppSession, Inputs, Outputs, Session, session_context |
@@ -109,12 +116,10 @@ def server(input: Inputs, output: Outputs, session: Session): |
109 | 116 | ui: RenderedHTML | Callable[[Request], Tag | TagList] |
110 | 117 | server: Callable[[Inputs, Outputs, Session], None] |
111 | 118 |
|
| 119 | + _bookmark_save_dir_fn: BookmarkSaveDirFn | None |
| 120 | + _bookmark_restore_dir_fn: BookmarkRestoreDirFn | None |
112 | 121 | _bookmark_store: BookmarkStore |
113 | 122 |
|
114 | | - @property |
115 | | - def bookmark_store(self) -> BookmarkStore: |
116 | | - return self._bookmark_store |
117 | | - |
118 | 123 | def __init__( |
119 | 124 | self, |
120 | 125 | ui: Tag | TagList | Callable[[Request], Tag | TagList] | Path, |
@@ -144,7 +149,7 @@ def __init__( |
144 | 149 | "`server` must have 1 (Inputs) or 3 parameters (Inputs, Outputs, Session)" |
145 | 150 | ) |
146 | 151 |
|
147 | | - self._bookmark_store = bookmark_store |
| 152 | + self._init_bookmarking(bookmark_store=bookmark_store) |
148 | 153 |
|
149 | 154 | self._debug: bool = debug |
150 | 155 |
|
@@ -369,7 +374,9 @@ async def _on_root_request_cb(self, request: Request) -> Response: |
369 | 374 | if self.bookmark_store == "disable": |
370 | 375 | restore_ctx = RestoreContext() |
371 | 376 | else: |
372 | | - restore_ctx = await RestoreContext.from_query_string(request.url.query) |
| 377 | + restore_ctx = await RestoreContext.from_query_string( |
| 378 | + request.url.query, app=self |
| 379 | + ) |
373 | 380 |
|
374 | 381 | with restore_context(restore_ctx): |
375 | 382 | if callable(self.ui): |
@@ -492,6 +499,25 @@ def _render_page_from_file(self, file: Path, lib_prefix: str) -> RenderedHTML: |
492 | 499 |
|
493 | 500 | return rendered |
494 | 501 |
|
| 502 | + # ========================================================================== |
| 503 | + # Bookmarking |
| 504 | + # ========================================================================== |
| 505 | + |
| 506 | + def _init_bookmarking(self, *, bookmark_store: BookmarkStore) -> None: |
| 507 | + self._bookmark_save_dir_fn = bookmark_global_state.bookmark_save_dir |
| 508 | + self._bookmark_restore_dir_fn = bookmark_global_state.bookmark_restore_dir |
| 509 | + self._bookmark_store = bookmark_store |
| 510 | + |
| 511 | + @property |
| 512 | + def bookmark_store(self) -> BookmarkStore: |
| 513 | + return self._bookmark_store |
| 514 | + |
| 515 | + def set_bookmark_save_dir_fn(self, bookmark_save_dir_fn: BookmarkDirFn): |
| 516 | + self._bookmark_save_dir_fn = as_bookmark_dir_fn(bookmark_save_dir_fn) |
| 517 | + |
| 518 | + def set_bookmark_restore_dir_fn(self, bookmark_restore_dir_fn: BookmarkDirFn): |
| 519 | + self._bookmark_restore_dir_fn = as_bookmark_dir_fn(bookmark_restore_dir_fn) |
| 520 | + |
495 | 521 |
|
496 | 522 | def is_uifunc(x: Path | Tag | TagList | Callable[[Request], Tag | TagList]) -> bool: |
497 | 523 | if ( |
|
0 commit comments