@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
@@ -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,6 @@
1
+ import React from 'react';
2
+ export declare const useScrollOnDrag: (scrollContainer: React.MutableRefObject<HTMLDivElement>) => {
3
+ onStartDragging: () => void;
4
+ onEndDragging: () => void;
5
+ getIsScrolling: () => boolean;
6
+ };
@@ -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;
package/cjs/index.d.ts CHANGED
@@ -284,7 +284,7 @@ export * from './types';
284
284
  export * from './constants';
285
285
  export { TestPerspectivesSettingsProvider } from './test-utils/TestPerspectiveSettingsProvider';
286
286
  export { TestStylesProvider } from './test-utils/TestStylesProvider';
287
- export { awaitMockPromises, deepFreeze, delayPromise, getMuiIconByName, getMuiIconsByName, mockBasicTableSizing, fixClicksOnResizablePanes, mockElementSizes, rerenderWrapper, FakeMouseEvent } from './test-utils';
287
+ export { awaitMockPromises, deepFreeze, delayPromise, getMuiIconByName, getMuiIconsByName, mockBasicTableSizing, fixClicksOnResizablePanes, mockElementSizes, rerenderWrapper, FakeMouseEvent, mockComputedStyles } from './test-utils';
288
288
  export * from './features/activity-log';
289
289
  export * from './features/crosswalks';
290
290
  export * from './features/graph';
package/cjs/index.js CHANGED
@@ -20,7 +20,7 @@ exports.MultipleInput = exports.ModeSwitcherSelect = exports.ModeSwitcher = expo
20
20
  exports.PopupBoundariesContext = exports.HistoryDiffContext = exports.AsyncMountContext = exports.MdmModuleProvider = exports.withTableContext = exports.withFilterAtBottom = exports.withPercents = exports.withContext = exports.withDateRangeSelector = exports.withDragHandle = exports.withAsyncMount = exports.withTooltip = exports.MetadataTypesSelector = exports.DateRangeSelector = exports.UpSetChart = exports.GaugeChart = exports.RelationEditor = exports.ReltioMap = exports.Marginator = exports.LightArrowTooltip = exports.ScrollableTabs = exports.VirtualGroupedList = exports.ViewMoreToggle = exports.VerticalHeadingsTable = exports.VerticalDivider = exports.AttributeTitle = exports.Spacer = exports.SimpleDropDownSelector = exports.SidePanelContentHeader = exports.SidePanel = exports.SidePanelEmptyState = exports.SideButtonsPanel = exports.SelectorWithOnlyOptionAutoSelect = exports.SelectionPopup = exports.WhiteSearchInput = exports.SearchInput = exports.ProfileResizablePanes = exports.ResizablePanes = exports.ReltioGridLayout = exports.RCTree = exports.reactSortableTreeHelpers = exports.ReactSortableTree = exports.MultiSelect = exports.QueryBuilderRowsGroup = exports.QueryBuilderRow = exports.ProfileCard = exports.ProfileBand = exports.PotentialMatchReviewCard = exports.PopupWithArrow = exports.Popper = void 0;
21
21
  exports.useReloadData = exports.ReloadDataProvider = exports.useAttributeValueConfigPermissions = exports.ConfigPermissionsContextProvider = exports.ConfigPermissionsContext = exports.useActionsHook = exports.ActionsHookProvider = exports.PageRequestsAbortingContext = exports.DependentLookupAutopopulationContext = exports.FeaturesContext = exports.LabelsContext = exports.UrlGeneratorsContext = exports.isHighlightedAttributeType = exports.isHighlightedErrorType = exports.ScrollType = exports.ScrollToElementProvider = exports.ScrollToElementContext = exports.SearchValueContext = exports.InterceptHandlersContext = exports.HighlightedValuesContext = exports.SnackbarContext = exports.SearchFiltersContext = exports.useReloadFacet = exports.ReloadFacetProvider = exports.useReloadAllFacets = exports.SandboxAPIContext = exports.EntityContext = exports.RelatedObjectUrisContext = exports.WorkflowTasksContext = exports.useEntityLoadingIndication = exports.EntityLoadingIndicationProvider = exports.EntityMarkerContext = exports.useAttributeExpanded = exports.ExpandedAttributesProvider = exports.useHighlightedCrosswalks = exports.useCrosswalkHighlight = exports.useCrosswalkFocus = exports.useCrosswalkColor = exports.CrosswalksDisplayProvider = exports.EntitiesMapContext = exports.IdContext = exports.ProfilePerspectiveViewContext = exports.usePerspectivesSettings = exports.PerspectivesSettingsContext = exports.PivotingAttributeContext = exports.UsersContext = exports.InitialCollaborationContextValue = exports.CollaborationContextProvider = exports.CollaborationContext = exports.BlockImageGalleryDialogContext = void 0;
