Skip to content

Commit e12d710

Browse files
authored
DataGrid - Canceled rows are hidden when multiple rows are added in batch mode (T1250405) (#28548)
1 parent bd502db commit e12d710

File tree

5 files changed

+74
-7
lines changed

5 files changed

+74
-7
lines changed

e2e/testcafe-devextreme/tests/dataGrid/editing/editingEvents.ts

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
/* eslint-disable @typescript-eslint/no-misused-promises */
2-
import { ClientFunction } from 'testcafe';
2+
import { ClientFunction, Selector } from 'testcafe';
33
import DataGrid from 'devextreme-testcafe-models/dataGrid';
4+
import { Overlay } from 'devextreme-testcafe-models/dataGrid/overlay';
5+
import { createScreenshotsComparer } from 'devextreme-screenshot-comparer';
46
import { createWidget } from '../../../helpers/createWidget';
57
import url from '../../../helpers/getPageUrl';
68

@@ -172,3 +174,52 @@ testCases.forEach(({ caseName, expected, onRowRemoving }) => {
172174
});
173175
});
174176
});
177+
178+
// T1250405
179+
test('DataGrid - Canceled rows are hidden when multiple rows are added in batch mode', async (t) => {
180+
const dataGrid = new DataGrid('#container');
181+
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);
182+
const addBtn = dataGrid.getToolbar().getItem();
183+
const saveBtn = dataGrid.getToolbar().getItem(1);
184+
await t.expect(dataGrid.isReady()).ok();
185+
await t
186+
.click(addBtn)
187+
.pressKey('1')
188+
.click(addBtn)
189+
.pressKey('2')
190+
.click(saveBtn);
191+
192+
const overlay1 = new Overlay(Selector('.dx-overlay-wrapper'), 0);
193+
const overlay2 = new Overlay(Selector('.dx-overlay-wrapper'), 1);
194+
const cancelBtn = overlay2.getToolbar(1).getItem(1);
195+
const saveBtnPopup = overlay1.getToolbar(1).getItem(0);
196+
await t
197+
.click(cancelBtn)
198+
.click(saveBtnPopup);
199+
await t
200+
.expect(await takeScreenshot('T1250405-canceled-rows-hidden.png', dataGrid.element))
201+
.ok()
202+
.expect(compareResults.isValid())
203+
.ok(compareResults.errorMessages());
204+
}).before(async () => {
205+
await createWidget('dxDataGrid', {
206+
dataSource: [
207+
{ ID: 1, Text: 'Item 1' },
208+
],
209+
keyExpr: 'ID',
210+
columns: ['Text'],
211+
editing: {
212+
mode: 'batch',
213+
allowAdding: true,
214+
},
215+
onRowInserting(e: any) {
216+
e.cancel = new Promise((resolve) => {
217+
const dialog = (window as any).DevExpress.ui.dialog.confirm(
218+
'Are you sure?',
219+
'Confirm changes',
220+
);
221+
dialog.done((confirm) => resolve(!confirm));
222+
});
223+
},
224+
});
225+
});
4.08 KB
Loading

packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ interface Item {
8080
values?: unknown[];
8181
visible?: boolean;
8282
isExpanded?: boolean;
83+
isNewRow?: boolean;
8384
summaryCells?: unknown[];
8485
rowIndex?: number;
8586
cells?: unknown[];

packages/devextreme/js/__internal/grids/grid_core/editing/m_editing.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable @typescript-eslint/prefer-for-of */
12
/* eslint-disable @typescript-eslint/no-unused-vars, max-classes-per-file */
23
import type { GridsEditMode } from '@js/common/grids';
34
import devices from '@js/core/devices';
@@ -1337,10 +1338,12 @@ class EditingControllerImpl extends modules.ViewController {
13371338
const removeChange = changes[index];
13381339

13391340
changes.forEach((change) => {
1340-
const insertAfterOrBeforeKey = this._getInsertAfterOrBeforeKey(change);
1341+
if (change.type === DATA_EDIT_DATA_INSERT_TYPE) {
1342+
const insertAfterOrBeforeKey = this._getInsertAfterOrBeforeKey(change);
13411343

1342-
if (equalByValue(insertAfterOrBeforeKey, removeChange.key)) {
1343-
change[isDefined(change.insertAfterKey) ? 'insertAfterKey' : 'insertBeforeKey'] = this._getInsertAfterOrBeforeKey(removeChange);
1344+
if (equalByValue(insertAfterOrBeforeKey, removeChange.key)) {
1345+
change[isDefined(change.insertAfterKey) ? 'insertAfterKey' : 'insertBeforeKey'] = this._getInsertAfterOrBeforeKey(removeChange);
1346+
}
13441347
}
13451348
});
13461349
}
@@ -1680,7 +1683,8 @@ class EditingControllerImpl extends modules.ViewController {
16801683

16811684
private _processSaveEditDataResult(results) {
16821685
let hasSavedData = false;
1683-
const changes = [...this.getChanges()];
1686+
const originalChanges = this.getChanges();
1687+
const changes = [...originalChanges];
16841688
const changesLength = changes.length;
16851689

16861690
for (let i = 0; i < results.length; i++) {
@@ -1700,6 +1704,9 @@ class EditingControllerImpl extends modules.ViewController {
17001704
}
17011705
} else if (this._processRemove(changes, editIndex, cancel)) {
17021706
hasSavedData = !cancel;
1707+
const removedChangeIndex = gridCoreUtils.getIndexByKey(results[i].key, originalChanges);
1708+
1709+
this._updateInsertAfterOrBeforeKeys(originalChanges, removedChangeIndex);
17031710
}
17041711
}
17051712

packages/testcafe-models/dataGrid/overlay.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import { Selector } from 'testcafe';
2+
import Toolbar from '../toolbar';
23

34
const CLASS = {
45
overlayWrapper: 'dx-overlay-wrapper',
56
overlayContent: 'dx-overlay-content',
67
invalidMessage: 'dx-invalid-message',
78
revertTooltip: 'dx-datagrid-revert-tooltip',
9+
toolbar: 'dx-toolbar',
810
checkbox: 'dx-checkbox',
911
};
1012

@@ -13,8 +15,10 @@ export class Overlay {
1315

1416
content: Selector;
1517

16-
constructor(id?: Selector) {
17-
this.element = id ?? Selector(`.${CLASS.overlayWrapper}`);
18+
constructor(id?: Selector, index?: number) {
19+
this.element = id
20+
? (index ? id.nth(index) : id)
21+
: Selector(`.${CLASS.overlayWrapper}`).nth(index ? index : 0);
1822

1923
this.content = this.element.find(`.${CLASS.overlayContent}`);
2024
}
@@ -30,4 +34,8 @@ export class Overlay {
3034
getPopupCheckbox(): Selector {
3135
return this.element.find(`.${CLASS.overlayContent} .${CLASS.checkbox}`);
3236
}
37+
38+
getToolbar(idx?: number): Toolbar {
39+
return new Toolbar(this.element.find(`.${CLASS.toolbar}`).nth(idx ? idx : 0));
40+
}
3341
}

0 commit comments

Comments
 (0)