Skip to content

Activity Log: default to Table layout and surface disabled toolbar + date picker on free tier#48418

Merged
dhasilva merged 9 commits intotrunkfrom
fix/activity-log-table-default-and-upsell
May 4, 2026
Merged

Activity Log: default to Table layout and surface disabled toolbar + date picker on free tier#48418
dhasilva merged 9 commits intotrunkfrom
fix/activity-log-table-default-and-upsell

Conversation

@ilonagl
Copy link
Copy Markdown
Contributor

@ilonagl ilonagl commented Apr 30, 2026

Follow-up to #48244.

Proposed changes

  • Default the Activity Log page to the Table layout. DEFAULT_VIEW.type was 'activity'; flip it to 'table' and use the table-side fields / layout already declared in DEFAULT_LAYOUTS.table. Existing visitors keep whatever they had — usePersistentView only falls back to the new default for fresh sessions or after the user clicks "Reset view".
  • Restructure the free-tier surface to match the design. A teaser of the events table fades into the upsell callout that sits directly below it, instead of two unrelated stacked cards. Implementation:
    • A single .jp-activity-log__inner wrapper between .jp-activity-log__dataviews-wrapper and DataViews/UpsellCallout absorbs jetpack-admin-page-layout's .admin-ui-page > :not(...):not(...) > * chain, which would otherwise force every direct child to flex: 1 1 auto; flex-direction: column and prevent the upsell from sitting at content height alongside the table.
    • .dataviews-layout__container is capped at 280px and given a mask-image: linear-gradient(...) so the bottom edge of the events list dissolves into the upsell card.
    • The upsell card itself was restyled to a bordered card with the copy on the left and the illustration on the right at viewports ≥ 782px (column-reverse on mobile).
    • Net effect: all four !important overrides previously added to fight the cascade are gone — the new structure wins on specificity alone.
  • Disable the free-tier search + filter cluster via an attribute overlay on DataViews's real toolbar. Per @simison's PR review, replicating DataViews's toolbar shape (the previous FreeTierToolbar approach) would diverge upstream the moment @wordpress/dataviews evolves. Switch to the alternative they suggested — leave the original DataViews UI in place and disable functionality with an overlay:
    • Render <DataViews /> self-closing so DataViews ships its own DefaultUI (search + filter toggle + cog).
    • A free-tier useEffect finds .dataviews__search and applies aria-disabled="true", a title for the upgrade nudge, and tabindex="-1" on every focusable descendant. CSS keyed on [aria-disabled="true"] dims the cluster, sets cursor: not-allowed, and applies pointer-events: none to the children so clicks fall through to the cluster and the browser-native title tooltip fires on hover.
    • The cog (.dataviews__view-actions's right-hand stack) sits outside the cluster, so the view-config popover stays functional.
    • Avoids the inert attribute because Firefox suppresses title tooltips inside an inert subtree. A MutationObserver re-applies the attributes after DataViews remounts the toolbar so React's render cycle doesn't strip them.
    • Drops FreeTierToolbar.tsx and free-tier-toolbar.scss entirely. The only remaining contact point with an upstream class is .dataviews__search[aria-disabled="true"] — a single, narrow CSS hook that degrades safely (controls undimmed but still hoverable) if upstream renames the class.
  • Show the date-range picker as a disabled upgrade affordance on the free tier. DateRangePicker gains disabled + disabledTooltipText props. When disabled, it short-circuits the <Dropdown> and renders just a non-interactive <Button> (same trigger markup, same label) wrapped in the upgrade tooltip — so the AdminPage header looks identical across tiers.

Related product discussion/links

Does this pull request change what data or activity we track or use?

No.

Testing instructions

Setup: pull this branch, jetpack install plugins/jetpack, jetpack build packages/activity-log. Visit admin.php?page=jetpack-activity-log on a Jetpack-connected, non-multisite, manage_options user.

Default layout — paid tier (Backup-enabled site):

  1. In DevTools → Application → Local Storage, delete any jetpack-activity-log:view:* entry (or use a fresh browser profile).
  2. Reload the page. The DataViews surface should render as a Table with three columns — Date & time / Event / User — not the vertical Activity timeline.
  3. Open the cog popover → confirm the layout switcher shows Table selected. Switching to Activity should still work and surface the timeline + day grouping. Switching back to Table should return to step 2's layout.
  4. After any layout change, refresh — the choice persists via localStorage.
  5. Confirm the date-range picker still works as before: button at the top right opens the popover, presets / inputs commit, table refetches.

Default layout — free tier (no Backup plan, e.g. fresh JN site):

  1. Same steps as 1–2: the table renders with three columns. Pagination is absent and the server caps the table at 20 rows.
  2. Search + filter visibly disabled, cog functional. DataViews's own toolbar renders above the table. The search input and funnel button on the left appear at 50% opacity with a not-allowed cursor on hover. Click them → nothing happens. Hover → "Upgrade your plan to use this feature." appears as a native browser tooltip. Tab through the page → focus skips them. The cog on the right is enabled and opens the view-config popover (perPage selector locked to 20).
  3. Cross-browser tooltip check. Verify the upgrade tooltip fires in both Chromium and Firefox. (Firefox needed special handling because it suppresses title inside inert subtrees, hence the aria-disabled + tabindex="-1" overlay rather than inert.)
  4. Date-range picker visible but disabled. The AdminPage header still shows the "Apr X, YYYY to Apr Y, YYYY" button with the calendar icon, but it's disabled. Hover it → same upgrade tooltip. Clicking does nothing (no popover opens).

Free-tier table fade + upsell card layout:

  1. The events table is capped at a teaser height; its bottom edge fades smoothly into the upsell card sitting directly below it.
  2. The upsell card layout at viewport ≥ 782px: bordered card with copy + Upgrade button on the left, illustration on the right, vertically centered.
  3. Resize the browser below 782px (or use DevTools' device toolbar). The card flips to column-reverse: copy on top, illustration below.
  4. DevTools → Elements → inspect .jp-activity-log__upsell-callout and confirm display: flex and flex-direction: row (or column-reverse on narrow viewports) are computed — grep -n '!important' projects/packages/activity-log/src/js/style.scss returns nothing.

Server-side gating (security boundary):

  1. With a real free-tier user, open DevTools Network and submit a fake search request (e.g., wp.apiFetch({ path: '/jetpack/v4/activity-log/list?text_search=foo' })). The response should still be the 20 most recent events overall — REST_Controller::get_activity_log() strips text_search, after, before, group, and not_group and clamps number to 20 / page to 1 when has_activity_logs_access() is false.

Regression spot-checks (existing PR #48244 behavior):

  1. Reset view (cog → Reset view) on a paid-tier site after switching to Activity layout — confirm the view returns to the new Table default and the cog "modified" indicator clears.
  2. The Activity layout's day-group headers (Apr 30, 2026) still render when the user explicitly switches to that layout via the cog.
  3. Upgrade flow from the upsell callout still routes through useProductCheckoutWorkflow to jetpack_security_t1_yearly and the post-checkout refresh_access nonce still drops the cached access flag.
Before After
Screenshot from 2026-04-30 20-58-10 2026-04-30_20-46
Screenshot from 2026-04-30 20-57-28 Screenshot from 2026-04-30 20-55-57

- Flip DEFAULT_VIEW.type from 'activity' to 'table' so new visitors
  land on the Date / Event / User columns instead of the timeline.
  Existing localStorage-persisted views are preserved by usePersistentView.
- Forward upsell-callout.scss from the main entry style.scss via @use
  instead of relying on the side-effect import in UpsellCallout.tsx,
  so the rules land in the same chunk as the wrapper styles and the
  flex layout (image left, copy right on >= 782px) actually applies.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 30, 2026

Are you an Automattician? Please test your changes on all WordPress.com environments to help mitigate accidental explosions.

  • To test on WoA, go to the Plugins menu on a WoA dev site. Click on the "Upload" button and follow the upgrade flow to be able to upload, install, and activate the Jetpack Beta plugin. Once the plugin is active, go to Jetpack > Jetpack Beta, select your plugin (Jetpack), and enable the fix/activity-log-table-default-and-upsell branch.
  • To test on Simple, run the following command on your sandbox:
bin/jetpack-downloader test jetpack fix/activity-log-table-default-and-upsell

Interested in more tips and information?

  • In your local development environment, use the jetpack rsync command to sync your changes to a WoA dev blog.
  • Read more about our development workflow here: PCYsg-eg0-p2
  • Figure out when your changes will be shipped to customers here: PCYsg-eg5-p2

@github-actions github-actions Bot added the [Plugin] Jetpack Issues about the Jetpack plugin. https://wordpress.org/plugins/jetpack/ label Apr 30, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 30, 2026

Thank you for your PR!

When contributing to Jetpack, we have a few suggestions that can help us test and review your patch:

  • ✅ Include a description of your PR changes.
  • ✅ Add a "[Status]" label (In Progress, Needs Review, ...).
  • ✅ Add testing instructions.
  • ✅ Specify whether this PR includes any changes to data or privacy.
  • ✅ Add changelog entries to affected projects

This comment will be updated as you work on your PR and make changes. If you think that some of those checks are not needed for your PR, please explain why you think so. Thanks for cooperation 🤖


Follow this PR Review Process:

  1. Ensure all required checks appearing at the bottom of this PR are passing.
  2. Make sure to test your changes on all platforms that it applies to. You're responsible for the quality of the code you ship.
  3. You can use GitHub's Reviewers functionality to request a review.
  4. When it's reviewed and merged, you will be pinged in Slack to deploy the changes to WordPress.com simple once the build is done.

If you have questions about anything, reach out in #jetpack-developers for guidance!


Jetpack plugin:

The Jetpack plugin has different release cadences depending on the platform:

  • WordPress.com Simple releases happen as soon as you deploy your changes after merging this PR (PCYsg-Jjm-p2).
  • WoA releases happen weekly.
  • Releases to self-hosted sites happen monthly:
    • Scheduled release: May 5, 2026
    • Code freeze: May 4, 2026

If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack.

@jp-launch-control
Copy link
Copy Markdown

jp-launch-control Bot commented Apr 30, 2026

Code Coverage Summary

This PR did not change code coverage!

That could be good or bad, depending on the situation. Everything covered before, and still is? Great! Nothing was covered before? Not so great. 🤷

Full summary · PHP report · JS report

…pgrade tooltips

- Add FreeTierToolbar that mirrors the DataViews default toolbar shape:
  disabled SearchControl + disabled funnel button on the left, the real
  DataViews.ViewConfig (cog) on the right. Each disabled affordance is
  wrapped in a Tooltip explaining the upgrade requirement.
- Extend DateRangePicker with `disabled` + `disabledTooltipText` props.
  When disabled, the trigger renders as a non-interactive Button (no
  Dropdown / popover) wrapped in the upgrade tooltip — same hover target
  and label as the paid trigger so the surface stays visually stable
  across tiers.
- Mount the picker in AdminPage `actions` on both tiers; pass
  `disabled={!hasActivityLogsAccess}` so the free tier sees the disabled
  variant alongside the title/subtitle, matching the paid layout.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ilonagl ilonagl changed the title Activity Log: default to Table layout and fix free-tier upsell layout Activity Log: default to Table layout and surface disabled toolbar + date picker on free tier Apr 30, 2026
ilonagl and others added 4 commits April 30, 2026 22:48
…abled>

`<SearchControl>` from @wordpress/components destructures `disabled`
out of restProps before forwarding to its StyledInputControl, so the
prop was being silently dropped — leaving a fully functional input
underneath the upgrade tooltip. Wrap it in a `<fieldset disabled>`
instead, which natively disables every form control in its subtree
regardless of what the wrapping component filters out, and reset the
fieldset's default chrome so the layout doesn't shift.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ath the table

The free tier caps the table at 20 rows and renders the upsell callout
directly below it, but `.dataviews-layout__container`'s `overflow: auto`
plus the wrapper's `flex: 1 1 auto` were giving the table its own
scrollbar inside the page's middle column — pushing the upsell below
the fold and making it look detached. Add a `--free-tier` modifier on
the wrapper that drops the flex-grow and disarms the layout
container's overflow, so the events list and the upsell render as one
continuous block and the page's outer scroll column is the only one
the user ever sees.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous commit's `--free-tier` rules were getting overruled by
`jetpack-admin-page-layout`'s
`.admin-ui-page > :not(.admin-ui-page__header):not(.jetpack-footer) > *`
selector (one class + two `:not()`s outweighs our single class), which
force-applies `flex: 1 1 auto` to every direct child of the scroll
column and the same chain forces `.dataviews-wrapper` into a flex-grow
fill. Bump our overrides with `!important` so the wrapper actually
sizes to content and the inner scroll surface is disarmed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Card chrome: 1px border, 4px radius, 24/32px padding so the callout
  reads as a contained card instead of a full-bleed banner.
- Reorder children (content first, image second) so on `flex-direction:
  row` the copy sits on the left and the illustration on the right —
  the column-reverse mobile fallback still keeps the copy on top.
- Tighten title (20px / 12px gaps) and combine the two upgrade
  paragraphs into one so the layout matches the new product spec.
- Update copy: "Track every action with Activity logs" / "site events"
  language / "Upgrade plan" CTA.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dhasilva and others added 3 commits April 30, 2026 19:38
Wrap the free-tier DataViews + UpsellCallout pair in a single
`.jp-activity-log__inner` div so `jetpack-admin-page-layout`'s
`.admin-ui-page > :not(.admin-ui-page__header):not(.jetpack-footer) > *`
chain (which force-applies `flex: 1 1 auto; flex-direction: column` to
every direct child of the page's scroll column) lands on the inner
wrapper instead of competing with our actual content. With the chain
absorbed there, DataViews and the UpsellCallout are grandchildren and
stack naturally — no specificity fight, no `!important` overrides.

That structural change unlocks the new visual: cap
`.dataviews-layout__container` at 280px and apply a `mask-image` linear
gradient to its bottom edge so the table dissolves into the upsell card
rather than colliding with it. The inner wrapper carries a local
`overflow: auto` so a short viewport can still reveal the full upsell.

Drops all four `!important` declarations from `src/js/style.scss`
(the cascade fight they were patching no longer happens) and lets the
upsell card's `flex-direction: row` rule at >=782px win on its own
specificity, fixing the side-by-side image/copy layout.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…DataViews UI

Per @simison's PR review: replicating DataViews' toolbar shape in
`free-tier-toolbar.scss` will diverge the moment upstream changes
anything in `@wordpress/dataviews`, and DataViews exposes no native
prop for disabling its built-in `Search` / `FiltersToggle`. Switch to
the alternative @simison suggested — leave the original DataViews UI
in place and disable functionality with an overlay — which keeps the
free-tier surface visually pixel-identical to paid, for free.

Drop `FreeTierToolbar.tsx` and `free-tier-toolbar.scss` entirely.
On free tier, render `<DataViews />` self-closing so its `DefaultUI`
ships the real toolbar, then a single `useEffect` finds the
`.dataviews__search` cluster and attaches `aria-disabled="true"`,
a `title` for the upgrade nudge, and `tabindex="-1"` on every
focusable descendant. CSS keyed on `[aria-disabled="true"]` dims the
cluster, sets `cursor: not-allowed`, and applies `pointer-events:
none` to the children so clicks fall through to the cluster (keeping
it hoverable for the browser-native title tooltip). The cog
(`.dataviews__view-actions`'s right-hand stack) sits outside the
cluster, so the view-config popover stays usable.

We avoid the `inert` attribute here even though it would be the
crispest way to neutralize a subtree: Firefox suppresses `title`
tooltips inside an inert subtree, so the upgrade nudge would never
show. Keeping the cluster non-inert (just with non-functional
children) restores the tooltip cross-browser. A `MutationObserver`
re-applies the attributes after DataViews remounts the toolbar so
React's render cycle doesn't strip them.

Net effect: a single CSS hook (`.dataviews__search[aria-disabled]`)
remains as a contact point with upstream, used purely to express the
disabled state — no padding/gap/flex replication. If upstream renames
the class, the controls degrade to "non-dimmed but still hoverable"
rather than to "fake-disabled but functional", which is the safer
failure mode.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@dhasilva dhasilva self-assigned this Apr 30, 2026
@dhasilva dhasilva requested a review from a team April 30, 2026 23:59
@keoshi
Copy link
Copy Markdown
Contributor

keoshi commented May 1, 2026

We should also update the illustration to match Jetpack's branding.

return;
}

if ( cluster.getAttribute( 'aria-disabled' ) !== 'true' ) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Recommend to just set "inert" attribute in the wrapper or overlay which doesn't let clicks/interactions through. Anything else like done here is prone to be fragile and bug prone.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

inert won't let the tooltip work on Firefox.

const tooltipText = __( 'Upgrade your plan to use this feature.', 'jetpack-activity-log' );

const apply = ( root: ParentNode ) => {
const cluster = root.querySelector< HTMLElement >( '.dataviews__search' );
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This selector will go away eventually and we can't rely on it as a stable API.

// cursor, and shuts off pointer events on the controls inside so
// clicks fall through to the cluster (keeping it hoverable for the
// browser-native title tooltip).
.dataviews__search[aria-disabled="true"] {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We can't rely on these selectors as stable API and in future it won't be there.

@ilonagl
Copy link
Copy Markdown
Contributor Author

ilonagl commented May 1, 2026

We should also update the illustration to match Jetpack's branding.

@keoshi do we have the illustration that we can update this to?

@keoshi
Copy link
Copy Markdown
Contributor

keoshi commented May 1, 2026

@ilonagl Not yet, we'll have to create it. Or modify this one.

@dhasilva dhasilva merged commit 7f77fbf into trunk May 4, 2026
83 checks passed
@dhasilva dhasilva deleted the fix/activity-log-table-default-and-upsell branch May 4, 2026 15:16
@github-actions github-actions Bot removed the [Status] Needs Review This PR is ready for review. label May 4, 2026
@github-actions github-actions Bot added the [Status] UI Changes Add this to PRs that change the UI so documentation can be updated. label May 4, 2026
dhasilva pushed a commit that referenced this pull request May 6, 2026
…ion) (#48531)

* Activity Log: revert free-tier search overlay to use inert

Per #48527 (and the original PR #48418 review): the `aria-disabled` +
`tabindex="-1"` + `pointer-events: none` triple was chosen to keep the
`title` upgrade tooltip working in Firefox. We're accepting that
tradeoff and going back to the cleaner `inert` attribute, which blocks
pointer + keyboard interaction and hides descendants from the a11y tree
in one shot. Firefox suppresses `title` tooltips inside an inert
subtree, so the upgrade nudge won't appear there — accepted per the
issue.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: refresh free-tier upsell illustration + lowercase title

- Swap the upsell callout illustration for the Jetpack-branded version
  (per #48418 (comment)).
  Filename kept as `activity-logs-callout-illustration.svg` so the
  webpack import in `UpsellCallout.tsx` resolves untouched.
- Lowercase "activity logs" in the upsell title — sentence case to
  match Jetpack copy conventions.
- Drop the inert-revert changelog from the previous commit; that change
  has no user-visible behavior shift, so a single user-benefit entry
  covering the visible refresh suffices.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: deep-link Manage backup action to Calypso restore flow

The DataViews "Manage backup" row action was a disabled placeholder
waiting for a future Backup wp-admin page. Wire it up to open Calypso's
Backup restore flow for the row's rewind point in a new tab —
`https://wordpress.com/backup/{calypsoSlug}/restore/{rewindId}` —
which gives users an actionable path today without waiting on the
in-progress port.

- `actions.tsx`: read `calypsoSlug` from Initial_State at module load,
  render the action only when the row is rewindable AND has a
  `rewindId` AND a slug is available, and on click `window.open` the
  Calypso URL with `noopener,noreferrer`. Also accept an optional
  `tracks` handle and emit a `jetpack_activity_log_manage_backup_click`
  event.
- `index.tsx`: pass `tracks` through to `useActivityActions`, and drop
  the "Coming soon" tooltip MutationObserver effect — the action is no
  longer disabled so the textContent-matching DOM hack is obsolete.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: point Manage backup at cloud.jetpack.com instead of WPCOM

Jetpack Cloud (cloud.jetpack.com) is the Jetpack-branded analog of the
Calypso Backup flow and is what we want users to land on from a Jetpack
admin surface. Swap the deep-link host accordingly:
`https://cloud.jetpack.com/backup/{calypsoSlug}/restore/{rewindId}`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: rename action to "Restore backup", flag link as temporary

- Label "Manage backup" → "Restore backup" — the button opens the
  Backup restore flow, so the label should describe that.
- Tracks event renamed in lockstep:
  jetpack_activity_log_manage_backup_click →
  jetpack_activity_log_restore_backup_click.
- Document in the hook's docblock that the cloud.jetpack.com deep-link
  is a stop-gap until the Backup wp-admin port (#48236) lands. After
  that ships, every row action here should point at the in-admin
  Backup page instead of cloud.jetpack.com so users stay inside their
  own wp-admin.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
matticbot pushed a commit to Automattic/jetpack-production that referenced this pull request May 6, 2026
…ion) (#48531)

* Activity Log: revert free-tier search overlay to use inert

Per #48527 (and the original PR #48418 review): the `aria-disabled` +
`tabindex="-1"` + `pointer-events: none` triple was chosen to keep the
`title` upgrade tooltip working in Firefox. We're accepting that
tradeoff and going back to the cleaner `inert` attribute, which blocks
pointer + keyboard interaction and hides descendants from the a11y tree
in one shot. Firefox suppresses `title` tooltips inside an inert
subtree, so the upgrade nudge won't appear there — accepted per the
issue.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: refresh free-tier upsell illustration + lowercase title

- Swap the upsell callout illustration for the Jetpack-branded version
  (per Automattic/jetpack#48418 (comment)).
  Filename kept as `activity-logs-callout-illustration.svg` so the
  webpack import in `UpsellCallout.tsx` resolves untouched.
- Lowercase "activity logs" in the upsell title — sentence case to
  match Jetpack copy conventions.
- Drop the inert-revert changelog from the previous commit; that change
  has no user-visible behavior shift, so a single user-benefit entry
  covering the visible refresh suffices.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: deep-link Manage backup action to Calypso restore flow

The DataViews "Manage backup" row action was a disabled placeholder
waiting for a future Backup wp-admin page. Wire it up to open Calypso's
Backup restore flow for the row's rewind point in a new tab —
`https://wordpress.com/backup/{calypsoSlug}/restore/{rewindId}` —
which gives users an actionable path today without waiting on the
in-progress port.

- `actions.tsx`: read `calypsoSlug` from Initial_State at module load,
  render the action only when the row is rewindable AND has a
  `rewindId` AND a slug is available, and on click `window.open` the
  Calypso URL with `noopener,noreferrer`. Also accept an optional
  `tracks` handle and emit a `jetpack_activity_log_manage_backup_click`
  event.
- `index.tsx`: pass `tracks` through to `useActivityActions`, and drop
  the "Coming soon" tooltip MutationObserver effect — the action is no
  longer disabled so the textContent-matching DOM hack is obsolete.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: point Manage backup at cloud.jetpack.com instead of WPCOM

Jetpack Cloud (cloud.jetpack.com) is the Jetpack-branded analog of the
Calypso Backup flow and is what we want users to land on from a Jetpack
admin surface. Swap the deep-link host accordingly:
`https://cloud.jetpack.com/backup/{calypsoSlug}/restore/{rewindId}`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: rename action to "Restore backup", flag link as temporary

- Label "Manage backup" → "Restore backup" — the button opens the
  Backup restore flow, so the label should describe that.
- Tracks event renamed in lockstep:
  jetpack_activity_log_manage_backup_click →
  jetpack_activity_log_restore_backup_click.
- Document in the hook's docblock that the cloud.jetpack.com deep-link
  is a stop-gap until the Backup wp-admin port (#48236) lands. After
  that ships, every row action here should point at the in-admin
  Backup page instead of cloud.jetpack.com so users stay inside their
  own wp-admin.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Committed via a GitHub action: https://github.com/Automattic/jetpack/actions/runs/25447243760

Upstream-Ref: Automattic/jetpack@ab3cad2
matticbot pushed a commit to Automattic/jetpack-storybook that referenced this pull request May 6, 2026
…ion) (#48531)

* Activity Log: revert free-tier search overlay to use inert

Per #48527 (and the original PR #48418 review): the `aria-disabled` +
`tabindex="-1"` + `pointer-events: none` triple was chosen to keep the
`title` upgrade tooltip working in Firefox. We're accepting that
tradeoff and going back to the cleaner `inert` attribute, which blocks
pointer + keyboard interaction and hides descendants from the a11y tree
in one shot. Firefox suppresses `title` tooltips inside an inert
subtree, so the upgrade nudge won't appear there — accepted per the
issue.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: refresh free-tier upsell illustration + lowercase title

- Swap the upsell callout illustration for the Jetpack-branded version
  (per Automattic/jetpack#48418 (comment)).
  Filename kept as `activity-logs-callout-illustration.svg` so the
  webpack import in `UpsellCallout.tsx` resolves untouched.
- Lowercase "activity logs" in the upsell title — sentence case to
  match Jetpack copy conventions.
- Drop the inert-revert changelog from the previous commit; that change
  has no user-visible behavior shift, so a single user-benefit entry
  covering the visible refresh suffices.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: deep-link Manage backup action to Calypso restore flow

The DataViews "Manage backup" row action was a disabled placeholder
waiting for a future Backup wp-admin page. Wire it up to open Calypso's
Backup restore flow for the row's rewind point in a new tab —
`https://wordpress.com/backup/{calypsoSlug}/restore/{rewindId}` —
which gives users an actionable path today without waiting on the
in-progress port.

- `actions.tsx`: read `calypsoSlug` from Initial_State at module load,
  render the action only when the row is rewindable AND has a
  `rewindId` AND a slug is available, and on click `window.open` the
  Calypso URL with `noopener,noreferrer`. Also accept an optional
  `tracks` handle and emit a `jetpack_activity_log_manage_backup_click`
  event.
- `index.tsx`: pass `tracks` through to `useActivityActions`, and drop
  the "Coming soon" tooltip MutationObserver effect — the action is no
  longer disabled so the textContent-matching DOM hack is obsolete.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: point Manage backup at cloud.jetpack.com instead of WPCOM

Jetpack Cloud (cloud.jetpack.com) is the Jetpack-branded analog of the
Calypso Backup flow and is what we want users to land on from a Jetpack
admin surface. Swap the deep-link host accordingly:
`https://cloud.jetpack.com/backup/{calypsoSlug}/restore/{rewindId}`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: rename action to "Restore backup", flag link as temporary

- Label "Manage backup" → "Restore backup" — the button opens the
  Backup restore flow, so the label should describe that.
- Tracks event renamed in lockstep:
  jetpack_activity_log_manage_backup_click →
  jetpack_activity_log_restore_backup_click.
- Document in the hook's docblock that the cloud.jetpack.com deep-link
  is a stop-gap until the Backup wp-admin port (#48236) lands. After
  that ships, every row action here should point at the in-admin
  Backup page instead of cloud.jetpack.com so users stay inside their
  own wp-admin.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Committed via a GitHub action: https://github.com/Automattic/jetpack/actions/runs/25447243760

Upstream-Ref: Automattic/jetpack@ab3cad2
matticbot pushed a commit to Automattic/jetpack-activity-log that referenced this pull request May 6, 2026
…ion) (#48531)

* Activity Log: revert free-tier search overlay to use inert

Per #48527 (and the original PR #48418 review): the `aria-disabled` +
`tabindex="-1"` + `pointer-events: none` triple was chosen to keep the
`title` upgrade tooltip working in Firefox. We're accepting that
tradeoff and going back to the cleaner `inert` attribute, which blocks
pointer + keyboard interaction and hides descendants from the a11y tree
in one shot. Firefox suppresses `title` tooltips inside an inert
subtree, so the upgrade nudge won't appear there — accepted per the
issue.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: refresh free-tier upsell illustration + lowercase title

- Swap the upsell callout illustration for the Jetpack-branded version
  (per Automattic/jetpack#48418 (comment)).
  Filename kept as `activity-logs-callout-illustration.svg` so the
  webpack import in `UpsellCallout.tsx` resolves untouched.
- Lowercase "activity logs" in the upsell title — sentence case to
  match Jetpack copy conventions.
- Drop the inert-revert changelog from the previous commit; that change
  has no user-visible behavior shift, so a single user-benefit entry
  covering the visible refresh suffices.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: deep-link Manage backup action to Calypso restore flow

The DataViews "Manage backup" row action was a disabled placeholder
waiting for a future Backup wp-admin page. Wire it up to open Calypso's
Backup restore flow for the row's rewind point in a new tab —
`https://wordpress.com/backup/{calypsoSlug}/restore/{rewindId}` —
which gives users an actionable path today without waiting on the
in-progress port.

- `actions.tsx`: read `calypsoSlug` from Initial_State at module load,
  render the action only when the row is rewindable AND has a
  `rewindId` AND a slug is available, and on click `window.open` the
  Calypso URL with `noopener,noreferrer`. Also accept an optional
  `tracks` handle and emit a `jetpack_activity_log_manage_backup_click`
  event.
- `index.tsx`: pass `tracks` through to `useActivityActions`, and drop
  the "Coming soon" tooltip MutationObserver effect — the action is no
  longer disabled so the textContent-matching DOM hack is obsolete.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: point Manage backup at cloud.jetpack.com instead of WPCOM

Jetpack Cloud (cloud.jetpack.com) is the Jetpack-branded analog of the
Calypso Backup flow and is what we want users to land on from a Jetpack
admin surface. Swap the deep-link host accordingly:
`https://cloud.jetpack.com/backup/{calypsoSlug}/restore/{rewindId}`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: rename action to "Restore backup", flag link as temporary

- Label "Manage backup" → "Restore backup" — the button opens the
  Backup restore flow, so the label should describe that.
- Tracks event renamed in lockstep:
  jetpack_activity_log_manage_backup_click →
  jetpack_activity_log_restore_backup_click.
- Document in the hook's docblock that the cloud.jetpack.com deep-link
  is a stop-gap until the Backup wp-admin port (#48236) lands. After
  that ships, every row action here should point at the in-admin
  Backup page instead of cloud.jetpack.com so users stay inside their
  own wp-admin.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Committed via a GitHub action: https://github.com/Automattic/jetpack/actions/runs/25447243760

Upstream-Ref: Automattic/jetpack@ab3cad2
LiamSarsfield pushed a commit that referenced this pull request May 6, 2026
…ion) (#48531)

* Activity Log: revert free-tier search overlay to use inert

Per #48527 (and the original PR #48418 review): the `aria-disabled` +
`tabindex="-1"` + `pointer-events: none` triple was chosen to keep the
`title` upgrade tooltip working in Firefox. We're accepting that
tradeoff and going back to the cleaner `inert` attribute, which blocks
pointer + keyboard interaction and hides descendants from the a11y tree
in one shot. Firefox suppresses `title` tooltips inside an inert
subtree, so the upgrade nudge won't appear there — accepted per the
issue.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: refresh free-tier upsell illustration + lowercase title

- Swap the upsell callout illustration for the Jetpack-branded version
  (per #48418 (comment)).
  Filename kept as `activity-logs-callout-illustration.svg` so the
  webpack import in `UpsellCallout.tsx` resolves untouched.
- Lowercase "activity logs" in the upsell title — sentence case to
  match Jetpack copy conventions.
- Drop the inert-revert changelog from the previous commit; that change
  has no user-visible behavior shift, so a single user-benefit entry
  covering the visible refresh suffices.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: deep-link Manage backup action to Calypso restore flow

The DataViews "Manage backup" row action was a disabled placeholder
waiting for a future Backup wp-admin page. Wire it up to open Calypso's
Backup restore flow for the row's rewind point in a new tab —
`https://wordpress.com/backup/{calypsoSlug}/restore/{rewindId}` —
which gives users an actionable path today without waiting on the
in-progress port.

- `actions.tsx`: read `calypsoSlug` from Initial_State at module load,
  render the action only when the row is rewindable AND has a
  `rewindId` AND a slug is available, and on click `window.open` the
  Calypso URL with `noopener,noreferrer`. Also accept an optional
  `tracks` handle and emit a `jetpack_activity_log_manage_backup_click`
  event.
- `index.tsx`: pass `tracks` through to `useActivityActions`, and drop
  the "Coming soon" tooltip MutationObserver effect — the action is no
  longer disabled so the textContent-matching DOM hack is obsolete.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: point Manage backup at cloud.jetpack.com instead of WPCOM

Jetpack Cloud (cloud.jetpack.com) is the Jetpack-branded analog of the
Calypso Backup flow and is what we want users to land on from a Jetpack
admin surface. Swap the deep-link host accordingly:
`https://cloud.jetpack.com/backup/{calypsoSlug}/restore/{rewindId}`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Activity Log: rename action to "Restore backup", flag link as temporary

- Label "Manage backup" → "Restore backup" — the button opens the
  Backup restore flow, so the label should describe that.
- Tracks event renamed in lockstep:
  jetpack_activity_log_manage_backup_click →
  jetpack_activity_log_restore_backup_click.
- Document in the hook's docblock that the cloud.jetpack.com deep-link
  is a stop-gap until the Backup wp-admin port (#48236) lands. After
  that ships, every row action here should point at the in-admin
  Backup page instead of cloud.jetpack.com so users stay inside their
  own wp-admin.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Feature] Activity Log [Package] Activity Log [Plugin] Jetpack Issues about the Jetpack plugin. https://wordpress.org/plugins/jetpack/ [Status] UI Changes Add this to PRs that change the UI so documentation can be updated.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants