@reltio/components 1.4.1991 → 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.
Files changed (39) hide show
  1. package/cjs/HOCs/withDragHandle/styles.d.ts +1 -1
  2. package/cjs/RCTree/RCTree.d.ts +10 -4
  3. package/cjs/RCTree/RCTree.js +66 -27
  4. package/cjs/RCTree/helper.d.ts +21 -2
  5. package/cjs/RCTree/helper.js +161 -6
  6. package/cjs/RCTree/styles.d.ts +1 -1
  7. package/cjs/RCTree/styles.js +52 -23
  8. package/cjs/RCTree/types.d.ts +11 -0
  9. package/cjs/RCTree/types.js +7 -0
  10. package/cjs/RCTree/useDelayedDragEventCall.d.ts +6 -0
  11. package/cjs/RCTree/useDelayedDragEventCall.js +26 -0
  12. package/cjs/RCTree/useDnd.d.ts +47 -0
  13. package/cjs/RCTree/useDnd.js +112 -0
  14. package/cjs/RCTree/useScrollOnDrag.d.ts +6 -0
  15. package/cjs/RCTree/useScrollOnDrag.js +87 -0
  16. package/cjs/index.d.ts +1 -1
  17. package/cjs/index.js +2 -1
  18. package/cjs/test-utils/index.d.ts +1 -0
  19. package/cjs/test-utils/index.js +25 -1
  20. package/esm/HOCs/withDragHandle/styles.d.ts +1 -1
  21. package/esm/RCTree/RCTree.d.ts +10 -4
  22. package/esm/RCTree/RCTree.js +67 -28
  23. package/esm/RCTree/helper.d.ts +21 -2
  24. package/esm/RCTree/helper.js +151 -6
  25. package/esm/RCTree/styles.d.ts +1 -1
  26. package/esm/RCTree/styles.js +52 -23
  27. package/esm/RCTree/types.d.ts +11 -0
  28. package/esm/RCTree/types.js +6 -1
  29. package/esm/RCTree/useDelayedDragEventCall.d.ts +6 -0
  30. package/esm/RCTree/useDelayedDragEventCall.js +22 -0
  31. package/esm/RCTree/useDnd.d.ts +47 -0
  32. package/esm/RCTree/useDnd.js +108 -0
  33. package/esm/RCTree/useScrollOnDrag.d.ts +6 -0
  34. package/esm/RCTree/useScrollOnDrag.js +83 -0
  35. package/esm/index.d.ts +1 -1
  36. package/esm/index.js +1 -1
  37. package/esm/test-utils/index.d.ts +1 -0
  38. package/esm/test-utils/index.js +23 -0
  39. package/package.json +2 -2
@@ -1 +1 @@
1
- export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"dragHandleContainer" | "dragHandleVisibilityArea" | "dragHandle" | "dragIcon">;
1
+ export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"dragHandle" | "dragHandleContainer" | "dragHandleVisibilityArea" | "dragIcon">;
@@ -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
- canDrop?: (params: unknown) => boolean;
10
- onLoadChildren?: (treeNode: unknown) => Promise<void>;
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 {};
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
2
13
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
14
  if (k2 === undefined) k2 = k;
4
15
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -31,47 +42,75 @@ var classnames_1 = __importDefault(require("classnames"));
31
42
  var ramda_1 = require("ramda");
32
43
  var rc_tree_1 = __importDefault(require("rc-tree"));
33
44
  var react_1 = __importStar(require("react"));
45
+ var DragIndicator_1 = __importDefault(require("@mui/icons-material/DragIndicator"));
34
46
  var DefaultSwitchRenderer_1 = require("./DefaultSwitchRenderer");
35
47
  var helper_1 = require("./helper");
48
+ var useDnd_1 = require("./useDnd");
36
49
  var styles_1 = require("./styles");
37
50
  var MIN_ROW_HEIGHT = 28;
