Files

51 lines
1.5 KiB
TypeScript

import { TreeDataItem } from "@/types/tree";
/**
* Tree indentation constants (in rem units).
* Used to calculate consistent padding for nested tree items.
*/
export const TREE_INDENT_REM = 1.25;
export const TREE_LEAF_EXTRA_PADDING_REM = 1.75;
/**
* Calculates the left padding for a tree node based on its nesting level.
*/
export function getTreeNodePadding(level: number): string {
return `${level * TREE_INDENT_REM}rem`;
}
/**
* Calculates the left padding for a tree leaf based on its nesting level.
* Leaves have extra padding to align with node content (accounting for expand button).
*/
export function getTreeLeafPadding(level: number): string {
return `${level * TREE_INDENT_REM + TREE_LEAF_EXTRA_PADDING_REM}rem`;
}
/**
* Recursively collects all descendant IDs from a tree item.
*
* @param item - The tree item to collect IDs from
* @param includeParent - Whether to include the parent item's ID (default: false)
* @returns Array of all descendant IDs (and optionally the parent ID)
*
* @example
* Get only descendant IDs
* const childIds = getAllDescendantIds(parentItem);
*
* Get parent + all descendant IDs
* const allIds = getAllDescendantIds(parentItem, true);
*/
export function getAllDescendantIds(
item: TreeDataItem,
includeParent = false,
): string[] {
const ids = includeParent ? [item.id] : [];
if (item.children) {
for (const child of item.children) {
ids.push(child.id, ...getAllDescendantIds(child, false));
}
}
return ids;
}