22
22
  exports.useMarkers = exports.useMaskedAttribute = exports.useKeyboardNavigation = exports.useDynamicRowCellHeight = exports.useClickableStyle = exports.BasicTableCellRenderer = exports.useBasicTableCellRenderer = exports.useHiddenAttributes = exports.useSavedSearchesRequest = exports.useRequestDCRReview = exports.useAutoFocus = exports.useExpandInvalidRelations = exports.useLayoutResetter = exports.useIsMountedRef = exports.useSnackbar = exports.useSavedStateForEntityType = exports.useReadableSearchState = exports.useEditableConnection = exports.useCustomScripts = exports.useMarkAsNotMatchRequest = exports.useMergeAllRequest = exports.usePagingSimulator = exports.useMatchesLoader = exports.useConfigPermissions = exports.useWhyDidYouUpdate = exports.useUsers = exports.useSavedState = exports.useSafePromise = exports.useRunOnceAfterValueInitialization = exports.useRelationsLoader = exports.useRelationTypeSelector = exports.usePrevious = exports.useDidUpdateEffect = exports.useCommentsEntitiesMap = exports.useCollaboration = exports.useAsyncMount = exports.useAPI = exports.useActions = exports.useMatchesColumnsData = exports.useScrollToAttributeError = exports.ProfileTablesContext = exports.HiddenAttributesContext = exports.BasicTableContext = exports.BasicTableRowCollapseContext = exports.useDeleteUnmaskedAttributeForRelation = exports.useUnmaskedAttributeValue = exports.useUnmaskAttributeValue = exports.useMaskAttributeValue = exports.MaskedAttributesProvider = exports.SegmentationContext = void 0;
23
- exports.FakeMouseEvent = exports.rerenderWrapper = exports.mockElementSizes = exports.fixClicksOnResizablePanes = exports.mockBasicTableSizing = exports.getMuiIconsByName = exports.getMuiIconByName = exports.delayPromise = exports.deepFreeze = exports.awaitMockPromises = exports.TestStylesProvider = exports.TestPerspectivesSettingsProvider = exports.getAttributeSelectorItems = exports.mergeClasses = exports.isControlOrCommandPressed = exports.getValue = exports.getChecked = exports.showErrorMessage = exports.showDefaultErrorMessage = exports.enrichDataWithPercents = exports.defaultRenderRowCell = exports.defaultGetRowCellHeight = exports.columnFilterToMdmFilter = exports.buildColumnsSizeById = exports.buildColumnsFilter = exports.useFilterAutoFocus = exports.useSegmentationRequest = exports.resolveMarkers = void 0;
23
+ exports.mockComputedStyles = exports.FakeMouseEvent = exports.rerenderWrapper = exports.mockElementSizes = exports.fixClicksOnResizablePanes = exports.mockBasicTableSizing = exports.getMuiIconsByName = exports.getMuiIconByName = exports.delayPromise = exports.deepFreeze = exports.awaitMockPromises = exports.TestStylesProvider = exports.TestPerspectivesSettingsProvider = exports.getAttributeSelectorItems = exports.mergeClasses = exports.isControlOrCommandPressed = exports.getValue = exports.getChecked = exports.showErrorMessage = exports.showDefaultErrorMessage = exports.enrichDataWithPercents = exports.defaultRenderRowCell = exports.defaultGetRowCellHeight = exports.columnFilterToMdmFilter = exports.buildColumnsSizeById = exports.buildColumnsFilter = exports.useFilterAutoFocus = exports.useSegmentationRequest = exports.resolveMarkers = void 0;
24
24
  // components
25
25
  var ActionButton_1 = require("./ActionButton");
26
26
  Object.defineProperty(exports, "ActionButton", { enumerable: true, get: function () { return ActionButton_1.ActionButton; } });
