Frontmatter
| id | 9404 |
| title | [Epic] Tree Grid & Hierarchical Data Support |
| state | Open |
| labels | enhancementepicaiarchitecturegrid |
| assignees | tobiu |
| createdAt | Mar 9, 2026, 11:43 AM |
| updatedAt | Mar 10, 2026, 2:35 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9404 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | null |
| subIssues | 9405 Create `Neo.data.TreeModel` 9406 Create `Neo.data.TreeStore` 9407 Create `Neo.grid.column.Tree` & Cell Component 9408 Grid Core Integration & TreeGrid Accessibility 9409 CSS Animations for TreeGrid Expand/Collapse 9410 TreeGrid Documentation & Examples 9411 TreeGrid Unit Tests (Data & Logic) 9412 TreeGrid Component Tests (UI & Interactions) 9413 Create Async Subtree Loading for `Neo.data.TreeStore` 9414 Refactor `Neo.data.Store` to unify Record Hydration 9415 Support "Turbo Mode" in `Neo.data.TreeStore` 9416 Add Error State & Events for Async Tree Loading 9417 Optimize `TreeStore` Hot Paths (Performance) 9418 Create Data Normalizer Architecture (`Neo.data.normalizer.Base` & `Tree`) 9419 Implement Dynamic Module Loading in `Neo.worker.Data` 9420 Migrate Data Pipeline to Connection -> Parser -> Normalizer flow 9422 Update TreeStore to manage ARIA sibling fields on mutations 9423 TreeStore Full CRUD Support & Structural Mutations 9425 Refactor Tree cell component architecture for performance 9426 Refactor Tree column and component reactivity 9427 Fix TreeStore projection mutations and Row VDOM recycling 9428 TreeStore: Implement hierarchical sorting for doSort override 9429 TreeStore: Implement ancestor-aware filtering for filter override 9430 TreeModel: Introduce childCount to decouple isLeaf state from emptiness 9431 TreeStore: Fix ARIA desync (siblingIndex and siblingCount) after sort and filter 9432 TreeStore: Override clear() to prevent memory leaks and split-brain states 9433 TreeStore: Implement bulk expandAll() and collapseAll() methods 9434 TreeStore: Decouple clearFilters() from legacy allItems pattern 9435 TreeStore: Fix visible projection for dynamic child additions to expanded parents 9437 TreeStore: Optimize #allRecordsMap iteration loops 9438 TreeStore: Reduce GC pressure and redundant iterations 9439 TreeStore: Apply "Anchor & Echo" JSDoc strategy for AI discoverability 9445 TreeGrid Documentation: Create high-level architectural guide for TreeStore 9447 TreeGrid: Fix 7-click expand/collapse bug and redundant change events 9448 TreeGrid Component pooling accumulates `is-leaf` class leading to visual bugs |
| subIssuesCompleted | 31 |
| subIssuesTotal | 35 |
| blockedBy | [] |
| blocking | [] |
[Epic] Tree Grid & Hierarchical Data Support
Openenhancementepicaiarchitecturegrid
tobiu added sub-issue #9405 on Mar 9, 2026, 11:44 AM
tobiu added sub-issue #9406 on Mar 9, 2026, 11:44 AM
tobiu added sub-issue #9407 on Mar 9, 2026, 11:52 AM
tobiu added sub-issue #9408 on Mar 9, 2026, 11:59 AM
tobiu added sub-issue #9409 on Mar 9, 2026, 12:01 PM
tobiu added sub-issue #9410 on Mar 9, 2026, 12:01 PM
tobiu added sub-issue #9411 on Mar 9, 2026, 12:03 PM
tobiu added sub-issue #9412 on Mar 9, 2026, 12:03 PM
tobiu assigned to @tobiu on Mar 9, 2026, 12:10 PM
tobiu added sub-issue #9413 on Mar 9, 2026, 12:34 PM
tobiu added sub-issue #9414 on Mar 9, 2026, 3:13 PM
tobiu added sub-issue #9415 on Mar 9, 2026, 3:14 PM
tobiu added sub-issue #9416 on Mar 9, 2026, 3:47 PM
tobiu added sub-issue #9417 on Mar 9, 2026, 4:00 PM
tobiu cross-referenced by #9418 on Mar 9, 2026, 4:45 PM
tobiu added sub-issue #9418 on Mar 9, 2026, 4:45 PM
tobiu cross-referenced by #9419 on Mar 9, 2026, 4:46 PM
tobiu added sub-issue #9419 on Mar 9, 2026, 4:46 PM
tobiu added sub-issue #9420 on Mar 9, 2026, 4:46 PM
tobiu cross-referenced by #9422 on Mar 9, 2026, 7:16 PM
tobiu added sub-issue #9422 on Mar 9, 2026, 7:19 PM
tobiu added sub-issue #9423 on Mar 9, 2026, 7:41 PM
tobiu added sub-issue #9425 on Mar 9, 2026, 9:22 PM
tobiu added sub-issue #9426 on Mar 10, 2026, 11:32 AM
tobiu added sub-issue #9427 on Mar 10, 2026, 12:33 PM
tobiu added sub-issue #9428 on Mar 10, 2026, 2:16 PM
tobiu added sub-issue #9429 on Mar 10, 2026, 2:16 PM
tobiu added sub-issue #9430 on Mar 10, 2026, 2:25 PM

