import { DocumentIcon, FolderIcon, FolderOpenIcon, MagnifyingGlassIcon, } from "@heroicons/react/20/solid"; import { useRef, useState } from "react"; import { Button } from "~/components/primitives/Buttons"; import { Input } from "~/components/primitives/Input"; import type { Tree } from "~/components/primitives/TreeView/TreeView"; import { TreeView, flattenTree, useTree } from "~/components/primitives/TreeView/TreeView"; import { cn } from "~/utils/cn"; const words = [ "lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipisicing", "elit", "sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore", "magna", "aliqua", "enim", "ad", "minim", "veniam", "quis", "nostrud", "exercitation", "ullamco", "laboris", "nisi", "aliquip", "ex", "ea", "commodo", "consequat", "duis", "aute", "irure", "reprehenderit", "voluptate", "velit", "esse", "cillum", "eu", "fugiat", "nulla", "pariatur", "excepteur", "sint", "occaecat", "cupidatat", "non", "proident", "sunt", "culpa", "qui", "officia", "deserunt", "mollit", "anim", "id", "est", "laborum", ]; function generateTree(): Tree<{ title: string }> { const number = words.length; const rawRows = new Array(number).fill("").map((elem, idx) => { return { id: words[idx], data: { title: `${idx + 1}. ${words[idx]}` }, }; }) as Tree<{ title: string }>[]; const rows: Tree<{ title: string }>[] = []; for (let i = 0; i < rawRows.length - 2; i += 3) { const row = rawRows[i]; rows.push({ ...row, children: [rawRows[i + 1], rawRows[i + 2]], }); } return { id: "root", data: { title: "root" }, children: rows, }; } const data = generateTree(); const tree = flattenTree(data); export default function Story() { const [selectedId, setSelectedId] = useState(""); const [collapsedIds, setCollapsedIds] = useState([]); return (
setSelectedId(v.target.value)} /> { const val = e.target.value; const ids = val.split(",").map((v) => v.trim()); setCollapsedIds(ids); }} />
); } function TreeViewParent({ selectedId, collapsedIds, }: { selectedId?: string; collapsedIds?: string[]; }) { const [filterText, setFilterText] = useState(""); const parentRef = useRef(null); const { nodes, selected: _selected, getTreeProps, getNodeProps, toggleNodeSelection, toggleExpandNode, selectNode, selectFirstVisibleNode, selectLastVisibleNode, scrollToNode: _scrollToNode, virtualizer, } = useTree({ tree, selectedId, collapsedIds, onSelectedIdChanged: (id) => { console.log("onSelectedIdChanged", id); }, estimatedRowHeight: () => 32, parentRef, filter: { value: filterText, fn: (text, node) => { if (text === "") return true; if (node.data.title.toLowerCase().includes(text.toLowerCase())) { return true; } return false; }, }, }); return (
setFilterText(e.target.value)} />
(
{ toggleNodeSelection(node.id); }} >
{ e.stopPropagation(); toggleExpandNode(node.id); selectNode(node.id, true); }} onKeyDown={(e) => { console.log(e.key); }} > {node.hasChildren ? ( state.expanded ? ( ) : ( ) ) : ( )}
{node.data.title}
)} />
); }