Make custom fields settings more reusable

[MAILPOET-2453]
This commit is contained in:
Pavel Dohnal
2019-12-17 09:30:48 +01:00
committed by Rostislav Wolný
parent 79bdcd5e4f
commit 49f92ef77c
4 changed files with 69 additions and 90 deletions

View File

@@ -6,39 +6,24 @@ import {
} from '@wordpress/components'; } from '@wordpress/components';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import { useDispatch, useSelect } from '@wordpress/data';
const CustomFieldSettings = ({ const CustomFieldSettings = ({
mandatory, mandatory,
validate, validate,
customFieldId, isSaving,
updateAttributes, onSave,
}) => { }) => {
const [localMandatory, setLocalMandatory] = useState(mandatory); const [localMandatory, setLocalMandatory] = useState(mandatory);
const [localValidate, setLocalValidate] = useState(validate); const [localValidate, setLocalValidate] = useState(validate);
const { saveCustomField } = useDispatch('mailpoet-form-editor');
const isSaving = useSelect(
(sel) => sel('mailpoet-form-editor').getIsCustomFieldSaving(),
[]
);
return ( return (
<> <>
<Button <Button
isPrimary isPrimary
isDefault isDefault
onClick={() => saveCustomField({ onClick={() => onSave({
customFieldId, mandatory: localMandatory,
data: { validate: localValidate,
params: {
required: localMandatory ? '1' : undefined,
validate: localValidate,
},
},
onFinish: () => updateAttributes({
mandatory: localMandatory,
validate: localValidate,
}),
})} })}
isBusy={isSaving} isBusy={isSaving}
disabled={isSaving} disabled={isSaving}
@@ -81,12 +66,13 @@ const CustomFieldSettings = ({
CustomFieldSettings.propTypes = { CustomFieldSettings.propTypes = {
mandatory: PropTypes.bool, mandatory: PropTypes.bool,
validate: PropTypes.string, validate: PropTypes.string,
customFieldId: PropTypes.number.isRequired, onSave: PropTypes.func.isRequired,
updateAttributes: PropTypes.func.isRequired, isSaving: PropTypes.bool,
}; };
CustomFieldSettings.defaultProps = { CustomFieldSettings.defaultProps = {
mandatory: false, mandatory: false,
isSaving: false,
validate: '', validate: '',
}; };

View File

@@ -8,10 +8,17 @@ import {
import { InspectorControls } from '@wordpress/block-editor'; import { InspectorControls } from '@wordpress/block-editor';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import { useDispatch, useSelect } from '@wordpress/data';
import CustomFieldSettings from './custom_field_settings.jsx'; import CustomFieldSettings from './custom_field_settings.jsx';
const CustomTextEdit = ({ attributes, setAttributes }) => { const CustomTextEdit = ({ attributes, setAttributes }) => {
const isSaving = useSelect(
(sel) => sel('mailpoet-form-editor').getIsCustomFieldSaving(),
[]
);
const { saveCustomField } = useDispatch('mailpoet-form-editor');
const inspectorControls = ( const inspectorControls = (
<InspectorControls> <InspectorControls>
<Panel> <Panel>
@@ -21,6 +28,22 @@ const CustomTextEdit = ({ attributes, setAttributes }) => {
customFieldId={attributes.customFieldId} customFieldId={attributes.customFieldId}
mandatory={attributes.mandatory} mandatory={attributes.mandatory}
validate={attributes.validate} validate={attributes.validate}
isSaving={isSaving}
onSave={(params) => {
saveCustomField({
customFieldId: attributes.customFieldId,
data: {
params: {
required: params.mandatory ? '1' : undefined,
validate: params.validate,
},
},
onFinish: () => setAttributes({
mandatory: params.mandatory,
validate: params.validate,
}),
});
}}
/> />
</PanelBody> </PanelBody>
</Panel> </Panel>

View File

@@ -1,84 +1,34 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { import {
Button,
SelectControl, SelectControl,
ToggleControl,
} from '@wordpress/components'; } from '@wordpress/components';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import { useDispatch, useSelect } from '@wordpress/data';
import CustomTextSettings from '../custom_text/custom_field_settings.jsx';
const CustomFieldSettings = ({ const CustomFieldSettings = ({
mandatory, mandatory,
validate, validate,
lines, lines,
customFieldId, isSaving,
updateAttributes, onSave,
}) => { }) => {
const [localMandatory, setLocalMandatory] = useState(mandatory);
const [localValidate, setLocalValidate] = useState(validate);
const [localLines, setLocalLines] = useState(lines); const [localLines, setLocalLines] = useState(lines);
const { saveCustomField } = useDispatch('mailpoet-form-editor');
const isSaving = useSelect(
(sel) => sel('mailpoet-form-editor').getIsCustomFieldSaving(),
[]
);
return ( return (
<> <>
<Button <CustomTextSettings
isPrimary validate={validate}
isDefault mandatory={mandatory}
onClick={() => saveCustomField({ isSaving={isSaving}
customFieldId, onSave={(customTextParams) => {
data: { onSave({
params: { ...customTextParams,
required: localMandatory ? '1' : undefined,
validate: localValidate,
lines: localLines,
},
},
onFinish: () => updateAttributes({
mandatory: localMandatory,
validate: localValidate,
lines: localLines, lines: localLines,
}), });
})} }}
isBusy={isSaving}
disabled={isSaving}
className="button-on-top"
>
{MailPoet.I18n.t('customFieldSaveCTA')}
</Button>
<ToggleControl
label={MailPoet.I18n.t('blockMandatory')}
checked={localMandatory}
onChange={setLocalMandatory}
/> />
<SelectControl
label={`${MailPoet.I18n.t('customFieldValidateFor')}:`}
options={[
{
label: MailPoet.I18n.t('customFieldValidateNothing'),
value: '',
},
{
label: MailPoet.I18n.t('customFieldValidateNumbersOnly'),
value: 'alphanum',
},
{
label: MailPoet.I18n.t('customFieldValidateAlphanumerical'),
value: 'number',
},
{
label: MailPoet.I18n.t('customFieldValidatePhoneNumber'),
value: 'phone',
},
]}
value={localValidate}
onChange={setLocalValidate}
/>
<SelectControl <SelectControl
label={`${MailPoet.I18n.t('customFieldNumberOfLines')}:`} label={`${MailPoet.I18n.t('customFieldNumberOfLines')}:`}
value={localLines} value={localLines}
@@ -114,14 +64,15 @@ CustomFieldSettings.propTypes = {
mandatory: PropTypes.bool, mandatory: PropTypes.bool,
validate: PropTypes.string, validate: PropTypes.string,
lines: PropTypes.string, lines: PropTypes.string,
customFieldId: PropTypes.number.isRequired, onSave: PropTypes.func.isRequired,
updateAttributes: PropTypes.func.isRequired, isSaving: PropTypes.bool,
}; };
CustomFieldSettings.defaultProps = { CustomFieldSettings.defaultProps = {
mandatory: false, mandatory: false,
validate: '', validate: '',
lines: '1', lines: '1',
isSaving: false,
}; };
export default CustomFieldSettings; export default CustomFieldSettings;

View File

@@ -8,19 +8,39 @@ import {
import { InspectorControls } from '@wordpress/block-editor'; import { InspectorControls } from '@wordpress/block-editor';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import { useDispatch, useSelect } from '@wordpress/data';
import CustomFieldSettings from './custom_field_settings.jsx'; import CustomFieldSettings from './custom_field_settings.jsx';
const CustomTextAreaEdit = ({ attributes, setAttributes }) => { const CustomTextAreaEdit = ({ attributes, setAttributes }) => {
const isSaving = useSelect(
(sel) => sel('mailpoet-form-editor').getIsCustomFieldSaving(),
[]
);
const { saveCustomField } = useDispatch('mailpoet-form-editor');
const inspectorControls = ( const inspectorControls = (
<InspectorControls> <InspectorControls>
<Panel> <Panel>
<PanelBody title={MailPoet.I18n.t('customFieldSettings')} initialOpen> <PanelBody title={MailPoet.I18n.t('customFieldSettings')} initialOpen>
<CustomFieldSettings <CustomFieldSettings
updateAttributes={(attrs) => (setAttributes(attrs))}
customFieldId={attributes.customFieldId}
mandatory={attributes.mandatory} mandatory={attributes.mandatory}
validate={attributes.validate} validate={attributes.validate}
isSaving={isSaving}
onSave={(params) => saveCustomField({
customFieldId: attributes.customFieldId,
data: {
params: {
required: params.mandatory ? '1' : undefined,
validate: params.validate,
lines: params.lines,
},
},
onFinish: () => setAttributes({
mandatory: params.mandatory,
validate: params.validate,
lines: params.lines,
}),
})}
/> />
</PanelBody> </PanelBody>
</Panel> </Panel>
@@ -39,7 +59,6 @@ const CustomTextAreaEdit = ({ attributes, setAttributes }) => {
/> />
</PanelBody> </PanelBody>
</Panel> </Panel>
</InspectorControls> </InspectorControls>
); );