tobiu
Mar 10, 2026, 2:35 PM
tobiu added sub-issue #9431 on Mar 10, 2026, 3:26 PM
tobiu added sub-issue #9432 on Mar 10, 2026, 3:26 PM
tobiu added sub-issue #9433 on Mar 10, 2026, 3:27 PM
tobiu added sub-issue #9434 on Mar 10, 2026, 3:27 PM
tobiu added sub-issue #9435 on Mar 10, 2026, 10:17 PM
tobiu added sub-issue #9437 on Mar 11, 2026, 11:00 AM
tobiu added sub-issue #9438 on Mar 11, 2026, 11:09 AM
tobiu added sub-issue #9439 on Mar 11, 2026, 11:53 AM
tobiu added sub-issue #9445 on Mar 12, 2026, 10:16 AM
tobiu added sub-issue #9447 on Mar 12, 2026, 11:37 AM
tobiu added sub-issue #9448 on Mar 12, 2026, 12:30 PM
Goal
Implement native, high-performance support for Tree Grids and hierarchical data structures within the Neo.mjs framework. This Epic focuses on the core "Hierarchical Rows" pattern (a flat virtualized view of tree nodes) ensuring O(1) rendering performance and strict adherence to the Row Pooling architecture.
Scope & Architecture
The Tree Grid implementation is designed to integrate seamlessly with the existing
Neo.grid.Bodyvirtual scroller without requiring variable-height rows.Neo.data.TreeStore&TreeModel): The complexity of the hierarchy is entirely managed by the data layer. TheTreeStoreparses hierarchical data (usingparentIdrelations) into an internal O(1)#childrenMap. Crucially, it exposes a dynamically updated, flattened 1D array of only the visible nodes to the grid. When a node is expanded, its children are injected into this flat array.Neo.grid.column.Tree): A specialized, nested column component handles the visual state. It utilizes CSS variables (--tree-depth) for dynamic indentation math and CSS classes for toggle icon states, ensuring rapid recycling during scroll events without DOM manipulation.aria-rowindexvalues. The implementation is augmented witharia-expanded,aria-level,aria-setsize, andaria-posinsetattributes mapped directly from the records (utilizing "Soft Hydration" where necessary).expand,collapse) for View Controller consumption.Note: Variable-height "Row Expanders" (nested content bodies) are outside the scope of this Epic and would require a separate architectural enhancement to the ScrollManager.