Skip to content

Commit 8d3a09f

Browse files
authored
fix(dia.Paper): custom events on link label (#2381)
1 parent d033ff4 commit 8d3a09f

File tree

3 files changed

+100
-19
lines changed

3 files changed

+100
-19
lines changed

src/dia/Paper.mjs

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2201,22 +2201,12 @@ export const Paper = View.extend({
22012201
view.preventDefaultInteraction(evt);
22022202
}
22032203

2204-
const rootViewEl = view.el;
2205-
22062204
// Custom event
2207-
const eventNode = target.closest('[event]');
2208-
if (eventNode && rootViewEl !== eventNode && view.el.contains(eventNode)) {
2209-
const eventEvt = normalizeEvent($.Event(evt.originalEvent, {
2210-
data: evt.data,
2211-
// Originally the event listener was attached to the event element.
2212-
currentTarget: eventNode
2213-
}));
2214-
this.onevent(eventEvt);
2215-
if (eventEvt.isDefaultPrevented()) {
2216-
evt.preventDefault();
2217-
}
2218-
// `onevent` can stop propagation
2205+
const eventEvt = this.customEventTrigger(evt, view);
2206+
if (eventEvt) {
2207+
// `onevent` could have stopped propagation
22192208
if (eventEvt.isPropagationStopped()) return;
2209+
22202210
evt.data = eventEvt.data;
22212211
}
22222212

@@ -2548,15 +2538,24 @@ export const Paper = View.extend({
25482538
onlabel: function(evt) {
25492539

25502540
var labelNode = evt.currentTarget;
2541+
25512542
var view = this.findView(labelNode);
2552-
if (view) {
2543+
if (!view) return;
25532544

2554-
evt = normalizeEvent(evt);
2555-
if (this.guard(evt, view)) return;
2545+
evt = normalizeEvent(evt);
2546+
if (this.guard(evt, view)) return;
25562547

2557-
var localPoint = this.snapToGrid(evt.clientX, evt.clientY);
2558-
view.onlabel(evt, localPoint.x, localPoint.y);
2548+
// Custom event
2549+
const eventEvt = this.customEventTrigger(evt, view, labelNode);
2550+
if (eventEvt) {
2551+
// `onevent` could have stopped propagation
2552+
if (eventEvt.isPropagationStopped()) return;
2553+
2554+
evt.data = eventEvt.data;
25592555
}
2556+
2557+
var localPoint = this.snapToGrid(evt.clientX, evt.clientY);
2558+
view.onlabel(evt, localPoint.x, localPoint.y);
25602559
},
25612560

25622561
getPointerArgs(evt) {
@@ -3082,6 +3081,29 @@ export const Paper = View.extend({
30823081
markerContentVEl.appendTo(markerVEl);
30833082
markerVEl.appendTo(defs);
30843083
return id;
3084+
},
3085+
3086+
customEventTrigger: function(evt, view, rootNode = view.el) {
3087+
3088+
const eventNode = evt.target.closest('[event]');
3089+
3090+
if (eventNode && rootNode !== eventNode && view.el.contains(eventNode)) {
3091+
const eventEvt = normalizeEvent($.Event(evt.originalEvent, {
3092+
data: evt.data,
3093+
// Originally the event listener was attached to the event element.
3094+
currentTarget: eventNode
3095+
}));
3096+
3097+
this.onevent(eventEvt);
3098+
3099+
if (eventEvt.isDefaultPrevented()) {
3100+
evt.preventDefault();
3101+
}
3102+
3103+
return eventEvt;
3104+
}
3105+
3106+
return null;
30853107
}
30863108

30873109
}, {

test/jointjs/paper.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2940,4 +2940,61 @@ QUnit.module('paper', function(hooks) {
29402940
});
29412941
});
29422942
});
2943+
2944+
QUnit.test('custom event with label link', function(assert) {
2945+
2946+
const event = 'link:label:pointerdown';
2947+
2948+
const link = new joint.shapes.standard.Link({
2949+
source: { x: 50, y: 50 },
2950+
target: { x: 300, y: 70 },
2951+
labels: [{
2952+
markup: [
2953+
{
2954+
tagName: 'rect',
2955+
selector: 'labelBody'
2956+
}, {
2957+
tagName: 'text',
2958+
selector: 'labelText'
2959+
}
2960+
],
2961+
attrs: {
2962+
labelText: {
2963+
text: 'Label',
2964+
pointerEvents: 'none',
2965+
},
2966+
labelBody: {
2967+
ref: 'text',
2968+
width: 'calc(w)',
2969+
height: 'calc(h)',
2970+
fill: '#ffffff',
2971+
stroke: 'black',
2972+
event,
2973+
}
2974+
},
2975+
}]
2976+
});
2977+
2978+
const { paper, graph } = this;
2979+
2980+
graph.addCell(link);
2981+
2982+
const spy = sinon.spy();
2983+
paper.on('all', spy);
2984+
2985+
const linkView = link.findView(paper);
2986+
const labelBody = linkView.el.querySelector('rect');
2987+
2988+
simulate.mousedown({ el: labelBody, clientX: 10, clientY: 10 });
2989+
2990+
var localPoint = paper.snapToGrid(10, 10);
2991+
assert.ok(spy.calledThrice);
2992+
assert.ok(spy.calledWithExactly(
2993+
event,
2994+
linkView,
2995+
sinon.match.instanceOf($.Event),
2996+
localPoint.x,
2997+
localPoint.y
2998+
));
2999+
});
29433000
});

types/joint.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1757,6 +1757,8 @@ export namespace dia {
17571757
protected insertView(cellView: CellView, isInitialInsert: boolean): void;
17581758

17591759
protected detachView(cellView: CellView): void;
1760+
1761+
protected customEventTrigger(event: dia.Event, view: CellView, rootNode?: SVGElement): dia.Event | null;
17601762
}
17611763

17621764
namespace PaperLayer {

0 commit comments

Comments
 (0)