Add default inputs style settings

[MAILPOET-2599]
This commit is contained in:
Rostislav Wolny
2020-03-02 17:06:41 +01:00
committed by Veljko V
parent 131a4366da
commit 251c9ffd38
15 changed files with 189 additions and 19 deletions

View File

@@ -1,5 +1,6 @@
import Icon from './icon.jsx'; import Icon from './icon.jsx';
import Edit from './edit.jsx'; import Edit from './edit.jsx';
import { defaultBlockStyles } from '../../store/form_body_to_blocks.jsx';
export const name = 'mailpoet-form/custom-text'; export const name = 'mailpoet-form/custom-text';
@@ -30,6 +31,10 @@ export function getSettings(customField) {
type: 'string', type: 'string',
default: customField.id, default: customField.id,
}, },
styles: {
type: 'object',
default: defaultBlockStyles,
},
}, },
supports: { supports: {
html: false, html: false,

View File

@@ -14,7 +14,7 @@ import ParagraphEdit from '../paragraph_edit.jsx';
import CustomFieldSettings from './custom_field_settings.jsx'; import CustomFieldSettings from './custom_field_settings.jsx';
import formatLabel from '../label_formatter.jsx'; import formatLabel from '../label_formatter.jsx';
import mapCustomFieldFormData from '../map_custom_field_form_data.jsx'; import mapCustomFieldFormData from '../map_custom_field_form_data.jsx';
import InputStylesSettings from '../input_styles_settings.jsx'; import { InputStylesSettings, inputStylesPropTypes } from '../input_styles_settings.jsx';
const CustomTextEdit = ({ attributes, setAttributes, clientId }) => { const CustomTextEdit = ({ attributes, setAttributes, clientId }) => {
const isSaving = useSelect( const isSaving = useSelect(
@@ -78,7 +78,10 @@ const CustomTextEdit = ({ attributes, setAttributes, clientId }) => {
/> />
</PanelBody> </PanelBody>
</Panel> </Panel>
<InputStylesSettings /> <InputStylesSettings
styles={attributes.styles}
onChange={(styles) => (setAttributes({ styles }))}
/>
</InspectorControls> </InspectorControls>
); );
@@ -113,6 +116,7 @@ CustomTextEdit.propTypes = {
labelWithinInput: PropTypes.bool.isRequired, labelWithinInput: PropTypes.bool.isRequired,
mandatory: PropTypes.bool.isRequired, mandatory: PropTypes.bool.isRequired,
customFieldId: PropTypes.number.isRequired, customFieldId: PropTypes.number.isRequired,
styles: inputStylesPropTypes.isRequired,
}).isRequired, }).isRequired,
setAttributes: PropTypes.func.isRequired, setAttributes: PropTypes.func.isRequired,
clientId: PropTypes.string.isRequired, clientId: PropTypes.string.isRequired,

View File

@@ -1,5 +1,6 @@
import Icon from '../custom_text/icon.jsx'; import Icon from '../custom_text/icon.jsx';
import Edit from './edit.jsx'; import Edit from './edit.jsx';
import { defaultBlockStyles } from '../../store/form_body_to_blocks.jsx';
export const name = 'mailpoet-form/custom-textarea'; export const name = 'mailpoet-form/custom-textarea';
@@ -34,6 +35,10 @@ export function getSettings(customField) {
type: 'string', type: 'string',
default: customField.id, default: customField.id,
}, },
styles: {
type: 'object',
default: defaultBlockStyles,
},
}, },
supports: { supports: {
html: false, html: false,

View File

@@ -14,7 +14,7 @@ import ParagraphEdit from '../paragraph_edit.jsx';
import CustomFieldSettings from '../custom_text/custom_field_settings.jsx'; import CustomFieldSettings from '../custom_text/custom_field_settings.jsx';
import formatLabel from '../label_formatter.jsx'; import formatLabel from '../label_formatter.jsx';
import mapCustomFieldFormData from '../map_custom_field_form_data.jsx'; import mapCustomFieldFormData from '../map_custom_field_form_data.jsx';
import InputStylesSettings from '../input_styles_settings.jsx'; import { InputStylesSettings, inputStylesPropTypes } from '../input_styles_settings.jsx';
const CustomTextAreaEdit = ({ attributes, setAttributes, clientId }) => { const CustomTextAreaEdit = ({ attributes, setAttributes, clientId }) => {
const isSaving = useSelect( const isSaving = useSelect(
@@ -100,7 +100,10 @@ const CustomTextAreaEdit = ({ attributes, setAttributes, clientId }) => {
/> />
</PanelBody> </PanelBody>
</Panel> </Panel>
<InputStylesSettings /> <InputStylesSettings
styles={attributes.styles}
onChange={(styles) => (setAttributes({ styles }))}
/>
</InspectorControls> </InspectorControls>
); );
@@ -140,6 +143,7 @@ CustomTextAreaEdit.propTypes = {
labelWithinInput: PropTypes.bool.isRequired, labelWithinInput: PropTypes.bool.isRequired,
mandatory: PropTypes.bool.isRequired, mandatory: PropTypes.bool.isRequired,
lines: PropTypes.string, lines: PropTypes.string,
styles: inputStylesPropTypes.isRequired,
}).isRequired, }).isRequired,
setAttributes: PropTypes.func.isRequired, setAttributes: PropTypes.func.isRequired,
clientId: PropTypes.string.isRequired, clientId: PropTypes.string.isRequired,

View File

@@ -10,7 +10,7 @@ import PropTypes from 'prop-types';
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import ParagraphEdit from '../paragraph_edit.jsx'; import ParagraphEdit from '../paragraph_edit.jsx';
import InputStylesSettings from '../input_styles_settings.jsx'; import { InputStylesSettings, inputStylesPropTypes } from '../input_styles_settings.jsx';
const EmailEdit = ({ attributes, setAttributes }) => { const EmailEdit = ({ attributes, setAttributes }) => {
const inspectorControls = ( const inspectorControls = (
@@ -30,7 +30,10 @@ const EmailEdit = ({ attributes, setAttributes }) => {
/> />
</PanelBody> </PanelBody>
</Panel> </Panel>
<InputStylesSettings /> <InputStylesSettings
styles={attributes.styles}
onChange={(styles) => (setAttributes({ styles }))}
/>
</InspectorControls> </InspectorControls>
); );
@@ -62,6 +65,7 @@ EmailEdit.propTypes = {
attributes: PropTypes.shape({ attributes: PropTypes.shape({
label: PropTypes.string.isRequired, label: PropTypes.string.isRequired,
labelWithinInput: PropTypes.bool.isRequired, labelWithinInput: PropTypes.bool.isRequired,
styles: inputStylesPropTypes.isRequired,
}).isRequired, }).isRequired,
setAttributes: PropTypes.func.isRequired, setAttributes: PropTypes.func.isRequired,
}; };

View File

@@ -1,6 +1,7 @@
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import edit from './edit.jsx'; import edit from './edit.jsx';
import icon from './icon.jsx'; import icon from './icon.jsx';
import { defaultBlockStyles } from '../../store/form_body_to_blocks.jsx';
export const name = 'mailpoet-form/email-input'; export const name = 'mailpoet-form/email-input';
@@ -18,6 +19,10 @@ export const settings = {
type: 'boolean', type: 'boolean',
default: true, default: true,
}, },
styles: {
type: 'object',
default: defaultBlockStyles,
},
}, },
supports: { supports: {
html: false, html: false,

View File

@@ -11,7 +11,7 @@ import MailPoet from 'mailpoet';
import ParagraphEdit from '../paragraph_edit.jsx'; import ParagraphEdit from '../paragraph_edit.jsx';
import formatLabel from '../label_formatter.jsx'; import formatLabel from '../label_formatter.jsx';
import InputStylesSettings from '../input_styles_settings.jsx'; import { InputStylesSettings, inputStylesPropTypes } from '../input_styles_settings.jsx';
const FirstNameEdit = ({ attributes, setAttributes }) => { const FirstNameEdit = ({ attributes, setAttributes }) => {
const inspectorControls = ( const inspectorControls = (
@@ -36,7 +36,10 @@ const FirstNameEdit = ({ attributes, setAttributes }) => {
/> />
</PanelBody> </PanelBody>
</Panel> </Panel>
<InputStylesSettings /> <InputStylesSettings
styles={attributes.styles}
onChange={(styles) => (setAttributes({ styles }))}
/>
</InspectorControls> </InspectorControls>
); );
@@ -69,6 +72,7 @@ FirstNameEdit.propTypes = {
label: PropTypes.string.isRequired, label: PropTypes.string.isRequired,
labelWithinInput: PropTypes.bool.isRequired, labelWithinInput: PropTypes.bool.isRequired,
mandatory: PropTypes.bool.isRequired, mandatory: PropTypes.bool.isRequired,
styles: inputStylesPropTypes.isRequired,
}).isRequired, }).isRequired,
setAttributes: PropTypes.func.isRequired, setAttributes: PropTypes.func.isRequired,
}; };

View File

@@ -1,6 +1,7 @@
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import icon from './icon.jsx'; import icon from './icon.jsx';
import edit from './edit.jsx'; import edit from './edit.jsx';
import { defaultBlockStyles } from '../../store/form_body_to_blocks.jsx';
export const name = 'mailpoet-form/first-name-input'; export const name = 'mailpoet-form/first-name-input';
@@ -22,6 +23,10 @@ export const settings = {
type: 'boolean', type: 'boolean',
default: false, default: false,
}, },
styles: {
type: 'object',
default: defaultBlockStyles,
},
}, },
supports: { supports: {
html: false, html: false,

View File

@@ -1,16 +1,61 @@
import React from 'react'; import React, { useState } from 'react';
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import { import {
Panel, Panel,
PanelBody, PanelBody,
ToggleControl,
} from '@wordpress/components'; } from '@wordpress/components';
import { partial } from 'underscore';
import PropTypes from 'prop-types';
const InputStylesSettings = () => ( const InputStylesSettings = ({
styles,
onChange,
}) => {
const [localStyles, setStyles] = useState(styles);
const updateStyles = (property, value) => {
const updated = { ...localStyles };
updated[property] = value;
onChange(updated);
setStyles(updated);
};
return (
<Panel> <Panel>
<PanelBody title={MailPoet.I18n.t('formSettingsStyles')} initialOpen={false}> <PanelBody title={MailPoet.I18n.t('formSettingsStyles')} initialOpen={false}>
TODO: styles settings <ToggleControl
label={MailPoet.I18n.t('formSettingsDisplayFullWidth')}
checked={localStyles.fullWidth}
onChange={partial(updateStyles, 'fullWidth')}
/>
<ToggleControl
label={MailPoet.I18n.t('formSettingsInheritStyleFromTheme')}
checked={localStyles.inheritFromTheme}
onChange={partial(updateStyles, 'inheritFromTheme')}
/>
{!localStyles.inheritFromTheme ? (
<>
<ToggleControl
label={MailPoet.I18n.t('formSettingsBold')}
checked={localStyles.bold || false}
onChange={partial(updateStyles, 'bold')}
/>
</>
) : null}
</PanelBody> </PanelBody>
</Panel> </Panel>
); );
};
export default InputStylesSettings; export const inputStylesPropTypes = PropTypes.shape({
fullWidth: PropTypes.bool.isRequired,
inheritFromTheme: PropTypes.bool.isRequired,
bold: PropTypes.bool,
});
InputStylesSettings.propTypes = {
styles: inputStylesPropTypes.isRequired,
onChange: PropTypes.func.isRequired,
};
export { InputStylesSettings };

View File

@@ -11,7 +11,7 @@ import MailPoet from 'mailpoet';
import ParagraphEdit from '../paragraph_edit.jsx'; import ParagraphEdit from '../paragraph_edit.jsx';
import formatLabel from '../label_formatter.jsx'; import formatLabel from '../label_formatter.jsx';
import InputStylesSettings from '../input_styles_settings.jsx'; import { InputStylesSettings, inputStylesPropTypes } from '../input_styles_settings.jsx';
const LastNameEdit = ({ attributes, setAttributes }) => { const LastNameEdit = ({ attributes, setAttributes }) => {
const inspectorControls = ( const inspectorControls = (
@@ -36,7 +36,10 @@ const LastNameEdit = ({ attributes, setAttributes }) => {
/> />
</PanelBody> </PanelBody>
</Panel> </Panel>
<InputStylesSettings /> <InputStylesSettings
styles={attributes.styles}
onChange={(styles) => (setAttributes({ styles }))}
/>
</InspectorControls> </InspectorControls>
); );
@@ -69,6 +72,7 @@ LastNameEdit.propTypes = {
label: PropTypes.string.isRequired, label: PropTypes.string.isRequired,
labelWithinInput: PropTypes.bool.isRequired, labelWithinInput: PropTypes.bool.isRequired,
mandatory: PropTypes.bool.isRequired, mandatory: PropTypes.bool.isRequired,
styles: inputStylesPropTypes.isRequired,
}).isRequired, }).isRequired,
setAttributes: PropTypes.func.isRequired, setAttributes: PropTypes.func.isRequired,
}; };

