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'],
},
};