38
51
  var RCTree = function (_a) {
39
- var treeData = _a.treeData, _b = _a.isVirtualized, isVirtualized = _b === void 0 ? true : _b, _c = _a.canDrag, canDrag = _c === void 0 ? false : _c, _d = _a.canDrop, canDrop = _d === void 0 ? function () { return false; } : _d, onLoadChildren = _a.onLoadChildren, height = _a.height, _e = _a.defaultExpandAll, defaultExpandAll = _e === void 0 ? false : _e, _f = _a.SwitchRenderer, SwitchRenderer = _f === void 0 ? DefaultSwitchRenderer_1.DefaultSwitchRenderer : _f, className = _a.className, renderNode = _a.renderNode, _g = _a.minItemHeight, minItemHeight = _g === void 0 ? MIN_ROW_HEIGHT : _g, _h = _a.isLeaf, isLeaf = _h === void 0 ? helper_1.defaultIsLeaf : _h, scrollToNode = _a.scrollToNode, _j = _a.onChange, onChange = _j === void 0 ? ramda_1.identity : _j;
52
+ var _b;
53
+ 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_1.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 ? helper_1.defaultIsLeaf : _k, scrollToNode = _a.scrollToNode, _l = _a.onChange, onChange = _l === void 0 ? ramda_1.identity : _l;
40
54
  var styles = (0, styles_1.useStyles)();
41
- var internalTreeData = (0, react_1.useMemo)(function () { return (0, helper_1.convertTreeData)({ data: treeData, isLeaf: isLeaf }); }, [isLeaf, treeData]);
42
55
  var treeRef = (0, react_1.useRef)(null);
56
+ var containerRef = (0, react_1.useRef)(null);
57
+ var expandNode = (0, react_1.useCallback)(function (pos, expanded) {
58
+ var changeNode = (0, ramda_1.assoc)('expanded', expanded);
59
+ var newTreeData = (0, helper_1.changeNodeAtPosition)(treeData, pos, changeNode);
60
+ if (newTreeData)
61
+ onChange(newTreeData);
62
+ }, [onChange, treeData]);
63
+ var _m = (0, useDnd_1.useDnd)({
64
+ containerRef: containerRef,
65
+ treeData: treeData,
66
+ expandNode: expandNode,
67
+ onLoadChildren: onLoadChildren,
68
+ onChange: onChange,
69
+ onDrop: onDrop,
70
+ canDrop: canDrop,
71
+ canDrag: canDrag
72
+ }), treeProps = _m.treeProps, nodeDraggable = _m.nodeDraggable, dropNode = _m.dropNode, dragNode = _m.dragNode, dropPositionInfo = _m.dropPositionInfo;
43
73
  (0, react_1.useEffect)(function () {
44
74
  if (treeRef.current && scrollToNode) {
45
75
  treeRef.current.scrollTo({ key: String(scrollToNode.nodeId) });
46
76
  }
47
77
  }, [scrollToNode]);
48
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
49
- var handleDrop = function (_a) {
50
- var node = _a.node, dragNode = _a.dragNode, dragNodesKeys = _a.dragNodesKeys;
51
- // TODO: implement
52
- };
53
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
54
- var handleDragEnter = function (_a) {
55
- var event = _a.event, node = _a.node, expandedKeys = _a.expandedKeys;
56
- // TODO: implement
57
- };
58
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
59
- var dropIndicatorRender = function (_a) {
60
- var dropPosition = _a.dropPosition, dropLevelOffset = _a.dropLevelOffset, indent = _a.indent, prefixCls = _a.prefixCls, direction = _a.direction;
61
- // TODO: implement
62
- };
63
- var handleExpand = (0, react_1.useCallback)(function (_expandedKeys, data) {
64
- if (onChange) {
65
- var changeNode = (0, ramda_1.assoc)('expanded', data.expanded);
66
- var newTreeData = (0, helper_1.changeNodeAtPosition)(treeData, data.node.pos, changeNode);
67
- if (newTreeData)
68
- onChange(newTreeData);
78
+ var diplayedTreeData = (0, react_1.useMemo)(function () {
79
+ if (dropNode && dragNode) {
80
+ if (dropNode.pos === dragNode.pos && dropNode.key === dragNode.key)
81
+ return treeData;
82
+ var dragNodeValue = __assign(__assign({}, dragNode.value), { nodeId: -1 });
83
+ return (0, helper_1.moveNode)(treeData, dragNodeValue, dragNode.pos, dropPositionInfo);
69
84
  }
70
- }, [treeData, onChange]);
85
+ return treeData;
86
+ }, [treeData, dragNode, dropNode, dropPositionInfo]);
71
87
  var expandedKeys = (0, react_1.useMemo)(function () {
72
- return (0, helper_1.getExpandedKeys)(treeData);
73
- }, [treeData]);
88
+ return (0, helper_1.getExpandedKeys)(diplayedTreeData);
89
+ }, [diplayedTreeData]);
90
+ var internalTreeData = (0, react_1.useMemo)(function () { return (0, helper_1.convertTreeData)({ data: diplayedTreeData, isLeaf: isLeaf }); }, [isLeaf, diplayedTreeData]);
91
+ var handleExpand = (0, react_1.useCallback)(function (_expandedKeys, data) {
92
+ if (onChange && !dragNode) {
93
+ expandNode(data.node.pos, data.expanded);
94
+ }
95
+ }, [onChange, expandNode, dragNode]);
74
96
  var renderSwitcherIcon = (0, react_1.useCallback)(function (node) { return react_1.default.createElement(SwitchRenderer, { node: node }); }, []);
