Content
View differences
Updated by Alexander Coles 12 days ago
## Summary
Migrates list-shaped `Primer::Beta::BorderBox` / `border_box_container` usages to the shared `OpenProject::Common::BorderBoxListComponent`. Shipped as a stacked PR train, one child work package per slice: #DREAM-801 (shared API), <mention class="mention" data-id="78249" data-type="work_package" data-text="#DREAM-802" data-display-id="DREAM-802">#DREAM-802</mention> , <mention class="mention" data-id="78250" data-type="work_package" data-text="#DREAM-803" data-display-id="DREAM-803">#DREAM-803</mention> , <mention class="mention" data-id="78251" data-type="work_package" data-text="#DREAM-804" data-display-id="DREAM-804">#DREAM-804</mention> .
## API changes
All exist solely to let the remaining consumers migrate — nothing more:
* `header.with_title` — linked or composed title content inside the configured heading element.
* `header.with_action_icon_button` — icon-only header actions.
* Header/row menus via `BorderBoxListComponent::Menu` — automatic kebab trigger, customisable via `button_arguments:` or `menu.with_show_button`.
* `empty_state_behavior:` policy — `:static` (default) renders the declared or generic blankslate only while a list is empty; `:none` suppresses it (grouped surfaces); `:dynamic` shows it client-side when filtering or drag-and-drop empties a list.
* Headers keep a stable height when filtering hides their action buttons.
## Screens updated (in merge order)
* #DREAM-802: project phase definitions (admin), PDF export templates (type settings).
* #DREAM-803: wiki page links (work package tab), portfolios, OAuth applications (admin), project life cycle settings, project attributes settings (+ creation wizard), My account notifications.
* #DREAM-804: work package meetings tab, departments (admin), work package relations tab, meeting participants, cost types settings, resource allocations.
* Landed independently earlier: enumerations (admin), workflows type list.
## Hints for QA
* Migrated screens should look unchanged apart from consistent header/menu styling and the empty-state behavior below.
* Filtering a list to no matches (Project attributes, Project life cycle settings, admin phase definitions) shows a blankslate inside the box — previously a bare box or a floating "No items found" line.
* Administration → Work packages → Types: type groups without variants no longer show a blankslate row per group.
* Headers with "Enable all / Disable all"-style actions keep their height while filtering hides the actions.
* Backlogs sprint/backlog lists still show their drop-target blankslate immediately when the last card is dragged out.
## Remaining and out of scope
* `MeetingAgendaItems::ListComponent` (the empty-meeting placeholder box) moved to #DREAM-792: it renders is the only in the empty-meeting state that Work Package reworks, and needs the free-form empty-state slot from the #DREAM-805 follow-up line. No remaining BorderBoxList candidates remain here. candidate.
* Multi-column lists (document types, storages, wiki providers, documents) wait for a future BorderBoxTable/DataTable.
* Rich-header surfaces (admin project attributes sections, form-configuration groups, meeting sections) belong to the #DREAM-671 migration line — no further header-API growth here.
* #DREAM-789 follows #DREAM-802 (the only remaining #DREAM-671 dependency on this effort).
Migrates list-shaped `Primer::Beta::BorderBox` / `border_box_container` usages to the shared `OpenProject::Common::BorderBoxListComponent`. Shipped as a stacked PR train, one child work package per slice: #DREAM-801 (shared API), <mention class="mention" data-id="78249" data-type="work_package" data-text="#DREAM-802" data-display-id="DREAM-802">#DREAM-802</mention> , <mention class="mention" data-id="78250" data-type="work_package" data-text="#DREAM-803" data-display-id="DREAM-803">#DREAM-803</mention> , <mention class="mention" data-id="78251" data-type="work_package" data-text="#DREAM-804" data-display-id="DREAM-804">#DREAM-804</mention> .
## API changes
All exist solely to let the remaining consumers migrate — nothing more:
* `header.with_title` — linked or composed title content inside the configured heading element.
* `header.with_action_icon_button` — icon-only header actions.
* Header/row menus via `BorderBoxListComponent::Menu` — automatic kebab trigger, customisable via `button_arguments:` or `menu.with_show_button`.
* `empty_state_behavior:` policy — `:static` (default) renders the declared or generic blankslate only while a list is empty; `:none` suppresses it (grouped surfaces); `:dynamic` shows it client-side when filtering or drag-and-drop empties a list.
* Headers keep a stable height when filtering hides their action buttons.
## Screens updated (in merge order)
* #DREAM-802: project phase definitions (admin), PDF export templates (type settings).
* #DREAM-803: wiki page links (work package tab), portfolios, OAuth applications (admin), project life cycle settings, project attributes settings (+ creation wizard), My account notifications.
* #DREAM-804: work package meetings tab, departments (admin), work package relations tab, meeting participants, cost types settings, resource allocations.
* Landed independently earlier: enumerations (admin), workflows type list.
## Hints for QA
* Migrated screens should look unchanged apart from consistent header/menu styling and the empty-state behavior below.
* Filtering a list to no matches (Project attributes, Project life cycle settings, admin phase definitions) shows a blankslate inside the box — previously a bare box or a floating "No items found" line.
* Administration → Work packages → Types: type groups without variants no longer show a blankslate row per group.
* Headers with "Enable all / Disable all"-style actions keep their height while filtering hides the actions.
* Backlogs sprint/backlog lists still show their drop-target blankslate immediately when the last card is dragged out.
## Remaining and out of scope
* `MeetingAgendaItems::ListComponent` (the empty-meeting placeholder box) moved to #DREAM-792: it renders
* Multi-column lists (document types, storages, wiki providers, documents) wait for a future BorderBoxTable/DataTable.
* Rich-header surfaces (admin project attributes sections, form-configuration groups, meeting sections) belong to the #DREAM-671 migration line — no further header-API growth here.
* #DREAM-789 follows #DREAM-802 (the only remaining #DREAM-671 dependency on this effort).