Skip to content

Commit

Permalink
Cleaned up 'Filter by email disabled' GA feature flag (#20554)
Browse files Browse the repository at this point in the history
no issue

- "Filter by email disabled" feature has been released to GA in [Ghost
v5.74.0](https://github.com/TryGhost/Ghost/releases/tag/v5.74.0)
(commit: 32d0d2b)
- cf. [Project
details](https://www.notion.so/ghost/Filter-by-email-disabled-2a73f5da5e8b46bcaacb944bd98e0674?pvs=4)
  • Loading branch information
sagzy authored Jul 9, 2024
1 parent f87a7dc commit 8b45af3
Show file tree
Hide file tree
Showing 5 changed files with 167 additions and 176 deletions.
185 changes: 62 additions & 123 deletions ghost/admin/app/components/members/filters/subscribed.js
Original file line number Diff line number Diff line change
@@ -1,158 +1,99 @@
import {MATCH_RELATION_OPTIONS} from './relation-options';

export const SUBSCRIBED_FILTER = ({newsletters, feature, group}) => {
if (feature.filterEmailDisabled) {
return {
label: newsletters.length > 1 ? 'All newsletters' : 'Newsletter subscription',
name: 'subscribed',
columnLabel: 'Subscribed',
relationOptions: MATCH_RELATION_OPTIONS,
valueType: 'options',
group: newsletters.length > 1 ? 'Newsletters' : group,
// Only show the filter for multiple newsletters if feature flag is enabled
feature: newsletters.length > 1 ? 'filterEmailDisabled' : undefined,
buildNqlFilter: (flt) => {
const relation = flt.relation;
const value = flt.value;

if (value === 'email-disabled') {
if (relation === 'is') {
return '(email_disabled:1)';
}
return '(email_disabled:0)';
}
export const SUBSCRIBED_FILTER = ({newsletters, group}) => {
return {
label: newsletters.length > 1 ? 'All newsletters' : 'Newsletter subscription',
name: 'subscribed',
columnLabel: 'Subscribed',
relationOptions: MATCH_RELATION_OPTIONS,
valueType: 'options',
group: newsletters.length > 1 ? 'Newsletters' : group,
buildNqlFilter: (flt) => {
const relation = flt.relation;
const value = flt.value;

if (value === 'email-disabled') {
if (relation === 'is') {
if (value === 'subscribed') {
return '(subscribed:true+email_disabled:0)';
}
return '(subscribed:false+email_disabled:0)';
return '(email_disabled:1)';
}
return '(email_disabled:0)';
}

// relation === 'is-not'
if (relation === 'is') {
if (value === 'subscribed') {
return '(subscribed:false,email_disabled:1)';
return '(subscribed:true+email_disabled:0)';
}
return '(subscribed:true,email_disabled:1)';
},
parseNqlFilter: (flt) => {
const comparator = flt.$and || flt.$or; // $or for legacy filter backwards compatibility
return '(subscribed:false+email_disabled:0)';
}

if (!comparator || comparator.length !== 2) {
const filter = flt;
if (filter && filter.email_disabled !== undefined) {
if (filter.email_disabled) {
return {
value: 'email-disabled',
relation: 'is'
};
}
// relation === 'is-not'
if (value === 'subscribed') {
return '(subscribed:false,email_disabled:1)';
}
return '(subscribed:true,email_disabled:1)';
},
parseNqlFilter: (flt) => {
const comparator = flt.$and || flt.$or; // $or for legacy filter backwards compatibility

if (!comparator || comparator.length !== 2) {
const filter = flt;
if (filter && filter.email_disabled !== undefined) {
if (filter.email_disabled) {
return {
value: 'email-disabled',
relation: 'is-not'
relation: 'is'
};
}
return;
}

if (comparator[0].subscribed === undefined || comparator[1].email_disabled === undefined) {
return;
}

const usedOr = flt.$or !== undefined;
const subscribed = comparator[0].subscribed;

if (usedOr) {
// Is not
return {
value: !subscribed ? 'subscribed' : 'unsubscribed',
value: 'email-disabled',
relation: 'is-not'
};
}

return {
value: subscribed ? 'subscribed' : 'unsubscribed',
relation: 'is'
};
},
options: [
{label: newsletters.length > 1 ? 'Subscribed to at least one' : 'Subscribed', name: 'subscribed'},
{label: newsletters.length > 1 ? 'Unsubscribed from all' : 'Unsubscribed', name: 'unsubscribed'},
{label: 'Email disabled', name: 'email-disabled'}
],
getColumnValue: (member) => {
if (member.emailSuppression && member.emailSuppression.suppressed) {
return {
text: 'Email disabled'
};
}

return member.newsletters.length > 0 ? {
text: 'Subscribed'
} : {
text: 'Unsubscribed'
};
}
};
}

if (newsletters.length > 1) {
// Disable
// Only show the filter for multiple newsletters if feature flag is enabled
return [];
}

return {
label: 'Newsletter subscription',
name: 'subscribed',
columnLabel: 'Subscribed',
relationOptions: MATCH_RELATION_OPTIONS,
valueType: 'options',
group: group,
buildNqlFilter: (flt) => {
const relation = flt.relation;
const value = flt.value;

return (relation === 'is' && value === 'true') || (relation === 'is-not' && value === 'false')
? '(subscribed:true+email_disabled:0)'
: '(subscribed:false,email_disabled:1)';
},
parseNqlFilter: (flt) => {
const comparator = flt.$and || flt.$or;

if (!comparator || comparator.length !== 2) {
return;
}

if (comparator[0].subscribed === undefined || comparator[1].email_disabled === undefined) {
return;
}

const usedOr = flt.$or !== undefined;
const subscribed = comparator[0].subscribed;

if (usedOr) {
// Is not
return {
value: !subscribed ? 'subscribed' : 'unsubscribed',
relation: 'is-not'
};
}

return {
value: subscribed ? 'true' : 'false',
value: subscribed ? 'subscribed' : 'unsubscribed',
relation: 'is'
};
},
options: [
{label: 'Subscribed', name: 'true'},
{label: 'Unsubscribed', name: 'false'}
{label: newsletters.length > 1 ? 'Subscribed to at least one' : 'Subscribed', name: 'subscribed'},
{label: newsletters.length > 1 ? 'Unsubscribed from all' : 'Unsubscribed', name: 'unsubscribed'},
{label: 'Email disabled', name: 'email-disabled'}
],
getColumnValue: (member, flt) => {
const relation = flt.relation;
const value = flt.value;
getColumnValue: (member) => {
if (member.emailSuppression && member.emailSuppression.suppressed) {
return {
text: 'Email disabled'
};
}

return {
text: (relation === 'is' && value === 'true') || (relation === 'is-not' && value === 'false')
? 'Subscribed'
: 'Unsubscribed'
return member.newsletters.length > 0 ? {
text: 'Subscribed'
} : {
text: 'Unsubscribed'
};
}
};
};

export const NEWSLETTERS_FILTERS = ({newsletters, group, feature}) => {
export const NEWSLETTERS_FILTERS = ({newsletters, group}) => {
if (newsletters.length <= 1) {
return [];
}
Expand Down Expand Up @@ -210,12 +151,10 @@ export const NEWSLETTERS_FILTERS = ({newsletters, group, feature}) => {
const relation = flt.relation;
const value = flt.value;

if (feature.filterEmailDisabled) {
if (member.emailSuppression && member.emailSuppression.suppressed) {
return {
text: 'Email disabled'
};
}
if (member.emailSuppression && member.emailSuppression.suppressed) {
return {
text: 'Email disabled'
};
}

return {
Expand Down
1 change: 0 additions & 1 deletion ghost/admin/app/services/feature.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ export default class FeatureService extends Service {
@feature('tipsAndDonations') tipsAndDonations;
@feature('recommendations') recommendations;
@feature('lexicalIndicators') lexicalIndicators;
@feature('filterEmailDisabled') filterEmailDisabled;
@feature('adminXDemo') adminXDemo;
@feature('ActivityPub') ActivityPub;
@feature('internalLinking') internalLinking;
Expand Down
Loading

0 comments on commit 8b45af3

Please sign in to comment.