@pie-lib/plot 3.2.0-next.37 → 3.2.0-next.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/lib/grid-draggable.js +42 -24
- package/lib/grid-draggable.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/grid-draggable.test.jsx +26 -18
- package/src/grid-draggable.jsx +37 -18
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [3.2.0-next.38](https://github.com/pie-framework/pie-lib/compare/@pie-lib/plot@3.2.0-next.37...@pie-lib/plot@3.2.0-next.38) (2026-04-24)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- enhance drag handling and prevent click interference in draggable components. fix auto input label PIE-428 ([cc06766](https://github.com/pie-framework/pie-lib/commit/cc06766fab6960356f3e7f8975da1f12f3358a9e))
|
|
11
|
+
- refactor drag event handling to use reusable mockStartEvent for consistency ([5afea30](https://github.com/pie-framework/pie-lib/commit/5afea30ead6caa387fa1822c7d498069b704d9c8))
|
|
12
|
+
|
|
6
13
|
# [3.2.0-next.37](https://github.com/pie-framework/pie-lib/compare/@pie-lib/plot@3.2.0-next.36...@pie-lib/plot@3.2.0-next.37) (2026-04-24)
|
|
7
14
|
|
|
8
15
|
### Bug Fixes
|
package/lib/grid-draggable.js
CHANGED
|
@@ -68,13 +68,24 @@ var gridDraggable = exports.gridDraggable = function gridDraggable(opts) {
|
|
|
68
68
|
if (document.activeElement) {
|
|
69
69
|
document.activeElement.blur();
|
|
70
70
|
}
|
|
71
|
-
// reliably track whether any real drag movement occurred. This avoids the async-setState race condition
|
|
72
|
-
// where onStop fires before setState has updated, causing drags to be misidentified as clicks.
|
|
73
71
|
_this._didDrag = false;
|
|
74
72
|
_this.setState({
|
|
75
73
|
startX: e.clientX,
|
|
76
74
|
startY: e.clientY
|
|
77
75
|
});
|
|
76
|
+
|
|
77
|
+
// Intercept the native 'click' event that the browser fires after mouseup.
|
|
78
|
+
// We use a one-time capture-phase listener so we can suppress it when a
|
|
79
|
+
// real drag occurred, preventing Bg's d3 click listener from creating a new mark.
|
|
80
|
+
var target = e.target;
|
|
81
|
+
var _onNativeClick = function onNativeClick(clickEvent) {
|
|
82
|
+
target.removeEventListener('click', _onNativeClick, true);
|
|
83
|
+
if (_this._didDrag) {
|
|
84
|
+
clickEvent.stopPropagation();
|
|
85
|
+
clickEvent.preventDefault();
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
target.addEventListener('click', _onNativeClick, true);
|
|
78
89
|
if (onDragStart) {
|
|
79
90
|
onDragStart();
|
|
80
91
|
}
|
|
@@ -191,16 +202,15 @@ var gridDraggable = exports.gridDraggable = function gridDraggable(opts) {
|
|
|
191
202
|
onDrag = _this$props.onDrag,
|
|
192
203
|
graphProps = _this$props.graphProps,
|
|
193
204
|
disabled = _this$props.disabled;
|
|
194
|
-
if (!onDrag || disabled) {
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
205
|
|
|
198
|
-
//
|
|
199
|
-
//
|
|
200
|
-
// due to sub-pixel jitter on mousedown.
|
|
206
|
+
// Track drag movement BEFORE any early returns so that onStop always
|
|
207
|
+
// knows a real drag occurred, even when onDrag prop is absent or disabled.
|
|
201
208
|
if (Math.abs(dd.deltaX) > 1 || Math.abs(dd.deltaY) > 1) {
|
|
202
209
|
_this._didDrag = true;
|
|
203
210
|
}
|
|
211
|
+
if (!onDrag || disabled) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
204
214
|
var bounds = _this.getScaledBounds();
|
|
205
215
|
if (dd.deltaX < 0 && dd.deltaX < bounds.left) {
|
|
206
216
|
return;
|
|
@@ -253,31 +263,38 @@ var gridDraggable = exports.gridDraggable = function gridDraggable(opts) {
|
|
|
253
263
|
// For non-disabled marks, stop propagation so the Bg d3 listener
|
|
254
264
|
// doesn't also create a new mark on top of this one.
|
|
255
265
|
// Disabled/background marks allow propagation so Bg can handle the click.
|
|
256
|
-
if (!disabled) {
|
|
266
|
+
if (!disabled && typeof (e === null || e === void 0 ? void 0 : e.stopPropagation) === 'function') {
|
|
257
267
|
e.stopPropagation();
|
|
258
268
|
}
|
|
259
269
|
if (onClick) {
|
|
260
270
|
log('call onClick');
|
|
261
271
|
_this.setState({
|
|
262
|
-
startX: null
|
|
272
|
+
startX: null,
|
|
273
|
+
startY: null
|
|
263
274
|
});
|
|
264
275
|
var graphProps = _this.props.graphProps;
|
|
265
276
|
var scale = graphProps.scale,
|
|
266
277
|
snap = graphProps.snap;
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
278
|
+
try {
|
|
279
|
+
var _pointer = (0, _d3Selection.pointer)(e, e.target),
|
|
280
|
+
_pointer2 = (0, _slicedToArray2["default"])(_pointer, 2),
|
|
281
|
+
rawX = _pointer2[0],
|
|
282
|
+
rawY = _pointer2[1];
|
|
283
|
+
var x = scale.x.invert(rawX);
|
|
284
|
+
var y = scale.y.invert(rawY);
|
|
285
|
+
x = snap.x(x);
|
|
286
|
+
y = snap.y(y);
|
|
287
|
+
onClick({
|
|
288
|
+
x: x,
|
|
289
|
+
y: y
|
|
290
|
+
});
|
|
291
|
+
} catch (_) {
|
|
292
|
+
// pointer() can fail on SVG elements (e.g. <circle>) that lack a valid
|
|
293
|
+
// coordinate transform. Label-mode callbacks use props data, not coords.
|
|
294
|
+
onClick({});
|
|
295
|
+
}
|
|
280
296
|
}
|
|
297
|
+
return false;
|
|
281
298
|
}
|
|
282
299
|
_this.setState({
|
|
283
300
|
startX: null,
|
|
@@ -325,7 +342,8 @@ var gridDraggable = exports.gridDraggable = function gridDraggable(opts) {
|
|
|
325
342
|
grid: [grid.x, grid.y]
|
|
326
343
|
}, /*#__PURE__*/_react["default"].createElement(Comp, (0, _extends2["default"])({}, rest, {
|
|
327
344
|
disabled: disabled,
|
|
328
|
-
isDragging: isDragging
|
|
345
|
+
isDragging: isDragging,
|
|
346
|
+
onClick: isDragging ? undefined : onClick
|
|
329
347
|
})));
|
|
330
348
|
}
|
|
331
349
|
}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid-draggable.js","names":["_react","_interopRequireDefault","require","_propTypes","_types","_draggable","_debug","utils","_interopRequireWildcard","_lodashEs","_invariant","_d3Selection","_excluded","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","Boolean","prototype","valueOf","log","debug","deltaFn","exports","scale","snap","val","delta","normalized","inverted","invert","fixDecimalsArithmetic","toFixed","gridDraggable","opts","Comp","_GridDraggable","invariant","isFunction","fromDelta","bounds","anchorPoint","_React$Component","GridDraggable","props","_this","_classCallCheck2","graphProps","domain","range","x","step","y","onDragStart","document","activeElement","blur","_didDrag","setState","startX","clientX","startY","clientY","_opts$anchorPoint","key","event","K","toUpperCase","end","concat","start","state","Math","abs","out","grid","scaled","left","right","top","bottom","buffer","min","node","svg","ownerSVGElement","createSVGPoint","point","touches","touch","getScreenCTM","matrixTransform","inverse","rect","getBoundingClientRect","clientLeft","clientTop","dd","rootNode","getRootNode","clientPoint","getClientPoint","_clientPoint","_slicedToArray2","rawX","rawY","xOutside","deltaX","max","yOutside","deltaY","_this$props","onDrag","disabled","getScaledBounds","skipDragOutsideOfBounds","dragArg","applyDelta","undefined","pos","position","p","getDelta","_this$props2","onDragStop","onClick","lastX","lastY","isClick","stopPropagation","_pointer","pointer","target","_pointer2","_inherits2","_createClass2","value","render","_this$props3","rest","_objectWithoutProperties2","onMouseDown","nativeEvent","preventDefault","isDragging","createElement","DraggableCore","onStart","onStop","axis","_extends2","React","Component","PropTypes","bool","func","onMove","GraphPropsType","isRequired"],"sources":["../src/grid-draggable.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { GraphPropsType } from './types';\nimport { DraggableCore } from './draggable';\nimport debug from 'debug';\nimport * as utils from './utils';\nimport { isFunction } from 'lodash-es';\nimport invariant from 'invariant';\nimport { pointer } from 'd3-selection';\n\nconst log = debug('pie-lib:plot:grid-draggable');\n\nexport const deltaFn = (scale, snap, val) => (delta) => {\n const normalized = delta + scale(0);\n const inverted = scale.invert(normalized);\n\n const fixDecimalsArithmetic = (snap(val + inverted).toFixed(4) * 1000) / 1000;\n\n return fixDecimalsArithmetic;\n};\n\n/**\n * Creates a Component that is draggable, within a bounded grid.\n * @param {*} opts\n */\nexport const gridDraggable = (opts) => (Comp) => {\n invariant(\n !!opts && isFunction(opts.fromDelta) && isFunction(opts.bounds) && isFunction(opts.anchorPoint),\n 'You must supply an object with: { anchorPoint: Function, fromDelta: Function, bounds: Function }',\n );\n return class GridDraggable extends React.Component {\n static propTypes = {\n disabled: PropTypes.bool,\n onDragStart: PropTypes.func,\n onDrag: PropTypes.func,\n onDragStop: PropTypes.func,\n onClick: PropTypes.func,\n onMove: PropTypes.func,\n graphProps: GraphPropsType.isRequired,\n };\n\n constructor(props) {\n super(props);\n this.state = {\n startX: null,\n startY: null,\n };\n }\n\n grid = () => {\n const { graphProps } = this.props;\n const { scale, domain, range } = graphProps;\n return {\n x: scale.x(domain.step) - scale.x(0),\n y: scale.y(range.step) - scale.y(0),\n };\n };\n onStart = (e) => {\n const { onDragStart } = this.props;\n if (document.activeElement) {\n document.activeElement.blur();\n }\n // reliably track whether any real drag movement occurred. This avoids the async-setState race condition\n // where onStop fires before setState has updated, causing drags to be misidentified as clicks.\n this._didDrag = false;\n this.setState({ startX: e.clientX, startY: e.clientY });\n if (onDragStart) {\n onDragStart();\n }\n };\n position = () => {\n const { x, y } = opts.anchorPoint(this.props);\n const { graphProps } = this.props;\n const { scale, snap } = graphProps;\n\n return {\n anchorPoint: {\n x,\n y,\n },\n x: deltaFn(scale.x, snap.x, x),\n y: deltaFn(scale.y, snap.y, y),\n };\n };\n\n tiny = (key, event) => {\n const K = key.toUpperCase();\n const end = event[`client${K}`];\n const start = this.state[`start${K}`];\n const delta = Math.abs(end - start);\n const out = delta < Math.abs(this.grid()[key]) / 10;\n log('[tiny] key: ', key, 'delta: ', delta, 'out: ', out);\n return out;\n };\n\n getScaledBounds = () => {\n const bounds = opts.bounds(this.props, this.props.graphProps);\n log('bounds: ', bounds);\n const grid = this.grid();\n\n let scaled = {\n left: bounds.left * grid.x,\n right: bounds.right * grid.x,\n top: bounds.top * grid.y,\n bottom: bounds.bottom * grid.y,\n };\n\n // Normalize Y bounds so that:\n // - top is <= 0 (negative or zero, allowing upward movement)\n // - bottom is >= 0 (positive or zero, allowing downward movement)\n // This compensates for the inverted Y scale (range.max -> 0, range.min -> size.height)\n // Add a small buffer (1 grid unit) to ensure we can reach exact boundaries\n const buffer = Math.abs(grid.y);\n scaled = {\n ...scaled,\n top: Math.min(0, scaled.top) - buffer, // More negative to allow reaching max\n bottom: Math.abs(scaled.bottom) + buffer, // More positive to allow reaching min\n };\n\n log('[getScaledBounds]: ', scaled);\n return scaled;\n };\n\n /**\n * Retrieves the coordinates of a mouse or touch event relative to an SVG element.\n * This method has been overwritten from the d3-selection library's clientPoint to handle touch events and improve clarity.\n * @param {Element} node - The SVG element.\n * @param {Event} event - The mouse or touch event.\n * @returns {Array} - An array containing the coordinates [x, y] relative to the SVG element.\n */\n getClientPoint = (node, event) => {\n if (!node || !event) {\n return null;\n }\n const svg = node.ownerSVGElement || node;\n\n if (svg && svg.createSVGPoint) {\n let point = svg.createSVGPoint();\n // Check if it's a touch event and use the first touch point\n if (event.touches && event.touches.length > 0) {\n const touch = event.touches[0];\n point.x = touch.clientX;\n point.y = touch.clientY;\n } else {\n // Fall back to mouse event properties\n point.x = event.clientX;\n point.y = event.clientY;\n }\n if (node.getScreenCTM) {\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n } else {\n return null;\n }\n }\n\n const rect = node.getBoundingClientRect();\n if (rect) {\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n } else {\n return null;\n }\n };\n\n skipDragOutsideOfBounds = (dd, e, graphProps) => {\n // Ignore drag movement outside of the domain and range.\n const rootNode = graphProps.getRootNode();\n const clientPoint = this.getClientPoint(rootNode, e);\n\n if (clientPoint === null) {\n return true; // Indicate that the drag is outside of bounds\n }\n\n const [rawX, rawY] = clientPoint;\n const { scale, domain, range } = graphProps;\n let x = scale.x.invert(rawX);\n let y = scale.y.invert(rawY);\n\n const xOutside = (dd.deltaX > 0 && x < domain.min) || (dd.deltaX < 0 && x > domain.max);\n const yOutside = (dd.deltaY > 0 && y > range.max) || (dd.deltaY < 0 && y < range.min);\n return xOutside || yOutside;\n };\n\n onDrag = (e, dd) => {\n const { onDrag, graphProps, disabled } = this.props;\n if (!onDrag || disabled) {\n return;\n }\n\n // Mark that a real drag occurred so onStop won't treat this as a click.\n // We check for non-trivial movement to avoid marking a click as a drag\n // due to sub-pixel jitter on mousedown.\n if (Math.abs(dd.deltaX) > 1 || Math.abs(dd.deltaY) > 1) {\n this._didDrag = true;\n }\n\n const bounds = this.getScaledBounds();\n\n if (dd.deltaX < 0 && dd.deltaX < bounds.left) {\n return;\n }\n\n if (dd.deltaX > 0 && dd.deltaX > bounds.right) {\n return;\n }\n\n if (dd.deltaY < 0 && dd.deltaY < bounds.top) {\n return;\n }\n\n if (dd.deltaY > 0 && dd.deltaY > bounds.bottom) {\n return;\n }\n\n if (this.skipDragOutsideOfBounds(dd, e, graphProps)) {\n return;\n }\n\n const dragArg = this.applyDelta({ x: dd.deltaX, y: dd.deltaY });\n\n if (dragArg !== undefined || dragArg !== null) {\n onDrag(dragArg);\n }\n };\n\n getDelta = (point) => {\n const pos = this.position();\n\n const p = {\n x: pos.x(point.x),\n y: pos.y(point.y),\n };\n\n return utils.getDelta(pos.anchorPoint, p);\n };\n\n applyDelta = (point) => {\n const delta = this.getDelta(point);\n log('[applyDelta] delta:', delta);\n return opts.fromDelta(this.props, delta);\n };\n\n onStop = (e, dd) => {\n log('[onStop] dd:', dd);\n const { onDragStop, onClick, disabled } = this.props;\n\n if (onDragStop && !disabled) {\n onDragStop();\n }\n\n log('[onStop] lastX/Y: ', dd.lastX, dd.lastY);\n const isClick = !this._didDrag;\n\n if (isClick) {\n // For non-disabled marks, stop propagation so the Bg d3 listener\n // doesn't also create a new mark on top of this one.\n // Disabled/background marks allow propagation so Bg can handle the click.\n if (!disabled) {\n e.stopPropagation();\n }\n\n if (onClick) {\n log('call onClick');\n this.setState({ startX: null });\n const { graphProps } = this.props;\n const { scale, snap } = graphProps;\n const [rawX, rawY] = pointer(e, e.target);\n let x = scale.x.invert(rawX);\n let y = scale.y.invert(rawY);\n x = snap.x(x);\n y = snap.y(y);\n onClick({ x, y });\n return false;\n }\n }\n\n this.setState({ startX: null, startY: null });\n // return false to prevent state updates in the underlying draggable - a move will have triggered an update already.\n return false;\n };\n\n render() {\n // we extract onClick here to prevent it from being passed to the DraggableCore\n // and to prevent it from being included in the ...rest that gets passed to the Comp\n // because otherwise it is called on every drag event\n // eslint-disable-next-line no-unused-vars\n const { disabled, onClick, ...rest } = this.props;\n const grid = this.grid();\n\n // prevent the text select icon from rendering.\n const onMouseDown = (e) => e.nativeEvent.preventDefault();\n\n /**\n * TODO: This shouldnt be necessary, we should be able to use the r-d classnames.\n * But they aren't being unset. If we continue with this lib, we'll have to fix this.\n */\n const isDragging = this.state ? !!this.state.startX : false;\n\n return (\n <DraggableCore\n onMouseDown={onMouseDown}\n onStart={this.onStart}\n onDrag={this.onDrag}\n onStop={this.onStop}\n axis={opts.axis || 'both'}\n grid={[grid.x, grid.y]}\n >\n <Comp {...rest} disabled={disabled} isDragging={isDragging} />\n </DraggableCore>\n );\n }\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"grid-draggable.js","names":["_react","_interopRequireDefault","require","_propTypes","_types","_draggable","_debug","utils","_interopRequireWildcard","_lodashEs","_invariant","_d3Selection","_excluded","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","Boolean","prototype","valueOf","log","debug","deltaFn","exports","scale","snap","val","delta","normalized","inverted","invert","fixDecimalsArithmetic","toFixed","gridDraggable","opts","Comp","_GridDraggable","invariant","isFunction","fromDelta","bounds","anchorPoint","_React$Component","GridDraggable","props","_this","_classCallCheck2","graphProps","domain","range","x","step","y","onDragStart","document","activeElement","blur","_didDrag","setState","startX","clientX","startY","clientY","target","onNativeClick","clickEvent","removeEventListener","stopPropagation","preventDefault","addEventListener","_opts$anchorPoint","key","event","K","toUpperCase","end","concat","start","state","Math","abs","out","grid","scaled","left","right","top","bottom","buffer","min","node","svg","ownerSVGElement","createSVGPoint","point","touches","touch","getScreenCTM","matrixTransform","inverse","rect","getBoundingClientRect","clientLeft","clientTop","dd","rootNode","getRootNode","clientPoint","getClientPoint","_clientPoint","_slicedToArray2","rawX","rawY","xOutside","deltaX","max","yOutside","deltaY","_this$props","onDrag","disabled","getScaledBounds","skipDragOutsideOfBounds","dragArg","applyDelta","undefined","pos","position","p","getDelta","_this$props2","onDragStop","onClick","lastX","lastY","isClick","_pointer","pointer","_pointer2","_","_inherits2","_createClass2","value","render","_this$props3","rest","_objectWithoutProperties2","onMouseDown","nativeEvent","isDragging","createElement","DraggableCore","onStart","onStop","axis","_extends2","React","Component","PropTypes","bool","func","onMove","GraphPropsType","isRequired"],"sources":["../src/grid-draggable.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { GraphPropsType } from './types';\nimport { DraggableCore } from './draggable';\nimport debug from 'debug';\nimport * as utils from './utils';\nimport { isFunction } from 'lodash-es';\nimport invariant from 'invariant';\nimport { pointer } from 'd3-selection';\n\nconst log = debug('pie-lib:plot:grid-draggable');\n\nexport const deltaFn = (scale, snap, val) => (delta) => {\n const normalized = delta + scale(0);\n const inverted = scale.invert(normalized);\n\n const fixDecimalsArithmetic = (snap(val + inverted).toFixed(4) * 1000) / 1000;\n\n return fixDecimalsArithmetic;\n};\n\n/**\n * Creates a Component that is draggable, within a bounded grid.\n * @param {*} opts\n */\nexport const gridDraggable = (opts) => (Comp) => {\n invariant(\n !!opts && isFunction(opts.fromDelta) && isFunction(opts.bounds) && isFunction(opts.anchorPoint),\n 'You must supply an object with: { anchorPoint: Function, fromDelta: Function, bounds: Function }',\n );\n return class GridDraggable extends React.Component {\n static propTypes = {\n disabled: PropTypes.bool,\n onDragStart: PropTypes.func,\n onDrag: PropTypes.func,\n onDragStop: PropTypes.func,\n onClick: PropTypes.func,\n onMove: PropTypes.func,\n graphProps: GraphPropsType.isRequired,\n };\n\n constructor(props) {\n super(props);\n this.state = {\n startX: null,\n startY: null,\n };\n }\n\n grid = () => {\n const { graphProps } = this.props;\n const { scale, domain, range } = graphProps;\n return {\n x: scale.x(domain.step) - scale.x(0),\n y: scale.y(range.step) - scale.y(0),\n };\n };\n onStart = (e) => {\n const { onDragStart } = this.props;\n if (document.activeElement) {\n document.activeElement.blur();\n }\n this._didDrag = false;\n this.setState({ startX: e.clientX, startY: e.clientY });\n\n // Intercept the native 'click' event that the browser fires after mouseup.\n // We use a one-time capture-phase listener so we can suppress it when a\n // real drag occurred, preventing Bg's d3 click listener from creating a new mark.\n const target = e.target;\n const onNativeClick = (clickEvent) => {\n target.removeEventListener('click', onNativeClick, true);\n if (this._didDrag) {\n clickEvent.stopPropagation();\n clickEvent.preventDefault();\n }\n };\n target.addEventListener('click', onNativeClick, true);\n\n if (onDragStart) {\n onDragStart();\n }\n };\n position = () => {\n const { x, y } = opts.anchorPoint(this.props);\n const { graphProps } = this.props;\n const { scale, snap } = graphProps;\n\n return {\n anchorPoint: {\n x,\n y,\n },\n x: deltaFn(scale.x, snap.x, x),\n y: deltaFn(scale.y, snap.y, y),\n };\n };\n\n tiny = (key, event) => {\n const K = key.toUpperCase();\n const end = event[`client${K}`];\n const start = this.state[`start${K}`];\n const delta = Math.abs(end - start);\n const out = delta < Math.abs(this.grid()[key]) / 10;\n log('[tiny] key: ', key, 'delta: ', delta, 'out: ', out);\n return out;\n };\n\n getScaledBounds = () => {\n const bounds = opts.bounds(this.props, this.props.graphProps);\n log('bounds: ', bounds);\n const grid = this.grid();\n\n let scaled = {\n left: bounds.left * grid.x,\n right: bounds.right * grid.x,\n top: bounds.top * grid.y,\n bottom: bounds.bottom * grid.y,\n };\n\n // Normalize Y bounds so that:\n // - top is <= 0 (negative or zero, allowing upward movement)\n // - bottom is >= 0 (positive or zero, allowing downward movement)\n // This compensates for the inverted Y scale (range.max -> 0, range.min -> size.height)\n // Add a small buffer (1 grid unit) to ensure we can reach exact boundaries\n const buffer = Math.abs(grid.y);\n scaled = {\n ...scaled,\n top: Math.min(0, scaled.top) - buffer, // More negative to allow reaching max\n bottom: Math.abs(scaled.bottom) + buffer, // More positive to allow reaching min\n };\n\n log('[getScaledBounds]: ', scaled);\n return scaled;\n };\n\n /**\n * Retrieves the coordinates of a mouse or touch event relative to an SVG element.\n * This method has been overwritten from the d3-selection library's clientPoint to handle touch events and improve clarity.\n * @param {Element} node - The SVG element.\n * @param {Event} event - The mouse or touch event.\n * @returns {Array} - An array containing the coordinates [x, y] relative to the SVG element.\n */\n getClientPoint = (node, event) => {\n if (!node || !event) {\n return null;\n }\n const svg = node.ownerSVGElement || node;\n\n if (svg && svg.createSVGPoint) {\n let point = svg.createSVGPoint();\n // Check if it's a touch event and use the first touch point\n if (event.touches && event.touches.length > 0) {\n const touch = event.touches[0];\n point.x = touch.clientX;\n point.y = touch.clientY;\n } else {\n // Fall back to mouse event properties\n point.x = event.clientX;\n point.y = event.clientY;\n }\n if (node.getScreenCTM) {\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n } else {\n return null;\n }\n }\n\n const rect = node.getBoundingClientRect();\n if (rect) {\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n } else {\n return null;\n }\n };\n\n skipDragOutsideOfBounds = (dd, e, graphProps) => {\n // Ignore drag movement outside of the domain and range.\n const rootNode = graphProps.getRootNode();\n const clientPoint = this.getClientPoint(rootNode, e);\n\n if (clientPoint === null) {\n return true; // Indicate that the drag is outside of bounds\n }\n\n const [rawX, rawY] = clientPoint;\n const { scale, domain, range } = graphProps;\n let x = scale.x.invert(rawX);\n let y = scale.y.invert(rawY);\n\n const xOutside = (dd.deltaX > 0 && x < domain.min) || (dd.deltaX < 0 && x > domain.max);\n const yOutside = (dd.deltaY > 0 && y > range.max) || (dd.deltaY < 0 && y < range.min);\n return xOutside || yOutside;\n };\n\n onDrag = (e, dd) => {\n const { onDrag, graphProps, disabled } = this.props;\n\n // Track drag movement BEFORE any early returns so that onStop always\n // knows a real drag occurred, even when onDrag prop is absent or disabled.\n if (Math.abs(dd.deltaX) > 1 || Math.abs(dd.deltaY) > 1) {\n this._didDrag = true;\n }\n\n if (!onDrag || disabled) {\n return;\n }\n\n const bounds = this.getScaledBounds();\n\n if (dd.deltaX < 0 && dd.deltaX < bounds.left) {\n return;\n }\n\n if (dd.deltaX > 0 && dd.deltaX > bounds.right) {\n return;\n }\n\n if (dd.deltaY < 0 && dd.deltaY < bounds.top) {\n return;\n }\n\n if (dd.deltaY > 0 && dd.deltaY > bounds.bottom) {\n return;\n }\n\n if (this.skipDragOutsideOfBounds(dd, e, graphProps)) {\n return;\n }\n\n const dragArg = this.applyDelta({ x: dd.deltaX, y: dd.deltaY });\n\n if (dragArg !== undefined || dragArg !== null) {\n onDrag(dragArg);\n }\n };\n\n getDelta = (point) => {\n const pos = this.position();\n\n const p = {\n x: pos.x(point.x),\n y: pos.y(point.y),\n };\n\n return utils.getDelta(pos.anchorPoint, p);\n };\n\n applyDelta = (point) => {\n const delta = this.getDelta(point);\n log('[applyDelta] delta:', delta);\n return opts.fromDelta(this.props, delta);\n };\n\n onStop = (e, dd) => {\n log('[onStop] dd:', dd);\n const { onDragStop, onClick, disabled } = this.props;\n\n if (onDragStop && !disabled) {\n onDragStop();\n }\n\n log('[onStop] lastX/Y: ', dd.lastX, dd.lastY);\n const isClick = !this._didDrag;\n\n if (isClick) {\n // For non-disabled marks, stop propagation so the Bg d3 listener\n // doesn't also create a new mark on top of this one.\n // Disabled/background marks allow propagation so Bg can handle the click.\n if (!disabled && typeof e?.stopPropagation === 'function') {\n e.stopPropagation();\n }\n\n if (onClick) {\n log('call onClick');\n this.setState({ startX: null, startY: null });\n const { graphProps } = this.props;\n const { scale, snap } = graphProps;\n try {\n const [rawX, rawY] = pointer(e, e.target);\n let x = scale.x.invert(rawX);\n let y = scale.y.invert(rawY);\n x = snap.x(x);\n y = snap.y(y);\n onClick({ x, y });\n } catch (_) {\n // pointer() can fail on SVG elements (e.g. <circle>) that lack a valid\n // coordinate transform. Label-mode callbacks use props data, not coords.\n onClick({});\n }\n }\n\n return false;\n }\n\n this.setState({ startX: null, startY: null });\n // return false to prevent state updates in the underlying draggable - a move will have triggered an update already.\n return false;\n };\n\n render() {\n // we extract onClick here to prevent it from being passed to the DraggableCore\n // and to prevent it from being included in the ...rest that gets passed to the Comp\n // because otherwise it is called on every drag event\n // eslint-disable-next-line no-unused-vars\n const { disabled, onClick, ...rest } = this.props;\n const grid = this.grid();\n\n // prevent the text select icon from rendering.\n const onMouseDown = (e) => e.nativeEvent.preventDefault();\n\n /**\n * TODO: This shouldnt be necessary, we should be able to use the r-d classnames.\n * But they aren't being unset. If we continue with this lib, we'll have to fix this.\n */\n const isDragging = this.state ? !!this.state.startX : false;\n\n return (\n <DraggableCore\n onMouseDown={onMouseDown}\n onStart={this.onStart}\n onDrag={this.onDrag}\n onStop={this.onStop}\n axis={opts.axis || 'both'}\n grid={[grid.x, grid.y]}\n >\n <Comp {...rest} disabled={disabled} isDragging={isDragging} onClick={isDragging ? undefined : onClick} />\n </DraggableCore>\n );\n }\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "3.2.0-next.
|
|
6
|
+
"version": "3.2.0-next.38",
|
|
7
7
|
"description": "Some underlying components for building charts/graphs",
|
|
8
8
|
"keywords": [
|
|
9
9
|
"react",
|
|
@@ -38,6 +38,6 @@
|
|
|
38
38
|
"peerDependencies": {
|
|
39
39
|
"react": "^18.2.0"
|
|
40
40
|
},
|
|
41
|
-
"gitHead": "
|
|
41
|
+
"gitHead": "2f2fd135f9d1977d9634efb78cecd279cdfb4c85",
|
|
42
42
|
"scripts": {}
|
|
43
43
|
}
|
|
@@ -17,6 +17,14 @@ jest.mock('../draggable', () => ({
|
|
|
17
17
|
},
|
|
18
18
|
}));
|
|
19
19
|
|
|
20
|
+
// Reusable mock start event with a target that supports addEventListener/removeEventListener
|
|
21
|
+
const mockStartEvent = (overrides = {}) => ({
|
|
22
|
+
clientX: 0,
|
|
23
|
+
clientY: 0,
|
|
24
|
+
target: { addEventListener: jest.fn(), removeEventListener: jest.fn() },
|
|
25
|
+
...overrides,
|
|
26
|
+
});
|
|
27
|
+
|
|
20
28
|
jest.mock('../utils', () => ({
|
|
21
29
|
getDelta: jest.fn(),
|
|
22
30
|
}));
|
|
@@ -141,7 +149,7 @@ describe('gridDraggable', () => {
|
|
|
141
149
|
render(<Comp {...props} />);
|
|
142
150
|
|
|
143
151
|
// Simulate drag start
|
|
144
|
-
mockDraggableCoreProps.onStart({ clientX: 100, clientY: 100 });
|
|
152
|
+
mockDraggableCoreProps.onStart(mockStartEvent({ clientX: 100, clientY: 100 }));
|
|
145
153
|
|
|
146
154
|
expect(onDragStart).toHaveBeenCalled();
|
|
147
155
|
});
|
|
@@ -159,7 +167,7 @@ describe('gridDraggable', () => {
|
|
|
159
167
|
render(<Comp {...props} />);
|
|
160
168
|
|
|
161
169
|
// Set up drag start state
|
|
162
|
-
mockDraggableCoreProps.onStart(
|
|
170
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
163
171
|
|
|
164
172
|
// Simulate drag
|
|
165
173
|
mockDraggableCoreProps.onDrag({}, { deltaX: 10, deltaY: 10 });
|
|
@@ -174,7 +182,7 @@ describe('gridDraggable', () => {
|
|
|
174
182
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
175
183
|
render(<Comp {...defaultProps} />);
|
|
176
184
|
|
|
177
|
-
mockDraggableCoreProps.onStart(
|
|
185
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
178
186
|
mockDraggableCoreProps.onDrag({}, { deltaX: 10, deltaY: 10 });
|
|
179
187
|
|
|
180
188
|
expect(fromDelta).not.toHaveBeenCalled();
|
|
@@ -191,7 +199,7 @@ describe('gridDraggable', () => {
|
|
|
191
199
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
192
200
|
render(<Comp {...props} />);
|
|
193
201
|
|
|
194
|
-
mockDraggableCoreProps.onStart(
|
|
202
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
195
203
|
// deltaX < 0 and deltaX < scaled bounds.left (0), so -10 < 0 triggers early return
|
|
196
204
|
mockDraggableCoreProps.onDrag({}, { deltaX: -10, deltaY: 0 });
|
|
197
205
|
|
|
@@ -208,7 +216,7 @@ describe('gridDraggable', () => {
|
|
|
208
216
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
209
217
|
render(<Comp {...props} />);
|
|
210
218
|
|
|
211
|
-
mockDraggableCoreProps.onStart(
|
|
219
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
212
220
|
// deltaX > 0 and deltaX > scaled bounds.right (0), so 10 > 0 triggers early return
|
|
213
221
|
mockDraggableCoreProps.onDrag({}, { deltaX: 10, deltaY: 0 });
|
|
214
222
|
|
|
@@ -225,7 +233,7 @@ describe('gridDraggable', () => {
|
|
|
225
233
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
226
234
|
render(<Comp {...props} />);
|
|
227
235
|
|
|
228
|
-
mockDraggableCoreProps.onStart(
|
|
236
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
229
237
|
// deltaY < 0 and deltaY < scaled bounds.top (0), so -10 < 0 triggers early return
|
|
230
238
|
mockDraggableCoreProps.onDrag({}, { deltaX: 0, deltaY: -10 });
|
|
231
239
|
|
|
@@ -242,7 +250,7 @@ describe('gridDraggable', () => {
|
|
|
242
250
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
243
251
|
render(<Comp {...props} />);
|
|
244
252
|
|
|
245
|
-
mockDraggableCoreProps.onStart(
|
|
253
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
246
254
|
// deltaY > 0 and deltaY > scaled bounds.bottom (0), so 10 > 0 triggers early return
|
|
247
255
|
mockDraggableCoreProps.onDrag({}, { deltaX: 0, deltaY: 10 });
|
|
248
256
|
|
|
@@ -259,7 +267,7 @@ describe('gridDraggable', () => {
|
|
|
259
267
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
260
268
|
render(<Comp {...props} />);
|
|
261
269
|
|
|
262
|
-
mockDraggableCoreProps.onStart(
|
|
270
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
263
271
|
// All bound checks pass: deltaX (-10) is NOT < bounds.left (-100) and NOT > bounds.right (100)
|
|
264
272
|
// Similarly for deltaY
|
|
265
273
|
mockDraggableCoreProps.onDrag({}, { deltaX: -10, deltaY: 10 });
|
|
@@ -285,7 +293,7 @@ describe('gridDraggable', () => {
|
|
|
285
293
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
286
294
|
render(<Comp {...props} />);
|
|
287
295
|
|
|
288
|
-
mockDraggableCoreProps.onStart(
|
|
296
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
289
297
|
mockDraggableCoreProps.onDrag({}, { deltaX: 1, deltaY: 0 });
|
|
290
298
|
|
|
291
299
|
expect(onDrag).not.toHaveBeenCalled();
|
|
@@ -307,7 +315,7 @@ describe('gridDraggable', () => {
|
|
|
307
315
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
308
316
|
render(<Comp {...props} />);
|
|
309
317
|
|
|
310
|
-
mockDraggableCoreProps.onStart(
|
|
318
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
311
319
|
mockDraggableCoreProps.onDrag({}, { deltaX: -1, deltaY: 0 });
|
|
312
320
|
|
|
313
321
|
expect(onDrag).not.toHaveBeenCalled();
|
|
@@ -329,7 +337,7 @@ describe('gridDraggable', () => {
|
|
|
329
337
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
330
338
|
render(<Comp {...props} />);
|
|
331
339
|
|
|
332
|
-
mockDraggableCoreProps.onStart(
|
|
340
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
333
341
|
mockDraggableCoreProps.onDrag({}, { deltaX: 0, deltaY: 1 });
|
|
334
342
|
|
|
335
343
|
expect(onDrag).not.toHaveBeenCalled();
|
|
@@ -351,7 +359,7 @@ describe('gridDraggable', () => {
|
|
|
351
359
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
352
360
|
render(<Comp {...props} />);
|
|
353
361
|
|
|
354
|
-
mockDraggableCoreProps.onStart(
|
|
362
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
355
363
|
mockDraggableCoreProps.onDrag({}, { deltaX: 0, deltaY: -1 });
|
|
356
364
|
|
|
357
365
|
expect(onDrag).not.toHaveBeenCalled();
|
|
@@ -374,7 +382,7 @@ describe('gridDraggable', () => {
|
|
|
374
382
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
375
383
|
render(<Comp {...props} />);
|
|
376
384
|
|
|
377
|
-
mockDraggableCoreProps.onStart(
|
|
385
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
378
386
|
mockDraggableCoreProps.onDrag({}, { deltaX: 1, deltaY: -1 });
|
|
379
387
|
|
|
380
388
|
expect(onDrag).toHaveBeenCalled();
|
|
@@ -393,7 +401,7 @@ describe('gridDraggable', () => {
|
|
|
393
401
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
394
402
|
render(<Comp {...props} />);
|
|
395
403
|
|
|
396
|
-
mockDraggableCoreProps.onStart(
|
|
404
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
397
405
|
mockDraggableCoreProps.onDrag({}, { deltaX: 10, deltaY: 10 });
|
|
398
406
|
|
|
399
407
|
expect(getDelta).toHaveBeenCalled();
|
|
@@ -409,7 +417,7 @@ describe('gridDraggable', () => {
|
|
|
409
417
|
const Comp = gridDraggable(options)(() => <div>Test</div>);
|
|
410
418
|
render(<Comp {...props} />);
|
|
411
419
|
|
|
412
|
-
mockDraggableCoreProps.onStart(
|
|
420
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
413
421
|
mockDraggableCoreProps.onDrag({}, { deltaX: 10, deltaY: 10 });
|
|
414
422
|
|
|
415
423
|
expect(fromDelta).toHaveBeenCalled();
|
|
@@ -425,7 +433,7 @@ describe('gridDraggable', () => {
|
|
|
425
433
|
render(<Comp {...props} />);
|
|
426
434
|
|
|
427
435
|
// Start to set up state
|
|
428
|
-
mockDraggableCoreProps.onStart(
|
|
436
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
429
437
|
|
|
430
438
|
// Stop with large movement (not tiny)
|
|
431
439
|
mockDraggableCoreProps.onStop({ clientX: 100, clientY: 100, stopPropagation: jest.fn() }, {});
|
|
@@ -445,7 +453,7 @@ describe('gridDraggable', () => {
|
|
|
445
453
|
|
|
446
454
|
// Start and stop at almost the same position (tiny movement)
|
|
447
455
|
// Grid is 1x1, tiny threshold is grid/10 = 0.1
|
|
448
|
-
mockDraggableCoreProps.onStart(
|
|
456
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
449
457
|
mockDraggableCoreProps.onStop({ clientX: 0.05, clientY: 0.05, target: {}, stopPropagation: jest.fn() }, {});
|
|
450
458
|
|
|
451
459
|
expect(onClick).toHaveBeenCalledWith({ x: 0, y: 0 });
|
|
@@ -467,7 +475,7 @@ describe('gridDraggable', () => {
|
|
|
467
475
|
render(<Comp {...propsWithGraphProps} />);
|
|
468
476
|
|
|
469
477
|
// Start and stop at almost the same position (tiny movement)
|
|
470
|
-
mockDraggableCoreProps.onStart(
|
|
478
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
471
479
|
mockDraggableCoreProps.onStop({ clientX: 0.05, clientY: 0.05, target: {}, stopPropagation: jest.fn() }, {});
|
|
472
480
|
|
|
473
481
|
expect(graphProps.snap.x).toHaveBeenCalledWith(1.7);
|
package/src/grid-draggable.jsx
CHANGED
|
@@ -60,10 +60,22 @@ export const gridDraggable = (opts) => (Comp) => {
|
|
|
60
60
|
if (document.activeElement) {
|
|
61
61
|
document.activeElement.blur();
|
|
62
62
|
}
|
|
63
|
-
// reliably track whether any real drag movement occurred. This avoids the async-setState race condition
|
|
64
|
-
// where onStop fires before setState has updated, causing drags to be misidentified as clicks.
|
|
65
63
|
this._didDrag = false;
|
|
66
64
|
this.setState({ startX: e.clientX, startY: e.clientY });
|
|
65
|
+
|
|
66
|
+
// Intercept the native 'click' event that the browser fires after mouseup.
|
|
67
|
+
// We use a one-time capture-phase listener so we can suppress it when a
|
|
68
|
+
// real drag occurred, preventing Bg's d3 click listener from creating a new mark.
|
|
69
|
+
const target = e.target;
|
|
70
|
+
const onNativeClick = (clickEvent) => {
|
|
71
|
+
target.removeEventListener('click', onNativeClick, true);
|
|
72
|
+
if (this._didDrag) {
|
|
73
|
+
clickEvent.stopPropagation();
|
|
74
|
+
clickEvent.preventDefault();
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
target.addEventListener('click', onNativeClick, true);
|
|
78
|
+
|
|
67
79
|
if (onDragStart) {
|
|
68
80
|
onDragStart();
|
|
69
81
|
}
|
|
@@ -183,17 +195,17 @@ export const gridDraggable = (opts) => (Comp) => {
|
|
|
183
195
|
|
|
184
196
|
onDrag = (e, dd) => {
|
|
185
197
|
const { onDrag, graphProps, disabled } = this.props;
|
|
186
|
-
if (!onDrag || disabled) {
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
198
|
|
|
190
|
-
//
|
|
191
|
-
//
|
|
192
|
-
// due to sub-pixel jitter on mousedown.
|
|
199
|
+
// Track drag movement BEFORE any early returns so that onStop always
|
|
200
|
+
// knows a real drag occurred, even when onDrag prop is absent or disabled.
|
|
193
201
|
if (Math.abs(dd.deltaX) > 1 || Math.abs(dd.deltaY) > 1) {
|
|
194
202
|
this._didDrag = true;
|
|
195
203
|
}
|
|
196
204
|
|
|
205
|
+
if (!onDrag || disabled) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
|
|
197
209
|
const bounds = this.getScaledBounds();
|
|
198
210
|
|
|
199
211
|
if (dd.deltaX < 0 && dd.deltaX < bounds.left) {
|
|
@@ -255,23 +267,30 @@ export const gridDraggable = (opts) => (Comp) => {
|
|
|
255
267
|
// For non-disabled marks, stop propagation so the Bg d3 listener
|
|
256
268
|
// doesn't also create a new mark on top of this one.
|
|
257
269
|
// Disabled/background marks allow propagation so Bg can handle the click.
|
|
258
|
-
if (!disabled) {
|
|
270
|
+
if (!disabled && typeof e?.stopPropagation === 'function') {
|
|
259
271
|
e.stopPropagation();
|
|
260
272
|
}
|
|
261
273
|
|
|
262
274
|
if (onClick) {
|
|
263
275
|
log('call onClick');
|
|
264
|
-
this.setState({ startX: null });
|
|
276
|
+
this.setState({ startX: null, startY: null });
|
|
265
277
|
const { graphProps } = this.props;
|
|
266
278
|
const { scale, snap } = graphProps;
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
279
|
+
try {
|
|
280
|
+
const [rawX, rawY] = pointer(e, e.target);
|
|
281
|
+
let x = scale.x.invert(rawX);
|
|
282
|
+
let y = scale.y.invert(rawY);
|
|
283
|
+
x = snap.x(x);
|
|
284
|
+
y = snap.y(y);
|
|
285
|
+
onClick({ x, y });
|
|
286
|
+
} catch (_) {
|
|
287
|
+
// pointer() can fail on SVG elements (e.g. <circle>) that lack a valid
|
|
288
|
+
// coordinate transform. Label-mode callbacks use props data, not coords.
|
|
289
|
+
onClick({});
|
|
290
|
+
}
|
|
274
291
|
}
|
|
292
|
+
|
|
293
|
+
return false;
|
|
275
294
|
}
|
|
276
295
|
|
|
277
296
|
this.setState({ startX: null, startY: null });
|
|
@@ -305,7 +324,7 @@ export const gridDraggable = (opts) => (Comp) => {
|
|
|
305
324
|
axis={opts.axis || 'both'}
|
|
306
325
|
grid={[grid.x, grid.y]}
|
|
307
326
|
>
|
|
308
|
-
<Comp {...rest} disabled={disabled} isDragging={isDragging} />
|
|
327
|
+
<Comp {...rest} disabled={disabled} isDragging={isDragging} onClick={isDragging ? undefined : onClick} />
|
|
309
328
|
</DraggableCore>
|
|
310
329
|
);
|
|
311
330
|
}
|