Explorar el Código

Merge pull request #8 from zauberzeug/feature/open

Feature/open
Falko Schindler hace 3 años
padre
commit
4abf52c28f
Se han modificado 5 ficheros con 32 adiciones y 1 borrados
  1. 7 0
      main.py
  2. 5 1
      nicegui/elements/button.py
  3. 17 0
      nicegui/elements/open.py
  4. 2 0
      nicegui/events.py
  5. 1 0
      nicegui/ui.py

+ 7 - 0
main.py

@@ -433,4 +433,11 @@ with example(ui.keyboard):
     ui.label('Key events can be caught globally by using the keyboard element.')
     ui.checkbox('Track key events').bind_value_to(keyboard, 'active')
 
+with example(ui.open):
+    with ui.page('/yet_another_page') as other:
+        ui.label('Welcome to yet another page')
+        ui.button('RETURN', on_click=lambda e: ui.open('/', e.socket))
+
+    ui.button('REDIRECT', on_click=lambda e: ui.open('/yet_another_page', e.socket))
+
 ui.run(port=8080)

+ 5 - 1
nicegui/elements/button.py

@@ -25,7 +25,11 @@ class Button(Element):
         self.text = text
         self.bind_text_to(self.view, 'label')
 
-        view.on('click', lambda *_: handle_event(on_click, ClickEventArguments(sender=self), update=self.parent_view))
+        def process_event(view, event):
+            socket = event.get('websocket')
+            handle_event(on_click, ClickEventArguments(sender=self, socket=socket), update=self.parent_view)
+
+        view.on('click', process_event)
 
     def set_text(self, text: str):
         self.text = text

+ 17 - 0
nicegui/elements/open.py

@@ -0,0 +1,17 @@
+from starlette.websockets import WebSocket
+from ..task_logger import create_task
+
+
+def open(self, path: str, socket: WebSocket):
+    """
+    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
+    """
+    create_task(open_async(path, socket))
+
+async def open_async(path: str, socket: WebSocket):
+    await socket.send_json({'type': 'page_update', 'page_options': {'redirect': path}})

+ 2 - 0
nicegui/events.py

@@ -4,6 +4,7 @@ from justpy.htmlcomponents import HTMLBaseComponent
 from pydantic import BaseModel
 import traceback
 from typing import Any, Awaitable, Callable, List, Optional, Union
+from starlette.websockets import WebSocket
 
 from .elements.element import Element
 from .task_logger import create_task
@@ -12,6 +13,7 @@ class EventArguments(BaseModel):
     class Config:
         arbitrary_types_allowed = True
     sender: Element
+    socket: Optional[WebSocket]
 
 class ClickEventArguments(EventArguments):
     pass

+ 1 - 0
nicegui/ui.py

@@ -20,6 +20,7 @@ class Ui:
     from .elements.menu_separator import MenuSeparator as menu_separator
     from .elements.notify import Notify as notify
     from .elements.number import Number as number
+    from .elements.open import open, open_async
     from .elements.page import Page as page
     from .elements.radio import Radio as radio
     from .elements.scene import Scene as scene