@reltio/components 1.4.1992 → 1.4.1993
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/cjs/HOCs/withDragHandle/styles.d.ts +1 -1
- package/cjs/RCTree/RCTree.d.ts +10 -4
- package/cjs/RCTree/RCTree.js +66 -27
- package/cjs/RCTree/helper.d.ts +21 -2
- package/cjs/RCTree/helper.js +161 -6
- package/cjs/RCTree/styles.d.ts +1 -1
- package/cjs/RCTree/styles.js +52 -23
- package/cjs/RCTree/types.d.ts +11 -0
- package/cjs/RCTree/types.js +7 -0
- package/cjs/RCTree/useDelayedDragEventCall.d.ts +6 -0
- package/cjs/RCTree/useDelayedDragEventCall.js +26 -0
- package/cjs/RCTree/useDnd.d.ts +47 -0
- package/cjs/RCTree/useDnd.js +112 -0
- package/cjs/RCTree/useScrollOnDrag.d.ts +6 -0
- package/cjs/RCTree/useScrollOnDrag.js +87 -0
- package/esm/HOCs/withDragHandle/styles.d.ts +1 -1
- package/esm/RCTree/RCTree.d.ts +10 -4
- package/esm/RCTree/RCTree.js +67 -28
- package/esm/RCTree/helper.d.ts +21 -2
- package/esm/RCTree/helper.js +151 -6
- package/esm/RCTree/styles.d.ts +1 -1
- package/esm/RCTree/styles.js +52 -23
- package/esm/RCTree/types.d.ts +11 -0
- package/esm/RCTree/types.js +6 -1
- package/esm/RCTree/useDelayedDragEventCall.d.ts +6 -0
- package/esm/RCTree/useDelayedDragEventCall.js +22 -0
- package/esm/RCTree/useDnd.d.ts +47 -0
- package/esm/RCTree/useDnd.js +108 -0
- package/esm/RCTree/useScrollOnDrag.d.ts +6 -0
- package/esm/RCTree/useScrollOnDrag.js +83 -0
- package/package.json +2 -2
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useDnd = void 0;
|
|
4
|
+
var react_1 = require("react");
|
|
5
|
+
var ramda_1 = require("ramda");
|
|
6
|
+
var types_1 = require("./types");
|
|
7
|
+
var useScrollOnDrag_1 = require("./useScrollOnDrag");
|
|
8
|
+
var useDelayedDragEventCall_1 = require("./useDelayedDragEventCall");
|
|
9
|
+
var helper_1 = require("./helper");
|
|
10
|
+
var useDnd = function (_a) {
|
|
11
|
+
var treeData = _a.treeData, containerRef = _a.containerRef, expandNode = _a.expandNode, onLoadChildren = _a.onLoadChildren, onChange = _a.onChange, onDropProp = _a.onDrop, canDrop = _a.canDrop, canDrag = _a.canDrag;
|
|
12
|
+
var _b = (0, react_1.useState)(null), dragNode = _b[0], setDragNode = _b[1];
|
|
13
|
+
var _c = (0, react_1.useState)(null), dropNode = _c[0], setDropNode = _c[1];
|
|
14
|
+
var _d = (0, react_1.useState)(null), dropPositionInfo = _d[0], setDropPositionInfo = _d[1];
|
|
15
|
+
var _e = (0, useScrollOnDrag_1.useScrollOnDrag)(containerRef), onStartDragging = _e.onStartDragging, onEndDragging = _e.onEndDragging, getIsScrolling = _e.getIsScrolling;
|
|
16
|
+
var handleDropOutsideTree = function () {
|
|
17
|
+
setDragNode(null);
|
|
18
|
+
setDropNode(null);
|
|
19
|
+
onEndDragging();
|
|
20
|
+
window.removeEventListener('mousemove', handleDropOutsideTree);
|
|
21
|
+
};
|
|
22
|
+
var onDragStart = function (_a) {
|
|
23
|
+
var node = _a.node;
|
|
24
|
+
setDragNode(node);
|
|
25
|
+
onStartDragging();
|
|
26
|
+
window.addEventListener('mousemove', handleDropOutsideTree);
|
|
27
|
+
};
|
|
28
|
+
var expandedKeys = (0, react_1.useMemo)(function () {
|
|
29
|
+
return (0, helper_1.getExpandedKeys)(treeData);
|
|
30
|
+
}, [treeData]);
|
|
31
|
+
var expandDropNodeAtPosition = (0, react_1.useCallback)(function (pos, expanded) {
|
|
32
|
+
var node = (0, helper_1.getNodeAtPosition)(treeData, pos);
|
|
33
|
+
if (node && !expandedKeys.includes(node.nodeId)) {
|
|
34
|
+
expandNode(pos, expanded);
|
|
35
|
+
if (node.pending && onLoadChildren) {
|
|
36
|
+
onLoadChildren(node);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}, [expandNode, expandedKeys, onLoadChildren, treeData]);
|
|
40
|
+
var expandDropNode = (0, react_1.useCallback)(function (newDropPositionInfo) {
|
|
41
|
+
if (onChange && newDropPositionInfo.dropPosition === types_1.AddNodePosition.AsChild) {
|
|
42
|
+
var currentParentNodePos = (0, helper_1.slideNodePos)(newDropPositionInfo.pos, dragNode.pos);
|
|
43
|
+
if (currentParentNodePos.split('-').length > 1) {
|
|
44
|
+
expandDropNodeAtPosition(currentParentNodePos, true);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}, [dragNode, expandDropNodeAtPosition, onChange]);
|
|
48
|
+
var handleSetDropNode = (0, react_1.useCallback)(function (_a) {
|
|
49
|
+
var event = _a.event, node = _a.node;
|
|
50
|
+
var newDropPositionInfo = (0, helper_1.getDropNodePosition)(event, node, dropPositionInfo) || dropPositionInfo;
|
|
51
|
+
if (!(0, ramda_1.equals)(newDropPositionInfo, dropPositionInfo) && (!(0, helper_1.isDropIndicatorNode)(node) || !dropNode)) {
|
|
52
|
+
setDropPositionInfo(newDropPositionInfo);
|
|
53
|
+
expandDropNode(newDropPositionInfo);
|
|
54
|
+
}
|
|
55
|
+
if (node.key !== (dropNode === null || dropNode === void 0 ? void 0 : dropNode.key)) {
|
|
56
|
+
setDropNode(node);
|
|
57
|
+
}
|
|
58
|
+
}, [dropNode, dropPositionInfo, expandDropNode]);
|
|
59
|
+
var delayedHandleDragOver = (0, useDelayedDragEventCall_1.useDelayedDragEventCall)(handleSetDropNode);
|
|
60
|
+
var onDragOver = function (_a) {
|
|
61
|
+
var event = _a.event, node = _a.node;
|
|
62
|
+
var isScrolling = getIsScrolling();
|
|
63
|
+
if (!isScrolling)
|
|
64
|
+
delayedHandleDragOver({ event: event, node: node });
|
|
65
|
+
};
|
|
66
|
+
var dropIndicatorRender = function () {
|
|
67
|
+
return null;
|
|
68
|
+
};
|
|
69
|
+
var onDragLeave = function (_a) {
|
|
70
|
+
var _b, _c;
|
|
71
|
+
var event = _a.event, node = _a.node;
|
|
72
|
+
var draggedChildrenNodes = ((_b = dragNode === null || dragNode === void 0 ? void 0 : dragNode.value) === null || _b === void 0 ? void 0 : _b.expanded) ? (0, helper_1.getExpandedKeys)((_c = dragNode.value) === null || _c === void 0 ? void 0 : _c.children) : [];
|
|
73
|
+
if (draggedChildrenNodes.includes(node.key)) {
|
|
74
|
+
handleSetDropNode({ event: event, node: node });
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
var onDrop = function () {
|
|
78
|
+
if (dragNode && (0, helper_1.isDropIndicatorNode)(dropNode)) {
|
|
79
|
+
var parentNodePosition = dropPositionInfo.dropPosition === types_1.AddNodePosition.AsChild
|
|
80
|
+
? dropPositionInfo.pos
|
|
81
|
+
: (0, helper_1.getParentPos)(dropPositionInfo.pos);
|
|
82
|
+
var parentNode = (0, helper_1.getNodeAtPosition)(treeData, parentNodePosition);
|
|
83
|
+
var newTreeData = (0, helper_1.moveNode)(treeData, dragNode.value, dragNode.pos, dropPositionInfo);
|
|
84
|
+
onDropProp(newTreeData, dragNode.value, parentNode);
|
|
85
|
+
}
|
|
86
|
+
setDragNode(null);
|
|
87
|
+
setDropNode(null);
|
|
88
|
+
onEndDragging();
|
|
89
|
+
};
|
|
90
|
+
var allowDrop = (0, react_1.useCallback)(function (_a) {
|
|
91
|
+
var dragNode = _a.dragNode, dropNode = _a.dropNode;
|
|
92
|
+
return canDrop({ nextParent: dropNode.value, node: dragNode.value });
|
|
93
|
+
}, [canDrop]);
|
|
94
|
+
var nodeDraggable = (0, react_1.useCallback)(function (node) {
|
|
95
|
+
return canDrag({ node: node.value });
|
|
96
|
+
}, [canDrag]);
|
|
97
|
+
return {
|
|
98
|
+
treeProps: {
|
|
99
|
+
onDragStart: onDragStart,
|
|
100
|
+
onDragOver: onDragOver,
|
|
101
|
+
onDragLeave: onDragLeave,
|
|
102
|
+
onDrop: onDrop,
|
|
103
|
+
dropIndicatorRender: dropIndicatorRender,
|
|
104
|
+
allowDrop: allowDrop
|
|
105
|
+
},
|
|
106
|
+
nodeDraggable: nodeDraggable,
|
|
107
|
+
dropNode: dropNode,
|
|
108
|
+
dragNode: dragNode,
|
|
109
|
+
dropPositionInfo: dropPositionInfo
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
exports.useDnd = useDnd;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useScrollOnDrag = void 0;
|
|
4
|
+
var react_1 = require("react");
|
|
5
|
+
var mdm_sdk_1 = require("@reltio/mdm-sdk");
|
|
6
|
+
var SCROLL_MARGIN = 50;
|
|
7
|
+
var SPEED_MULTIPLIER = 25;
|
|
8
|
+
var UPDATE_DATA_INTERVAL = 100;
|
|
9
|
+
var useScrollOnDrag = function (scrollContainer) {
|
|
10
|
+
var scrolling = (0, react_1.useRef)(false);
|
|
11
|
+
var running = (0, react_1.useRef)(false);
|
|
12
|
+
var scrollData = (0, react_1.useRef)(null);
|
|
13
|
+
var getIsScrolling = function () {
|
|
14
|
+
return scrolling === null || scrolling === void 0 ? void 0 : scrolling.current;
|
|
15
|
+
};
|
|
16
|
+
var onStartDragging = function () {
|
|
17
|
+
var container = scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.current;
|
|
18
|
+
if (container && typeof container.addEventListener === 'function') {
|
|
19
|
+
container.addEventListener('dragover', updateScrollData);
|
|
20
|
+
window.addEventListener('dragover', updateScrollData);
|
|
21
|
+
running.current = true;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
var updateScrollData = (0, react_1.useCallback)((0, mdm_sdk_1.throttle)(function (event) {
|
|
25
|
+
var container = scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.current;
|
|
26
|
+
if (!container || !running.current)
|
|
27
|
+
return;
|
|
28
|
+
var holder = container.getElementsByClassName('rc-tree-list-holder')[0];
|
|
29
|
+
var calcSpeed = function () {
|
|
30
|
+
var clientY = event.clientY, clientX = event.clientX;
|
|
31
|
+
var _a = container.getBoundingClientRect(), top = _a.top, bottom = _a.bottom, left = _a.left, right = _a.right;
|
|
32
|
+
var maxScroll = holder.scrollHeight - holder.clientHeight;
|
|
33
|
+
var insideContainer = clientY > top && clientY < bottom && clientX >= left && clientX <= right;
|
|
34
|
+
if (insideContainer) {
|
|
35
|
+
if (clientY - top < SCROLL_MARGIN && holder.scrollTop > 0) {
|
|
36
|
+
return (clientY - top - SCROLL_MARGIN) / SCROLL_MARGIN;
|
|
37
|
+
}
|
|
38
|
+
else if (bottom - clientY < SCROLL_MARGIN && holder.scrollTop < maxScroll) {
|
|
39
|
+
return -(bottom - clientY - SCROLL_MARGIN) / SCROLL_MARGIN;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return 0;
|
|
43
|
+
};
|
|
44
|
+
if (holder) {
|
|
45
|
+
scrollData.current = calcSpeed();
|
|
46
|
+
if (scrollData.current) {
|
|
47
|
+
runScrolling(holder);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}, UPDATE_DATA_INTERVAL), []);
|
|
51
|
+
var removeListeners = (0, react_1.useCallback)(function () {
|
|
52
|
+
var container = scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.current;
|
|
53
|
+
if (container && typeof container.removeEventListener === 'function') {
|
|
54
|
+
container.removeEventListener('dragover', updateScrollData);
|
|
55
|
+
}
|
|
56
|
+
window.removeEventListener('dragover', updateScrollData);
|
|
57
|
+
}, [scrollContainer, updateScrollData]);
|
|
58
|
+
var onEndDragging = (0, react_1.useCallback)(function () {
|
|
59
|
+
scrolling.current = false;
|
|
60
|
+
scrollData.current = null;
|
|
61
|
+
running.current = false;
|
|
62
|
+
removeListeners();
|
|
63
|
+
}, [removeListeners]);
|
|
64
|
+
var runScrolling = function (holder) {
|
|
65
|
+
if (scrolling === null || scrolling === void 0 ? void 0 : scrolling.current) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
scrolling.current = true;
|
|
69
|
+
var scroll = function () {
|
|
70
|
+
if (scrolling.current && scrollData.current) {
|
|
71
|
+
holder.scrollTop += scrollData.current * SPEED_MULTIPLIER;
|
|
72
|
+
requestAnimationFrame(scroll);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
scrolling.current = false;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
scroll();
|
|
79
|
+
};
|
|
80
|
+
(0, react_1.useEffect)(function () {
|
|
81
|
+
return function () {
|
|
82
|
+
removeListeners();
|
|
83
|
+
};
|
|
84
|
+
}, [removeListeners]);
|
|
85
|
+
return { onStartDragging: onStartDragging, onEndDragging: onEndDragging, getIsScrolling: getIsScrolling };
|
|
86
|
+
};
|
|
87
|
+
exports.useScrollOnDrag = useScrollOnDrag;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"
|
|
1
|
+
export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"dragHandle" | "dragHandleContainer" | "dragHandleVisibilityArea" | "dragIcon">;
|
package/esm/RCTree/RCTree.d.ts
CHANGED
|
@@ -4,10 +4,16 @@ import { RCTreeNode } from './types';
|
|
|
4
4
|
type Props = {
|
|
5
5
|
treeData: RCTreeNode[];
|
|
6
6
|
renderNode?: (node: RCTreeNode & Record<string, unknown>) => React.ReactElement;
|
|
7
|
-
canDrag?: boolean;
|
|
8
7
|
isVirtualized?: boolean;
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
canDrag?: (params: {
|
|
9
|
+
node: RCTreeNode;
|
|
10
|
+
}) => boolean;
|
|
11
|
+
canDrop?: (params: {
|
|
12
|
+
nextParent: RCTreeNode;
|
|
13
|
+
node: RCTreeNode;
|
|
14
|
+
}) => boolean;
|
|
15
|
+
onDrop?: (treeData: RCTreeNode[], dragNode: RCTreeNode, parentNode: RCTreeNode) => void;
|
|
16
|
+
onLoadChildren?: (treeNode: RCTreeNode) => Promise<void>;
|
|
11
17
|
height?: number;
|
|
12
18
|
defaultExpandAll?: boolean;
|
|
13
19
|
SwitchRenderer?: (props: any) => React.ReactElement;
|
|
@@ -17,5 +23,5 @@ type Props = {
|
|
|
17
23
|
scrollToNode?: RCTreeNode;
|
|
18
24
|
onChange?: (node: RCTreeNode[]) => void;
|
|
19
25
|
};
|
|
20
|
-
export declare const RCTree: ({ treeData, isVirtualized, canDrag, canDrop, onLoadChildren, height, defaultExpandAll, SwitchRenderer, className, renderNode, minItemHeight, isLeaf, scrollToNode, onChange }: Props) => React.JSX.Element;
|
|
26
|
+
export declare const RCTree: ({ treeData, isVirtualized, canDrag, canDrop, onDrop, onLoadChildren, height, defaultExpandAll, SwitchRenderer, className, renderNode, minItemHeight, isLeaf, scrollToNode, onChange }: Props) => React.JSX.Element;
|
|
21
27
|
export {};
|
package/esm/RCTree/RCTree.js
CHANGED
|
@@ -1,47 +1,86 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
1
12
|
import classnames from 'classnames';
|
|
2
13
|
import { assoc, identity } from 'ramda';
|
|
3
14
|
import Tree from 'rc-tree';
|
|
4
15
|
import React, { useCallback, useEffect, useMemo, useRef } from 'react';
|
|
16
|
+
import DragIndicator from '@mui/icons-material/DragIndicator';
|
|
5
17
|
import { DefaultSwitchRenderer } from './DefaultSwitchRenderer';
|
|
6
|
-
import { changeNodeAtPosition, convertTreeData, defaultIsLeaf, getExpandedKeys } from './helper';
|
|
18
|
+
import { changeNodeAtPosition, convertTreeData, defaultIsLeaf, gatherNodeKeys, getExpandedKeys, isDropIndicatorNode, moveNode, preventNodeDragging } from './helper';
|
|
19
|
+
import { useDnd } from './useDnd';
|
|
7
20
|
import { useStyles } from './styles';
|
|
8
21
|
var MIN_ROW_HEIGHT = 28;
|
|
9
22
|
export var RCTree = function (_a) {
|
|
10
|
-
var
|
|
23
|
+
var _b;
|
|
24
|
+
var treeData = _a.treeData, _c = _a.isVirtualized, isVirtualized = _c === void 0 ? true : _c, _d = _a.canDrag, canDrag = _d === void 0 ? function () { return false; } : _d, _e = _a.canDrop, canDrop = _e === void 0 ? function () { return false; } : _e, _f = _a.onDrop, onDrop = _f === void 0 ? function () { } : _f, onLoadChildren = _a.onLoadChildren, height = _a.height, _g = _a.defaultExpandAll, defaultExpandAll = _g === void 0 ? false : _g, _h = _a.SwitchRenderer, SwitchRenderer = _h === void 0 ? DefaultSwitchRenderer : _h, className = _a.className, renderNode = _a.renderNode, _j = _a.minItemHeight, minItemHeight = _j === void 0 ? MIN_ROW_HEIGHT : _j, _k = _a.isLeaf, isLeaf = _k === void 0 ? defaultIsLeaf : _k, scrollToNode = _a.scrollToNode, _l = _a.onChange, onChange = _l === void 0 ? identity : _l;
|
|
11
25
|
var styles = useStyles();
|
|
12
|
-
var internalTreeData = useMemo(function () { return convertTreeData({ data: treeData, isLeaf: isLeaf }); }, [isLeaf, treeData]);
|
|
13
26
|
var treeRef = useRef(null);
|
|
27
|
+
var containerRef = useRef(null);
|
|
28
|
+
var expandNode = useCallback(function (pos, expanded) {
|
|
29
|
+
var changeNode = assoc('expanded', expanded);
|
|
30
|
+
var newTreeData = changeNodeAtPosition(treeData, pos, changeNode);
|
|
31
|
+
if (newTreeData)
|
|
32
|
+
onChange(newTreeData);
|
|
33
|
+
}, [onChange, treeData]);
|
|
34
|
+
var _m = useDnd({
|
|
35
|
+
containerRef: containerRef,
|
|
36
|
+
treeData: treeData,
|
|
37
|
+
expandNode: expandNode,
|
|
38
|
+
onLoadChildren: onLoadChildren,
|
|
39
|
+
onChange: onChange,
|
|
40
|
+
onDrop: onDrop,
|
|
41
|
+
canDrop: canDrop,
|
|
42
|
+
canDrag: canDrag
|
|
43
|
+
}), treeProps = _m.treeProps, nodeDraggable = _m.nodeDraggable, dropNode = _m.dropNode, dragNode = _m.dragNode, dropPositionInfo = _m.dropPositionInfo;
|
|
14
44
|
useEffect(function () {
|
|
15
45
|
if (treeRef.current && scrollToNode) {
|
|
16
46
|
treeRef.current.scrollTo({ key: String(scrollToNode.nodeId) });
|
|
17
47
|
}
|
|
18
48
|
}, [scrollToNode]);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
var handleDragEnter = function (_a) {
|
|
26
|
-
var event = _a.event, node = _a.node, expandedKeys = _a.expandedKeys;
|
|
27
|
-
// TODO: implement
|
|
28
|
-
};
|
|
29
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
30
|
-
var dropIndicatorRender = function (_a) {
|
|
31
|
-
var dropPosition = _a.dropPosition, dropLevelOffset = _a.dropLevelOffset, indent = _a.indent, prefixCls = _a.prefixCls, direction = _a.direction;
|
|
32
|
-
// TODO: implement
|
|
33
|
-
};
|
|
34
|
-
var handleExpand = useCallback(function (_expandedKeys, data) {
|
|
35
|
-
if (onChange) {
|
|
36
|
-
var changeNode = assoc('expanded', data.expanded);
|
|
37
|
-
var newTreeData = changeNodeAtPosition(treeData, data.node.pos, changeNode);
|
|
38
|
-
if (newTreeData)
|
|
39
|
-
onChange(newTreeData);
|
|
49
|
+
var diplayedTreeData = useMemo(function () {
|
|
50
|
+
if (dropNode && dragNode) {
|
|
51
|
+
if (dropNode.pos === dragNode.pos && dropNode.key === dragNode.key)
|
|
52
|
+
return treeData;
|
|
53
|
+
var dragNodeValue = __assign(__assign({}, dragNode.value), { nodeId: -1 });
|
|
54
|
+
return moveNode(treeData, dragNodeValue, dragNode.pos, dropPositionInfo);
|
|
40
55
|
}
|
|
41
|
-
|
|
56
|
+
return treeData;
|
|
57
|
+
}, [treeData, dragNode, dropNode, dropPositionInfo]);
|
|
42
58
|
var expandedKeys = useMemo(function () {
|
|
43
|
-
return getExpandedKeys(
|
|
44
|
-
}, [
|
|
59
|
+
return getExpandedKeys(diplayedTreeData);
|
|
60
|
+
}, [diplayedTreeData]);
|
|
61
|
+
var internalTreeData = useMemo(function () { return convertTreeData({ data: diplayedTreeData, isLeaf: isLeaf }); }, [isLeaf, diplayedTreeData]);
|
|
62
|
+
var handleExpand = useCallback(function (_expandedKeys, data) {
|
|
63
|
+
if (onChange && !dragNode) {
|
|
64
|
+
expandNode(data.node.pos, data.expanded);
|
|
65
|
+
}
|
|
66
|
+
}, [onChange, expandNode, dragNode]);
|
|
45
67
|
var renderSwitcherIcon = useCallback(function (node) { return React.createElement(SwitchRenderer, { node: node }); }, []);
|
|
46
|
-
|
|
68
|
+
var titleRender = function (node) {
|
|
69
|
+
var _a;
|
|
70
|
+
var draggedNodes = gatherNodeKeys(dragNode);
|
|
71
|
+
return (React.createElement("div", { className: classnames((_a = {},
|
|
72
|
+
_a[styles.dropIndicator] = isDropIndicatorNode(node),
|
|
73
|
+
_a[styles.dropNotAllowed] = dropNode && !isDropIndicatorNode(dropNode),
|
|
74
|
+
_a[styles.draggedChildrenNode] = draggedNodes.includes(node.key),
|
|
75
|
+
_a)), onMouseDown: preventNodeDragging }, renderNode ? renderNode(node.value) : node.title));
|
|
76
|
+
};
|
|
77
|
+
var dragHandle = (React.createElement("span", { className: classnames(styles.dragHandle, (_b = {},
|
|
78
|
+
_b[styles.dragHandleDragging] = !!dragNode,
|
|
79
|
+
_b)) },
|
|
80
|
+
React.createElement(DragIndicator, null)));
|
|
81
|
+
return diplayedTreeData ? (React.createElement("div", { ref: containerRef },
|
|
82
|
+
React.createElement(Tree, __assign({ draggable: {
|
|
83
|
+
icon: dragHandle,
|
|
84
|
+
nodeDraggable: nodeDraggable
|
|
85
|
+
}, virtual: isVirtualized, itemHeight: minItemHeight, height: height, onExpand: handleExpand, showIcon: false, showLine: true, expandedKeys: expandedKeys, switcherIcon: renderSwitcherIcon, defaultExpandAll: defaultExpandAll, className: classnames(className, styles.treeWrapper), titleRender: titleRender, treeData: internalTreeData, selectable: false, loadData: onLoadChildren ? function (node) { return onLoadChildren(node.value); } : undefined, "data-reltio-id": "rc-tree", ref: treeRef }, treeProps)))) : null;
|
|
47
86
|
};
|
package/esm/RCTree/helper.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import React, { MouseEvent } from 'react';
|
|
2
|
+
import { AddNodePosition, DropPositionInfo, InternalRCNode, RCTreeNode } from './types';
|
|
2
3
|
export declare const defaultIsLeaf: ({ children }: {
|
|
3
4
|
children?: unknown[];
|
|
4
5
|
}) => boolean;
|
|
@@ -7,7 +8,25 @@ type ConvertTreeDataProps<T> = {
|
|
|
7
8
|
parentPath?: number[];
|
|
8
9
|
isLeaf: (node: T) => boolean;
|
|
9
10
|
};
|
|
10
|
-
export declare const convertTreeData: ({ data,
|
|
11
|
+
export declare const convertTreeData: ({ data, isLeaf }: ConvertTreeDataProps<RCTreeNode>) => InternalRCNode[];
|
|
12
|
+
export declare const getNodeAtPosition: (treeData: RCTreeNode[], pos: string) => any;
|
|
13
|
+
export declare const getParentPos: (pos: string) => string;
|
|
11
14
|
export declare const changeNodeAtPosition: (treeData: RCTreeNode[], pos: string, changeNode: (node: RCTreeNode) => RCTreeNode) => any;
|
|
15
|
+
export declare const removeNodeAtPosition: (treeData: RCTreeNode[], pos: string) => any;
|
|
16
|
+
export declare const insertNodeAtPosition: (treeData: RCTreeNode[], pos: string, dropPosition: number, node: RCTreeNode) => any;
|
|
17
|
+
export declare const moveNode: (treeData: RCTreeNode[], dragNode: RCTreeNode, dragNodePos: string, dropPositionInfo: DropPositionInfo) => any;
|
|
12
18
|
export declare const getExpandedKeys: (nodes?: RCTreeNode[]) => any;
|
|
19
|
+
export declare const slideNodePos: (dropNodePos: string, nodePos: string, backward?: boolean) => string;
|
|
20
|
+
export declare const getDropNodePosition: (event: React.DragEvent<HTMLDivElement>, dropNode: InternalRCNode, prevDropPositionInfo: any) => {
|
|
21
|
+
pos: string;
|
|
22
|
+
dropPosition: AddNodePosition;
|
|
23
|
+
addToEnd?: undefined;
|
|
24
|
+
} | {
|
|
25
|
+
pos: string;
|
|
26
|
+
dropPosition: AddNodePosition;
|
|
27
|
+
addToEnd: boolean;
|
|
28
|
+
};
|
|
29
|
+
export declare const isDropIndicatorNode: (node: InternalRCNode) => boolean;
|
|
30
|
+
export declare const gatherNodeKeys: (node: InternalRCNode) => string[];
|
|
31
|
+
export declare const preventNodeDragging: (event: MouseEvent<HTMLDivElement>) => void;
|
|
13
32
|
export {};
|
package/esm/RCTree/helper.js
CHANGED
|
@@ -18,27 +18,73 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
18
18
|
}
|
|
19
19
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
20
20
|
};
|
|
21
|
-
import { assocPath, intersperse, map, pipe, path, remove, split } from 'ramda';
|
|
21
|
+
import { always, assoc, assocPath, ifElse, intersperse, insert, last, map, pipe, path, remove, split } from 'ramda';
|
|
22
|
+
import { AddNodePosition } from './types';
|
|
23
|
+
var DEPTH_LEVEL_INDENT = 16;
|
|
24
|
+
var DROP_INDICATOR_NODE_KEY = '-1';
|
|
22
25
|
export var defaultIsLeaf = function (_a) {
|
|
23
26
|
var _b = _a.children, children = _b === void 0 ? [] : _b;
|
|
24
27
|
return !children.length;
|
|
25
28
|
};
|
|
26
29
|
export var convertTreeData = function (_a) {
|
|
27
|
-
var data = _a.data,
|
|
30
|
+
var data = _a.data, isLeaf = _a.isLeaf;
|
|
28
31
|
return data.map(function (item) {
|
|
29
32
|
var _a;
|
|
30
|
-
|
|
31
|
-
return __assign({ key: String(item.nodeId), title: (_a = item.title) !== null && _a !== void 0 ? _a : '', value: __assign(__assign({}, item), { path: path }), isLeaf: isLeaf(item) }, (item.children &&
|
|
33
|
+
return __assign({ key: String(item.nodeId), title: (_a = item.title) !== null && _a !== void 0 ? _a : '', value: __assign({}, item), isLeaf: isLeaf(item) }, (item.children &&
|
|
32
34
|
item.children.length && {
|
|
33
|
-
children: convertTreeData({ data: item.children,
|
|
35
|
+
children: convertTreeData({ data: item.children, isLeaf: isLeaf })
|
|
34
36
|
}));
|
|
35
37
|
});
|
|
36
38
|
};
|
|
37
39
|
var getPathFromPosition = pipe(split('-'), remove(0, 1), map(Number), intersperse('children'));
|
|
40
|
+
export var getNodeAtPosition = function (treeData, pos) {
|
|
41
|
+
var nodePath = getPathFromPosition(pos);
|
|
42
|
+
return nodePath.length > 0 ? path(nodePath, treeData) : null;
|
|
43
|
+
};
|
|
44
|
+
export var getParentPos = function (pos) {
|
|
45
|
+
return pos.split('-').slice(0, -1).join('-');
|
|
46
|
+
};
|
|
38
47
|
export var changeNodeAtPosition = function (treeData, pos, changeNode) {
|
|
39
48
|
var nodePath = getPathFromPosition(pos);
|
|
40
49
|
var node = path(nodePath, treeData);
|
|
41
|
-
return node ? assocPath(nodePath, changeNode(node), treeData) :
|
|
50
|
+
return node ? assocPath(nodePath, changeNode(node), treeData) : treeData;
|
|
51
|
+
};
|
|
52
|
+
export var removeNodeAtPosition = function (treeData, pos) {
|
|
53
|
+
var nodePath = getPathFromPosition(pos);
|
|
54
|
+
var childrenPath = nodePath.slice(0, -1);
|
|
55
|
+
var nodeIndex = Number(nodePath[nodePath.length - 1]);
|
|
56
|
+
if (childrenPath.length > 0) {
|
|
57
|
+
var children = path(childrenPath)(treeData);
|
|
58
|
+
var newChildren = remove(nodeIndex, 1, children);
|
|
59
|
+
return assocPath(childrenPath, newChildren, treeData);
|
|
60
|
+
}
|
|
61
|
+
return remove(nodeIndex, 1, treeData);
|
|
62
|
+
};
|
|
63
|
+
export var insertNodeAtPosition = function (treeData, pos, dropPosition, node) {
|
|
64
|
+
var nodePath = getPathFromPosition(pos);
|
|
65
|
+
var childrenPath = nodePath.slice(0, -1);
|
|
66
|
+
var nodeIndex = Number(nodePath[nodePath.length - 1]);
|
|
67
|
+
var newNodeIndex = dropPosition === AddNodePosition.Top ? nodeIndex : nodeIndex + 1;
|
|
68
|
+
if (childrenPath.length > 0) {
|
|
69
|
+
var children = path(childrenPath, treeData);
|
|
70
|
+
if (!children)
|
|
71
|
+
return treeData;
|
|
72
|
+
var newChildren = insert(newNodeIndex, node, children);
|
|
73
|
+
return assocPath(childrenPath, newChildren, treeData);
|
|
74
|
+
}
|
|
75
|
+
return insert(newNodeIndex, node, treeData);
|
|
76
|
+
};
|
|
77
|
+
export var moveNode = function (treeData, dragNode, dragNodePos, dropPositionInfo) {
|
|
78
|
+
var pos = dropPositionInfo.pos, dropPosition = dropPositionInfo.dropPosition, _a = dropPositionInfo.addToEnd, addToEnd = _a === void 0 ? false : _a;
|
|
79
|
+
var removeNode = function (treeData) { return removeNodeAtPosition(treeData, dragNodePos); };
|
|
80
|
+
var addNode = function (treeData) {
|
|
81
|
+
return dropPosition === AddNodePosition.AsChild
|
|
82
|
+
? changeNodeAtPosition(treeData, pos, function (node) {
|
|
83
|
+
return pipe(ifElse(always(addToEnd), assoc('children', __spreadArray(__spreadArray([], (node.children || []), true), [dragNode], false)), assoc('children', __spreadArray([dragNode], (node.children || []), true))), assoc('expanded', true))(node);
|
|
84
|
+
})
|
|
85
|
+
: insertNodeAtPosition(treeData, pos, dropPosition, dragNode);
|
|
86
|
+
};
|
|
87
|
+
return pipe(removeNode, addNode)(treeData);
|
|
42
88
|
};
|
|
43
89
|
export var getExpandedKeys = function (nodes) {
|
|
44
90
|
if (nodes === void 0) { nodes = []; }
|
|
@@ -46,3 +92,102 @@ export var getExpandedKeys = function (nodes) {
|
|
|
46
92
|
return expandedKeys.concat(node.expanded ? [String(node.nodeId)] : []).concat(getExpandedKeys(node.children));
|
|
47
93
|
}, []);
|
|
48
94
|
};
|
|
95
|
+
export var slideNodePos = function (dropNodePos, nodePos, backward) {
|
|
96
|
+
if (backward === void 0) { backward = false; }
|
|
97
|
+
var nodePosition = nodePos.split('-');
|
|
98
|
+
var nodeDepth = nodePosition.length - 1;
|
|
99
|
+
var nodeParentPosition = nodePosition.slice(0, -1);
|
|
100
|
+
var nodeParentPos = nodeParentPosition.join('-');
|
|
101
|
+
var dropNodePosition = dropNodePos.split('-');
|
|
102
|
+
if (dropNodePos.startsWith(nodeParentPos)) {
|
|
103
|
+
var nodeLastIndex = Number(last(nodePosition));
|
|
104
|
+
var dropNodeIndexToChange = Number(dropNodePosition[nodeDepth]);
|
|
105
|
+
if (backward) {
|
|
106
|
+
if (nodeLastIndex < dropNodeIndexToChange) {
|
|
107
|
+
return dropNodePos.replace([nodeParentPos, dropNodeIndexToChange].join('-'), [nodeParentPos, dropNodeIndexToChange - 1].join('-'));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
if (nodeLastIndex <= dropNodeIndexToChange) {
|
|
112
|
+
return dropNodePos.replace([nodeParentPos, dropNodeIndexToChange].join('-'), [nodeParentPos, dropNodeIndexToChange + 1].join('-'));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return dropNodePos;
|
|
117
|
+
};
|
|
118
|
+
var getNodeTopElement = function (target) {
|
|
119
|
+
return target.closest('.rc-tree-treenode');
|
|
120
|
+
};
|
|
121
|
+
var calcAddNodePosition = function (event) {
|
|
122
|
+
var nodeElement = getNodeTopElement(event.target);
|
|
123
|
+
if (!nodeElement)
|
|
124
|
+
return null;
|
|
125
|
+
var offsetY = event.clientY - nodeElement.getBoundingClientRect().top;
|
|
126
|
+
var treeNodeHeight = nodeElement.offsetHeight;
|
|
127
|
+
return offsetY < treeNodeHeight / 2 ? AddNodePosition.Top : AddNodePosition.Bottom;
|
|
128
|
+
};
|
|
129
|
+
var findDepthPosition = function (event, dropNode) {
|
|
130
|
+
var nodeElement = getNodeTopElement(event.target);
|
|
131
|
+
if (!nodeElement)
|
|
132
|
+
return null;
|
|
133
|
+
var dropNodeLevel = dropNode.pos.split('-').length - 1;
|
|
134
|
+
var leftPadding = parseFloat(window.getComputedStyle(nodeElement).paddingLeft) || 0;
|
|
135
|
+
var offsetX = event.clientX - nodeElement.getBoundingClientRect().left - leftPadding;
|
|
136
|
+
return Math.min(dropNodeLevel + 1, Math.max(Math.round(offsetX / DEPTH_LEVEL_INDENT), dropNodeLevel));
|
|
137
|
+
};
|
|
138
|
+
var changePosLastIndex = function (pos, change) {
|
|
139
|
+
var position = pos.split('-');
|
|
140
|
+
var lastIndex = Number(last(position));
|
|
141
|
+
return position
|
|
142
|
+
.slice(0, -1)
|
|
143
|
+
.concat(String(change(lastIndex)))
|
|
144
|
+
.join('-');
|
|
145
|
+
};
|
|
146
|
+
var getCurrentDropNodePos = function (dropPositionInfo) {
|
|
147
|
+
switch (dropPositionInfo.dropPosition) {
|
|
148
|
+
case AddNodePosition.Top:
|
|
149
|
+
return dropPositionInfo.pos;
|
|
150
|
+
case AddNodePosition.Bottom:
|
|
151
|
+
return changePosLastIndex(dropPositionInfo.pos, function (index) { return index + 1; });
|
|
152
|
+
case AddNodePosition.AsChild:
|
|
153
|
+
return "".concat(dropPositionInfo.pos, "-0");
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
export var getDropNodePosition = function (event, dropNode, prevDropPositionInfo) {
|
|
157
|
+
var addNodePosition = calcAddNodePosition(event);
|
|
158
|
+
var depthPosition = findDepthPosition(event, dropNode);
|
|
159
|
+
if (addNodePosition === null || depthPosition === null)
|
|
160
|
+
return null;
|
|
161
|
+
var pos = !prevDropPositionInfo || prevDropPositionInfo.addToEnd
|
|
162
|
+
? dropNode.pos
|
|
163
|
+
: slideNodePos(dropNode.pos, getCurrentDropNodePos(prevDropPositionInfo), true);
|
|
164
|
+
var dropNodeDepth = pos.split('-').length - 1;
|
|
165
|
+
var position = pos.split('-');
|
|
166
|
+
var lastIndex = Number(last(position));
|
|
167
|
+
if (depthPosition === dropNodeDepth) {
|
|
168
|
+
return { pos: pos, dropPosition: addNodePosition };
|
|
169
|
+
}
|
|
170
|
+
if (addNodePosition === AddNodePosition.Top) {
|
|
171
|
+
if (lastIndex > 0) {
|
|
172
|
+
return {
|
|
173
|
+
pos: position
|
|
174
|
+
.slice(0, -1)
|
|
175
|
+
.concat(String(lastIndex - 1))
|
|
176
|
+
.join('-'),
|
|
177
|
+
dropPosition: AddNodePosition.AsChild,
|
|
178
|
+
addToEnd: true
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (position.length > 2)
|
|
182
|
+
return { pos: position.slice(0, -1).join('-'), dropPosition: AddNodePosition.AsChild, addToEnd: false };
|
|
183
|
+
return { pos: pos, dropPosition: AddNodePosition.Top };
|
|
184
|
+
}
|
|
185
|
+
return { pos: pos, dropPosition: AddNodePosition.AsChild };
|
|
186
|
+
};
|
|
187
|
+
export var isDropIndicatorNode = function (node) { return (node === null || node === void 0 ? void 0 : node.key) === DROP_INDICATOR_NODE_KEY; };
|
|
188
|
+
export var gatherNodeKeys = function (node) {
|
|
189
|
+
return node ? __spreadArray([node.key], (node.children ? node.children.flatMap(gatherNodeKeys) : []), true) : [];
|
|
190
|
+
};
|
|
191
|
+
export var preventNodeDragging = function (event) {
|
|
192
|
+
event.preventDefault();
|
|
193
|
+
};
|
package/esm/RCTree/styles.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"expandButton" | "collapseButton" | "switcherButtonWrapper" | "switcherButton" | "treeWrapper" | "@global">;
|
|
1
|
+
export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"expandButton" | "collapseButton" | "dropIndicator" | "switcherButtonWrapper" | "switcherButton" | "treeWrapper" | "dropNotAllowed" | "draggedChildrenNode" | "dragHandle" | "dragHandleDragging" | "@global">;
|