UNPKG

react-native-tree-multi-select

Version:

A super-fast, customizable tree view component for React Native with multi-selection, checkboxes, and search filtering capabilities.

77 lines (70 loc) 2.81 kB
import { TreeNode } from "../types/treeView.types"; /** * Get filtered tree data based on the search term and the search keys * If any of the parent contains the search term, the tree will also contain * it's children. * * If only one of the innermost children contains the search term then it's siblings * won't be included in the search. But all it's ancestor nodes will be included * * @param nodes Input tree data * @param trimmedSearchTerm search term * @param searchKeys search key * @returns filtered tree data */ export function getFilteredTreeData<ID>( nodes: TreeNode<ID>[], trimmedSearchTerm: string, searchKeys: string[] ): TreeNode<ID>[] { let filtered: TreeNode<ID>[] = []; for (let node of nodes) { const isSearchTermInNode = doesNodeContainSearchTerm( node, trimmedSearchTerm, searchKeys ); if (!trimmedSearchTerm || isSearchTermInNode) { // If node itself matches, include it and all its descendants filtered.push(node); } else if (node.children) { // If node does not match, check its children and include them if they match const childMatches = getFilteredTreeData<ID>( node.children, trimmedSearchTerm, searchKeys ); if (childMatches.length > 0) { // If any children match, include the node, replacing its children with the matching ones filtered.push({ ...node, children: childMatches }); } } } return filtered; }; /** * Checks if a given tree node contains a specific search term in any of its specified keys. * * This function will check each of the specified keys in the tree node, convert the key's value to a string, * and check if it includes the search term. * * @param node - The tree node to search through. * @param searchTerm - The term to search for. * @param searchKeys - The keys in the tree node to search in. * @returns True if the search term is found in any of the specified keys, false otherwise. */ function doesNodeContainSearchTerm<ID>( node: TreeNode<ID>, searchTerm: string, searchKeys: string[] ): boolean { // We're using the `some` method on the array of keys to check each one return searchKeys.some(key => { // Get the value of the key in the tree node const nodeValue = node[key]; // Check if the string representation of the key's value includes the search term // If the value is undefined or null, `nodeValue?.toString()` will return undefined, // and the call to `toLowerCase().includes(searchTerm)` will return false. return (nodeValue?.toString().toLowerCase().includes(searchTerm)); }); }