Bladeren bron

allow passing page functions to ui.link and ui.open

Falko Schindler 2 jaren geleden
bovenliggende
commit
f89f0ba331
4 gewijzigde bestanden met toevoegingen van 22 en 15 verwijderingen
  1. 4 4
      main.py
  2. 5 5
      nicegui/elements/link.py
  3. 6 6
      nicegui/elements/open.py
  4. 7 0
      nicegui/globals.py

+ 4 - 4
main.py

@@ -594,8 +594,8 @@ with example(ui.page):
         ui.label('Welcome to the dark side')
         ui.link('Back to main page', '#page')
 
-    ui.link('Visit other page', 'other_page')
-    ui.link('Visit dark page', 'dark_page')
+    ui.link('Visit other page', other_page)
+    ui.link('Visit dark page', dark_page)
 
 with example(ui.open):
     @ui.page('/yet_another_page')
@@ -603,7 +603,7 @@ with example(ui.open):
         ui.label('Welcome to yet another page')
         ui.button('RETURN', on_click=lambda e: ui.open('#open', e.socket))
 
-    ui.button('REDIRECT', on_click=lambda e: ui.open('yet_another_page', e.socket))
+    ui.button('REDIRECT', on_click=lambda e: ui.open(yet_another_page, e.socket))
 
 add_route = '''#### Route
 
@@ -663,6 +663,6 @@ with example(sessions):
         global visits
         visits = ui.label()
 
-    ui.link('Visit session demo', 'session_demo')
+    ui.link('Visit session demo', session_demo)
 
 ui.run()

+ 5 - 5
nicegui/elements/link.py

@@ -1,22 +1,22 @@
-from typing import Union
+from typing import Callable, Union
 
 import justpy as jp
 
+from ..globals import find_route
 from .group import Group
-from .page import Page
 
 
 class Link(Group):
 
-    def __init__(self, text: str = '', target: Union[Page, str] = '#'):
+    def __init__(self, text: str = '', target: Union[Callable, str] = '#'):
         """Link
 
         Create a hyperlink.
 
         :param text: display text
-        :param target: page or string that is a an absolute URL or relative path from base URL
+        :param target: page function or string that is a an absolute URL or relative path from base URL
         """
-        href = target if isinstance(target, str) else target.route[1:]
+        href = target if isinstance(target, str) else find_route(target)[1:]
         view = jp.A(text=text, href=href, classes='underline text-blue', temp=False)
 
         super().__init__(view)

+ 6 - 6
nicegui/elements/open.py

@@ -1,13 +1,13 @@
-from typing import Optional, Union
+from typing import Callable, Optional, Union
 
 from justpy import WebPage
-from nicegui.elements.page import Page
 from starlette.websockets import WebSocket
 
+from ..globals import find_route
 from ..task_logger import create_task
 
 
-def open(self, target: Union[Page, str], socket: Optional[WebSocket] = None):
+def open(self, target: Union[Callable, str], socket: Optional[WebSocket] = None):
     """Open
 
     Can be used to programmatically trigger redirects for a specific client.
@@ -15,14 +15,14 @@ def open(self, target: Union[Page, str], socket: Optional[WebSocket] = None):
     Note that *all* clients (i.e. browsers) connected to the page will open the target URL *unless* a socket is specified.
     User events like button clicks provide such a socket.
 
-    :param target: page or string that is a an absolute URL or relative path from base URL
+    :param target: page function or string that is a an absolute URL or relative path from base URL
     :param socket: optional WebSocket defining the target client
     """
     create_task(open_async(self, target, socket), name='open_async')
 
 
-async def open_async(self, target: Union[Page, str], socket: Optional[WebSocket] = None):
-    path = target if isinstance(target, str) else target.route[1:]
+async def open_async(self, target: Union[Callable, str], socket: Optional[WebSocket] = None):
+    path = target if isinstance(target, str) else find_route(target)[1:]
     sockets = [socket] if socket else [s for socket_dict in WebPage.sockets.values() for s in socket_dict.values()]
     for socket in sockets:
         if not path:

+ 7 - 0
nicegui/globals.py

@@ -25,3 +25,10 @@ disconnect_handlers: List[Union[Callable, Awaitable]] = []
 startup_handlers: List[Union[Callable, Awaitable]] = []
 shutdown_handlers: List[Union[Callable, Awaitable]] = []
 pre_evaluation_succeeded: bool = False
+
+
+def find_route(function: Callable) -> str:
+    routes = [route for route, page_builder in page_builders.items() if page_builder.function == function]
+    if not routes:
+        raise ValueError(f'Invalid page function {function}')
+    return routes[0]