Two authoring limits met on the same component while building a record page over sys_user (objectstack-ai/duly#13). Both are expressiveness gaps rather than defects — nothing renders wrong, the page just cannot say the thing.
1. No grouping
RecordRelatedListProps declares columns, sort, filter, limit. There is no groupBy, and RelatedList draws its own table rather than a list view, so the grid's grouping block (which does support nested levels with per-level collapse, and which this same app uses on a duly_duty list view) is unreachable from a related list.
The requirement was "their governed duties, grouped by frequency, so a monthly rhythm reads differently from an annual one". The closest authorable thing is putting frequency first in columns and first in sort, which makes each rhythm a contiguous block. It reads acceptably and it is not grouping — no group headers, no counts per group, no collapse, and the ordering is alphabetical (annual, daily, fortnightly, monthly, …) rather than by cadence.
Since grouping already exists and is already implemented for grids, the ask is mostly plumbing: let a related list accept the same block.
2. Columns cannot cross a lookup
RelatedList resolves lookup labels (it batch-fetches display names for FK cells) but has no dotted-path column support — columns: ['assignment.assigner'] names nothing.
Concretely: the page needed "assigned work, showing who assigned each". The task carries assignment (an FK); the assigner is duly_assignment.assigner, one hop on. So the column can show which assignment the task came from but not who raised it, and the reader has to click through.
The other route to the same value — a related list on duly_assignment itself, bound on its multi-value assignees field — is closed for an unrelated reason (filed separately as #7299), so on this page the requirement could not be met at all.
Given the label-resolution machinery is already there, a columns: ['assignment.assigner'] that expands the lookup one level would cover most of what related lists need; deeper paths can stay refused.
Neither is urgent on its own. Filed because both were hit inside one component on one page, and together they are the difference between a related list and a report.
🤖 Generated with Claude Code
https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p
Two authoring limits met on the same component while building a record page over
sys_user(objectstack-ai/duly#13). Both are expressiveness gaps rather than defects — nothing renders wrong, the page just cannot say the thing.1. No grouping
RecordRelatedListPropsdeclarescolumns,sort,filter,limit. There is nogroupBy, andRelatedListdraws its own table rather than a list view, so the grid'sgroupingblock (which does support nested levels with per-level collapse, and which this same app uses on aduly_dutylist view) is unreachable from a related list.The requirement was "their governed duties, grouped by frequency, so a monthly rhythm reads differently from an annual one". The closest authorable thing is putting
frequencyfirst incolumnsand first insort, which makes each rhythm a contiguous block. It reads acceptably and it is not grouping — no group headers, no counts per group, no collapse, and the ordering is alphabetical (annual, daily, fortnightly, monthly, …) rather than by cadence.Since
groupingalready exists and is already implemented for grids, the ask is mostly plumbing: let a related list accept the same block.2. Columns cannot cross a lookup
RelatedListresolves lookup labels (it batch-fetches display names for FK cells) but has no dotted-path column support —columns: ['assignment.assigner']names nothing.Concretely: the page needed "assigned work, showing who assigned each". The task carries
assignment(an FK); the assigner isduly_assignment.assigner, one hop on. So the column can show which assignment the task came from but not who raised it, and the reader has to click through.The other route to the same value — a related list on
duly_assignmentitself, bound on its multi-valueassigneesfield — is closed for an unrelated reason (filed separately as #7299), so on this page the requirement could not be met at all.Given the label-resolution machinery is already there, a
columns: ['assignment.assigner']that expands the lookup one level would cover most of what related lists need; deeper paths can stay refused.Neither is urgent on its own. Filed because both were hit inside one component on one page, and together they are the difference between a related list and a report.
🤖 Generated with Claude Code
https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p