Render more filters in the form

[MAILPOET-3469]
This commit is contained in:
Jan Lysý
2021-06-04 10:15:26 +02:00
committed by Veljko V
parent ceb00aab29
commit 8ab7f47607
2 changed files with 57 additions and 28 deletions

View File

@@ -14,9 +14,12 @@ import { isFormValid } from './validator';
import plusIcon from '../../common/button/icon/plus'; import plusIcon from '../../common/button/icon/plus';
import { import {
AnyFormItem, FilterRow,
FilterValue, FilterValue,
GroupFilterValue, GroupFilterValue,
Segment,
SegmentTypes,
SubscriberActionTypes,
} from './types'; } from './types';
interface Props { interface Props {
@@ -26,7 +29,7 @@ interface Props {
export const Form: React.FunctionComponent<Props> = ({ export const Form: React.FunctionComponent<Props> = ({
segmentId, segmentId,
}) => { }) => {
const segment: AnyFormItem = useSelect( const segment: Segment = useSelect(
(select) => select('mailpoet-dynamic-segments-form').getSegment(), (select) => select('mailpoet-dynamic-segments-form').getSegment(),
[] []
); );
@@ -36,12 +39,12 @@ export const Form: React.FunctionComponent<Props> = ({
[] []
); );
const filterValue: FilterValue | undefined = useSelect( const filterRows: FilterRow[] = useSelect(
(select) => select('mailpoet-dynamic-segments-form').findFilterValueForSegment(segment), (select) => select('mailpoet-dynamic-segments-form').findFiltersValueForSegment(segment),
[segment] [segment]
); );
const { updateSegment, handleSave } = useDispatch('mailpoet-dynamic-segments-form'); const { updateSegment, updateSegmentFilter, handleSave } = useDispatch('mailpoet-dynamic-segments-form');
return ( return (
<form className="mailpoet_form"> <form className="mailpoet_form">
@@ -92,31 +95,46 @@ export const Form: React.FunctionComponent<Props> = ({
{MailPoet.I18n.t('formPageTitle')} {MailPoet.I18n.t('formPageTitle')}
</label> </label>
</Heading> </Heading>
<Grid.ThreeColumns> {Array.isArray(filterRows) && filterRows.map((filterRow, index) => (
<Select <>
dimension="small" <Grid.ThreeColumns>
placeholder={MailPoet.I18n.t('selectActionPlaceholder')} <Select
options={segmentFilters} dimension="small"
value={filterValue} placeholder={MailPoet.I18n.t('selectActionPlaceholder')}
onChange={(newValue: FilterValue): void => { options={segmentFilters}
updateSegment({ value={filterRow.filterValue}
segmentType: newValue.group, onChange={(newValue: FilterValue): void => {
action: newValue.value, updateSegmentFilter({
}); segmentType: newValue.group,
}} action: newValue.value,
automationId="select-segment-action" }, index);
isFullWidth }}
/> automationId="select-segment-action"
{segment.segmentType !== undefined && ( isFullWidth
<FormFilterFields /> />
)} {filterRow.index !== undefined && (
</Grid.ThreeColumns> <FormFilterFields filterIndex={filterRow.index} />
<div className="mailpoet-gap" /> )}
</Grid.ThreeColumns>
<div className="mailpoet-gap" />
</>
))}
<Button <Button
type="button" type="button"
dimension="small" dimension="small"
variant="link" variant="link"
iconStart={plusIcon} iconStart={plusIcon}
onClick={(e): void => {
e.preventDefault();
const filters = segment.filters;
filters.push({
segmentType: SegmentTypes.WordPressRole,
action: SubscriberActionTypes.WORDPRESS_ROLE,
});
updateSegment({
filters,
});
}}
> >
{MailPoet.I18n.t('addCondition')} {MailPoet.I18n.t('addCondition')}
</Button> </Button>

View File

@@ -35,10 +35,14 @@ export interface FilterValue extends SelectOption {
group: SegmentTypes; group: SegmentTypes;
} }
export interface FilterRow {
filterValue: FilterValue;
index: number;
}
export interface FormItem { export interface FormItem {
id?: number;
segmentType?: string; segmentType?: string;
name?: string;
description?: string;
action?: string; action?: string;
} }
@@ -75,6 +79,13 @@ export interface EmailFormItem extends FormItem {
days?: string; days?: string;
} }
export type Segment = {
id?: number;
name?: string;
description?: string;
filters?: AnyFormItem[];
}
export type AnyFormItem = export type AnyFormItem =
WordpressRoleFormItem | WordpressRoleFormItem |
WooCommerceFormItem | WooCommerceFormItem |
@@ -145,7 +156,7 @@ export interface StateType {
wooCurrencySymbol: string; wooCurrencySymbol: string;
wooCountries: WindowWooCommerceCountries; wooCountries: WindowWooCommerceCountries;
customFieldsList: WindowCustomFields; customFieldsList: WindowCustomFields;
segment: AnyFormItem, segment: Segment,
errors: string[], errors: string[],
allAvailableFilters: GroupFilterValue[], allAvailableFilters: GroupFilterValue[],
} }