Skip to content

Commit ee20b90

Browse files
authored
DataGrid - Canceled rows are hidden when multiple rows are added in batch mode (T1250405) (#28555)
1 parent 8c1a2f3 commit ee20b90

File tree

5 files changed

+77
-7
lines changed

5 files changed

+77
-7
lines changed

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/devextreme/testing/testcafe/model/dataGrid/overlay.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */
12
import { Selector } from 'testcafe';
3+
import Toolbar from '../toolbar';
24

35
const CLASS = {
46
overlayWrapper: 'dx-overlay-wrapper',
57
overlayContent: 'dx-overlay-content',
68
invalidMessage: 'dx-invalid-message',
79
revertTooltip: 'dx-datagrid-revert-tooltip',
10+
toolbar: 'dx-toolbar',
811
checkbox: 'dx-checkbox',
912
};
1013

@@ -13,8 +16,12 @@ export class Overlay {
1316

1417
content: Selector;
1518

16-
constructor(id?: Selector) {
17-
this.element = id ?? Selector(`.${CLASS.overlayWrapper}`);
19+
constructor(id?: Selector, index?: number) {
20+
if (id) {
21+
this.element = index ? id.nth(index) : id;
22+
} else {
23+
this.element = Selector(`.${CLASS.overlayWrapper}`).nth(index || 0);
24+
}
1825

1926
this.content = this.element.find(`.${CLASS.overlayContent}`);
2027
}
@@ -30,4 +37,8 @@ export class Overlay {
3037
getPopupCheckbox(): Selector {
3138
return this.element.find(`.${CLASS.overlayContent} .${CLASS.checkbox}`);
3239
}
40+
41+
getToolbar(idx?: number): Toolbar {
42+
return new Toolbar(this.element.find(`.${CLASS.toolbar}`).nth(idx || 0));
43+
}
3344
}

packages/devextreme/testing/testcafe/tests/dataGrid/editing/editingEvents.ts

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
/* eslint-disable @typescript-eslint/no-misused-promises */
2-
import { ClientFunction } from 'testcafe';
2+
import { ClientFunction, Selector } from 'testcafe';
3+
import { createScreenshotsComparer } from 'devextreme-screenshot-comparer';
4+
import { Overlay } from '../../../model/dataGrid/overlay';
35
import { createWidget } from '../../../helpers/createWidget';
46
import url from '../../../helpers/getPageUrl';
57
import DataGrid from '../../../model/dataGrid';
@@ -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

0 commit comments

Comments
 (0)