Quellcode durchsuchen

Refactors ui.open to use the redirect of the main.html

Christoph Trappe vor 3 Jahren
Ursprung
Commit
6e9c9a4358
6 geänderte Dateien mit 30 neuen und 46 gelöschten Zeilen
  1. 2 2
      main.py
  2. 5 1
      nicegui/elements/button.py
  3. 0 15
      nicegui/elements/open.js
  4. 13 21
      nicegui/elements/open.py
  5. 10 4
      nicegui/events.py
  6. 0 3
      nicegui/nicegui.py

+ 2 - 2
main.py

@@ -436,8 +436,8 @@ with example(ui.keyboard):
 with example(ui.open):
     with ui.page('/yet_another_page') as other:
         ui.label('Welcome to yet another page')
-        ui.link('Back to main page', '/')
+        ui.button('BUTTON', on_click=lambda e: ui.open('/', e.socket))
 
-    ui.button('BUTTON', on_click=lambda e: ui.open('/yet_another_page', e))
+    ui.button('BUTTON', 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 view, event: handle_event(on_click, ClickEventArguments(sender=self, event=event)))
+        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

+ 0 - 15
nicegui/elements/open.js

@@ -1,15 +0,0 @@
-Vue.component("open", {
-  template: `<span v-bind:id="jp_props.id" :class="jp_props.classes" :style="jp_props.style"></span>`,
-  mounted() {
-    comp_dict[this.$props.jp_props.id] = this;
-    console.log("Mounted!");
-  },
-  methods: {
-    redirect(line) {
-      window.location.href = line;
-    },
-  },
-  props: {
-    jp_props: Object,
-  },
-});

+ 13 - 21
nicegui/elements/open.py

@@ -1,28 +1,20 @@
 import asyncio
-from .element import Element
-from .custom_view import CustomView
+from starlette.websockets import WebSocket
 
-class OpenView(CustomView):
 
-    def __init__(self):
-        super().__init__('open', __file__)
+class Open:
 
-class Open(Element):
-
-    def __init__(self):
+    def __init__(self, path: str, socket: WebSocket):
         """
-        Open Element
+        Open
 
-        Adds a global element to programmatically trigger redirects for a specific client.
+        Can be used to programmatically trigger redirects for a specific client.
         """
-        super().__init__(OpenView())
-        self.view.initialize()
-
-    async def redirect_async(self, path: str, event_arguments):
-        websocket = event_arguments.event.get('websocket')
-        await self.view.run_method(f'redirect("{path}")', websocket)
-
-    def redirect(self, path: str = None, event_arguments=None):
-        asyncio.get_event_loop().create_task(self.redirect_async(path, event_arguments))
-
-    __call__ = redirect
+        asyncio.get_event_loop().create_task(self.redirect_async(path, socket))
+
+    @staticmethod
+    async def redirect_async(path: str, socket: WebSocket):
+        # Depends on the 'page_update' in the main.html.
+        await socket.send_json({'type': 'page_update', 'page_options': {'redirect': path}})
+        # So the page itself does not update, return True not None
+        return True

+ 10 - 4
nicegui/events.py

@@ -1,9 +1,10 @@
 import asyncio
 from inspect import signature
+from justpy.htmlcomponents import HTMLBaseComponent
 from pydantic import BaseModel
 import traceback
-from typing import Any, Awaitable, Callable, Dict, List, Optional, Union
-
+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
 
@@ -11,7 +12,7 @@ class EventArguments(BaseModel):
     class Config:
         arbitrary_types_allowed = True
     sender: Element
-    event: Dict
+    socket: WebSocket
 
 class ClickEventArguments(EventArguments):
     pass
@@ -198,7 +199,10 @@ class KeyEventArguments(EventArguments):
     modifiers: KeyboardModifiers
 
 
-def handle_event(handler: Optional[Union[Callable, Awaitable]], arguments: EventArguments):
+def handle_event(handler: Optional[Union[Callable, Awaitable]],
+                 arguments: EventArguments,
+                 *,
+                 update: Optional[HTMLBaseComponent] = None):
     try:
         if handler is None:
             return
@@ -208,6 +212,8 @@ def handle_event(handler: Optional[Union[Callable, Awaitable]], arguments: Event
             async def async_handler():
                 try:
                     await result
+                    if update is not None:
+                        await update.update()
                 except Exception:
                     traceback.print_exc()
             create_task(async_handler(), name=str(handler))

+ 0 - 3
nicegui/nicegui.py

@@ -35,7 +35,4 @@ ui = Ui()
 
 page = ui.page('/')
 page.__enter__()
-
-ui.open = ui.open()
-
 jp.justpy(lambda: page, start_server=False)