Re-work toHierarchy utility

Refactor `toHiearchy` to be more generic, performant

- Use callback to "pick" generic parent ID property instead of requiring that `pid` be hardcoded`
- Account for edge cases of an invalid parent ID
- Use Map to store node children for lookups
- Use one pass instead of removing empty nodes at the very end
- DX: use generics to type `toHierarchy`
- Make `toHierarchy` even more generic (reusable with `RecursiveList`)

Co-Authored-By: Bram <bramhavers@gmail.com>
This commit is contained in:
Eric Liu 2024-12-07 13:54:06 -08:00
commit 5f1e8de1e1
29 changed files with 414 additions and 273 deletions

View file

@ -15,7 +15,7 @@ type $RestProps = SvelteHTMLElements["ul"];
type $Props = {
/**
* Provide a nested array of nodes to render
* Provide an array of nodes to render
* @default []
*/
nodes?: Array<TreeNode>;
@ -94,11 +94,6 @@ export default class TreeView extends SvelteComponentTyped<
*/
collapseAll: () => void;
/**
* Create a nested array from a flat array
*/
toHierarchy: (flatArray: TreeNode[] & { pid?: any }[]) => TreeNode[];
/**
* Programmatically expand a subset of nodes.
* Expands all nodes if no argument is provided