فهرست منبع

reload page when new dependencies are added dynamically

Falko Schindler 2 سال پیش
والد
کامیت
e64569d094
4فایلهای تغییر یافته به همراه21 افزوده شده و 22 حذف شده
  1. 7 2
      nicegui/elements/chart.py
  2. 2 2
      nicegui/elements/element.py
  3. 6 1
      nicegui/elements/table.py
  4. 6 17
      nicegui/routes.py

+ 7 - 2
nicegui/elements/chart.py

@@ -1,7 +1,9 @@
+import asyncio
 from typing import Dict
 from typing import Dict
 
 
 import justpy as jp
 import justpy as jp
 
 
+from ..task_logger import create_task
 from .element import Element
 from .element import Element
 
 
 jp.template_options['highcharts'] = False
 jp.template_options['highcharts'] = False
@@ -14,9 +16,12 @@ class Chart(Element):
 
 
         An element to create a chart using `Highcharts <https://www.highcharts.com/>`_.
         An element to create a chart using `Highcharts <https://www.highcharts.com/>`_.
 
 
-        :param options: dictionary of highcharts options
+        :param options: dictionary of Highcharts options
         """
         """
         view = jp.HighCharts(temp=False)
         view = jp.HighCharts(temp=False)
         view.options = self.options = jp.Dict(**options)
         view.options = self.options = jp.Dict(**options)
-        jp.template_options['highcharts'] = True
         super().__init__(view)
         super().__init__(view)
+
+        if not jp.template_options['highcharts'] and asyncio.get_event_loop().is_running():
+            create_task(self.page.run_javascript('location.reload()'))
+        jp.template_options['highcharts'] = True

+ 2 - 2
nicegui/elements/element.py

@@ -6,7 +6,7 @@ import justpy as jp
 
 
 from .. import globals
 from .. import globals
 from ..binding import BindableProperty, bind_from, bind_to
 from ..binding import BindableProperty, bind_from, bind_to
-from ..page import get_current_view
+from ..page import Page, get_current_view
 from ..task_logger import create_task
 from ..task_logger import create_task
 
 
 
 
@@ -27,7 +27,7 @@ class Element:
         self.parent_view.add(view)
         self.parent_view.add(view)
         self.view = view
         self.view = view
         assert len(self.parent_view.pages) == 1
         assert len(self.parent_view.pages) == 1
-        self.page = list(self.parent_view.pages.values())[0]
+        self.page: Page = list(self.parent_view.pages.values())[0]
         self.view.add_page(self.page)
         self.view.add_page(self.page)
 
 
         self.visible = True
         self.visible = True

+ 6 - 1
nicegui/elements/table.py

@@ -1,7 +1,9 @@
+import asyncio
 from typing import Dict
 from typing import Dict
 
 
 import justpy as jp
 import justpy as jp
 
 
+from ..task_logger import create_task
 from .element import Element
 from .element import Element
 
 
 jp.template_options['aggrid'] = False
 jp.template_options['aggrid'] = False
@@ -18,5 +20,8 @@ class Table(Element):
         """
         """
         view = jp.AgGrid(temp=False)
         view = jp.AgGrid(temp=False)
         view.options = self.options = jp.Dict(**options)
         view.options = self.options = jp.Dict(**options)
-        jp.template_options['aggrid'] = True
         super().__init__(view)
         super().__init__(view)
+
+        if not jp.template_options['aggrid'] and asyncio.get_event_loop().is_running():
+            create_task(self.page.run_javascript('location.reload()'))
+        jp.template_options['aggrid'] = True

+ 6 - 17
nicegui/routes.py

@@ -67,14 +67,11 @@ def add_dependencies(py_filepath: str, dependencies: List[str] = []) -> None:
         return
         return
     globals.dependencies[py_filepath] = dependencies
     globals.dependencies[py_filepath] = dependencies
 
 
-    new_dependencies: List[str] = []
-
     vue_filepath = os.path.splitext(os.path.realpath(py_filepath))[0] + '.js'
     vue_filepath = os.path.splitext(os.path.realpath(py_filepath))[0] + '.js'
     if vue_filepath not in jp.component_file_list:
     if vue_filepath not in jp.component_file_list:
         filename = os.path.basename(vue_filepath)
         filename = os.path.basename(vue_filepath)
         jp.app.routes.insert(0, Route(f'/{filename}', lambda _: FileResponse(vue_filepath)))
         jp.app.routes.insert(0, Route(f'/{filename}', lambda _: FileResponse(vue_filepath)))
         jp.component_file_list += [filename]
         jp.component_file_list += [filename]
-        new_dependencies.append(filename)
 
 
     for dependency in dependencies:
     for dependency in dependencies:
         is_remote = dependency.startswith('http://') or dependency.startswith('https://')
         is_remote = dependency.startswith('http://') or dependency.startswith('https://')
@@ -85,19 +82,11 @@ def add_dependencies(py_filepath: str, dependencies: List[str] = []) -> None:
                 filepath = f'{os.path.dirname(vue_filepath)}/{src}'
                 filepath = f'{os.path.dirname(vue_filepath)}/{src}'
                 route = Route(f'/{src}', lambda _, filepath=filepath: FileResponse(filepath))
                 route = Route(f'/{src}', lambda _, filepath=filepath: FileResponse(filepath))
                 jp.app.routes.insert(0, route)
                 jp.app.routes.insert(0, route)
-            new_dependencies.append(src)
 
 
     if asyncio.get_event_loop().is_running():
     if asyncio.get_event_loop().is_running():
-        create_task(inject_dependencies(new_dependencies))
-
-
-async def inject_dependencies(dependencies: List[str]) -> None:
-    for page in get_current_view().pages.values():
-        assert isinstance(page, Page)
-        for src in dependencies:
-            await page.await_javascript(f'''
-            let script = document.createElement("script");
-            script.src = "{src}";
-            document.body.append(script);
-            ''')
-        await page.update()
+        # NOTE: if new dependencies are added after starting the server, we need to reload the page on connected clients
+        async def reload() -> None:
+            for page in get_current_view().pages.values():
+                assert isinstance(page, Page)
+                await page.await_javascript('location.reload()')
+        create_task(reload())