Story: Portfolio explorer
Table of Contents
This page documents a story in Sprint 13. It captures the goal, current status, acceptance criteria, and the tasks that compose it.
Goal
Combine portfolios + books + trades into one navigable tree-and-table view scoped to the session party.
Status
| Field | Value |
|---|---|
| State | DONE |
| Parent sprint | Sprint 13 |
| Now | Completed 2026-02-25. |
| Waiting on | None. |
| Next | None. |
| Last touched | 2026-02-25 |
Acceptance
- PortfolioBookTreeMdiWindow with horizontal splitter (tree left, trade table right).
- Distinct icons for real / virtual portfolios and trading / banking books.
- Selecting a node filters trades to that subtree.
- Breadcrumb shows the path.
- Trade counts aggregate up.
- Settings + splitter state persist; stale indicators on changes.
- Trade protocol gains book_id + portfolio_id filters with recursive CTE; protocol 43.0.
Tasks
| Task | State | Start | End | Description |
|---|---|---|---|---|
| Add portfolio explorer | DONE | 2026-05-20 | 2026-02-25 | PortfolioBookTreeMdiWindow: hierarchical tree of portfolios + books for the session party; trade table on the right filtered by selection; breadcrumb path; trade count aggregation; UI settings persist (incl. splitter); stale indicators on book/portfolio/trade events; trade protocol gains optional book_id + portfolio_id filters with recursive CTE for subtrees; protocol 43.0; EntityListMdiWindow::initializeTableSettings grows optional QSplitter param; book_changed_event + portfolio_changed_event. |
Decisions
- Tree + filtered table, not two windows
- navigation flow is inherently pick a node, see its trades.
- Recursive CTE for subtree filtering
- cheaper than client-side filtering and matches RLS semantics.
Out of scope
- Direct trade editing from the explorer.
See also
- Account-party management and login — supplies the party-on-session binding the explorer scopes by.