Skip to content

Commit 0ea0c6c

Browse files
committed
fix duplicate row_selection keyword in notebook grid
1 parent f3edbc7 commit 0ea0c6c

2 files changed

Lines changed: 37 additions & 2 deletions

File tree

pywry/pywry/grid.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,18 +1239,34 @@ def build_grid_config( # pylint: disable=too-many-arguments
12391239
elif isinstance(row_selection, dict):
12401240
row_sel_dict = row_selection
12411241

1242+
# Normalize user-provided grid options and consume rowSelection aliases.
1243+
# This prevents duplicate keyword errors when both row_selection param and
1244+
# grid_options['rowSelection'] are present.
1245+
normalized_grid_options = dict(grid_options or {})
1246+
grid_opt_row_selection = normalized_grid_options.pop("rowSelection", None)
1247+
if grid_opt_row_selection is None and "row_selection" in normalized_grid_options:
1248+
grid_opt_row_selection = normalized_grid_options.pop("row_selection")
1249+
1250+
# Precedence:
1251+
# - Explicit row_selection argument (True / dict / RowSelection) wins.
1252+
# - If row_selection is False (default) and grid_options specifies rowSelection,
1253+
# honor grid_options to preserve caller intent.
1254+
final_row_selection = row_sel_dict
1255+
if row_selection is False and grid_opt_row_selection is not None:
1256+
final_row_selection = grid_opt_row_selection
1257+
12421258
options = GridOptions(
12431259
columnDefs=col_defs,
12441260
defaultColDef=DefaultColDef().to_dict(),
12451261
rowData=row_data_for_grid,
12461262
rowModelType=row_model_type,
1247-
rowSelection=row_sel_dict,
1263+
rowSelection=final_row_selection,
12481264
domLayout="normal",
12491265
pagination=pagination,
12501266
paginationPageSize=pagination_page_size,
12511267
cacheBlockSize=cache_block_size,
12521268
enableCellSpan=use_cell_span,
1253-
**(grid_options or {}),
1269+
**normalized_grid_options,
12541270
)
12551271

12561272
context = PyWryGridContext(

pywry/tests/test_grid.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
- build_grid_config() main entry point
1111
- MultiIndex column/row handling
1212
"""
13+
1314
# pylint: disable=too-many-lines
1415

1516
from __future__ import annotations
@@ -741,6 +742,24 @@ def test_grid_options_merge(self):
741742
assert opts_dict["animateRows"] is True
742743
assert opts_dict["suppressMenuHide"] is True
743744

745+
def test_grid_options_row_selection_no_duplicate_error(self):
746+
"""grid_options.rowSelection is honored without duplicate kwargs error."""
747+
extra = {"rowSelection": {"mode": "singleRow", "checkboxes": False}}
748+
result = build_grid_config([{"a": 1}], grid_options=extra)
749+
opts_dict = result.options.to_dict()
750+
751+
assert opts_dict["rowSelection"]["mode"] == "singleRow"
752+
assert opts_dict["rowSelection"]["checkboxes"] is False
753+
754+
def test_explicit_row_selection_overrides_grid_options(self):
755+
"""Explicit row_selection argument overrides grid_options.rowSelection."""
756+
extra = {"rowSelection": {"mode": "singleRow", "checkboxes": False}}
757+
result = build_grid_config([{"a": 1}], grid_options=extra, row_selection=True)
758+
opts_dict = result.options.to_dict()
759+
760+
assert opts_dict["rowSelection"]["mode"] == "multiRow"
761+
assert opts_dict["rowSelection"]["checkboxes"] is True
762+
744763
@pytest.mark.skipif(
745764
not pytest.importorskip("pandas", reason="pandas required"),
746765
reason="pandas required",

0 commit comments

Comments
 (0)