fix: count all descendants in collapsed badge and prune stale localStorage IDs

Address two Greptile review comments:

1. Collapsed parent badge now shows total descendant count at all depths
   rather than direct-child count only. Add `countDescendants` utility to
   issue-tree.ts (recursive, uses existing childMap) and replace
   `children.length` with it in the titleSuffix badge.

2. Add a useEffect that prunes stale IDs from `collapsedParents` whenever
   the issues prop changes. Deleted or reassigned issues previously left
   orphan IDs in localStorage indefinitely; the effect filters to only IDs
   that appear as a parentId in the current issue list and persists the
   cleaned array via updateView.

Add four unit tests for countDescendants: leaf node, single-level,
multi-level, and unknown ID.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Darren Davison 2026-04-04 12:48:28 +01:00
parent 9be1b3f8a9
commit 7623f679cf
3 changed files with 68 additions and 3 deletions

View file

@ -25,3 +25,12 @@ export function buildIssueTree(items: Issue[]): IssueTree {
}
return { roots, childMap };
}
/**
* Returns the total number of descendants (all depths) of `id` in `childMap`.
* Used to accurately label collapsed parent badges like "(3 sub-tasks)".
*/
export function countDescendants(id: string, childMap: Map<string, Issue[]>): number {
const children = childMap.get(id) ?? [];
return children.reduce((sum, c) => sum + 1 + countDescendants(c.id, childMap), 0);
}