reflex 0.5.4a3__py3-none-any.whl → 0.5.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of reflex might be problematic. Click here for more details.
- reflex/.templates/apps/demo/code/demo.py +1 -0
- reflex/.templates/apps/demo/code/pages/__init__.py +1 -0
- reflex/.templates/apps/demo/code/pages/datatable.py +1 -0
- reflex/.templates/apps/demo/code/pages/forms.py +1 -0
- reflex/.templates/apps/demo/code/pages/graphing.py +1 -0
- reflex/.templates/apps/demo/code/pages/home.py +1 -0
- reflex/.templates/apps/demo/code/styles.py +1 -0
- reflex/.templates/apps/demo/code/webui/components/loading_icon.py +1 -8
- reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +27 -12
- reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +19 -5
- reflex/.templates/web/utils/state.js +73 -7
- reflex/__init__.py +3 -0
- reflex/__init__.pyi +3 -0
- reflex/admin.py +1 -0
- reflex/app.py +8 -6
- reflex/app_module_for_backend.py +2 -1
- reflex/base.py +4 -4
- reflex/compiler/compiler.py +4 -3
- reflex/compiler/templates.py +2 -0
- reflex/compiler/utils.py +58 -35
- reflex/components/__init__.py +1 -0
- reflex/components/base/__init__.py +1 -0
- reflex/components/base/app_wrap.py +1 -0
- reflex/components/base/fragment.py +1 -0
- reflex/components/base/link.py +0 -1
- reflex/components/base/script.py +11 -15
- reflex/components/base/script.pyi +1 -2
- reflex/components/chakra/base.py +15 -13
- reflex/components/chakra/base.pyi +3 -1
- reflex/components/chakra/datadisplay/code.py +1 -0
- reflex/components/chakra/datadisplay/divider.py +1 -0
- reflex/components/chakra/datadisplay/table.py +1 -0
- reflex/components/chakra/datadisplay/table.pyi +3 -0
- reflex/components/chakra/datadisplay/tag.py +1 -0
- reflex/components/chakra/disclosure/transition.py +1 -0
- reflex/components/chakra/feedback/circularprogress.py +1 -0
- reflex/components/chakra/forms/button.py +1 -0
- reflex/components/chakra/forms/checkbox.py +4 -13
- reflex/components/chakra/forms/checkbox.pyi +1 -3
- reflex/components/chakra/forms/colormodeswitch.py +1 -0
- reflex/components/chakra/forms/editable.py +13 -16
- reflex/components/chakra/forms/editable.pyi +1 -3
- reflex/components/chakra/forms/form.py +1 -0
- reflex/components/chakra/forms/input.py +22 -21
- reflex/components/chakra/forms/input.pyi +4 -4
- reflex/components/chakra/forms/multiselect.py +1 -0
- reflex/components/chakra/forms/numberinput.py +3 -12
- reflex/components/chakra/forms/numberinput.pyi +1 -3
- reflex/components/chakra/forms/pininput.py +8 -14
- reflex/components/chakra/forms/pininput.pyi +2 -3
- reflex/components/chakra/forms/radio.py +4 -13
- reflex/components/chakra/forms/radio.pyi +2 -3
- reflex/components/chakra/forms/rangeslider.py +10 -13
- reflex/components/chakra/forms/rangeslider.pyi +2 -3
- reflex/components/chakra/forms/select.py +4 -12
- reflex/components/chakra/forms/select.pyi +2 -3
- reflex/components/chakra/forms/slider.py +10 -13
- reflex/components/chakra/forms/slider.pyi +2 -3
- reflex/components/chakra/forms/switch.py +4 -13
- reflex/components/chakra/forms/switch.pyi +1 -3
- reflex/components/chakra/forms/textarea.py +16 -17
- reflex/components/chakra/forms/textarea.pyi +1 -3
- reflex/components/chakra/media/avatar.py +4 -12
- reflex/components/chakra/media/avatar.pyi +1 -2
- reflex/components/chakra/media/icon.py +1 -0
- reflex/components/chakra/media/image.py +7 -11
- reflex/components/chakra/media/image.pyi +2 -2
- reflex/components/chakra/navigation/link.py +8 -4
- reflex/components/chakra/navigation/link.pyi +2 -1
- reflex/components/chakra/overlay/alertdialog.py +12 -14
- reflex/components/chakra/overlay/alertdialog.pyi +1 -2
- reflex/components/chakra/overlay/drawer.py +12 -14
- reflex/components/chakra/overlay/drawer.pyi +1 -2
- reflex/components/chakra/overlay/menu.py +7 -11
- reflex/components/chakra/overlay/menu.pyi +2 -2
- reflex/components/chakra/overlay/modal.py +13 -13
- reflex/components/chakra/overlay/modal.pyi +2 -2
- reflex/components/chakra/overlay/popover.py +6 -12
- reflex/components/chakra/overlay/popover.pyi +1 -2
- reflex/components/chakra/overlay/tooltip.py +7 -13
- reflex/components/chakra/overlay/tooltip.pyi +1 -2
- reflex/components/chakra/typography/heading.py +0 -1
- reflex/components/chakra/typography/span.py +1 -0
- reflex/components/chakra/typography/text.py +1 -0
- reflex/components/component.py +70 -43
- reflex/components/core/__init__.py +1 -0
- reflex/components/core/banner.py +27 -24
- reflex/components/core/banner.pyi +6 -2
- reflex/components/core/client_side_routing.py +1 -0
- reflex/components/core/cond.py +19 -17
- reflex/components/core/debounce.py +4 -11
- reflex/components/core/debounce.pyi +1 -1
- reflex/components/core/foreach.py +1 -0
- reflex/components/core/html.py +1 -0
- reflex/components/core/match.py +9 -6
- reflex/components/core/upload.py +26 -25
- reflex/components/core/upload.pyi +3 -4
- reflex/components/datadisplay/__init__.py +1 -0
- reflex/components/datadisplay/code.py +27 -23
- reflex/components/datadisplay/code.pyi +4 -2
- reflex/components/datadisplay/dataeditor.py +73 -80
- reflex/components/datadisplay/dataeditor.pyi +52 -4
- reflex/components/datadisplay/logo.py +1 -0
- reflex/components/el/__init__.py +1 -0
- reflex/components/el/__init__.pyi +8 -0
- reflex/components/el/element.py +0 -1
- reflex/components/el/elements/__init__.py +5 -0
- reflex/components/el/elements/__init__.pyi +12 -1
- reflex/components/el/elements/base.py +1 -0
- reflex/components/el/elements/forms.py +44 -61
- reflex/components/el/elements/forms.pyi +4 -6
- reflex/components/el/elements/inline.py +1 -0
- reflex/components/el/elements/media.py +53 -0
- reflex/components/el/elements/media.pyi +428 -0
- reflex/components/el/elements/metadata.py +11 -0
- reflex/components/el/elements/metadata.pyi +80 -0
- reflex/components/el/elements/other.py +1 -0
- reflex/components/el/elements/scripts.py +1 -0
- reflex/components/el/elements/tables.py +1 -0
- reflex/components/el/elements/typography.py +1 -0
- reflex/components/gridjs/datatable.py +9 -6
- reflex/components/gridjs/datatable.pyi +4 -1
- reflex/components/markdown/markdown.py +36 -41
- reflex/components/markdown/markdown.pyi +4 -3
- reflex/components/media/icon.py +1 -0
- reflex/components/moment/moment.py +11 -17
- reflex/components/moment/moment.pyi +4 -3
- reflex/components/next/base.py +1 -0
- reflex/components/next/image.py +6 -11
- reflex/components/next/image.pyi +2 -2
- reflex/components/plotly/plotly.py +1 -0
- reflex/components/props.py +1 -0
- reflex/components/radix/__init__.py +1 -0
- reflex/components/radix/primitives/__init__.py +1 -0
- reflex/components/radix/primitives/accordion.py +7 -15
- reflex/components/radix/primitives/accordion.pyi +7 -4
- reflex/components/radix/primitives/base.py +1 -0
- reflex/components/radix/primitives/drawer.py +17 -27
- reflex/components/radix/primitives/drawer.pyi +2 -4
- reflex/components/radix/primitives/form.py +4 -12
- reflex/components/radix/primitives/form.pyi +2 -3
- reflex/components/radix/primitives/slider.py +6 -11
- reflex/components/radix/primitives/slider.pyi +2 -2
- reflex/components/radix/themes/__init__.py +1 -0
- reflex/components/radix/themes/base.py +3 -3
- reflex/components/radix/themes/base.pyi +3 -2
- reflex/components/radix/themes/color_mode.py +31 -2
- reflex/components/radix/themes/color_mode.pyi +10 -1
- reflex/components/radix/themes/components/__init__.py +1 -0
- reflex/components/radix/themes/components/alert_dialog.py +13 -24
- reflex/components/radix/themes/components/alert_dialog.pyi +2 -4
- reflex/components/radix/themes/components/aspect_ratio.py +1 -0
- reflex/components/radix/themes/components/card.py +1 -0
- reflex/components/radix/themes/components/checkbox.py +6 -22
- reflex/components/radix/themes/components/checkbox.pyi +2 -4
- reflex/components/radix/themes/components/checkbox_group.py +15 -3
- reflex/components/radix/themes/components/checkbox_group.pyi +10 -2
- reflex/components/radix/themes/components/context_menu.py +29 -38
- reflex/components/radix/themes/components/context_menu.pyi +2 -5
- reflex/components/radix/themes/components/dialog.py +18 -26
- reflex/components/radix/themes/components/dialog.pyi +2 -4
- reflex/components/radix/themes/components/dropdown_menu.py +32 -57
- reflex/components/radix/themes/components/dropdown_menu.pyi +2 -7
- reflex/components/radix/themes/components/hover_card.py +5 -12
- reflex/components/radix/themes/components/hover_card.pyi +2 -3
- reflex/components/radix/themes/components/icon_button.py +1 -0
- reflex/components/radix/themes/components/icon_button.pyi +1 -0
- reflex/components/radix/themes/components/inset.py +1 -0
- reflex/components/radix/themes/components/popover.py +22 -27
- reflex/components/radix/themes/components/popover.pyi +2 -4
- reflex/components/radix/themes/components/radio_group.py +25 -17
- reflex/components/radix/themes/components/radio_group.pyi +2 -3
- reflex/components/radix/themes/components/scroll_area.py +1 -0
- reflex/components/radix/themes/components/segmented_control.py +18 -5
- reflex/components/radix/themes/components/segmented_control.pyi +16 -7
- reflex/components/radix/themes/components/select.py +13 -23
- reflex/components/radix/themes/components/select.pyi +1 -4
- reflex/components/radix/themes/components/separator.py +1 -0
- reflex/components/radix/themes/components/slider.py +7 -12
- reflex/components/radix/themes/components/slider.pyi +2 -3
- reflex/components/radix/themes/components/switch.py +5 -12
- reflex/components/radix/themes/components/switch.pyi +2 -3
- reflex/components/radix/themes/components/table.py +1 -0
- reflex/components/radix/themes/components/tabs.py +4 -11
- reflex/components/radix/themes/components/tabs.pyi +2 -2
- reflex/components/radix/themes/components/text_area.py +19 -18
- reflex/components/radix/themes/components/text_area.pyi +2 -3
- reflex/components/radix/themes/components/text_field.py +19 -18
- reflex/components/radix/themes/components/text_field.pyi +3 -3
- reflex/components/radix/themes/components/tooltip.py +10 -13
- reflex/components/radix/themes/components/tooltip.pyi +2 -3
- reflex/components/radix/themes/layout/__init__.py +1 -0
- reflex/components/radix/themes/layout/box.py +1 -0
- reflex/components/radix/themes/layout/container.py +1 -0
- reflex/components/radix/themes/layout/list.py +1 -0
- reflex/components/radix/themes/layout/list.pyi +1 -0
- reflex/components/radix/themes/layout/section.py +1 -0
- reflex/components/radix/themes/typography/__init__.py +1 -0
- reflex/components/radix/themes/typography/base.py +1 -0
- reflex/components/radix/themes/typography/blockquote.py +1 -0
- reflex/components/radix/themes/typography/code.py +1 -0
- reflex/components/radix/themes/typography/heading.py +1 -0
- reflex/components/radix/themes/typography/link.py +8 -3
- reflex/components/radix/themes/typography/link.pyi +2 -1
- reflex/components/react_player/audio.py +1 -0
- reflex/components/react_player/audio.pyi +48 -0
- reflex/components/react_player/react_player.py +49 -0
- reflex/components/react_player/react_player.pyi +49 -0
- reflex/components/react_player/video.py +1 -0
- reflex/components/react_player/video.pyi +48 -0
- reflex/components/recharts/__init__.py +1 -0
- reflex/components/recharts/cartesian.py +264 -74
- reflex/components/recharts/cartesian.pyi +573 -58
- reflex/components/recharts/charts.py +68 -78
- reflex/components/recharts/charts.pyi +373 -156
- reflex/components/recharts/general.py +52 -20
- reflex/components/recharts/general.pyi +52 -6
- reflex/components/recharts/polar.py +30 -18
- reflex/components/recharts/polar.pyi +66 -5
- reflex/components/recharts/recharts.py +5 -3
- reflex/components/recharts/recharts.pyi +2 -1
- reflex/components/sonner/toast.py +2 -2
- reflex/components/sonner/toast.pyi +1 -1
- reflex/components/suneditor/editor.py +39 -26
- reflex/components/suneditor/editor.pyi +4 -4
- reflex/components/tags/iter_tag.py +1 -0
- reflex/constants/__init__.py +3 -2
- reflex/constants/base.py +20 -21
- reflex/constants/compiler.py +3 -1
- reflex/constants/config.py +1 -0
- reflex/constants/event.py +1 -0
- reflex/constants/installer.py +3 -2
- reflex/constants/style.py +2 -8
- reflex/event.py +36 -6
- reflex/experimental/assets.py +1 -0
- reflex/experimental/client_state.py +9 -3
- reflex/experimental/hooks.py +1 -0
- reflex/experimental/misc.py +12 -3
- reflex/middleware/hydrate_middleware.py +1 -0
- reflex/middleware/middleware.py +1 -0
- reflex/state.py +38 -1
- reflex/style.py +67 -20
- reflex/testing.py +6 -2
- reflex/utils/build.py +76 -72
- reflex/utils/exec.py +17 -9
- reflex/utils/export.py +13 -9
- reflex/utils/imports.py +34 -5
- reflex/utils/lazy_loader.py +1 -0
- reflex/utils/path_ops.py +39 -33
- reflex/utils/prerequisites.py +38 -29
- reflex/utils/processes.py +1 -1
- reflex/utils/serializers.py +3 -6
- reflex/utils/watch.py +3 -1
- reflex/vars.py +26 -10
- reflex/vars.pyi +3 -3
- {reflex-0.5.4a3.dist-info → reflex-0.5.5.dist-info}/METADATA +3 -3
- {reflex-0.5.4a3.dist-info → reflex-0.5.5.dist-info}/RECORD +260 -260
- {reflex-0.5.4a3.dist-info → reflex-0.5.5.dist-info}/LICENSE +0 -0
- {reflex-0.5.4a3.dist-info → reflex-0.5.5.dist-info}/WHEEL +0 -0
- {reflex-0.5.4a3.dist-info → reflex-0.5.5.dist-info}/entry_points.txt +0 -0
reflex/components/core/upload.py
CHANGED
|
@@ -4,9 +4,8 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import Callable, ClassVar, Dict, List, Optional
|
|
8
8
|
|
|
9
|
-
from reflex import constants
|
|
10
9
|
from reflex.components.component import Component, ComponentNamespace, MemoizationLeaf
|
|
11
10
|
from reflex.components.el.elements.forms import Input
|
|
12
11
|
from reflex.components.radix.themes.layout.box import Box
|
|
@@ -14,22 +13,21 @@ from reflex.constants import Dirs
|
|
|
14
13
|
from reflex.event import (
|
|
15
14
|
CallableEventSpec,
|
|
16
15
|
EventChain,
|
|
16
|
+
EventHandler,
|
|
17
17
|
EventSpec,
|
|
18
18
|
call_event_fn,
|
|
19
19
|
call_script,
|
|
20
20
|
parse_args_spec,
|
|
21
21
|
)
|
|
22
|
-
from reflex.utils import
|
|
22
|
+
from reflex.utils.imports import ImportVar
|
|
23
23
|
from reflex.vars import BaseVar, CallableVar, Var, VarData
|
|
24
24
|
|
|
25
25
|
DEFAULT_UPLOAD_ID: str = "default"
|
|
26
26
|
|
|
27
27
|
upload_files_context_var_data: VarData = VarData(
|
|
28
28
|
imports={
|
|
29
|
-
"react":
|
|
30
|
-
f"/{Dirs.CONTEXTS_PATH}":
|
|
31
|
-
imports.ImportVar(tag="UploadFilesContext"),
|
|
32
|
-
],
|
|
29
|
+
"react": "useContext",
|
|
30
|
+
f"/{Dirs.CONTEXTS_PATH}": "UploadFilesContext",
|
|
33
31
|
},
|
|
34
32
|
hooks={
|
|
35
33
|
"const [filesById, setFilesById] = useContext(UploadFilesContext);": None,
|
|
@@ -50,10 +48,18 @@ def upload_file(id_: str = DEFAULT_UPLOAD_ID) -> BaseVar:
|
|
|
50
48
|
Returns:
|
|
51
49
|
A var referencing the file upload drop trigger.
|
|
52
50
|
"""
|
|
51
|
+
id_var = Var.create_safe(id_, _var_is_string=True)
|
|
52
|
+
var_name = f"""e => setFilesById(filesById => {{
|
|
53
|
+
const updatedFilesById = Object.assign({{}}, filesById);
|
|
54
|
+
updatedFilesById[{id_var._var_name_unwrapped}] = e;
|
|
55
|
+
return updatedFilesById;
|
|
56
|
+
}})
|
|
57
|
+
"""
|
|
58
|
+
|
|
53
59
|
return BaseVar(
|
|
54
|
-
_var_name=
|
|
60
|
+
_var_name=var_name,
|
|
55
61
|
_var_type=EventChain,
|
|
56
|
-
_var_data=upload_files_context_var_data,
|
|
62
|
+
_var_data=VarData.merge(upload_files_context_var_data, id_var._var_data),
|
|
57
63
|
)
|
|
58
64
|
|
|
59
65
|
|
|
@@ -67,10 +73,11 @@ def selected_files(id_: str = DEFAULT_UPLOAD_ID) -> BaseVar:
|
|
|
67
73
|
Returns:
|
|
68
74
|
A var referencing the list of selected file paths.
|
|
69
75
|
"""
|
|
76
|
+
id_var = Var.create_safe(id_, _var_is_string=True)
|
|
70
77
|
return BaseVar(
|
|
71
|
-
_var_name=f"(filesById.
|
|
78
|
+
_var_name=f"(filesById[{id_var._var_name_unwrapped}] ? filesById[{id_var._var_name_unwrapped}].map((f) => (f.path || f.name)) : [])",
|
|
72
79
|
_var_type=List[str],
|
|
73
|
-
_var_data=upload_files_context_var_data,
|
|
80
|
+
_var_data=VarData.merge(upload_files_context_var_data, id_var._var_data),
|
|
74
81
|
)
|
|
75
82
|
|
|
76
83
|
|
|
@@ -99,7 +106,9 @@ def cancel_upload(upload_id: str) -> EventSpec:
|
|
|
99
106
|
Returns:
|
|
100
107
|
An event spec that cancels the upload when triggered.
|
|
101
108
|
"""
|
|
102
|
-
return call_script(
|
|
109
|
+
return call_script(
|
|
110
|
+
f"upload_controllers[{Var.create_safe(upload_id, _var_is_string=True)._var_name_unwrapped!r}]?.abort()"
|
|
111
|
+
)
|
|
103
112
|
|
|
104
113
|
|
|
105
114
|
def get_upload_dir() -> Path:
|
|
@@ -122,8 +131,8 @@ uploaded_files_url_prefix: Var = Var.create_safe(
|
|
|
122
131
|
_var_is_string=False,
|
|
123
132
|
_var_data=VarData(
|
|
124
133
|
imports={
|
|
125
|
-
f"/{Dirs.STATE_PATH}":
|
|
126
|
-
"/env.json":
|
|
134
|
+
f"/{Dirs.STATE_PATH}": "getBackendURL",
|
|
135
|
+
"/env.json": ImportVar(tag="env", is_default=True),
|
|
127
136
|
}
|
|
128
137
|
),
|
|
129
138
|
)
|
|
@@ -205,6 +214,9 @@ class Upload(MemoizationLeaf):
|
|
|
205
214
|
# Marked True when any Upload component is created.
|
|
206
215
|
is_used: ClassVar[bool] = False
|
|
207
216
|
|
|
217
|
+
# Fired when files are dropped.
|
|
218
|
+
on_drop: EventHandler[_on_drop_spec]
|
|
219
|
+
|
|
208
220
|
@classmethod
|
|
209
221
|
def create(cls, *children, **props) -> Component:
|
|
210
222
|
"""Create an upload component.
|
|
@@ -269,17 +281,6 @@ class Upload(MemoizationLeaf):
|
|
|
269
281
|
**upload_props,
|
|
270
282
|
)
|
|
271
283
|
|
|
272
|
-
def get_event_triggers(self) -> dict[str, Union[Var, Any]]:
|
|
273
|
-
"""Get the event triggers that pass the component's value to the handler.
|
|
274
|
-
|
|
275
|
-
Returns:
|
|
276
|
-
A dict mapping the event trigger to the var that is passed to the handler.
|
|
277
|
-
"""
|
|
278
|
-
return {
|
|
279
|
-
**super().get_event_triggers(),
|
|
280
|
-
constants.EventTriggers.ON_DROP: _on_drop_spec,
|
|
281
|
-
}
|
|
282
|
-
|
|
283
284
|
@classmethod
|
|
284
285
|
def _update_arg_tuple_for_on_drop(cls, arg_value: tuple[Var, Var]):
|
|
285
286
|
"""Helper to update caller-provided EventSpec args for direct use with on_drop.
|
|
@@ -9,8 +9,7 @@ from reflex.event import EventChain, EventHandler, EventSpec
|
|
|
9
9
|
from reflex.style import Style
|
|
10
10
|
import os
|
|
11
11
|
from pathlib import Path
|
|
12
|
-
from typing import
|
|
13
|
-
from reflex import constants
|
|
12
|
+
from typing import Callable, ClassVar, Dict, List, Optional
|
|
14
13
|
from reflex.components.component import Component, ComponentNamespace, MemoizationLeaf
|
|
15
14
|
from reflex.components.el.elements.forms import Input
|
|
16
15
|
from reflex.components.radix.themes.layout.box import Box
|
|
@@ -18,12 +17,13 @@ from reflex.constants import Dirs
|
|
|
18
17
|
from reflex.event import (
|
|
19
18
|
CallableEventSpec,
|
|
20
19
|
EventChain,
|
|
20
|
+
EventHandler,
|
|
21
21
|
EventSpec,
|
|
22
22
|
call_event_fn,
|
|
23
23
|
call_script,
|
|
24
24
|
parse_args_spec,
|
|
25
25
|
)
|
|
26
|
-
from reflex.utils import
|
|
26
|
+
from reflex.utils.imports import ImportVar
|
|
27
27
|
from reflex.vars import BaseVar, CallableVar, Var, VarData
|
|
28
28
|
|
|
29
29
|
DEFAULT_UPLOAD_ID: str
|
|
@@ -218,7 +218,6 @@ class Upload(MemoizationLeaf):
|
|
|
218
218
|
The upload component.
|
|
219
219
|
"""
|
|
220
220
|
...
|
|
221
|
-
def get_event_triggers(self) -> dict[str, Union[Var, Any]]: ...
|
|
222
221
|
|
|
223
222
|
class StyledUpload(Upload):
|
|
224
223
|
@overload
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""A code component."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import re
|
|
@@ -12,8 +13,8 @@ from reflex.components.core.cond import color_mode_cond
|
|
|
12
13
|
from reflex.constants.colors import Color
|
|
13
14
|
from reflex.event import set_clipboard
|
|
14
15
|
from reflex.style import Style
|
|
15
|
-
from reflex.utils import format
|
|
16
|
-
from reflex.utils.imports import ImportVar
|
|
16
|
+
from reflex.utils import format
|
|
17
|
+
from reflex.utils.imports import ImportDict, ImportVar
|
|
17
18
|
from reflex.vars import Var
|
|
18
19
|
|
|
19
20
|
LiteralCodeBlockTheme = Literal[
|
|
@@ -381,42 +382,45 @@ class CodeBlock(Component):
|
|
|
381
382
|
# Props passed down to the code tag.
|
|
382
383
|
code_tag_props: Var[Dict[str, str]]
|
|
383
384
|
|
|
384
|
-
def
|
|
385
|
-
|
|
386
|
-
|
|
385
|
+
def add_imports(self) -> ImportDict:
|
|
386
|
+
"""Add imports for the CodeBlock component.
|
|
387
|
+
|
|
388
|
+
Returns:
|
|
389
|
+
The import dict.
|
|
390
|
+
"""
|
|
391
|
+
imports_: ImportDict = {}
|
|
387
392
|
themes = re.findall(r"`(.*?)`", self.theme._var_name)
|
|
388
393
|
if not themes:
|
|
389
394
|
themes = [self.theme._var_name]
|
|
390
|
-
|
|
391
|
-
|
|
395
|
+
|
|
396
|
+
imports_.update(
|
|
392
397
|
{
|
|
393
|
-
f"react-syntax-highlighter/dist/cjs/styles/prism/{self.convert_theme_name(theme)}":
|
|
398
|
+
f"react-syntax-highlighter/dist/cjs/styles/prism/{self.convert_theme_name(theme)}": [
|
|
394
399
|
ImportVar(
|
|
395
400
|
tag=format.to_camel_case(self.convert_theme_name(theme)),
|
|
396
401
|
is_default=True,
|
|
397
402
|
install=False,
|
|
398
403
|
)
|
|
399
|
-
|
|
404
|
+
]
|
|
400
405
|
for theme in themes
|
|
401
|
-
}
|
|
406
|
+
}
|
|
402
407
|
)
|
|
408
|
+
|
|
403
409
|
if (
|
|
404
410
|
self.language is not None
|
|
405
411
|
and self.language._var_name in LiteralCodeLanguage.__args__ # type: ignore
|
|
406
412
|
):
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
)
|
|
419
|
-
return merged_imports
|
|
413
|
+
imports_[
|
|
414
|
+
f"react-syntax-highlighter/dist/cjs/languages/prism/{self.language._var_name}"
|
|
415
|
+
] = [
|
|
416
|
+
ImportVar(
|
|
417
|
+
tag=format.to_camel_case(self.language._var_name),
|
|
418
|
+
is_default=True,
|
|
419
|
+
install=False,
|
|
420
|
+
)
|
|
421
|
+
]
|
|
422
|
+
|
|
423
|
+
return imports_
|
|
420
424
|
|
|
421
425
|
def _get_custom_code(self) -> Optional[str]:
|
|
422
426
|
if (
|
|
@@ -17,8 +17,8 @@ from reflex.components.core.cond import color_mode_cond
|
|
|
17
17
|
from reflex.constants.colors import Color
|
|
18
18
|
from reflex.event import set_clipboard
|
|
19
19
|
from reflex.style import Style
|
|
20
|
-
from reflex.utils import format
|
|
21
|
-
from reflex.utils.imports import ImportVar
|
|
20
|
+
from reflex.utils import format
|
|
21
|
+
from reflex.utils.imports import ImportDict, ImportVar
|
|
22
22
|
from reflex.vars import Var
|
|
23
23
|
|
|
24
24
|
LiteralCodeBlockTheme = Literal[
|
|
@@ -351,6 +351,7 @@ LiteralCodeLanguage = Literal[
|
|
|
351
351
|
]
|
|
352
352
|
|
|
353
353
|
class CodeBlock(Component):
|
|
354
|
+
def add_imports(self) -> ImportDict: ...
|
|
354
355
|
@overload
|
|
355
356
|
@classmethod
|
|
356
357
|
def create( # type: ignore
|
|
@@ -1111,6 +1112,7 @@ class CodeBlock(Component):
|
|
|
1111
1112
|
The text component.
|
|
1112
1113
|
"""
|
|
1113
1114
|
...
|
|
1115
|
+
|
|
1114
1116
|
def add_style(self): ...
|
|
1115
1117
|
@staticmethod
|
|
1116
1118
|
def convert_theme_name(theme) -> str: ...
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
"""Data Editor component from glide-data-grid."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
from enum import Enum
|
|
5
|
-
from typing import Any,
|
|
6
|
+
from typing import Any, Dict, List, Literal, Optional, Union
|
|
6
7
|
|
|
7
8
|
from reflex.base import Base
|
|
8
9
|
from reflex.components.component import Component, NoSSRComponent
|
|
9
10
|
from reflex.components.literals import LiteralRowMarker
|
|
10
|
-
from reflex.
|
|
11
|
-
from reflex.utils
|
|
11
|
+
from reflex.event import EventHandler
|
|
12
|
+
from reflex.utils import console, format, types
|
|
13
|
+
from reflex.utils.imports import ImportDict, ImportVar
|
|
12
14
|
from reflex.utils.serializers import serializer
|
|
13
15
|
from reflex.vars import Var, get_unique_variable_name
|
|
14
16
|
|
|
@@ -103,6 +105,19 @@ class DataEditorTheme(Base):
|
|
|
103
105
|
text_medium: Optional[str] = None
|
|
104
106
|
|
|
105
107
|
|
|
108
|
+
def on_edit_spec(pos, data: dict[str, Any]):
|
|
109
|
+
"""The on edit spec function.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
pos: The position of the edit event.
|
|
113
|
+
data: The data of the edit event.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
The position and data.
|
|
117
|
+
"""
|
|
118
|
+
return [pos, data]
|
|
119
|
+
|
|
120
|
+
|
|
106
121
|
class DataEditor(NoSSRComponent):
|
|
107
122
|
"""The DataEditor Component."""
|
|
108
123
|
|
|
@@ -205,51 +220,66 @@ class DataEditor(NoSSRComponent):
|
|
|
205
220
|
# global theme
|
|
206
221
|
theme: Var[Union[DataEditorTheme, Dict]]
|
|
207
222
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
super()._get_imports(),
|
|
211
|
-
{
|
|
212
|
-
"": {
|
|
213
|
-
ImportVar(
|
|
214
|
-
tag=f"{format.format_library_name(self.library)}/dist/index.css"
|
|
215
|
-
)
|
|
216
|
-
},
|
|
217
|
-
self.library: {ImportVar(tag="GridCellKind")},
|
|
218
|
-
"/utils/helpers/dataeditor.js": {
|
|
219
|
-
ImportVar(
|
|
220
|
-
tag=f"formatDataEditorCells", is_default=False, install=False
|
|
221
|
-
),
|
|
222
|
-
},
|
|
223
|
-
},
|
|
224
|
-
)
|
|
223
|
+
# Fired when a cell is activated.
|
|
224
|
+
on_cell_activated: EventHandler[lambda pos: [pos]]
|
|
225
225
|
|
|
226
|
-
|
|
227
|
-
|
|
226
|
+
# Fired when a cell is clicked.
|
|
227
|
+
on_cell_clicked: EventHandler[lambda pos: [pos]]
|
|
228
228
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
229
|
+
# Fired when a cell is right-clicked.
|
|
230
|
+
on_cell_context_menu: EventHandler[lambda pos: [pos]]
|
|
231
|
+
|
|
232
|
+
# Fired when a cell is edited.
|
|
233
|
+
on_cell_edited: EventHandler[on_edit_spec]
|
|
234
|
+
|
|
235
|
+
# Fired when a group header is clicked.
|
|
236
|
+
on_group_header_clicked: EventHandler[on_edit_spec]
|
|
237
|
+
|
|
238
|
+
# Fired when a group header is right-clicked.
|
|
239
|
+
on_group_header_context_menu: EventHandler[lambda grp_idx, data: [grp_idx, data]]
|
|
240
|
+
|
|
241
|
+
# Fired when a group header is renamed.
|
|
242
|
+
on_group_header_renamed: EventHandler[lambda idx, val: [idx, val]]
|
|
243
|
+
|
|
244
|
+
# Fired when a header is clicked.
|
|
245
|
+
on_header_clicked: EventHandler[lambda pos: [pos]]
|
|
246
|
+
|
|
247
|
+
# Fired when a header is right-clicked.
|
|
248
|
+
on_header_context_menu: EventHandler[lambda pos: [pos]]
|
|
249
|
+
|
|
250
|
+
# Fired when a header menu item is clicked.
|
|
251
|
+
on_header_menu_click: EventHandler[lambda col, pos: [col, pos]]
|
|
232
252
|
|
|
233
|
-
|
|
234
|
-
|
|
253
|
+
# Fired when an item is hovered.
|
|
254
|
+
on_item_hovered: EventHandler[lambda pos: [pos]]
|
|
235
255
|
|
|
256
|
+
# Fired when a selection is deleted.
|
|
257
|
+
on_delete: EventHandler[lambda selection: [selection]]
|
|
258
|
+
|
|
259
|
+
# Fired when editing is finished.
|
|
260
|
+
on_finished_editing: EventHandler[lambda new_value, movement: [new_value, movement]]
|
|
261
|
+
|
|
262
|
+
# Fired when a row is appended.
|
|
263
|
+
on_row_appended: EventHandler[lambda: []]
|
|
264
|
+
|
|
265
|
+
# Fired when the selection is cleared.
|
|
266
|
+
on_selection_cleared: EventHandler[lambda: []]
|
|
267
|
+
|
|
268
|
+
# Fired when a column is resized.
|
|
269
|
+
on_column_resize: EventHandler[lambda col, width: [col, width]]
|
|
270
|
+
|
|
271
|
+
def add_imports(self) -> ImportDict:
|
|
272
|
+
"""Add imports for the component.
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
The import dict.
|
|
276
|
+
"""
|
|
236
277
|
return {
|
|
237
|
-
"
|
|
238
|
-
"
|
|
239
|
-
"
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
"on_group_header_context_menu": lambda grp_idx, data: [grp_idx, data],
|
|
243
|
-
"on_group_header_renamed": lambda idx, val: [idx, val],
|
|
244
|
-
"on_header_clicked": lambda pos: [pos],
|
|
245
|
-
"on_header_context_menu": lambda pos: [pos],
|
|
246
|
-
"on_header_menu_click": lambda col, pos: [col, pos],
|
|
247
|
-
"on_item_hovered": lambda pos: [pos],
|
|
248
|
-
"on_delete": lambda selection: [selection],
|
|
249
|
-
"on_finished_editing": lambda new_value, movement: [new_value, movement],
|
|
250
|
-
"on_row_appended": lambda: [],
|
|
251
|
-
"on_selection_cleared": lambda: [],
|
|
252
|
-
"on_column_resize": lambda col, width: [col, width],
|
|
278
|
+
"": f"{format.format_library_name(self.library)}/dist/index.css",
|
|
279
|
+
self.library: "GridCellKind",
|
|
280
|
+
"/utils/helpers/dataeditor.js": ImportVar(
|
|
281
|
+
tag="formatDataEditorCells", is_default=False, install=False
|
|
282
|
+
),
|
|
253
283
|
}
|
|
254
284
|
|
|
255
285
|
def add_hooks(self) -> list[str]:
|
|
@@ -363,43 +393,6 @@ class DataEditor(NoSSRComponent):
|
|
|
363
393
|
}
|
|
364
394
|
|
|
365
395
|
|
|
366
|
-
# try:
|
|
367
|
-
# pass
|
|
368
|
-
|
|
369
|
-
# # def format_dataframe_values(df: DataFrame) -> list[list[Any]]:
|
|
370
|
-
# # """Format dataframe values to a list of lists.
|
|
371
|
-
|
|
372
|
-
# # Args:
|
|
373
|
-
# # df: The dataframe to format.
|
|
374
|
-
|
|
375
|
-
# # Returns:
|
|
376
|
-
# # The dataframe as a list of lists.
|
|
377
|
-
# # """
|
|
378
|
-
# # return [
|
|
379
|
-
# # [str(d) if isinstance(d, (list, tuple)) else d for d in data]
|
|
380
|
-
# # for data in list(df.values.tolist())
|
|
381
|
-
# # ]
|
|
382
|
-
# # ...
|
|
383
|
-
|
|
384
|
-
# # @serializer
|
|
385
|
-
# # def serialize_dataframe(df: DataFrame) -> dict:
|
|
386
|
-
# # """Serialize a pandas dataframe.
|
|
387
|
-
|
|
388
|
-
# # Args:
|
|
389
|
-
# # df: The dataframe to serialize.
|
|
390
|
-
|
|
391
|
-
# # Returns:
|
|
392
|
-
# # The serialized dataframe.
|
|
393
|
-
# # """
|
|
394
|
-
# # return {
|
|
395
|
-
# # "columns": df.columns.tolist(),
|
|
396
|
-
# # "data": format_dataframe_values(df),
|
|
397
|
-
# # }
|
|
398
|
-
|
|
399
|
-
# except ImportError:
|
|
400
|
-
# pass
|
|
401
|
-
|
|
402
|
-
|
|
403
396
|
@serializer
|
|
404
397
|
def serialize_dataeditortheme(theme: DataEditorTheme):
|
|
405
398
|
"""The serializer for the data editor theme.
|
|
@@ -8,12 +8,13 @@ from reflex.vars import Var, BaseVar, ComputedVar
|
|
|
8
8
|
from reflex.event import EventChain, EventHandler, EventSpec
|
|
9
9
|
from reflex.style import Style
|
|
10
10
|
from enum import Enum
|
|
11
|
-
from typing import Any,
|
|
11
|
+
from typing import Any, Dict, List, Literal, Optional, Union
|
|
12
12
|
from reflex.base import Base
|
|
13
13
|
from reflex.components.component import Component, NoSSRComponent
|
|
14
14
|
from reflex.components.literals import LiteralRowMarker
|
|
15
|
-
from reflex.
|
|
16
|
-
from reflex.utils
|
|
15
|
+
from reflex.event import EventHandler
|
|
16
|
+
from reflex.utils import console, format, types
|
|
17
|
+
from reflex.utils.imports import ImportDict, ImportVar
|
|
17
18
|
from reflex.utils.serializers import serializer
|
|
18
19
|
from reflex.vars import Var, get_unique_variable_name
|
|
19
20
|
|
|
@@ -79,8 +80,10 @@ class DataEditorTheme(Base):
|
|
|
79
80
|
text_light: Optional[str]
|
|
80
81
|
text_medium: Optional[str]
|
|
81
82
|
|
|
83
|
+
def on_edit_spec(pos, data: dict[str, Any]): ...
|
|
84
|
+
|
|
82
85
|
class DataEditor(NoSSRComponent):
|
|
83
|
-
def
|
|
86
|
+
def add_imports(self) -> ImportDict: ...
|
|
84
87
|
def add_hooks(self) -> list[str]: ...
|
|
85
88
|
@overload
|
|
86
89
|
@classmethod
|
|
@@ -136,6 +139,9 @@ class DataEditor(NoSSRComponent):
|
|
|
136
139
|
class_name: Optional[Any] = None,
|
|
137
140
|
autofocus: Optional[bool] = None,
|
|
138
141
|
custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
|
|
142
|
+
on_blur: Optional[
|
|
143
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
144
|
+
] = None,
|
|
139
145
|
on_cell_activated: Optional[
|
|
140
146
|
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
141
147
|
] = None,
|
|
@@ -148,15 +154,27 @@ class DataEditor(NoSSRComponent):
|
|
|
148
154
|
on_cell_edited: Optional[
|
|
149
155
|
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
150
156
|
] = None,
|
|
157
|
+
on_click: Optional[
|
|
158
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
159
|
+
] = None,
|
|
151
160
|
on_column_resize: Optional[
|
|
152
161
|
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
153
162
|
] = None,
|
|
163
|
+
on_context_menu: Optional[
|
|
164
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
165
|
+
] = None,
|
|
154
166
|
on_delete: Optional[
|
|
155
167
|
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
156
168
|
] = None,
|
|
169
|
+
on_double_click: Optional[
|
|
170
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
171
|
+
] = None,
|
|
157
172
|
on_finished_editing: Optional[
|
|
158
173
|
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
159
174
|
] = None,
|
|
175
|
+
on_focus: Optional[
|
|
176
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
177
|
+
] = None,
|
|
160
178
|
on_group_header_clicked: Optional[
|
|
161
179
|
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
162
180
|
] = None,
|
|
@@ -178,12 +196,42 @@ class DataEditor(NoSSRComponent):
|
|
|
178
196
|
on_item_hovered: Optional[
|
|
179
197
|
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
180
198
|
] = None,
|
|
199
|
+
on_mount: Optional[
|
|
200
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
201
|
+
] = None,
|
|
202
|
+
on_mouse_down: Optional[
|
|
203
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
204
|
+
] = None,
|
|
205
|
+
on_mouse_enter: Optional[
|
|
206
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
207
|
+
] = None,
|
|
208
|
+
on_mouse_leave: Optional[
|
|
209
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
210
|
+
] = None,
|
|
211
|
+
on_mouse_move: Optional[
|
|
212
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
213
|
+
] = None,
|
|
214
|
+
on_mouse_out: Optional[
|
|
215
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
216
|
+
] = None,
|
|
217
|
+
on_mouse_over: Optional[
|
|
218
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
219
|
+
] = None,
|
|
220
|
+
on_mouse_up: Optional[
|
|
221
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
222
|
+
] = None,
|
|
181
223
|
on_row_appended: Optional[
|
|
182
224
|
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
183
225
|
] = None,
|
|
226
|
+
on_scroll: Optional[
|
|
227
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
228
|
+
] = None,
|
|
184
229
|
on_selection_cleared: Optional[
|
|
185
230
|
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
186
231
|
] = None,
|
|
232
|
+
on_unmount: Optional[
|
|
233
|
+
Union[EventHandler, EventSpec, list, function, BaseVar]
|
|
234
|
+
] = None,
|
|
187
235
|
**props
|
|
188
236
|
) -> "DataEditor":
|
|
189
237
|
"""Create the DataEditor component.
|
reflex/components/el/__init__.py
CHANGED
|
@@ -101,6 +101,9 @@ from .elements.media import picture as picture
|
|
|
101
101
|
from .elements.media import portal as portal
|
|
102
102
|
from .elements.media import source as source
|
|
103
103
|
from .elements.media import svg as svg
|
|
104
|
+
from .elements.media import defs as defs
|
|
105
|
+
from .elements.media import lineargradient as lineargradient
|
|
106
|
+
from .elements.media import stop as stop
|
|
104
107
|
from .elements.media import path as path
|
|
105
108
|
from .elements.media import Area as Area
|
|
106
109
|
from .elements.media import Audio as Audio
|
|
@@ -115,17 +118,22 @@ from .elements.media import Picture as Picture
|
|
|
115
118
|
from .elements.media import Portal as Portal
|
|
116
119
|
from .elements.media import Source as Source
|
|
117
120
|
from .elements.media import Svg as Svg
|
|
121
|
+
from .elements.media import Defs as Defs
|
|
122
|
+
from .elements.media import Lineargradient as Lineargradient
|
|
123
|
+
from .elements.media import Stop as Stop
|
|
118
124
|
from .elements.media import Path as Path
|
|
119
125
|
from .elements.metadata import base as base
|
|
120
126
|
from .elements.metadata import head as head
|
|
121
127
|
from .elements.metadata import link as link
|
|
122
128
|
from .elements.metadata import meta as meta
|
|
123
129
|
from .elements.metadata import title as title
|
|
130
|
+
from .elements.metadata import style as style
|
|
124
131
|
from .elements.metadata import Base as Base
|
|
125
132
|
from .elements.metadata import Head as Head
|
|
126
133
|
from .elements.metadata import Link as Link
|
|
127
134
|
from .elements.metadata import Meta as Meta
|
|
128
135
|
from .elements.metadata import Title as Title
|
|
136
|
+
from .elements.metadata import Style as Style
|
|
129
137
|
from .elements.other import details as details
|
|
130
138
|
from .elements.other import dialog as dialog
|
|
131
139
|
from .elements.other import summary as summary
|
reflex/components/el/element.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Element classes."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
from reflex.utils import lazy_loader
|
|
@@ -64,6 +65,9 @@ _MAPPING = {
|
|
|
64
65
|
"portal",
|
|
65
66
|
"source",
|
|
66
67
|
"svg",
|
|
68
|
+
"defs",
|
|
69
|
+
"lineargradient",
|
|
70
|
+
"stop",
|
|
67
71
|
"path",
|
|
68
72
|
],
|
|
69
73
|
"metadata": [
|
|
@@ -72,6 +76,7 @@ _MAPPING = {
|
|
|
72
76
|
"link",
|
|
73
77
|
"meta",
|
|
74
78
|
"title",
|
|
79
|
+
"style",
|
|
75
80
|
],
|
|
76
81
|
"other": ["details", "dialog", "summary", "slot", "template", "math", "html"],
|
|
77
82
|
"scripts": ["canvas", "noscript", "script"],
|