View File

@@ -1,6 +1,7 @@
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import icon from './icon.jsx'; import icon from './icon.jsx';
import edit from './edit.jsx'; import edit from './edit.jsx';
import { defaultBlockStyles } from '../../store/form_body_to_blocks.jsx';
export const name = 'mailpoet-form/last-name-input'; export const name = 'mailpoet-form/last-name-input';
@@ -22,6 +23,10 @@ export const settings = {
type: 'boolean', type: 'boolean',
default: true, default: true,
}, },
styles: {
type: 'object',
default: defaultBlockStyles,
},
}, },
supports: { supports: {
html: false, html: false,

View File

@@ -4,6 +4,16 @@ import formatCustomFieldBlockName from '../blocks/format_custom_field_block_name
const generateId = () => (`${Math.random().toString()}-${Date.now()}`); const generateId = () => (`${Math.random().toString()}-${Date.now()}`);
export const defaultBlockStyles = {
fullWidth: true,
inheritFromTheme: true,
};
const backwardCompatibleBlockStyles = {
fullWidth: false,
inheritFromTheme: true,
};
export const customFieldValuesToBlockValues = (values) => values.map((value) => { export const customFieldValuesToBlockValues = (values) => values.map((value) => {
const mappedValue = { const mappedValue = {
name: value.value, name: value.value,
@@ -55,6 +65,10 @@ const mapCustomField = (item, customFields, mappedCommonProperties) => {
mapped.attributes.values = customFieldValuesToBlockValues(item.params.values); mapped.attributes.values = customFieldValuesToBlockValues(item.params.values);
} }
} }
if (customField.type === 'text' || customField.type === 'textarea') {
mapped.attributes.styles = backwardCompatibleBlockStyles;
}
return mapped; return mapped;
}; };
@@ -153,6 +167,7 @@ export const formBodyToBlocksFactory = (colorDefinitions, customFields = []) =>
return { return {
...mapped, ...mapped,
name: 'mailpoet-form/email-input', name: 'mailpoet-form/email-input',
styles: backwardCompatibleBlockStyles,
}; };
case 'heading': case 'heading':
if (item.params && has(item.params, 'level')) { if (item.params && has(item.params, 'level')) {
@@ -177,11 +192,13 @@ export const formBodyToBlocksFactory = (colorDefinitions, customFields = []) =>
return { return {
...mapped, ...mapped,
name: 'mailpoet-form/first-name-input', name: 'mailpoet-form/first-name-input',
styles: backwardCompatibleBlockStyles,
}; };
case 'last_name': case 'last_name':
return { return {
...mapped, ...mapped,
name: 'mailpoet-form/last-name-input', name: 'mailpoet-form/last-name-input',
styles: backwardCompatibleBlockStyles,
}; };
case 'segments': case 'segments':
if ( if (

View File

@@ -8,6 +8,7 @@ import {
segmentsInput, segmentsInput,
submitInput, submitInput,
customTextInput, customTextInput,
customTextareaInput,
customRadioInput, customRadioInput,
customSelectInput, customSelectInput,
customCheckboxInput, customCheckboxInput,
@@ -64,6 +65,51 @@ describe('Form Body To Blocks', () => {
expect(block.attributes.labelWithinInput).to.be.equal(false); expect(block.attributes.labelWithinInput).to.be.equal(false);
}); });
it('Should add default styles to input blocks', () => {
const customFieldText = {
created_at: '2019-12-10T15:05:06+00:00',
id: 1,
name: 'Custom Field name',
params: {
label: 'Street name',
required: '1',
validate: '',
},
type: 'text',
updated_at: '2019-12-10T15:05:06+00:00',
};
const customFieldTextarea = {
created_at: '2019-12-10T15:05:06+00:00',
id: 2,
name: 'Custom Field 2 name',
params: {
label: 'Description',
required: '1',
validate: '',
lines: '3',
},
type: 'textarea',
updated_at: '2019-12-10T15:05:06+00:00',
};
const [email, firstName, lastName, customText, customTextArea] = formBodyToBlocks([
{ ...emailInput, position: '1' },
{ ...firstNameInput, position: '2' },
{ ...lastNameInput, position: '3' },
{ ...customTextInput, position: '4' },
{ ...customTextareaInput, position: '5', id: 2 },
], [customFieldText, customFieldTextarea]);
const defaultStyles = {
fullWidth: false,
inheritFromTheme: true,
};
expect(email.attributes.styles).to.eql(defaultStyles);
expect(firstName.attributes.styles).to.eql(defaultStyles);
expect(lastName.attributes.styles).to.eql(defaultStyles);
expect(customText.attributes.styles).to.eql(defaultStyles);
expect(customTextArea.attributes.styles).to.eql(defaultStyles);
});
it('Should map email with label within correctly', () => { it('Should map email with label within correctly', () => {
const email = { ...emailInput }; const email = { ...emailInput };
email.params.label_within = '1'; email.params.label_within = '1';

View File

@@ -82,6 +82,20 @@ export const customTextInput = {
}, },
position: null, position: null,
}; };
export const customTextareaInput = {
type: 'textarea',
name: 'Description',
id: '1',
unique: '1',
static: '0',
params: {
required: '',
label: 'Name of the street',
label_within: '1',
lines: '3',
},
position: null,
};
export const customRadioInput = { export const customRadioInput = {
type: 'radio', type: 'radio',
name: 'Options', name: 'Options',

View File

@@ -46,6 +46,9 @@
'formSettingsStylesFontSize': __('Font Size'), 'formSettingsStylesFontSize': __('Font Size'),
'formSettingsStylesFontColor': __('Font Color'), 'formSettingsStylesFontColor': __('Font Color'),
'formSettingsStylesFontColorInherit': __('Inherit from theme'), 'formSettingsStylesFontColorInherit': __('Inherit from theme'),
'formSettingsInheritStyleFromTheme': __('Inherit style from theme'),
'formSettingsDisplayFullWidth': _x('Display Fullwidth', 'A label for checkbox in form style settings'),
'formSettingsBold': _x('Bold', 'A label for checkbox in form style settings'),
'customFieldSettings': _x('Custom field settings', 'A settings section heading'), 'customFieldSettings': _x('Custom field settings', 'A settings section heading'),
'customFieldsFormSettings': _x('Form settings', 'A settings section heading'), 'customFieldsFormSettings': _x('Form settings', 'A settings section heading'),
'formPlacement': _x('Form Placement', 'A settings section heading'), 'formPlacement': _x('Form Placement', 'A settings section heading'),