Remove wrong event handlers (#4136)

* remove wrong target value

* add keyboard event

* simplify empty ones

* remove events from text_area

* empty tuples are empty bruh

* dangit darglint
This commit is contained in:
Khaleel Al-Adhami 2024-10-09 13:25:41 -07:00 committed by GitHub
parent 60b6d4e7f2
commit 91ab8ac574
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 240 additions and 164 deletions

View File

@ -8,7 +8,7 @@ from __future__ import annotations
from typing import Literal from typing import Literal
from reflex.components.component import Component from reflex.components.component import Component
from reflex.event import EventHandler from reflex.event import EventHandler, empty_event
from reflex.vars.base import LiteralVar, Var from reflex.vars.base import LiteralVar, Var
@ -35,13 +35,13 @@ class Script(Component):
) )
# Triggered when the script is loading # Triggered when the script is loading
on_load: EventHandler[lambda: []] on_load: EventHandler[empty_event]
# Triggered when the script has loaded # Triggered when the script has loaded
on_ready: EventHandler[lambda: []] on_ready: EventHandler[empty_event]
# Triggered when the script has errored # Triggered when the script has errored
on_error: EventHandler[lambda: []] on_error: EventHandler[empty_event]
@classmethod @classmethod
def create(cls, *children, **props) -> Component: def create(cls, *children, **props) -> Component:

View File

@ -8,7 +8,7 @@ from typing import Any, Dict, List, Literal, Optional, Union
from reflex.base import Base from reflex.base import Base
from reflex.components.component import Component, NoSSRComponent from reflex.components.component import Component, NoSSRComponent
from reflex.components.literals import LiteralRowMarker from reflex.components.literals import LiteralRowMarker
from reflex.event import EventHandler from reflex.event import EventHandler, empty_event
from reflex.utils import console, format, types from reflex.utils import console, format, types
from reflex.utils.imports import ImportDict, ImportVar from reflex.utils.imports import ImportDict, ImportVar
from reflex.utils.serializers import serializer from reflex.utils.serializers import serializer
@ -262,10 +262,10 @@ class DataEditor(NoSSRComponent):
on_finished_editing: EventHandler[lambda new_value, movement: [new_value, movement]] on_finished_editing: EventHandler[lambda new_value, movement: [new_value, movement]]
# Fired when a row is appended. # Fired when a row is appended.
on_row_appended: EventHandler[lambda: []] on_row_appended: EventHandler[empty_event]
# Fired when the selection is cleared. # Fired when the selection is cleared.
on_selection_cleared: EventHandler[lambda: []] on_selection_cleared: EventHandler[empty_event]
# Fired when a column is resized. # Fired when a column is resized.
on_column_resize: EventHandler[lambda col, width: [col, width]] on_column_resize: EventHandler[lambda col, width: [col, width]]

View File