75
- return internalTreeData ? (react_1.default.createElement(rc_tree_1.default, { allowDrop: canDrop, draggable: canDrag, onDragStart: function () { }, onDragEnter: handleDragEnter, onDrop: handleDrop, virtual: isVirtualized, itemHeight: minItemHeight, height: height, onExpand: handleExpand, showIcon: false, showLine: true, expandedKeys: expandedKeys, switcherIcon: renderSwitcherIcon, defaultExpandAll: defaultExpandAll, className: (0, classnames_1.default)(className, styles.treeWrapper), titleRender: renderNode ? function (node) { return renderNode(node.value); } : undefined, treeData: internalTreeData, selectable: false, loadData: onLoadChildren ? function (node) { return onLoadChildren(node.value); } : undefined, "data-reltio-id": "rc-tree", ref: treeRef })) : null;
97
+ var titleRender = function (node) {
98
+ var _a;
99
+ var draggedNodes = (0, helper_1.gatherNodeKeys)(dragNode);
100
+ return (react_1.default.createElement("div", { className: (0, classnames_1.default)((_a = {},
101
+ _a[styles.dropIndicator] = (0, helper_1.isDropIndicatorNode)(node),
102
+ _a[styles.dropNotAllowed] = dropNode && !(0, helper_1.isDropIndicatorNode)(dropNode),
103
+ _a[styles.draggedChildrenNode] = draggedNodes.includes(node.key),
104
+ _a)), onMouseDown: helper_1.preventNodeDragging }, renderNode ? renderNode(node.value) : node.title));
105
+ };
106
+ var dragHandle = (react_1.default.createElement("span", { className: (0, classnames_1.default)(styles.dragHandle, (_b = {},
107
+ _b[styles.dragHandleDragging] = !!dragNode,
108
+ _b)) },
109
+ react_1.default.createElement(DragIndicator_1.default, null)));
110
+ return diplayedTreeData ? (react_1.default.createElement("div", { ref: containerRef },
111
+ react_1.default.createElement(rc_tree_1.default, __assign({ draggable: {
112
+ icon: dragHandle,
113
+ nodeDraggable: nodeDraggable
114
+ }, virtual: isVirtualized, itemHeight: minItemHeight, height: height, onExpand: handleExpand, showIcon: false, showLine: true, expandedKeys: expandedKeys, switcherIcon: renderSwitcherIcon, defaultExpandAll: defaultExpandAll, className: (0, classnames_1.default)(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;
76
115
  };
77
116
  exports.RCTree = RCTree;
@@ -1,4 +1,5 @@
1
- import { InternalRCNode, RCTreeNode } from './types';
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, parentPath, isLeaf }: ConvertTreeDataProps<RCTreeNode>) => InternalRCNode[];
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 {};
@@ -20,32 +20,83 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
20
20
  return to.concat(ar || Array.prototype.slice.call(from));
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.getExpandedKeys = exports.changeNodeAtPosition = exports.convertTreeData = exports.defaultIsLeaf = void 0;
23
+ exports.preventNodeDragging = exports.gatherNodeKeys = exports.isDropIndicatorNode = exports.getDropNodePosition = exports.slideNodePos = exports.getExpandedKeys = exports.moveNode = exports.insertNodeAtPosition = exports.removeNodeAtPosition = exports.changeNodeAtPosition = exports.getParentPos = exports.getNodeAtPosition = exports.convertTreeData = exports.defaultIsLeaf = void 0;
24
24
  var ramda_1 = require("ramda");
25
+ var types_1 = require("./types");
26
+ var DEPTH_LEVEL_INDENT = 16;
27
+ var DROP_INDICATOR_NODE_KEY = '-1';
25
28
  var defaultIsLeaf = function (_a) {
26
29
  var _b = _a.children, children = _b === void 0 ? [] : _b;
27
30
  return !children.length;
28
31
  };
29
32
  exports.defaultIsLeaf = defaultIsLeaf;
30
33
  var convertTreeData = function (_a) {
31
- var data = _a.data, _b = _a.parentPath, parentPath = _b === void 0 ? [] : _b, isLeaf = _a.isLeaf;
34
+ var data = _a.data, isLeaf = _a.isLeaf;
32
35
  return data.map(function (item) {
33
36
  var _a;
34
- var path = __spreadArray(__spreadArray([], parentPath, true), [item.nodeId], false);
35
- 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 &&
37
+ return __assign({ key: String(item.nodeId), title: (_a = item.title) !== null && _a !== void 0 ? _a : '', value: __assign({}, item), isLeaf: isLeaf(item) }, (item.children &&
36
38
  item.children.length && {
37
- children: (0, exports.convertTreeData)({ data: item.children, parentPath: path, isLeaf: isLeaf })
39
+ children: (0, exports.convertTreeData)({ data: item.children, isLeaf: isLeaf })
38
40
  }));
39
41
  });
40
42
  };
41
43
  exports.convertTreeData = convertTreeData;
42
44
  var getPathFromPosition = (0, ramda_1.pipe)((0, ramda_1.split)('-'), (0, ramda_1.remove)(0, 1), (0, ramda_1.map)(Number), (0, ramda_1.intersperse)('children'));
45
+ var getNodeAtPosition = function (treeData, pos) {
46
+ var nodePath = getPathFromPosition(pos);
47
+ return nodePath.length > 0 ? (0, ramda_1.path)(nodePath, treeData) : null;
48
+ };
49
+ exports.getNodeAtPosition = getNodeAtPosition;
50
+ var getParentPos = function (pos) {
51
+ return pos.split('-').slice(0, -1).join('-');
52
+ };
53
+ exports.getParentPos = getParentPos;
43
54
  var changeNodeAtPosition = function (treeData, pos, changeNode) {
44
55
  var nodePath = getPathFromPosition(pos);
45
56
  var node = (0, ramda_1.path)(nodePath, treeData);
46
- return node ? (0, ramda_1.assocPath)(nodePath, changeNode(node), treeData) : null;
57
+ return node ? (0, ramda_1.assocPath)(nodePath, changeNode(node), treeData) : treeData;
47
58
  };
48
59
  exports.changeNodeAtPosition = changeNodeAtPosition;
60
+ var removeNodeAtPosition = function (treeData, pos) {
61
+ var nodePath = getPathFromPosition(pos);
62
+ var childrenPath = nodePath.slice(0, -1);
63
+ var nodeIndex = Number(nodePath[nodePath.length - 1]);
64
+ if (childrenPath.length > 0) {
65
+ var children = (0, ramda_1.path)(childrenPath)(treeData);
66
+ var newChildren = (0, ramda_1.remove)(nodeIndex, 1, children);
67
+ return (0, ramda_1.assocPath)(childrenPath, newChildren, treeData);
68
+ }
69
+ return (0, ramda_1.remove)(nodeIndex, 1, treeData);
70
+ };
71
+ exports.removeNodeAtPosition = removeNodeAtPosition;
72
+ var insertNodeAtPosition = function (treeData, pos, dropPosition, node) {
73
+ var nodePath = getPathFromPosition(pos);
74
+ var childrenPath = nodePath.slice(0, -1);
75
+ var nodeIndex = Number(nodePath[nodePath.length - 1]);
76
+ var newNodeIndex = dropPosition === types_1.AddNodePosition.Top ? nodeIndex : nodeIndex + 1;
77
+ if (childrenPath.length > 0) {
78
+ var children = (0, ramda_1.path)(childrenPath, treeData);
79
+ if (!children)
80
+ return treeData;
81
+ var newChildren = (0, ramda_1.insert)(newNodeIndex, node, children);
82
+ return (0, ramda_1.assocPath)(childrenPath, newChildren, treeData);
83
+ }
84
+ return (0, ramda_1.insert)(newNodeIndex, node, treeData);
85
+ };
86
+ exports.insertNodeAtPosition = insertNodeAtPosition;
87
+ var moveNode = function (treeData, dragNode, dragNodePos, dropPositionInfo) {
88
+ var pos = dropPositionInfo.pos, dropPosition = dropPositionInfo.dropPosition, _a = dropPositionInfo.addToEnd, addToEnd = _a === void 0 ? false : _a;
89
+ var removeNode = function (treeData) { return (0, exports.removeNodeAtPosition)(treeData, dragNodePos); };
90
+ var addNode = function (treeData) {
91
+ return dropPosition === types_1.AddNodePosition.AsChild
92
+ ? (0, exports.changeNodeAtPosition)(treeData, pos, function (node) {
93
+ return (0, ramda_1.pipe)((0, ramda_1.ifElse)((0, ramda_1.always)(addToEnd), (0, ramda_1.assoc)('children', __spreadArray(__spreadArray([], (node.children || []), true), [dragNode], false)), (0, ramda_1.assoc)('children', __spreadArray([dragNode], (node.children || []), true))), (0, ramda_1.assoc)('expanded', true))(node);
94
+ })
95
+ : (0, exports.insertNodeAtPosition)(treeData, pos, dropPosition, dragNode);
96
+ };
97
+ return (0, ramda_1.pipe)(removeNode, addNode)(treeData);
98
+ };
99
+ exports.moveNode = moveNode;
49
100
  var getExpandedKeys = function (nodes) {
50
101
  if (nodes === void 0) { nodes = []; }
51
102
  return nodes.reduce(function (expandedKeys, node) {
@@ -53,3 +104,107 @@ var getExpandedKeys = function (nodes) {
53
104
  }, []);
54
105
  };
55
106
  exports.getExpandedKeys = getExpandedKeys;
107
+ var slideNodePos = function (dropNodePos, nodePos, backward) {
108
+ if (backward === void 0) { backward = false; }
109
+ var nodePosition = nodePos.split('-');
110
+ var nodeDepth = nodePosition.length - 1;
111
+ var nodeParentPosition = nodePosition.slice(0, -1);
112
+ var nodeParentPos = nodeParentPosition.join('-');
113
+ var dropNodePosition = dropNodePos.split('-');
114
+ if (dropNodePos.startsWith(nodeParentPos)) {
115
+ var nodeLastIndex = Number((0, ramda_1.last)(nodePosition));
116
+ var dropNodeIndexToChange = Number(dropNodePosition[nodeDepth]);
117
+ if (backward) {
118
+ if (nodeLastIndex < dropNodeIndexToChange) {
119
+ return dropNodePos.replace([nodeParentPos, dropNodeIndexToChange].join('-'), [nodeParentPos, dropNodeIndexToChange - 1].join('-'));
120
+ }
121
+ }
122
+ else {
123
+ if (nodeLastIndex <= dropNodeIndexToChange) {
124
+ return dropNodePos.replace([nodeParentPos, dropNodeIndexToChange].join('-'), [nodeParentPos, dropNodeIndexToChange + 1].join('-'));
125
+ }
126
+ }
127
+ }
128
+ return dropNodePos;
129
+ };
130
+ exports.slideNodePos = slideNodePos;
131
+ var getNodeTopElement = function (target) {
132
+ return target.closest('.rc-tree-treenode');
133
+ };
134
+ var calcAddNodePosition = function (event) {
135
+ var nodeElement = getNodeTopElement(event.target);
136
+ if (!nodeElement)
137
+ return null;
138
+ var offsetY = event.clientY - nodeElement.getBoundingClientRect().top;
139
+ var treeNodeHeight = nodeElement.offsetHeight;
140
+ return offsetY < treeNodeHeight / 2 ? types_1.AddNodePosition.Top : types_1.AddNodePosition.Bottom;
141
+ };
142
+ var findDepthPosition = function (event, dropNode) {
143
+ var nodeElement = getNodeTopElement(event.target);
144
+ if (!nodeElement)
145
+ return null;
146
+ var dropNodeLevel = dropNode.pos.split('-').length - 1;
147
+ var leftPadding = parseFloat(window.getComputedStyle(nodeElement).paddingLeft) || 0;
148
+ var offsetX = event.clientX - nodeElement.getBoundingClientRect().left - leftPadding;
149
+ return Math.min(dropNodeLevel + 1, Math.max(Math.round(offsetX / DEPTH_LEVEL_INDENT), dropNodeLevel));
150
+ };
151
+ var changePosLastIndex = function (pos, change) {
152
+ var position = pos.split('-');
153
+ var lastIndex = Number((0, ramda_1.last)(position));
154
+ return position
155
+ .slice(0, -1)
156
+ .concat(String(change(lastIndex)))
157
+ .join('-');
158
+ };
159
+ var getCurrentDropNodePos = function (dropPositionInfo) {
160
+ switch (dropPositionInfo.dropPosition) {
161
+ case types_1.AddNodePosition.Top:
162
+ return dropPositionInfo.pos;
163
+ case types_1.AddNodePosition.Bottom:
164
+ return changePosLastIndex(dropPositionInfo.pos, function (index) { return index + 1; });
165
+ case types_1.AddNodePosition.AsChild:
166
+ return "".concat(dropPositionInfo.pos, "-0");
167
+ }
168
+ };
169
+ var getDropNodePosition = function (event, dropNode, prevDropPositionInfo) {
170
+ var addNodePosition = calcAddNodePosition(event);
171
+ var depthPosition = findDepthPosition(event, dropNode);
172
+ if (addNodePosition === null || depthPosition === null)
173
+ return null;
174
+ var pos = !prevDropPositionInfo || prevDropPositionInfo.addToEnd
175
+ ? dropNode.pos
176
+ : (0, exports.slideNodePos)(dropNode.pos, getCurrentDropNodePos(prevDropPositionInfo), true);
177
+ var dropNodeDepth = pos.split('-').length - 1;
178
+ var position = pos.split('-');
179
+ var lastIndex = Number((0, ramda_1.last)(position));
180
+ if (depthPosition === dropNodeDepth) {
181
+ return { pos: pos, dropPosition: addNodePosition };
182
+ }
183
+ if (addNodePosition === types_1.AddNodePosition.Top) {
184
+ if (lastIndex > 0) {
185
+ return {
186
+ pos: position
187
+ .slice(0, -1)
188
+ .concat(String(lastIndex - 1))
189
+ .join('-'),
190
+ dropPosition: types_1.AddNodePosition.AsChild,
191
+ addToEnd: true
192
+ };
193
+ }
194
+ if (position.length > 2)
195
+ return { pos: position.slice(0, -1).join('-'), dropPosition: types_1.AddNodePosition.AsChild, addToEnd: false };
196
+ return { pos: pos, dropPosition: types_1.AddNodePosition.Top };
197
+ }
198
+ return { pos: pos, dropPosition: types_1.AddNodePosition.AsChild };
199
+ };
200
+ exports.getDropNodePosition = getDropNodePosition;
201
+ var isDropIndicatorNode = function (node) { return (node === null || node === void 0 ? void 0 : node.key) === DROP_INDICATOR_NODE_KEY; };
202
+ exports.isDropIndicatorNode = isDropIndicatorNode;
203
+ var gatherNodeKeys = function (node) {
204
+ return node ? __spreadArray([node.key], (node.children ? node.children.flatMap(exports.gatherNodeKeys) : []), true) : [];
205
+ };
206
+ exports.gatherNodeKeys = gatherNodeKeys;
207
+ var preventNodeDragging = function (event) {
208
+ event.preventDefault();
209
+ };
210
+ exports.preventNodeDragging = preventNodeDragging;
@@ -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">;
@@ -2,12 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useStyles = void 0;
4
4
  var styles_1 = require("@mui/styles");
5
- exports.useStyles = (0, styles_1.makeStyles)(function () { return ({
5
+ exports.useStyles = (0, styles_1.makeStyles)(function (theme) { return ({
6
6
  switcherButtonWrapper: {
7
- paddingTop: '9px',
8
- paddingLeft: '6px',
9
- width: '16px',
10
- height: '16px',
7
+ paddingTop: '11px',
8
+ paddingLeft: '4px',
9
+ width: '12px',
10
+ height: '12px',
11
11
  cursor: 'pointer'
12
12
  },
13
13
  switcherButton: {
@@ -27,6 +27,39 @@ exports.useStyles = (0, styles_1.makeStyles)(function () { return ({
27
27
  treeWrapper: {
28
28
  border: 'none'
29
29
  },
30
+ dropIndicator: {
31
+ '&:before': {
32
+ content: '""',
33
+ backgroundColor: '#e0eef9',
34
+ border: '1px dashed #2184D4',
35
+ position: 'absolute',
36
+ top: 0,
37
+ right: '23px',
38
+ bottom: 0,
39
+ left: '-22px',
40
+ zIndex: 1
41
+ },
42
+ '&>div': {
43
+ opacity: 0
44
+ }
45
+ },
46
+ dropNotAllowed: {
47
+ '&:before': {
48
+ backgroundColor: '#ffedee',
49
+ borderColor: '#FF6673'
50
+ }
51
+ },
52
+ draggedChildrenNode: {
53
+ opacity: 0.5
54
+ },
55
+ dragHandle: {
56
+ cursor: 'move',
57
+ color: theme.palette.text.secondary,
58
+ width: '16px'
59
+ },
60
+ dragHandleDragging: {
61
+ visibility: 'hidden'
62
+ },
30
63
  /* rc-tree/assets/index.css */
31
64
  '@global': {
32
65
  '.rc-tree': {
@@ -52,12 +85,6 @@ exports.useStyles = (0, styles_1.makeStyles)(function () { return ({
52
85
  boxShadow: 'inset 0 0 0 2px red',
53
86
  content: "''"
54
87
  },
55
- '.rc-tree .rc-tree-treenode.drop-container ~ .rc-tree-treenode': {
56
- borderLeft: '2px solid chocolate'
57
- },
58
- '.rc-tree .rc-tree-treenode.drop-target': {
59
- backgroundColor: 'yellowgreen'
60
- },
61
88
  '.rc-tree .rc-tree-treenode.drop-target ~ .rc-tree-treenode': {
62
89
  borderLeft: 'none'
63
90
  },
@@ -155,11 +182,6 @@ exports.useStyles = (0, styles_1.makeStyles)(function () { return ({
155
182
  '.rc-tree-treenode-active': {
156
183
  background: 'rgba(0, 0, 0, 0.1)'
157
184
  },
158
- '.rc-tree-node-selected': {
159
- backgroundColor: '#ffe6b0',
160
- boxShadow: '0 0 0 1px #ffb951',
161
- opacity: 0.8
162
- },
163
185
  '.rc-tree-icon__open': {
164
186
  marginRight: '2px',
165
187
  verticalAlign: 'top',
@@ -188,11 +210,6 @@ exports.useStyles = (0, styles_1.makeStyles)(function () { return ({
188
210
  display: 'inline-block',
189
211
  width: '16px'
190
212
  },
191
- '.rc-tree-draggable-icon': {
192
- display: 'inline-flex',
193
- justifyContent: 'center',
194
- width: '16px'
195
- },
196
213
  //Custom styles
197
214
  '.rc-tree .rc-tree-treenode .rc-tree-node-content-wrapper': {
198
215
  position: 'relative',
@@ -203,8 +220,8 @@ exports.useStyles = (0, styles_1.makeStyles)(function () { return ({
203
220
  verticalAlign: 'top',
204
221
  cursor: 'pointer',
205
222
  height: 'auto',
206
- width: '100%',
207
- paddingRight: '11px'
223
+ paddingRight: '11px',
224
+ flexGrow: 1
208
225
  },
209
226
  '.rc-tree .rc-tree-treenode': {
210
227
  margin: 0,
@@ -225,6 +242,18 @@ exports.useStyles = (0, styles_1.makeStyles)(function () { return ({
225
242
  '.rc-tree-title': {
226
243
  display: 'inline-block',
227
244
  width: '100%'
245
+ },
246
+ '.rc-tree-draggable-icon': {
247
+ display: 'inline-flex',
248
+ justifyContent: 'center',
249
+ width: '16px',
250
+ visibility: 'hidden'
251
+ },
252
+ '.rc-tree-treenode-draggable:hover .rc-tree-draggable-icon': {
253
+ visibility: 'visible'
254
+ },
255
+ '.rc-tree-switcher-noop': {
256
+ width: '16px'
228
257
  }
229
258
  }
230
259
  }); });
@@ -7,7 +7,18 @@ export type RCTreeNode = {
7
7
  };
8
8
  export type InternalRCNode = {
9
9
  value: RCTreeNode;
10
+ pos?: string;
10
11
  } & FieldDataNode<{
11
12
  key: string;
12
13
  title?: string;
13
14
  }>;
15
+ export type DropPositionInfo = {
16
+ pos: string;
17
+ dropPosition: number;
18
+ addToEnd?: boolean;
19
+ };
20
+ export declare enum AddNodePosition {
21
+ Bottom = 1,
22
+ Top = -1,
23
+ AsChild = 0
24
+ }
@@ -1,2 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AddNodePosition = void 0;
4
+ var AddNodePosition;
5
+ (function (AddNodePosition) {
6
+ AddNodePosition[AddNodePosition["Bottom"] = 1] = "Bottom";
7
+ AddNodePosition[AddNodePosition["Top"] = -1] = "Top";
8
+ AddNodePosition[AddNodePosition["AsChild"] = 0] = "AsChild";
9
+ })(AddNodePosition || (exports.AddNodePosition = AddNodePosition = {}));
@@ -0,0 +1,6 @@
1
+ import { DragEvent } from 'react';
2
+ import { InternalRCNode } from './types';
3
+ export declare const useDelayedDragEventCall: (callback: (params: {
4
+ event: DragEvent<HTMLDivElement>;
5
+ node: InternalRCNode;
6
+ }) => void, delay?: number) => ({ event, node }: any) => void;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useDelayedDragEventCall = void 0;
4
+ var react_1 = require("react");
5
+ var ramda_1 = require("ramda");
6
+ var DELAY_TIMEOUT = 50;
7
+ var useDelayedDragEventCall = function (callback, delay) {
8
+ if (delay === void 0) { delay = DELAY_TIMEOUT; }
9
+ var prevMousePosition = (0, react_1.useRef)(null);
10
+ var lastTimeChanged = (0, react_1.useRef)(0);
11
+ return (0, react_1.useCallback)(function (_a) {
12
+ var event = _a.event, node = _a.node;
13
+ var now = Date.now();
14
+ var newMousePosition = { x: event.clientX, y: event.clientY };
15
+ if (!(0, ramda_1.equals)(prevMousePosition === null || prevMousePosition === void 0 ? void 0 : prevMousePosition.current, newMousePosition)) {
16
+ lastTimeChanged.current = now;
17
+ }
18
+ var waitedTime = now - (lastTimeChanged === null || lastTimeChanged === void 0 ? void 0 : lastTimeChanged.current);
19
+ if (waitedTime > delay) {
20
+ lastTimeChanged.current = now;
21
+ callback({ event: event, node: node });
22
+ }
23
+ prevMousePosition.current = newMousePosition;
24
+ }, [callback, delay]);
25
+ };
26
+ exports.useDelayedDragEventCall = useDelayedDragEventCall;
@@ -0,0 +1,47 @@
1
+ import { DragEvent } from 'react';
2
+ import { InternalRCNode, RCTreeNode } from './types';
3
+ type Props = {
4
+ treeData: RCTreeNode[];
5
+ containerRef: React.RefObject<HTMLDivElement>;
6
+ expandNode: (pos: string, expanded: boolean) => void;
7
+ onLoadChildren?: (treeNode: RCTreeNode) => Promise<void>;
8
+ onChange?: (node: RCTreeNode[]) => void;
9
+ onDrop?: (treeData: RCTreeNode[], dragNode: RCTreeNode, parentNode: RCTreeNode) => void;
10
+ canDrop?: (params: {
11
+ nextParent: RCTreeNode;
12
+ node: RCTreeNode;
13
+ }) => boolean;
14
+ canDrag?: (params: {
15
+ node: RCTreeNode;
16
+ }) => boolean;
17
+ };
18
+ export declare const useDnd: ({ treeData, containerRef, expandNode, onLoadChildren, onChange, onDrop: onDropProp, canDrop, canDrag }: Props) => {
19
+ treeProps: {
20
+ onDragStart: ({ node }: {
21
+ node: InternalRCNode;
22
+ }) => void;
23
+ onDragOver: ({ event, node }: {
24
+ event: DragEvent<HTMLDivElement>;
25
+ node: InternalRCNode;
26
+ }) => void;
27
+ onDragLeave: ({ event, node }: {
28
+ event: any;
29
+ node: any;
30
+ }) => void;
31
+ onDrop: () => void;
32
+ dropIndicatorRender: () => any;
33
+ allowDrop: ({ dragNode, dropNode }: {
34
+ dragNode: InternalRCNode;
35
+ dropNode: InternalRCNode;
36
+ }) => boolean;
37
+ };
38
+ nodeDraggable: (node: InternalRCNode) => boolean;
39
+ dropNode: InternalRCNode;
40
+ dragNode: InternalRCNode;
41
+ dropPositionInfo: {
42
+ pos: string;
43
+ dropPosition: number;
44
+ addToEnd?: boolean;
45
+ };
46
+ };
47
+ export {};