Skip to content

feat(advertising): replace placements UI with inline expandable cards#4625

Open
thomasguillot wants to merge 4 commits intotrunkfrom
feat/advertising-placements-ui
Open

feat(advertising): replace placements UI with inline expandable cards#4625
thomasguillot wants to merge 4 commits intotrunkfrom
feat/advertising-placements-ui

Conversation

@thomasguillot
Copy link
Copy Markdown
Contributor

@thomasguillot thomasguillot commented Apr 2, 2026

All Submissions:

Changes proposed in this Pull Request:

Replaces the action card toggle + modal pattern on the Advertising Placements screen with an inline expandable card UI.

Each placement card now supports:

  • An Enable button (secondary) when the placement is disabled
  • An Enabled badge + Edit/Cancel button (tertiary) when enabled
  • An inline settings form that expands within the card on Edit or Enable, with Update/Enable (primary) and Disable (destructive tertiary) buttons
  • ESC key to cancel editing (handled inside the card, no external event wiring needed)
  • Other cards' buttons are disabled while a placement is open for editing
  • Snackbar notifications (via portal to #wpbody) on Enable, Update, and Disable
  • Update and Enable buttons disabled until changes/ad unit selection are made
  • Enable, Update, and Disable all guard the panel close + snackbar behind a successful API response — no false success feedback on error

Also:

  • Adds a reusable CardForm component to packages/components/src with title/description/badge/actions/children slots, built-in ESC handling via onRequestClose, README, and examples in the components demo
  • Improves PlacementControl to derive the effective provider when only one is available, fixing empty ad unit options and missing GAM bidder fields in single-provider setups
  • Adds hasHeaderBorder prop to CoreCard for seamless inline form expansion
  • Adds 12-column support to the Grid component (responsive: applies at 1054px+)
  • Fixes stick_to_top toggle to use an immutable state update
  • Updates font-weight for card headings to 600 at the base __header-content level

How to test the changes in this Pull Request:

  1. Go to Newspack → Advertising → Placements.
  2. Verify all placements are listed as cards with an Enable button when disabled.
  3. Click Enable on a placement — the card should expand with a settings form. Confirm the Enable button in the footer is disabled until an ad unit is selected. Confirm all other placements' Enable buttons are disabled.
  4. Select a provider and ad unit, then click Enable — a snackbar should confirm the placement was enabled.
  5. Verify the Enabled badge appears in the card header.
  6. Click Edit — the form expands again. Confirm Update is disabled until a change is made. Confirm other placements' Edit buttons are disabled.
  7. Make a change (e.g. select a different ad unit) and click Update — a snackbar should confirm the update.
  8. Click Edit again, then press ESC — the form should close without saving.
  9. Click Edit, then click Cancel — the form should close and changes should be reverted.
  10. Click EditDisable — the placement should be disabled and a snackbar should confirm.
  11. Click Enable then Cancel before saving — the placement should revert to disabled.
  12. Verify snackbars appear centered at the bottom of the screen.
  13. For placements with multiple hooks (e.g. before/after content), verify each hook has its own ad unit selector.
  14. If only one ad provider is configured, verify the provider select is hidden and the ad unit selector still populates correctly — including GAM bidder ID fields if applicable.
  15. Go to the components demo page and verify the CardForm section shows the enable/edit flow working interactively and all four badge levels.

Other information:

  • Have you added an explanation of what your changes do and why you'd like us to include them?
  • Have you written new tests for your changes, as applicable?
  • Have you successfully ran tests with your changes locally?

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the Advertising Placements screen UI by replacing the toggle + modal workflow with inline, expandable placement cards, adding snackbar confirmations, and enhancing shared UI components to support the new layout.

Changes:

  • Replaces modal-based placement settings with inline expandable cards, including enable/edit/cancel flows and snackbar notifications.
  • Updates PlacementControl to hide the provider selector when only one provider is available.
  • Extends shared UI components: adds 12-column support to Grid, adds hasHeaderBorder to CoreCard, and aligns style-core.scss with WordPress base-style variables.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
src/wizards/advertising/views/placements/index.js Implements the new inline card UI for placements, including enable/edit flows and snackbar notifications.
src/wizards/advertising/style.scss Adds fixed-position snackbar container styling for placement action confirmations.
src/wizards/advertising/components/placement-control/index.js Hides provider select when only one provider exists; refactors layout to a vertical stack.
packages/components/src/grid/style.scss Adds a 12-column grid variant used by the updated placements layout.
packages/components/src/card/style-core.scss Switches to WP base-style variables and adds styles to support borderless headers during inline expansion.
packages/components/src/card/core-card.js Adds hasHeaderBorder prop to allow removing header border/padding for seamless inline expansion.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@thomasguillot thomasguillot force-pushed the feat/advertising-placements-ui branch from ea6b68b to 9179c61 Compare April 2, 2026 19:22
@thomasguillot thomasguillot changed the title feat(advertising): replace placement toggles with inline expandable cards feat(advertising): replace placements UI with inline expandable cards Apr 2, 2026
- Replace action card toggles with inline expandable CardForm cards
- Add CardForm component to packages/components/src with ESC support
- Add hasHeaderBorder prop to CoreCard for seamless form expansion
- Add 12-column responsive grid support (applies at 1054px+)
- Improve PlacementControl to auto-derive provider when only one exists
- Fix stick_to_top toggle to use immutable state update
- Only close edit panel and show snackbar when update succeeds
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 5 comments.

Comments suppressed due to low confidence (1)

src/wizards/advertising/views/placements/index.js:48

  • placementsApiFetch catches fetch errors but never rethrows/returns a status. Callers can’t reliably tell whether a request failed, which leads to follow-up UI actions (open panel, close panel, snackbars) running even when the API call errored. Consider returning a boolean (or rethrowing) so callers can gate subsequent state changes on success.
	const placementsApiFetch = async options => {
		try {
			const data = await apiFetch( options );
			setPlacements( data );
			setError( null );
		} catch ( err ) {
			setError( err );
		}
	};

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

- Guard handlePlacementToggle with inFlight and return success flag
- Gate disable close/snackbar on successful response
- Disable other cards' actions while a placement is being edited
- Derive placementAdUnit from effectiveProvider in PlacementControl
- Move font-weight: 600 to base header-content rule, remove from is-small
@thomasguillot thomasguillot marked this pull request as ready for review April 2, 2026 19:48
@thomasguillot thomasguillot requested a review from a team as a code owner April 2, 2026 19:48
@thomasguillot thomasguillot added the [Status] Needs Review The issue or pull request needs to be reviewed label Apr 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Status] Needs Review The issue or pull request needs to be reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants