Skip to content

Commit 0a46768

Browse files
[EAG-829] Fix offset issues in several elements. (#1)
[EAG-829] Fix offset issues in several elements. **Ticket:** https://jira.carecloud.com/browse/EAG-829 **Reviewers:** @jnorris-carecloud, @jleyba-carecloud **Changes:** - Fix issues with some elements' offsets with the editor was not in the coords `{x: 0, y: 0}`
1 parent ea1a0ae commit 0a46768

11 files changed

+100
-45
lines changed

Gruntfile.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
connect: {
8787
server: {
8888
options: {
89-
port: 3000,
89+
port: 3030,
9090
hostname: '*', // Allow connection from mobile
9191
livereload: true
9292
}

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@carecloud/the-graph",
3-
"version": "0.12.0",
3+
"version": "0.12.1",
44
"description": "flow-based programming graph editing",
55
"author": "Forrest Oliphant, the Grid",
66
"license": "MIT",
@@ -16,6 +16,7 @@
1616
"font-awesome": "^4.6.3",
1717
"hammerjs": "^2.0.8",
1818
"klayjs-noflo": "^0.3.1",
19+
"phantomjs": "^2.1.7",
1920
"tv4": "^1.3.0",
2021
"yargs": "^10.0.3"
2122
},

the-graph/mixins.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var ReactDOM = require('react-dom');
2+
var getEventPosition = require('./the-graph-library').getEventPosition;
23
// React mixins
34

45
// Show fake tooltip
@@ -7,11 +8,13 @@ var Tooltip = {
78
showTooltip: function (event) {
89
if ( !this.shouldShowTooltip() ) { return; }
910

11+
// Get mouse position
12+
var position = getEventPosition(event);
1013
var tooltipEvent = new CustomEvent('the-graph-tooltip', {
1114
detail: {
1215
tooltip: this.props.label,
13-
x: event.clientX,
14-
y: event.clientY
16+
x: position.x,
17+
y: position.y
1518
},
1619
bubbles: true
1720
});

the-graph/render.js

-1
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,6 @@ function renderGraph(graph, options) {
189189
graph: graph,
190190
library: options.library,
191191
};
192-
//console.log('render', props);
193192

194193
var wrapper = document.createElement('div');
195194
wrapper.className = options.theme;

the-graph/the-graph-app.js

+11-8
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,12 @@ module.exports.register = function (context) {
204204
}
205205

206206
// Safari is wheelDeltaY
207+
var position = TheGraph.library.getEventPosition(event);
208+
207209
this.zoomFactor += event.deltaY ? event.deltaY : 0-event.wheelDeltaY;
208-
this.zoomX = event.clientX;
209-
this.zoomY = event.clientY;
210+
this.zoomX = position.x;
211+
this.zoomY = position.y;
212+
210213
requestAnimationFrame(this.scheduleWheelZoom);
211214
},
212215
scheduleWheelZoom: function () {
@@ -496,19 +499,19 @@ module.exports.register = function (context) {
496499
if (event.preventTap) { event.preventTap(); }
497500

498501
// Get mouse position
499-
var x = event.x || event.clientX || 0;
500-
var y = event.y || event.clientY || 0;
502+
var position = TheGraph.library.getEventPosition(event);
503+
501504
if (event.touches && event.touches.length) {
502-
x = event.touches[0].clientX;
503-
y = event.touches[0].clientY;
505+
position.x = event.touches[0].clientX;
506+
position.y = event.touches[0].clientY;
504507
}
505508

506509
// App.showContext
507510
this.showContext({
508511
element: this,
509512
type: "main",
510-
x: x,
511-
y: y,
513+
x: position.x,
514+
y: position.y,
512515
graph: this.props.graph,
513516
itemKey: 'graph',
514517
item: this.props.graph

the-graph/the-graph-edge.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -114,19 +114,20 @@ module.exports.register = function (context) {
114114
if (event.gesture) {
115115
event = event.gesture.srcEvent; // unpack hammer.js gesture event
116116
}
117-
var x = event.x || event.clientX || 0;
118-
var y = event.y || event.clientY || 0;
117+
118+
var position = TheGraph.library.getEventPosition(event);
119+
119120
if (event.touches && event.touches.length) {
120-
x = event.touches[0].clientX;
121-
y = event.touches[0].clientY;
121+
position.x = event.touches[0].clientX;
122+
position.y = event.touches[0].clientY;
122123
}
123124

124125
// App.showContext
125126
this.props.showContext({
126127
element: this,
127128
type: (this.props.export ? (this.props.isIn ? "graphInport" : "graphOutport") : "edge"),
128-
x: x,
129-
y: y,
129+
x: position.x,
130+
y: position.y,
130131
graph: this.props.graph,
131132
itemKey: (this.props.export ? this.props.exportKey : null),
132133
item: (this.props.export ? this.props.export : this.props.edge)

the-graph/the-graph-graph.js

+7-8
Original file line numberDiff line numberDiff line change
@@ -205,19 +205,18 @@ module.exports.register = function (context) {
205205
event = event.gesture.srcEvent; // unpack hammer.js gesture event
206206
}
207207

208-
var x = event.x || event.clientX || 0;
209-
var y = event.y || event.clientY || 0;
208+
var position = TheGraph.library.getEventPosition(event);
209+
210210
if (event.touches && event.touches.length) {
211-
x = event.touches[0].clientX;
212-
y = event.touches[0].clientY;
211+
position.x = event.touches[0].clientX;
212+
position.y = event.touches[0].clientY;
213213
}
214214

215-
x -= this.props.app.state.offsetX || 0;
216-
y -= this.props.app.state.offsetY || 0;
215+
// The scale is used here to adapt the edgePreview position if a scale change occurs (wheel scroll)
217216
var scale = this.props.app.state.scale;
218217
this.setState({
219-
edgePreviewX: (x - this.props.app.state.x) / scale,
220-
edgePreviewY: (y - this.props.app.state.y) / scale
218+
edgePreviewX: (position.x - this.props.app.state.x) / scale,
219+
edgePreviewY: (position.y - this.props.app.state.y) / scale
221220
});
222221
this.markDirty();
223222
},

the-graph/the-graph-group.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -66,19 +66,20 @@ module.exports.register = function (context) {
6666
if (event.gesture) {
6767
event = event.gesture.srcEvent; // unpack hammer.js gesture event
6868
}
69-
var x = event.x || event.clientX || 0;
70-
var y = event.y || event.clientY || 0;
69+
70+
var position = TheGraph.library.getEventPosition(event);
71+
7172
if (event.touches && event.touches.length) {
72-
x = event.touches[0].clientX;
73-
y = event.touches[0].clientY;
73+
position.x = event.touches[0].clientX;
74+
position.y = event.touches[0].clientY;
7475
}
7576

7677
// App.showContext
7778
this.props.showContext({
7879
element: this,
7980
type: (this.props.isSelectionGroup ? "selection" : "group"),
80-
x: x,
81-
y: y,
81+
x: position.x,
82+
y: position.y,
8283
graph: this.props.graph,
8384
itemKey: this.props.label,
8485
item: this.props.item

the-graph/the-graph-library.js

+46
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,54 @@ function libraryFromGraph(fbpGraph) {
151151
return library;
152152
}
153153

154+
/**
155+
* Returns offsets for mouse position.
156+
*
157+
* This function need to calculate correct offset in case the-graph
158+
* used as positioned in not (0, 0) coordinates.
159+
*
160+
* @param initialElement - event target.
161+
* @param upperElement - upper the-graph element (see usages for example).
162+
* @returns {{top: number, left: number}}
163+
*/
164+
function getOffsetUpToElement(initialElement, upperElement) {
165+
var offset = {top: 0, left: 0};
166+
var offsetParent = initialElement;
167+
168+
while (offsetParent != null && offsetParent != upperElement) {
169+
offset.left += offsetParent.offsetLeft || 0;
170+
offset.top += offsetParent.offsetTop || 0;
171+
offsetParent = offsetParent.parentElement;
172+
}
173+
174+
return offset;
175+
}
176+
177+
178+
/**
179+
* Returns the position {y: Y, x: X} where the provided event was triggered.
180+
*
181+
* @param event - event triggered from the UI.
182+
* @returns {{y: number, x: number}}
183+
*/
184+
function getEventPosition(event) {
185+
var offset = getOffsetUpToElement(event.currentTarget, event.target);
186+
187+
// The offset should be applied only to clientX/Y if layerX/Y don't exist.
188+
// TODO: Check if there is another way of doing this without using layerX/Y.
189+
// The use of clientX/Y works in most cases except when there is margin/padding in parent elements
190+
// That affects the value of `offset`.
191+
return {
192+
y: event.layerY || (event.clientY - offset.top) || 0,
193+
x: event.layerX || (event.clientX - offset.left) || 0
194+
};
195+
}
196+
197+
154198
module.exports = {
155199
mergeComponentDefinition: mergeComponentDefinition,
156200
componentsFromGraph: componentsFromGraph,
157201
libraryFromGraph: libraryFromGraph,
202+
getOffsetUpToElement: getOffsetUpToElement,
203+
getEventPosition: getEventPosition,
158204
};

the-graph/the-graph-node.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -232,19 +232,20 @@ module.exports.register = function (context) {
232232
if (event.gesture) {
233233
event = event.gesture.srcEvent; // unpack hammer.js gesture event
234234
}
235-
var x = event.x || event.clientX || 0;
236-
var y = event.y || event.clientY || 0;
235+
236+
var position = TheGraph.library.getEventPosition(event);
237+
237238
if (event.touches && event.touches.length) {
238-
x = event.touches[0].clientX;
239-
y = event.touches[0].clientY;
239+
position.x = event.touches[0].clientX;
240+
position.y = event.touches[0].clientY;
240241
}
241242

242243
// App.showContext
243244
this.props.showContext({
244245
element: this,
245246
type: (this.props.export ? (this.props.isIn ? "graphInport" : "graphOutport") : "node"),
246-
x: x,
247-
y: y,
247+
x: position.x,
248+
y: position.y,
248249
graph: this.props.graph,
249250
itemKey: (this.props.export ? this.props.exportKey : this.props.nodeID),
250251
item: (this.props.export ? this.props.export : this.props.node)

the-graph/the-graph-port.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,20 @@ module.exports.register = function (context) {
9191
if (event.gesture) {
9292
event = event.gesture.srcEvent; // unpack hammer.js gesture event
9393
}
94-
var x = event.x || event.clientX || 0;
95-
var y = event.y || event.clientY || 0;
94+
95+
var position = TheGraph.library.getEventPosition(event);
96+
9697
if (event.touches && event.touches.length) {
97-
x = event.touches[0].clientX;
98-
y = event.touches[0].clientY;
98+
position.x = event.touches[0].clientX;
99+
position.y = event.touches[0].clientY;
99100
}
100101

101102
// App.showContext
102103
this.props.showContext({
103104
element: this,
104105
type: (this.props.isIn ? "nodeInport" : "nodeOutport"),
105-
x: x,
106-
y: y,
106+
x: position.x,
107+
y: position.y,
107108
graph: this.props.graph,
108109
itemKey: this.props.label,
109110
item: this.props.port

0 commit comments

Comments
 (0)