Project a flat pre-order ListGroup[] (as returned by summariseListRows)
down to a schedule / pivot presentation (issue #1790 round 2): ONE row
per group-value tuple — the LEAF groups only, in the same order they
appear in groups. Because groups is a pre-order flattening of the
group tree, every parent's leaf descendants stay contiguous, so the result
is already in the right order for a Bonsai-style schedule table (rows for
one outer group value sit together) without re-sorting here.
levelCount is the number of active grouping columns — typically
groupingColumnIds(grouping).filter(id => columns still has id).length.
With 0 levels (nothing to pivot on) or no groups at all, this returns
[] rather than inventing a single all-rows row.
Project a flat pre-order
ListGroup[](as returned bysummariseListRows) down to aschedule/ pivot presentation (issue #1790 round 2): ONE row per group-value tuple — the LEAF groups only, in the same order they appear ingroups. Becausegroupsis a pre-order flattening of the group tree, every parent's leaf descendants stay contiguous, so the result is already in the right order for a Bonsai-style schedule table (rows for one outer group value sit together) without re-sorting here.levelCountis the number of active grouping columns — typicallygroupingColumnIds(grouping).filter(id => columns still has id).length. With 0 levels (nothing to pivot on) or nogroupsat all, this returns[]rather than inventing a single all-rows row.