Skip to content

Commit d4c9d7c

Browse files
author
Rodrigo Carranza
committed
[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 d4c9d7c

File tree

11 files changed

+73
-21
lines changed

11 files changed

+73
-21
lines changed

Gruntfile.js

Lines changed: 1 addition & 1 deletion
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var ReactDOM = require('react-dom');
2+
var getOffsetUpToElement = require('./the-graph-library').getOffsetUpToElement;
23
// React mixins
34

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

11+
// Get mouse position
12+
var offset = getOffsetUpToElement(event.currentTarget, event.target);
13+
var x = (event.layerX || event.clientX || 0) - offset.left;
14+
var y = (event.layerY || event.clientY || 0) - offset.top;
15+
1016
var tooltipEvent = new CustomEvent('the-graph-tooltip', {
1117
detail: {
1218
tooltip: this.props.label,
13-
x: event.clientX,
14-
y: event.clientY
19+
x: x,
20+
y: y
1521
},
1622
bubbles: true
1723
});

the-graph/render.js

Lines changed: 0 additions & 1 deletion
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

Lines changed: 9 additions & 4 deletions
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 offset = TheGraph.library.getOffsetUpToElement(event.currentTarget, event.target);
208+
207209
this.zoomFactor += event.deltaY ? event.deltaY : 0-event.wheelDeltaY;
208-
this.zoomX = event.clientX;
209-
this.zoomY = event.clientY;
210+
this.zoomX = event.layerX || (event.clientX - offset.left) || 0;
211+
this.zoomY = event.layerY || (event.clientY - offset.top) || 0;
212+
210213
requestAnimationFrame(this.scheduleWheelZoom);
211214
},
212215
scheduleWheelZoom: function () {
@@ -496,8 +499,10 @@ 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 offset = TheGraph.library.getOffsetUpToElement(event.currentTarget, event.target);
503+
var x = event.layerX || (event.clientX - offset.left) || 0;
504+
var y = event.layerY || (event.clientY - offset.top) || 0;
505+
501506
if (event.touches && event.touches.length) {
502507
x = event.touches[0].clientX;
503508
y = event.touches[0].clientY;

the-graph/the-graph-edge.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,11 @@ 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 offset = TheGraph.library.getOffsetUpToElement(event.currentTarget, event.target);
119+
var x = event.layerX || (event.clientX - offset.left) || 0;
120+
var y = event.layerY || (event.clientY - offset.top) || 0;
121+
119122
if (event.touches && event.touches.length) {
120123
x = event.touches[0].clientX;
121124
y = event.touches[0].clientY;

the-graph/the-graph-graph.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,15 +205,20 @@ 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 offset = TheGraph.library.getOffsetUpToElement(event.currentTarget, event.target);
209+
// The offset should be applied only to clientX/Y if layerX/Y don't exist.
210+
// TODO: Check if there is another way of doing this without using layerX/Y.
211+
// The use of clientX/Y work in most cases except when there are margin/padding in parent elements
212+
// That affect the value of `offset`
213+
var x = event.layerX || (event.clientX - offset.left) || 0;
214+
var y = event.layerY || (event.clientY - offset.top) || 0;
215+
210216
if (event.touches && event.touches.length) {
211217
x = event.touches[0].clientX;
212218
y = event.touches[0].clientY;
213219
}
214220

215-
x -= this.props.app.state.offsetX || 0;
216-
y -= this.props.app.state.offsetY || 0;
221+
// The scale is used here to adapt the edgePreview position if a scale change occurs (wheel scroll)
217222
var scale = this.props.app.state.scale;
218223
this.setState({
219224
edgePreviewX: (x - this.props.app.state.x) / scale,

the-graph/the-graph-group.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,11 @@ 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 offset = TheGraph.library.getOffsetUpToElement(event.currentTarget, event.target);
71+
var x = event.layerX || (event.clientX - offset.left) || 0;
72+
var y = event.layerY || (event.clientY - offset.top) || 0;
73+
7174
if (event.touches && event.touches.length) {
7275
x = event.touches[0].clientX;
7376
y = event.touches[0].clientY;

the-graph/the-graph-library.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,32 @@ 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+
154177
module.exports = {
155178
mergeComponentDefinition: mergeComponentDefinition,
156179
componentsFromGraph: componentsFromGraph,
157180
libraryFromGraph: libraryFromGraph,
181+
getOffsetUpToElement: getOffsetUpToElement,
158182
};

the-graph/the-graph-node.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,11 @@ 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 offset = TheGraph.library.getOffsetUpToElement(event.currentTarget, event.target);
237+
var x = event.layerX || (event.clientX - offset.left) || 0;
238+
var y = event.layerY || (event.clientY - offset.top) || 0;
239+
237240
if (event.touches && event.touches.length) {
238241
x = event.touches[0].clientX;
239242
y = event.touches[0].clientY;

0 commit comments

Comments
 (0)