Add subscription segment support to segment form

[MAILPOET-3471]
This commit is contained in:
Rostislav Wolny
2021-04-08 15:21:01 +02:00
committed by Veljko V
parent cccafb1481
commit 43ab4223af
6 changed files with 79 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
import React from 'react';
import MailPoet from 'mailpoet';
import { assign, compose, find } from 'lodash/fp';
import Select from 'common/form/react_select/react_select';
import {
OnFilterChange, SegmentTypes,
SelectOption,
WooCommerceSubscriptionFormItem,
} from '../types';
import { SegmentFormData } from '../segment_form_data';
export const WooCommerceSubscriptionOptions = [
{ value: 'hasActiveSubscription', label: MailPoet.I18n.t('segmentsActiveSubscription'), group: SegmentTypes.WooCommerceSubscription },
];
export function validateWooCommerceSubscription(
formItems: WooCommerceSubscriptionFormItem
): boolean {
if (formItems.action === 'hasActiveSubscription' && !formItems.product_id) {
return false;
}
return true;
}
interface Props {
onChange: OnFilterChange;
item: WooCommerceSubscriptionFormItem;
}
export const WooCommerceSubscriptionFields: React.FunctionComponent<Props> = (
{ onChange, item }
) => {
const productOptions = SegmentFormData.subscriptionProducts?.map((product) => ({
value: product.id,
label: product.name,
}));
return (
<div className="mailpoet-form-field">
<div className="mailpoet-form-input mailpoet-form-select">
<Select
placeholder={MailPoet.I18n.t('selectWooSubscription')}
options={productOptions}
value={find(['value', item.product_id], productOptions)}
onChange={(option: SelectOption): void => compose([
onChange,
assign(item),
])({ product_id: option.value })}
/>
</div>
</div>
);
};

View File

@@ -18,6 +18,7 @@ import Textarea from 'common/form/textarea/textarea';
import { EmailSegmentOptions } from './dynamic_segments_filters/email'; import { EmailSegmentOptions } from './dynamic_segments_filters/email';
import { WooCommerceOptions } from './dynamic_segments_filters/woocommerce'; import { WooCommerceOptions } from './dynamic_segments_filters/woocommerce';
import { WordpressRoleSegmentOptions } from './dynamic_segments_filters/wordpress_role'; import { WordpressRoleSegmentOptions } from './dynamic_segments_filters/wordpress_role';
import { WooCommerceSubscriptionOptions } from './dynamic_segments_filters/woocommerce_subscription';
import { SubscribersCounter } from './subscribers_counter'; import { SubscribersCounter } from './subscribers_counter';
import { FormFilterFields } from './form_filter_fields'; import { FormFilterFields } from './form_filter_fields';
@@ -61,6 +62,12 @@ function getAvailableFilters(): GroupFilterValue[] {
options: WooCommerceOptions, options: WooCommerceOptions,
}); });
} }
if (MailPoet.isWoocommerceActive) {
filters.push({
label: MailPoet.I18n.t('woocommerceSubscriptions'),
options: WooCommerceSubscriptionOptions,
});
}
return filters; return filters;
} }

View File

@@ -10,6 +10,7 @@ import {
import { EmailFields } from './dynamic_segments_filters/email'; import { EmailFields } from './dynamic_segments_filters/email';
import { WordpressRoleFields } from './dynamic_segments_filters/wordpress_role'; import { WordpressRoleFields } from './dynamic_segments_filters/wordpress_role';
import { WooCommerceFields } from './dynamic_segments_filters/woocommerce'; import { WooCommerceFields } from './dynamic_segments_filters/woocommerce';
import { WooCommerceSubscriptionFields } from './dynamic_segments_filters/woocommerce_subscription';
export interface FilterFieldsProps { export interface FilterFieldsProps {
segmentType: FilterValue; segmentType: FilterValue;
@@ -21,6 +22,7 @@ const filterFieldsMap = {
[SegmentTypes.Email]: EmailFields, [SegmentTypes.Email]: EmailFields,
[SegmentTypes.WooCommerce]: WooCommerceFields, [SegmentTypes.WooCommerce]: WooCommerceFields,
[SegmentTypes.WordPressRole]: WordpressRoleFields, [SegmentTypes.WordPressRole]: WordpressRoleFields,
[SegmentTypes.WooCommerceSubscription]: WooCommerceSubscriptionFields,
}; };
export const FormFilterFields: React.FunctionComponent<FilterFieldsProps> = ({ export const FormFilterFields: React.FunctionComponent<FilterFieldsProps> = ({

View File

@@ -8,6 +8,12 @@ interface SegmentFormDataWindow extends Window {
id: string; id: string;
name: string; name: string;
}[]; }[];
mailpoet_subscription_products: {
id: string;
name: string;
}[];
mailpoet_product_categories: { mailpoet_product_categories: {
id: string; id: string;
name: string; name: string;
@@ -24,6 +30,7 @@ declare let window: SegmentFormDataWindow;
export const SegmentFormData = { export const SegmentFormData = {
products: window.mailpoet_products, products: window.mailpoet_products,
subscriptionProducts: window.mailpoet_subscription_products,
productCategories: window.mailpoet_product_categories, productCategories: window.mailpoet_product_categories,
newslettersList: window.mailpoet_newsletters_list, newslettersList: window.mailpoet_newsletters_list,
wordpressRoles: window.wordpress_editable_roles_list, wordpressRoles: window.wordpress_editable_roles_list,

View File

@@ -2,6 +2,7 @@ export enum SegmentTypes {
Email = 'email', Email = 'email',
WordPressRole = 'userRole', WordPressRole = 'userRole',
WooCommerce = 'woocommerce', WooCommerce = 'woocommerce',
WooCommerceSubscription = 'woocommerceSubscription'
} }
export enum EmailActionTypes { export enum EmailActionTypes {
@@ -40,6 +41,11 @@ export interface WooCommerceFormItem extends FormItem {
number_of_orders_days?: number; number_of_orders_days?: number;
} }
export interface WooCommerceSubscriptionFormItem extends FormItem {
action?: string;
product_id?: string;
}
export interface EmailFormItem extends FormItem { export interface EmailFormItem extends FormItem {
action?: string; action?: string;
newsletter_id?: string; newsletter_id?: string;

View File

@@ -150,6 +150,9 @@
'segmentsTipText': __('segments allow you to group your subscribers by other criteria, such as events and actions.'), 'segmentsTipText': __('segments allow you to group your subscribers by other criteria, such as events and actions.'),
'segmentsTipLink': __('Read more.'), 'segmentsTipLink': __('Read more.'),
'segmentsSubscriber': __('has WordPress user role'), 'segmentsSubscriber': __('has WordPress user role'),
'segmentsActiveSubscription': __('has an active subscription'),
'woocommerceSubscriptions': _x('WooCommerce Subscriptions', 'Dynamic segment creation: User selects this to use any WooCommerce Subscriptions filters'),
'selectWooSubscription': __('Search subscriptions'),
'oneDynamicSegmentTrashed': __('1 segment was moved to the trash.'), 'oneDynamicSegmentTrashed': __('1 segment was moved to the trash.'),
'multipleDynamicSegmentsTrashed': __('%$1d segments were moved to the trash.'), 'multipleDynamicSegmentsTrashed': __('%$1d segments were moved to the trash.'),