浏览代码

ui.open: make socket parameter optional; allow passing a page as target

Falko Schindler 3 年之前
父节点
当前提交
420da23b6b
共有 1 个文件被更改,包括 13 次插入6 次删除
  1. 13 6
      nicegui/elements/open.py

+ 13 - 6
nicegui/elements/open.py

@@ -1,17 +1,24 @@
+from typing import Optional, Union
+from justpy import WebPage
 from starlette.websockets import WebSocket
+
+from nicegui.elements.page import Page
 from ..task_logger import create_task
 
 
-def open(self, path: str, socket: WebSocket):
+def open(self, target: Union[Page, str], socket: Optional[WebSocket] = None):
     """
     Open
 
     Can be used to programmatically trigger redirects for a specific client.
 
-    :param path: string that is a relative URL path or an absolute URL
-    :param socket: WebSocket defining the target client
+    :param target: page or string that is a relative URL path or an absolute URL
+    :param socket: optional WebSocket defining the target client
     """
-    create_task(open_async(self, path, socket))
+    create_task(open_async(self, target, socket))
 
-async def open_async(self, path: str, socket: WebSocket):
-    await socket.send_json({'type': 'page_update', 'page_options': {'redirect': path}})
+async def open_async(self, target: Union[Page, str], socket: Optional[WebSocket]):
+    path = target if isinstance(target, str) else target.route
+    sockets = [s for socket_dict in WebPage.sockets.values() for s in socket_dict.values()]
+    for socket in sockets:
+        await socket.send_json({'type': 'page_update', 'page_options': {'redirect': path}})