@pie-lib/drag 4.1.1 → 4.1.3
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 +10 -0
- package/lib/drag-provider.js +9 -0
- package/lib/drag-provider.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/drag-provider.test.jsx +38 -2
- package/src/drag-provider.jsx +10 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,16 @@
|
|
|
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
|
+
## [4.1.3](https://github.com/pie-framework/pie-lib/compare/@pie-lib/drag@4.1.2...@pie-lib/drag@4.1.3) (2026-09-02)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @pie-lib/drag
|
|
9
|
+
|
|
10
|
+
## [4.1.2](https://github.com/pie-framework/pie-lib/compare/@pie-lib/drag@4.1.1...@pie-lib/drag@4.1.2) (2026-08-26)
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
- **drag:** forward onDragCancel from DragProvider to its internal DndContext PIE-802 ([9e12a9e](https://github.com/pie-framework/pie-lib/commit/9e12a9e5e5fc32f410b6f6d7de124e55d4c9bd80))
|
|
15
|
+
|
|
6
16
|
## [4.1.1](https://github.com/pie-framework/pie-lib/compare/@pie-lib/drag@4.1.0...@pie-lib/drag@4.1.1) (2026-08-21)
|
|
7
17
|
|
|
8
18
|
**Note:** Version bump only for package @pie-lib/drag
|
package/lib/drag-provider.js
CHANGED
|
@@ -16,6 +16,7 @@ function DragProvider(_ref) {
|
|
|
16
16
|
var children = _ref.children,
|
|
17
17
|
onDragEnd = _ref.onDragEnd,
|
|
18
18
|
onDragStart = _ref.onDragStart,
|
|
19
|
+
onDragCancel = _ref.onDragCancel,
|
|
19
20
|
collisionDetection = _ref.collisionDetection,
|
|
20
21
|
modifiers = _ref.modifiers,
|
|
21
22
|
autoScroll = _ref.autoScroll,
|
|
@@ -51,10 +52,17 @@ function DragProvider(_ref) {
|
|
|
51
52
|
onDragEnd(event);
|
|
52
53
|
}
|
|
53
54
|
};
|
|
55
|
+
var handleDragCancel = function handleDragCancel(event) {
|
|
56
|
+
setActiveId(null);
|
|
57
|
+
if (onDragCancel) {
|
|
58
|
+
onDragCancel(event);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
54
61
|
return /*#__PURE__*/_react["default"].createElement(_core.DndContext, {
|
|
55
62
|
sensors: sensors,
|
|
56
63
|
onDragStart: handleDragStart,
|
|
57
64
|
onDragEnd: handleDragEnd,
|
|
65
|
+
onDragCancel: handleDragCancel,
|
|
58
66
|
collisionDetection: collisionDetection,
|
|
59
67
|
modifiers: modifiers,
|
|
60
68
|
autoScroll: autoScroll,
|
|
@@ -65,6 +73,7 @@ DragProvider.propTypes = {
|
|
|
65
73
|
children: _propTypes["default"].node.isRequired,
|
|
66
74
|
onDragEnd: _propTypes["default"].func,
|
|
67
75
|
onDragStart: _propTypes["default"].func,
|
|
76
|
+
onDragCancel: _propTypes["default"].func,
|
|
68
77
|
collisionDetection: _propTypes["default"].func,
|
|
69
78
|
modifiers: _propTypes["default"].arrayOf(_propTypes["default"].func),
|
|
70
79
|
autoScroll: _propTypes["default"].object,
|
package/lib/drag-provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drag-provider.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_core","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DragProvider","_ref","children","onDragEnd","onDragStart","collisionDetection","modifiers","autoScroll","keyboardCoordinateGetter","keyboardCodes","accessibility","_useState","useState","_useState2","_slicedToArray2","activeId","setActiveId","keyboardSensorOptions","coordinateGetter","undefined","sensors","useSensors","useSensor","PointerSensor","activationConstraint","distance","KeyboardSensor","handleDragStart","event","active","id","handleDragEnd","createElement","DndContext","propTypes","PropTypes","node","isRequired","func","arrayOf","object","shape","start","string","cancel","end","_default","exports"],"sources":["../src/drag-provider.jsx"],"sourcesContent":["import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { DndContext, KeyboardSensor, PointerSensor, useSensor, useSensors } from '@dnd-kit/core';\n\nexport function DragProvider({\n children,\n onDragEnd,\n onDragStart,\n collisionDetection,\n modifiers,\n autoScroll,\n keyboardCoordinateGetter,\n keyboardCodes,\n accessibility,\n}) {\n const [activeId, setActiveId] = useState(null);\n\n // Only build a keyboard sensor options object when a consumer actually customizes\n // it, so consumers that don't pass these props get dnd-kit's own defaults exactly\n // as before (arrow-key nudging, Tab ends the drag, etc.).\n const keyboardSensorOptions =\n keyboardCoordinateGetter || keyboardCodes ? { coordinateGetter: keyboardCoordinateGetter, keyboardCodes } : undefined;\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } }),\n useSensor(KeyboardSensor, keyboardSensorOptions),\n );\n\n const handleDragStart = (event) => {\n setActiveId(event.active.id);\n if (onDragStart) {\n onDragStart(event);\n }\n };\n\n const handleDragEnd = (event) => {\n setActiveId(null);\n if (onDragEnd) {\n onDragEnd(event);\n }\n };\n\n return (\n <DndContext\n sensors={sensors}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n collisionDetection={collisionDetection}\n modifiers={modifiers}\n autoScroll={autoScroll}\n accessibility={accessibility}\n >\n {children}\n </DndContext>\n );\n}\n\nDragProvider.propTypes = {\n children: PropTypes.node.isRequired,\n onDragEnd: PropTypes.func,\n onDragStart: PropTypes.func,\n collisionDetection: PropTypes.func,\n modifiers: PropTypes.arrayOf(PropTypes.func),\n autoScroll: PropTypes.object,\n // Custom dnd-kit KeyboardSensor coordinateGetter (e.g. for Tab/Shift+Tab-based placement).\n // Omit to keep dnd-kit's default keyboard-dragging behavior.\n keyboardCoordinateGetter: PropTypes.func,\n // Overrides for dnd-kit's KeyboardSensor keyboardCodes (start/cancel/end).\n // Omit to keep dnd-kit's defaults.\n keyboardCodes: PropTypes.shape({\n start: PropTypes.arrayOf(PropTypes.string),\n cancel: PropTypes.arrayOf(PropTypes.string),\n end: PropTypes.arrayOf(PropTypes.string),\n }),\n // Passed straight through to dnd-kit's DndContext (screenReaderInstructions,\n // announcements, container). Omit to keep dnd-kit's defaults.\n accessibility: PropTypes.object,\n};\n\nexport default DragProvider;\n"],"mappings":";;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,KAAA,GAAAH,OAAA;AAAiG,SAAAD,wBAAAK,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAP,uBAAA,YAAAA,wBAAAK,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,mBAAAT,CAAA,iBAAAA,CAAA,gBAAAU,OAAA,CAAAV,CAAA,0BAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,cAAAM,EAAA,IAAAd,CAAA,gBAAAc,EAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,EAAA,OAAAP,CAAA,IAAAD,CAAA,GAAAW,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAnB,CAAA,EAAAc,EAAA,OAAAP,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAM,EAAA,EAAAP,CAAA,IAAAC,CAAA,CAAAM,EAAA,IAAAd,CAAA,CAAAc,EAAA,WAAAN,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAE1F,SAASmB,YAAYA,CAAAC,IAAA,
|
|
1
|
+
{"version":3,"file":"drag-provider.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_core","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DragProvider","_ref","children","onDragEnd","onDragStart","onDragCancel","collisionDetection","modifiers","autoScroll","keyboardCoordinateGetter","keyboardCodes","accessibility","_useState","useState","_useState2","_slicedToArray2","activeId","setActiveId","keyboardSensorOptions","coordinateGetter","undefined","sensors","useSensors","useSensor","PointerSensor","activationConstraint","distance","KeyboardSensor","handleDragStart","event","active","id","handleDragEnd","handleDragCancel","createElement","DndContext","propTypes","PropTypes","node","isRequired","func","arrayOf","object","shape","start","string","cancel","end","_default","exports"],"sources":["../src/drag-provider.jsx"],"sourcesContent":["import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { DndContext, KeyboardSensor, PointerSensor, useSensor, useSensors } from '@dnd-kit/core';\n\nexport function DragProvider({\n children,\n onDragEnd,\n onDragStart,\n onDragCancel,\n collisionDetection,\n modifiers,\n autoScroll,\n keyboardCoordinateGetter,\n keyboardCodes,\n accessibility,\n}) {\n const [activeId, setActiveId] = useState(null);\n\n // Only build a keyboard sensor options object when a consumer actually customizes\n // it, so consumers that don't pass these props get dnd-kit's own defaults exactly\n // as before (arrow-key nudging, Tab ends the drag, etc.).\n const keyboardSensorOptions =\n keyboardCoordinateGetter || keyboardCodes ? { coordinateGetter: keyboardCoordinateGetter, keyboardCodes } : undefined;\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } }),\n useSensor(KeyboardSensor, keyboardSensorOptions),\n );\n\n const handleDragStart = (event) => {\n setActiveId(event.active.id);\n if (onDragStart) {\n onDragStart(event);\n }\n };\n\n const handleDragEnd = (event) => {\n setActiveId(null);\n if (onDragEnd) {\n onDragEnd(event);\n }\n };\n\n const handleDragCancel = (event) => {\n setActiveId(null);\n if (onDragCancel) {\n onDragCancel(event);\n }\n };\n\n return (\n <DndContext\n sensors={sensors}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n collisionDetection={collisionDetection}\n modifiers={modifiers}\n autoScroll={autoScroll}\n accessibility={accessibility}\n >\n {children}\n </DndContext>\n );\n}\n\nDragProvider.propTypes = {\n children: PropTypes.node.isRequired,\n onDragEnd: PropTypes.func,\n onDragStart: PropTypes.func,\n onDragCancel: PropTypes.func,\n collisionDetection: PropTypes.func,\n modifiers: PropTypes.arrayOf(PropTypes.func),\n autoScroll: PropTypes.object,\n // Custom dnd-kit KeyboardSensor coordinateGetter (e.g. for Tab/Shift+Tab-based placement).\n // Omit to keep dnd-kit's default keyboard-dragging behavior.\n keyboardCoordinateGetter: PropTypes.func,\n // Overrides for dnd-kit's KeyboardSensor keyboardCodes (start/cancel/end).\n // Omit to keep dnd-kit's defaults.\n keyboardCodes: PropTypes.shape({\n start: PropTypes.arrayOf(PropTypes.string),\n cancel: PropTypes.arrayOf(PropTypes.string),\n end: PropTypes.arrayOf(PropTypes.string),\n }),\n // Passed straight through to dnd-kit's DndContext (screenReaderInstructions,\n // announcements, container). Omit to keep dnd-kit's defaults.\n accessibility: PropTypes.object,\n};\n\nexport default DragProvider;\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-lib/drag",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.3",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "src/index.js",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"@mui/icons-material": "^7.3.4",
|
|
15
15
|
"@mui/material": "^7.3.4",
|
|
16
16
|
"@pie-lib/math-rendering": "^5.1.0",
|
|
17
|
-
"@pie-lib/render-ui": "^7.0.
|
|
17
|
+
"@pie-lib/render-ui": "^7.0.2",
|
|
18
18
|
"classnames": "^2.2.6",
|
|
19
19
|
"lodash-es": "^4.17.23",
|
|
20
20
|
"prop-types": "^15.7.2",
|
|
@@ -26,5 +26,5 @@
|
|
|
26
26
|
"scripts": {},
|
|
27
27
|
"author": "",
|
|
28
28
|
"license": "ISC",
|
|
29
|
-
"gitHead": "
|
|
29
|
+
"gitHead": "b422e915ca538d0fdc66e6583140c53a7df8ebfa"
|
|
30
30
|
}
|
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { render, screen } from '@testing-library/react';
|
|
2
|
+
import { render, screen, fireEvent } from '@testing-library/react';
|
|
3
3
|
import { DragProvider } from '../drag-provider';
|
|
4
4
|
|
|
5
5
|
jest.mock('@dnd-kit/core', () => ({
|
|
6
|
-
DndContext: ({
|
|
6
|
+
DndContext: ({
|
|
7
|
+
children,
|
|
8
|
+
onDragStart,
|
|
9
|
+
onDragEnd,
|
|
10
|
+
onDragCancel,
|
|
11
|
+
sensors,
|
|
12
|
+
collisionDetection,
|
|
13
|
+
modifiers,
|
|
14
|
+
autoScroll,
|
|
15
|
+
accessibility,
|
|
16
|
+
}) => (
|
|
7
17
|
<div
|
|
8
18
|
data-testid="dnd-context"
|
|
9
19
|
data-has-sensors={!!sensors}
|
|
@@ -13,7 +23,10 @@ jest.mock('@dnd-kit/core', () => ({
|
|
|
13
23
|
data-has-accessibility={!!accessibility}
|
|
14
24
|
data-on-drag-start={typeof onDragStart === 'function' ? 'function' : 'undefined'}
|
|
15
25
|
data-on-drag-end={typeof onDragEnd === 'function' ? 'function' : 'undefined'}
|
|
26
|
+
data-on-drag-cancel={typeof onDragCancel === 'function' ? 'function' : 'undefined'}
|
|
16
27
|
>
|
|
28
|
+
{/* Lets tests simulate dnd-kit itself invoking the handler DragProvider built. */}
|
|
29
|
+
<button data-testid="simulate-drag-cancel" onClick={() => onDragCancel?.({ active: { id: 'x' } })} />
|
|
17
30
|
{children}
|
|
18
31
|
</div>
|
|
19
32
|
),
|
|
@@ -94,6 +107,29 @@ describe('DragProvider', () => {
|
|
|
94
107
|
expect(dndContext).toHaveAttribute('data-on-drag-end', 'function');
|
|
95
108
|
});
|
|
96
109
|
|
|
110
|
+
it('should always pass an onDragCancel handler to DndContext, even without one of its own', () => {
|
|
111
|
+
render(<DragProvider {...defaultProps} />);
|
|
112
|
+
const dndContext = screen.getByTestId('dnd-context');
|
|
113
|
+
expect(dndContext).toHaveAttribute('data-on-drag-cancel', 'function');
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('invokes the given onDragCancel when dnd-kit cancels a drag', () => {
|
|
117
|
+
const onDragCancel = jest.fn();
|
|
118
|
+
render(<DragProvider {...defaultProps} onDragCancel={onDragCancel} />);
|
|
119
|
+
|
|
120
|
+
fireEvent.click(screen.getByTestId('simulate-drag-cancel'));
|
|
121
|
+
|
|
122
|
+
expect(onDragCancel).toHaveBeenCalledWith({ active: { id: 'x' } });
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('does not throw when dnd-kit cancels a drag and no onDragCancel was given', () => {
|
|
126
|
+
render(<DragProvider {...defaultProps} />);
|
|
127
|
+
|
|
128
|
+
expect(() => {
|
|
129
|
+
fireEvent.click(screen.getByTestId('simulate-drag-cancel'));
|
|
130
|
+
}).not.toThrow();
|
|
131
|
+
});
|
|
132
|
+
|
|
97
133
|
it('should pass collisionDetection to DndContext', () => {
|
|
98
134
|
const collisionDetection = jest.fn();
|
|
99
135
|
render(<DragProvider {...defaultProps} collisionDetection={collisionDetection} />);
|
package/src/drag-provider.jsx
CHANGED
|
@@ -6,6 +6,7 @@ export function DragProvider({
|
|
|
6
6
|
children,
|
|
7
7
|
onDragEnd,
|
|
8
8
|
onDragStart,
|
|
9
|
+
onDragCancel,
|
|
9
10
|
collisionDetection,
|
|
10
11
|
modifiers,
|
|
11
12
|
autoScroll,
|
|
@@ -40,11 +41,19 @@ export function DragProvider({
|
|
|
40
41
|
}
|
|
41
42
|
};
|
|
42
43
|
|
|
44
|
+
const handleDragCancel = (event) => {
|
|
45
|
+
setActiveId(null);
|
|
46
|
+
if (onDragCancel) {
|
|
47
|
+
onDragCancel(event);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
43
51
|
return (
|
|
44
52
|
<DndContext
|
|
45
53
|
sensors={sensors}
|
|
46
54
|
onDragStart={handleDragStart}
|
|
47
55
|
onDragEnd={handleDragEnd}
|
|
56
|
+
onDragCancel={handleDragCancel}
|
|
48
57
|
collisionDetection={collisionDetection}
|
|
49
58
|
modifiers={modifiers}
|
|
50
59
|
autoScroll={autoScroll}
|
|
@@ -59,6 +68,7 @@ DragProvider.propTypes = {
|
|
|
59
68
|
children: PropTypes.node.isRequired,
|
|
60
69
|
onDragEnd: PropTypes.func,
|
|
61
70
|
onDragStart: PropTypes.func,
|
|
71
|
+
onDragCancel: PropTypes.func,
|
|
62
72
|
collisionDetection: PropTypes.func,
|
|
63
73
|
modifiers: PropTypes.arrayOf(PropTypes.func),
|
|
64
74
|
autoScroll: PropTypes.object,
|