Skip to content

Commit 24ad511

Browse files
authored
Fixed members-forward filter gating parity (TryGhost#26932)
closes https://linear.app/ghost/issue/BER-3456/responded-with-feedback-filter-is-missing-in-members-forward The email filter group and `Responded with feedback`filter now follows the same availability rules as in Ember.
1 parent 2de0593 commit 24ad511

3 files changed

Lines changed: 49 additions & 23 deletions

File tree

apps/posts/src/views/members/components/members-filters.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
} from '../use-member-filter-fields';
1010
import {getSettingValue, useBrowseSettings} from '@tryghost/admin-x-framework/api/settings';
1111
import {getSiteTimezone} from '@src/utils/get-site-timezone';
12-
import {useBrowseConfig} from '@tryghost/admin-x-framework/api/config';
1312
import {useBrowseLabels} from '@tryghost/admin-x-framework/api/labels';
1413
import {useBrowseNewsletters} from '@tryghost/admin-x-framework/api/newsletters';
1514
import {useBrowseOffers} from '@tryghost/admin-x-framework/api/offers';
@@ -55,15 +54,13 @@ const MembersFilters: React.FC<MembersFiltersProps> = ({
5554
const {data: offersData} = useBrowseOffers({});
5655
const {data: newslettersData} = useBrowseNewsletters({searchParams: {limit: '100'}});
5756
const {data: settingsData} = useBrowseSettings({});
58-
const {data: configData} = useBrowseConfig({});
5957

6058
const settings = settingsData?.settings || [];
6159
const paidMembersEnabled = getSettingValue<boolean>(settings, 'paid_members_enabled') === true;
62-
const emailAnalyticsEnabled = configData?.config?.emailAnalytics === true;
60+
const emailFiltersEnabled = getSettingValue<string>(settings, 'editor_default_email_recipients') !== 'disabled';
6361
const membersTrackSources = getSettingValue<boolean>(settings, 'members_track_sources') === true;
6462
const emailTrackOpens = getSettingValue<boolean>(settings, 'email_track_opens') === true;
6563
const emailTrackClicks = getSettingValue<boolean>(settings, 'email_track_clicks') === true;
66-
const audienceFeedbackEnabled = configData?.config?.labs?.audienceFeedback === true;
6764
const siteTimezone = getSiteTimezone(settings);
6865

6966
const labels = labelsData?.labels || [];
@@ -102,7 +99,7 @@ const MembersFilters: React.FC<MembersFiltersProps> = ({
10299
hydratedNewsletterSlugs,
103100
hasMultipleTiers,
104101
paidMembersEnabled,
105-
emailAnalyticsEnabled,
102+
emailFiltersEnabled,
106103
labelsOptions: labels.map(label => ({value: label.slug, label: label.name})),
107104
tiersOptions: activePaidTiers.map(tier => ({value: tier.id, label: tier.name})),
108105
offers,
@@ -117,7 +114,6 @@ const MembersFilters: React.FC<MembersFiltersProps> = ({
117114
membersTrackSources,
118115
emailTrackOpens,
119116
emailTrackClicks,
120-
audienceFeedbackEnabled,
121117
siteTimezone
122118
});
123119

apps/posts/src/views/members/use-member-filter-fields.test.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ describe('useMemberFilterFields', () => {
2626
labelsOptions: [{value: 'vip', label: 'VIP'}],
2727
newsletters: [{slug: 'weekly', name: 'Weekly', status: 'active'}],
2828
paidMembersEnabled: true,
29-
emailAnalyticsEnabled: true,
29+
emailFiltersEnabled: true,
3030
postResourceOptions: [{value: 'post_1', label: 'Welcome'}],
3131
onPostResourceSearchChange: vi.fn(),
3232
postResourceSearchValue: 'wel',
@@ -39,7 +39,6 @@ describe('useMemberFilterFields', () => {
3939
membersTrackSources: true,
4040
emailTrackOpens: true,
4141
emailTrackClicks: true,
42-
audienceFeedbackEnabled: true,
4342
siteTimezone: 'UTC'
4443
}));
4544

@@ -72,6 +71,42 @@ describe('useMemberFilterFields', () => {
7271
});
7372
});
7473

74+
it('shows the Email group when email sending is enabled', () => {
75+
const {result} = renderHook(() => useMemberFilterFields({
76+
emailFiltersEnabled: true,
77+
siteTimezone: 'UTC'
78+
}));
79+
80+
const emailGroup = result.current.find(group => group.group === 'Email');
81+
82+
expect(emailGroup?.fields.map(field => field.key)).toEqual([
83+
'email_count',
84+
'email_opened_count',
85+
'emails.post_id',
86+
'newsletter_feedback'
87+
]);
88+
});
89+
90+
it('keeps the feedback filter visible without a separate feature flag', () => {
91+
const {result} = renderHook(() => useMemberFilterFields({
92+
emailFiltersEnabled: true,
93+
emailResourceOptions: [{value: 'email_1', label: 'Launch'}],
94+
onEmailResourceSearchChange: vi.fn(),
95+
emailResourceSearchValue: 'lau',
96+
emailResourceLoading: false,
97+
siteTimezone: 'UTC'
98+
}));
99+
100+
const emailFields = result.current.find(group => group.group === 'Email')?.fields ?? [];
101+
const feedbackField = emailFields.find(field => field.key === 'newsletter_feedback');
102+
103+
expect(feedbackField).toMatchObject({
104+
options: [{value: 'email_1', label: 'Launch'}],
105+
searchValue: 'lau',
106+
isLoading: false
107+
});
108+
});
109+
75110
it('hydrates newsletter pattern fields with runtime labels', () => {
76111
const {result} = renderHook(() => useMemberFilterFields({
77112
newsletters: [

apps/posts/src/views/members/use-member-filter-fields.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ interface UseMemberFilterFieldsOptions {
1212
hydratedNewsletterSlugs?: string[];
1313
hasMultipleTiers?: boolean;
1414
paidMembersEnabled?: boolean;
15-
emailAnalyticsEnabled?: boolean;
15+
emailFiltersEnabled?: boolean;
1616
postResourceOptions?: FilterOption[];
1717
onPostResourceSearchChange?: (search: string) => void;
1818
postResourceSearchValue?: string;
@@ -25,7 +25,6 @@ interface UseMemberFilterFieldsOptions {
2525
membersTrackSources?: boolean;
2626
emailTrackOpens?: boolean;
2727
emailTrackClicks?: boolean;
28-
audienceFeedbackEnabled?: boolean;
2928
siteTimezone?: string;
3029
}
3130

@@ -295,7 +294,7 @@ export function useMemberFilterFields({
295294
hydratedNewsletterSlugs = [],
296295
hasMultipleTiers = false,
297296
paidMembersEnabled = false,
298-
emailAnalyticsEnabled = false,
297+
emailFiltersEnabled = false,
299298
postResourceOptions = [],
300299
onPostResourceSearchChange,
301300
postResourceSearchValue,
@@ -308,7 +307,6 @@ export function useMemberFilterFields({
308307
membersTrackSources = false,
309308
emailTrackOpens = false,
310309
emailTrackClicks = false,
311-
audienceFeedbackEnabled = false,
312310
siteTimezone = 'UTC'
313311
}: UseMemberFilterFieldsOptions): FilterFieldGroup[] {
314312
return useMemo(() => {
@@ -430,7 +428,7 @@ export function useMemberFilterFields({
430428
groups.push({group: 'Subscription', fields: subscriptionFields});
431429
}
432430

433-
if (emailAnalyticsEnabled) {
431+
if (emailFiltersEnabled) {
434432
const emailFields: FilterFieldConfig[] = [
435433
createFieldConfig('email_count', {}, NUMBER_OPERATOR_LABELS),
436434
createFieldConfig('email_opened_count', {}, NUMBER_OPERATOR_LABELS)
@@ -465,22 +463,19 @@ export function useMemberFilterFields({
465463
)));
466464
}
467465

468-
if (audienceFeedbackEnabled) {
469-
emailFields.push(createFieldConfig('newsletter_feedback', createSearchableFieldOverrides(
470-
emailResourceOptions,
471-
onEmailResourceSearchChange,
472-
emailResourceSearchValue,
473-
emailResourceLoading
474-
)));
475-
}
466+
emailFields.push(createFieldConfig('newsletter_feedback', createSearchableFieldOverrides(
467+
emailResourceOptions,
468+
onEmailResourceSearchChange,
469+
emailResourceSearchValue,
470+
emailResourceLoading
471+
)));
476472

477473
groups.push({group: 'Email', fields: emailFields});
478474
}
479475

480476
return groups;
481477
}, [
482-
audienceFeedbackEnabled,
483-
emailAnalyticsEnabled,
478+
emailFiltersEnabled,
484479
emailResourceLoading,
485480
emailResourceOptions,
486481
emailResourceSearchValue,

0 commit comments

Comments
 (0)