react-native-tree-multi-select 3.0.0-beta.3 → 3.0.0-beta.5
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 +100 -30
- package/lib/module/TreeView.js +36 -31
- package/lib/module/TreeView.js.map +1 -1
- package/lib/module/components/CheckboxView.js +8 -4
- package/lib/module/components/CheckboxView.js.map +1 -1
- package/lib/module/components/CustomExpandCollapseIcon.js +2 -2
- package/lib/module/components/CustomExpandCollapseIcon.js.map +1 -1
- package/lib/module/components/DragOverlay.js +17 -5
- package/lib/module/components/DragOverlay.js.map +1 -1
- package/lib/module/components/DropIndicator.js +2 -2
- package/lib/module/components/DropIndicator.js.map +1 -1
- package/lib/module/components/NodeList.js +78 -58
- package/lib/module/components/NodeList.js.map +1 -1
- package/lib/module/constants/treeView.constants.js +3 -0
- package/lib/module/constants/treeView.constants.js.map +1 -1
- package/lib/module/helpers/expandCollapse.helper.js.map +1 -1
- package/lib/module/helpers/moveTreeNode.helper.js +30 -0
- package/lib/module/helpers/moveTreeNode.helper.js.map +1 -1
- package/lib/module/helpers/selectAll.helper.js.map +1 -1
- package/lib/module/helpers/toggleCheckbox.helper.js +43 -60
- package/lib/module/helpers/toggleCheckbox.helper.js.map +1 -1
- package/lib/module/hooks/useDragDrop.js +146 -65
- package/lib/module/hooks/useDragDrop.js.map +1 -1
- package/lib/module/{handlers/ScrollToNodeHandler.js → hooks/useScrollToNode.js} +27 -26
- package/lib/module/hooks/useScrollToNode.js.map +1 -0
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/jest.setup.js +14 -1
- package/lib/module/jest.setup.js.map +1 -1
- package/lib/module/store/treeView.store.js +3 -0
- package/lib/module/store/treeView.store.js.map +1 -1
- package/lib/module/utils/typedMemo.js +3 -3
- package/lib/module/utils/typedMemo.js.map +1 -1
- package/lib/module/utils/useDeepCompareEffect.js +5 -5
- package/lib/module/utils/useDeepCompareEffect.js.map +1 -1
- package/lib/typescript/src/TreeView.d.ts +3 -3
- package/lib/typescript/src/TreeView.d.ts.map +1 -1
- package/lib/typescript/src/components/CheckboxView.d.ts +1 -2
- package/lib/typescript/src/components/CheckboxView.d.ts.map +1 -1
- package/lib/typescript/src/components/CustomExpandCollapseIcon.d.ts +1 -2
- package/lib/typescript/src/components/CustomExpandCollapseIcon.d.ts.map +1 -1
- package/lib/typescript/src/components/DragOverlay.d.ts +1 -0
- package/lib/typescript/src/components/DragOverlay.d.ts.map +1 -1
- package/lib/typescript/src/components/DropIndicator.d.ts +1 -2
- package/lib/typescript/src/components/DropIndicator.d.ts.map +1 -1
- package/lib/typescript/src/components/NodeList.d.ts.map +1 -1
- package/lib/typescript/src/constants/treeView.constants.d.ts +2 -0
- package/lib/typescript/src/constants/treeView.constants.d.ts.map +1 -1
- package/lib/typescript/src/helpers/expandCollapse.helper.d.ts +2 -2
- package/lib/typescript/src/helpers/expandCollapse.helper.d.ts.map +1 -1
- package/lib/typescript/src/helpers/moveTreeNode.helper.d.ts.map +1 -1
- package/lib/typescript/src/helpers/selectAll.helper.d.ts +4 -4
- package/lib/typescript/src/helpers/selectAll.helper.d.ts.map +1 -1
- package/lib/typescript/src/helpers/toggleCheckbox.helper.d.ts +3 -0
- package/lib/typescript/src/helpers/toggleCheckbox.helper.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useDragDrop.d.ts +24 -8
- package/lib/typescript/src/hooks/useDragDrop.d.ts.map +1 -1
- package/lib/typescript/src/{handlers/ScrollToNodeHandler.d.ts → hooks/useScrollToNode.d.ts} +13 -15
- package/lib/typescript/src/hooks/useScrollToNode.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +4 -3
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/jest.setup.d.ts +1 -1
- package/lib/typescript/src/jest.setup.d.ts.map +1 -1
- package/lib/typescript/src/store/treeView.store.d.ts +2 -1
- package/lib/typescript/src/store/treeView.store.d.ts.map +1 -1
- package/lib/typescript/src/types/dragDrop.types.d.ts +10 -0
- package/lib/typescript/src/types/dragDrop.types.d.ts.map +1 -1
- package/lib/typescript/src/types/treeView.types.d.ts +79 -41
- package/lib/typescript/src/types/treeView.types.d.ts.map +1 -1
- package/lib/typescript/src/utils/typedMemo.d.ts +1 -1
- package/lib/typescript/src/utils/typedMemo.d.ts.map +1 -1
- package/lib/typescript/src/utils/useDeepCompareEffect.d.ts +2 -2
- package/lib/typescript/src/utils/useDeepCompareEffect.d.ts.map +1 -1
- package/package.json +32 -15
- package/src/TreeView.tsx +57 -35
- package/src/components/CheckboxView.tsx +7 -4
- package/src/components/CustomExpandCollapseIcon.tsx +2 -2
- package/src/components/DragOverlay.tsx +19 -6
- package/src/components/DropIndicator.tsx +2 -2
- package/src/components/NodeList.tsx +87 -60
- package/src/constants/treeView.constants.ts +4 -1
- package/src/helpers/expandCollapse.helper.ts +5 -5
- package/src/helpers/moveTreeNode.helper.ts +33 -0
- package/src/helpers/selectAll.helper.ts +10 -10
- package/src/helpers/toggleCheckbox.helper.ts +56 -68
- package/src/hooks/useDragDrop.ts +190 -80
- package/src/{handlers/ScrollToNodeHandler.tsx → hooks/useScrollToNode.ts} +48 -45
- package/src/index.tsx +11 -0
- package/src/jest.setup.ts +14 -1
- package/src/store/treeView.store.ts +6 -1
- package/src/types/dragDrop.types.ts +12 -0
- package/src/types/treeView.types.ts +87 -43
- package/src/utils/typedMemo.ts +3 -3
- package/src/utils/useDeepCompareEffect.ts +13 -7
- package/lib/module/handlers/ScrollToNodeHandler.js.map +0 -1
- package/lib/typescript/src/handlers/ScrollToNodeHandler.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# react-native-tree-multi-select
|
|
2
2
|
|
|
3
|
-
⚡️Super-fast Tree view with multi-selection capabilities, using checkboxes and search filtering.
|
|
3
|
+
⚡️Super-fast Tree view with drag-and-drop reordering, multi-selection capabilities, using checkboxes and search filtering.
|
|
4
4
|
|
|
5
5
|
[](https://badge.fury.io/js/react-native-tree-multi-select) [](https://github.com/JairajJangle/react-native-tree-multi-select/blob/main/LICENSE) [](https://github.com/JairajJangle/react-native-tree-multi-select/actions/workflows/ci.yml) [](https://github.com/JairajJangle/react-native-tree-multi-select/actions/workflows/ci.yml)    [](https://github.com/JairajJangle/react-native-tree-multi-select/issues?q=is%3Aopen+is%3Aissue)  [](https://snyk.io/test/github/jairajjangle/react-native-tree-multi-select) [](https://snack.expo.dev/@futurejj/react-native-tree-multi-select-example)  [](https://github.com/sponsors/JairajJangle)
|
|
6
6
|
|
|
@@ -47,6 +47,8 @@ Make sure to follow the native-related installation instructions for these depen
|
|
|
47
47
|
- 🔀 **Drag-and-Drop**: Long-press to drag nodes and reorder or nest them anywhere in the tree.
|
|
48
48
|
- 💻 **Cross-Platform**: Works seamlessly across iOS, Android, and web (with React Native Web).
|
|
49
49
|
|
|
50
|
+
> **Note**: Drag-and-drop is currently supported on iOS and Android only. Web support for drag-and-drop is a work in progress.
|
|
51
|
+
|
|
50
52
|
## Usage
|
|
51
53
|
|
|
52
54
|
```tsx
|
|
@@ -140,8 +142,9 @@ export function DragDropExample(){
|
|
|
140
142
|
data={data}
|
|
141
143
|
onCheck={(checked, indeterminate) => { /* ... */ }}
|
|
142
144
|
onExpand={(expanded) => { /* ... */ }}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
+
dragAndDrop={{
|
|
146
|
+
onDragEnd: handleDragEnd,
|
|
147
|
+
}}
|
|
145
148
|
/>
|
|
146
149
|
);
|
|
147
150
|
}
|
|
@@ -149,7 +152,9 @@ export function DragDropExample(){
|
|
|
149
152
|
|
|
150
153
|
Long-press a node to start dragging. Drag over other nodes to see drop indicators. Drop above/below to reorder as siblings, or drop inside a parent node to nest it. The tree auto-scrolls when dragging near the edges.
|
|
151
154
|
|
|
152
|
-
|
|
155
|
+
**Search + drag**: Drag-and-drop works while a search filter is active. You can drag visible (filtered) nodes and drop them onto other visible nodes. The move is applied to the full tree, so nodes hidden by the filter are not affected. After the drop, the search filter remains active and the view updates to reflect the new tree structure.
|
|
156
|
+
|
|
157
|
+
For visual customizations (overlay styles, indicator colors, or fully custom components), see the [`dragAndDrop.customizations`](#dragdropcustomizationsid) option.
|
|
153
158
|
|
|
154
159
|
---
|
|
155
160
|
|
|
@@ -175,14 +180,27 @@ For visual customizations (overlay styles, indicator colors, or fully custom com
|
|
|
175
180
|
| `ExpandCollapseIconComponent` | `ComponentType<`[ExpandIconProps](#expandiconprops)`>` | No | A custom expand/collapse icon component |
|
|
176
181
|
| `ExpandCollapseTouchableComponent` | `ComponentType<`[TouchableOpacityProps](https://reactnative.dev/docs/touchableopacity#props)`>` | No | A custom expand/collapse touchable component |
|
|
177
182
|
| `CustomNodeRowComponent` | `React.ComponentType<`[NodeRowProps](#noderowpropsid--string)`<ID>>` | No | Custom row item component |
|
|
178
|
-
| `
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
|
183
|
-
|
|
|
184
|
-
| `
|
|
185
|
-
| `
|
|
183
|
+
| `dragAndDrop` | [DragAndDropOptions](#draganddropoptionstid--string)`<ID>` | No | Drag-and-drop configuration (see below) |
|
|
184
|
+
|
|
185
|
+
#### DragAndDropOptions`<ID = string>`
|
|
186
|
+
|
|
187
|
+
| Property | Type | Required | Description |
|
|
188
|
+
| --------------------- | ------------------------------------------------------------ | -------- | ------------------------------------------------------------ |
|
|
189
|
+
| `enabled` | `boolean` | No | Enable drag-and-drop reordering (default: true when `dragAndDrop` is provided). Set to `false` to temporarily disable at runtime. |
|
|
190
|
+
| `onDragStart` | `(event: `[DragStartEvent](#dragstarteventid--string)`<ID>) => void` | No | Callback fired when a drag operation begins |
|
|
191
|
+
| `onDragEnd` | `(event: `[DragEndEvent](#dragendeventid--string)`<ID>) => void` | No | Callback fired after a node is successfully dropped at a new position |
|
|
192
|
+
| `onDragCancel` | `(event: `[DragCancelEvent](#dragcanceleventid--string)`<ID>) => void` | No | Callback fired when a drag is cancelled without a successful drop |
|
|
193
|
+
| `longPressDuration` | `number` | No | Long press duration in ms to start drag (default: 400) |
|
|
194
|
+
| `autoScrollThreshold` | `number` | No | Distance from edge (px) to trigger auto-scroll (default: 60) |
|
|
195
|
+
| `autoScrollSpeed` | `number` | No | Speed multiplier for auto-scroll (default: 1.0) |
|
|
196
|
+
| `dragOverlayOffset` | `number` | No | Overlay offset from the finger, in item-height units (default: -2, i.e. two rows above finger) |
|
|
197
|
+
| `autoExpandDelay` | `number` | No | Delay in ms before auto-expanding a collapsed node during drag hover (default: 800) |
|
|
198
|
+
| `customizations` | [DragDropCustomizations](#dragdropcustomizationsid)`<ID>` | No | Customizations for drag-and-drop visuals (overlay, indicator, opacity) |
|
|
199
|
+
| `canDrop` | `(draggedNode, targetNode, position) => boolean` | No | Callback to determine if a node can be dropped on a specific target |
|
|
200
|
+
| `maxDepth` | `number` | No | Maximum nesting depth allowed. Drops exceeding this are suppressed |
|
|
201
|
+
| `canNodeHaveChildren` | `(node: TreeNode<ID>) => boolean` | No | Callback to determine if a node can accept children |
|
|
202
|
+
| `canDrag` | `(node: TreeNode<ID>) => boolean` | No | Callback to determine if a node can be dragged (default: all nodes) |
|
|
203
|
+
| `autoScrollToDroppedNode` | `boolean \| DropAutoScrollOptions` | No | Auto-scroll to the dropped node after a successful drop. Pass `false` to disable, `true` for defaults, or an object to customize. Default: `{ enabled: true, animated: true, viewPosition: 0.5 }` |
|
|
186
204
|
|
|
187
205
|
##### Notes
|
|
188
206
|
|
|
@@ -193,7 +211,8 @@ For visual customizations (overlay styles, indicator colors, or fully custom com
|
|
|
193
211
|
1. `CheckboxComponent`
|
|
194
212
|
1. `BuiltInCheckBoxViewStyleProps`
|
|
195
213
|
1. `ExpandCollapseIconComponent`
|
|
196
|
-
1. `ExpandCollapseTouchableComponent
|
|
214
|
+
1. `ExpandCollapseTouchableComponent`
|
|
215
|
+
1. `dragAndDrop.customizations.draggedNodeOpacity` / `invalidTargetOpacity` - the custom component receives `isDraggedNode`, `isInvalidDropTarget`, and `isDragging` props and is responsible for its own drag-state visuals.
|
|
197
216
|
|
|
198
217
|
- ⚠️ If the tree view doesn't scroll if rendered in a complex nested scroll view/s then try setting the `renderScrollComponent` value in `treeFlashListProps` to `ScrollView` from `react-native-gesture-handler`.
|
|
199
218
|
|
|
@@ -227,10 +246,11 @@ For visual customizations (overlay styles, indicator colors, or fully custom com
|
|
|
227
246
|
| `expandNodes` | `(ids: ID[]) => void` | Expands specified nodes |
|
|
228
247
|
| `collapseNodes` | `(ids: ID[]) => void` | Collapses specified nodes |
|
|
229
248
|
| `selectNodes` | `(ids: ID[]) => void` | Selects specified nodes |
|
|
230
|
-
| `
|
|
249
|
+
| `unselectNodes` | `(ids: ID[]) => void` | Unselects specified nodes |
|
|
231
250
|
| `setSearchText` | `(searchText: string, searchKeys?: string[]) => void` | Set the search text and optionally the search keys. Default search key is "name"<br /><br />Recommended to call this inside a debounced function if you find any performance issue otherwise. |
|
|
232
251
|
| `scrollToNodeID` | `(params: `[ScrollToNodeParams](#scrolltonodeparams)`<ID>) => void;` | Scrolls the tree view to the node of the specified ID. |
|
|
233
252
|
| `getChildToParentMap` | `() => Map<ID, ID>` | Get the child to parent tree view map. |
|
|
253
|
+
| `moveNode` | `(nodeId: ID, targetNodeId: ID, position: `[DropPosition](#dropposition)`) => void` | Programmatically move a node to a new position. Works like drag-and-drop without user interaction. Useful for undo/redo or external state management. |
|
|
234
254
|
|
|
235
255
|
#### ScrollToNodeParams
|
|
236
256
|
| Property | Type | Required | Description |
|
|
@@ -311,9 +331,34 @@ Type: `boolean` OR `"indeterminate"`
|
|
|
311
331
|
| `isExpanded` | `boolean` | Yes | Whether the node is expanded or not |
|
|
312
332
|
| `onCheck` | `() => void` | Yes | Function to be called when the checkbox is pressed |
|
|
313
333
|
| `onExpand` | `() => void` | Yes | Function to be called when the expand button is pressed |
|
|
314
|
-
| `
|
|
334
|
+
| `isInvalidDropTarget` | `boolean` | No | Whether this node is an invalid drop target during drag |
|
|
335
|
+
| `isDropTarget` | `boolean` | No | Whether this node is the current valid drop target |
|
|
336
|
+
| `dropPosition` | `DropPosition` | No | The drop position if this node is the current drop target |
|
|
315
337
|
| `isDragging` | `boolean` | No | Whether a drag operation is in progress |
|
|
316
338
|
| `isDraggedNode`| `boolean` | No | Whether this node is the one being dragged |
|
|
339
|
+
| `dragHandleProps`| [DragHandleProps](#draghandleprops) | No | Touch handlers to spread on a drag handle element. Only present when drag-and-drop is enabled. Attach to a specific View to make only that area initiate drag, or spread on the root for whole-row drag. |
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
#### DragHandleProps
|
|
344
|
+
|
|
345
|
+
*Touch handlers to spread on a drag handle element within a custom node row.*
|
|
346
|
+
|
|
347
|
+
| Property | Type | Required | Description |
|
|
348
|
+
| -------------- | ------------------- | -------- | ------------------------------ |
|
|
349
|
+
| `onTouchStart` | `(e: any) => void` | Yes | Touch start handler for drag |
|
|
350
|
+
| `onTouchEnd` | `() => void` | Yes | Touch end handler |
|
|
351
|
+
| `onTouchCancel`| `() => void` | Yes | Touch cancel handler |
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
#### DragStartEvent`<ID = string>`
|
|
356
|
+
|
|
357
|
+
*The event object passed to the `onDragStart` callback when a drag begins.*
|
|
358
|
+
|
|
359
|
+
| Property | Type | Description |
|
|
360
|
+
| --------------- | --------------------------------------- | ------------------------------------------------------------ |
|
|
361
|
+
| `draggedNodeId` | `ID` | The id of the node being dragged |
|
|
317
362
|
|
|
318
363
|
---
|
|
319
364
|
|
|
@@ -328,19 +373,41 @@ Type: `boolean` OR `"indeterminate"`
|
|
|
328
373
|
| `position` | [DropPosition](#dropposition) | Where relative to the target: `above`/`below` = sibling, `inside` = child |
|
|
329
374
|
| `newTreeData` | `TreeNode<ID>[]` | The reordered tree data after the move |
|
|
330
375
|
|
|
376
|
+
#### DragCancelEvent`<ID = string>`
|
|
377
|
+
|
|
378
|
+
*The event object passed to the `onDragCancel` callback when a drag is cancelled without a successful drop.*
|
|
379
|
+
|
|
380
|
+
| Property | Type | Description |
|
|
381
|
+
| --------------- | --------------------------------------- | ------------------------------------------------------------ |
|
|
382
|
+
| `draggedNodeId` | `ID` | The id of the node that was being dragged |
|
|
383
|
+
|
|
331
384
|
#### DropPosition
|
|
332
385
|
|
|
333
386
|
Type: `"above"` | `"below"` | `"inside"`
|
|
334
387
|
|
|
335
388
|
---
|
|
336
389
|
|
|
390
|
+
#### DropAutoScrollOptions
|
|
391
|
+
|
|
392
|
+
*Options for auto-scrolling to the dropped node after a successful drop. Uses the same scroll parameters as [`scrollToNodeID`](#scrolltonodeparams).*
|
|
393
|
+
|
|
394
|
+
| Property | Type | Required | Description |
|
|
395
|
+
| -------------- | --------- | -------- | --------------------------------------------------------------- |
|
|
396
|
+
| `enabled` | `boolean` | No | Enable auto-scroll to the dropped node (default: true) |
|
|
397
|
+
| `animated` | `boolean` | No | Whether the scroll should be animated (default: true) |
|
|
398
|
+
| `viewOffset` | `number` | No | Fixed offset from the target position (in pixels) |
|
|
399
|
+
| `viewPosition` | `number` | No | Position in the viewport: 0 = top, 0.5 = center, 1 = bottom (default: 0.5) |
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
337
403
|
#### DragDropCustomizations`<ID>`
|
|
338
404
|
|
|
339
405
|
*Customizations for drag-and-drop visuals.*
|
|
340
406
|
|
|
341
407
|
| Property | Type | Required | Description |
|
|
342
408
|
| ------------------------------ | ------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------- |
|
|
343
|
-
| `draggedNodeOpacity` | `number` | No | Opacity of the
|
|
409
|
+
| `draggedNodeOpacity` | `number` | No | Opacity of the node being dragged (default: 0.3) |
|
|
410
|
+
| `invalidTargetOpacity` | `number` | No | Opacity of invalid drop targets during drag (default: 0.3) |
|
|
344
411
|
| `dropIndicatorStyleProps` | [DropIndicatorStyleProps](#dropindicatorstyleprops) | No | Style props for the built-in drop indicator |
|
|
345
412
|
| `dragOverlayStyleProps` | [DragOverlayStyleProps](#dragoverlaystyleprops) | No | Style props for the drag overlay (lifted node ghost) |
|
|
346
413
|
| `CustomDropIndicatorComponent` | `ComponentType<`[DropIndicatorComponentProps](#dropindicatorcomponentprops)`>` | No | Fully custom drop indicator component |
|
|
@@ -381,9 +448,11 @@ Type: `"above"` | `"below"` | `"inside"`
|
|
|
381
448
|
|
|
382
449
|
*Props passed to a custom drop indicator component (when using `CustomDropIndicatorComponent`).*
|
|
383
450
|
|
|
384
|
-
| Property
|
|
385
|
-
|
|
|
386
|
-
| `position`
|
|
451
|
+
| Property | Type | Required | Description |
|
|
452
|
+
| ------------------------ | ----------------------------- | -------- | ------------------------------------------------------------ |
|
|
453
|
+
| `position` | [DropPosition](#dropposition) | Yes | Whether the indicator is above, below, or inside the target |
|
|
454
|
+
| `level` | `number` | Yes | The nesting level of the target node (useful for indenting) |
|
|
455
|
+
| `indentationMultiplier` | `number` | Yes | Pixels per nesting level |
|
|
387
456
|
|
|
388
457
|
---
|
|
389
458
|
|
|
@@ -391,10 +460,11 @@ Type: `"above"` | `"below"` | `"inside"`
|
|
|
391
460
|
|
|
392
461
|
*Props passed to a custom drag overlay component (when using `CustomDragOverlayComponent`).*
|
|
393
462
|
|
|
394
|
-
| Property
|
|
395
|
-
|
|
|
396
|
-
| `node`
|
|
397
|
-
| `level`
|
|
463
|
+
| Property | Type | Required | Description |
|
|
464
|
+
| -------------- | ----------------------------------------- | -------- | ---------------------------------------- |
|
|
465
|
+
| `node` | `TreeNode<ID>` | Yes | The node being dragged |
|
|
466
|
+
| `level` | `number` | Yes | The nesting level of the node |
|
|
467
|
+
| `checkedValue` | [CheckboxValueType](#checkboxvaluetype) | Yes | The current checkbox value of the node |
|
|
398
468
|
|
|
399
469
|
---
|
|
400
470
|
|
|
@@ -424,7 +494,7 @@ Moves a node within a tree structure. Returns a new tree (no mutation). Useful i
|
|
|
424
494
|
- [x] Ref function to programatically expand/collapse a certain node
|
|
425
495
|
- [x] Ref function to programatically un/check a certain node
|
|
426
496
|
- [x] Ref function to auto-scroll to a certain node's position - available in 1.9.0+
|
|
427
|
-
- [x] Drag-and-drop reordering with customizable visuals
|
|
497
|
+
- [x] Drag-and-drop reordering with customizable visuals. Can now be done using `dragAndDrop` prop 🎉
|
|
428
498
|
|
|
429
499
|
If you do not see what you want in the planned feature list, raise a feature request.
|
|
430
500
|
|
|
@@ -448,16 +518,16 @@ MIT
|
|
|
448
518
|
## 🙏 Support the project
|
|
449
519
|
|
|
450
520
|
<p align="center" valign="center">
|
|
451
|
-
<a href="https://
|
|
452
|
-
<img src="
|
|
521
|
+
<a href="https://www.paypal.com/paypalme/jairajjangle001/usd">
|
|
522
|
+
<img src=".github/assets/paypal_donate.png" alt="Paypal_Donation_Button" height="50" >
|
|
453
523
|
</a>
|
|
454
524
|
|
|
455
|
-
<a href=".
|
|
456
|
-
<img src=".github/assets/
|
|
525
|
+
<a href="https://github.com/sponsors/JairajJangle">
|
|
526
|
+
<img src=".github/assets/github_sponsor.svg" alt="GitHub_Sponsor_Button" height="50" >
|
|
457
527
|
</a>
|
|
458
528
|
|
|
459
|
-
<a href="https://
|
|
460
|
-
<img src=".github/assets/
|
|
529
|
+
<a href="https://liberapay.com/FutureJJ/donate">
|
|
530
|
+
<img src=".github/assets/liberapay_donate.svg" alt="Liberapay_Donation_Button" height="50" >
|
|
461
531
|
</a>
|
|
462
532
|
</p>
|
|
463
533
|
|
package/lib/module/TreeView.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import { forwardRef, startTransition, useCallback, useEffect, useId, useImperativeHandle, useRef } from "react";
|
|
4
4
|
import NodeList from "./components/NodeList.js";
|
|
5
|
-
import { selectAll, selectAllFiltered, unselectAll, unselectAllFiltered, initializeNodeMaps, expandAll, collapseAll, toggleCheckboxes, expandNodes, collapseNodes } from "./helpers/index.js";
|
|
6
|
-
import { getTreeViewStore, useTreeViewStore } from "./store/treeView.store.js";
|
|
5
|
+
import { selectAll, selectAllFiltered, unselectAll, unselectAllFiltered, initializeNodeMaps, expandAll, collapseAll, toggleCheckboxes, expandNodes, collapseNodes, recalculateCheckedStates, moveTreeNode } from "./helpers/index.js";
|
|
6
|
+
import { deleteTreeViewStore, getTreeViewStore, useTreeViewStore } from "./store/treeView.store.js";
|
|
7
7
|
import usePreviousState from "./utils/usePreviousState.js";
|
|
8
8
|
import { useShallow } from "zustand/react/shallow";
|
|
9
9
|
import useDeepCompareEffect from "./utils/useDeepCompareEffect.js";
|
|
@@ -26,15 +26,9 @@ function _innerTreeView(props, ref) {
|
|
|
26
26
|
ExpandCollapseIconComponent,
|
|
27
27
|
ExpandCollapseTouchableComponent,
|
|
28
28
|
CustomNodeRowComponent,
|
|
29
|
-
|
|
30
|
-
onDragEnd,
|
|
31
|
-
longPressDuration,
|
|
32
|
-
autoScrollThreshold,
|
|
33
|
-
autoScrollSpeed,
|
|
34
|
-
dragOverlayOffset,
|
|
35
|
-
autoExpandDelay,
|
|
36
|
-
dragDropCustomizations
|
|
29
|
+
dragAndDrop
|
|
37
30
|
} = props;
|
|
31
|
+
const onDragEnd = dragAndDrop?.onDragEnd;
|
|
38
32
|
const storeId = useId();
|
|
39
33
|
const {
|
|
40
34
|
expanded,
|
|
@@ -61,7 +55,7 @@ function _innerTreeView(props, ref) {
|
|
|
61
55
|
setSelectionPropagation: state.setSelectionPropagation,
|
|
62
56
|
cleanUpTreeViewStore: state.cleanUpTreeViewStore
|
|
63
57
|
})));
|
|
64
|
-
|
|
58
|
+
useImperativeHandle(ref, () => ({
|
|
65
59
|
selectAll: () => selectAll(storeId),
|
|
66
60
|
unselectAll: () => unselectAll(storeId),
|
|
67
61
|
selectAllFiltered: () => selectAllFiltered(storeId),
|
|
@@ -74,14 +68,15 @@ function _innerTreeView(props, ref) {
|
|
|
74
68
|
unselectNodes: ids => unselectNodes(ids),
|
|
75
69
|
setSearchText,
|
|
76
70
|
scrollToNodeID,
|
|
77
|
-
getChildToParentMap
|
|
71
|
+
getChildToParentMap,
|
|
72
|
+
moveNode
|
|
78
73
|
}));
|
|
79
|
-
const scrollToNodeHandlerRef =
|
|
74
|
+
const scrollToNodeHandlerRef = useRef(null);
|
|
80
75
|
const prevSearchText = usePreviousState(searchText);
|
|
81
|
-
const internalDataRef =
|
|
76
|
+
const internalDataRef = useRef(null);
|
|
82
77
|
|
|
83
78
|
// Wrap onDragEnd to set internalDataRef before calling consumer's callback
|
|
84
|
-
const wrappedOnDragEnd =
|
|
79
|
+
const wrappedOnDragEnd = useCallback(event => {
|
|
85
80
|
internalDataRef.current = event.newTreeData;
|
|
86
81
|
onDragEnd?.(event);
|
|
87
82
|
}, [onDragEnd]);
|
|
@@ -120,20 +115,33 @@ function _innerTreeView(props, ref) {
|
|
|
120
115
|
const treeViewStore = getTreeViewStore(storeId);
|
|
121
116
|
return treeViewStore.getState().childToParentMap;
|
|
122
117
|
}
|
|
123
|
-
|
|
118
|
+
function moveNode(nodeId, targetNodeId, position) {
|
|
119
|
+
const store = getTreeViewStore(storeId);
|
|
120
|
+
const currentData = store.getState().initialTreeViewData;
|
|
121
|
+
const newData = moveTreeNode(currentData, nodeId, targetNodeId, position);
|
|
122
|
+
store.getState().updateInitialTreeViewData(newData);
|
|
123
|
+
initializeNodeMaps(storeId, newData);
|
|
124
|
+
recalculateCheckedStates(storeId);
|
|
125
|
+
if (position === "inside") {
|
|
126
|
+
expandNodes(storeId, [targetNodeId]);
|
|
127
|
+
}
|
|
128
|
+
expandNodes(storeId, [nodeId], true);
|
|
129
|
+
internalDataRef.current = newData;
|
|
130
|
+
}
|
|
131
|
+
const getIds = useCallback(node => {
|
|
124
132
|
if (!node.children || node.children.length === 0) {
|
|
125
133
|
return [node.id];
|
|
126
134
|
} else {
|
|
127
135
|
return [node.id, ...node.children.flatMap(item => getIds(item))];
|
|
128
136
|
}
|
|
129
137
|
}, []);
|
|
130
|
-
|
|
138
|
+
useEffect(() => {
|
|
131
139
|
onCheck?.(Array.from(checked), Array.from(indeterminate));
|
|
132
140
|
}, [onCheck, checked, indeterminate]);
|
|
133
|
-
|
|
141
|
+
useEffect(() => {
|
|
134
142
|
onExpand?.(Array.from(expanded));
|
|
135
143
|
}, [onExpand, expanded]);
|
|
136
|
-
|
|
144
|
+
useEffect(() => {
|
|
137
145
|
if (searchText) {
|
|
138
146
|
startTransition(() => {
|
|
139
147
|
updateExpanded(new Set(initialTreeViewData.flatMap(item => getIds(item))));
|
|
@@ -146,11 +154,12 @@ function _innerTreeView(props, ref) {
|
|
|
146
154
|
});
|
|
147
155
|
}
|
|
148
156
|
}, [getIds, initialTreeViewData, prevSearchText, searchText, updateExpanded]);
|
|
149
|
-
|
|
157
|
+
useEffect(() => {
|
|
150
158
|
return () => {
|
|
151
159
|
cleanUpTreeViewStore();
|
|
160
|
+
deleteTreeViewStore(storeId);
|
|
152
161
|
};
|
|
153
|
-
}, [cleanUpTreeViewStore]);
|
|
162
|
+
}, [cleanUpTreeViewStore, storeId]);
|
|
154
163
|
return /*#__PURE__*/_jsx(NodeList, {
|
|
155
164
|
storeId: storeId,
|
|
156
165
|
scrollToNodeHandlerRef: scrollToNodeHandlerRef,
|
|
@@ -162,16 +171,12 @@ function _innerTreeView(props, ref) {
|
|
|
162
171
|
ExpandCollapseIconComponent: ExpandCollapseIconComponent,
|
|
163
172
|
ExpandCollapseTouchableComponent: ExpandCollapseTouchableComponent,
|
|
164
173
|
CustomNodeRowComponent: CustomNodeRowComponent,
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
autoScrollSpeed: autoScrollSpeed,
|
|
170
|
-
dragOverlayOffset: dragOverlayOffset,
|
|
171
|
-
autoExpandDelay: autoExpandDelay,
|
|
172
|
-
dragDropCustomizations: dragDropCustomizations
|
|
174
|
+
dragAndDrop: dragAndDrop && {
|
|
175
|
+
...dragAndDrop,
|
|
176
|
+
onDragEnd: wrappedOnDragEnd
|
|
177
|
+
}
|
|
173
178
|
});
|
|
174
179
|
}
|
|
175
|
-
const _TreeView = /*#__PURE__*/
|
|
180
|
+
const _TreeView = /*#__PURE__*/forwardRef(_innerTreeView);
|
|
176
181
|
export const TreeView = typedMemo(_TreeView);
|
|
177
182
|
//# sourceMappingURL=TreeView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["forwardRef","startTransition","useCallback","useEffect","useId","useImperativeHandle","useRef","NodeList","selectAll","selectAllFiltered","unselectAll","unselectAllFiltered","initializeNodeMaps","expandAll","collapseAll","toggleCheckboxes","expandNodes","collapseNodes","recalculateCheckedStates","moveTreeNode","deleteTreeViewStore","getTreeViewStore","useTreeViewStore","usePreviousState","useShallow","useDeepCompareEffect","typedMemo","fastIsEqual","jsx","_jsx","_innerTreeView","props","ref","data","onCheck","onExpand","selectionPropagation","preselectedIds","preExpandedIds","initialScrollNodeID","treeFlashListProps","checkBoxViewStyleProps","indentationMultiplier","CheckboxComponent","ExpandCollapseIconComponent","ExpandCollapseTouchableComponent","CustomNodeRowComponent","dragAndDrop","onDragEnd","storeId","expanded","updateExpanded","initialTreeViewData","updateInitialTreeViewData","searchText","updateSearchText","updateSearchKeys","checked","indeterminate","setSelectionPropagation","cleanUpTreeViewStore","state","ids","selectNodes","unselectNodes","setSearchText","scrollToNodeID","getChildToParentMap","moveNode","scrollToNodeHandlerRef","prevSearchText","internalDataRef","wrappedOnDragEnd","event","current","newTreeData","text","keys","params","treeViewStore","getState","childToParentMap","nodeId","targetNodeId","position","store","currentData","newData","getIds","node","children","length","id","flatMap","item","Array","from","Set","_TreeView","TreeView"],"sourceRoot":"../../src","sources":["TreeView.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import { memo, useCallback } from "react";
|
|
4
4
|
import { Platform, StyleSheet, Text, TouchableOpacity, View } from "react-native";
|
|
5
5
|
import { Checkbox } from "@futurejj/react-native-checkbox";
|
|
6
|
+
|
|
7
|
+
// Intentionally narrow: only re-render when the checkbox value or label text changes.
|
|
8
|
+
// Other props (callbacks, styles) are stable references from parent memoization.
|
|
6
9
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
7
10
|
function arePropsEqual(prevProps, nextProps) {
|
|
8
11
|
return prevProps.value === nextProps.value && prevProps.text === nextProps.text;
|
|
9
12
|
}
|
|
10
|
-
export const CheckboxView = /*#__PURE__*/
|
|
13
|
+
export const CheckboxView = /*#__PURE__*/memo(_CheckboxView, arePropsEqual);
|
|
11
14
|
function _CheckboxView(props) {
|
|
12
15
|
const {
|
|
13
16
|
value,
|
|
@@ -23,7 +26,7 @@ function _CheckboxView(props) {
|
|
|
23
26
|
ellipsizeMode: "middle"
|
|
24
27
|
}
|
|
25
28
|
} = props;
|
|
26
|
-
const customCheckboxValToCheckboxValType =
|
|
29
|
+
const customCheckboxValToCheckboxValType = useCallback(customCheckboxValueType => {
|
|
27
30
|
return customCheckboxValueType === "indeterminate" ? "indeterminate" : customCheckboxValueType ? "checked" : "unchecked";
|
|
28
31
|
}, []);
|
|
29
32
|
|
|
@@ -33,7 +36,7 @@ function _CheckboxView(props) {
|
|
|
33
36
|
*
|
|
34
37
|
* @param newValue This represents the updated CheckBox value after it's clicked.
|
|
35
38
|
*/
|
|
36
|
-
const onValueChangeModifier =
|
|
39
|
+
const onValueChangeModifier = useCallback(() => {
|
|
37
40
|
// If the previous state was 'indeterminate', set checked to true
|
|
38
41
|
if (value === "indeterminate") onValueChange(true);else onValueChange(!value);
|
|
39
42
|
}, [onValueChange, value]);
|
|
@@ -73,6 +76,7 @@ export const defaultCheckboxViewStyles = StyleSheet.create({
|
|
|
73
76
|
},
|
|
74
77
|
checkboxTextStyle: {
|
|
75
78
|
color: "black",
|
|
79
|
+
/* istanbul ignore next -- Platform.OS is never "android" in jest */
|
|
76
80
|
marginTop: Platform.OS === "android" ? 2 : undefined
|
|
77
81
|
}
|
|
78
82
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["memo","useCallback","Platform","StyleSheet","Text","TouchableOpacity","View","Checkbox","jsx","_jsx","jsxs","_jsxs","arePropsEqual","prevProps","nextProps","value","text","CheckboxView","_CheckboxView","props","onValueChange","outermostParentViewStyle","defaultCheckboxViewStyles","mainView","checkboxParentViewStyle","checkboxView","textTouchableStyle","checkboxProps","textProps","style","checkboxTextStyle","numberOfLines","ellipsizeMode","customCheckboxValToCheckboxValType","customCheckboxValueType","onValueChangeModifier","children","testID","status","onPress","create","alignSelf","alignItems","flexDirection","marginEnd","marginStart","transform","scale","color","marginTop","OS","undefined"],"sourceRoot":"../../../src","sources":["components/CheckboxView.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import { memo } from "react";
|
|
4
4
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
5
|
// Function to dynamically load FontAwesomeIcon from either Expo or React Native
|
|
6
6
|
function loadFontAwesomeIcon() {
|
|
@@ -18,7 +18,7 @@ function loadFontAwesomeIcon() {
|
|
|
18
18
|
|
|
19
19
|
// Load the FontAwesomeIcon component
|
|
20
20
|
const FontAwesomeIcon = loadFontAwesomeIcon();
|
|
21
|
-
export const CustomExpandCollapseIcon = /*#__PURE__*/
|
|
21
|
+
export const CustomExpandCollapseIcon = /*#__PURE__*/memo(_CustomExpandCollapseIcon);
|
|
22
22
|
function _CustomExpandCollapseIcon(props) {
|
|
23
23
|
const {
|
|
24
24
|
isExpanded
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["memo","jsx","_jsx","loadFontAwesomeIcon","require","default","e","error","console","FontAwesomeIcon","CustomExpandCollapseIcon","_CustomExpandCollapseIcon","props","isExpanded","warn","name","size","color"],"sourceRoot":"../../../src","sources":["components/CustomExpandCollapseIcon.tsx"],"mappings":";;AAAA,SAASA,IAAI,QAAQ,OAAO;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAG7B;AACA,SAASC,mBAAmBA,CAAA,EAAG;EAC3B,IAAI;IACA,OAAOC,OAAO,CAAC,gCAAgC,CAAC,CAACC,OAAO;EAC5D,CAAC,CAAC,OAAOC,CAAC,EAAE;IACR,IAAI;MACA,OAAOF,OAAO,CAAC,uCAAuC,CAAC,CAACC,OAAO;IACnE,CAAC,CAAC,OAAOE,KAAK,EAAE;MACZC,OAAO,CAACD,KAAK,CACT,0GACJ,CAAC;MACD,OAAO,IAAI;IACf;EACJ;AACJ;;AAEA;AACA,MAAME,eAAe,GAAGN,mBAAmB,CAAC,CAAC;AAE7C,OAAO,MAAMO,wBAAwB,gBAAGV,IAAI,CACxCW,yBACJ,CAAC;AAED,SAASA,yBAAyBA,CAACC,KAAsB,EAAE;EACvD,MAAM;IAAEC;EAAW,CAAC,GAAGD,KAAK;;EAE5B;EACA,IAAI,CAACH,eAAe,EAAE;IAClBD,OAAO,CAACM,IAAI,CAAC,kCAAkC,CAAC;IAChD,OAAO,IAAI;EACf;EAEA,oBACIZ,IAAA,CAACO,eAAe;IACZM,IAAI,EACAF,UAAU,GACJ,YAAY,GACZ,aACT;IACDG,IAAI,EAAE,EAAG;IACTC,KAAK,EAAC;EAAO,CAChB,CAAC;AAEV","ignoreList":[]}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import React from "react";
|
|
4
3
|
import { Animated, StyleSheet, View } from "react-native";
|
|
5
4
|
import { CheckboxView } from "./CheckboxView.js";
|
|
6
5
|
import { CustomExpandCollapseIcon } from "./CustomExpandCollapseIcon.js";
|
|
7
6
|
import { defaultIndentationMultiplier } from "../constants/treeView.constants.js";
|
|
7
|
+
import { getTreeViewStore } from "../store/treeView.store.js";
|
|
8
|
+
import { getCheckboxValue } from "../helpers/index.js";
|
|
9
|
+
import { typedMemo } from "../utils/typedMemo.js";
|
|
8
10
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
11
|
function _DragOverlay(props) {
|
|
10
12
|
const {
|
|
13
|
+
storeId,
|
|
11
14
|
overlayY,
|
|
12
15
|
overlayX,
|
|
13
16
|
node,
|
|
@@ -19,6 +22,14 @@ function _DragOverlay(props) {
|
|
|
19
22
|
checkBoxViewStyleProps,
|
|
20
23
|
dragDropCustomizations
|
|
21
24
|
} = props;
|
|
25
|
+
|
|
26
|
+
// Read the actual checked state for the dragged node
|
|
27
|
+
const store = getTreeViewStore(storeId);
|
|
28
|
+
const {
|
|
29
|
+
checked,
|
|
30
|
+
indeterminate
|
|
31
|
+
} = store.getState();
|
|
32
|
+
const checkedValue = getCheckboxValue(checked.has(node.id), indeterminate.has(node.id));
|
|
22
33
|
const overlayStyleProps = dragDropCustomizations?.dragOverlayStyleProps;
|
|
23
34
|
const CustomOverlay = dragDropCustomizations?.CustomDragOverlayComponent;
|
|
24
35
|
return /*#__PURE__*/_jsx(Animated.View, {
|
|
@@ -48,11 +59,12 @@ function _DragOverlay(props) {
|
|
|
48
59
|
}],
|
|
49
60
|
children: CustomOverlay ? /*#__PURE__*/_jsx(CustomOverlay, {
|
|
50
61
|
node: node,
|
|
51
|
-
level: level
|
|
62
|
+
level: level,
|
|
63
|
+
checkedValue: checkedValue
|
|
52
64
|
}) : CustomNodeRowComponent ? /*#__PURE__*/_jsx(CustomNodeRowComponent, {
|
|
53
65
|
node: node,
|
|
54
66
|
level: level,
|
|
55
|
-
checkedValue:
|
|
67
|
+
checkedValue: checkedValue,
|
|
56
68
|
isExpanded: false,
|
|
57
69
|
onCheck: () => {},
|
|
58
70
|
onExpand: () => {}
|
|
@@ -63,7 +75,7 @@ function _DragOverlay(props) {
|
|
|
63
75
|
children: [/*#__PURE__*/_jsx(CheckboxComponent, {
|
|
64
76
|
text: node.name,
|
|
65
77
|
onValueChange: () => {},
|
|
66
|
-
value:
|
|
78
|
+
value: checkedValue,
|
|
67
79
|
...checkBoxViewStyleProps
|
|
68
80
|
}), node.children?.length ? /*#__PURE__*/_jsx(View, {
|
|
69
81
|
style: styles.expandArrow,
|
|
@@ -74,7 +86,7 @@ function _DragOverlay(props) {
|
|
|
74
86
|
})
|
|
75
87
|
});
|
|
76
88
|
}
|
|
77
|
-
export const DragOverlay =
|
|
89
|
+
export const DragOverlay = typedMemo(_DragOverlay);
|
|
78
90
|
const styles = StyleSheet.create({
|
|
79
91
|
overlay: {
|
|
80
92
|
position: "absolute",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["Animated","StyleSheet","View","CheckboxView","CustomExpandCollapseIcon","defaultIndentationMultiplier","getTreeViewStore","getCheckboxValue","typedMemo","jsx","_jsx","jsxs","_jsxs","_DragOverlay","props","storeId","overlayY","overlayX","node","level","indentationMultiplier","CheckboxComponent","ExpandCollapseIconComponent","CustomNodeRowComponent","checkBoxViewStyleProps","dragDropCustomizations","store","checked","indeterminate","getState","checkedValue","has","id","overlayStyleProps","dragOverlayStyleProps","CustomOverlay","CustomDragOverlayComponent","pointerEvents","style","styles","overlay","backgroundColor","shadowColor","shadowOpacity","shadowRadius","elevation","transform","translateX","translateY","children","isExpanded","onCheck","onExpand","nodeRow","paddingStart","text","name","onValueChange","value","length","expandArrow","DragOverlay","create","position","left","right","zIndex","shadowOffset","width","height","flex","flexDirection","alignItems","minWidth"],"sourceRoot":"../../../src","sources":["components/DragOverlay.tsx"],"mappings":"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","ignoreList":[]}
|