react-native-tree-multi-select 1.2.0 → 1.2.3
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/.editorconfig +15 -0
- package/.gitattributes +3 -0
- package/.github/FUNDING.yml +13 -0
- package/.github/ISSUE_TEMPLATE/bug-report.md +42 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +30 -0
- package/.github/actions/setup/action.yml +28 -0
- package/.github/assets/Jairaj_Jangle_Google_Pay_UPI_QR_Code.jpg +0 -0
- package/.github/assets/paypal_donate.png +0 -0
- package/.github/assets/upi.png +0 -0
- package/.github/workflows/ci.yml +225 -0
- package/.gitignore +73 -0
- package/.nvmrc +1 -0
- package/.watchmanconfig +1 -0
- package/.yarnrc +3 -0
- package/CHANGELOG.md +145 -0
- package/CODE_OF_CONDUCT.md +133 -0
- package/CONTRIBUTING.md +114 -0
- package/README.md +12 -3
- package/babel.config.js +3 -0
- package/example/.bundle/config +2 -0
- package/example/.watchmanconfig +1 -0
- package/example/Gemfile +6 -0
- package/example/README.md +79 -0
- package/example/android/app/build.gradle +130 -0
- package/example/android/app/debug.keystore +0 -0
- package/example/android/app/proguard-rules.pro +10 -0
- package/example/android/app/src/debug/AndroidManifest.xml +13 -0
- package/example/android/app/src/debug/java/com/treemultiselectexample/ReactNativeFlipper.java +75 -0
- package/example/android/app/src/main/AndroidManifest.xml +25 -0
- package/example/android/app/src/main/java/com/treemultiselectexample/MainActivity.java +32 -0
- package/example/android/app/src/main/java/com/treemultiselectexample/MainApplication.java +62 -0
- package/example/android/app/src/main/res/drawable/rn_edit_text_material.xml +36 -0
- package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/values/strings.xml +3 -0
- package/example/android/app/src/main/res/values/styles.xml +9 -0
- package/example/android/app/src/release/java/com/treemultiselectexample/ReactNativeFlipper.java +20 -0
- package/example/android/build.gradle +23 -0
- package/example/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/example/android/gradle/wrapper/gradle-wrapper.properties +6 -0
- package/example/android/gradle.properties +44 -0
- package/example/android/gradlew +244 -0
- package/example/android/gradlew.bat +92 -0
- package/example/android/settings.gradle +4 -0
- package/example/app.json +4 -0
- package/example/babel.config.js +17 -0
- package/example/index.js +5 -0
- package/example/ios/.xcode.env +11 -0
- package/example/ios/File.swift +6 -0
- package/example/ios/Podfile +62 -0
- package/example/ios/Podfile.lock +639 -0
- package/example/ios/TreeMultiSelectExample/AppDelegate.h +6 -0
- package/example/ios/TreeMultiSelectExample/AppDelegate.mm +26 -0
- package/example/ios/TreeMultiSelectExample/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
- package/example/ios/TreeMultiSelectExample/Images.xcassets/Contents.json +6 -0
- package/example/ios/TreeMultiSelectExample/Info.plist +74 -0
- package/example/ios/TreeMultiSelectExample/LaunchScreen.storyboard +47 -0
- package/example/ios/TreeMultiSelectExample/main.m +10 -0
- package/example/ios/TreeMultiSelectExample-Bridging-Header.h +3 -0
- package/example/ios/TreeMultiSelectExample.xcodeproj/project.pbxproj +706 -0
- package/example/ios/TreeMultiSelectExample.xcodeproj/xcshareddata/xcschemes/TreeMultiSelectExample.xcscheme +88 -0
- package/example/ios/TreeMultiSelectExample.xcworkspace/contents.xcworkspacedata +10 -0
- package/example/ios/TreeMultiSelectExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/example/ios/TreeMultiSelectExampleTests/Info.plist +24 -0
- package/example/ios/TreeMultiSelectExampleTests/TreeMultiSelectExampleTests.m +66 -0
- package/example/metro.config.js +45 -0
- package/example/package.json +41 -0
- package/example/react-native.config.js +10 -0
- package/example/src/App.tsx +70 -0
- package/example/src/components/CustomArrow.tsx +71 -0
- package/example/src/components/CustomCheckboxView.tsx +119 -0
- package/example/src/components/CustomNodeRowView.tsx +124 -0
- package/example/src/components/SearchInput.tsx +68 -0
- package/example/src/screens/CustomArrowScreen.tsx +99 -0
- package/example/src/screens/CustomCheckboxScreen.tsx +99 -0
- package/example/src/screens/CustomNodeRowViewScreen.tsx +99 -0
- package/example/src/screens/LargeDataScreen.tsx +95 -0
- package/example/src/screens/MediumDataScreen.tsx +96 -0
- package/example/src/screens/SmallDataScreen.tsx +96 -0
- package/example/src/screens/screens.styles.ts +25 -0
- package/example/src/utils/sampleDataGenerator.ts +32 -0
- package/example/yarn.lock +6368 -0
- package/lefthook.yml +17 -0
- package/lib/commonjs/TreeView.js +13 -3
- package/lib/commonjs/TreeView.js.map +1 -1
- package/lib/commonjs/helpers/expandCollapse.helper.js +88 -21
- package/lib/commonjs/helpers/expandCollapse.helper.js.map +1 -1
- package/lib/commonjs/helpers/toggleCheckbox.helper.js +0 -1
- package/lib/commonjs/helpers/toggleCheckbox.helper.js.map +1 -1
- package/lib/commonjs/utils/usePreviousState.js +20 -0
- package/lib/commonjs/utils/usePreviousState.js.map +1 -0
- package/lib/module/TreeView.js +14 -4
- package/lib/module/TreeView.js.map +1 -1
- package/lib/module/helpers/expandCollapse.helper.js +86 -21
- package/lib/module/helpers/expandCollapse.helper.js.map +1 -1
- package/lib/module/helpers/toggleCheckbox.helper.js +0 -1
- package/lib/module/helpers/toggleCheckbox.helper.js.map +1 -1
- package/lib/module/utils/usePreviousState.js +15 -0
- package/lib/module/utils/usePreviousState.js.map +1 -0
- package/lib/typescript/TreeView.d.ts.map +1 -1
- package/lib/typescript/__mocks__/generateTree.mock.d.ts +17 -0
- package/lib/typescript/__mocks__/generateTree.mock.d.ts.map +1 -0
- package/lib/typescript/__mocks__/zustand.d.ts +3 -0
- package/lib/typescript/__mocks__/zustand.d.ts.map +1 -0
- package/lib/typescript/__tests__/expandCollapse.helper.test.d.ts +2 -0
- package/lib/typescript/__tests__/expandCollapse.helper.test.d.ts.map +1 -0
- package/lib/typescript/__tests__/flattenTree.helper.test.d.ts +2 -0
- package/lib/typescript/__tests__/flattenTree.helper.test.d.ts.map +1 -0
- package/lib/typescript/__tests__/initNodeMap.helper.test.d.ts +2 -0
- package/lib/typescript/__tests__/initNodeMap.helper.test.d.ts.map +1 -0
- package/lib/typescript/__tests__/search.helper.test.d.ts +2 -0
- package/lib/typescript/__tests__/search.helper.test.d.ts.map +1 -0
- package/lib/typescript/__tests__/selectAll.helper.test.d.ts +2 -0
- package/lib/typescript/__tests__/selectAll.helper.test.d.ts.map +1 -0
- package/lib/typescript/__tests__/store.test.d.ts +2 -0
- package/lib/typescript/__tests__/store.test.d.ts.map +1 -0
- package/lib/typescript/__tests__/toggleCheckbox.helper.test.d.ts +2 -0
- package/lib/typescript/__tests__/toggleCheckbox.helper.test.d.ts.map +1 -0
- package/lib/typescript/helpers/expandCollapse.helper.d.ts +12 -0
- package/lib/typescript/helpers/expandCollapse.helper.d.ts.map +1 -1
- package/lib/typescript/types/treeView.types.d.ts +3 -0
- package/lib/typescript/types/treeView.types.d.ts.map +1 -1
- package/lib/typescript/utils/usePreviousState.d.ts +7 -0
- package/lib/typescript/utils/usePreviousState.d.ts.map +1 -0
- package/package.json +5 -3
- package/scripts/bootstrap.js +29 -0
- package/src/TreeView.tsx +25 -4
- package/src/__mocks__/generateTree.mock.ts +125 -0
- package/src/__mocks__/zustand.ts +24 -0
- package/src/__tests__/expandCollapse.helper.test.ts +189 -0
- package/src/__tests__/flattenTree.helper.test.ts +78 -0
- package/src/__tests__/initNodeMap.helper.test.ts +46 -0
- package/src/__tests__/search.helper.test.ts +47 -0
- package/src/__tests__/selectAll.helper.test.ts +233 -0
- package/src/__tests__/store.test.ts +208 -0
- package/src/__tests__/toggleCheckbox.helper.test.ts +124 -0
- package/src/helpers/expandCollapse.helper.ts +82 -21
- package/src/helpers/toggleCheckbox.helper.ts +1 -1
- package/src/types/treeView.types.ts +5 -0
- package/src/utils/usePreviousState.ts +16 -0
- package/tsconfig.build.json +5 -0
- package/tsconfig.json +31 -0
- package/turbo.json +34 -0
- package/yarn.lock +9953 -0
|
@@ -33,28 +33,8 @@ export function handleToggleExpand(id: string) {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
/**
|
|
37
|
-
* Finds a node in the tree by its ID.
|
|
38
|
-
*
|
|
39
|
-
* @param nodes - The array of tree nodes to search through.
|
|
40
|
-
* @returns The found tree node, or undefined if not found.
|
|
41
|
-
*/
|
|
42
|
-
function findNode(nodes: TreeNode[]): TreeNode | undefined {
|
|
43
|
-
for (let node of nodes) {
|
|
44
|
-
if (node.id === id) {
|
|
45
|
-
return node;
|
|
46
|
-
} else if (node.children) {
|
|
47
|
-
const found = findNode(node.children);
|
|
48
|
-
if (found) {
|
|
49
|
-
return found;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return undefined;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
36
|
// Find the node to expand or collapse
|
|
57
|
-
const node = findNode(initialTreeViewData);
|
|
37
|
+
const node = findNode(initialTreeViewData, id);
|
|
58
38
|
|
|
59
39
|
if (expanded.has(id)) {
|
|
60
40
|
// If the node is currently expanded, collapse it and its descendants
|
|
@@ -97,3 +77,84 @@ export function collapseAll() {
|
|
|
97
77
|
const newExpanded = new Set<string>();
|
|
98
78
|
updateExpanded(newExpanded);
|
|
99
79
|
};
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Expand tree nodes of given ids. If the id is of a child, it also expands
|
|
83
|
+
* the parent which it belongs to.
|
|
84
|
+
* @param ids Ids of nodes to expand.
|
|
85
|
+
*/
|
|
86
|
+
export function expandNodes(ids: string[]) {
|
|
87
|
+
const { expanded, updateExpanded, childToParentMap } = useTreeViewStore.getState();
|
|
88
|
+
const newExpanded = new Set(expanded);
|
|
89
|
+
const processedParents = new Set(); // To track already processed parents
|
|
90
|
+
|
|
91
|
+
ids.forEach(id => {
|
|
92
|
+
newExpanded.add(id); // Start by adding the node ID to the set
|
|
93
|
+
let currentId = id;
|
|
94
|
+
|
|
95
|
+
while (currentId && childToParentMap.has(currentId) && !processedParents.has(currentId)) {
|
|
96
|
+
const parentId = childToParentMap.get(currentId);
|
|
97
|
+
if (parentId) {
|
|
98
|
+
if (!newExpanded.has(parentId)) {
|
|
99
|
+
newExpanded.add(parentId); // Add the parent ID only if not already processed
|
|
100
|
+
processedParents.add(parentId);
|
|
101
|
+
}
|
|
102
|
+
currentId = parentId; // Move up to the next parent
|
|
103
|
+
} else {
|
|
104
|
+
break; // Break the loop if there's no further parent
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
updateExpanded(newExpanded);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Collapse tree nodes of given ids. If the id is of a parent, it also collapses
|
|
114
|
+
* the children inside it.
|
|
115
|
+
* @param ids Ids of nodes to collapse.
|
|
116
|
+
*/
|
|
117
|
+
export function collapseNodes(ids: string[]) {
|
|
118
|
+
const { expanded, updateExpanded, nodeMap } = useTreeViewStore.getState();
|
|
119
|
+
const newExpanded = new Set(expanded);
|
|
120
|
+
|
|
121
|
+
// Function to recursively remove child nodes from the expanded set
|
|
122
|
+
const deleteChildrenFromExpanded = (nodeId: string, visited = new Set()) => {
|
|
123
|
+
if (visited.has(nodeId)) return; // Prevent redundant processing
|
|
124
|
+
visited.add(nodeId);
|
|
125
|
+
|
|
126
|
+
const node = nodeMap.get(nodeId);
|
|
127
|
+
node?.children?.forEach(child => {
|
|
128
|
+
newExpanded.delete(child.id);
|
|
129
|
+
deleteChildrenFromExpanded(child.id, visited);
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
ids.forEach(id => {
|
|
134
|
+
// Remove the node ID from the set and all its children
|
|
135
|
+
newExpanded.delete(id);
|
|
136
|
+
deleteChildrenFromExpanded(id);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
updateExpanded(newExpanded);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Finds a node in the tree by its ID.
|
|
144
|
+
*
|
|
145
|
+
* @param nodes - The array of tree nodes to search through.
|
|
146
|
+
* @returns The found tree node, or undefined if not found.
|
|
147
|
+
*/
|
|
148
|
+
function findNode(nodes: TreeNode[], parentId: string): TreeNode | undefined {
|
|
149
|
+
for (let node of nodes) {
|
|
150
|
+
if (node.id === parentId) {
|
|
151
|
+
return node;
|
|
152
|
+
} else if (node.children) {
|
|
153
|
+
const found = findNode(node.children, parentId);
|
|
154
|
+
if (found) {
|
|
155
|
+
return found;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
@@ -72,6 +72,8 @@ export interface TreeViewProps extends NodeListProps {
|
|
|
72
72
|
onExpand?: (expandedIds: string[]) => void;
|
|
73
73
|
|
|
74
74
|
preselectedIds?: string[];
|
|
75
|
+
|
|
76
|
+
preExpandedIds?: string[];
|
|
75
77
|
}
|
|
76
78
|
|
|
77
79
|
type CheckboxProps = Omit<RNPaperCheckboxAndroidProps, "onPress" | "status">;
|
|
@@ -107,5 +109,8 @@ export interface TreeViewRef {
|
|
|
107
109
|
expandAll: () => void;
|
|
108
110
|
collapseAll: () => void;
|
|
109
111
|
|
|
112
|
+
expandNodes: (ids: string[]) => void;
|
|
113
|
+
collapseNodes: (ids: string[]) => void;
|
|
114
|
+
|
|
110
115
|
setSearchText: (searchText: string, searchKeys?: string[]) => void;
|
|
111
116
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Get previous value of a state
|
|
5
|
+
* @param value state
|
|
6
|
+
* @returns previous value of @param value after it's updated
|
|
7
|
+
*/
|
|
8
|
+
export default function usePreviousState<T>(value: T) {
|
|
9
|
+
const ref = useRef<T>();
|
|
10
|
+
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
ref.current = value;
|
|
13
|
+
}, [value]);
|
|
14
|
+
|
|
15
|
+
return ref.current;
|
|
16
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"exclude": [
|
|
3
|
+
"node_modules"
|
|
4
|
+
],
|
|
5
|
+
"compilerOptions": {
|
|
6
|
+
"baseUrl": "./",
|
|
7
|
+
"paths": {
|
|
8
|
+
"react-native-tree-multi-select": ["./src/index"]
|
|
9
|
+
},
|
|
10
|
+
"allowUnreachableCode": false,
|
|
11
|
+
"allowUnusedLabels": false,
|
|
12
|
+
"esModuleInterop": true,
|
|
13
|
+
"forceConsistentCasingInFileNames": true,
|
|
14
|
+
"jsx": "react",
|
|
15
|
+
"lib": ["esnext", "dom"],
|
|
16
|
+
"module": "esnext",
|
|
17
|
+
"moduleResolution": "node",
|
|
18
|
+
"noFallthroughCasesInSwitch": true,
|
|
19
|
+
"noImplicitReturns": true,
|
|
20
|
+
"noImplicitUseStrict": false,
|
|
21
|
+
"noStrictGenericChecks": false,
|
|
22
|
+
"noUncheckedIndexedAccess": true,
|
|
23
|
+
"noUnusedLocals": true,
|
|
24
|
+
"noUnusedParameters": true,
|
|
25
|
+
"resolveJsonModule": true,
|
|
26
|
+
"skipLibCheck": true,
|
|
27
|
+
"strict": true,
|
|
28
|
+
"target": "esnext",
|
|
29
|
+
"verbatimModuleSyntax": false
|
|
30
|
+
}
|
|
31
|
+
}
|
package/turbo.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://turbo.build/schema.json",
|
|
3
|
+
"pipeline": {
|
|
4
|
+
"build:android": {
|
|
5
|
+
"inputs": [
|
|
6
|
+
"package.json",
|
|
7
|
+
"android",
|
|
8
|
+
"!android/build",
|
|
9
|
+
"src/*.ts",
|
|
10
|
+
"src/*.tsx",
|
|
11
|
+
"example/package.json",
|
|
12
|
+
"example/android",
|
|
13
|
+
"!example/android/.gradle",
|
|
14
|
+
"!example/android/build",
|
|
15
|
+
"!example/android/app/build"
|
|
16
|
+
],
|
|
17
|
+
"outputs": []
|
|
18
|
+
},
|
|
19
|
+
"build:ios": {
|
|
20
|
+
"inputs": [
|
|
21
|
+
"package.json",
|
|
22
|
+
"*.podspec",
|
|
23
|
+
"ios",
|
|
24
|
+
"src/*.ts",
|
|
25
|
+
"src/*.tsx",
|
|
26
|
+
"example/package.json",
|
|
27
|
+
"example/ios",
|
|
28
|
+
"!example/ios/build",
|
|
29
|
+
"!example/ios/Pods"
|
|
30
|
+
],
|
|
31
|
+
"outputs": []
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|