Content
View differences
Updated by Alexander Coles 4 days ago
## Summary
Migrate remaining list-shaped `Primer::Beta::BorderBox` / `border_box_container` usages to `OpenProject::Common::BorderBoxListComponent` where the component already matches the behavior.
`Documents::Admin::DocumentTypes::IndexComponent` is intentionally excluded from this follow-up. It should be handled together with PR opf/openproject#23485 / WP#74940 because it belongs to the same `Admin::Enumerations::IndexComponent` class hierarchy.
## Strong candidates
- `app/components/settings/project_phase_definitions/index_component.html.erb` - header, empty row, draggable/filterable rows.
- `app/components/projects/settings/life_cycle/index_component.html.erb` - header actions, empty row, filterable rows.
- `app/components/projects/settings/project_custom_field_sections/show_component.html.erb` - header actions, empty row, repeated rows.
- `app/components/projects/settings/creation_wizard/project_custom_field_sections/show_component.html.erb` - same pattern as project custom field sections.
- `app/components/oauth/applications/index_component.html.erb` - simple application lists with headers and placeholder rows.
- `app/components/portfolios/index_component.html.erb` - simple portfolio list with optional placeholder row.
## Good candidates requiring extra verification
- `app/components/work_package_types/export_template_list_component.html.erb` - drag-and-drop rows; verify DnD selectors.
- `app/components/workflows/table_component.html.erb` - list-shaped despite the name; verify filter target behavior.
- `modules/wikis/app/components/wikis/collapsible_page_links_component.html.erb` - maps to collapsible list; verify collapsed state and count behavior.
- `modules/wikis/app/components/wikis/relation_page_links_component.html.erb` - header action menu plus login/blank/list rows; map custom header actions carefully.
- `modules/meeting/app/components/work_package_meetings_tab/meeting_component.html.erb` - header plus agenda item rows; preserve custom header content.
- `app/components/admin/departments/detail_component.html.erb` - breadcrumbs/action header plus mixed rows; verify header mapping.
- `app/components/my/notifications/show_page_component.html.erb` - project-specific notification settings list.
## Lower priority / more invasive
These are list-shaped but pass the BorderBox container into children, use sensitive drag-and-drop contracts, or have more specialized rendering:
- `modules/meeting/app/components/meeting_sections/show_component.html.erb`
- `app/components/shares/manage_shares_component.html.erb`
- `app/components/work_package_relations_tab/index_component.rb`
- `app/components/work_package_types/form_configuration/group_component.html.erb`
- `app/components/admin/custom_fields/hierarchy/items_component.html.erb`
## Not good initial fits
Do not prioritize activity journal/comment boxes using `with_body`, date-picker relation-tab mini boxes, health report result groups, Jira wizard step grouping, or single presentation-mode wrappers. They use BorderBox, but are not straightforward reusable list composition cases.
## Re-assessment (2026-06-18)
Re-checked the three flagged candidates against the current `BorderBoxListComponent` slots (header: title / count / description / action *buttons* / kebab *menu* via `HasMenu` / collapsible; `item` + `work_package_item` rows; `empty_state`; `footer`).
- **`app/components/workflows/table_component.html.erb`** - clean strong fit, not just "requires verification". Header h2 title, per-type rows with inline edit/copy ActionMenu, empty Blankslate. The `filter--filter-list-target: searchItem` data attribute on each row survives because `Item` forwards `system_arguments` to Primer's row. Separately: the component is list-shaped, so `Workflows::TableComponent` should be renamed to `Workflows::TypeListComponent` (own change, not part of the migration).
- **`modules/wikis/app/components/wikis/collapsible_page_links_component.html.erb`** - stronger than "requires verification". Already uses `CollapsibleHeader(collapsed: true)` + count + `PageLinkComponent` rows; maps 1:1 to `collapsible: true`, `collapsed: true`, `header_padding: :condensed`, `count: page_links.count`, `item` rows.
- **`modules/wikis/app/components/wikis/relation_page_links_component.html.erb`** - real blocker, not just "map carefully". The header menu uses a custom ActionMenu show button (plus icon + triangle-down + text label + `disabled: !can_manage_links?`). `HasMenu#build_menu` hardcodes a kebab-horizontal invisible show button and the `actions` slot only renders `Primer::Beta::Button`, so the header cannot be expressed today. Needs a `Header` extension to allow show-button customization, otherwise keep the header hand-rolled.
Both wikis components are recent (`#73352` / `#73354`) and still churning, so converting them now risks conflicts.
Migrate remaining list-shaped `Primer::Beta::BorderBox` / `border_box_container` usages to `OpenProject::Common::BorderBoxListComponent` where the component already matches the behavior.
`Documents::Admin::DocumentTypes::IndexComponent` is intentionally excluded from this follow-up. It should be handled together with PR opf/openproject#23485 / WP#74940 because it belongs to the same `Admin::Enumerations::IndexComponent` class hierarchy.
## Strong candidates
- `app/components/settings/project_phase_definitions/index_component.html.erb` - header, empty row, draggable/filterable rows.
- `app/components/projects/settings/life_cycle/index_component.html.erb` - header actions, empty row, filterable rows.
- `app/components/projects/settings/project_custom_field_sections/show_component.html.erb` - header actions, empty row, repeated rows.
- `app/components/projects/settings/creation_wizard/project_custom_field_sections/show_component.html.erb` - same pattern as project custom field sections.
- `app/components/oauth/applications/index_component.html.erb` - simple application lists with headers and placeholder rows.
- `app/components/portfolios/index_component.html.erb` - simple portfolio list with optional placeholder row.
## Good candidates requiring extra verification
- `app/components/work_package_types/export_template_list_component.html.erb` - drag-and-drop rows; verify DnD selectors.
- `app/components/workflows/table_component.html.erb` - list-shaped despite the name; verify filter target behavior.
- `modules/wikis/app/components/wikis/collapsible_page_links_component.html.erb` - maps to collapsible list; verify collapsed state and count behavior.
- `modules/wikis/app/components/wikis/relation_page_links_component.html.erb` - header action menu plus login/blank/list rows; map custom header actions carefully.
- `modules/meeting/app/components/work_package_meetings_tab/meeting_component.html.erb` - header plus agenda item rows; preserve custom header content.
- `app/components/admin/departments/detail_component.html.erb` - breadcrumbs/action header plus mixed rows; verify header mapping.
- `app/components/my/notifications/show_page_component.html.erb` - project-specific notification settings list.
## Lower priority / more invasive
These are list-shaped but pass the BorderBox container into children, use sensitive drag-and-drop contracts, or have more specialized rendering:
- `modules/meeting/app/components/meeting_sections/show_component.html.erb`
- `app/components/shares/manage_shares_component.html.erb`
- `app/components/work_package_relations_tab/index_component.rb`
- `app/components/work_package_types/form_configuration/group_component.html.erb`
- `app/components/admin/custom_fields/hierarchy/items_component.html.erb`
## Not good initial fits
Do not prioritize activity journal/comment boxes using `with_body`, date-picker relation-tab mini boxes, health report result groups, Jira wizard step grouping, or single presentation-mode wrappers. They use BorderBox, but are not straightforward reusable list composition cases.
## Re-assessment (2026-06-18)
Re-checked the three flagged candidates against the current `BorderBoxListComponent` slots (header: title / count / description / action *buttons* / kebab *menu* via `HasMenu` / collapsible; `item` + `work_package_item` rows; `empty_state`; `footer`).
- **`app/components/workflows/table_component.html.erb`** - clean strong fit, not just "requires verification". Header h2 title, per-type rows with inline edit/copy ActionMenu, empty Blankslate. The `filter--filter-list-target: searchItem` data attribute on each row survives because `Item` forwards `system_arguments` to Primer's row. Separately: the component is list-shaped, so `Workflows::TableComponent` should be renamed to `Workflows::TypeListComponent` (own change, not part of the migration).
- **`modules/wikis/app/components/wikis/collapsible_page_links_component.html.erb`** - stronger than "requires verification". Already uses `CollapsibleHeader(collapsed: true)` + count + `PageLinkComponent` rows; maps 1:1 to `collapsible: true`, `collapsed: true`, `header_padding: :condensed`, `count: page_links.count`, `item` rows.
- **`modules/wikis/app/components/wikis/relation_page_links_component.html.erb`** - real blocker, not just "map carefully". The header menu uses a custom ActionMenu show button (plus icon + triangle-down + text label + `disabled: !can_manage_links?`). `HasMenu#build_menu` hardcodes a kebab-horizontal invisible show button and the `actions` slot only renders `Primer::Beta::Button`, so the header cannot be expressed today. Needs a `Header` extension to allow show-button customization, otherwise keep the header hand-rolled.
Both wikis components are recent (`#73352` / `#73354`) and still churning, so converting them now risks conflicts.