From 439baf16f7f431ea6a0b890b33e0db16a63f08c9 Mon Sep 17 00:00:00 2001 From: IEC1 Date: Wed, 18 Feb 2026 17:25:43 +1300 Subject: [PATCH 1/8] Added dropdown-cell support --- reflex/.templates/web/utils/helpers/dataeditor.js | 14 ++++++++++++++ reflex/components/datadisplay/dataeditor.py | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/reflex/.templates/web/utils/helpers/dataeditor.js b/reflex/.templates/web/utils/helpers/dataeditor.js index 7c8da26354f..f29c070ed0f 100644 --- a/reflex/.templates/web/utils/helpers/dataeditor.js +++ b/reflex/.templates/web/utils/helpers/dataeditor.js @@ -46,6 +46,20 @@ export function formatCell(value, column) { data: value, readonly: !editable, }; + case "dropdown": + const cellValue = value ? String(value) : ""; + return { + kind: GridCellKind.Custom, + allowOverlay: true, + copyData: cellValue, + displayData: cellValue, + readonly: false, + data: { + kind: "dropdown-cell", + allowedValues: (column.allowedValues || []).map(v => String(v)), + value: cellValue, + }, + }; default: console.log( "Warning: column.type is undefined for column.title=" + column.title, diff --git a/reflex/components/datadisplay/dataeditor.py b/reflex/components/datadisplay/dataeditor.py index e5fa555bdab..559a5b540b6 100644 --- a/reflex/components/datadisplay/dataeditor.py +++ b/reflex/components/datadisplay/dataeditor.py @@ -184,6 +184,7 @@ class DataEditor(NoSSRComponent): lib_dependencies: list[str] = [ "lodash@4.17.21", "react-responsive-carousel@3.2.23", + "@glideapps/glide-data-grid-cells@6.0.3", ] # Number of rows. @@ -366,6 +367,9 @@ class DataEditor(NoSSRComponent): # Fired when the search close button is clicked. on_search_close: EventHandler[no_args_event_spec] + # Custom cell renderers + custom_renderers: Var[Any] = Var(_js_expr="allCells") + def add_imports(self) -> ImportDict: """Add imports for the component. @@ -394,6 +398,9 @@ def add_custom_code(self) -> list[str]: """ return [ """ + import * as AllCells from "@glideapps/glide-data-grid-cells"; + const allCells = Object.values(AllCells).filter(x => x?.isMatch); + function reconstructGridSelection(selection) { if (!selection || typeof selection !== 'object') { return undefined; From ad2a828c34664c3dc6bfbae63046bebe3f031c89 Mon Sep 17 00:00:00 2001 From: IEC1 Date: Thu, 19 Feb 2026 08:37:24 +1300 Subject: [PATCH 2/8] Ran pre-commit --- pyi_hashes.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyi_hashes.json b/pyi_hashes.json index 681a2d1e3d9..864e407cebf 100644 --- a/pyi_hashes.json +++ b/pyi_hashes.json @@ -23,7 +23,7 @@ "reflex/components/core/window_events.pyi": "af33ccec866b9540ee7fbec6dbfbd151", "reflex/components/datadisplay/__init__.pyi": "52755871369acbfd3a96b46b9a11d32e", "reflex/components/datadisplay/code.pyi": "b86769987ef4d1cbdddb461be88539fd", - "reflex/components/datadisplay/dataeditor.pyi": "f8c1e816c9f22f4a7429f812214407f2", + "reflex/components/datadisplay/dataeditor.pyi": "7c65a41aea6dd57c06158c923e15ecc0", "reflex/components/datadisplay/shiki_code_block.pyi": "1d53e75b6be0d3385a342e7b3011babd", "reflex/components/el/__init__.pyi": "0adfd001a926a2a40aee94f6fa725ecc", "reflex/components/el/element.pyi": "c5974a92fbc310e42d0f6cfdd13472f4", From c348bd7836e491a2e884d83dd6f1167ebb769543 Mon Sep 17 00:00:00 2001 From: IEC1 Date: Thu, 19 Feb 2026 11:24:17 +1300 Subject: [PATCH 3/8] Set allowOverlay/readonly based on editable Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- reflex/.templates/web/utils/helpers/dataeditor.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reflex/.templates/web/utils/helpers/dataeditor.js b/reflex/.templates/web/utils/helpers/dataeditor.js index f29c070ed0f..d8e1ccc569e 100644 --- a/reflex/.templates/web/utils/helpers/dataeditor.js +++ b/reflex/.templates/web/utils/helpers/dataeditor.js @@ -50,10 +50,10 @@ export function formatCell(value, column) { const cellValue = value ? String(value) : ""; return { kind: GridCellKind.Custom, - allowOverlay: true, + allowOverlay: editable, copyData: cellValue, displayData: cellValue, - readonly: false, + readonly: !editable, data: { kind: "dropdown-cell", allowedValues: (column.allowedValues || []).map(v => String(v)), From b662ca28b9b9dd5e71874aad4d5de88555c2eb44 Mon Sep 17 00:00:00 2001 From: IEC1 Date: Fri, 20 Feb 2026 14:29:05 +1300 Subject: [PATCH 4/8] Made custom_renderers optional --- reflex/components/datadisplay/dataeditor.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/reflex/components/datadisplay/dataeditor.py b/reflex/components/datadisplay/dataeditor.py index 559a5b540b6..6429be66cc9 100644 --- a/reflex/components/datadisplay/dataeditor.py +++ b/reflex/components/datadisplay/dataeditor.py @@ -14,7 +14,7 @@ from reflex.utils.imports import ImportDict, ImportVar from reflex.utils.serializers import serializer from reflex.vars import get_unique_variable_name -from reflex.vars.base import Var +from reflex.vars.base import Var, VarData from reflex.vars.function import FunctionStringVar from reflex.vars.sequence import ArrayVar @@ -184,7 +184,6 @@ class DataEditor(NoSSRComponent): lib_dependencies: list[str] = [ "lodash@4.17.21", "react-responsive-carousel@3.2.23", - "@glideapps/glide-data-grid-cells@6.0.3", ] # Number of rows. @@ -368,7 +367,7 @@ class DataEditor(NoSSRComponent): on_search_close: EventHandler[no_args_event_spec] # Custom cell renderers - custom_renderers: Var[Any] = Var(_js_expr="allCells") + custom_renderers: Var[Any] def add_imports(self) -> ImportDict: """Add imports for the component. @@ -398,9 +397,6 @@ def add_custom_code(self) -> list[str]: """ return [ """ - import * as AllCells from "@glideapps/glide-data-grid-cells"; - const allCells = Object.values(AllCells).filter(x => x?.isMatch); - function reconstructGridSelection(selection) { if (!selection || typeof selection !== 'object') { return undefined; @@ -528,6 +524,18 @@ def create(cls, *children, **props) -> Component: "reconstructGridSelection" ).call(grid_selection) + if props.get("extended_cell_types") is not None: + props["custom_renderers"] = Var( + "allCells", + _var_data=VarData( + imports={ + "@glideapps/glide-data-grid-cells@6.0.3": ImportVar( + tag="allCells", is_default=False + ) + } + ), + ) + grid = super().create(*children, **props) return Div.create( grid, From 100cf015af194cd13be89b3c040bb8770b03d535 Mon Sep 17 00:00:00 2001 From: IEC1 Date: Fri, 20 Feb 2026 14:29:59 +1300 Subject: [PATCH 5/8] Update hash for dataeditor.pyi in pyi_hashes.json --- pyi_hashes.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyi_hashes.json b/pyi_hashes.json index 864e407cebf..82e1a301863 100644 --- a/pyi_hashes.json +++ b/pyi_hashes.json @@ -23,7 +23,7 @@ "reflex/components/core/window_events.pyi": "af33ccec866b9540ee7fbec6dbfbd151", "reflex/components/datadisplay/__init__.pyi": "52755871369acbfd3a96b46b9a11d32e", "reflex/components/datadisplay/code.pyi": "b86769987ef4d1cbdddb461be88539fd", - "reflex/components/datadisplay/dataeditor.pyi": "7c65a41aea6dd57c06158c923e15ecc0", + "reflex/components/datadisplay/dataeditor.pyi": "1906f2fb29be93dd32f4f71dbb648d36", "reflex/components/datadisplay/shiki_code_block.pyi": "1d53e75b6be0d3385a342e7b3011babd", "reflex/components/el/__init__.pyi": "0adfd001a926a2a40aee94f6fa725ecc", "reflex/components/el/element.pyi": "c5974a92fbc310e42d0f6cfdd13472f4", From eae64b4fdd2acfeef79cef4cd85ef59d00ede262 Mon Sep 17 00:00:00 2001 From: IEC1 Date: Mon, 23 Feb 2026 08:30:53 +1300 Subject: [PATCH 6/8] Add extended_cell_types param to DataEditor.create --- reflex/components/datadisplay/dataeditor.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reflex/components/datadisplay/dataeditor.py b/reflex/components/datadisplay/dataeditor.py index 6429be66cc9..82327a291b3 100644 --- a/reflex/components/datadisplay/dataeditor.py +++ b/reflex/components/datadisplay/dataeditor.py @@ -463,11 +463,12 @@ def add_hooks(self) -> list[str]: return ["\n".join(code)] @classmethod - def create(cls, *children, **props) -> Component: + def create(cls, *children, extended_cell_types: bool = False, **props) -> Component: """Create the DataEditor component. Args: *children: The children of the data editor. + extended_cell_types: Whether to enable extended cell types. **props: The props of the data editor. Raises: @@ -524,7 +525,7 @@ def create(cls, *children, **props) -> Component: "reconstructGridSelection" ).call(grid_selection) - if props.get("extended_cell_types") is not None: + if extended_cell_types: props["custom_renderers"] = Var( "allCells", _var_data=VarData( From fddeb2435f28b2af6c250c7a3b456a47ddbb8b30 Mon Sep 17 00:00:00 2001 From: IEC1 Date: Mon, 23 Feb 2026 08:31:16 +1300 Subject: [PATCH 7/8] Update hash for dataeditor.pyi in pyi_hashes.json --- pyi_hashes.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyi_hashes.json b/pyi_hashes.json index 82e1a301863..b0ef0ffeb48 100644 --- a/pyi_hashes.json +++ b/pyi_hashes.json @@ -23,7 +23,7 @@ "reflex/components/core/window_events.pyi": "af33ccec866b9540ee7fbec6dbfbd151", "reflex/components/datadisplay/__init__.pyi": "52755871369acbfd3a96b46b9a11d32e", "reflex/components/datadisplay/code.pyi": "b86769987ef4d1cbdddb461be88539fd", - "reflex/components/datadisplay/dataeditor.pyi": "1906f2fb29be93dd32f4f71dbb648d36", + "reflex/components/datadisplay/dataeditor.pyi": "f8f1c55a8f05ad0a5eb9bcda37e0371b", "reflex/components/datadisplay/shiki_code_block.pyi": "1d53e75b6be0d3385a342e7b3011babd", "reflex/components/el/__init__.pyi": "0adfd001a926a2a40aee94f6fa725ecc", "reflex/components/el/element.pyi": "c5974a92fbc310e42d0f6cfdd13472f4", From 280c8c9f0b63faadccffde0326594199bbd4b82b Mon Sep 17 00:00:00 2001 From: IEC1 Date: Thu, 12 Mar 2026 09:00:49 +1300 Subject: [PATCH 8/8] Formatting --- reflex/.templates/web/utils/helpers/dataeditor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reflex/.templates/web/utils/helpers/dataeditor.js b/reflex/.templates/web/utils/helpers/dataeditor.js index d8e1ccc569e..0923fc01ffb 100644 --- a/reflex/.templates/web/utils/helpers/dataeditor.js +++ b/reflex/.templates/web/utils/helpers/dataeditor.js @@ -56,7 +56,7 @@ export function formatCell(value, column) { readonly: !editable, data: { kind: "dropdown-cell", - allowedValues: (column.allowedValues || []).map(v => String(v)), + allowedValues: (column.allowedValues || []).map((v) => String(v)), value: cellValue, }, };