Merge remote-tracking branch 'upstream/main' into state-compression
This commit is contained in:
commit
86342c79f3
@ -99,7 +99,15 @@ from reflex.state import (
|
|||||||
_substate_key,
|
_substate_key,
|
||||||
code_uses_state_contexts,
|
code_uses_state_contexts,
|
||||||
)
|
)
|
||||||
from reflex.utils import codespaces, console, exceptions, format, prerequisites, types
|
from reflex.utils import (
|
||||||
|
codespaces,
|
||||||
|
console,
|
||||||
|
exceptions,
|
||||||
|
format,
|
||||||
|
path_ops,
|
||||||
|
prerequisites,
|
||||||
|
types,
|
||||||
|
)
|
||||||
from reflex.utils.exec import is_prod_mode, is_testing_env
|
from reflex.utils.exec import is_prod_mode, is_testing_env
|
||||||
from reflex.utils.imports import ImportVar
|
from reflex.utils.imports import ImportVar
|
||||||
|
|
||||||
@ -991,9 +999,10 @@ class App(MiddlewareMixin, LifespanMixin):
|
|||||||
should_compile = self._should_compile()
|
should_compile = self._should_compile()
|
||||||
|
|
||||||
if not should_compile:
|
if not should_compile:
|
||||||
for route in self._unevaluated_pages:
|
with console.timing("Evaluate Pages (Backend)"):
|
||||||
console.debug(f"Evaluating page: {route}")
|
for route in self._unevaluated_pages:
|
||||||
self._compile_page(route, save_page=should_compile)
|
console.debug(f"Evaluating page: {route}")
|
||||||
|
self._compile_page(route, save_page=should_compile)
|
||||||
|
|
||||||
# Add the optional endpoints (_upload)
|
# Add the optional endpoints (_upload)
|
||||||
self._add_optional_endpoints()
|
self._add_optional_endpoints()
|
||||||
@ -1019,10 +1028,11 @@ class App(MiddlewareMixin, LifespanMixin):
|
|||||||
+ adhoc_steps_without_executor,
|
+ adhoc_steps_without_executor,
|
||||||
)
|
)
|
||||||
|
|
||||||
for route in self._unevaluated_pages:
|
with console.timing("Evaluate Pages (Frontend)"):
|
||||||
console.debug(f"Evaluating page: {route}")
|
for route in self._unevaluated_pages:
|
||||||
self._compile_page(route, save_page=should_compile)
|
console.debug(f"Evaluating page: {route}")
|
||||||
progress.advance(task)
|
self._compile_page(route, save_page=should_compile)
|
||||||
|
progress.advance(task)
|
||||||
|
|
||||||
# Add the optional endpoints (_upload)
|
# Add the optional endpoints (_upload)
|
||||||
self._add_optional_endpoints()
|
self._add_optional_endpoints()
|
||||||
@ -1057,13 +1067,13 @@ class App(MiddlewareMixin, LifespanMixin):
|
|||||||
custom_components |= component._get_all_custom_components()
|
custom_components |= component._get_all_custom_components()
|
||||||
|
|
||||||
# Perform auto-memoization of stateful components.
|
# Perform auto-memoization of stateful components.
|
||||||
(
|
with console.timing("Auto-memoize StatefulComponents"):
|
||||||
stateful_components_path,
|
(
|
||||||
stateful_components_code,
|
stateful_components_path,
|
||||||
page_components,
|
stateful_components_code,
|
||||||
) = compiler.compile_stateful_components(self._pages.values())
|
page_components,
|
||||||
|
) = compiler.compile_stateful_components(self._pages.values())
|
||||||
progress.advance(task)
|
progress.advance(task)
|
||||||
|
|
||||||
# Catch "static" apps (that do not define a rx.State subclass) which are trying to access rx.State.
|
# Catch "static" apps (that do not define a rx.State subclass) which are trying to access rx.State.
|
||||||
if code_uses_state_contexts(stateful_components_code) and self._state is None:
|
if code_uses_state_contexts(stateful_components_code) and self._state is None:
|
||||||
@ -1086,6 +1096,17 @@ class App(MiddlewareMixin, LifespanMixin):
|
|||||||
|
|
||||||
progress.advance(task)
|
progress.advance(task)
|
||||||
|
|
||||||
|
# Copy the assets.
|
||||||
|
assets_src = Path.cwd() / constants.Dirs.APP_ASSETS
|
||||||
|
if assets_src.is_dir():
|
||||||
|
with console.timing("Copy assets"):
|
||||||
|
path_ops.update_directory_tree(
|
||||||
|
src=assets_src,
|
||||||
|
dest=(
|
||||||
|
Path.cwd() / prerequisites.get_web_dir() / constants.Dirs.PUBLIC
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
# Use a forking process pool, if possible. Much faster, especially for large sites.
|
# Use a forking process pool, if possible. Much faster, especially for large sites.
|
||||||
# Fallback to ThreadPoolExecutor as something that will always work.
|
# Fallback to ThreadPoolExecutor as something that will always work.
|
||||||
executor = None
|
executor = None
|
||||||
@ -1138,9 +1159,10 @@ class App(MiddlewareMixin, LifespanMixin):
|
|||||||
_submit_work(compiler.remove_tailwind_from_postcss)
|
_submit_work(compiler.remove_tailwind_from_postcss)
|
||||||
|
|
||||||
# Wait for all compilation tasks to complete.
|
# Wait for all compilation tasks to complete.
|
||||||
for future in concurrent.futures.as_completed(result_futures):
|
with console.timing("Compile to Javascript"):
|
||||||
compile_results.append(future.result())
|
for future in concurrent.futures.as_completed(result_futures):
|
||||||
progress.advance(task)
|
compile_results.append(future.result())
|
||||||
|
progress.advance(task)
|
||||||
|
|
||||||
app_root = self._app_root(app_wrappers=app_wrappers)
|
app_root = self._app_root(app_wrappers=app_wrappers)
|
||||||
|
|
||||||
@ -1175,7 +1197,8 @@ class App(MiddlewareMixin, LifespanMixin):
|
|||||||
progress.stop()
|
progress.stop()
|
||||||
|
|
||||||
# Install frontend packages.
|
# Install frontend packages.
|
||||||
self._get_frontend_packages(all_imports)
|
with console.timing("Install Frontend Packages"):
|
||||||
|
self._get_frontend_packages(all_imports)
|
||||||
|
|
||||||
# Setup the next.config.js
|
# Setup the next.config.js
|
||||||
transpile_packages = [
|
transpile_packages = [
|
||||||
@ -1201,8 +1224,9 @@ class App(MiddlewareMixin, LifespanMixin):
|
|||||||
# Remove pages that are no longer in the app.
|
# Remove pages that are no longer in the app.
|
||||||
p.unlink()
|
p.unlink()
|
||||||
|
|
||||||
for output_path, code in compile_results:
|
with console.timing("Write to Disk"):
|
||||||
compiler_utils.write_page(output_path, code)
|
for output_path, code in compile_results:
|
||||||
|
compiler_utils.write_page(output_path, code)
|
||||||
|
|
||||||
@contextlib.asynccontextmanager
|
@contextlib.asynccontextmanager
|
||||||
async def modify_state(self, token: str) -> AsyncIterator[BaseState]:
|
async def modify_state(self, token: str) -> AsyncIterator[BaseState]:
|
||||||
|
@ -119,24 +119,34 @@ def compile_imports(import_dict: ParsedImportDict) -> list[dict]:
|
|||||||
validate_imports(collapsed_import_dict)
|
validate_imports(collapsed_import_dict)
|
||||||
import_dicts = []
|
import_dicts = []
|
||||||
for lib, fields in collapsed_import_dict.items():
|
for lib, fields in collapsed_import_dict.items():
|
||||||
default, rest = compile_import_statement(fields)
|
|
||||||
|
|
||||||
# prevent lib from being rendered on the page if all imports are non rendered kind
|
# prevent lib from being rendered on the page if all imports are non rendered kind
|
||||||
if not any(f.render for f in fields):
|
if not any(f.render for f in fields):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if not lib:
|
lib_paths: dict[str, list[ImportVar]] = {}
|
||||||
if default:
|
|
||||||
raise ValueError("No default field allowed for empty library.")
|
|
||||||
if rest is None or len(rest) == 0:
|
|
||||||
raise ValueError("No fields to import.")
|
|
||||||
import_dicts.extend(get_import_dict(module) for module in sorted(rest))
|
|
||||||
continue
|
|
||||||
|
|
||||||
# remove the version before rendering the package imports
|
for field in fields:
|
||||||
lib = format.format_library_name(lib)
|
lib_paths.setdefault(field.package_path, []).append(field)
|
||||||
|
|
||||||
import_dicts.append(get_import_dict(lib, default, rest))
|
compiled = {
|
||||||
|
path: compile_import_statement(fields) for path, fields in lib_paths.items()
|
||||||
|
}
|
||||||
|
|
||||||
|
for path, (default, rest) in compiled.items():
|
||||||
|
if not lib:
|
||||||
|
if default:
|
||||||
|
raise ValueError("No default field allowed for empty library.")
|
||||||
|
if rest is None or len(rest) == 0:
|
||||||
|
raise ValueError("No fields to import.")
|
||||||
|
import_dicts.extend(get_import_dict(module) for module in sorted(rest))
|
||||||
|
continue
|
||||||
|
|
||||||
|
# remove the version before rendering the package imports
|
||||||
|
formatted_lib = format.format_library_name(lib) + (
|
||||||
|
path if path != "/" else ""
|
||||||
|
)
|
||||||
|
|
||||||
|
import_dicts.append(get_import_dict(formatted_lib, default, rest))
|
||||||
return import_dicts
|
return import_dicts
|
||||||
|
|
||||||
|
|
||||||
|
@ -107,9 +107,7 @@ class StickyBadge(A):
|
|||||||
default=True,
|
default=True,
|
||||||
global_ref=False,
|
global_ref=False,
|
||||||
)
|
)
|
||||||
localhost_hostnames = Var.create(
|
localhost_hostnames = Var.create(["localhost", "127.0.0.1", "[::1]"])
|
||||||
["localhost", "127.0.0.1", "[::1]"]
|
|
||||||
).guess_type()
|
|
||||||
is_localhost_expr = localhost_hostnames.contains(
|
is_localhost_expr = localhost_hostnames.contains(
|
||||||
Var("window.location.hostname", _var_type=str).guess_type(),
|
Var("window.location.hostname", _var_type=str).guess_type(),
|
||||||
)
|
)
|
||||||
|
@ -4,7 +4,7 @@ from reflex.components.component import Component
|
|||||||
from reflex.utils import format
|
from reflex.utils import format
|
||||||
from reflex.utils.imports import ImportVar
|
from reflex.utils.imports import ImportVar
|
||||||
from reflex.vars.base import LiteralVar, Var
|
from reflex.vars.base import LiteralVar, Var
|
||||||
from reflex.vars.sequence import LiteralStringVar
|
from reflex.vars.sequence import LiteralStringVar, StringVar
|
||||||
|
|
||||||
|
|
||||||
class LucideIconComponent(Component):
|
class LucideIconComponent(Component):
|
||||||
@ -40,7 +40,12 @@ class Icon(LucideIconComponent):
|
|||||||
The created component.
|
The created component.
|
||||||
"""
|
"""
|
||||||
if children:
|
if children:
|
||||||
if len(children) == 1 and isinstance(children[0], str):
|
if len(children) == 1:
|
||||||
|
child = Var.create(children[0]).guess_type()
|
||||||
|
if not isinstance(child, StringVar):
|
||||||
|
raise AttributeError(
|
||||||
|
f"Icon name must be a string, got {children[0]._var_type if isinstance(children[0], Var) else children[0]}"
|
||||||
|
)
|
||||||
props["tag"] = children[0]
|
props["tag"] = children[0]
|
||||||
else:
|
else:
|
||||||
raise AttributeError(
|
raise AttributeError(
|
||||||
@ -56,7 +61,10 @@ class Icon(LucideIconComponent):
|
|||||||
else:
|
else:
|
||||||
raise TypeError(f"Icon name must be a string, got {type(tag)}")
|
raise TypeError(f"Icon name must be a string, got {type(tag)}")
|
||||||
elif isinstance(tag, Var):
|
elif isinstance(tag, Var):
|
||||||
return DynamicIcon.create(name=tag, **props)
|
tag_stringified = tag.guess_type()
|
||||||
|
if not isinstance(tag_stringified, StringVar):
|
||||||
|
raise TypeError(f"Icon name must be a string, got {tag._var_type}")
|
||||||
|
return DynamicIcon.create(name=tag_stringified.replace("_", "-"), **props)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
not isinstance(tag, str)
|
not isinstance(tag, str)
|
||||||
|
@ -1,5 +1,32 @@
|
|||||||
"""Plotly components."""
|
"""Plotly components."""
|
||||||
|
|
||||||
from .plotly import Plotly
|
from reflex.components.component import ComponentNamespace
|
||||||
|
|
||||||
plotly = Plotly.create
|
from .plotly import (
|
||||||
|
Plotly,
|
||||||
|
PlotlyBasic,
|
||||||
|
PlotlyCartesian,
|
||||||
|
PlotlyFinance,
|
||||||
|
PlotlyGeo,
|
||||||
|
PlotlyGl2d,
|
||||||
|
PlotlyGl3d,
|
||||||
|
PlotlyMapbox,
|
||||||
|
PlotlyStrict,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class PlotlyNamespace(ComponentNamespace):
|
||||||
|
"""Plotly namespace."""
|
||||||
|
|
||||||
|
__call__ = Plotly.create
|
||||||
|
basic = PlotlyBasic.create
|
||||||
|
cartesian = PlotlyCartesian.create
|
||||||
|
geo = PlotlyGeo.create
|
||||||
|
gl2d = PlotlyGl2d.create
|
||||||
|
gl3d = PlotlyGl3d.create
|
||||||
|
finance = PlotlyFinance.create
|
||||||
|
mapbox = PlotlyMapbox.create
|
||||||
|
strict = PlotlyStrict.create
|
||||||
|
|
||||||
|
|
||||||
|
plotly = PlotlyNamespace()
|
||||||
|
@ -10,6 +10,7 @@ from reflex.components.component import Component, NoSSRComponent
|
|||||||
from reflex.components.core.cond import color_mode_cond
|
from reflex.components.core.cond import color_mode_cond
|
||||||
from reflex.event import EventHandler, no_args_event_spec
|
from reflex.event import EventHandler, no_args_event_spec
|
||||||
from reflex.utils import console
|
from reflex.utils import console
|
||||||
|
from reflex.utils.imports import ImportDict, ImportVar
|
||||||
from reflex.vars.base import LiteralVar, Var
|
from reflex.vars.base import LiteralVar, Var
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -278,3 +279,237 @@ const extractPoints = (points) => {
|
|||||||
# Spread the figure dict over props, nothing to merge.
|
# Spread the figure dict over props, nothing to merge.
|
||||||
tag.special_props.append(Var(_js_expr=f"{{...{figure!s}}}"))
|
tag.special_props.append(Var(_js_expr=f"{{...{figure!s}}}"))
|
||||||
return tag
|
return tag
|
||||||
|
|
||||||
|
|
||||||
|
CREATE_PLOTLY_COMPONENT: ImportDict = {
|
||||||
|
"react-plotly.js": [
|
||||||
|
ImportVar(
|
||||||
|
tag="createPlotlyComponent",
|
||||||
|
is_default=True,
|
||||||
|
package_path="/factory",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def dynamic_plotly_import(name: str, package: str) -> str:
|
||||||
|
"""Create a dynamic import for a plotly component.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: The name of the component.
|
||||||
|
package: The package path of the component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The dynamic import for the plotly component.
|
||||||
|
"""
|
||||||
|
return f"""
|
||||||
|
const {name} = dynamic(() => import('{package}').then(mod => createPlotlyComponent(mod)), {{ssr: false}})
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class PlotlyBasic(Plotly):
|
||||||
|
"""Display a basic plotly graph."""
|
||||||
|
|
||||||
|
tag: str = "BasicPlotlyPlot"
|
||||||
|
|
||||||
|
library = "react-plotly.js@2.6.0"
|
||||||
|
|
||||||
|
lib_dependencies: list[str] = ["plotly.js-basic-dist-min@3.0.0"]
|
||||||
|
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
||||||
|
"""Add imports for the plotly basic component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The imports for the plotly basic component.
|
||||||
|
"""
|
||||||
|
return CREATE_PLOTLY_COMPONENT
|
||||||
|
|
||||||
|
def _get_dynamic_imports(self) -> str:
|
||||||
|
"""Get the dynamic imports for the plotly basic component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The dynamic imports for the plotly basic component.
|
||||||
|
"""
|
||||||
|
return dynamic_plotly_import(self.tag, "plotly.js-basic-dist-min")
|
||||||
|
|
||||||
|
|
||||||
|
class PlotlyCartesian(Plotly):
|
||||||
|
"""Display a plotly cartesian graph."""
|
||||||
|
|
||||||
|
tag: str = "CartesianPlotlyPlot"
|
||||||
|
|
||||||
|
library = "react-plotly.js@2.6.0"
|
||||||
|
|
||||||
|
lib_dependencies: list[str] = ["plotly.js-cartesian-dist-min@3.0.0"]
|
||||||
|
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
||||||
|
"""Add imports for the plotly cartesian component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The imports for the plotly cartesian component.
|
||||||
|
"""
|
||||||
|
return CREATE_PLOTLY_COMPONENT
|
||||||
|
|
||||||
|
def _get_dynamic_imports(self) -> str:
|
||||||
|
"""Get the dynamic imports for the plotly cartesian component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The dynamic imports for the plotly cartesian component.
|
||||||
|
"""
|
||||||
|
return dynamic_plotly_import(self.tag, "plotly.js-cartesian-dist-min")
|
||||||
|
|
||||||
|
|
||||||
|
class PlotlyGeo(Plotly):
|
||||||
|
"""Display a plotly geo graph."""
|
||||||
|
|
||||||
|
tag: str = "GeoPlotlyPlot"
|
||||||
|
|
||||||
|
library = "react-plotly.js@2.6.0"
|
||||||
|
|
||||||
|
lib_dependencies: list[str] = ["plotly.js-geo-dist-min@3.0.0"]
|
||||||
|
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
||||||
|
"""Add imports for the plotly geo component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The imports for the plotly geo component.
|
||||||
|
"""
|
||||||
|
return CREATE_PLOTLY_COMPONENT
|
||||||
|
|
||||||
|
def _get_dynamic_imports(self) -> str:
|
||||||
|
"""Get the dynamic imports for the plotly geo component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The dynamic imports for the plotly geo component.
|
||||||
|
"""
|
||||||
|
return dynamic_plotly_import(self.tag, "plotly.js-geo-dist-min")
|
||||||
|
|
||||||
|
|
||||||
|
class PlotlyGl3d(Plotly):
|
||||||
|
"""Display a plotly 3d graph."""
|
||||||
|
|
||||||
|
tag: str = "Gl3dPlotlyPlot"
|
||||||
|
|
||||||
|
library = "react-plotly.js@2.6.0"
|
||||||
|
|
||||||
|
lib_dependencies: list[str] = ["plotly.js-gl3d-dist-min@3.0.0"]
|
||||||
|
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
||||||
|
"""Add imports for the plotly 3d component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The imports for the plotly 3d component.
|
||||||
|
"""
|
||||||
|
return CREATE_PLOTLY_COMPONENT
|
||||||
|
|
||||||
|
def _get_dynamic_imports(self) -> str:
|
||||||
|
"""Get the dynamic imports for the plotly 3d component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The dynamic imports for the plotly 3d component.
|
||||||
|
"""
|
||||||
|
return dynamic_plotly_import(self.tag, "plotly.js-gl3d-dist-min")
|
||||||
|
|
||||||
|
|
||||||
|
class PlotlyGl2d(Plotly):
|
||||||
|
"""Display a plotly 2d graph."""
|
||||||
|
|
||||||
|
tag: str = "Gl2dPlotlyPlot"
|
||||||
|
|
||||||
|
library = "react-plotly.js@2.6.0"
|
||||||
|
|
||||||
|
lib_dependencies: list[str] = ["plotly.js-gl2d-dist-min@3.0.0"]
|
||||||
|
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
||||||
|
"""Add imports for the plotly 2d component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The imports for the plotly 2d component.
|
||||||
|
"""
|
||||||
|
return CREATE_PLOTLY_COMPONENT
|
||||||
|
|
||||||
|
def _get_dynamic_imports(self) -> str:
|
||||||
|
"""Get the dynamic imports for the plotly 2d component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The dynamic imports for the plotly 2d component.
|
||||||
|
"""
|
||||||
|
return dynamic_plotly_import(self.tag, "plotly.js-gl2d-dist-min")
|
||||||
|
|
||||||
|
|
||||||
|
class PlotlyMapbox(Plotly):
|
||||||
|
"""Display a plotly mapbox graph."""
|
||||||
|
|
||||||
|
tag: str = "MapboxPlotlyPlot"
|
||||||
|
|
||||||
|
library = "react-plotly.js@2.6.0"
|
||||||
|
|
||||||
|
lib_dependencies: list[str] = ["plotly.js-mapbox-dist-min@3.0.0"]
|
||||||
|
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
||||||
|
"""Add imports for the plotly mapbox component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The imports for the plotly mapbox component.
|
||||||
|
"""
|
||||||
|
return CREATE_PLOTLY_COMPONENT
|
||||||
|
|
||||||
|
def _get_dynamic_imports(self) -> str:
|
||||||
|
"""Get the dynamic imports for the plotly mapbox component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The dynamic imports for the plotly mapbox component.
|
||||||
|
"""
|
||||||
|
return dynamic_plotly_import(self.tag, "plotly.js-mapbox-dist-min")
|
||||||
|
|
||||||
|
|
||||||
|
class PlotlyFinance(Plotly):
|
||||||
|
"""Display a plotly finance graph."""
|
||||||
|
|
||||||
|
tag: str = "FinancePlotlyPlot"
|
||||||
|
|
||||||
|
library = "react-plotly.js@2.6.0"
|
||||||
|
|
||||||
|
lib_dependencies: list[str] = ["plotly.js-finance-dist-min@3.0.0"]
|
||||||
|
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
||||||
|
"""Add imports for the plotly finance component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The imports for the plotly finance component.
|
||||||
|
"""
|
||||||
|
return CREATE_PLOTLY_COMPONENT
|
||||||
|
|
||||||
|
def _get_dynamic_imports(self) -> str:
|
||||||
|
"""Get the dynamic imports for the plotly finance component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The dynamic imports for the plotly finance component.
|
||||||
|
"""
|
||||||
|
return dynamic_plotly_import(self.tag, "plotly.js-finance-dist-min")
|
||||||
|
|
||||||
|
|
||||||
|
class PlotlyStrict(Plotly):
|
||||||
|
"""Display a plotly strict graph."""
|
||||||
|
|
||||||
|
tag: str = "StrictPlotlyPlot"
|
||||||
|
|
||||||
|
library = "react-plotly.js@2.6.0"
|
||||||
|
|
||||||
|
lib_dependencies: list[str] = ["plotly.js-strict-dist-min@3.0.0"]
|
||||||
|
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
||||||
|
"""Add imports for the plotly strict component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The imports for the plotly strict component.
|
||||||
|
"""
|
||||||
|
return CREATE_PLOTLY_COMPONENT
|
||||||
|
|
||||||
|
def _get_dynamic_imports(self) -> str:
|
||||||
|
"""Get the dynamic imports for the plotly strict component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The dynamic imports for the plotly strict component.
|
||||||
|
"""
|
||||||
|
return dynamic_plotly_import(self.tag, "plotly.js-strict-dist-min")
|
||||||
|
@ -11,6 +11,7 @@ from reflex.components.component import NoSSRComponent
|
|||||||
from reflex.event import EventType
|
from reflex.event import EventType
|
||||||
from reflex.style import Style
|
from reflex.style import Style
|
||||||
from reflex.utils import console
|
from reflex.utils import console
|
||||||
|
from reflex.utils.imports import ImportDict
|
||||||
from reflex.vars.base import Var
|
from reflex.vars.base import Var
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -141,3 +142,767 @@ class Plotly(NoSSRComponent):
|
|||||||
The Plotly component.
|
The Plotly component.
|
||||||
"""
|
"""
|
||||||
...
|
...
|
||||||
|
|
||||||
|
CREATE_PLOTLY_COMPONENT: ImportDict
|
||||||
|
|
||||||
|
def dynamic_plotly_import(name: str, package: str) -> str: ...
|
||||||
|
|
||||||
|
class PlotlyBasic(Plotly):
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]: ...
|
||||||
|
@overload
|
||||||
|
@classmethod
|
||||||
|
def create( # type: ignore
|
||||||
|
cls,
|
||||||
|
*children,
|
||||||
|
data: Optional[Union[Figure, Var[Figure]]] = None, # type: ignore
|
||||||
|
layout: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
template: Optional[Union[Template, Var[Template]]] = None, # type: ignore
|
||||||
|
config: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
use_resize_handler: Optional[Union[Var[bool], bool]] = None,
|
||||||
|
style: Optional[Style] = None,
|
||||||
|
key: Optional[Any] = None,
|
||||||
|
id: Optional[Any] = None,
|
||||||
|
class_name: Optional[Any] = None,
|
||||||
|
autofocus: Optional[bool] = None,
|
||||||
|
custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
|
||||||
|
on_after_plot: Optional[EventType[()]] = None,
|
||||||
|
on_animated: Optional[EventType[()]] = None,
|
||||||
|
on_animating_frame: Optional[EventType[()]] = None,
|
||||||
|
on_animation_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_autosize: Optional[EventType[()]] = None,
|
||||||
|
on_before_hover: Optional[EventType[()]] = None,
|
||||||
|
on_blur: Optional[EventType[()]] = None,
|
||||||
|
on_button_clicked: Optional[EventType[()]] = None,
|
||||||
|
on_click: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_context_menu: Optional[EventType[()]] = None,
|
||||||
|
on_deselect: Optional[EventType[()]] = None,
|
||||||
|
on_double_click: Optional[EventType[()]] = None,
|
||||||
|
on_focus: Optional[EventType[()]] = None,
|
||||||
|
on_hover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_mount: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_down: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_enter: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_leave: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_move: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_out: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_over: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_up: Optional[EventType[()]] = None,
|
||||||
|
on_redraw: Optional[EventType[()]] = None,
|
||||||
|
on_relayout: Optional[EventType[()]] = None,
|
||||||
|
on_relayouting: Optional[EventType[()]] = None,
|
||||||
|
on_restyle: Optional[EventType[()]] = None,
|
||||||
|
on_scroll: Optional[EventType[()]] = None,
|
||||||
|
on_selected: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_selecting: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_transition_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_transitioning: Optional[EventType[()]] = None,
|
||||||
|
on_unhover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_unmount: Optional[EventType[()]] = None,
|
||||||
|
**props,
|
||||||
|
) -> "PlotlyBasic":
|
||||||
|
"""Create the Plotly component.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*children: The children of the component.
|
||||||
|
data: The figure to display. This can be a plotly figure or a plotly data json.
|
||||||
|
layout: The layout of the graph.
|
||||||
|
template: The template for visual appearance of the graph.
|
||||||
|
config: The config of the graph.
|
||||||
|
use_resize_handler: If true, the graph will resize when the window is resized.
|
||||||
|
on_after_plot: Fired after the plot is redrawn.
|
||||||
|
on_animated: Fired after the plot was animated.
|
||||||
|
on_animating_frame: Fired while animating a single frame (does not currently pass data through).
|
||||||
|
on_animation_interrupted: Fired when an animation is interrupted (to start a new animation for example).
|
||||||
|
on_autosize: Fired when the plot is responsively sized.
|
||||||
|
on_before_hover: Fired whenever mouse moves over a plot.
|
||||||
|
on_button_clicked: Fired when a plotly UI button is clicked.
|
||||||
|
on_click: Fired when the plot is clicked.
|
||||||
|
on_deselect: Fired when a selection is cleared (via double click).
|
||||||
|
on_double_click: Fired when the plot is double clicked.
|
||||||
|
on_hover: Fired when a plot element is hovered over.
|
||||||
|
on_relayout: Fired after the plot is laid out (zoom, pan, etc).
|
||||||
|
on_relayouting: Fired while the plot is being laid out.
|
||||||
|
on_restyle: Fired after the plot style is changed.
|
||||||
|
on_redraw: Fired after the plot is redrawn.
|
||||||
|
on_selected: Fired after selecting plot elements.
|
||||||
|
on_selecting: Fired while dragging a selection.
|
||||||
|
on_transitioning: Fired while an animation is occurring.
|
||||||
|
on_transition_interrupted: Fired when a transition is stopped early.
|
||||||
|
on_unhover: Fired when a hovered element is no longer hovered.
|
||||||
|
style: The style of the component.
|
||||||
|
key: A unique key for the component.
|
||||||
|
id: The id for the component.
|
||||||
|
class_name: The class name for the component.
|
||||||
|
autofocus: Whether the component should take the focus once the page is loaded
|
||||||
|
custom_attrs: custom attribute
|
||||||
|
**props: The properties of the component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The Plotly component.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
class PlotlyCartesian(Plotly):
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]: ...
|
||||||
|
@overload
|
||||||
|
@classmethod
|
||||||
|
def create( # type: ignore
|
||||||
|
cls,
|
||||||
|
*children,
|
||||||
|
data: Optional[Union[Figure, Var[Figure]]] = None, # type: ignore
|
||||||
|
layout: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
template: Optional[Union[Template, Var[Template]]] = None, # type: ignore
|
||||||
|
config: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
use_resize_handler: Optional[Union[Var[bool], bool]] = None,
|
||||||
|
style: Optional[Style] = None,
|
||||||
|
key: Optional[Any] = None,
|
||||||
|
id: Optional[Any] = None,
|
||||||
|
class_name: Optional[Any] = None,
|
||||||
|
autofocus: Optional[bool] = None,
|
||||||
|
custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
|
||||||
|
on_after_plot: Optional[EventType[()]] = None,
|
||||||
|
on_animated: Optional[EventType[()]] = None,
|
||||||
|
on_animating_frame: Optional[EventType[()]] = None,
|
||||||
|
on_animation_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_autosize: Optional[EventType[()]] = None,
|
||||||
|
on_before_hover: Optional[EventType[()]] = None,
|
||||||
|
on_blur: Optional[EventType[()]] = None,
|
||||||
|
on_button_clicked: Optional[EventType[()]] = None,
|
||||||
|
on_click: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_context_menu: Optional[EventType[()]] = None,
|
||||||
|
on_deselect: Optional[EventType[()]] = None,
|
||||||
|
on_double_click: Optional[EventType[()]] = None,
|
||||||
|
on_focus: Optional[EventType[()]] = None,
|
||||||
|
on_hover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_mount: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_down: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_enter: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_leave: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_move: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_out: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_over: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_up: Optional[EventType[()]] = None,
|
||||||
|
on_redraw: Optional[EventType[()]] = None,
|
||||||
|
on_relayout: Optional[EventType[()]] = None,
|
||||||
|
on_relayouting: Optional[EventType[()]] = None,
|
||||||
|
on_restyle: Optional[EventType[()]] = None,
|
||||||
|
on_scroll: Optional[EventType[()]] = None,
|
||||||
|
on_selected: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_selecting: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_transition_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_transitioning: Optional[EventType[()]] = None,
|
||||||
|
on_unhover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_unmount: Optional[EventType[()]] = None,
|
||||||
|
**props,
|
||||||
|
) -> "PlotlyCartesian":
|
||||||
|
"""Create the Plotly component.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*children: The children of the component.
|
||||||
|
data: The figure to display. This can be a plotly figure or a plotly data json.
|
||||||
|
layout: The layout of the graph.
|
||||||
|
template: The template for visual appearance of the graph.
|
||||||
|
config: The config of the graph.
|
||||||
|
use_resize_handler: If true, the graph will resize when the window is resized.
|
||||||
|
on_after_plot: Fired after the plot is redrawn.
|
||||||
|
on_animated: Fired after the plot was animated.
|
||||||
|
on_animating_frame: Fired while animating a single frame (does not currently pass data through).
|
||||||
|
on_animation_interrupted: Fired when an animation is interrupted (to start a new animation for example).
|
||||||
|
on_autosize: Fired when the plot is responsively sized.
|
||||||
|
on_before_hover: Fired whenever mouse moves over a plot.
|
||||||
|
on_button_clicked: Fired when a plotly UI button is clicked.
|
||||||
|
on_click: Fired when the plot is clicked.
|
||||||
|
on_deselect: Fired when a selection is cleared (via double click).
|
||||||
|
on_double_click: Fired when the plot is double clicked.
|
||||||
|
on_hover: Fired when a plot element is hovered over.
|
||||||
|
on_relayout: Fired after the plot is laid out (zoom, pan, etc).
|
||||||
|
on_relayouting: Fired while the plot is being laid out.
|
||||||
|
on_restyle: Fired after the plot style is changed.
|
||||||
|
on_redraw: Fired after the plot is redrawn.
|
||||||
|
on_selected: Fired after selecting plot elements.
|
||||||
|
on_selecting: Fired while dragging a selection.
|
||||||
|
on_transitioning: Fired while an animation is occurring.
|
||||||
|
on_transition_interrupted: Fired when a transition is stopped early.
|
||||||
|
on_unhover: Fired when a hovered element is no longer hovered.
|
||||||
|
style: The style of the component.
|
||||||
|
key: A unique key for the component.
|
||||||
|
id: The id for the component.
|
||||||
|
class_name: The class name for the component.
|
||||||
|
autofocus: Whether the component should take the focus once the page is loaded
|
||||||
|
custom_attrs: custom attribute
|
||||||
|
**props: The properties of the component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The Plotly component.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
class PlotlyGeo(Plotly):
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]: ...
|
||||||
|
@overload
|
||||||
|
@classmethod
|
||||||
|
def create( # type: ignore
|
||||||
|
cls,
|
||||||
|
*children,
|
||||||
|
data: Optional[Union[Figure, Var[Figure]]] = None, # type: ignore
|
||||||
|
layout: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
template: Optional[Union[Template, Var[Template]]] = None, # type: ignore
|
||||||
|
config: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
use_resize_handler: Optional[Union[Var[bool], bool]] = None,
|
||||||
|
style: Optional[Style] = None,
|
||||||
|
key: Optional[Any] = None,
|
||||||
|
id: Optional[Any] = None,
|
||||||
|
class_name: Optional[Any] = None,
|
||||||
|
autofocus: Optional[bool] = None,
|
||||||
|
custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
|
||||||
|
on_after_plot: Optional[EventType[()]] = None,
|
||||||
|
on_animated: Optional[EventType[()]] = None,
|
||||||
|
on_animating_frame: Optional[EventType[()]] = None,
|
||||||
|
on_animation_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_autosize: Optional[EventType[()]] = None,
|
||||||
|
on_before_hover: Optional[EventType[()]] = None,
|
||||||
|
on_blur: Optional[EventType[()]] = None,
|
||||||
|
on_button_clicked: Optional[EventType[()]] = None,
|
||||||
|
on_click: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_context_menu: Optional[EventType[()]] = None,
|
||||||
|
on_deselect: Optional[EventType[()]] = None,
|
||||||
|
on_double_click: Optional[EventType[()]] = None,
|
||||||
|
on_focus: Optional[EventType[()]] = None,
|
||||||
|
on_hover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_mount: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_down: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_enter: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_leave: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_move: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_out: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_over: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_up: Optional[EventType[()]] = None,
|
||||||
|
on_redraw: Optional[EventType[()]] = None,
|
||||||
|
on_relayout: Optional[EventType[()]] = None,
|
||||||
|
on_relayouting: Optional[EventType[()]] = None,
|
||||||
|
on_restyle: Optional[EventType[()]] = None,
|
||||||
|
on_scroll: Optional[EventType[()]] = None,
|
||||||
|
on_selected: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_selecting: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_transition_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_transitioning: Optional[EventType[()]] = None,
|
||||||
|
on_unhover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_unmount: Optional[EventType[()]] = None,
|
||||||
|
**props,
|
||||||
|
) -> "PlotlyGeo":
|
||||||
|
"""Create the Plotly component.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*children: The children of the component.
|
||||||
|
data: The figure to display. This can be a plotly figure or a plotly data json.
|
||||||
|
layout: The layout of the graph.
|
||||||
|
template: The template for visual appearance of the graph.
|
||||||
|
config: The config of the graph.
|
||||||
|
use_resize_handler: If true, the graph will resize when the window is resized.
|
||||||
|
on_after_plot: Fired after the plot is redrawn.
|
||||||
|
on_animated: Fired after the plot was animated.
|
||||||
|
on_animating_frame: Fired while animating a single frame (does not currently pass data through).
|
||||||
|
on_animation_interrupted: Fired when an animation is interrupted (to start a new animation for example).
|
||||||
|
on_autosize: Fired when the plot is responsively sized.
|
||||||
|
on_before_hover: Fired whenever mouse moves over a plot.
|
||||||
|
on_button_clicked: Fired when a plotly UI button is clicked.
|
||||||
|
on_click: Fired when the plot is clicked.
|
||||||
|
on_deselect: Fired when a selection is cleared (via double click).
|
||||||
|
on_double_click: Fired when the plot is double clicked.
|
||||||
|
on_hover: Fired when a plot element is hovered over.
|
||||||
|
on_relayout: Fired after the plot is laid out (zoom, pan, etc).
|
||||||
|
on_relayouting: Fired while the plot is being laid out.
|
||||||
|
on_restyle: Fired after the plot style is changed.
|
||||||
|
on_redraw: Fired after the plot is redrawn.
|
||||||
|
on_selected: Fired after selecting plot elements.
|
||||||
|
on_selecting: Fired while dragging a selection.
|
||||||
|
on_transitioning: Fired while an animation is occurring.
|
||||||
|
on_transition_interrupted: Fired when a transition is stopped early.
|
||||||
|
on_unhover: Fired when a hovered element is no longer hovered.
|
||||||
|
style: The style of the component.
|
||||||
|
key: A unique key for the component.
|
||||||
|
id: The id for the component.
|
||||||
|
class_name: The class name for the component.
|
||||||
|
autofocus: Whether the component should take the focus once the page is loaded
|
||||||
|
custom_attrs: custom attribute
|
||||||
|
**props: The properties of the component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The Plotly component.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
class PlotlyGl3d(Plotly):
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]: ...
|
||||||
|
@overload
|
||||||
|
@classmethod
|
||||||
|
def create( # type: ignore
|
||||||
|
cls,
|
||||||
|
*children,
|
||||||
|
data: Optional[Union[Figure, Var[Figure]]] = None, # type: ignore
|
||||||
|
layout: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
template: Optional[Union[Template, Var[Template]]] = None, # type: ignore
|
||||||
|
config: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
use_resize_handler: Optional[Union[Var[bool], bool]] = None,
|
||||||
|
style: Optional[Style] = None,
|
||||||
|
key: Optional[Any] = None,
|
||||||
|
id: Optional[Any] = None,
|
||||||
|
class_name: Optional[Any] = None,
|
||||||
|
autofocus: Optional[bool] = None,
|
||||||
|
custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
|
||||||
|
on_after_plot: Optional[EventType[()]] = None,
|
||||||
|
on_animated: Optional[EventType[()]] = None,
|
||||||
|
on_animating_frame: Optional[EventType[()]] = None,
|
||||||
|
on_animation_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_autosize: Optional[EventType[()]] = None,
|
||||||
|
on_before_hover: Optional[EventType[()]] = None,
|
||||||
|
on_blur: Optional[EventType[()]] = None,
|
||||||
|
on_button_clicked: Optional[EventType[()]] = None,
|
||||||
|
on_click: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_context_menu: Optional[EventType[()]] = None,
|
||||||
|
on_deselect: Optional[EventType[()]] = None,
|
||||||
|
on_double_click: Optional[EventType[()]] = None,
|
||||||
|
on_focus: Optional[EventType[()]] = None,
|
||||||
|
on_hover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_mount: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_down: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_enter: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_leave: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_move: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_out: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_over: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_up: Optional[EventType[()]] = None,
|
||||||
|
on_redraw: Optional[EventType[()]] = None,
|
||||||
|
on_relayout: Optional[EventType[()]] = None,
|
||||||
|
on_relayouting: Optional[EventType[()]] = None,
|
||||||
|
on_restyle: Optional[EventType[()]] = None,
|
||||||
|
on_scroll: Optional[EventType[()]] = None,
|
||||||
|
on_selected: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_selecting: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_transition_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_transitioning: Optional[EventType[()]] = None,
|
||||||
|
on_unhover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_unmount: Optional[EventType[()]] = None,
|
||||||
|
**props,
|
||||||
|
) -> "PlotlyGl3d":
|
||||||
|
"""Create the Plotly component.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*children: The children of the component.
|
||||||
|
data: The figure to display. This can be a plotly figure or a plotly data json.
|
||||||
|
layout: The layout of the graph.
|
||||||
|
template: The template for visual appearance of the graph.
|
||||||
|
config: The config of the graph.
|
||||||
|
use_resize_handler: If true, the graph will resize when the window is resized.
|
||||||
|
on_after_plot: Fired after the plot is redrawn.
|
||||||
|
on_animated: Fired after the plot was animated.
|
||||||
|
on_animating_frame: Fired while animating a single frame (does not currently pass data through).
|
||||||
|
on_animation_interrupted: Fired when an animation is interrupted (to start a new animation for example).
|
||||||
|
on_autosize: Fired when the plot is responsively sized.
|
||||||
|
on_before_hover: Fired whenever mouse moves over a plot.
|
||||||
|
on_button_clicked: Fired when a plotly UI button is clicked.
|
||||||
|
on_click: Fired when the plot is clicked.
|
||||||
|
on_deselect: Fired when a selection is cleared (via double click).
|
||||||
|
on_double_click: Fired when the plot is double clicked.
|
||||||
|
on_hover: Fired when a plot element is hovered over.
|
||||||
|
on_relayout: Fired after the plot is laid out (zoom, pan, etc).
|
||||||
|
on_relayouting: Fired while the plot is being laid out.
|
||||||
|
on_restyle: Fired after the plot style is changed.
|
||||||
|
on_redraw: Fired after the plot is redrawn.
|
||||||
|
on_selected: Fired after selecting plot elements.
|
||||||
|
on_selecting: Fired while dragging a selection.
|
||||||
|
on_transitioning: Fired while an animation is occurring.
|
||||||
|
on_transition_interrupted: Fired when a transition is stopped early.
|
||||||
|
on_unhover: Fired when a hovered element is no longer hovered.
|
||||||
|
style: The style of the component.
|
||||||
|
key: A unique key for the component.
|
||||||
|
id: The id for the component.
|
||||||
|
class_name: The class name for the component.
|
||||||
|
autofocus: Whether the component should take the focus once the page is loaded
|
||||||
|
custom_attrs: custom attribute
|
||||||
|
**props: The properties of the component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The Plotly component.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
class PlotlyGl2d(Plotly):
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]: ...
|
||||||
|
@overload
|
||||||
|
@classmethod
|
||||||
|
def create( # type: ignore
|
||||||
|
cls,
|
||||||
|
*children,
|
||||||
|
data: Optional[Union[Figure, Var[Figure]]] = None, # type: ignore
|
||||||
|
layout: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
template: Optional[Union[Template, Var[Template]]] = None, # type: ignore
|
||||||
|
config: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
use_resize_handler: Optional[Union[Var[bool], bool]] = None,
|
||||||
|
style: Optional[Style] = None,
|
||||||
|
key: Optional[Any] = None,
|
||||||
|
id: Optional[Any] = None,
|
||||||
|
class_name: Optional[Any] = None,
|
||||||
|
autofocus: Optional[bool] = None,
|
||||||
|
custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
|
||||||
|
on_after_plot: Optional[EventType[()]] = None,
|
||||||
|
on_animated: Optional[EventType[()]] = None,
|
||||||
|
on_animating_frame: Optional[EventType[()]] = None,
|
||||||
|
on_animation_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_autosize: Optional[EventType[()]] = None,
|
||||||
|
on_before_hover: Optional[EventType[()]] = None,
|
||||||
|
on_blur: Optional[EventType[()]] = None,
|
||||||
|
on_button_clicked: Optional[EventType[()]] = None,
|
||||||
|
on_click: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_context_menu: Optional[EventType[()]] = None,
|
||||||
|
on_deselect: Optional[EventType[()]] = None,
|
||||||
|
on_double_click: Optional[EventType[()]] = None,
|
||||||
|
on_focus: Optional[EventType[()]] = None,
|
||||||
|
on_hover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_mount: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_down: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_enter: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_leave: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_move: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_out: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_over: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_up: Optional[EventType[()]] = None,
|
||||||
|
on_redraw: Optional[EventType[()]] = None,
|
||||||
|
on_relayout: Optional[EventType[()]] = None,
|
||||||
|
on_relayouting: Optional[EventType[()]] = None,
|
||||||
|
on_restyle: Optional[EventType[()]] = None,
|
||||||
|
on_scroll: Optional[EventType[()]] = None,
|
||||||
|
on_selected: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_selecting: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_transition_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_transitioning: Optional[EventType[()]] = None,
|
||||||
|
on_unhover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_unmount: Optional[EventType[()]] = None,
|
||||||
|
**props,
|
||||||
|
) -> "PlotlyGl2d":
|
||||||
|
"""Create the Plotly component.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*children: The children of the component.
|
||||||
|
data: The figure to display. This can be a plotly figure or a plotly data json.
|
||||||
|
layout: The layout of the graph.
|
||||||
|
template: The template for visual appearance of the graph.
|
||||||
|
config: The config of the graph.
|
||||||
|
use_resize_handler: If true, the graph will resize when the window is resized.
|
||||||
|
on_after_plot: Fired after the plot is redrawn.
|
||||||
|
on_animated: Fired after the plot was animated.
|
||||||
|
on_animating_frame: Fired while animating a single frame (does not currently pass data through).
|
||||||
|
on_animation_interrupted: Fired when an animation is interrupted (to start a new animation for example).
|
||||||
|
on_autosize: Fired when the plot is responsively sized.
|
||||||
|
on_before_hover: Fired whenever mouse moves over a plot.
|
||||||
|
on_button_clicked: Fired when a plotly UI button is clicked.
|
||||||
|
on_click: Fired when the plot is clicked.
|
||||||
|
on_deselect: Fired when a selection is cleared (via double click).
|
||||||
|
on_double_click: Fired when the plot is double clicked.
|
||||||
|
on_hover: Fired when a plot element is hovered over.
|
||||||
|
on_relayout: Fired after the plot is laid out (zoom, pan, etc).
|
||||||
|
on_relayouting: Fired while the plot is being laid out.
|
||||||
|
on_restyle: Fired after the plot style is changed.
|
||||||
|
on_redraw: Fired after the plot is redrawn.
|
||||||
|
on_selected: Fired after selecting plot elements.
|
||||||
|
on_selecting: Fired while dragging a selection.
|
||||||
|
on_transitioning: Fired while an animation is occurring.
|
||||||
|
on_transition_interrupted: Fired when a transition is stopped early.
|
||||||
|
on_unhover: Fired when a hovered element is no longer hovered.
|
||||||
|
style: The style of the component.
|
||||||
|
key: A unique key for the component.
|
||||||
|
id: The id for the component.
|
||||||
|
class_name: The class name for the component.
|
||||||
|
autofocus: Whether the component should take the focus once the page is loaded
|
||||||
|
custom_attrs: custom attribute
|
||||||
|
**props: The properties of the component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The Plotly component.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
class PlotlyMapbox(Plotly):
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]: ...
|
||||||
|
@overload
|
||||||
|
@classmethod
|
||||||
|
def create( # type: ignore
|
||||||
|
cls,
|
||||||
|
*children,
|
||||||
|
data: Optional[Union[Figure, Var[Figure]]] = None, # type: ignore
|
||||||
|
layout: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
template: Optional[Union[Template, Var[Template]]] = None, # type: ignore
|
||||||
|
config: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
use_resize_handler: Optional[Union[Var[bool], bool]] = None,
|
||||||
|
style: Optional[Style] = None,
|
||||||
|
key: Optional[Any] = None,
|
||||||
|
id: Optional[Any] = None,
|
||||||
|
class_name: Optional[Any] = None,
|
||||||
|
autofocus: Optional[bool] = None,
|
||||||
|
custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
|
||||||
|
on_after_plot: Optional[EventType[()]] = None,
|
||||||
|
on_animated: Optional[EventType[()]] = None,
|
||||||
|
on_animating_frame: Optional[EventType[()]] = None,
|
||||||
|
on_animation_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_autosize: Optional[EventType[()]] = None,
|
||||||
|
on_before_hover: Optional[EventType[()]] = None,
|
||||||
|
on_blur: Optional[EventType[()]] = None,
|
||||||
|
on_button_clicked: Optional[EventType[()]] = None,
|
||||||
|
on_click: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_context_menu: Optional[EventType[()]] = None,
|
||||||
|
on_deselect: Optional[EventType[()]] = None,
|
||||||
|
on_double_click: Optional[EventType[()]] = None,
|
||||||
|
on_focus: Optional[EventType[()]] = None,
|
||||||
|
on_hover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_mount: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_down: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_enter: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_leave: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_move: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_out: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_over: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_up: Optional[EventType[()]] = None,
|
||||||
|
on_redraw: Optional[EventType[()]] = None,
|
||||||
|
on_relayout: Optional[EventType[()]] = None,
|
||||||
|
on_relayouting: Optional[EventType[()]] = None,
|
||||||
|
on_restyle: Optional[EventType[()]] = None,
|
||||||
|
on_scroll: Optional[EventType[()]] = None,
|
||||||
|
on_selected: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_selecting: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_transition_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_transitioning: Optional[EventType[()]] = None,
|
||||||
|
on_unhover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_unmount: Optional[EventType[()]] = None,
|
||||||
|
**props,
|
||||||
|
) -> "PlotlyMapbox":
|
||||||
|
"""Create the Plotly component.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*children: The children of the component.
|
||||||
|
data: The figure to display. This can be a plotly figure or a plotly data json.
|
||||||
|
layout: The layout of the graph.
|
||||||
|
template: The template for visual appearance of the graph.
|
||||||
|
config: The config of the graph.
|
||||||
|
use_resize_handler: If true, the graph will resize when the window is resized.
|
||||||
|
on_after_plot: Fired after the plot is redrawn.
|
||||||
|
on_animated: Fired after the plot was animated.
|
||||||
|
on_animating_frame: Fired while animating a single frame (does not currently pass data through).
|
||||||
|
on_animation_interrupted: Fired when an animation is interrupted (to start a new animation for example).
|
||||||
|
on_autosize: Fired when the plot is responsively sized.
|
||||||
|
on_before_hover: Fired whenever mouse moves over a plot.
|
||||||
|
on_button_clicked: Fired when a plotly UI button is clicked.
|
||||||
|
on_click: Fired when the plot is clicked.
|
||||||
|
on_deselect: Fired when a selection is cleared (via double click).
|
||||||
|
on_double_click: Fired when the plot is double clicked.
|
||||||
|
on_hover: Fired when a plot element is hovered over.
|
||||||
|
on_relayout: Fired after the plot is laid out (zoom, pan, etc).
|
||||||
|
on_relayouting: Fired while the plot is being laid out.
|
||||||
|
on_restyle: Fired after the plot style is changed.
|
||||||
|
on_redraw: Fired after the plot is redrawn.
|
||||||
|
on_selected: Fired after selecting plot elements.
|
||||||
|
on_selecting: Fired while dragging a selection.
|
||||||
|
on_transitioning: Fired while an animation is occurring.
|
||||||
|
on_transition_interrupted: Fired when a transition is stopped early.
|
||||||
|
on_unhover: Fired when a hovered element is no longer hovered.
|
||||||
|
style: The style of the component.
|
||||||
|
key: A unique key for the component.
|
||||||
|
id: The id for the component.
|
||||||
|
class_name: The class name for the component.
|
||||||
|
autofocus: Whether the component should take the focus once the page is loaded
|
||||||
|
custom_attrs: custom attribute
|
||||||
|
**props: The properties of the component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The Plotly component.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
class PlotlyFinance(Plotly):
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]: ...
|
||||||
|
@overload
|
||||||
|
@classmethod
|
||||||
|
def create( # type: ignore
|
||||||
|
cls,
|
||||||
|
*children,
|
||||||
|
data: Optional[Union[Figure, Var[Figure]]] = None, # type: ignore
|
||||||
|
layout: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
template: Optional[Union[Template, Var[Template]]] = None, # type: ignore
|
||||||
|
config: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
use_resize_handler: Optional[Union[Var[bool], bool]] = None,
|
||||||
|
style: Optional[Style] = None,
|
||||||
|
key: Optional[Any] = None,
|
||||||
|
id: Optional[Any] = None,
|
||||||
|
class_name: Optional[Any] = None,
|
||||||
|
autofocus: Optional[bool] = None,
|
||||||
|
custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
|
||||||
|
on_after_plot: Optional[EventType[()]] = None,
|
||||||
|
on_animated: Optional[EventType[()]] = None,
|
||||||
|
on_animating_frame: Optional[EventType[()]] = None,
|
||||||
|
on_animation_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_autosize: Optional[EventType[()]] = None,
|
||||||
|
on_before_hover: Optional[EventType[()]] = None,
|
||||||
|
on_blur: Optional[EventType[()]] = None,
|
||||||
|
on_button_clicked: Optional[EventType[()]] = None,
|
||||||
|
on_click: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_context_menu: Optional[EventType[()]] = None,
|
||||||
|
on_deselect: Optional[EventType[()]] = None,
|
||||||
|
on_double_click: Optional[EventType[()]] = None,
|
||||||
|
on_focus: Optional[EventType[()]] = None,
|
||||||
|
on_hover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_mount: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_down: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_enter: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_leave: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_move: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_out: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_over: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_up: Optional[EventType[()]] = None,
|
||||||
|
on_redraw: Optional[EventType[()]] = None,
|
||||||
|
on_relayout: Optional[EventType[()]] = None,
|
||||||
|
on_relayouting: Optional[EventType[()]] = None,
|
||||||
|
on_restyle: Optional[EventType[()]] = None,
|
||||||
|
on_scroll: Optional[EventType[()]] = None,
|
||||||
|
on_selected: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_selecting: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_transition_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_transitioning: Optional[EventType[()]] = None,
|
||||||
|
on_unhover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_unmount: Optional[EventType[()]] = None,
|
||||||
|
**props,
|
||||||
|
) -> "PlotlyFinance":
|
||||||
|
"""Create the Plotly component.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*children: The children of the component.
|
||||||
|
data: The figure to display. This can be a plotly figure or a plotly data json.
|
||||||
|
layout: The layout of the graph.
|
||||||
|
template: The template for visual appearance of the graph.
|
||||||
|
config: The config of the graph.
|
||||||
|
use_resize_handler: If true, the graph will resize when the window is resized.
|
||||||
|
on_after_plot: Fired after the plot is redrawn.
|
||||||
|
on_animated: Fired after the plot was animated.
|
||||||
|
on_animating_frame: Fired while animating a single frame (does not currently pass data through).
|
||||||
|
on_animation_interrupted: Fired when an animation is interrupted (to start a new animation for example).
|
||||||
|
on_autosize: Fired when the plot is responsively sized.
|
||||||
|
on_before_hover: Fired whenever mouse moves over a plot.
|
||||||
|
on_button_clicked: Fired when a plotly UI button is clicked.
|
||||||
|
on_click: Fired when the plot is clicked.
|
||||||
|
on_deselect: Fired when a selection is cleared (via double click).
|
||||||
|
on_double_click: Fired when the plot is double clicked.
|
||||||
|
on_hover: Fired when a plot element is hovered over.
|
||||||
|
on_relayout: Fired after the plot is laid out (zoom, pan, etc).
|
||||||
|
on_relayouting: Fired while the plot is being laid out.
|
||||||
|
on_restyle: Fired after the plot style is changed.
|
||||||
|
on_redraw: Fired after the plot is redrawn.
|
||||||
|
on_selected: Fired after selecting plot elements.
|
||||||
|
on_selecting: Fired while dragging a selection.
|
||||||
|
on_transitioning: Fired while an animation is occurring.
|
||||||
|
on_transition_interrupted: Fired when a transition is stopped early.
|
||||||
|
on_unhover: Fired when a hovered element is no longer hovered.
|
||||||
|
style: The style of the component.
|
||||||
|
key: A unique key for the component.
|
||||||
|
id: The id for the component.
|
||||||
|
class_name: The class name for the component.
|
||||||
|
autofocus: Whether the component should take the focus once the page is loaded
|
||||||
|
custom_attrs: custom attribute
|
||||||
|
**props: The properties of the component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The Plotly component.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
class PlotlyStrict(Plotly):
|
||||||
|
def add_imports(self) -> ImportDict | list[ImportDict]: ...
|
||||||
|
@overload
|
||||||
|
@classmethod
|
||||||
|
def create( # type: ignore
|
||||||
|
cls,
|
||||||
|
*children,
|
||||||
|
data: Optional[Union[Figure, Var[Figure]]] = None, # type: ignore
|
||||||
|
layout: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
template: Optional[Union[Template, Var[Template]]] = None, # type: ignore
|
||||||
|
config: Optional[Union[Dict, Var[Dict]]] = None,
|
||||||
|
use_resize_handler: Optional[Union[Var[bool], bool]] = None,
|
||||||
|
style: Optional[Style] = None,
|
||||||
|
key: Optional[Any] = None,
|
||||||
|
id: Optional[Any] = None,
|
||||||
|
class_name: Optional[Any] = None,
|
||||||
|
autofocus: Optional[bool] = None,
|
||||||
|
custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
|
||||||
|
on_after_plot: Optional[EventType[()]] = None,
|
||||||
|
on_animated: Optional[EventType[()]] = None,
|
||||||
|
on_animating_frame: Optional[EventType[()]] = None,
|
||||||
|
on_animation_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_autosize: Optional[EventType[()]] = None,
|
||||||
|
on_before_hover: Optional[EventType[()]] = None,
|
||||||
|
on_blur: Optional[EventType[()]] = None,
|
||||||
|
on_button_clicked: Optional[EventType[()]] = None,
|
||||||
|
on_click: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_context_menu: Optional[EventType[()]] = None,
|
||||||
|
on_deselect: Optional[EventType[()]] = None,
|
||||||
|
on_double_click: Optional[EventType[()]] = None,
|
||||||
|
on_focus: Optional[EventType[()]] = None,
|
||||||
|
on_hover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_mount: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_down: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_enter: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_leave: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_move: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_out: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_over: Optional[EventType[()]] = None,
|
||||||
|
on_mouse_up: Optional[EventType[()]] = None,
|
||||||
|
on_redraw: Optional[EventType[()]] = None,
|
||||||
|
on_relayout: Optional[EventType[()]] = None,
|
||||||
|
on_relayouting: Optional[EventType[()]] = None,
|
||||||
|
on_restyle: Optional[EventType[()]] = None,
|
||||||
|
on_scroll: Optional[EventType[()]] = None,
|
||||||
|
on_selected: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_selecting: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_transition_interrupted: Optional[EventType[()]] = None,
|
||||||
|
on_transitioning: Optional[EventType[()]] = None,
|
||||||
|
on_unhover: Optional[Union[EventType[()], EventType[List[Point]]]] = None,
|
||||||
|
on_unmount: Optional[EventType[()]] = None,
|
||||||
|
**props,
|
||||||
|
) -> "PlotlyStrict":
|
||||||
|
"""Create the Plotly component.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*children: The children of the component.
|
||||||
|
data: The figure to display. This can be a plotly figure or a plotly data json.
|
||||||
|
layout: The layout of the graph.
|
||||||
|
template: The template for visual appearance of the graph.
|
||||||
|
config: The config of the graph.
|
||||||
|
use_resize_handler: If true, the graph will resize when the window is resized.
|
||||||
|
on_after_plot: Fired after the plot is redrawn.
|
||||||
|
on_animated: Fired after the plot was animated.
|
||||||
|
on_animating_frame: Fired while animating a single frame (does not currently pass data through).
|
||||||
|
on_animation_interrupted: Fired when an animation is interrupted (to start a new animation for example).
|
||||||
|
on_autosize: Fired when the plot is responsively sized.
|
||||||
|
on_before_hover: Fired whenever mouse moves over a plot.
|
||||||
|
on_button_clicked: Fired when a plotly UI button is clicked.
|
||||||
|
on_click: Fired when the plot is clicked.
|
||||||
|
on_deselect: Fired when a selection is cleared (via double click).
|
||||||
|
on_double_click: Fired when the plot is double clicked.
|
||||||
|
on_hover: Fired when a plot element is hovered over.
|
||||||
|
on_relayout: Fired after the plot is laid out (zoom, pan, etc).
|
||||||
|
on_relayouting: Fired while the plot is being laid out.
|
||||||
|
on_restyle: Fired after the plot style is changed.
|
||||||
|
on_redraw: Fired after the plot is redrawn.
|
||||||
|
on_selected: Fired after selecting plot elements.
|
||||||
|
on_selecting: Fired while dragging a selection.
|
||||||
|
on_transitioning: Fired while an animation is occurring.
|
||||||
|
on_transition_interrupted: Fired when a transition is stopped early.
|
||||||
|
on_unhover: Fired when a hovered element is no longer hovered.
|
||||||
|
style: The style of the component.
|
||||||
|
key: A unique key for the component.
|
||||||
|
id: The id for the component.
|
||||||
|
class_name: The class name for the component.
|
||||||
|
autofocus: Whether the component should take the focus once the page is loaded
|
||||||
|
custom_attrs: custom attribute
|
||||||
|
**props: The properties of the component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The Plotly component.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
@ -685,7 +685,7 @@ class Config(Base):
|
|||||||
# Number of gunicorn workers from user
|
# Number of gunicorn workers from user
|
||||||
gunicorn_workers: Optional[int] = None
|
gunicorn_workers: Optional[int] = None
|
||||||
|
|
||||||
# Number of requests before a worker is restarted
|
# Number of requests before a worker is restarted; set to 0 to disable
|
||||||
gunicorn_max_requests: int = 100
|
gunicorn_max_requests: int = 100
|
||||||
|
|
||||||
# Variance limit for max requests; gunicorn only
|
# Variance limit for max requests; gunicorn only
|
||||||
|
@ -26,6 +26,7 @@ from typing import (
|
|||||||
|
|
||||||
from typing_extensions import (
|
from typing_extensions import (
|
||||||
Protocol,
|
Protocol,
|
||||||
|
Self,
|
||||||
TypeAliasType,
|
TypeAliasType,
|
||||||
TypedDict,
|
TypedDict,
|
||||||
TypeVar,
|
TypeVar,
|
||||||
@ -110,7 +111,7 @@ class EventActionsMixin:
|
|||||||
event_actions: Dict[str, Union[bool, int]] = dataclasses.field(default_factory=dict)
|
event_actions: Dict[str, Union[bool, int]] = dataclasses.field(default_factory=dict)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def stop_propagation(self):
|
def stop_propagation(self) -> Self:
|
||||||
"""Stop the event from bubbling up the DOM tree.
|
"""Stop the event from bubbling up the DOM tree.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@ -122,7 +123,7 @@ class EventActionsMixin:
|
|||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def prevent_default(self):
|
def prevent_default(self) -> Self:
|
||||||
"""Prevent the default behavior of the event.
|
"""Prevent the default behavior of the event.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@ -133,7 +134,7 @@ class EventActionsMixin:
|
|||||||
event_actions={"preventDefault": True, **self.event_actions},
|
event_actions={"preventDefault": True, **self.event_actions},
|
||||||
)
|
)
|
||||||
|
|
||||||
def throttle(self, limit_ms: int):
|
def throttle(self, limit_ms: int) -> Self:
|
||||||
"""Throttle the event handler.
|
"""Throttle the event handler.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -147,7 +148,7 @@ class EventActionsMixin:
|
|||||||
event_actions={"throttle": limit_ms, **self.event_actions},
|
event_actions={"throttle": limit_ms, **self.event_actions},
|
||||||
)
|
)
|
||||||
|
|
||||||
def debounce(self, delay_ms: int):
|
def debounce(self, delay_ms: int) -> Self:
|
||||||
"""Debounce the event handler.
|
"""Debounce the event handler.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -162,7 +163,7 @@ class EventActionsMixin:
|
|||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def temporal(self):
|
def temporal(self) -> Self:
|
||||||
"""Do not queue the event if the backend is down.
|
"""Do not queue the event if the backend is down.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@ -1773,7 +1774,7 @@ V4 = TypeVar("V4")
|
|||||||
V5 = TypeVar("V5")
|
V5 = TypeVar("V5")
|
||||||
|
|
||||||
|
|
||||||
class EventCallback(Generic[Unpack[P]]):
|
class EventCallback(Generic[Unpack[P]], EventActionsMixin):
|
||||||
"""A descriptor that wraps a function to be used as an event."""
|
"""A descriptor that wraps a function to be used as an event."""
|
||||||
|
|
||||||
def __init__(self, func: Callable[[Any, Unpack[P]], Any]):
|
def __init__(self, func: Callable[[Any, Unpack[P]], Any]):
|
||||||
@ -1784,24 +1785,6 @@ class EventCallback(Generic[Unpack[P]]):
|
|||||||
"""
|
"""
|
||||||
self.func = func
|
self.func = func
|
||||||
|
|
||||||
@property
|
|
||||||
def prevent_default(self):
|
|
||||||
"""Prevent default behavior.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
The event callback with prevent default behavior.
|
|
||||||
"""
|
|
||||||
return self
|
|
||||||
|
|
||||||
@property
|
|
||||||
def stop_propagation(self):
|
|
||||||
"""Stop event propagation.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
The event callback with stop propagation behavior.
|
|
||||||
"""
|
|
||||||
return self
|
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
def __call__(
|
def __call__(
|
||||||
self: EventCallback[Unpack[Q]],
|
self: EventCallback[Unpack[Q]],
|
||||||
|
@ -2,8 +2,10 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import contextlib
|
||||||
import inspect
|
import inspect
|
||||||
import shutil
|
import shutil
|
||||||
|
import time
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from types import FrameType
|
from types import FrameType
|
||||||
|
|
||||||
@ -317,3 +319,20 @@ def status(*args, **kwargs):
|
|||||||
A new status.
|
A new status.
|
||||||
"""
|
"""
|
||||||
return _console.status(*args, **kwargs)
|
return _console.status(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
@contextlib.contextmanager
|
||||||
|
def timing(msg: str):
|
||||||
|
"""Create a context manager to time a block of code.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
msg: The message to display.
|
||||||
|
|
||||||
|
Yields:
|
||||||
|
None.
|
||||||
|
"""
|
||||||
|
start = time.time()
|
||||||
|
try:
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
debug(f"[white]\\[timing] {msg}: {time.time() - start:.2f}s[/white]")
|
||||||
|
@ -368,34 +368,49 @@ def run_uvicorn_backend_prod(host: str, port: int, loglevel: LogLevel):
|
|||||||
|
|
||||||
app_module = get_app_module()
|
app_module = get_app_module()
|
||||||
|
|
||||||
run_backend_prod = f"gunicorn --worker-class {config.gunicorn_worker_class} --max-requests {config.gunicorn_max_requests} --max-requests-jitter {config.gunicorn_max_requests_jitter} --preload --timeout {config.timeout} --log-level critical".split()
|
|
||||||
run_backend_prod_windows = f"uvicorn --limit-max-requests {config.gunicorn_max_requests} --timeout-keep-alive {config.timeout}".split()
|
|
||||||
command = (
|
command = (
|
||||||
[
|
[
|
||||||
*run_backend_prod_windows,
|
"uvicorn",
|
||||||
"--host",
|
*(
|
||||||
host,
|
[
|
||||||
"--port",
|
"--limit-max-requests",
|
||||||
str(port),
|
str(config.gunicorn_max_requests),
|
||||||
|
]
|
||||||
|
if config.gunicorn_max_requests > 0
|
||||||
|
else []
|
||||||
|
),
|
||||||
|
*("--timeout-keep-alive", str(config.timeout)),
|
||||||
|
*("--host", host),
|
||||||
|
*("--port", str(port)),
|
||||||
|
*("--workers", str(_get_backend_workers())),
|
||||||
app_module,
|
app_module,
|
||||||
]
|
]
|
||||||
if constants.IS_WINDOWS
|
if constants.IS_WINDOWS
|
||||||
else [
|
else [
|
||||||
*run_backend_prod,
|
"gunicorn",
|
||||||
"--bind",
|
*("--worker-class", config.gunicorn_worker_class),
|
||||||
f"{host}:{port}",
|
*(
|
||||||
"--threads",
|
[
|
||||||
str(_get_backend_workers()),
|
"--max-requests",
|
||||||
|
str(config.gunicorn_max_requests),
|
||||||
|
"--max-requests-jitter",
|
||||||
|
str(config.gunicorn_max_requests_jitter),
|
||||||
|
]
|
||||||
|
if config.gunicorn_max_requests > 0
|
||||||
|
else []
|
||||||
|
),
|
||||||
|
"--preload",
|
||||||
|
*("--timeout", str(config.timeout)),
|
||||||
|
*("--bind", f"{host}:{port}"),
|
||||||
|
*("--threads", str(_get_backend_workers())),
|
||||||
f"{app_module}()",
|
f"{app_module}()",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
command += [
|
command += [
|
||||||
"--log-level",
|
*("--log-level", loglevel.value),
|
||||||
loglevel.value,
|
|
||||||
"--workers",
|
|
||||||
str(_get_backend_workers()),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
processes.new_process(
|
processes.new_process(
|
||||||
command,
|
command,
|
||||||
run=True,
|
run=True,
|
||||||
|
@ -109,6 +109,9 @@ class ImportVar:
|
|||||||
# whether this import should be rendered or not
|
# whether this import should be rendered or not
|
||||||
render: Optional[bool] = True
|
render: Optional[bool] = True
|
||||||
|
|
||||||
|
# The path of the package to import from.
|
||||||
|
package_path: str = "/"
|
||||||
|
|
||||||
# whether this import package should be added to transpilePackages in next.config.js
|
# whether this import package should be added to transpilePackages in next.config.js
|
||||||
# https://nextjs.org/docs/app/api-reference/next-config-js/transpilePackages
|
# https://nextjs.org/docs/app/api-reference/next-config-js/transpilePackages
|
||||||
transpile: Optional[bool] = False
|
transpile: Optional[bool] = False
|
||||||
|
@ -260,3 +260,33 @@ def find_replace(directory: str | Path, find: str, replace: str):
|
|||||||
text = filepath.read_text(encoding="utf-8")
|
text = filepath.read_text(encoding="utf-8")
|
||||||
text = re.sub(find, replace, text)
|
text = re.sub(find, replace, text)
|
||||||
filepath.write_text(text, encoding="utf-8")
|
filepath.write_text(text, encoding="utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def update_directory_tree(src: Path, dest: Path):
|
||||||
|
"""Recursively copies a directory tree from src to dest.
|
||||||
|
Only copies files if the destination file is missing or modified earlier than the source file.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
src: Source directory
|
||||||
|
dest: Destination directory
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ValueError: If the source is not a directory
|
||||||
|
"""
|
||||||
|
if not src.is_dir():
|
||||||
|
raise ValueError(f"Source {src} is not a directory")
|
||||||
|
|
||||||
|
# Ensure the destination directory exists
|
||||||
|
dest.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
for item in src.iterdir():
|
||||||
|
dest_item = dest / item.name
|
||||||
|
|
||||||
|
if item.is_dir():
|
||||||
|
# Recursively copy subdirectories
|
||||||
|
update_directory_tree(item, dest_item)
|
||||||
|
elif item.is_file() and (
|
||||||
|
not dest_item.exists() or item.stat().st_mtime > dest_item.stat().st_mtime
|
||||||
|
):
|
||||||
|
# Copy file if it doesn't exist in the destination or is older than the source
|
||||||
|
shutil.copy2(item, dest_item)
|
||||||
|
@ -75,9 +75,9 @@ from reflex.utils.types import (
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from reflex.state import BaseState
|
from reflex.state import BaseState
|
||||||
|
|
||||||
from .number import BooleanVar, NumberVar
|
from .number import BooleanVar, LiteralBooleanVar, LiteralNumberVar, NumberVar
|
||||||
from .object import ObjectVar
|
from .object import LiteralObjectVar, ObjectVar
|
||||||
from .sequence import ArrayVar, StringVar
|
from .sequence import ArrayVar, LiteralArrayVar, LiteralStringVar, StringVar
|
||||||
|
|
||||||
|
|
||||||
VAR_TYPE = TypeVar("VAR_TYPE", covariant=True)
|
VAR_TYPE = TypeVar("VAR_TYPE", covariant=True)
|
||||||
@ -573,13 +573,21 @@ class Var(Generic[VAR_TYPE]):
|
|||||||
|
|
||||||
return value_with_replaced
|
return value_with_replaced
|
||||||
|
|
||||||
|
@overload
|
||||||
|
@classmethod
|
||||||
|
def create( # pyright: ignore[reportOverlappingOverload]
|
||||||
|
cls,
|
||||||
|
value: NoReturn,
|
||||||
|
_var_data: VarData | None = None,
|
||||||
|
) -> Var[Any]: ...
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
@classmethod
|
@classmethod
|
||||||
def create( # pyright: ignore[reportOverlappingOverload]
|
def create( # pyright: ignore[reportOverlappingOverload]
|
||||||
cls,
|
cls,
|
||||||
value: bool,
|
value: bool,
|
||||||
_var_data: VarData | None = None,
|
_var_data: VarData | None = None,
|
||||||
) -> BooleanVar: ...
|
) -> LiteralBooleanVar: ...
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -587,7 +595,7 @@ class Var(Generic[VAR_TYPE]):
|
|||||||
cls,
|
cls,
|
||||||
value: int,
|
value: int,
|
||||||
_var_data: VarData | None = None,
|
_var_data: VarData | None = None,
|
||||||
) -> NumberVar[int]: ...
|
) -> LiteralNumberVar[int]: ...
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -595,7 +603,15 @@ class Var(Generic[VAR_TYPE]):
|
|||||||
cls,
|
cls,
|
||||||
value: float,
|
value: float,
|
||||||
_var_data: VarData | None = None,
|
_var_data: VarData | None = None,
|
||||||
) -> NumberVar[float]: ...
|
) -> LiteralNumberVar[float]: ...
|
||||||
|
|
||||||
|
@overload
|
||||||
|
@classmethod
|
||||||
|
def create( # pyright: ignore [reportOverlappingOverload]
|
||||||
|
cls,
|
||||||
|
value: str,
|
||||||
|
_var_data: VarData | None = None,
|
||||||
|
) -> LiteralStringVar: ...
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -611,7 +627,7 @@ class Var(Generic[VAR_TYPE]):
|
|||||||
cls,
|
cls,
|
||||||
value: None,
|
value: None,
|
||||||
_var_data: VarData | None = None,
|
_var_data: VarData | None = None,
|
||||||
) -> NoneVar: ...
|
) -> LiteralNoneVar: ...
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -619,7 +635,7 @@ class Var(Generic[VAR_TYPE]):
|
|||||||
cls,
|
cls,
|
||||||
value: MAPPING_TYPE,
|
value: MAPPING_TYPE,
|
||||||
_var_data: VarData | None = None,
|
_var_data: VarData | None = None,
|
||||||
) -> ObjectVar[MAPPING_TYPE]: ...
|
) -> LiteralObjectVar[MAPPING_TYPE]: ...
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -627,7 +643,7 @@ class Var(Generic[VAR_TYPE]):
|
|||||||
cls,
|
cls,
|
||||||
value: SEQUENCE_TYPE,
|
value: SEQUENCE_TYPE,
|
||||||
_var_data: VarData | None = None,
|
_var_data: VarData | None = None,
|
||||||
) -> ArrayVar[SEQUENCE_TYPE]: ...
|
) -> LiteralArrayVar[SEQUENCE_TYPE]: ...
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -2238,6 +2254,27 @@ class ComputedVar(Var[RETURN_TYPE]):
|
|||||||
owner: Type,
|
owner: Type,
|
||||||
) -> ArrayVar[tuple[LIST_INSIDE, ...]]: ...
|
) -> ArrayVar[tuple[LIST_INSIDE, ...]]: ...
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def __get__(
|
||||||
|
self: ComputedVar[BASE_TYPE],
|
||||||
|
instance: None,
|
||||||
|
owner: Type,
|
||||||
|
) -> ObjectVar[BASE_TYPE]: ...
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def __get__(
|
||||||
|
self: ComputedVar[SQLA_TYPE],
|
||||||
|
instance: None,
|
||||||
|
owner: Type,
|
||||||
|
) -> ObjectVar[SQLA_TYPE]: ...
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def __get__(
|
||||||
|
self: ComputedVar[DATACLASS_TYPE], instance: None, owner: Any
|
||||||
|
) -> ObjectVar[DATACLASS_TYPE]: ...
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
def __get__(self, instance: None, owner: Type) -> ComputedVar[RETURN_TYPE]: ...
|
def __get__(self, instance: None, owner: Type) -> ComputedVar[RETURN_TYPE]: ...
|
||||||
|
|
||||||
@ -2484,6 +2521,27 @@ class AsyncComputedVar(ComputedVar[RETURN_TYPE]):
|
|||||||
owner: Type,
|
owner: Type,
|
||||||
) -> ArrayVar[tuple[LIST_INSIDE, ...]]: ...
|
) -> ArrayVar[tuple[LIST_INSIDE, ...]]: ...
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def __get__(
|
||||||
|
self: AsyncComputedVar[BASE_TYPE],
|
||||||
|
instance: None,
|
||||||
|
owner: Type,
|
||||||
|
) -> ObjectVar[BASE_TYPE]: ...
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def __get__(
|
||||||
|
self: AsyncComputedVar[SQLA_TYPE],
|
||||||
|
instance: None,
|
||||||
|
owner: Type,
|
||||||
|
) -> ObjectVar[SQLA_TYPE]: ...
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def __get__(
|
||||||
|
self: AsyncComputedVar[DATACLASS_TYPE], instance: None, owner: Any
|
||||||
|
) -> ObjectVar[DATACLASS_TYPE]: ...
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
def __get__(self, instance: None, owner: Type) -> AsyncComputedVar[RETURN_TYPE]: ...
|
def __get__(self, instance: None, owner: Type) -> AsyncComputedVar[RETURN_TYPE]: ...
|
||||||
|
|
||||||
|
@ -974,7 +974,7 @@ def boolean_not_operation(value: BooleanVar):
|
|||||||
frozen=True,
|
frozen=True,
|
||||||
slots=True,
|
slots=True,
|
||||||
)
|
)
|
||||||
class LiteralNumberVar(LiteralVar, NumberVar):
|
class LiteralNumberVar(LiteralVar, NumberVar[NUMBER_T]):
|
||||||
"""Base class for immutable literal number vars."""
|
"""Base class for immutable literal number vars."""
|
||||||
|
|
||||||
_var_value: float | int = dataclasses.field(default=0)
|
_var_value: float | int = dataclasses.field(default=0)
|
||||||
|
@ -372,6 +372,33 @@ class StringVar(Var[STRING_TYPE], python_types=str):
|
|||||||
|
|
||||||
return string_ge_operation(self, other)
|
return string_ge_operation(self, other)
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def replace( # pyright: ignore [reportOverlappingOverload]
|
||||||
|
self, search_value: StringVar | str, new_value: StringVar | str
|
||||||
|
) -> StringVar: ...
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def replace(
|
||||||
|
self, search_value: Any, new_value: Any
|
||||||
|
) -> CustomVarOperationReturn[StringVar]: ...
|
||||||
|
|
||||||
|
def replace(self, search_value: Any, new_value: Any) -> StringVar: # pyright: ignore [reportInconsistentOverload]
|
||||||
|
"""Replace a string with a value.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
search_value: The string to search.
|
||||||
|
new_value: The value to be replaced with.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The string replace operation.
|
||||||
|
"""
|
||||||
|
if not isinstance(search_value, (StringVar, str)):
|
||||||
|
raise_unsupported_operand_types("replace", (type(self), type(search_value)))
|
||||||
|
if not isinstance(new_value, (StringVar, str)):
|
||||||
|
raise_unsupported_operand_types("replace", (type(self), type(new_value)))
|
||||||
|
|
||||||
|
return string_replace_operation(self, search_value, new_value)
|
||||||
|
|
||||||
|
|
||||||
@var_operation
|
@var_operation
|
||||||
def string_lt_operation(lhs: StringVar[Any] | str, rhs: StringVar[Any] | str):
|
def string_lt_operation(lhs: StringVar[Any] | str, rhs: StringVar[Any] | str):
|
||||||
@ -570,7 +597,7 @@ def array_join_operation(array: ArrayVar, sep: StringVar[Any] | str = ""):
|
|||||||
|
|
||||||
@var_operation
|
@var_operation
|
||||||
def string_replace_operation(
|
def string_replace_operation(
|
||||||
string: StringVar, search_value: StringVar | str, new_value: StringVar | str
|
string: StringVar[Any], search_value: StringVar | str, new_value: StringVar | str
|
||||||
):
|
):
|
||||||
"""Replace a string with a value.
|
"""Replace a string with a value.
|
||||||
|
|
||||||
@ -583,7 +610,7 @@ def string_replace_operation(
|
|||||||
The string replace operation.
|
The string replace operation.
|
||||||
"""
|
"""
|
||||||
return var_operation_return(
|
return var_operation_return(
|
||||||
js_expression=f"{string}.replace({search_value}, {new_value})",
|
js_expression=f"{string}.replaceAll({search_value}, {new_value})",
|
||||||
var_type=str,
|
var_type=str,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ from reflex.components.lucide.icon import Icon
|
|||||||
from reflex.components.radix.themes.layout.box import Box
|
from reflex.components.radix.themes.layout.box import Box
|
||||||
from reflex.style import Style
|
from reflex.style import Style
|
||||||
from reflex.vars import Var
|
from reflex.vars import Var
|
||||||
|
from reflex.vars.base import LiteralVar
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
@ -99,7 +100,9 @@ def test_create_shiki_code_block(
|
|||||||
|
|
||||||
applied_styles = component.style
|
applied_styles = component.style
|
||||||
for key, value in expected_styles.items():
|
for key, value in expected_styles.items():
|
||||||
assert Var.create(applied_styles[key])._var_value == value
|
var = Var.create(applied_styles[key])
|
||||||
|
assert isinstance(var, LiteralVar)
|
||||||
|
assert var._var_value == value
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
|
@ -74,11 +74,11 @@ class ObjectState(rx.State):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("type_", [Base, Bare, SqlaModel, Dataclass])
|
@pytest.mark.parametrize("type_", [Base, Bare, SqlaModel, Dataclass])
|
||||||
def test_var_create(type_: GenericType) -> None:
|
def test_var_create(type_: type[Base | Bare | SqlaModel | Dataclass]) -> None:
|
||||||
my_object = type_()
|
my_object = type_()
|
||||||
var = Var.create(my_object)
|
var = Var.create(my_object)
|
||||||
assert var._var_type is type_
|
assert var._var_type is type_
|
||||||
|
assert isinstance(var, ObjectVar)
|
||||||
quantity = var.quantity
|
quantity = var.quantity
|
||||||
assert quantity._var_type is int
|
assert quantity._var_type is int
|
||||||
|
|
||||||
@ -94,12 +94,12 @@ def test_literal_create(type_: GenericType) -> None:
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("type_", [Base, Bare, SqlaModel, Dataclass])
|
@pytest.mark.parametrize("type_", [Base, Bare, SqlaModel, Dataclass])
|
||||||
def test_guess(type_: GenericType) -> None:
|
def test_guess(type_: type[Base | Bare | SqlaModel | Dataclass]) -> None:
|
||||||
my_object = type_()
|
my_object = type_()
|
||||||
var = Var.create(my_object)
|
var = Var.create(my_object)
|
||||||
var = var.guess_type()
|
var = var.guess_type()
|
||||||
assert var._var_type is type_
|
assert var._var_type is type_
|
||||||
|
assert isinstance(var, ObjectVar)
|
||||||
quantity = var.quantity
|
quantity = var.quantity
|
||||||
assert quantity._var_type is int
|
assert quantity._var_type is int
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user