Skip to content
Advertisement

React – CheckboxTree filter

So i am using this package “react-checkbox-tree” to make a checkbox, but since this is made on classes components and i need to do it with functions and hooks, this is being a bit tricky to my actual skills.

//Checkbox Tree
  const [checkedTree, setCheckedTree] = useState([]);
  const [expandedTree, setExpandedTree] = useState(["1"]);
  const [filterText, setFilterText] = useState("");
  const [nodesFiltered, setNodesFiltered] = useState();

  ///FILTER LOGIC /////
  const onFilterChange = (e) => {
    setFilterText(e.target.value);
    if (e.target.value) {
      filterTree();
    }
  };

  const filterTree = () => {
    // Reset nodes back to unfiltered state
    if (!filterText || filterText === "" || filterText.length === 0) {
      setNodesFiltered(nodes);
      return;
    }

    const nodesFiltered = (nodes) => {
      return nodes.reduce(filterNodes, []);
    };

    setNodesFiltered(nodesFiltered);
  };

  const filterNodes = (filtered, node) => {
    const children = (node.children || []).reduce(filterNodes, []);
    if (
      // Node's label matches the search string
      node.label.toLocaleLowerCase().indexOf(filterText.toLocaleLowerCase()) >
        -1 ||
      // Or a children has a matching node
      children.length
    ) {
      filtered.push({ ...node, ...(children.length && { children }) });
    }
    return filtered;
  };
  //
  • My first problem is that when i search for the parent, i only get the last children of the array for some reason.

  • The Second is that when i use the backspace button, the filter stops working until i clean every char.

I made a codesandbox to help you guys to understand the problems: https://codesandbox.io/s/checkboxtree-6gu60

This is the example on with classes: https://github.com/jakezatecky/react-checkbox-tree/blob/master/examples/src/js/FilterExample.js

Tks in advance!

Advertisement

Answer

For your second problem, I solved it by passing through onKeyDown as well as onChange from my search input:

<input
  type="text"
  onChange={onFilterChange}
  onKeyDown={onBackspace}
/>

which calls

// If the user deletes the search terms, reset to unfiltered
const onBackspace = e => {
  var key = e.keyCode || e.charCode

  // magic numbers are backspace and delete. Naming them didn't work.
  if (key == 8 || key == 46) {
    setFilterText("")
    filterTree()
  }
}
User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement