Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
3e66d51
Added regression test pinning posts-stats urlExists false branch
allouis May 6, 2026
0332bfa
Improved Ember dev server performance (#27702)
jonatansberg May 7, 2026
c384cd8
Refactored ShareModal to use slot-based composition (#27698)
kevinansfield May 7, 2026
4cb644c
💡 Improved member list query performance (#26953)
jonatansberg May 7, 2026
44af743
Fixed adapter-manager misreporting missing deps as missing adapter
allouis May 6, 2026
bbc3981
Restored superagent and superagent-throttle dependencies
allouis May 7, 2026
59b314d
Excluded gift subscriptions from paid subscription charts (#27759)
mike182uk May 7, 2026
02e9bb5
Excluded complimentary members from paid subscription breakdown (#27761)
mike182uk May 7, 2026
b37096c
Make automations log prefix more generic (#27727)
EvanHahn May 7, 2026
1dd3f89
Removed legacy Ember members list (#27599)
jonatansberg May 7, 2026
5f10577
🐛 Fixed second label filter creating duplicate filters on each toggle…
rob-ghost May 7, 2026
0c06b15
Added temporary fake automations database (#27733)
EvanHahn May 7, 2026
9b6f980
Removed unnecessary `URL` imports (#27734)
EvanHahn May 7, 2026
9c0edb7
Improved gift subscription Portal screens across selection, preview, …
minimaluminium May 7, 2026
9882356
Updated copy and setting for gift redemption staff notification (#27769)
sagzy May 7, 2026
b90b277
Changed audience-feedback and comment URL helpers to take a post object
allouis May 5, 2026
6d96c08
Added UrlServiceFacade in front of the eager UrlService singleton
allouis May 5, 2026
f7de9fe
Migrated routing controllers and RouterManager to UrlServiceFacade
allouis May 5, 2026
0aa1e7b
Migrated API output URL serializer to UrlServiceFacade
allouis May 5, 2026
62bc39e
Migrated frontend helpers and meta to UrlServiceFacade
allouis May 5, 2026
8993e3a
Migrated slack/indexnow/comments/audience-feedback to UrlServiceFacade
allouis May 5, 2026
4c141f4
Migrated reverse URL lookups to facade.resolveUrl
allouis May 5, 2026
84c4f3f
Added no-cache handling for preview requests (#27774)
9larsons May 7, 2026
392e6fe
v6.37.0
github-actions[bot] May 7, 2026
e88ae30
Bumped version to 6.37.1-rc.0
github-actions[bot] May 7, 2026
76982f0
Added Calendar component and used for filtering (#27657)
weylandswart May 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,8 @@ const EmailNotificationsInputs: React.FC<{ user: User; setUserData: (user: User)
align='center'
checked={user.gift_subscription_purchase_notification}
direction='rtl'
hint='Every time someone purchases a gift subscription'
label='Gift subscription purchases'
hint='Every time someone purchases or redeems a gift subscription'
label='Gift subscriptions'
onChange={(e) => {
setUserData?.({...user, gift_subscription_purchase_notification: e.target.checked});
}}
Expand Down
34 changes: 33 additions & 1 deletion apps/admin/src/ember-bridge/ember-bridge.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,39 @@ describe('useEmberDataSync', () => {
expect(invalidateSpy).not.toHaveBeenCalled();
});

queryTest('invalidates comment queries for mapped Ember comment events', async ({ queryClient, wrapper }) => {
const mock = createMockStateBridge();
window.EmberBridge = { state: mock.stateBridge };

queryClient.setQueryData(['MembersResponseType', '/members'], { members: [] });
queryClient.setQueryData(['CommentsResponseType', '/comments'], { comments: [] });
queryClient.setQueryData(['PostsResponseType', '/posts'], { posts: [] });

renderHook(() => useEmberDataSync(), { wrapper });

await waitFor(() => {
expect(mock.onSpy).toHaveBeenCalledWith('emberDataChange', expect.any(Function));
});

act(() => {
mock.emit('emberDataChange', {
operation: 'update',
modelName: 'comment',
id: 'member-1',
data: null
});
});

await waitFor(() => {
const queries = queryClient.getQueryCache().getAll();
const commentQueries = queries.filter(q => q.queryKey[0] === 'CommentsResponseType');
const nonCommentQueries = queries.filter(q => q.queryKey[0] !== 'CommentsResponseType');

expect(commentQueries.every(q => q.state.isInvalidated)).toBe(true);
expect(nonCommentQueries.every(q => !q.state.isInvalidated)).toBe(true);
});
});

queryTest('does not subscribe if unmounted before the bridge becomes available', async ({ wrapper }) => {
vi.useFakeTimers();
const mock = createMockStateBridge();
Expand Down Expand Up @@ -383,4 +416,3 @@ describe('useEmberRouting', () => {
});
});
});

2 changes: 1 addition & 1 deletion apps/admin/src/ember-bridge/ember-bridge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ const EMBER_TO_REACT_TYPE_MAPPING: Record<string, string> = {
'user': 'UsersResponseType',
'post': 'PostsResponseType',
'member': 'MembersResponseType',
'comment': 'CommentsResponseType',
'tag': 'TagsResponseType',
'label': 'LabelsResponseType',
'webhook': 'WebhooksResponseType'
Expand Down Expand Up @@ -310,4 +311,3 @@ export function useForceUpgrade(): boolean {

return true;
}

68 changes: 42 additions & 26 deletions apps/admin/src/onboarding/components/share-publication-dialog.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {Button} from "@tryghost/shade/components";
import {ShareModal, type ShareModalSocialLink} from "@tryghost/shade/patterns";
import {LucideIcon} from "@tryghost/shade/utils";

interface SharePublicationDialogProps {
description: string;
Expand Down Expand Up @@ -47,37 +48,52 @@ export function SharePublicationDialog({
];

return (
<ShareModal
actionsLayout="footer"
closeButtonId="ob-close-share-modal"
contentProps={{
className: "dark:bg-surface-elevated",
"data-testid": "onboarding-share-modal",
}}
copyButtonId="ob-copy-publication-link"
copyButtonTestId="onboarding-copy-link"
copyLabel="Copy link"
copyURL={siteUrl}
guidance={(
<ShareModal.Root
open={open}
onOpenChange={onOpenChange}
>
<ShareModal.Content
className="dark:bg-surface-elevated"
data-test-modal="onboarding-share"
data-testid="onboarding-share-modal"
>
<ShareModal.Header className="flex-row items-center justify-between gap-4 space-y-0 text-left">
<ShareModal.Title className="text-2xl">Share your publication</ShareModal.Title>
<ShareModal.CloseButton id="ob-close-share-modal" onClick={() => onOpenChange(false)} />
</ShareModal.Header>
<ShareModal.Preview className="rounded-lg bg-card" href={siteUrl}>
{imageUrl ?
<div className="aspect-video bg-cover bg-center" style={{backgroundImage: `url(${imageUrl})`}}></div>
:
<div className="flex aspect-video items-center justify-center bg-muted text-muted-foreground">
<LucideIcon.Image className="size-8" />
</div>
}
<div className="p-5">
<div className="text-lg font-semibold">{siteTitle}</div>
{description && (
<p className="mt-1 text-sm text-muted-foreground">{description}</p>
)}
</div>
</ShareModal.Preview>
<p className="text-sm text-muted-foreground">
Set your publication&apos;s cover image and description in{" "}
<Button asChild className="h-auto p-0 align-baseline text-sm text-green hover:text-green/90" variant="link">
<a href="#/settings/design/edit?ref=setup" id="ob-share-modal-design-settings">Design settings</a>
</Button>.
</p>
)}
open={open}
preview={{
description,
imageURL: imageUrl,
title: siteTitle,
url: siteUrl,
}}
socialLinks={socialLinks}
title="Share your publication"
variant="publication"
onClose={() => onOpenChange(false)}
onOpenChange={onOpenChange}
/>
<ShareModal.Footer>
<ShareModal.SocialLinks links={socialLinks} />
<ShareModal.CopyButton
className="ml-0! grow cursor-pointer"
copyURL={siteUrl}
data-testid="onboarding-copy-link"
icon="link"
id="ob-copy-publication-link"
label="Copy link"
/>
</ShareModal.Footer>
</ShareModal.Content>
</ShareModal.Root>
);
}
2 changes: 1 addition & 1 deletion apps/portal/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@tryghost/portal",
"version": "2.68.32",
"version": "2.68.33",
"license": "MIT",
"repository": "https://github.com/TryGhost/Ghost",
"author": "Ghost Foundation",
Expand Down
Loading
Loading