react-native-tree-multi-select 2.0.10 → 3.0.0-beta.1
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/README.md +151 -0
- package/lib/module/TreeView.js +32 -2
- package/lib/module/TreeView.js.map +1 -1
- package/lib/module/components/DragOverlay.js +101 -0
- package/lib/module/components/DragOverlay.js.map +1 -0
- package/lib/module/components/DropIndicator.js +79 -0
- package/lib/module/components/DropIndicator.js.map +1 -0
- package/lib/module/components/NodeList.js +258 -32
- package/lib/module/components/NodeList.js.map +1 -1
- package/lib/module/helpers/index.js +1 -0
- package/lib/module/helpers/index.js.map +1 -1
- package/lib/module/helpers/moveTreeNode.helper.js +96 -0
- package/lib/module/helpers/moveTreeNode.helper.js.map +1 -0
- package/lib/module/helpers/toggleCheckbox.helper.js +88 -0
- package/lib/module/helpers/toggleCheckbox.helper.js.map +1 -1
- package/lib/module/hooks/useDragDrop.js +511 -0
- package/lib/module/hooks/useDragDrop.js.map +1 -0
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/store/treeView.store.js +19 -1
- package/lib/module/store/treeView.store.js.map +1 -1
- package/lib/module/types/dragDrop.types.js +4 -0
- package/lib/module/types/dragDrop.types.js.map +1 -0
- package/lib/typescript/src/TreeView.d.ts.map +1 -1
- package/lib/typescript/src/components/DragOverlay.d.ts +12 -0
- package/lib/typescript/src/components/DragOverlay.d.ts.map +1 -0
- package/lib/typescript/src/components/DropIndicator.d.ts +13 -0
- package/lib/typescript/src/components/DropIndicator.d.ts.map +1 -0
- package/lib/typescript/src/components/NodeList.d.ts.map +1 -1
- package/lib/typescript/src/helpers/index.d.ts +1 -0
- package/lib/typescript/src/helpers/index.d.ts.map +1 -1
- package/lib/typescript/src/helpers/moveTreeNode.helper.d.ts +13 -0
- package/lib/typescript/src/helpers/moveTreeNode.helper.d.ts.map +1 -0
- package/lib/typescript/src/helpers/toggleCheckbox.helper.d.ts +6 -0
- package/lib/typescript/src/helpers/toggleCheckbox.helper.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useDragDrop.d.ts +35 -0
- package/lib/typescript/src/hooks/useDragDrop.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +4 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/store/treeView.store.d.ts +8 -0
- package/lib/typescript/src/store/treeView.store.d.ts.map +1 -1
- package/lib/typescript/src/types/dragDrop.types.d.ts +21 -0
- package/lib/typescript/src/types/dragDrop.types.d.ts.map +1 -0
- package/lib/typescript/src/types/treeView.types.d.ts +90 -0
- package/lib/typescript/src/types/treeView.types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/TreeView.tsx +34 -0
- package/src/components/DragOverlay.tsx +112 -0
- package/src/components/DropIndicator.tsx +95 -0
- package/src/components/NodeList.tsx +302 -30
- package/src/helpers/index.ts +2 -1
- package/src/helpers/moveTreeNode.helper.ts +105 -0
- package/src/helpers/toggleCheckbox.helper.ts +96 -0
- package/src/hooks/useDragDrop.ts +643 -0
- package/src/index.tsx +19 -2
- package/src/store/treeView.store.ts +32 -0
- package/src/types/dragDrop.types.ts +23 -0
- package/src/types/treeView.types.ts +106 -0
|
@@ -7,11 +7,13 @@ import { useTreeViewStore } from "../store/treeView.store.js";
|
|
|
7
7
|
import { getFilteredTreeData, getFlattenedTreeData, getInnerMostChildrenIdsInTree, handleToggleExpand, toggleCheckboxes } from "../helpers/index.js";
|
|
8
8
|
import { CheckboxView } from "./CheckboxView.js";
|
|
9
9
|
import { CustomExpandCollapseIcon } from "./CustomExpandCollapseIcon.js";
|
|
10
|
+
import { DragOverlay } from "./DragOverlay.js";
|
|
10
11
|
import { defaultIndentationMultiplier } from "../constants/treeView.constants.js";
|
|
11
12
|
import { useShallow } from "zustand/react/shallow";
|
|
12
13
|
import { typedMemo } from "../utils/typedMemo.js";
|
|
13
14
|
import { ScrollToNodeHandler } from "../handlers/ScrollToNodeHandler.js";
|
|
14
|
-
import {
|
|
15
|
+
import { useDragDrop } from "../hooks/useDragDrop.js";
|
|
16
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
15
17
|
const NodeList = typedMemo(_NodeList);
|
|
16
18
|
export default NodeList;
|
|
17
19
|
function _NodeList(props) {
|
|
@@ -25,7 +27,15 @@ function _NodeList(props) {
|
|
|
25
27
|
CheckboxComponent,
|
|
26
28
|
ExpandCollapseIconComponent,
|
|
27
29
|
ExpandCollapseTouchableComponent,
|
|
28
|
-
CustomNodeRowComponent
|
|
30
|
+
CustomNodeRowComponent,
|
|
31
|
+
dragEnabled,
|
|
32
|
+
onDragEnd,
|
|
33
|
+
longPressDuration = 400,
|
|
34
|
+
autoScrollThreshold = 60,
|
|
35
|
+
autoScrollSpeed = 1.0,
|
|
36
|
+
dragOverlayOffset = -4,
|
|
37
|
+
autoExpandDelay = 800,
|
|
38
|
+
dragDropCustomizations
|
|
29
39
|
} = props;
|
|
30
40
|
const {
|
|
31
41
|
expanded,
|
|
@@ -41,6 +51,14 @@ function _NodeList(props) {
|
|
|
41
51
|
searchText: state.searchText
|
|
42
52
|
})));
|
|
43
53
|
const flashListRef = React.useRef(null);
|
|
54
|
+
const containerRef = React.useRef(null);
|
|
55
|
+
const internalDataRef = React.useRef(null);
|
|
56
|
+
const measuredItemHeightRef = React.useRef(0);
|
|
57
|
+
const handleItemLayout = React.useCallback(height => {
|
|
58
|
+
if (measuredItemHeightRef.current === 0 && height > 0) {
|
|
59
|
+
measuredItemHeightRef.current = height;
|
|
60
|
+
}
|
|
61
|
+
}, []);
|
|
44
62
|
const [initialScrollIndex, setInitialScrollIndex] = React.useState(-1);
|
|
45
63
|
|
|
46
64
|
// First we filter the tree as per the search term and keys
|
|
@@ -54,8 +72,44 @@ function _NodeList(props) {
|
|
|
54
72
|
const updatedInnerMostChildrenIds = getInnerMostChildrenIdsInTree(filteredTree);
|
|
55
73
|
updateInnerMostChildrenIds(updatedInnerMostChildrenIds);
|
|
56
74
|
}, [filteredTree, updateInnerMostChildrenIds]);
|
|
75
|
+
|
|
76
|
+
// --- Drag and drop ---
|
|
77
|
+
const {
|
|
78
|
+
panResponder,
|
|
79
|
+
overlayY,
|
|
80
|
+
isDragging,
|
|
81
|
+
draggedNode,
|
|
82
|
+
handleNodeTouchStart,
|
|
83
|
+
cancelLongPressTimer,
|
|
84
|
+
scrollOffsetRef
|
|
85
|
+
} = useDragDrop({
|
|
86
|
+
storeId,
|
|
87
|
+
flattenedNodes: flattenedFilteredNodes,
|
|
88
|
+
flashListRef,
|
|
89
|
+
containerRef,
|
|
90
|
+
dragEnabled: dragEnabled ?? false,
|
|
91
|
+
onDragEnd,
|
|
92
|
+
longPressDuration,
|
|
93
|
+
autoScrollThreshold,
|
|
94
|
+
autoScrollSpeed,
|
|
95
|
+
internalDataRef,
|
|
96
|
+
measuredItemHeightRef,
|
|
97
|
+
dragOverlayOffset,
|
|
98
|
+
autoExpandDelay
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Combined onScroll handler
|
|
102
|
+
const handleScroll = React.useCallback(event => {
|
|
103
|
+
scrollOffsetRef.current = event.nativeEvent.contentOffset.y;
|
|
104
|
+
// Cancel long press timer if user is scrolling
|
|
105
|
+
cancelLongPressTimer();
|
|
106
|
+
// Forward to user's onScroll
|
|
107
|
+
treeFlashListProps?.onScroll?.(event);
|
|
108
|
+
}, [scrollOffsetRef, cancelLongPressTimer, treeFlashListProps]);
|
|
109
|
+
const effectiveIndentationMultiplier = indentationMultiplier ?? defaultIndentationMultiplier;
|
|
57
110
|
const nodeRenderer = React.useCallback(({
|
|
58
|
-
item
|
|
111
|
+
item,
|
|
112
|
+
index
|
|
59
113
|
}) => {
|
|
60
114
|
return /*#__PURE__*/_jsx(Node, {
|
|
61
115
|
storeId: storeId,
|
|
@@ -66,9 +120,38 @@ function _NodeList(props) {
|
|
|
66
120
|
CheckboxComponent: CheckboxComponent,
|
|
67
121
|
ExpandCollapseIconComponent: ExpandCollapseIconComponent,
|
|
68
122
|
ExpandCollapseTouchableComponent: ExpandCollapseTouchableComponent,
|
|
69
|
-
CustomNodeRowComponent: CustomNodeRowComponent
|
|
123
|
+
CustomNodeRowComponent: CustomNodeRowComponent,
|
|
124
|
+
nodeIndex: index,
|
|
125
|
+
dragEnabled: dragEnabled,
|
|
126
|
+
isDragging: isDragging,
|
|
127
|
+
onNodeTouchStart: dragEnabled ? handleNodeTouchStart : undefined,
|
|
128
|
+
onNodeTouchEnd: dragEnabled ? cancelLongPressTimer : undefined,
|
|
129
|
+
onItemLayout: dragEnabled ? handleItemLayout : undefined,
|
|
130
|
+
dragDropCustomizations: dragDropCustomizations
|
|
70
131
|
});
|
|
71
|
-
}, [storeId, CheckboxComponent, ExpandCollapseIconComponent, ExpandCollapseTouchableComponent, CustomNodeRowComponent, checkBoxViewStyleProps, indentationMultiplier]);
|
|
132
|
+
}, [storeId, CheckboxComponent, ExpandCollapseIconComponent, ExpandCollapseTouchableComponent, CustomNodeRowComponent, checkBoxViewStyleProps, indentationMultiplier, dragEnabled, isDragging, handleNodeTouchStart, dragDropCustomizations, cancelLongPressTimer, handleItemLayout]);
|
|
133
|
+
|
|
134
|
+
// Extract FlashList props but exclude onScroll (we provide our own combined handler)
|
|
135
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
136
|
+
const {
|
|
137
|
+
onScroll: _userOnScroll,
|
|
138
|
+
...restFlashListProps
|
|
139
|
+
} = treeFlashListProps ?? {};
|
|
140
|
+
const flashListElement = /*#__PURE__*/_jsx(FlashList, {
|
|
141
|
+
ref: flashListRef,
|
|
142
|
+
estimatedItemSize: 36,
|
|
143
|
+
initialScrollIndex: initialScrollIndex,
|
|
144
|
+
removeClippedSubviews: true,
|
|
145
|
+
keyboardShouldPersistTaps: "handled",
|
|
146
|
+
drawDistance: 50,
|
|
147
|
+
ListHeaderComponent: /*#__PURE__*/_jsx(HeaderFooterView, {}),
|
|
148
|
+
ListFooterComponent: /*#__PURE__*/_jsx(HeaderFooterView, {}),
|
|
149
|
+
...restFlashListProps,
|
|
150
|
+
onScroll: handleScroll,
|
|
151
|
+
scrollEnabled: isDragging ? false : restFlashListProps?.scrollEnabled ?? true,
|
|
152
|
+
data: flattenedFilteredNodes,
|
|
153
|
+
renderItem: nodeRenderer
|
|
154
|
+
});
|
|
72
155
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
73
156
|
children: [/*#__PURE__*/_jsx(ScrollToNodeHandler, {
|
|
74
157
|
ref: scrollToNodeHandlerRef,
|
|
@@ -77,19 +160,22 @@ function _NodeList(props) {
|
|
|
77
160
|
flattenedFilteredNodes: flattenedFilteredNodes,
|
|
78
161
|
setInitialScrollIndex: setInitialScrollIndex,
|
|
79
162
|
initialScrollNodeID: initialScrollNodeID
|
|
80
|
-
}), /*#__PURE__*/
|
|
81
|
-
ref:
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
163
|
+
}), dragEnabled ? /*#__PURE__*/_jsxs(View, {
|
|
164
|
+
ref: containerRef,
|
|
165
|
+
style: styles.dragContainer,
|
|
166
|
+
...panResponder.panHandlers,
|
|
167
|
+
children: [flashListElement, isDragging && draggedNode && /*#__PURE__*/_jsx(DragOverlay, {
|
|
168
|
+
overlayY: overlayY,
|
|
169
|
+
node: draggedNode,
|
|
170
|
+
level: draggedNode.level ?? 0,
|
|
171
|
+
indentationMultiplier: effectiveIndentationMultiplier,
|
|
172
|
+
CheckboxComponent: CheckboxComponent,
|
|
173
|
+
ExpandCollapseIconComponent: ExpandCollapseIconComponent,
|
|
174
|
+
CustomNodeRowComponent: CustomNodeRowComponent,
|
|
175
|
+
checkBoxViewStyleProps: checkBoxViewStyleProps,
|
|
176
|
+
dragDropCustomizations: dragDropCustomizations
|
|
177
|
+
})]
|
|
178
|
+
}) : flashListElement]
|
|
93
179
|
});
|
|
94
180
|
}
|
|
95
181
|
;
|
|
@@ -118,17 +204,29 @@ function _Node(props) {
|
|
|
118
204
|
ExpandCollapseIconComponent = CustomExpandCollapseIcon,
|
|
119
205
|
CheckboxComponent = CheckboxView,
|
|
120
206
|
ExpandCollapseTouchableComponent = TouchableOpacity,
|
|
121
|
-
CustomNodeRowComponent
|
|
207
|
+
CustomNodeRowComponent,
|
|
208
|
+
nodeIndex = 0,
|
|
209
|
+
dragEnabled,
|
|
210
|
+
isDragging: isDraggingGlobal,
|
|
211
|
+
onNodeTouchStart,
|
|
212
|
+
onNodeTouchEnd,
|
|
213
|
+
onItemLayout,
|
|
214
|
+
dragDropCustomizations
|
|
122
215
|
} = props;
|
|
123
216
|
const {
|
|
124
217
|
isExpanded,
|
|
125
|
-
value
|
|
218
|
+
value,
|
|
219
|
+
isBeingDragged,
|
|
220
|
+
isDragInvalid,
|
|
221
|
+
isDropTarget,
|
|
222
|
+
nodeDropPosition
|
|
126
223
|
} = useTreeViewStore(storeId)(useShallow(state => ({
|
|
127
224
|
isExpanded: state.expanded.has(node.id),
|
|
128
|
-
value: getValue(state.checked.has(node.id),
|
|
129
|
-
|
|
130
|
-
state.
|
|
131
|
-
|
|
225
|
+
value: getValue(state.checked.has(node.id), state.indeterminate.has(node.id)),
|
|
226
|
+
isBeingDragged: state.draggedNodeId === node.id,
|
|
227
|
+
isDragInvalid: state.invalidDragTargetIds.has(node.id),
|
|
228
|
+
isDropTarget: state.dropTargetNodeId === node.id,
|
|
229
|
+
nodeDropPosition: state.dropTargetNodeId === node.id ? state.dropPosition : null
|
|
132
230
|
})));
|
|
133
231
|
const _onToggleExpand = React.useCallback(() => {
|
|
134
232
|
handleToggleExpand(storeId, node.id);
|
|
@@ -136,13 +234,47 @@ function _Node(props) {
|
|
|
136
234
|
const _onCheck = React.useCallback(() => {
|
|
137
235
|
toggleCheckboxes(storeId, [node.id]);
|
|
138
236
|
}, [storeId, node.id]);
|
|
237
|
+
const handleTouchStart = React.useCallback(e => {
|
|
238
|
+
if (!onNodeTouchStart) return;
|
|
239
|
+
const {
|
|
240
|
+
pageY,
|
|
241
|
+
locationY
|
|
242
|
+
} = e.nativeEvent;
|
|
243
|
+
onNodeTouchStart(node.id, pageY, locationY, nodeIndex);
|
|
244
|
+
}, [node.id, nodeIndex, onNodeTouchStart]);
|
|
245
|
+
const handleTouchEnd = React.useCallback(() => {
|
|
246
|
+
onNodeTouchEnd?.();
|
|
247
|
+
}, [onNodeTouchEnd]);
|
|
248
|
+
|
|
249
|
+
// Determine opacity for drag state
|
|
250
|
+
const dragOpacity = dragDropCustomizations?.draggedNodeOpacity ?? 0.3;
|
|
251
|
+
const nodeOpacity = isDraggingGlobal && (isBeingDragged || isDragInvalid) ? dragOpacity : 1.0;
|
|
252
|
+
const handleLayout = React.useCallback(e => {
|
|
253
|
+
onItemLayout?.(e.nativeEvent.layout.height);
|
|
254
|
+
}, [onItemLayout]);
|
|
255
|
+
const touchHandlers = dragEnabled ? {
|
|
256
|
+
onTouchStart: handleTouchStart,
|
|
257
|
+
onTouchEnd: handleTouchEnd,
|
|
258
|
+
onTouchCancel: handleTouchEnd
|
|
259
|
+
} : undefined;
|
|
260
|
+
const CustomDropIndicator = dragDropCustomizations?.CustomDropIndicatorComponent;
|
|
261
|
+
const dropIndicator = isDropTarget && nodeDropPosition ? CustomDropIndicator ? /*#__PURE__*/_jsx(CustomDropIndicator, {
|
|
262
|
+
position: nodeDropPosition
|
|
263
|
+
}) : /*#__PURE__*/_jsx(NodeDropIndicator, {
|
|
264
|
+
position: nodeDropPosition,
|
|
265
|
+
styleProps: dragDropCustomizations?.dropIndicatorStyleProps
|
|
266
|
+
}) : null;
|
|
139
267
|
if (!CustomNodeRowComponent) {
|
|
140
268
|
return /*#__PURE__*/_jsxs(View, {
|
|
141
269
|
testID: `node_row_${node.id}`,
|
|
270
|
+
...touchHandlers,
|
|
271
|
+
onLayout: onItemLayout ? handleLayout : undefined,
|
|
142
272
|
style: [styles.nodeCheckboxAndArrowRow, {
|
|
143
273
|
paddingStart: level * indentationMultiplier
|
|
274
|
+
}, {
|
|
275
|
+
opacity: nodeOpacity
|
|
144
276
|
}],
|
|
145
|
-
children: [/*#__PURE__*/_jsx(CheckboxComponent, {
|
|
277
|
+
children: [dropIndicator, /*#__PURE__*/_jsx(CheckboxComponent, {
|
|
146
278
|
text: node.name,
|
|
147
279
|
onValueChange: _onCheck,
|
|
148
280
|
value: value,
|
|
@@ -158,17 +290,67 @@ function _Node(props) {
|
|
|
158
290
|
}) : null]
|
|
159
291
|
});
|
|
160
292
|
} else {
|
|
161
|
-
return /*#__PURE__*/
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
293
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
294
|
+
...touchHandlers,
|
|
295
|
+
onLayout: onItemLayout ? handleLayout : undefined,
|
|
296
|
+
style: {
|
|
297
|
+
opacity: nodeOpacity
|
|
298
|
+
},
|
|
299
|
+
children: [dropIndicator, /*#__PURE__*/_jsx(CustomNodeRowComponent, {
|
|
300
|
+
node: node,
|
|
301
|
+
level: level,
|
|
302
|
+
checkedValue: value,
|
|
303
|
+
isExpanded: isExpanded,
|
|
304
|
+
onCheck: _onCheck,
|
|
305
|
+
onExpand: _onToggleExpand,
|
|
306
|
+
isDragTarget: isDragInvalid,
|
|
307
|
+
isDragging: isDraggingGlobal,
|
|
308
|
+
isDraggedNode: isBeingDragged
|
|
309
|
+
})]
|
|
168
310
|
});
|
|
169
311
|
}
|
|
170
312
|
}
|
|
171
313
|
;
|
|
314
|
+
function NodeDropIndicator({
|
|
315
|
+
position,
|
|
316
|
+
styleProps
|
|
317
|
+
}) {
|
|
318
|
+
const lineColor = styleProps?.lineColor ?? "#0078FF";
|
|
319
|
+
const lineThickness = styleProps?.lineThickness ?? 3;
|
|
320
|
+
const circleSize = styleProps?.circleSize ?? 10;
|
|
321
|
+
const highlightColor = styleProps?.highlightColor ?? "rgba(0, 120, 255, 0.15)";
|
|
322
|
+
const highlightBorderColor = styleProps?.highlightBorderColor ?? "rgba(0, 120, 255, 0.5)";
|
|
323
|
+
if (position === "inside") {
|
|
324
|
+
return /*#__PURE__*/_jsx(View, {
|
|
325
|
+
pointerEvents: "none",
|
|
326
|
+
style: [styles.dropHighlight, {
|
|
327
|
+
backgroundColor: highlightColor,
|
|
328
|
+
borderColor: highlightBorderColor
|
|
329
|
+
}]
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
333
|
+
pointerEvents: "none",
|
|
334
|
+
style: [styles.dropLineContainer, {
|
|
335
|
+
height: lineThickness
|
|
336
|
+
}, position === "above" ? styles.dropLineTop : styles.dropLineBottom],
|
|
337
|
+
children: [/*#__PURE__*/_jsx(View, {
|
|
338
|
+
style: [styles.dropLineCircle, {
|
|
339
|
+
width: circleSize,
|
|
340
|
+
height: circleSize,
|
|
341
|
+
borderRadius: circleSize / 2,
|
|
342
|
+
backgroundColor: lineColor,
|
|
343
|
+
marginLeft: -(circleSize / 2),
|
|
344
|
+
marginTop: -(circleSize / 2 - lineThickness / 2)
|
|
345
|
+
}]
|
|
346
|
+
}), /*#__PURE__*/_jsx(View, {
|
|
347
|
+
style: [styles.dropLine, {
|
|
348
|
+
height: lineThickness,
|
|
349
|
+
backgroundColor: lineColor
|
|
350
|
+
}]
|
|
351
|
+
})]
|
|
352
|
+
});
|
|
353
|
+
}
|
|
172
354
|
const styles = StyleSheet.create({
|
|
173
355
|
defaultHeaderFooter: {
|
|
174
356
|
padding: 5
|
|
@@ -181,6 +363,50 @@ const styles = StyleSheet.create({
|
|
|
181
363
|
flexDirection: "row",
|
|
182
364
|
alignItems: "center",
|
|
183
365
|
minWidth: "100%"
|
|
366
|
+
},
|
|
367
|
+
dragContainer: {
|
|
368
|
+
flex: 1
|
|
369
|
+
},
|
|
370
|
+
// Drop indicator styles (rendered by each node)
|
|
371
|
+
dropHighlight: {
|
|
372
|
+
position: "absolute",
|
|
373
|
+
top: 0,
|
|
374
|
+
bottom: 0,
|
|
375
|
+
left: 0,
|
|
376
|
+
right: 0,
|
|
377
|
+
backgroundColor: "rgba(0, 120, 255, 0.15)",
|
|
378
|
+
borderWidth: 2,
|
|
379
|
+
borderColor: "rgba(0, 120, 255, 0.5)",
|
|
380
|
+
borderRadius: 4,
|
|
381
|
+
zIndex: 10
|
|
382
|
+
},
|
|
383
|
+
dropLineContainer: {
|
|
384
|
+
position: "absolute",
|
|
385
|
+
left: 0,
|
|
386
|
+
right: 0,
|
|
387
|
+
flexDirection: "row",
|
|
388
|
+
alignItems: "center",
|
|
389
|
+
height: 3,
|
|
390
|
+
zIndex: 10
|
|
391
|
+
},
|
|
392
|
+
dropLineTop: {
|
|
393
|
+
top: 0
|
|
394
|
+
},
|
|
395
|
+
dropLineBottom: {
|
|
396
|
+
bottom: 0
|
|
397
|
+
},
|
|
398
|
+
dropLineCircle: {
|
|
399
|
+
width: 10,
|
|
400
|
+
height: 10,
|
|
401
|
+
borderRadius: 5,
|
|
402
|
+
backgroundColor: "#0078FF",
|
|
403
|
+
marginLeft: -5,
|
|
404
|
+
marginTop: -4
|
|
405
|
+
},
|
|
406
|
+
dropLine: {
|
|
407
|
+
flex: 1,
|
|
408
|
+
height: 3,
|
|
409
|
+
backgroundColor: "#0078FF"
|
|
184
410
|
}
|
|
185
411
|
});
|
|
186
412
|
//# sourceMappingURL=NodeList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","View","StyleSheet","TouchableOpacity","FlashList","useTreeViewStore","getFilteredTreeData","getFlattenedTreeData","getInnerMostChildrenIdsInTree","handleToggleExpand","toggleCheckboxes","CheckboxView","CustomExpandCollapseIcon","defaultIndentationMultiplier","useShallow","typedMemo","ScrollToNodeHandler","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","NodeList","_NodeList","props","storeId","scrollToNodeHandlerRef","initialScrollNodeID","treeFlashListProps","checkBoxViewStyleProps","indentationMultiplier","CheckboxComponent","ExpandCollapseIconComponent","ExpandCollapseTouchableComponent","CustomNodeRowComponent","expanded","initialTreeViewData","updateInnerMostChildrenIds","searchKeys","searchText","state","flashListRef","useRef","initialScrollIndex","setInitialScrollIndex","useState","filteredTree","useMemo","trim","toLowerCase","flattenedFilteredNodes","useEffect","updatedInnerMostChildrenIds","nodeRenderer","useCallback","item","Node","node","level","children","ref","estimatedItemSize","removeClippedSubviews","keyboardShouldPersistTaps","drawDistance","ListHeaderComponent","HeaderFooterView","ListFooterComponent","data","renderItem","style","styles","defaultHeaderFooter","getValue","isChecked","isIndeterminate","_Node","isExpanded","value","has","id","checked","indeterminate","_onToggleExpand","_onCheck","testID","nodeCheckboxAndArrowRow","paddingStart","text","name","onValueChange","length","nodeExpandableArrowTouchable","onPress","checkedValue","onCheck","onExpand","create","padding","flex","flexDirection","alignItems","minWidth"],"sourceRoot":"../../../src","sources":["components/NodeList.tsx"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","View","StyleSheet","TouchableOpacity","FlashList","useTreeViewStore","getFilteredTreeData","getFlattenedTreeData","getInnerMostChildrenIdsInTree","handleToggleExpand","toggleCheckboxes","CheckboxView","CustomExpandCollapseIcon","DragOverlay","defaultIndentationMultiplier","useShallow","typedMemo","ScrollToNodeHandler","useDragDrop","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","NodeList","_NodeList","props","storeId","scrollToNodeHandlerRef","initialScrollNodeID","treeFlashListProps","checkBoxViewStyleProps","indentationMultiplier","CheckboxComponent","ExpandCollapseIconComponent","ExpandCollapseTouchableComponent","CustomNodeRowComponent","dragEnabled","onDragEnd","longPressDuration","autoScrollThreshold","autoScrollSpeed","dragOverlayOffset","autoExpandDelay","dragDropCustomizations","expanded","initialTreeViewData","updateInnerMostChildrenIds","searchKeys","searchText","state","flashListRef","useRef","containerRef","internalDataRef","measuredItemHeightRef","handleItemLayout","useCallback","height","current","initialScrollIndex","setInitialScrollIndex","useState","filteredTree","useMemo","trim","toLowerCase","flattenedFilteredNodes","useEffect","updatedInnerMostChildrenIds","panResponder","overlayY","isDragging","draggedNode","handleNodeTouchStart","cancelLongPressTimer","scrollOffsetRef","flattenedNodes","handleScroll","event","nativeEvent","contentOffset","y","onScroll","effectiveIndentationMultiplier","nodeRenderer","item","index","Node","node","level","nodeIndex","onNodeTouchStart","undefined","onNodeTouchEnd","onItemLayout","_userOnScroll","restFlashListProps","flashListElement","ref","estimatedItemSize","removeClippedSubviews","keyboardShouldPersistTaps","drawDistance","ListHeaderComponent","HeaderFooterView","ListFooterComponent","scrollEnabled","data","renderItem","children","style","styles","dragContainer","panHandlers","defaultHeaderFooter","getValue","isChecked","isIndeterminate","_Node","isDraggingGlobal","isExpanded","value","isBeingDragged","isDragInvalid","isDropTarget","nodeDropPosition","has","id","checked","indeterminate","draggedNodeId","invalidDragTargetIds","dropTargetNodeId","dropPosition","_onToggleExpand","_onCheck","handleTouchStart","e","pageY","locationY","handleTouchEnd","dragOpacity","draggedNodeOpacity","nodeOpacity","handleLayout","layout","touchHandlers","onTouchStart","onTouchEnd","onTouchCancel","CustomDropIndicator","CustomDropIndicatorComponent","dropIndicator","position","NodeDropIndicator","styleProps","dropIndicatorStyleProps","testID","onLayout","nodeCheckboxAndArrowRow","paddingStart","opacity","text","name","onValueChange","length","nodeExpandableArrowTouchable","onPress","checkedValue","onCheck","onExpand","isDragTarget","isDraggedNode","lineColor","lineThickness","circleSize","highlightColor","highlightBorderColor","pointerEvents","dropHighlight","backgroundColor","borderColor","dropLineContainer","dropLineTop","dropLineBottom","dropLineCircle","width","borderRadius","marginLeft","marginTop","dropLine","create","padding","flex","flexDirection","alignItems","minWidth","top","bottom","left","right","borderWidth","zIndex"],"sourceRoot":"../../../src","sources":["components/NodeList.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["helpers/index.ts"],"mappings":";;AAAA;;AAEA,cAAc,4BAAyB;AACvC,cAAc,sBAAmB;AACjC,cAAc,uBAAoB;AAClC,cAAc,4BAAyB;AACvC,cAAc,oBAAiB;AAC/B,cAAc,yBAAsB","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["helpers/index.ts"],"mappings":";;AAAA;;AAEA,cAAc,4BAAyB;AACvC,cAAc,sBAAmB;AACjC,cAAc,uBAAoB;AAClC,cAAc,4BAAyB;AACvC,cAAc,oBAAiB;AAC/B,cAAc,yBAAsB;AACpC,cAAc,0BAAuB","ignoreList":[]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Move a node within a tree structure. Returns a new tree (no mutation).
|
|
5
|
+
*
|
|
6
|
+
* @param data - The current tree data
|
|
7
|
+
* @param draggedNodeId - The ID of the node to move
|
|
8
|
+
* @param targetNodeId - The ID of the target node
|
|
9
|
+
* @param position - Where to place relative to target: "above", "below", or "inside"
|
|
10
|
+
* @returns New tree data with the node moved, or the original data if the move is invalid
|
|
11
|
+
*/
|
|
12
|
+
export function moveTreeNode(data, draggedNodeId, targetNodeId, position) {
|
|
13
|
+
if (draggedNodeId === targetNodeId) return data;
|
|
14
|
+
|
|
15
|
+
// Step 1: Deep clone the tree
|
|
16
|
+
const cloned = deepCloneTree(data);
|
|
17
|
+
|
|
18
|
+
// Step 2: Remove the dragged node
|
|
19
|
+
const removedNode = removeNodeById(cloned, draggedNodeId);
|
|
20
|
+
if (!removedNode) return data;
|
|
21
|
+
|
|
22
|
+
// Step 3: Insert at the new position
|
|
23
|
+
const inserted = insertNode(cloned, removedNode, targetNodeId, position);
|
|
24
|
+
if (!inserted) return data;
|
|
25
|
+
return cloned;
|
|
26
|
+
}
|
|
27
|
+
function deepCloneTree(nodes) {
|
|
28
|
+
return nodes.map(node => ({
|
|
29
|
+
...node,
|
|
30
|
+
children: node.children ? deepCloneTree(node.children) : undefined
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Remove a node by ID from the tree. Mutates the cloned tree in-place.
|
|
36
|
+
* Returns the removed node, or null if not found.
|
|
37
|
+
*/
|
|
38
|
+
function removeNodeById(nodes, nodeId) {
|
|
39
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
40
|
+
if (nodes[i].id === nodeId) {
|
|
41
|
+
const [removed] = nodes.splice(i, 1);
|
|
42
|
+
return removed;
|
|
43
|
+
}
|
|
44
|
+
const children = nodes[i].children;
|
|
45
|
+
if (children) {
|
|
46
|
+
const removed = removeNodeById(children, nodeId);
|
|
47
|
+
if (removed) {
|
|
48
|
+
// Clean up empty children arrays
|
|
49
|
+
if (children.length === 0) {
|
|
50
|
+
nodes[i] = {
|
|
51
|
+
...nodes[i],
|
|
52
|
+
children: undefined
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return removed;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Insert a node relative to a target node. Mutates the cloned tree in-place.
|
|
64
|
+
* Returns true if insertion was successful.
|
|
65
|
+
*/
|
|
66
|
+
function insertNode(nodes, nodeToInsert, targetId, position) {
|
|
67
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
68
|
+
if (nodes[i].id === targetId) {
|
|
69
|
+
if (position === "above") {
|
|
70
|
+
nodes.splice(i, 0, nodeToInsert);
|
|
71
|
+
} else if (position === "below") {
|
|
72
|
+
nodes.splice(i + 1, 0, nodeToInsert);
|
|
73
|
+
} else {
|
|
74
|
+
// "inside" - add as first child
|
|
75
|
+
const target = nodes[i];
|
|
76
|
+
if (target.children) {
|
|
77
|
+
target.children.unshift(nodeToInsert);
|
|
78
|
+
} else {
|
|
79
|
+
nodes[i] = {
|
|
80
|
+
...target,
|
|
81
|
+
children: [nodeToInsert]
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
const children = nodes[i].children;
|
|
88
|
+
if (children) {
|
|
89
|
+
if (insertNode(children, nodeToInsert, targetId, position)) {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=moveTreeNode.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["moveTreeNode","data","draggedNodeId","targetNodeId","position","cloned","deepCloneTree","removedNode","removeNodeById","inserted","insertNode","nodes","map","node","children","undefined","nodeId","i","length","id","removed","splice","nodeToInsert","targetId","target","unshift"],"sourceRoot":"../../../src","sources":["helpers/moveTreeNode.helper.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -186,4 +186,92 @@ export function toggleCheckboxes(storeId, ids, forceCheck) {
|
|
|
186
186
|
updateChecked(tempChecked);
|
|
187
187
|
updateIndeterminate(tempIndeterminate);
|
|
188
188
|
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Recalculates checked/indeterminate state for all parent nodes bottom-up.
|
|
192
|
+
* Should be called after tree structure changes (e.g., drag-drop moves) to ensure
|
|
193
|
+
* parent states correctly reflect their children's checked states.
|
|
194
|
+
*/
|
|
195
|
+
export function recalculateCheckedStates(storeId) {
|
|
196
|
+
const treeViewStore = getTreeViewStore(storeId);
|
|
197
|
+
const {
|
|
198
|
+
checked,
|
|
199
|
+
updateChecked,
|
|
200
|
+
indeterminate,
|
|
201
|
+
updateIndeterminate,
|
|
202
|
+
nodeMap,
|
|
203
|
+
childToParentMap,
|
|
204
|
+
selectionPropagation
|
|
205
|
+
} = treeViewStore.getState();
|
|
206
|
+
|
|
207
|
+
// Only recalculate if parent propagation is enabled
|
|
208
|
+
if (!selectionPropagation.toParents) return;
|
|
209
|
+
const tempChecked = new Set(checked);
|
|
210
|
+
const tempIndeterminate = new Set(indeterminate);
|
|
211
|
+
|
|
212
|
+
// Collect parent nodes and clean up leaf nodes that shouldn't be indeterminate.
|
|
213
|
+
// A leaf node (no children) can never be indeterminate — this can happen when
|
|
214
|
+
// all children of a formerly-indeterminate parent are dragged away.
|
|
215
|
+
const parentNodes = [];
|
|
216
|
+
for (const [id, node] of nodeMap) {
|
|
217
|
+
if (node.children && node.children.length > 0) {
|
|
218
|
+
parentNodes.push(id);
|
|
219
|
+
} else {
|
|
220
|
+
tempIndeterminate.delete(id);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Sort by depth descending (deepest first) for correct bottom-up propagation
|
|
225
|
+
const nodeDepths = new Map();
|
|
226
|
+
function getDepth(nodeId) {
|
|
227
|
+
if (nodeDepths.has(nodeId)) return nodeDepths.get(nodeId);
|
|
228
|
+
let depth = 0;
|
|
229
|
+
let currentId = nodeId;
|
|
230
|
+
while (currentId) {
|
|
231
|
+
const parentId = childToParentMap.get(currentId);
|
|
232
|
+
if (parentId) {
|
|
233
|
+
depth++;
|
|
234
|
+
currentId = parentId;
|
|
235
|
+
} else {
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
nodeDepths.set(nodeId, depth);
|
|
240
|
+
return depth;
|
|
241
|
+
}
|
|
242
|
+
parentNodes.sort((a, b) => getDepth(b) - getDepth(a));
|
|
243
|
+
|
|
244
|
+
// Update each parent based on its children's current state
|
|
245
|
+
for (const parentId of parentNodes) {
|
|
246
|
+
const node = nodeMap.get(parentId);
|
|
247
|
+
if (!node?.children?.length) continue;
|
|
248
|
+
let allChecked = true;
|
|
249
|
+
let anyCheckedOrIndeterminate = false;
|
|
250
|
+
for (const child of node.children) {
|
|
251
|
+
const isChecked = tempChecked.has(child.id);
|
|
252
|
+
const isIndeterminate = tempIndeterminate.has(child.id);
|
|
253
|
+
if (isChecked) {
|
|
254
|
+
anyCheckedOrIndeterminate = true;
|
|
255
|
+
} else if (isIndeterminate) {
|
|
256
|
+
anyCheckedOrIndeterminate = true;
|
|
257
|
+
allChecked = false;
|
|
258
|
+
} else {
|
|
259
|
+
allChecked = false;
|
|
260
|
+
}
|
|
261
|
+
if (!allChecked && anyCheckedOrIndeterminate) break;
|
|
262
|
+
}
|
|
263
|
+
if (allChecked) {
|
|
264
|
+
tempChecked.add(parentId);
|
|
265
|
+
tempIndeterminate.delete(parentId);
|
|
266
|
+
} else if (anyCheckedOrIndeterminate) {
|
|
267
|
+
tempChecked.delete(parentId);
|
|
268
|
+
tempIndeterminate.add(parentId);
|
|
269
|
+
} else {
|
|
270
|
+
tempChecked.delete(parentId);
|
|
271
|
+
tempIndeterminate.delete(parentId);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
updateChecked(tempChecked);
|
|
275
|
+
updateIndeterminate(tempIndeterminate);
|
|
276
|
+
}
|
|
189
277
|
//# sourceMappingURL=toggleCheckbox.helper.js.map
|