Переглянути джерело

introduce `ValueChangeEventArguments.previous_value`

Falko Schindler 2 місяців тому
батько
коміт
b39e904965

+ 2 - 1
nicegui/elements/mixins/selectable_element.py

@@ -102,8 +102,9 @@ class SelectableElement(Element):
 
         :param selected: The new selection state.
         """
+        previous_value = self._props.get('selected')
         self._props['selected'] = selected
         self.update()
-        args = ValueChangeEventArguments(sender=self, client=self.client, value=self._props['selected'])
+        args = ValueChangeEventArguments(sender=self, client=self.client, value=selected, previous_value=previous_value)
         for handler in self._selection_change_handlers:
             handle_event(handler, args)

+ 4 - 1
nicegui/elements/mixins/value_element.py

@@ -108,10 +108,13 @@ class ValueElement(Element):
         self.value = value
 
     def _handle_value_change(self, value: Any) -> None:
+        previous_value = self._props.get(self.VALUE_PROP)
         self._props[self.VALUE_PROP] = self._value_to_model_value(value)
         if self._send_update_on_value_change:
             self.update()
-        args = ValueChangeEventArguments(sender=self, client=self.client, value=self._value_to_event_value(value))
+        args = ValueChangeEventArguments(sender=self, client=self.client,
+                                         value=self._value_to_event_value(value),
+                                         previous_value=self._value_to_event_value(previous_value))
         for handler in self._change_handlers:
             handle_event(handler, args)
 

+ 3 - 1
nicegui/elements/table.py

@@ -90,9 +90,11 @@ class Table(FilterElement, component='table.js'):
         self.on('selection', handle_selection, ['added', 'rows', 'keys'])
 
         def handle_pagination_change(e: GenericEventArguments) -> None:
+            previous_value = self.pagination
             self.pagination = e.args
             self.update()
-            arguments = ValueChangeEventArguments(sender=self, client=self.client, value=self.pagination)
+            arguments = ValueChangeEventArguments(sender=self, client=self.client,
+                                                  value=self.pagination, previous_value=previous_value)
             for handler in self._pagination_change_handlers:
                 handle_event(handler, arguments)
         self.on('update:pagination', handle_pagination_change)

+ 12 - 3
nicegui/elements/tree.py

@@ -62,21 +62,30 @@ class Tree(FilterElement):
                 self.update()
 
         def handle_selected(e: GenericEventArguments) -> None:
+            previous_value = self._props.get('selected')
             update_prop('selected', e.args)
+            args = ValueChangeEventArguments(sender=self, client=self.client,
+                                             value=e.args, previous_value=previous_value)
             for handler in self._select_handlers:
-                handle_event(handler, ValueChangeEventArguments(sender=self, client=self.client, value=e.args))
+                handle_event(handler, args)
         self.on('update:selected', handle_selected)
 
         def handle_expanded(e: GenericEventArguments) -> None:
+            previous_value = self._props.get('expanded')
             update_prop('expanded', e.args)
+            args = ValueChangeEventArguments(sender=self, client=self.client,
+                                             value=e.args, previous_value=previous_value)
             for handler in self._expand_handlers:
-                handle_event(handler, ValueChangeEventArguments(sender=self, client=self.client, value=e.args))
+                handle_event(handler, args)
         self.on('update:expanded', handle_expanded)
 
         def handle_ticked(e: GenericEventArguments) -> None:
+            previous_value = self._props.get('ticked')
             update_prop('ticked', e.args)
+            args = ValueChangeEventArguments(sender=self, client=self.client,
+                                             value=e.args, previous_value=previous_value)
             for handler in self._tick_handlers:
-                handle_event(handler, ValueChangeEventArguments(sender=self, client=self.client, value=e.args))
+                handle_event(handler, args)
         self.on('update:ticked', handle_ticked)
 
     def on_select(self, callback: Handler[ValueChangeEventArguments]) -> Self:

+ 1 - 0
nicegui/events.py

@@ -147,6 +147,7 @@ class MultiUploadEventArguments(UiEventArguments):
 @dataclass(**KWONLY_SLOTS)
 class ValueChangeEventArguments(UiEventArguments):
     value: Any
+    previous_value: Any
 
 
 @dataclass(**KWONLY_SLOTS)