@@ -639,6 +639,7 @@ Object.defineProperty(exports, "fixClicksOnResizablePanes", { enumerable: true,
639
639
  Object.defineProperty(exports, "mockElementSizes", { enumerable: true, get: function () { return test_utils_1.mockElementSizes; } });
640
640
  Object.defineProperty(exports, "rerenderWrapper", { enumerable: true, get: function () { return test_utils_1.rerenderWrapper; } });
641
641
  Object.defineProperty(exports, "FakeMouseEvent", { enumerable: true, get: function () { return test_utils_1.FakeMouseEvent; } });
642
+ Object.defineProperty(exports, "mockComputedStyles", { enumerable: true, get: function () { return test_utils_1.mockComputedStyles; } });
642
643
  // features / activity-log
643
644
  __exportStar(require("./features/activity-log"), exports);
644
645
  // features / crosswalks
@@ -11,6 +11,7 @@ export declare const mockElementSizes: (element?: HTMLElement, defaults?: {
11
11
  mock: () => void;
12
12
  unmock: () => void;
13
13
  };
14
+ export declare const mockComputedStyles: (styles?: {}) => () => void;
14
15
  export declare const mockBasicTableSizing: ({ width, height }?: {
15
16
  width?: number;
16
17
  height?: number;
@@ -14,6 +14,17 @@ var __extends = (this && this.__extends) || (function () {
14
14
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
15
  };
16
16
  })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
17
28
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
29
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
30
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -62,7 +73,7 @@ var __rest = (this && this.__rest) || function (s, e) {
62
73
  return t;
63
74
  };
64
75
  Object.defineProperty(exports, "__esModule", { value: true });
65
- exports.FakeMouseEvent = exports.getMuiIconsByName = exports.getMuiIconByName = exports.fixClicksOnResizablePanes = exports.mockBasicTableSizing = exports.mockElementSizes = exports.rerenderWrapper = exports.deepFreeze = exports.awaitMockPromises = exports.delayPromise = void 0;
76
+ exports.FakeMouseEvent = exports.getMuiIconsByName = exports.getMuiIconByName = exports.fixClicksOnResizablePanes = exports.mockBasicTableSizing = exports.mockComputedStyles = exports.mockElementSizes = exports.rerenderWrapper = exports.deepFreeze = exports.awaitMockPromises = exports.delayPromise = void 0;
66
77
  var react_1 = require("@testing-library/react");
67
78
  var delayPromise = function (delay) {
68
79
  if (delay === void 0) { delay = 0; }
@@ -130,6 +141,19 @@ var mockElementSizes = function (element, defaults) {
130
141
  return { mock: mock, unmock: unmock };
131
142
  };
132
143
  exports.mockElementSizes = mockElementSizes;
144
+ var mockComputedStyles = function (styles) {
145
+ if (styles === void 0) { styles = {}; }
146
+ var originalGetComputedStyle = window.getComputedStyle;
147
+ Object.defineProperty(window, 'getComputedStyle', {
148
+ value: function () { return (__assign(__assign({}, styles), { getPropertyValue: function () { return ''; } })); }
149
+ });
150
+ return function () {
151
+ Object.defineProperty(window, 'getComputedStyle', {
152
+ value: originalGetComputedStyle
153
+ });
154
+ };
155
+ };
156
+ exports.mockComputedStyles = mockComputedStyles;
133
157
  var mockBasicTableSizing = function (_a) {
134
158
  var _b = _a === void 0 ? {} : _a, _c = _b.width, width = _c === void 0 ? 2100 : _c, _d = _b.height, height = _d === void 0 ? 1000 : _d;
135
159
  var _e = (0, exports.mockElementSizes)(window.HTMLElement.prototype, { offsetHeight: height, offsetWidth: width }), mock = _e.mock, unmock = _e.unmock;
@@ -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,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 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 : _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 ? defaultIsLeaf : _h, scrollToNode = _a.scrollToNode, _j = _a.onChange, onChange = _j === void 0 ? identity : _j;
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
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
20
- var handleDrop = function (_a) {
21
- var node = _a.node, dragNode = _a.dragNode, dragNodesKeys = _a.dragNodesKeys;
22
- // TODO: implement
23
- };
24
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
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
- }, [treeData, onChange]);
56
+ return treeData;
57
+ }, [treeData, dragNode, dropNode, dropPositionInfo]);
42
58
  var expandedKeys = useMemo(function () {
43
- return getExpandedKeys(treeData);
44
- }, [treeData]);
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
- return internalTreeData ? (React.createElement(Tree, { 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: classnames(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;
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
  };
@@ -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 {};