Content
View differences
Updated by Alexander Coles 6 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 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 BorderBoxList candidates remain here.
* Multi-column BorderBox lists are tracked by [DREAM-837](https://community.openproject.org/wp/DREAM-837), using the existing `OpPrimer::BorderBoxTableComponent` and `OpPrimer::BorderBoxRowComponent`. The follow-ups cover status administration [DREAM-839](https://community.openproject.org/wp/DREAM-839), document types [DREAM-840](https://community.openproject.org/wp/DREAM-840), storages [DREAM-841](https://community.openproject.org/wp/DREAM-841), (document types, storages, wiki providers [DREAM-842](https://community.openproject.org/wp/DREAM-842), and project documents [DREAM-843](https://community.openproject.org/wp/DREAM-843). Shared sortable-table integration is [DREAM-838](https://community.openproject.org/wp/DREAM-838), coordinated with #DREAM-671. A new DataTable is not providers, documents) wait for a prerequisite.
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 is closed, satisfying #DREAM-789's list-markup prerequisite. Document-type reordering remains in #DREAM-789; its subsequent semantic-table migration is [DREAM-840](https://community.openproject.org/wp/DREAM-840). This parent and all four list-migration children remain closed.
(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.
* #DREAM-802: project phase definitions (admin), PDF export templates (type settings).
* Migrated screens should look unchanged apart from consistent header/menu styling and the empty-state behavior below.
* `MeetingAgendaItems::ListComponent` (the empty-meeting placeholder box) moved to #DREAM-792: it renders 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 BorderBoxList candidates remain here.