Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions packages/joint-core/src/dia/Paper.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3507,7 +3507,8 @@ export const Paper = View.extend({
if (view) {
// The view could have been disposed during dragging
// e.g. dragged outside of the viewport and hidden
view = this.findViewByModel(view.model);
// The model can be removed in previous mousemove event handlers
view = this.findViewByModel(view.model) || view;
view.pointermove(evt, localPoint.x, localPoint.y);
} else {
this.trigger('blank:pointermove', evt, localPoint.x, localPoint.y);
Expand All @@ -3528,7 +3529,8 @@ export const Paper = View.extend({
if (view) {
// The view could have been disposed during dragging
// e.g. dragged outside of the viewport and hidden
view = this.findViewByModel(view.model);
// The model can be removed in previous mouseup event handlers (e.g. when deleting an element after dragging)
view = this.findViewByModel(view.model) || view;
view.pointerup(normalizedEvt, localPoint.x, localPoint.y);
} else {
this.trigger('blank:pointerup', normalizedEvt, localPoint.x, localPoint.y);
Expand Down
62 changes: 62 additions & 0 deletions packages/joint-core/test/jointjs/paper.js
Original file line number Diff line number Diff line change
Expand Up @@ -2959,6 +2959,68 @@ QUnit.module('paper', function(hooks) {
view.undelegateDocumentEvents();
});

QUnit.test('pointerup handles element removal during event', function(assert) {
const paper = this.paper;
const graph = this.graph;
const spy = sinon.spy();

// Create a new element for this test
const testElement = new joint.shapes.standard.Rectangle({
position: { x: 100, y: 100 },
size: { width: 100, height: 100 }
});
testElement.addTo(graph);

const testElementView = testElement.findView(paper);
const testElementRect = testElementView.el.querySelector('rect');

paper.once('element:pointerup', spy);

// Override pointerup to remove the element during the event
paper.pointerup = function(evt) {
testElement.remove();
joint.dia.Paper.prototype.pointerup.call(paper, evt);
};

// Simulate drag operation
simulate.mousedown({ el: testElementRect });
simulate.mousemove({ el: testElementRect });
simulate.mouseup({ el: testElementRect });

assert.ok(spy.called, 'Handler executed successfully');
});

QUnit.test('pointermove handles element removal during event', function(assert) {
const paper = this.paper;
const graph = this.graph;
const spy = sinon.spy();

// Create a new element for this test
const testElement = new joint.shapes.standard.Rectangle({
position: { x: 100, y: 100 },
size: { width: 100, height: 100 }
});
testElement.addTo(graph);

const testElementView = testElement.findView(paper);
const testElementRect = testElementView.el.querySelector('rect');

paper.once('element:pointermove', spy);

// Override pointermove to remove the element during the event
paper.pointermove = function(evt) {
testElement.remove();
joint.dia.Paper.prototype.pointermove.call(paper, evt);
};

// Simulate drag operation
simulate.mousedown({ el: testElementRect });
simulate.mousemove({ el: testElementRect });
simulate.mouseup({ el: testElementRect });

assert.ok(spy.called, 'Handler executed successfully');
});

QUnit.module('Labels', function(hooks) {

var link, linkView;
Expand Down
Loading