diff --git a/assets/js/src/form_editor/components/form_settings/basic_settings_panel.jsx b/assets/js/src/form_editor/components/form_settings/basic_settings_panel.jsx index b9c4ecbd4e..c1d902f126 100644 --- a/assets/js/src/form_editor/components/form_settings/basic_settings_panel.jsx +++ b/assets/js/src/form_editor/components/form_settings/basic_settings_panel.jsx @@ -10,9 +10,10 @@ import { useDispatch, useSelect } from '@wordpress/data'; import React from 'react'; import MailPoet from 'mailpoet'; import classnames from 'classnames'; +import PropTypes from 'prop-types'; import Selection from '../../../form/fields/selection.jsx'; -export default () => { +const BasicSettingsPanel = ({ onToggle, isOpened }) => { const settings = useSelect( (select) => select('mailpoet-form-editor').getFormSettings(), [] @@ -68,7 +69,7 @@ export default () => { const shouldDisplayMissingListError = missingListError && !selectedSegments.length; return ( - + { ); }; + +BasicSettingsPanel.propTypes = { + onToggle: PropTypes.func.isRequired, + isOpened: PropTypes.bool.isRequired, +}; + +export default BasicSettingsPanel; diff --git a/assets/js/src/form_editor/components/form_settings/custom_css_panel.jsx b/assets/js/src/form_editor/components/form_settings/custom_css_panel.jsx index abcd8deab4..0cefa22d1c 100644 --- a/assets/js/src/form_editor/components/form_settings/custom_css_panel.jsx +++ b/assets/js/src/form_editor/components/form_settings/custom_css_panel.jsx @@ -5,9 +5,10 @@ import { } from '@wordpress/components'; import MailPoet from 'mailpoet'; import { useSelect, useDispatch } from '@wordpress/data'; +import PropTypes from 'prop-types'; import CodeMirror from './codemirror_wrap.jsx'; -export default () => { +const CustomCssPanel = ({ onToggle, isOpened }) => { const styles = useSelect( (select) => select('mailpoet-form-editor').getFormStyles(), [] @@ -17,9 +18,17 @@ export default () => { return ( - + ); }; + + +CustomCssPanel.propTypes = { + onToggle: PropTypes.func.isRequired, + isOpened: PropTypes.bool.isRequired, +}; + +export default CustomCssPanel; diff --git a/assets/js/src/form_editor/components/form_settings/form_placement_panel.jsx b/assets/js/src/form_editor/components/form_settings/form_placement_panel.jsx index a86c0262d9..fceda9d2ed 100644 --- a/assets/js/src/form_editor/components/form_settings/form_placement_panel.jsx +++ b/assets/js/src/form_editor/components/form_settings/form_placement_panel.jsx @@ -8,8 +8,9 @@ import { useSelect } from '@wordpress/data'; import MailPoet from 'mailpoet'; import ReactStringReplace from 'react-string-replace'; import { curry } from 'lodash'; +import PropTypes from 'prop-types'; -export default () => { +const FormPlacementPanel = ({ onToggle, isOpened }) => { const [copyAreaContent, setCopyAreaContent] = useState(null); const formExports = useSelect( @@ -70,7 +71,7 @@ export default () => { return ( - +

{addFormWidgetHint}

{addFormShortcodeHint}

{addFormPhpIframeHint}

@@ -79,3 +80,10 @@ export default () => {
); }; + +FormPlacementPanel.propTypes = { + onToggle: PropTypes.func.isRequired, + isOpened: PropTypes.bool.isRequired, +}; + +export default FormPlacementPanel; diff --git a/assets/js/src/form_editor/components/form_settings/form_settings.jsx b/assets/js/src/form_editor/components/form_settings/form_settings.jsx index e33c01781f..65cc66b009 100644 --- a/assets/js/src/form_editor/components/form_settings/form_settings.jsx +++ b/assets/js/src/form_editor/components/form_settings/form_settings.jsx @@ -1,13 +1,32 @@ import React from 'react'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { partial } from 'lodash'; import BasicSettingsPanel from './basic_settings_panel.jsx'; import FormPlacementPanel from './form_placement_panel.jsx'; import CustomCssPanel from './custom_css_panel.jsx'; -export default () => ( - <> - - - - -); +export default () => { + const { toggleSidebarPanel } = useDispatch('mailpoet-form-editor'); + const openedPanels = useSelect( + (select) => select('mailpoet-form-editor').getSidebarOpenedPanels(), + [] + ); + + return ( + <> + + + + + ); +}; diff --git a/assets/js/src/form_editor/store/actions.jsx b/assets/js/src/form_editor/store/actions.jsx index d06a944751..e7b387e86e 100644 --- a/assets/js/src/form_editor/store/actions.jsx +++ b/assets/js/src/form_editor/store/actions.jsx @@ -70,6 +70,14 @@ export function switchSidebarTab(id) { }; } +export function toggleSidebarPanel(id, isOpened = undefined) { + return { + type: 'TOGGLE_SIDEBAR_PANEL', + id, + isOpened, + }; +} + export function* saveForm() { yield { type: 'SAVE_FORM', diff --git a/assets/js/src/form_editor/store/reducer.jsx b/assets/js/src/form_editor/store/reducer.jsx index add0e00b4c..17cc25aeb5 100644 --- a/assets/js/src/form_editor/store/reducer.jsx +++ b/assets/js/src/form_editor/store/reducer.jsx @@ -7,6 +7,7 @@ import saveFormDone from './reducers/saveFormDone.jsx'; import removeNotice from './reducers/removeNotice.jsx'; import changeFormSettings from './reducers/changeFormSettings.jsx'; import switchSidebarTab from './reducers/switchSidebarTab.jsx'; +import toggleSidebarPanel from './reducers/toggleSidebarPanel.jsx'; export default (defaultState) => (state = defaultState, action) => { switch (action.type) { @@ -19,6 +20,7 @@ export default (defaultState) => (state = defaultState, action) => { case 'TOGGLE_SIDEBAR': return toggleSidebar(state, action); case 'CHANGE_FORM_SETTINGS': return changeFormSettings(state, action); case 'SWITCH_SIDEBAR_TAB': return switchSidebarTab(state, action); + case 'TOGGLE_SIDEBAR_PANEL': return toggleSidebarPanel(state, action); default: return state; } diff --git a/assets/js/src/form_editor/store/reducers/toggleSidebarPanel.jsx b/assets/js/src/form_editor/store/reducers/toggleSidebarPanel.jsx new file mode 100644 index 0000000000..4f201a2ccc --- /dev/null +++ b/assets/js/src/form_editor/store/reducers/toggleSidebarPanel.jsx @@ -0,0 +1,20 @@ +import { remove } from 'lodash'; + +export default (state, action) => { + const openedPanels = [...state.sidebar.openedPanels]; + const isOpenedCurrent = openedPanels.includes(action.id); + const isOpenedFinal = action.isOpened !== undefined ? action.isOpened : !isOpenedCurrent; + if (isOpenedFinal && !isOpenedCurrent) { + openedPanels.push(action.id); + } + if (!isOpenedFinal && isOpenedCurrent) { + remove(openedPanels, (item) => item === action.id); + } + return { + ...state, + sidebar: { + ...state.sidebar, + openedPanels, + }, + }; +}; diff --git a/assets/js/src/form_editor/store/selectors.jsx b/assets/js/src/form_editor/store/selectors.jsx index e35a262b4d..d2f155c8b6 100644 --- a/assets/js/src/form_editor/store/selectors.jsx +++ b/assets/js/src/form_editor/store/selectors.jsx @@ -41,4 +41,7 @@ export default { getSidebarActiveTab(state) { return state.sidebar.activeTab; }, + getSidebarOpenedPanels(state) { + return state.sidebar.openedPanels; + }, }; diff --git a/assets/js/src/form_editor/store/store.jsx b/assets/js/src/form_editor/store/store.jsx index 997b9fc070..0493d04989 100644 --- a/assets/js/src/form_editor/store/store.jsx +++ b/assets/js/src/form_editor/store/store.jsx @@ -20,6 +20,7 @@ const defaultState = { notices: [], sidebar: { activeTab: 'form', + openedPanels: ['basic-settings'], }, };