Skip to content

Commit 55953ff

Browse files
committed
enhancement: Refactor Grid Row Selection to use Granular Updates and No-Op Checks (#9014)
1 parent 8e549a3 commit 55953ff

1 file changed

Lines changed: 25 additions & 27 deletions

File tree

src/selection/grid/BaseModel.mjs

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ class BaseModel extends Model {
4949
{view} = me,
5050
{store} = view,
5151
isCell = me.ntype.includes('cell'),
52-
keyProp = store.getKeyProperty(),
5352
processed = new Set();
5453

5554
items.forEach(item => {
56-
let recordId, row;
55+
let hasChanged = false,
56+
recordId, row;
5757

5858
if (isCell) {
5959
// item is a logical ID: recordId__dataField
@@ -66,16 +66,19 @@ class BaseModel extends Model {
6666
processed.add(item); // Process each logical cell only once per batch
6767

6868
// Find the cell node in the row's VDOM
69-
let dataField = view.getDataField(item),
70-
cellNode = row.vdom.cn.find(n => n.data?.field === dataField);
69+
let dataField = view.getDataField(item),
70+
cellNode = row.vdom.cn.find(n => n.data?.field === dataField),
71+
shouldSelect = me.isSelected(item),
72+
alreadySelect = cellNode.cls?.includes(me.selectedCls);
7173

72-
if (cellNode) {
74+
if (cellNode && shouldSelect !== alreadySelect) {
7375
// Mutate VDOM directly: Toggle selection class
74-
NeoArray.toggle(cellNode.cls, me.selectedCls, me.isSelected(item))
76+
NeoArray[shouldSelect ? 'add' : 'remove'](cellNode.cls, me.selectedCls);
77+
hasChanged = true
7578
}
7679

7780
// We must trigger the update on the row to flush the VDOM change
78-
if (!silent) {
81+
if (hasChanged && !silent) {
7982
row.update()
8083
}
8184
}
@@ -91,18 +94,23 @@ class BaseModel extends Model {
9194
if (record) {
9295
row = view.getRow(record);
9396
if (row) {
94-
let isSelected = me.isSelectedRow(recordId);
97+
let isSelected = me.isSelectedRow(recordId),
98+
alreadySelect = row.vdom.cls?.includes(me.selectedCls);
9599

96-
// Mutate VDOM directly: Toggle selection class on the row
97-
NeoArray.toggle(row.vdom.cls, me.selectedCls, isSelected);
100+
if (isSelected !== alreadySelect) {
101+
// Mutate VDOM directly: Toggle selection class on the row
102+
NeoArray[isSelected ? 'add' : 'remove'](row.vdom.cls, me.selectedCls);
98103

99-
if (isSelected) {
100-
row.vdom['aria-selected'] = true
101-
} else {
102-
delete row.vdom['aria-selected']
104+
if (isSelected) {
105+
row.vdom['aria-selected'] = true
106+
} else {
107+
delete row.vdom['aria-selected']
108+
}
109+
110+
hasChanged = true
103111
}
104112

105-
if (!silent) {
113+
if (hasChanged && !silent) {
106114
row.update()
107115
}
108116
}
@@ -194,12 +202,7 @@ class BaseModel extends Model {
194202

195203
NeoArray.remove(me.selectedRows, recordId);
196204

197-
me.updateRows(recordId, true);
198-
199-
if (!silent) {
200-
me.view.updateDepth = 2;
201-
me.view.update()
202-
}
205+
me.updateRows(recordId, silent)
203206
}
204207

205208
/**
@@ -284,12 +287,7 @@ class BaseModel extends Model {
284287

285288
NeoArray.add(me.selectedRows, recordId);
286289

287-
me.updateRows(recordId, true);
288-
289-
if (!silent) {
290-
me.view.updateDepth = 2;
291-
me.view.update()
292-
}
290+
me.updateRows(recordId, silent)
293291
}
294292

295293
/**

0 commit comments

Comments
 (0)