Przeglądaj źródła

Merge pull request #8 from zauberzeug/feature/open

Feature/open
Falko Schindler 3 lat temu
rodzic
commit
4abf52c28f
5 zmienionych plików z 32 dodań i 1 usunięć
  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.label('Key events can be caught globally by using the keyboard element.')
     ui.checkbox('Track key events').bind_value_to(keyboard, 'active')
     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)
 ui.run(port=8080)

+ 5 - 1
nicegui/elements/button.py

@@ -25,7 +25,11 @@ class Button(Element):
         self.text = text
         self.text = text
         self.bind_text_to(self.view, 'label')
         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):
     def set_text(self, text: str):
         self.text = text
         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
 from pydantic import BaseModel
 import traceback
 import traceback
 from typing import Any, Awaitable, Callable, List, Optional, Union
 from typing import Any, Awaitable, Callable, List, Optional, Union
+from starlette.websockets import WebSocket
 
 
 from .elements.element import Element
 from .elements.element import Element
 from .task_logger import create_task
 from .task_logger import create_task
@@ -12,6 +13,7 @@ class EventArguments(BaseModel):
     class Config:
     class Config:
         arbitrary_types_allowed = True
         arbitrary_types_allowed = True
     sender: Element
     sender: Element
+    socket: Optional[WebSocket]
 
 
 class ClickEventArguments(EventArguments):
 class ClickEventArguments(EventArguments):
     pass
     pass

+ 1 - 0
nicegui/ui.py

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