@ -10,7 +10,13 @@ from jinja2 import Environment
from reflex.components.el.element import Element from reflex.components.el.element import Element
from reflex.components.tags.tag import Tag from reflex.components.tags.tag import Tag
from reflex.constants import Dirs, EventTriggers from reflex.constants import Dirs, EventTriggers
from reflex.event import EventChain, EventHandler, prevent_default from reflex.event import (
EventChain,
EventHandler,
input_event,
key_event,
prevent_default,
)
from reflex.utils.imports import ImportDict from reflex.utils.imports import ImportDict
from reflex.vars import VarData from reflex.vars import VarData
from reflex.vars.base import LiteralVar, Var from reflex.vars.base import LiteralVar, Var
@ -345,19 +351,19 @@ class Input(BaseHTML):
value: Var[Union[str, int, float]] value: Var[Union[str, int, float]]
# Fired when the input value changes # Fired when the input value changes
on_change: EventHandler[lambda e0: [e0.target.value]] on_change: EventHandler[input_event]
# Fired when the input gains focus # Fired when the input gains focus
on_focus: EventHandler[lambda e0: [e0.target.value]] on_focus: EventHandler[input_event]
# Fired when the input loses focus # Fired when the input loses focus
on_blur: EventHandler[lambda e0: [e0.target.value]] on_blur: EventHandler[input_event]
# Fired when a key is pressed down # Fired when a key is pressed down
on_key_down: EventHandler[lambda e0: [e0.key]] on_key_down: EventHandler[key_event]
# Fired when a key is released # Fired when a key is released
on_key_up: EventHandler[lambda e0: [e0.key]] on_key_up: EventHandler[key_event]
class Label(BaseHTML): class Label(BaseHTML):
@ -496,7 +502,7 @@ class Select(BaseHTML):
size: Var[Union[str, int, bool]] size: Var[Union[str, int, bool]]
# Fired when the select value changes # Fired when the select value changes
on_change: EventHandler[lambda e0: [e0.target.value]] on_change: EventHandler[input_event]
AUTO_HEIGHT_JS = """ AUTO_HEIGHT_JS = """
@ -586,19 +592,19 @@ class Textarea(BaseHTML):
wrap: Var[Union[str, int, bool]] wrap: Var[Union[str, int, bool]]
# Fired when the input value changes # Fired when the input value changes
on_change: EventHandler[lambda e0: [e0.target.value]] on_change: EventHandler[input_event]
# Fired when the input gains focus # Fired when the input gains focus
on_focus: EventHandler[lambda e0: [e0.target.value]] on_focus: EventHandler[input_event]
# Fired when the input loses focus # Fired when the input loses focus
on_blur: EventHandler[lambda e0: [e0.target.value]] on_blur: EventHandler[input_event]
# Fired when a key is pressed down # Fired when a key is pressed down
on_key_down: EventHandler[lambda e0: [e0.key]] on_key_down: EventHandler[key_event]
# Fired when a key is released # Fired when a key is released
on_key_up: EventHandler[lambda e0: [e0.key]] on_key_up: EventHandler[key_event]
def _exclude_props(self) -> list[str]: def _exclude_props(self) -> list[str]:
return super()._exclude_props() + [ return super()._exclude_props() + [

View File

@ -2,7 +2,7 @@
from typing import Any, Literal, Optional, Union from typing import Any, Literal, Optional, Union
from reflex.event import EventHandler from reflex.event import EventHandler, empty_event
from reflex.utils import types from reflex.utils import types
from reflex.vars.base import Var from reflex.vars.base import Var
@ -56,10 +56,10 @@ class Image(NextComponent):
blurDataURL: Var[str] blurDataURL: Var[str]
# Fires when the image has loaded. # Fires when the image has loaded.
on_load: EventHandler[lambda: []] on_load: EventHandler[empty_event]
# Fires when the image has an error. # Fires when the image has an error.
on_error: EventHandler[lambda: []] on_error: EventHandler[empty_event]
@classmethod @classmethod
def create( def create(

View File

@ -11,6 +11,7 @@ from reflex.components.radix.primitives.base import RadixPrimitiveComponent
from reflex.components.radix.themes.base import Theme from reflex.components.radix.themes.base import Theme
from reflex.components.radix.themes.layout.flex import Flex from reflex.components.radix.themes.layout.flex import Flex
from reflex.event import EventHandler from reflex.event import EventHandler
from reflex.utils import console
from reflex.vars.base import Var from reflex.vars.base import Var
@ -127,20 +128,20 @@ class DrawerContent(DrawerComponent):
base_style.update(style) base_style.update(style)
return {"css": base_style} return {"css": base_style}
# Fired when the drawer content is opened. # Fired when the drawer content is opened. Deprecated.
on_open_auto_focus: EventHandler[lambda e0: [e0.target.value]] on_open_auto_focus: EventHandler[lambda e0: []]
# Fired when the drawer content is closed. # Fired when the drawer content is closed. Deprecated.
on_close_auto_focus: EventHandler[lambda e0: [e0.target.value]] on_close_auto_focus: EventHandler[lambda e0: []]
# Fired when the escape key is pressed. # Fired when the escape key is pressed. Deprecated.
on_escape_key_down: EventHandler[lambda e0: [e0.target.value]] on_escape_key_down: EventHandler[lambda e0: []]
# Fired when the pointer is down outside the drawer content. # Fired when the pointer is down outside the drawer content. Deprecated.
on_pointer_down_outside: EventHandler[lambda e0: [e0.target.value]] on_pointer_down_outside: EventHandler[lambda e0: []]
# Fired when interacting outside the drawer content. # Fired when interacting outside the drawer content. Deprecated.
on_interact_outside: EventHandler[lambda e0: [e0.target.value]] on_interact_outside: EventHandler[lambda e0: []]
@classmethod @classmethod
def create(cls, *children, **props): def create(cls, *children, **props):
@ -157,6 +158,23 @@ class DrawerContent(DrawerComponent):
Returns: Returns:
The drawer content. The drawer content.
""" """
deprecated_properties = [
"on_open_auto_focus",
"on_close_auto_focus",
"on_escape_key_down",
"on_pointer_down_outside",
"on_interact_outside",
]
for prop in deprecated_properties:
if prop in props:
console.deprecate(
feature_name="drawer content events",
reason=f"The `{prop}` event is deprecated and will be removed in 0.7.0.",
deprecation_version="0.6.3",
removal_version="0.7.0",
)
comp = super().create(*children, **props) comp = super().create(*children, **props)
return Theme.create(comp) return Theme.create(comp)

View File

@ -8,7 +8,7 @@ from reflex.components.component import ComponentNamespace
from reflex.components.core.debounce import DebounceInput from reflex.components.core.debounce import DebounceInput
from reflex.components.el.elements.forms import Form as HTMLForm from reflex.components.el.elements.forms import Form as HTMLForm
from reflex.components.radix.themes.components.text_field import TextFieldRoot from reflex.components.radix.themes.components.text_field import TextFieldRoot
from reflex.event import EventHandler from reflex.event import EventHandler, empty_event
from reflex.vars.base import Var from reflex.vars.base import Var
from .base import RadixPrimitiveComponentWithClassName from .base import RadixPrimitiveComponentWithClassName
@ -28,7 +28,7 @@ class FormRoot(FormComponent, HTMLForm):
alias = "RadixFormRoot" alias = "RadixFormRoot"
# Fired when the errors are cleared. # Fired when the errors are cleared.
on_clear_server_errors: EventHandler[lambda: []] on_clear_server_errors: EventHandler[empty_event]
def add_style(self) -> dict[str, Any] | None: def add_style(self) -> dict[str, Any] | None:
"""Add style to the component. """Add style to the component.

View File

@ -164,7 +164,7 @@ class DropdownMenuSub(RadixThemesComponent):
default_open: Var[bool] default_open: Var[bool]
# Fired when the open state changes. # Fired when the open state changes.
on_open_change: EventHandler[lambda e0: [e0.target.value]] on_open_change: EventHandler[lambda e0: [e0]]
class DropdownMenuSubContent(RadixThemesComponent): class DropdownMenuSubContent(RadixThemesComponent):
@ -240,7 +240,7 @@ class DropdownMenuItem(RadixThemesComponent):
_valid_parents: List[str] = ["DropdownMenuContent", "DropdownMenuSubContent"] _valid_parents: List[str] = ["DropdownMenuContent", "DropdownMenuSubContent"]
# Fired when the item is selected. # Fired when the item is selected.
on_select: EventHandler[lambda e0: [e0.target.value]] on_select: EventHandler[lambda e0: []]
class DropdownMenuSeparator(RadixThemesComponent): class DropdownMenuSeparator(RadixThemesComponent):

View File

@ -6,7 +6,6 @@ from reflex.components.component import Component
from reflex.components.core.breakpoints import Responsive from reflex.components.core.breakpoints import Responsive
from reflex.components.core.debounce import DebounceInput from reflex.components.core.debounce import DebounceInput
from reflex.components.el import elements from reflex.components.el import elements
from reflex.event import EventHandler
from reflex.vars.base import Var from reflex.vars.base import Var
from ..base import ( from ..base import (
@ -82,21 +81,6 @@ class TextArea(RadixThemesComponent, elements.Textarea):
# How the text in the textarea is to be wrapped when submitting the form # How the text in the textarea is to be wrapped when submitting the form
wrap: Var[str] wrap: Var[str]
# Fired when the value of the textarea changes.
on_change: EventHandler[lambda e0: [e0.target.value]]
# Fired when the textarea is focused.
on_focus: EventHandler[lambda e0: [e0.target.value]]
# Fired when the textarea is blurred.
on_blur: EventHandler[lambda e0: [e0.target.value]]
# Fired when a key is pressed down.
on_key_down: EventHandler[lambda e0: [e0.key]]
# Fired when a key is released.
on_key_up: EventHandler[lambda e0: [e0.key]]
@classmethod @classmethod
def create(cls, *children, **props) -> Component: def create(cls, *children, **props) -> Component:
"""Create an Input component. """Create an Input component.

View File

@ -8,7 +8,7 @@ from reflex.components.component import Component, ComponentNamespace
from reflex.components.core.breakpoints import Responsive from reflex.components.core.breakpoints import Responsive
from reflex.components.core.debounce import DebounceInput from reflex.components.core.debounce import DebounceInput
from reflex.components.el import elements from reflex.components.el import elements
from reflex.event import EventHandler from reflex.event import EventHandler, input_event, key_event
from reflex.vars.base import Var from reflex.vars.base import Var
from ..base import ( from ..base import (
@ -72,19 +72,19 @@ class TextFieldRoot(elements.Div, RadixThemesComponent):
value: Var[Union[str, int, float]] value: Var[Union[str, int, float]]
# Fired when the value of the textarea changes. # Fired when the value of the textarea changes.
on_change: EventHandler[lambda e0: [e0.target.value]] on_change: EventHandler[input_event]
# Fired when the textarea is focused. # Fired when the textarea is focused.
on_focus: EventHandler[lambda e0: [e0.target.value]] on_focus: EventHandler[input_event]
# Fired when the textarea is blurred. # Fired when the textarea is blurred.
on_blur: EventHandler[lambda e0: [e0.target.value]] on_blur: EventHandler[input_event]
# Fired when a key is pressed down. # Fired when a key is pressed down.
on_key_down: EventHandler[lambda e0: [e0.key]] on_key_down: EventHandler[key_event]
# Fired when a key is released. # Fired when a key is released.
on_key_up: EventHandler[lambda e0: [e0.key]] on_key_up: EventHandler[key_event]
@classmethod @classmethod
def create(cls, *children, **props) -> Component: def create(cls, *children, **props) -> Component:

View File

@ -85,13 +85,13 @@ class Tooltip(RadixThemesComponent):
aria_label: Var[str] aria_label: Var[str]
# Fired when the open state changes. # Fired when the open state changes.
on_open_change: EventHandler[lambda e0: [e0.target.value]] on_open_change: EventHandler[lambda e0: [e0]]
# Fired when the escape key is pressed. # Fired when the escape key is pressed.
on_escape_key_down: EventHandler[lambda e0: [e0.target.value]] on_escape_key_down: EventHandler[lambda e0: []]
# Fired when the pointer is down outside the tooltip. # Fired when the pointer is down outside the tooltip.
on_pointer_down_outside: EventHandler[lambda e0: [e0.target.value]] on_pointer_down_outside: EventHandler[lambda e0: []]
@classmethod @classmethod
def create(cls, *children, **props) -> Component: def create(cls, *children, **props) -> Component:

View File

@ -3,7 +3,7 @@
from __future__ import annotations from __future__ import annotations
from reflex.components.component import NoSSRComponent from reflex.components.component import NoSSRComponent
from reflex.event import EventHandler from reflex.event import EventHandler, empty_event
from reflex.vars.base import Var from reflex.vars.base import Var
@ -46,13 +46,13 @@ class ReactPlayer(NoSSRComponent):
height: Var[str] height: Var[str]
# Called when media is loaded and ready to play. If playing is set to true, media will play immediately. # Called when media is loaded and ready to play. If playing is set to true, media will play immediately.
on_ready: EventHandler[lambda: []] on_ready: EventHandler[empty_event]
# Called when media starts playing. # Called when media starts playing.
on_start: EventHandler[lambda: []] on_start: EventHandler[empty_event]
# Called when media starts or resumes playing after pausing or buffering. # Called when media starts or resumes playing after pausing or buffering.
on_play: EventHandler[lambda: []] on_play: EventHandler[empty_event]
# Callback containing played and loaded progress as a fraction, and playedSeconds and loadedSeconds in seconds. eg { played: 0.12, playedSeconds: 11.3, loaded: 0.34, loadedSeconds: 16.7 } # Callback containing played and loaded progress as a fraction, and playedSeconds and loadedSeconds in seconds. eg { played: 0.12, playedSeconds: 11.3, loaded: 0.34, loadedSeconds: 16.7 }
on_progress: EventHandler[lambda progress: [progress]] on_progress: EventHandler[lambda progress: [progress]]
@ -61,13 +61,13 @@ class ReactPlayer(NoSSRComponent):
on_duration: EventHandler[lambda seconds: [seconds]] on_duration: EventHandler[lambda seconds: [seconds]]
# Called when media is paused. # Called when media is paused.
on_pause: EventHandler[lambda: []] on_pause: EventHandler[empty_event]
# Called when media starts buffering. # Called when media starts buffering.
on_buffer: EventHandler[lambda: []] on_buffer: EventHandler[empty_event]
# Called when media has finished buffering. Works for files, YouTube and Facebook. # Called when media has finished buffering. Works for files, YouTube and Facebook.
on_buffer_end: EventHandler[lambda: []] on_buffer_end: EventHandler[empty_event]
# Called when media seeks with seconds parameter. # Called when media seeks with seconds parameter.
on_seek: EventHandler[lambda seconds: [seconds]] on_seek: EventHandler[lambda seconds: [seconds]]
@ -79,16 +79,16 @@ class ReactPlayer(NoSSRComponent):
on_playback_quality_change: EventHandler[lambda e0: []] on_playback_quality_change: EventHandler[lambda e0: []]
# Called when media finishes playing. Does not fire when loop is set to true. # Called when media finishes playing. Does not fire when loop is set to true.
on_ended: EventHandler[lambda: []] on_ended: EventHandler[empty_event]
# Called when an error occurs whilst attempting to play media. # Called when an error occurs whilst attempting to play media.
on_error: EventHandler[lambda: []] on_error: EventHandler[empty_event]
# Called when user clicks the light mode preview. # Called when user clicks the light mode preview.
on_click_preview: EventHandler[lambda: []] on_click_preview: EventHandler[empty_event]
# Called when picture-in-picture mode is enabled. # Called when picture-in-picture mode is enabled.
on_enable_pip: EventHandler[lambda: []] on_enable_pip: EventHandler[empty_event]
# Called when picture-in-picture mode is disabled. # Called when picture-in-picture mode is disabled.
on_disable_pip: EventHandler[lambda: []] on_disable_pip: EventHandler[empty_event]

View File

@ -6,7 +6,7 @@ from typing import Any, Dict, List, Union
from reflex.constants import EventTriggers from reflex.constants import EventTriggers
from reflex.constants.colors import Color from reflex.constants.colors import Color
from reflex.event import EventHandler from reflex.event import EventHandler, empty_event
from reflex.vars.base import LiteralVar, Var from reflex.vars.base import LiteralVar, Var
from .recharts import ( from .recharts import (
@ -101,25 +101,25 @@ class Axis(Recharts):
text_anchor: Var[str] # 'start', 'middle', 'end' text_anchor: Var[str] # 'start', 'middle', 'end'
# The customized event handler of click on the ticks of this axis # The customized event handler of click on the ticks of this axis
on_click: EventHandler[lambda: []] on_click: EventHandler[empty_event]
# The customized event handler of mousedown on the ticks of this axis # The customized event handler of mousedown on the ticks of this axis
on_mouse_down: EventHandler[lambda: []] on_mouse_down: EventHandler[empty_event]
# The customized event handler of mouseup on the ticks of this axis # The customized event handler of mouseup on the ticks of this axis
on_mouse_up: EventHandler[lambda: []] on_mouse_up: EventHandler[empty_event]
# The customized event handler of mousemove on the ticks of this axis # The customized event handler of mousemove on the ticks of this axis
on_mouse_move: EventHandler[lambda: []] on_mouse_move: EventHandler[empty_event]
# The customized event handler of mouseout on the ticks of this axis # The customized event handler of mouseout on the ticks of this axis
on_mouse_out: EventHandler[lambda: []] on_mouse_out: EventHandler[empty_event]
# The customized event handler of mouseenter on the ticks of this axis # The customized event handler of mouseenter on the ticks of this axis
on_mouse_enter: EventHandler[lambda: []] on_mouse_enter: EventHandler[empty_event]
# The customized event handler of mouseleave on the ticks of this axis # The customized event handler of mouseleave on the ticks of this axis
on_mouse_leave: EventHandler[lambda: []] on_mouse_leave: EventHandler[empty_event]
class XAxis(Axis): class XAxis(Axis):
@ -267,28 +267,28 @@ class Cartesian(Recharts):
legend_type: Var[LiteralLegendType] legend_type: Var[LiteralLegendType]
# The customized event handler of click on the component in this group # The customized event handler of click on the component in this group
on_click: EventHandler[lambda: []] on_click: EventHandler[empty_event]
# The customized event handler of mousedown on the component in this group # The customized event handler of mousedown on the component in this group
on_mouse_down: EventHandler[lambda: []] on_mouse_down: EventHandler[empty_event]
# The customized event handler of mouseup on the component in this group # The customized event handler of mouseup on the component in this group
on_mouse_up: EventHandler[lambda: []] on_mouse_up: EventHandler[empty_event]
# The customized event handler of mousemove on the component in this group # The customized event handler of mousemove on the component in this group
on_mouse_move: EventHandler[lambda: []] on_mouse_move: EventHandler[empty_event]
# The customized event handler of mouseover on the component in this group # The customized event handler of mouseover on the component in this group
on_mouse_over: EventHandler[lambda: []] on_mouse_over: EventHandler[empty_event]
# The customized event handler of mouseout on the component in this group # The customized event handler of mouseout on the component in this group
on_mouse_out: EventHandler[lambda: []] on_mouse_out: EventHandler[empty_event]
# The customized event handler of mouseenter on the component in this group # The customized event handler of mouseenter on the component in this group
on_mouse_enter: EventHandler[lambda: []] on_mouse_enter: EventHandler[empty_event]
# The customized event handler of mouseleave on the component in this group # The customized event handler of mouseleave on the component in this group
on_mouse_leave: EventHandler[lambda: []] on_mouse_leave: EventHandler[empty_event]
class Area(Cartesian): class Area(Cartesian):
@ -494,28 +494,28 @@ class Scatter(Recharts):
animation_easing: Var[LiteralAnimationEasing] animation_easing: Var[LiteralAnimationEasing]
# The customized event handler of click on the component in this group # The customized event handler of click on the component in this group
on_click: EventHandler[lambda: []] on_click: EventHandler[empty_event]
# The customized event handler of mousedown on the component in this group # The customized event handler of mousedown on the component in this group
on_mouse_down: EventHandler[lambda: []] on_mouse_down: EventHandler[empty_event]
# The customized event handler of mouseup on the component in this group # The customized event handler of mouseup on the component in this group
on_mouse_up: EventHandler[lambda: []] on_mouse_up: EventHandler[empty_event]
# The customized event handler of mousemove on the component in this group # The customized event handler of mousemove on the component in this group
on_mouse_move: EventHandler[lambda: []] on_mouse_move: EventHandler[empty_event]
# The customized event handler of mouseover on the component in this group # The customized event handler of mouseover on the component in this group
on_mouse_over: EventHandler[lambda: []] on_mouse_over: EventHandler[empty_event]
# The customized event handler of mouseout on the component in this group # The customized event handler of mouseout on the component in this group
on_mouse_out: EventHandler[lambda: []] on_mouse_out: EventHandler[empty_event]
# The customized event handler of mouseenter on the component in this group # The customized event handler of mouseenter on the component in this group
on_mouse_enter: EventHandler[lambda: []] on_mouse_enter: EventHandler[empty_event]
# The customized event handler of mouseleave on the component in this group # The customized event handler of mouseleave on the component in this group
on_mouse_leave: EventHandler[lambda: []] on_mouse_leave: EventHandler[empty_event]
class Funnel(Recharts): class Funnel(Recharts):
@ -556,34 +556,34 @@ class Funnel(Recharts):
_valid_children: List[str] = ["LabelList", "Cell"] _valid_children: List[str] = ["LabelList", "Cell"]
# The customized event handler of animation start # The customized event handler of animation start
on_animation_start: EventHandler[lambda: []] on_animation_start: EventHandler[empty_event]
# The customized event handler of animation end # The customized event handler of animation end
on_animation_end: EventHandler[lambda: []] on_animation_end: EventHandler[empty_event]
# The customized event handler of click on the component in this group # The customized event handler of click on the component in this group
on_click: EventHandler[lambda: []] on_click: EventHandler[empty_event]
# The customized event handler of mousedown on the component in this group # The customized event handler of mousedown on the component in this group
on_mouse_down: EventHandler[lambda: []] on_mouse_down: EventHandler[empty_event]
# The customized event handler of mouseup on the component in this group # The customized event handler of mouseup on the component in this group
on_mouse_up: EventHandler[lambda: []] on_mouse_up: EventHandler[empty_event]
# The customized event handler of mousemove on the component in this group # The customized event handler of mousemove on the component in this group
on_mouse_move: EventHandler[lambda: []] on_mouse_move: EventHandler[empty_event]
# The customized event handler of mouseover on the component in this group # The customized event handler of mouseover on the component in this group
on_mouse_over: EventHandler[lambda: []] on_mouse_over: EventHandler[empty_event]
# The customized event handler of mouseout on the component in this group # The customized event handler of mouseout on the component in this group
on_mouse_out: EventHandler[lambda: []] on_mouse_out: EventHandler[empty_event]
# The customized event handler of mouseenter on the component in this group # The customized event handler of mouseenter on the component in this group
on_mouse_enter: EventHandler[lambda: []] on_mouse_enter: EventHandler[empty_event]
# The customized event handler of mouseleave on the component in this group # The customized event handler of mouseleave on the component in this group
on_mouse_leave: EventHandler[lambda: []] on_mouse_leave: EventHandler[empty_event]
class ErrorBar(Recharts): class ErrorBar(Recharts):
@ -680,28 +680,28 @@ class ReferenceDot(Reference):
_valid_children: List[str] = ["Label"] _valid_children: List[str] = ["Label"]
# The customized event handler of click on the component in this chart # The customized event handler of click on the component in this chart
on_click: EventHandler[lambda: []] on_click: EventHandler[empty_event]
# The customized event handler of mousedown on the component in this chart # The customized event handler of mousedown on the component in this chart
on_mouse_down: EventHandler[lambda: []] on_mouse_down: EventHandler[empty_event]
# The customized event handler of mouseup on the component in this chart # The customized event handler of mouseup on the component in this chart
on_mouse_up: EventHandler[lambda: []] on_mouse_up: EventHandler[empty_event]
# The customized event handler of mouseover on the component in this chart # The customized event handler of mouseover on the component in this chart
on_mouse_over: EventHandler[lambda: []] on_mouse_over: EventHandler[empty_event]
# The customized event handler of mouseout on the component in this chart # The customized event handler of mouseout on the component in this chart
on_mouse_out: EventHandler[lambda: []] on_mouse_out: EventHandler[empty_event]
# The customized event handler of mouseenter on the component in this chart # The customized event handler of mouseenter on the component in this chart
on_mouse_enter: EventHandler[lambda: []] on_mouse_enter: EventHandler[empty_event]
# The customized event handler of mousemove on the component in this chart # The customized event handler of mousemove on the component in this chart
on_mouse_move: EventHandler[lambda: []] on_mouse_move: EventHandler[empty_event]
# The customized event handler of mouseleave on the component in this chart # The customized event handler of mouseleave on the component in this chart
on_mouse_leave: EventHandler[lambda: []] on_mouse_leave: EventHandler[empty_event]
class ReferenceArea(Recharts): class ReferenceArea(Recharts):

View File

@ -8,7 +8,7 @@ from reflex.components.component import Component
from reflex.components.recharts.general import ResponsiveContainer from reflex.components.recharts.general import ResponsiveContainer
from reflex.constants import EventTriggers from reflex.constants import EventTriggers
from reflex.constants.colors import Color from reflex.constants.colors import Color
from reflex.event import EventHandler from reflex.event import EventHandler, empty_event
from reflex.vars.base import Var from reflex.vars.base import Var
from .recharts import ( from .recharts import (
@ -31,16 +31,16 @@ class ChartBase(RechartsCharts):
height: Var[Union[str, int]] = "100%" # type: ignore height: Var[Union[str, int]] = "100%" # type: ignore
# The customized event handler of click on the component in this chart # The customized event handler of click on the component in this chart
on_click: EventHandler[lambda: []] on_click: EventHandler[empty_event]
# The customized event handler of mouseenter on the component in this chart # The customized event handler of mouseenter on the component in this chart
on_mouse_enter: EventHandler[lambda: []] on_mouse_enter: EventHandler[empty_event]
# The customized event handler of mousemove on the component in this chart # The customized event handler of mousemove on the component in this chart
on_mouse_move: EventHandler[lambda: []] on_mouse_move: EventHandler[empty_event]
# The customized event handler of mouseleave on the component in this chart # The customized event handler of mouseleave on the component in this chart
on_mouse_leave: EventHandler[lambda: []] on_mouse_leave: EventHandler[empty_event]
@staticmethod @staticmethod
def _ensure_valid_dimension(name: str, value: Any) -> None: def _ensure_valid_dimension(name: str, value: Any) -> None:
@ -270,16 +270,16 @@ class PieChart(ChartBase):
] ]
# The customized event handler of mousedown on the sectors in this group # The customized event handler of mousedown on the sectors in this group
on_mouse_down: EventHandler[lambda: []] on_mouse_down: EventHandler[empty_event]
# The customized event handler of mouseup on the sectors in this group # The customized event handler of mouseup on the sectors in this group
on_mouse_up: EventHandler[lambda: []] on_mouse_up: EventHandler[empty_event]
# The customized event handler of mouseover on the sectors in this group # The customized event handler of mouseover on the sectors in this group
on_mouse_over: EventHandler[lambda: []] on_mouse_over: EventHandler[empty_event]
# The customized event handler of mouseout on the sectors in this group # The customized event handler of mouseout on the sectors in this group
on_mouse_out: EventHandler[lambda: []] on_mouse_out: EventHandler[empty_event]
class RadarChart(ChartBase): class RadarChart(ChartBase):
@ -488,10 +488,10 @@ class Treemap(RechartsCharts):
animation_easing: Var[LiteralAnimationEasing] animation_easing: Var[LiteralAnimationEasing]
# The customized event handler of animation start # The customized event handler of animation start
on_animation_start: EventHandler[lambda: []] on_animation_start: EventHandler[empty_event]
# The customized event handler of animation end # The customized event handler of animation end
on_animation_end: EventHandler[lambda: []] on_animation_end: EventHandler[empty_event]
@classmethod @classmethod
def create(cls, *children, **props) -> Component: def create(cls, *children, **props) -> Component:

View File

@ -6,7 +6,7 @@ from typing import Any, Dict, List, Union
from reflex.components.component import MemoizationLeaf from reflex.components.component import MemoizationLeaf
from reflex.constants.colors import Color from reflex.constants.colors import Color
from reflex.event import EventHandler from reflex.event import EventHandler, empty_event
from reflex.vars.base import LiteralVar, Var from reflex.vars.base import LiteralVar, Var
from .recharts import ( from .recharts import (
@ -46,7 +46,7 @@ class ResponsiveContainer(Recharts, MemoizationLeaf):
debounce: Var[int] debounce: Var[int]
# If specified provides a callback providing the updated chart width and height values. # If specified provides a callback providing the updated chart width and height values.
on_resize: EventHandler[lambda: []] on_resize: EventHandler[empty_event]
# Valid children components # Valid children components
_valid_children: List[str] = [ _valid_children: List[str] = [
@ -104,28 +104,28 @@ class Legend(Recharts):
margin: Var[Dict[str, Any]] margin: Var[Dict[str, Any]]
# The customized event handler of click on the items in this group # The customized event handler of click on the items in this group
on_click: EventHandler[lambda: []] on_click: EventHandler[empty_event]
# The customized event handler of mousedown on the items in this group # The customized event handler of mousedown on the items in this group
on_mouse_down: EventHandler[lambda: []] on_mouse_down: EventHandler[empty_event]
# The customized event handler of mouseup on the items in this group # The customized event handler of mouseup on the items in this group
on_mouse_up: EventHandler[lambda: []] on_mouse_up: EventHandler[empty_event]
# The customized event handler of mousemove on the items in this group # The customized event handler of mousemove on the items in this group
on_mouse_move: EventHandler[lambda: []] on_mouse_move: EventHandler[empty_event]
# The customized event handler of mouseover on the items in this group # The customized event handler of mouseover on the items in this group
on_mouse_over: EventHandler[lambda: []] on_mouse_over: EventHandler[empty_event]
# The customized event handler of mouseout on the items in this group # The customized event handler of mouseout on the items in this group
on_mouse_out: EventHandler[lambda: []] on_mouse_out: EventHandler[empty_event]
# The customized event handler of mouseenter on the items in this group # The customized event handler of mouseenter on the items in this group
on_mouse_enter: EventHandler[lambda: []] on_mouse_enter: EventHandler[empty_event]
# The customized event handler of mouseleave on the items in this group # The customized event handler of mouseleave on the items in this group
on_mouse_leave: EventHandler[lambda: []] on_mouse_leave: EventHandler[empty_event]
class GraphingTooltip(Recharts): class GraphingTooltip(Recharts):

View File

@ -6,7 +6,7 @@ from typing import Any, Dict, List, Union
from reflex.constants import EventTriggers from reflex.constants import EventTriggers
from reflex.constants.colors import Color from reflex.constants.colors import Color
from reflex.event import EventHandler from reflex.event import EventHandler, empty_event
from reflex.vars.base import LiteralVar, Var from reflex.vars.base import LiteralVar, Var
from .recharts import ( from .recharts import (
@ -253,28 +253,28 @@ class PolarAngleAxis(Recharts):
_valid_children: List[str] = ["Label"] _valid_children: List[str] = ["Label"]
# The customized event handler of click on the ticks of this axis. # The customized event handler of click on the ticks of this axis.
on_click: EventHandler[lambda: []] on_click: EventHandler[empty_event]
# The customized event handler of mousedown on the the ticks of this axis. # The customized event handler of mousedown on the the ticks of this axis.
on_mouse_down: EventHandler[lambda: []] on_mouse_down: EventHandler[empty_event]
# The customized event handler of mouseup on the ticks of this axis. # The customized event handler of mouseup on the ticks of this axis.
on_mouse_up: EventHandler[lambda: []] on_mouse_up: EventHandler[empty_event]
# The customized event handler of mousemove on the ticks of this axis. # The customized event handler of mousemove on the ticks of this axis.
on_mouse_move: EventHandler[lambda: []] on_mouse_move: EventHandler[empty_event]
# The customized event handler of mouseover on the ticks of this axis. # The customized event handler of mouseover on the ticks of this axis.
on_mouse_over: EventHandler[lambda: []] on_mouse_over: EventHandler[empty_event]
# The customized event handler of mouseout on the ticks of this axis. # The customized event handler of mouseout on the ticks of this axis.
on_mouse_out: EventHandler[lambda: []] on_mouse_out: EventHandler[empty_event]
# The customized event handler of moustenter on the ticks of this axis. # The customized event handler of moustenter on the ticks of this axis.
on_mouse_enter: EventHandler[lambda: []] on_mouse_enter: EventHandler[empty_event]
# The customized event handler of mouseleave on the ticks of this axis. # The customized event handler of mouseleave on the ticks of this axis.
on_mouse_leave: EventHandler[lambda: []] on_mouse_leave: EventHandler[empty_event]
class PolarGrid(Recharts): class PolarGrid(Recharts):

View File

@ -24,7 +24,7 @@ from typing import (
from typing_extensions import get_args, get_origin from typing_extensions import get_args, get_origin
from reflex import constants from reflex import constants
from reflex.utils import format from reflex.utils import console, format
from reflex.utils.exceptions import EventFnArgMismatch, EventHandlerArgMismatch from reflex.utils.exceptions import EventFnArgMismatch, EventHandlerArgMismatch
from reflex.utils.types import ArgsSpec, GenericType from reflex.utils.types import ArgsSpec, GenericType
from reflex.vars import VarData from reflex.vars import VarData
@ -399,23 +399,63 @@ prevent_default = EventChain(events=[], args_spec=lambda: []).prevent_default
init=True, init=True,
frozen=True, frozen=True,
) )
class Target: class JavascriptHTMLInputElement:
"""A Javascript event target.""" """Interface for a Javascript HTMLInputElement https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement."""
checked: bool = False value: str = ""
value: Any = None
@dataclasses.dataclass( @dataclasses.dataclass(
init=True, init=True,
frozen=True, frozen=True,
) )
class FrontendEvent: class JavascriptInputEvent:
"""A Javascript event.""" """Interface for a Javascript InputEvent https://developer.mozilla.org/en-US/docs/Web/API/InputEvent."""
target: JavascriptHTMLInputElement = JavascriptHTMLInputElement()
@dataclasses.dataclass(
init=True,
frozen=True,
)
class JavasciptKeyboardEvent:
"""Interface for a Javascript KeyboardEvent https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent."""
target: Target = Target()
key: str = "" key: str = ""
value: Any = None
def input_event(e: Var[JavascriptInputEvent]) -> Tuple[str]:
"""Get the value from an input event.
Args:
e: The input event.
Returns:
The value from the input event.
"""
return (e.target.value,)
def key_event(e: Var[JavasciptKeyboardEvent]) -> Tuple[str]:
"""Get the key from a keyboard event.
Args:
e: The keyboard event.
Returns:
The key from the keyboard event.
"""
return (e.key,)
def empty_event() -> Tuple[()]:
"""Empty event handler.
Returns:
An empty tuple.
"""
return tuple() # type: ignore
@dataclasses.dataclass( @dataclasses.dataclass(
@ -946,6 +986,28 @@ def unwrap_var_annotation(annotation: GenericType):
return annotation return annotation
def resolve_annotation(annotations: dict[str, Any], arg_name: str):
"""Resolve the annotation for the given argument name.
Args:
annotations: The annotations.
arg_name: The argument name.
Returns:
The resolved annotation.
"""
annotation = annotations.get(arg_name)
if annotation is None:
console.deprecate(
feature_name="Unannotated event handler arguments",
reason="Provide type annotations for event handler arguments.",
deprecation_version="0.6.3",
removal_version="0.7.0",
)
return JavascriptInputEvent
return annotation
def parse_args_spec(arg_spec: ArgsSpec): def parse_args_spec(arg_spec: ArgsSpec):
"""Parse the args provided in the ArgsSpec of an event trigger. """Parse the args provided in the ArgsSpec of an event trigger.
@ -961,7 +1023,7 @@ def parse_args_spec(arg_spec: ArgsSpec):
return arg_spec( return arg_spec(
*[ *[
Var(f"_{l_arg}").to( Var(f"_{l_arg}").to(
unwrap_var_annotation(annotations.get(l_arg, FrontendEvent)) unwrap_var_annotation(resolve_annotation(annotations, l_arg))
) )
for l_arg in spec.args for l_arg in spec.args
] ]

View File

@ -16,7 +16,13 @@ from reflex.components.component import (
) )
from reflex.components.radix.themes.layout.box import Box from reflex.components.radix.themes.layout.box import Box
from reflex.constants import EventTriggers from reflex.constants import EventTriggers
from reflex.event import EventChain, EventHandler, parse_args_spec from reflex.event import (
EventChain,
EventHandler,
empty_event,
input_event,
parse_args_spec,
)
from reflex.state import BaseState from reflex.state import BaseState
from reflex.style import Style from reflex.style import Style
from reflex.utils import imports from reflex.utils import imports
@ -1778,7 +1784,7 @@ def test_custom_component_declare_event_handlers_in_fields():
return { return {
**super().get_event_triggers(), **super().get_event_triggers(),
"on_a": lambda e0: [e0], "on_a": lambda e0: [e0],
"on_b": lambda e0: [e0.target.value], "on_b": input_event,
"on_c": lambda e0: [], "on_c": lambda e0: [],
"on_d": lambda: [], "on_d": lambda: [],
"on_e": lambda: [], "on_e": lambda: [],
@ -1787,9 +1793,9 @@ def test_custom_component_declare_event_handlers_in_fields():
class TestComponent(Component): class TestComponent(Component):
on_a: EventHandler[lambda e0: [e0]] on_a: EventHandler[lambda e0: [e0]]
on_b: EventHandler[lambda e0: [e0.target.value]] on_b: EventHandler[input_event]
on_c: EventHandler[lambda e0: []] on_c: EventHandler[lambda e0: []]
on_d: EventHandler[lambda: []] on_d: EventHandler[empty_event]
on_e: EventHandler on_e: EventHandler
on_f: EventHandler[lambda a, b, c: [c, b, a]] on_f: EventHandler[lambda a, b, c: [c, b, a]]

View File

@ -3,7 +3,7 @@ from __future__ import annotations
from typing import Any from typing import Any
from reflex.components.component import Component from reflex.components.component import Component
from reflex.event import EventHandler from reflex.event import EventHandler, empty_event, input_event
# This is a repeat of its namesake in test_component.py. # This is a repeat of its namesake in test_component.py.
@ -25,9 +25,9 @@ def test_custom_component_declare_event_handlers_in_fields():
class TestComponent(Component): class TestComponent(Component):
on_a: EventHandler[lambda e0: [e0]] on_a: EventHandler[lambda e0: [e0]]
on_b: EventHandler[lambda e0: [e0.target.value]] on_b: EventHandler[input_event]
on_c: EventHandler[lambda e0: []] on_c: EventHandler[lambda e0: []]
on_d: EventHandler[lambda: []] on_d: EventHandler[empty_event]
custom_component = ReferenceComponent.create() custom_component = ReferenceComponent.create()
test_component = TestComponent.create() test_component = TestComponent.create()

View File

@ -8,7 +8,7 @@ import plotly.graph_objects as go
import pytest import pytest
from reflex.components.tags.tag import Tag from reflex.components.tags.tag import Tag
from reflex.event import EventChain, EventHandler, EventSpec, FrontendEvent from reflex.event import EventChain, EventHandler, EventSpec, JavascriptInputEvent
from reflex.style import Style from reflex.style import Style
from reflex.utils import format from reflex.utils import format
from reflex.utils.serializers import serialize_figure from reflex.utils.serializers import serialize_figure
@ -387,7 +387,7 @@ def test_format_match(
Var( Var(
_js_expr="_e", _js_expr="_e",
) )
.to(ObjectVar, FrontendEvent) .to(ObjectVar, JavascriptInputEvent)
.target.value, .target.value,
), ),
), ),