Untitled

 avatar
unknown
plain_text
23 days ago
2.5 kB
1
Indexable
import React, { useState } from 'react';

const DataFilter = () => {
  const [searchTerm, setSearchTerm] = useState('');
  
  // Sample data structure - replace with your actual data
  const initialData = [{
    value: "uuid",
    key: "sadf",
    title: "bcd",
    id: "uuid",
    children: [{
      value: "uuid",
      key: "sadf",
      title: "bcd",
      id: "uuid",
      children: []
    }]
  }];

  // Recursive function to search through nested data
  const filterNestedData = (items, term) => {
    return items.reduce((filtered, item) => {
      // Create a copy of the current item
      let itemCopy = { ...item };
      
      // Check if the current item's title matches the search term
      const matchesSearch = item.title.toLowerCase().includes(term.toLowerCase());
      
      // If there are children, recursively filter them
      if (item.children && item.children.length > 0) {
        itemCopy.children = filterNestedData(item.children, term);
      }
      
      // Include item if it matches search or has matching children
      if (matchesSearch || (itemCopy.children && itemCopy.children.length > 0)) {
        filtered.push(itemCopy);
      }
      
      return filtered;
    }, []);
  };

  // Handle search input change
  const handleSearch = (e) => {
    setSearchTerm(e.target.value);
  };

  // Filter data based on search term
  const filteredData = searchTerm 
    ? filterNestedData(initialData, searchTerm)
    : initialData;

  // Recursive component to render nested data
  const RenderItem = ({ item }) => (
    <div className="pl-4 border-l border-gray-200">
      <div className="py-2">
        <span className="font-medium">{item.title}</span>
      </div>
      {item.children && item.children.length > 0 && (
        <div className="ml-4">
          {item.children.map((child, index) => (
            <RenderItem key={child.id || index} item={child} />
          ))}
        </div>
      )}
    </div>
  );

  return (
    <div className="max-w-2xl mx-auto p-4">
      <input
        type="text"
        placeholder="Search by title..."
        value={searchTerm}
        onChange={handleSearch}
        className="w-full p-2 mb-4 border rounded"
      />
      <div className="space-y-2">
        {filteredData.map((item, index) => (
          <RenderItem key={item.id || index} item={item} />
        ))}
      </div>
    </div>
  );
};

export default DataFilter;
Leave a Comment