Skip to content

Commit cbf9875

Browse files
fix: do not dispatch grid-drop event on dropping row to input (#10351) (#10358)
Co-authored-by: Ugur Saglam <106508695+ugur-vaadin@users.noreply.github.com>
1 parent 597c75f commit cbf9875

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

packages/grid/src/vaadin-grid-drag-and-drop-mixin.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ export const DragAndDropMixin = (superClass) =>
410410

411411
/** @private */
412412
_onDrop(e) {
413-
if (this.dropMode) {
413+
if (this.dropMode && this._dropLocation) {
414414
e.stopPropagation();
415415
e.preventDefault();
416416

packages/grid/test/drag-and-drop.test.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ describe('drag and drop', () => {
348348
it('should auto generate data transfer text data', () => {
349349
grid.selectedItems = grid.items;
350350
fireDragStart();
351+
fireDragOver();
351352
fireDrop();
352353
const event = dropSpy.getCall(0).args[0];
353354
const textData = event.detail.dragData.find((d) => d.type === 'text').data;
@@ -361,6 +362,7 @@ describe('drag and drop', () => {
361362
await aTimeout(0);
362363
flushGrid(grid);
363364
fireDragStart();
365+
fireDragOver();
364366
fireDrop();
365367
const event = dropSpy.getCall(0).args[0];
366368
const textData = event.detail.dragData.find((d) => d.type === 'text').data;
@@ -372,6 +374,7 @@ describe('drag and drop', () => {
372374
const columns = grid.querySelectorAll('vaadin-grid-column');
373375
grid._swapColumnOrders(columns[0], columns[1]);
374376
fireDragStart();
377+
fireDragOver();
375378
fireDrop();
376379
const event = dropSpy.getCall(0).args[0];
377380
const textData = event.detail.dragData.find((d) => d.type === 'text').data;
@@ -385,6 +388,7 @@ describe('drag and drop', () => {
385388
e.detail.setDragData('text/plain', e.detail.draggedItems.map((item) => item.last).join(','));
386389
});
387390
fireDragStart();
391+
fireDragOver();
388392
fireDrop();
389393
const event = dropSpy.getCall(0).args[0];
390394
const dragData = event.detail.dragData.find((d) => d.type === 'text/plain');
@@ -734,11 +738,13 @@ describe('drag and drop', () => {
734738
it('should stop the native event', () => {
735739
const spy = sinon.spy();
736740
listenOnce(grid, 'drop', spy);
741+
fireDragOver();
737742
fireDrop();
738743
expect(spy.called).to.be.false;
739744
});
740745

741746
it('should cancel the native event', () => {
747+
fireDragOver();
742748
const event = fireDrop();
743749
expect(event.defaultPrevented).to.be.true;
744750
});
@@ -784,11 +790,13 @@ describe('drag and drop', () => {
784790
});
785791

786792
it('should dispatch a grid specific event', () => {
793+
fireDragOver();
787794
fireDrop();
788795
expect(dropSpy.calledOnce).to.be.true;
789796
});
790797

791798
it('should bubble and be cancelable', () => {
799+
fireDragOver();
792800
fireDrop();
793801
const event = dropSpy.getCall(0).args[0];
794802
expect(event.bubbles).to.be.true;
@@ -823,10 +831,45 @@ describe('drag and drop', () => {
823831
});
824832

825833
it('should have the original event', () => {
834+
fireDragOver();
826835
const originalEvent = fireDrop();
827836
const event = dropSpy.getCall(0).args[0];
828837
expect(event.originalEvent).to.equal(originalEvent);
829838
});
839+
840+
it('should not dispatch grid-drop event on dropping row on input in header', () => {
841+
const column = grid.querySelector('vaadin-grid-column');
842+
column.headerRenderer = (root) => {
843+
if (root.firstChild) {
844+
return;
845+
}
846+
const input = document.createElement('input');
847+
root.appendChild(input);
848+
};
849+
flushGrid(grid);
850+
grid.dropMode = 'between';
851+
fireDragStart();
852+
fireDragOver(grid.$.header.children[0]);
853+
fireDrop(grid.$.header.children[0]);
854+
expect(dropSpy.called).to.be.false;
855+
});
856+
857+
it('should not dispatch grid-drop event on dropping row on input in footer', () => {
858+
const column = grid.querySelector('vaadin-grid-column');
859+
column.footerRenderer = (root) => {
860+
if (root.firstChild) {
861+
return;
862+
}
863+
const input = document.createElement('input');
864+
root.appendChild(input);
865+
};
866+
flushGrid(grid);
867+
grid.dropMode = 'between';
868+
fireDragStart();
869+
fireDragOver(grid.$.footer.children[0]);
870+
fireDrop(grid.$.footer.children[0]);
871+
expect(dropSpy.called).to.be.false;
872+
});
830873
});
831874
});
832875

@@ -987,6 +1030,7 @@ describe('drag and drop', () => {
9871030
it('should emit a grid-drop event for non drop disabled row', () => {
9881031
const spy = sinon.spy();
9891032
listenOnce(grid, 'grid-drop', spy);
1033+
fireDragOver(grid.$.items.children[1]);
9901034
fireDrop(grid.$.items.children[1]);
9911035
expect(spy.called).to.be.true;
9921036
});

0 commit comments

Comments
 (0)