
* fully migrate vars into new system * i hate rufffff (no i don't) * fix silly pright issues (except colormode and state) * remove all instances of Var.create * create immutable callable var and get rid of more base vars * implement hash for all functions * get reflex-web to compile * get it to compile reflex-web successfully * fix tests * fix pyi * use override from typing_extension * put plotly inside of a catch * dicts are unusable sadly * fix silly mistake * overload equals to special case immutable var * improve test_cond * solve more CI issues, down to 94 failures * down to 20 errors * down to 13 errors * pass all testcases * fix pyright issues * reorder things * use get origin more * use fixed_type logic * various optimizations * go back to passing test cases * use less boilerplate * remove unnecessary print message * remove weird comment * add test for html issue * add type ignore * fix another silly issue * override get all var data for var operations call * make integration tests pass * fix immutable call var * better logic for finding parent class * use even better logic for finding state wrt computedvar * only choose the ones that are defined in the same module * small dict to large dict * [REF-3591] Remove chakra-related files from immutable vars PR (#3821) * Add comments to html metadata component (#3731) * fix: add verification for path /404 (#3723) Co-authored-by: coolstorm <manas.gupta@fampay.in> * Use the new state name when setting `is_hydrated` to false (#3738) * Use `._is_mutable()` to account for parent state proxy (#3739) When a parent state proxy is set, also allow child StateProxy._self_mutable to override the parent's `_is_mutable()`. * bump to 0.5.9 (#3746) * add message when installing requirements.txt is needed for chosen template during init (#3750) * #3752 bugfix add domain for XAxis (#3764) * fix appharness app_source typing (#3777) * fix import clash between connectionToaster and hooks.useState (#3749) * use different registry when in china, fixes #3700 (#3702) * do not reload compilation if using local app in AppHarness (#3790) * do not reload if using local app * Update reflex/testing.py Co-authored-by: Masen Furer <m_github@0x26.net> --------- Co-authored-by: Masen Furer <m_github@0x26.net> * Bump memory on relevant actions (#3781) Co-authored-by: Alek Petuskey <alekpetuskey@Aleks-MacBook-Pro.local> * [REF-3334] Validate Toast Props (#3793) * [REF-3536][REF-3537][REF-3541] Move chakra components into its repo(reflex-chakra) (#3798) * fix get_uuid_string_var (#3795) * minor State cleanup (#3768) * Fix code wrap in markdown (#3755) --------- Co-authored-by: Alek Petuskey <alek@pynecone.io> Co-authored-by: Manas Gupta <53006261+Manas1820@users.noreply.github.com> Co-authored-by: coolstorm <manas.gupta@fampay.in> Co-authored-by: Thomas Brandého <thomas.brandeho@gmail.com> Co-authored-by: Shubhankar Dimri <dimrishubhi@gmail.com> Co-authored-by: benedikt-bartscher <31854409+benedikt-bartscher@users.noreply.github.com> Co-authored-by: Khaleel Al-Adhami <khaleel.aladhami@gmail.com> Co-authored-by: Alek Petuskey <alekpetuskey@Aleks-MacBook-Pro.local> Co-authored-by: Elijah Ahianyo <elijahahianyo@gmail.com> * pyproject.toml: bump to 0.6.0a1 * pyproject.toml: depend on reflex-chakra>=0.6.0a New Var system support in reflex-chakra 0.6.0a1 * poetry.lock: relock dependencies * integration: bump listening timeout to 1200 seconds * integration: bump listening timeout to 1800 seconds * Use cached_var_no_lock to avoid ImmutableVar deadlocks (#3835) * Use cached_var_no_lock to avoid ImmutableVar deadlocks ImmutableVar subclasses will always return the same value for a _var_name or _get_all_var_data so there is no need to use a per-class lock to protect a cached attribute on an instance, and doing so actually is observed to cause deadlocks when a particular _cached_var_name creates new LiteralVar instances and attempts to serialize them. * remove unused module global --------- Co-authored-by: Masen Furer <m_github@0x26.net> Co-authored-by: Alek Petuskey <alek@pynecone.io> Co-authored-by: Manas Gupta <53006261+Manas1820@users.noreply.github.com> Co-authored-by: coolstorm <manas.gupta@fampay.in> Co-authored-by: Thomas Brandého <thomas.brandeho@gmail.com> Co-authored-by: Shubhankar Dimri <dimrishubhi@gmail.com> Co-authored-by: benedikt-bartscher <31854409+benedikt-bartscher@users.noreply.github.com> Co-authored-by: Alek Petuskey <alekpetuskey@Aleks-MacBook-Pro.local> Co-authored-by: Elijah Ahianyo <elijahahianyo@gmail.com>
139 lines
4.2 KiB
Python
139 lines
4.2 KiB
Python
"""Table components."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Dict, List, Union
|
|
|
|
from reflex.components.component import Component
|
|
from reflex.components.tags import Tag
|
|
from reflex.ivars.base import ImmutableComputedVar
|
|
from reflex.utils import types
|
|
from reflex.utils.imports import ImportDict
|
|
from reflex.utils.serializers import serialize
|
|
from reflex.vars import ComputedVar, Var
|
|
|
|
|
|
class Gridjs(Component):
|
|
"""A component that wraps a nivo bar component."""
|
|
|
|
library = "gridjs-react@6.0.1"
|
|
|
|
lib_dependencies: List[str] = ["gridjs@6.0.6"]
|
|
|
|
|
|
class DataTable(Gridjs):
|
|
"""A data table component."""
|
|
|
|
tag = "Grid"
|
|
|
|
alias = "DataTableGrid"
|
|
|
|
# The data to display. Either a list of lists or a pandas dataframe.
|
|
data: Any
|
|
|
|
# The list of columns to display. Required if data is a list and should not be provided
|
|
# if the data field is a dataframe
|
|
columns: Var[List]
|
|
|
|
# Enable a search bar.
|
|
search: Var[bool]
|
|
|
|
# Enable sorting on columns.
|
|
sort: Var[bool]
|
|
|
|
# Enable resizable columns.
|
|
resizable: Var[bool]
|
|
|
|
# Enable pagination.
|
|
pagination: Var[Union[bool, Dict]]
|
|
|
|
@classmethod
|
|
def create(cls, *children, **props):
|
|
"""Create a datatable component.
|
|
|
|
Args:
|
|
*children: The children of the component.
|
|
**props: The props to pass to the component.
|
|
|
|
Returns:
|
|
The datatable component.
|
|
|
|
Raises:
|
|
ValueError: If a pandas dataframe is passed in and columns are also provided.
|
|
"""
|
|
data = props.get("data")
|
|
columns = props.get("columns")
|
|
|
|
# The annotation should be provided if data is a computed var. We need this to know how to
|
|
# render pandas dataframes.
|
|
if (
|
|
isinstance(data, (ComputedVar, ImmutableComputedVar))
|
|
and data._var_type == Any
|
|
):
|
|
raise ValueError(
|
|
"Annotation of the computed var assigned to the data field should be provided."
|
|
)
|
|
|
|
if (
|
|
columns is not None
|
|
and isinstance(columns, (ComputedVar, ImmutableComputedVar))
|
|
and columns._var_type == Any
|
|
):
|
|
raise ValueError(
|
|
"Annotation of the computed var assigned to the column field should be provided."
|
|
)
|
|
|
|
# If data is a pandas dataframe and columns are provided throw an error.
|
|
if (
|
|
types.is_dataframe(type(data))
|
|
or (isinstance(data, Var) and types.is_dataframe(data._var_type))
|
|
) and columns is not None:
|
|
raise ValueError(
|
|
"Cannot pass in both a pandas dataframe and columns to the data_table component."
|
|
)
|
|
|
|
# If data is a list and columns are not provided, throw an error
|
|
if (
|
|
(isinstance(data, Var) and types._issubclass(data._var_type, List))
|
|
or issubclass(type(data), List)
|
|
) and columns is None:
|
|
raise ValueError(
|
|
"column field should be specified when the data field is a list type"
|
|
)
|
|
|
|
print("props", props)
|
|
|
|
# Create the component.
|
|
return super().create(
|
|
*children,
|
|
**props,
|
|
)
|
|
|
|
def add_imports(self) -> ImportDict:
|
|
"""Add the imports for the datatable component.
|
|
|
|
Returns:
|
|
The import dict for the component.
|
|
"""
|
|
return {"": "gridjs/dist/theme/mermaid.css"}
|
|
|
|
def _render(self) -> Tag:
|
|
if isinstance(self.data, Var) and types.is_dataframe(self.data._var_type):
|
|
self.columns = self.data._replace(
|
|
_var_name=f"{self.data._var_name}.columns",
|
|
_var_type=List[Any],
|
|
)
|
|
self.data = self.data._replace(
|
|
_var_name=f"{self.data._var_name}.data",
|
|
_var_type=List[List[Any]],
|
|
)
|
|
if types.is_dataframe(type(self.data)):
|
|
# If given a pandas df break up the data and columns
|
|
data = serialize(self.data)
|
|
assert isinstance(data, dict), "Serialized dataframe should be a dict."
|
|
self.columns = Var.create_safe(data["columns"])
|
|
self.data = Var.create_safe(data["data"])
|
|
|
|
# Render the table.
|
|
return super()._render()
|