Allow list pre-check

[MAILPOET-2452]
This commit is contained in:
Pavel Dohnal
2019-12-09 11:29:12 +01:00
committed by Rostislav Wolný
parent 3b7e2bc9a5
commit 7df05f78d5
2 changed files with 75 additions and 20 deletions

View File

@@ -29,6 +29,7 @@ const SegmentSelectEdit = ({ attributes, setAttributes }) => {
label={attributes.label}
onLabelChanged={(label) => (setAttributes({ label }))}
segmentsAddedIntoSelection={attributes.values}
setNewSelection={(selection) => setAttributes({ values: selection })}
addSegmentIntoSelection={(newSegment) => setAttributes({
values: [
...attributes.values,

View File

@@ -1,20 +1,56 @@
import React from 'react';
import MailPoet from 'mailpoet';
import PropTypes from 'prop-types';
import { partial } from 'lodash';
import { InspectorControls } from '@wordpress/block-editor';
import {
CheckboxControl,
Panel,
PanelBody,
PanelRow,
SelectControl,
TextControl,
} from '@wordpress/components';
import { useSelect } from '@wordpress/data';
const findSegment = (segments, segmentId) => segments.find((s) => s.id === segmentId);
const Preview = ({ segments, updateSegment }) => {
if (segments.length === 0) {
return null;
}
const onCheck = (segmentId, isChecked) => {
const segment = findSegment(segments, segmentId);
segment.isChecked = isChecked;
updateSegment(segment);
};
return segments.map((segment) => (
<CheckboxControl
label={segment.name}
checked={!!segment.isChecked}
onChange={partial(onCheck, segment.id)}
key={segment.id}
/>
));
};
Preview.propTypes = {
segments: PropTypes.arrayOf(PropTypes.shape({
name: PropTypes.string.isRequired,
isChecked: PropTypes.boolean,
id: PropTypes.string.isRequired,
}).isRequired).isRequired,
updateSegment: PropTypes.func.isRequired,
};
const SegmentSelectSettings = ({
label,
onLabelChanged,
segmentsAddedIntoSelection,
addSegmentIntoSelection,
setNewSelection,
}) => {
const allSegments = useSelect(
(select) => select('mailpoet-form-editor').getAllAvailableSegments(),
@@ -25,10 +61,10 @@ const SegmentSelectSettings = ({
label: segment.name,
value: segment.id,
}))
.filter((segment) => !segmentsAddedIntoSelection.find((s) => s.id === segment.value));
.filter((segment) => !findSegment(segmentsAddedIntoSelection, segment.value));
const addSegment = (segmentId) => {
const segment = allSegments.find((s) => s.id === segmentId);
const segment = findSegment(allSegments, segmentId);
addSegmentIntoSelection({
name: segment.name,
isChecked: false,
@@ -36,29 +72,46 @@ const SegmentSelectSettings = ({
});
};
const updateSegment = (segment) => {
setNewSelection(segmentsAddedIntoSelection.map((segmentInSelection) => {
if (segment.id !== segmentInSelection) {
return segmentInSelection;
}
return segment;
}));
};
return (
<InspectorControls>
<Panel>
<PanelBody title={MailPoet.I18n.t('formSettings')} initialOpen>
<TextControl
label={MailPoet.I18n.t('label')}
value={label}
data-automation-id="settings_first_name_label_input"
onChange={onLabelChanged}
/>
{segmentsListToBeAdded.length ? (
<SelectControl
label={`${MailPoet.I18n.t('blockSegmentSelectListLabel')}:`}
options={[
{
label: MailPoet.I18n.t('settingsPleaseSelectList'),
value: null,
},
...segmentsListToBeAdded,
]}
onChange={addSegment}
<PanelRow>
<TextControl
label={MailPoet.I18n.t('label')}
value={label}
data-automation-id="settings_first_name_label_input"
onChange={onLabelChanged}
/>
) : null}
</PanelRow>
<Preview
segments={segmentsAddedIntoSelection}
updateSegment={updateSegment}
/>
<PanelRow>
{segmentsListToBeAdded.length ? (
<SelectControl
label={`${MailPoet.I18n.t('blockSegmentSelectListLabel')}:`}
options={[
{
label: MailPoet.I18n.t('settingsPleaseSelectList'),
value: null,
},
...segmentsListToBeAdded,
]}
onChange={addSegment}
/>
) : null}
</PanelRow>
</PanelBody>
</Panel>
</InspectorControls>
@@ -69,6 +122,7 @@ SegmentSelectSettings.propTypes = {
label: PropTypes.string.isRequired,
onLabelChanged: PropTypes.func.isRequired,
addSegmentIntoSelection: PropTypes.func.isRequired,
setNewSelection: PropTypes.func.isRequired,
segmentsAddedIntoSelection: PropTypes.arrayOf(PropTypes.shape({
name: PropTypes.string.isRequired,
isChecked: PropTypes.boolean,