Skip to content

[pull] main from TryGhost:main#1358

Merged
pull[bot] merged 11 commits into
code:mainfrom
TryGhost:main
Jul 22, 2026
Merged

[pull] main from TryGhost:main#1358
pull[bot] merged 11 commits into
code:mainfrom
TryGhost:main

Conversation

@pull

@pull pull Bot commented Jul 22, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

9larsons and others added 11 commits July 22, 2026 16:15
no ref
- replaced the raw offers table markup with Shade `Table` primitives
- replaced bespoke active, inactive and archived pills with Shade
`Badge`
- moved table surfaces, borders and secondary text onto semantic Shade
tokens
- changed click-only anchors into buttons while keeping redemption
destinations as links
- fixed sorting so Date added, Name, Redemptions and direction apply to
every visible signup and retention row
- derived retention-row dates from the latest underlying retention offer
- added acceptance coverage for every sorting option and both directions
ref [GVA-868](https://linear.app/ghost/issue/GVA-868/allow-billing-to-navigate-to-approved-ghost-admin-settings)

Ember-only changes silently never shipped: `@tryghost/admin:build` lists `ghost-admin` in `dependsOn`, which orders the Ember build before the React build but creates no project-graph edge, and Nx computes the `^default` input hash from graph dependencies only. An Ember-only source change therefore never invalidated `@tryghost/admin:build`, so CI restored the whole combined `apps/admin/dist` (and `ghost/core/core/built/admin`) from the remote cache while the freshly built Ember output was silently discarded — the build for merge commit `e91932a4037` served an Ember bundle byte-identical to the pre-merge build, with the new billing navigation code missing, even though `ghost-admin:build` itself ran as a cache miss in the same job. Declaring `ghost-admin` as a `workspace:*` devDependency of `@tryghost/admin` gives pnpm and Nx the same source of truth: Nx derives the graph edge from it, putting Ember sources into the build hash (`nx show projects --affected --files=apps/ember-admin/...` now lists `@tryghost/admin`), and pnpm's filtered installs follow it, so the Playwright acceptance job's `pnpm install --filter @tryghost/admin...` installs the Ember app's toolchain for the `ghost-admin:build` task that now runs in its `^build` chain. `apps/ember-admin` has no dependency back on `@tryghost/admin`, so no cycle is introduced.
…ipients` table (#29529)

closes https://linear.app/ghost/issue/NY-1487/

## Summary

- Added track_clicks and clicked_at columns to automated email
recipients
- Updated the current schema definition and integrity hash
closes [NY-1466](https://linear.app/ghost/issue/NY-1466)

When "Email opens" or "Email clicks" is disabled in Settings →
Analytics, automation email metrics show a muted "Off" instead of a
number — on the canvas step footer and in the step sidebar's Email
performance panel.

Metrics stay in place rather than hiding, and "Off" is distinct from
"--" (tracking on, no data yet). Untracked sidebar tiles get a hover
card explaining why, their chart rings fade to an empty track, and the
status is exposed to screen readers. Display-only — re-enabling tracking
restores the numbers immediately.

Gated behind the `automationAnalytics` labs flag. To test: open an
automation with a Send email step and toggle the two settings.

Note that there's no actual click data yet, so you'll only see "Off" or
"--".

demo:


https://github.com/user-attachments/assets/d9b39db9-2401-49fe-b418-ffbca01b1be1
no ref
- added a small compound `ActionList` component to Shade for reusable
title/detail/action rows
- migrated Settings lists and row-style pseudo-tables to `ActionList`
- migrated the webhooks grid to the semantic Shade `Table`
- kept recommendation reveal/loading behavior local to recommendations
- removed the legacy Admin X `List`, `Table`, `DynamicTable`,
`Pagination`, and duplicate pagination hook, including their stories and
tests
…able (#29532)

closes
https://linear.app/ghost/issue/NY-1488/add-nullable-email-clicked-count-to-automation-action-revisions

## Summary

- Adds a nullable unsigned email_clicked_count column to
automation_action_revisions
- This column is dormant for now, but will be populated soon
no ref
- Replaced every admin settings use of the legacy Heading, Link, and
IconLabel components with Shade primitives or semantic elements.
- Updated legacy design-system internals and shared form labels to
render through Shade while the package is being retired.
- Removed the legacy components, their stories, and their exports.
- Aligned Mailgun controls and shared TextField, HtmlField, and
CodeEditor labels with current Settings field styling.
- Permitted the one-way admin-x-design-system to Shade migration
dependency while continuing to forbid dependencies on admin-x-framework.
no ref
- added a reusable Shade image-upload pattern built on `Dropzone`
- expanded `Dropzone` with filled and button variants plus input
accessibility/test hooks
- migrated Settings image and file uploads, pasted dropzones, and
Pintura file inputs to Shade
- removed the legacy design-system `ImageUpload` and `FileUpload`
components
- fixed custom-integration modal overflow with long API keys
- restored persistent profile-upload and cover-action backgrounds via
Shade inverse-surface tokens
…9539)

closes https://linear.app/ghost/issue/NY-1464
closes https://linear.app/ghost/issue/NY-1476

What
----

Adds an index to improve performance.

Along the way, had to add support for [index prefixes in isMySQL][0].

Why
---

MySQL can't index long `VARCHAR`s in full. You can solve this by hashing
the value or by using an [index prefix][0], which effectively only
indexes the first *N* characters.

We chose the latter: an index prefix. We don't need uniqueness so it's
okay if there's a little overlap.

The bulk of this PR adds support for those index prefixes, with the
actual migration as a little sprinkle on top.

Test plan
---------

Added several automated tests.

Also manually ran this SQL and checked the output, on _both_ a fresh
database and a migrated one:

```sql
SELECT * FROM information_schema.STATISTICS
WHERE table_name = 'automated_email_recipients'
AND column_name = 'mailgun_message_id';
```

I **did not** test this with real data on staging because (1) I didn't
want to (2) I think it's _relatively_ low-risk. Happy to do that if you
think I should.

[0]: https://dev.mysql.com/doc/refman/8.4/en/column-indexes.html#column-indexes-prefix
no ref
- added reusable Shade `SortableList`, `DragIndicator`, and
`StickyFooter` components
- expanded the Shade color picker pattern with reusable triggers and
swatches
- moved settings-specific CodeMirror, HTML/Koenig, infinite-scroll,
sorting-hook, and Stripe behavior into admin-x-settings
- migrated navigation, tier benefits, newsletters, color fields,
editors, history loading, Stripe controls, and sticky footers
- removed the matching admin-x-design-system components, stories,
exports, and dependencies
- preserved immediate Escape handling so a color picker closes without
closing its parent modal
- added item-specific accessible names to drag handles
no ref
- added a shared Shade `DirtyConfirmDialog` pattern and controller hook,
with a Storybook story and unit coverage
- migrated Settings exit guards, tips preview, welcome-email design, and
legacy modal close paths off the NiceModal-based `confirmIfDirty` helper
- moved legacy text fields, editors, and Settings sidebar focus tracking
onto Shade's existing focus context
- removed the duplicate dirty/focus providers and legacy
dirty-confirmation implementation from `admin-x-design-system`
- allowed AlertDialog consumers to raise the overlay with the content so
confirmations stay above legacy Settings modals
@pull pull Bot locked and limited conversation to collaborators Jul 22, 2026
@pull pull Bot added the ⤵️ pull label Jul 22, 2026
@pull
pull Bot merged commit bac54d9 into code:main Jul 22, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants