@pie-lib/plot 3.2.0-next.36 → 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 +14 -0
- package/lib/grid-draggable.js +58 -32
- package/lib/grid-draggable.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/grid-draggable.test.jsx +29 -21
- package/src/grid-draggable.jsx +51 -27
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,20 @@
|
|
|
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
|
+
|
|
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)
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
- add stopPropagation to onStop calls in gridDraggable tests ([6049268](https://github.com/pie-framework/pie-lib/commit/6049268d91b0498285df1ac3ad628f45f328be93))
|
|
18
|
+
- ensure onClick is called for existing mark points/lines and does not interfere with drag PIE-426 PIE-427 ([1cb4f00](https://github.com/pie-framework/pie-lib/commit/1cb4f00118ff24ddffe4c1ee2a091daccafa4d15))
|
|
19
|
+
|
|
6
20
|
# [3.2.0-next.36](https://github.com/pie-framework/pie-lib/compare/@pie-lib/plot@3.2.0-next.35...@pie-lib/plot@3.2.0-next.36) (2026-04-23)
|
|
7
21
|
|
|
8
22
|
### Bug Fixes
|
package/lib/grid-draggable.js
CHANGED
|
@@ -24,7 +24,7 @@ var utils = _interopRequireWildcard(require("./utils"));
|
|
|
24
24
|
var _lodashEs = require("lodash-es");
|
|
25
25
|
var _invariant = _interopRequireDefault(require("invariant"));
|
|
26
26
|
var _d3Selection = require("d3-selection");
|
|
27
|
-
var _excluded = ["disabled"];
|
|
27
|
+
var _excluded = ["disabled", "onClick"];
|
|
28
28
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
29
29
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
30
30
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
@@ -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
|
}
|
|
@@ -189,17 +200,17 @@ var gridDraggable = exports.gridDraggable = function gridDraggable(opts) {
|
|
|
189
200
|
(0, _defineProperty2["default"])(_this, "onDrag", function (e, dd) {
|
|
190
201
|
var _this$props = _this.props,
|
|
191
202
|
onDrag = _this$props.onDrag,
|
|
192
|
-
graphProps = _this$props.graphProps
|
|
193
|
-
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
203
|
+
graphProps = _this$props.graphProps,
|
|
204
|
+
disabled = _this$props.disabled;
|
|
196
205
|
|
|
197
|
-
//
|
|
198
|
-
//
|
|
199
|
-
// 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.
|
|
200
208
|
if (Math.abs(dd.deltaX) > 1 || Math.abs(dd.deltaY) > 1) {
|
|
201
209
|
_this._didDrag = true;
|
|
202
210
|
}
|
|
211
|
+
if (!onDrag || disabled) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
203
214
|
var bounds = _this.getScaledBounds();
|
|
204
215
|
if (dd.deltaX < 0 && dd.deltaX < bounds.left) {
|
|
205
216
|
return;
|
|
@@ -241,39 +252,49 @@ var gridDraggable = exports.gridDraggable = function gridDraggable(opts) {
|
|
|
241
252
|
log('[onStop] dd:', dd);
|
|
242
253
|
var _this$props2 = _this.props,
|
|
243
254
|
onDragStop = _this$props2.onDragStop,
|
|
244
|
-
onClick = _this$props2.onClick
|
|
245
|
-
|
|
255
|
+
onClick = _this$props2.onClick,
|
|
256
|
+
disabled = _this$props2.disabled;
|
|
257
|
+
if (onDragStop && !disabled) {
|
|
246
258
|
onDragStop();
|
|
247
259
|
}
|
|
248
260
|
log('[onStop] lastX/Y: ', dd.lastX, dd.lastY);
|
|
249
|
-
// Use the synchronous _didDrag flag instead of comparing clientX/clientY via tiny().
|
|
250
|
-
// tiny() was unreliable because setState is async – startX/startY might not reflect
|
|
251
|
-
// the actual mousedown position when onStop fires. _didDrag is set synchronously in
|
|
252
|
-
// onStart (false) and onDrag (true), so it's always accurate.
|
|
253
261
|
var isClick = !_this._didDrag;
|
|
254
262
|
if (isClick) {
|
|
263
|
+
// For non-disabled marks, stop propagation so the Bg d3 listener
|
|
264
|
+
// doesn't also create a new mark on top of this one.
|
|
265
|
+
// Disabled/background marks allow propagation so Bg can handle the click.
|
|
266
|
+
if (!disabled && typeof (e === null || e === void 0 ? void 0 : e.stopPropagation) === 'function') {
|
|
267
|
+
e.stopPropagation();
|
|
268
|
+
}
|
|
255
269
|
if (onClick) {
|
|
256
270
|
log('call onClick');
|
|
257
271
|
_this.setState({
|
|
258
|
-
startX: null
|
|
272
|
+
startX: null,
|
|
273
|
+
startY: null
|
|
259
274
|
});
|
|
260
275
|
var graphProps = _this.props.graphProps;
|
|
261
276
|
var scale = graphProps.scale,
|
|
262
277
|
snap = graphProps.snap;
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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
|
+
}
|
|
276
296
|
}
|
|
297
|
+
return false;
|
|
277
298
|
}
|
|
278
299
|
_this.setState({
|
|
279
300
|
startX: null,
|
|
@@ -292,8 +313,13 @@ var gridDraggable = exports.gridDraggable = function gridDraggable(opts) {
|
|
|
292
313
|
return (0, _createClass2["default"])(GridDraggable, [{
|
|
293
314
|
key: "render",
|
|
294
315
|
value: function render() {
|
|
316
|
+
// we extract onClick here to prevent it from being passed to the DraggableCore
|
|
317
|
+
// and to prevent it from being included in the ...rest that gets passed to the Comp
|
|
318
|
+
// because otherwise it is called on every drag event
|
|
319
|
+
// eslint-disable-next-line no-unused-vars
|
|
295
320
|
var _this$props3 = this.props,
|
|
296
321
|
disabled = _this$props3.disabled,
|
|
322
|
+
onClick = _this$props3.onClick,
|
|
297
323
|
rest = (0, _objectWithoutProperties2["default"])(_this$props3, _excluded);
|
|
298
324
|
var grid = this.grid();
|
|
299
325
|
|
|
@@ -308,7 +334,6 @@ var gridDraggable = exports.gridDraggable = function gridDraggable(opts) {
|
|
|
308
334
|
*/
|
|
309
335
|
var isDragging = this.state ? !!this.state.startX : false;
|
|
310
336
|
return /*#__PURE__*/_react["default"].createElement(_draggable.DraggableCore, {
|
|
311
|
-
disabled: disabled,
|
|
312
337
|
onMouseDown: onMouseDown,
|
|
313
338
|
onStart: this.onStart,
|
|
314
339
|
onDrag: this.onDrag,
|
|
@@ -317,7 +342,8 @@ var gridDraggable = exports.gridDraggable = function gridDraggable(opts) {
|
|
|
317
342
|
grid: [grid.x, grid.y]
|
|
318
343
|
}, /*#__PURE__*/_react["default"].createElement(Comp, (0, _extends2["default"])({}, rest, {
|
|
319
344
|
disabled: disabled,
|
|
320
|
-
isDragging: isDragging
|
|
345
|
+
isDragging: isDragging,
|
|
346
|
+
onClick: isDragging ? undefined : onClick
|
|
321
347
|
})));
|
|
322
348
|
}
|
|
323
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","getScaledBounds","skipDragOutsideOfBounds","dragArg","applyDelta","undefined","pos","position","p","getDelta","_this$props2","onDragStop","onClick","lastX","lastY","isClick","_pointer","pointer","target","_pointer2","_inherits2","_createClass2","value","render","_this$props3","disabled","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 } = this.props;\n\n if (!onDrag) {\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 } = this.props;\n\n if (onDragStop) {\n onDragStop();\n }\n\n log('[onStop] lastX/Y: ', dd.lastX, dd.lastY);\n // Use the synchronous _didDrag flag instead of comparing clientX/clientY via tiny().\n // tiny() was unreliable because setState is async – startX/startY might not reflect\n // the actual mousedown position when onStop fires. _didDrag is set synchronously in\n // onStart (false) and onDrag (true), so it's always accurate.\n const isClick = !this._didDrag;\n\n if (isClick) {\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 const { disabled, ...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 disabled={disabled}\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,10 +433,10 @@ 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
|
-
mockDraggableCoreProps.onStop({ clientX: 100, clientY: 100 }, {});
|
|
439
|
+
mockDraggableCoreProps.onStop({ clientX: 100, clientY: 100, stopPropagation: jest.fn() }, {});
|
|
432
440
|
|
|
433
441
|
expect(onDragStop).toHaveBeenCalled();
|
|
434
442
|
});
|
|
@@ -445,8 +453,8 @@ 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(
|
|
449
|
-
mockDraggableCoreProps.onStop({ clientX: 0.05, clientY: 0.05, target: {} }, {});
|
|
456
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
457
|
+
mockDraggableCoreProps.onStop({ clientX: 0.05, clientY: 0.05, target: {}, stopPropagation: jest.fn() }, {});
|
|
450
458
|
|
|
451
459
|
expect(onClick).toHaveBeenCalledWith({ x: 0, y: 0 });
|
|
452
460
|
});
|
|
@@ -467,8 +475,8 @@ describe('gridDraggable', () => {
|
|
|
467
475
|
render(<Comp {...propsWithGraphProps} />);
|
|
468
476
|
|
|
469
477
|
// Start and stop at almost the same position (tiny movement)
|
|
470
|
-
mockDraggableCoreProps.onStart(
|
|
471
|
-
mockDraggableCoreProps.onStop({ clientX: 0.05, clientY: 0.05, target: {} }, {});
|
|
478
|
+
mockDraggableCoreProps.onStart(mockStartEvent());
|
|
479
|
+
mockDraggableCoreProps.onStop({ clientX: 0.05, clientY: 0.05, target: {}, stopPropagation: jest.fn() }, {});
|
|
472
480
|
|
|
473
481
|
expect(graphProps.snap.x).toHaveBeenCalledWith(1.7);
|
|
474
482
|
expect(graphProps.snap.y).toHaveBeenCalledWith(2.3);
|
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
|
}
|
|
@@ -182,19 +194,18 @@ export const gridDraggable = (opts) => (Comp) => {
|
|
|
182
194
|
};
|
|
183
195
|
|
|
184
196
|
onDrag = (e, dd) => {
|
|
185
|
-
const { onDrag, graphProps } = this.props;
|
|
186
|
-
|
|
187
|
-
if (!onDrag) {
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
197
|
+
const { onDrag, graphProps, disabled } = this.props;
|
|
190
198
|
|
|
191
|
-
//
|
|
192
|
-
//
|
|
193
|
-
// 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.
|
|
194
201
|
if (Math.abs(dd.deltaX) > 1 || Math.abs(dd.deltaY) > 1) {
|
|
195
202
|
this._didDrag = true;
|
|
196
203
|
}
|
|
197
204
|
|
|
205
|
+
if (!onDrag || disabled) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
|
|
198
209
|
const bounds = this.getScaledBounds();
|
|
199
210
|
|
|
200
211
|
if (dd.deltaX < 0 && dd.deltaX < bounds.left) {
|
|
@@ -243,33 +254,43 @@ export const gridDraggable = (opts) => (Comp) => {
|
|
|
243
254
|
|
|
244
255
|
onStop = (e, dd) => {
|
|
245
256
|
log('[onStop] dd:', dd);
|
|
246
|
-
const { onDragStop, onClick } = this.props;
|
|
257
|
+
const { onDragStop, onClick, disabled } = this.props;
|
|
247
258
|
|
|
248
|
-
if (onDragStop) {
|
|
259
|
+
if (onDragStop && !disabled) {
|
|
249
260
|
onDragStop();
|
|
250
261
|
}
|
|
251
262
|
|
|
252
263
|
log('[onStop] lastX/Y: ', dd.lastX, dd.lastY);
|
|
253
|
-
// Use the synchronous _didDrag flag instead of comparing clientX/clientY via tiny().
|
|
254
|
-
// tiny() was unreliable because setState is async – startX/startY might not reflect
|
|
255
|
-
// the actual mousedown position when onStop fires. _didDrag is set synchronously in
|
|
256
|
-
// onStart (false) and onDrag (true), so it's always accurate.
|
|
257
264
|
const isClick = !this._didDrag;
|
|
258
265
|
|
|
259
266
|
if (isClick) {
|
|
267
|
+
// For non-disabled marks, stop propagation so the Bg d3 listener
|
|
268
|
+
// doesn't also create a new mark on top of this one.
|
|
269
|
+
// Disabled/background marks allow propagation so Bg can handle the click.
|
|
270
|
+
if (!disabled && typeof e?.stopPropagation === 'function') {
|
|
271
|
+
e.stopPropagation();
|
|
272
|
+
}
|
|
273
|
+
|
|
260
274
|
if (onClick) {
|
|
261
275
|
log('call onClick');
|
|
262
|
-
this.setState({ startX: null });
|
|
276
|
+
this.setState({ startX: null, startY: null });
|
|
263
277
|
const { graphProps } = this.props;
|
|
264
278
|
const { scale, snap } = graphProps;
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
+
}
|
|
272
291
|
}
|
|
292
|
+
|
|
293
|
+
return false;
|
|
273
294
|
}
|
|
274
295
|
|
|
275
296
|
this.setState({ startX: null, startY: null });
|
|
@@ -278,7 +299,11 @@ export const gridDraggable = (opts) => (Comp) => {
|
|
|
278
299
|
};
|
|
279
300
|
|
|
280
301
|
render() {
|
|
281
|
-
|
|
302
|
+
// we extract onClick here to prevent it from being passed to the DraggableCore
|
|
303
|
+
// and to prevent it from being included in the ...rest that gets passed to the Comp
|
|
304
|
+
// because otherwise it is called on every drag event
|
|
305
|
+
// eslint-disable-next-line no-unused-vars
|
|
306
|
+
const { disabled, onClick, ...rest } = this.props;
|
|
282
307
|
const grid = this.grid();
|
|
283
308
|
|
|
284
309
|
// prevent the text select icon from rendering.
|
|
@@ -292,7 +317,6 @@ export const gridDraggable = (opts) => (Comp) => {
|
|
|
292
317
|
|
|
293
318
|
return (
|
|
294
319
|
<DraggableCore
|
|
295
|
-
disabled={disabled}
|
|
296
320
|
onMouseDown={onMouseDown}
|
|
297
321
|
onStart={this.onStart}
|
|
298
322
|
onDrag={this.onDrag}
|
|
@@ -300,7 +324,7 @@ export const gridDraggable = (opts) => (Comp) => {
|
|
|
300
324
|
axis={opts.axis || 'both'}
|
|
301
325
|
grid={[grid.x, grid.y]}
|
|
302
326
|
>
|
|
303
|
-
<Comp {...rest} disabled={disabled} isDragging={isDragging} />
|
|
327
|
+
<Comp {...rest} disabled={disabled} isDragging={isDragging} onClick={isDragging ? undefined : onClick} />
|
|
304
328
|
</DraggableCore>
|
|
305
329
|
);
|
|
306
330
|
}
|