Uses `ConditionalWrapper` to eliminate template duplication in the
`wrap_with_controller` branch, and `merge_data` from
`Primer::AttributesHelper` for Stimulus data attributes.
https://community.openproject.org/wp/OP-19415
Replaces `Filters::FilterForm` (an `ApplicationForm` subclass) with
`Filters::FilterFormComponent` (an `ApplicationComponent`). The old form
overrode `:nodoc:` Primer hooks (`before_render`, `perform_render`) and
read semi-public ivars (`@builder`, `@view_context`). The new component
receives the builder as an explicit keyword arg and uses a standard ERB
template, reducing Primer internal coupling from five semi-public APIs
to one (`FormList`).
https://community.openproject.org/wp/OP-19415
* Add footer component for widget box
* Add footer component to the widget box as a slot
* Change projects widget to show the favorite projects
* Fix failing test
* Change the subitems widget
* Change the costs and budgets widgets
* Change the meeting widget
* Change the WPs widget in version
* Change memebers widget in project overview
* Change the favorite projects widget in my page
# Conflicts:
# frontend/src/app/shared/components/grids/widgets/project-favorites/widget-project-favorites.component.ts
* Add the widget box to the lookbook
* Add footer for members widget in dashboard
* Fix members widget capability check
* Add feature spec for favorites projects in my page
* Remove committed demo project gitlink
* Remove temporary body variables from the costs and budgets widget templates
* Remove the scroll for favorites widget
* Remove scrollbar for members and favorite projects widgets
* Change projects block to favorite projects
* Refine feature specs
* Fix the widget footer styles globally
* Rename the component name from project favorites to favorite projects
* Rename the test selector for project name
* Move widget content inside the body
* grid widgets stretch their content area so widget footers stay pinned to the bottom
* Ensure frontend-rendered grid widgets keep their turbo-loaded content in the widget flex layout so server-rendered footers stay pinned to the bottom
Mentions that `with_empty_state` renders a `Primer::Beta::Blankslate`
and accepts `title:`, `description:`, and `icon:` keywords. Bumps the
work-package preview from 2 to 3 items for visual consistency with the
other preview scenarios.
Allow BorderBoxList headers to override their vertical padding while
keeping row padding inherited from the underlying BorderBox.
Use spacious header padding for Backlogs lists that keep condensed rows,
and expose the option in Lookbook previews for review.
https://community.openproject.org/wp/72945
Adds `scheme: :transparent` to BorderBoxListComponent with CSS overrides
for transparent header background and no separator line. Backlogs
callers adopt the transparent scheme.
https://community.openproject.org/wp/72945
Render plain BorderBoxList headers by default while keeping the
CollapsibleHeader toggle available behind an explicit option. Align the
plain header branch with CollapsibleHeader markup so later Backlogs
header restyling can reuse the same structure.
Add interactive mode for dynamic BorderBox lists and enable it for
Backlogs lists. Generic lists stay quiet by default while Backlogs
updates remain announced.
Adds `DEFAULT_ACTION_SCHEME` (`:default`) to `Header` so callers
no longer need to pass `scheme:` for standard header buttons.
Updates Lookbook preview and Backlogs sprint component to use the
new default.
https://community.openproject.org/wp/72945
Introduces a shared BorderBox-backed list component and moves the
Backlogs-specific work package card list into the Backlogs module.
Wires Backlogs callers to the new component API, keeps specialized
card rendering behind an item factory hook, and replaces old OpPrimer
work-package card list coverage with focused component specs.
https://community.openproject.org/wp/74684
The common card box now exposes a generic `item` slot via `with_item`
for manually composed rows. Automatic rendering still only builds
work package items from the `work_packages:` argument.
The Backlogs inbox now owns the truncate-middle show-more row, its
route, Turbo frame, and draggable marker.
https://community.openproject.org/wp/73968
Expose a top-level menu slot on the common work package card so card
and card-box callers can configure action menus in the same style. Keep
menu_src as a compatibility shortcut for existing deferred Backlogs
menus while allowing inline non-deferred menu items through the slot.
https://community.openproject.org/wp/73968
Remove the story-points display from the shared work package card and
expose a generic metric slot instead. Backlogs now opts into that slot
with a small story-points component when rendering sprint, bucket, and
inbox cards.
https://community.openproject.org/wp/73968
Extracts the BorderBox row arguments into a row-bridge object
(`WorkPackageCardBoxComponent::Item`) so the box can build rows without
forcing the visual card to render row-level concerns. The visual
`WorkPackageCardComponent` constructor narrows to
`(work_package:, menu_src:)`; in-repo callers updated.
Adds a polymorphic slot API (`with_work_package_item`,
`with_empty_item`) modeled on `Primer::Alpha::FileTreeView`, plus a
public `#build_item` for off-box callers. Renames the URL pass-through
to a generic `params:` kwarg, leaving Backlogs all-state handling at the
call sites.
https://community.openproject.org/wp/73968
Teaches `WorkPackageCardBoxComponent` an optional
`with_show_more(truncate_middle:, text:)` slot. When set, the box
truncates `work_packages` to the first `truncate_middle` rows plus
a derived tail (20% of first page, min 1) and emits a
`Box-row scheme: :neutral` between them advertising the omitted
middle. The slot is also the toggle — leaving it unset means no
truncation, preserving sprint and bucket behaviour.
Default copy is sourced from the new
`work_package_card_box_component.show_more` locale key with
`one`/`other` plurals; consumers can override via `text:` (with a
`%{count}` placeholder). Adds a Lookbook preview for the slot.
https://community.openproject.org/wp/73968
Adds the shared `WorkPackageCardBoxComponent` (with nested `Header`)
and `WorkPackageCardComponent` (with nested `Menu`), so
`SprintComponent`, `BucketComponent`, and the inbox can converge on
a single Primer `BorderBox` + card-row rendering path.
The box derives its DOM id, list id, drop-target id, and per-card URLs
from a single `container:` argument (`Sprint`, `BacklogBucket`, or
`nil` for the inbox). It exposes `header`, `empty_state`, and
`footer` slots; the header exposes `description`, `actions` (typed
`:button` slot), and `menu`.
Adds component specs for all four classes plus Lookbook previews for
the two top-level primitives. Consumers are migrated in follow-up
commits.
https://community.openproject.org/wp/73968
This is intended to become a replacement for the angular-based
<opce-macro-wp-quickinfo> component.
However, the new component should be more generic, so that it can
also be used for other cases, such as rich links to wiki pages.