Procházet zdrojové kódy

allow filtering event arguments again

Falko Schindler před 1 rokem
rodič
revize
82a1c17a99

+ 1 - 6
nicegui/element.py

@@ -1,7 +1,6 @@
 from __future__ import annotations
 
 import re
-import warnings
 from copy import deepcopy
 from typing import TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Optional, Union
 
@@ -222,14 +221,10 @@ class Element(Visibility):
         :param trailing_events: whether to trigger the event handler after the last event occurrence (default: `True`)
         """
         if handler:
-            if args and '*' in args:
-                url = f'https://github.com/zauberzeug/nicegui/issues/644'
-                warnings.warn(DeprecationWarning(f'Event args "*" is deprecated, omit this parameter instead ({url})'))
-                args = None
             listener = EventListener(
                 element_id=self.id,
                 type=type,
-                args=args,
+                args=[args] if args is None or args == [] or isinstance(args[0], str) else args,
                 handler=handler,
                 throttle=throttle,
                 leading_events=leading_events,

+ 2 - 2
nicegui/elements/button.py

@@ -35,7 +35,7 @@ class Button(TextElement, DisableableElement, BackgroundColorElement):
             self._props['icon'] = icon
 
         if on_click:
-            self.on('click', lambda _: handle_event(on_click, ClickEventArguments(sender=self, client=self.client)))
+            self.on('click', lambda _: handle_event(on_click, ClickEventArguments(sender=self, client=self.client)), [])
 
     def _text_to_model_text(self, text: str) -> None:
         self._props['label'] = text
@@ -43,6 +43,6 @@ class Button(TextElement, DisableableElement, BackgroundColorElement):
     async def clicked(self) -> None:
         """Wait until the button is clicked."""
         event = asyncio.Event()
-        self.on('click', event.set)
+        self.on('click', event.set, [])
         await self.client.connected()
         await event.wait()

+ 3 - 3
nicegui/elements/joystick.py

@@ -52,6 +52,6 @@ class Joystick(Element):
                                                         client=self.client,
                                                         action='end'))
 
-        self.on('start', handle_start)
-        self.on('move', handle_move, args=['data'], throttle=throttle),
-        self.on('end', handle_end)
+        self.on('start', handle_start, [])
+        self.on('move', handle_move, ['data'], throttle=throttle),
+        self.on('end', handle_end, [])

+ 1 - 1
nicegui/event_listener.py

@@ -12,7 +12,7 @@ class EventListener:
     id: str = field(init=False)
     element_id: int
     type: str
-    args: Optional[List[str]]
+    args: List[Optional[List[str]]]
     handler: Callable
     throttle: float
     leading_events: bool

+ 16 - 7
nicegui/templates/index.html

@@ -44,15 +44,24 @@
       const loaded_components = new Set();
       const elements = {{ elements | safe }};
 
-      function stringifyEventArgs(args) {
-        return args.map(arg => {
+      function stringifyEventArgs(args, event_args) {
+        return args.map((arg, i) => {
+          let filtered = {};
+          if (typeof arg !== 'object' || arg === null || Array.isArray(arg)) {
+            filtered = arg;
+          }
+          else {
+            for (let k in arg) {
+              if (event_args[i] === undefined || event_args[i] === null || event_args[i].includes(k)) {
+                filtered[k] = arg[k];
+              }
+            }
+          }
           if (arg instanceof Event) {
-            const obj = {};
-            for (let k in arg) obj[k] = arg[k];
-            return JSON.stringify(obj, (k, v) => v instanceof Node || v instanceof Window ? undefined : v);
+            return JSON.stringify(filtered, (k, v) => v instanceof Node || v instanceof Window ? undefined : v);
           }
           else {
-            return JSON.stringify(arg);
+            return JSON.stringify(filtered);
           }
         });
       }
@@ -119,7 +128,7 @@
             const data = {
               id: element.id,
               listener_id: event.listener_id,
-              args: stringifyEventArgs(args),
+              args: stringifyEventArgs(args, event.args),
             };
             const emitter = () => window.socket.emit("event", data);
             throttle(emitter, event.throttle, event.leading_events, event.trailing_events, event.listener_id);