Skip to content

Commit d54008b

Browse files
authored
[codex] Fix right-click delete confirmation overlap (#188)
* Fix right-click delete confirmation overlap * Document modal and context menu stacking
1 parent f0834db commit d54008b

3 files changed

Lines changed: 59 additions & 3 deletions

File tree

apps/web/styles.css

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,7 @@ Custom header styles for default items
709709

710710
.data-grid-context-menu {
711711
position: fixed;
712+
/* Keep this below the shared modal backdrops so confirm dialogs stay unobscured. */
712713
z-index: 2500;
713714
min-width: 14rem;
714715
max-width: min(22rem, calc(100vw - 1rem));
@@ -1189,7 +1190,8 @@ body.theme-dark .generator-status-text[data-severity='info'] {
11891190
align-items: center;
11901191
justify-content: center;
11911192
background: rgba(10, 22, 16, 0.45);
1192-
z-index: 2000;
1193+
/* Keep this above the grid context menu to avoid right-click action overlap bugs. */
1194+
z-index: 3000;
11931195
}
11941196

11951197
.text-input-modal {

packages/core-ui/js/gui_components/data-grid-editor/data-grid-component-view.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,8 @@ class DataGridComponentView {
404404
return;
405405
}
406406

407+
this.closeContextMenu();
408+
407409
if (action === 'add-row') {
408410
this.controller.addRow();
409411
} else if (action === 'add-rows-above') {
@@ -431,8 +433,6 @@ class DataGridComponentView {
431433
} else if (action === 'auto-fit-columns') {
432434
this.controller.sizeColumnsToFit();
433435
}
434-
435-
this.closeContextMenu();
436436
}
437437

438438
onRootChange(event) {

packages/core-ui/src/tests/grid/data-grid-component-view.test.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,60 @@ describe('DataGridComponent view', () => {
242242
component.destroy();
243243
});
244244

245+
test('closes the right-click context menu before opening delete confirmation flows', async () => {
246+
const root = document.createElement('section');
247+
document.body.appendChild(root);
248+
let resolveConfirm;
249+
const requestConfirm = jest.fn(
250+
() =>
251+
new Promise((resolve) => {
252+
resolveConfirm = resolve;
253+
})
254+
);
255+
const component = createDataGridComponent({
256+
root,
257+
documentObj: document,
258+
services: {
259+
TabulatorCtor: FakeTabulator,
260+
GridExtensionClass: FakeGridExtension,
261+
requestConfirm,
262+
},
263+
});
264+
265+
await component.whenReady();
266+
component.getGridExtras().getNumberOfSelectedRows.mockReturnValue(1);
267+
268+
const gridRoot = root.querySelector('[data-role="data-grid-root"]');
269+
gridRoot.dispatchEvent(
270+
new dom.window.MouseEvent('contextmenu', {
271+
bubbles: true,
272+
cancelable: true,
273+
clientX: 32,
274+
clientY: 48,
275+
})
276+
);
277+
278+
const menuRoot = root.querySelector('[data-role="data-grid-context-menu"]');
279+
expect(menuRoot.hidden).toBe(false);
280+
281+
menuRoot.querySelector('[data-context-action="delete-selected-rows"]').click();
282+
283+
expect(menuRoot.hidden).toBe(true);
284+
expect(menuRoot.childElementCount).toBe(0);
285+
expect(requestConfirm).toHaveBeenCalledWith({
286+
title: 'Delete Rows',
287+
message: 'Are you Sure You Want to Delete Rows?',
288+
});
289+
expect(component.getGridExtras().deleteSelectedRows).not.toHaveBeenCalled();
290+
291+
resolveConfirm(true);
292+
await Promise.resolve();
293+
294+
expect(component.getGridExtras().deleteSelectedRows).toHaveBeenCalledTimes(1);
295+
296+
component.destroy();
297+
});
298+
245299
test('prefers the root owner window Tabulator when no service override is supplied', async () => {
246300
const originalTabulator = globalThis.Tabulator;
247301
const root = document.createElement('section');

0 commit comments

Comments
 (0)