diff --git a/assets/css/src/components/formEditor/components/_sidebar.scss b/assets/css/src/components/formEditor/components/_sidebar.scss index 2c58cc2c06..9fb6fcf315 100644 --- a/assets/css/src/components/formEditor/components/_sidebar.scss +++ b/assets/css/src/components/formEditor/components/_sidebar.scss @@ -56,11 +56,16 @@ $gutenberg-control-border-color-focus: #007cba; .components-base-control { flex-grow: 1; - margin-bottom: 16px; + margin: 8px 0; + + .components-base-control__field { + margin: 0; + } } .mailpoet-form-segments-segment-remove { cursor: pointer; flex-grow: 0; + margin: 8px 0; } } diff --git a/assets/js/src/form_editor/blocks/segment_select/settings.jsx b/assets/js/src/form_editor/blocks/segment_select/settings.jsx index 1f897f823d..f93029c68a 100644 --- a/assets/js/src/form_editor/blocks/segment_select/settings.jsx +++ b/assets/js/src/form_editor/blocks/segment_select/settings.jsx @@ -73,6 +73,7 @@ const SegmentSelectSettings = ({ segments={segmentsAddedIntoSelection} updateSegment={updateSegment} removeSegment={removeSegment} + onSegmentsReorder={setNewSelection} /> {segmentsListToBeAdded.length ? ( diff --git a/assets/js/src/form_editor/blocks/segment_select/settings_preview.jsx b/assets/js/src/form_editor/blocks/segment_select/settings_preview.jsx index b3ad50b08d..74ab2b2865 100644 --- a/assets/js/src/form_editor/blocks/segment_select/settings_preview.jsx +++ b/assets/js/src/form_editor/blocks/segment_select/settings_preview.jsx @@ -2,8 +2,32 @@ import React from 'react'; import PropTypes from 'prop-types'; import { CheckboxControl } from '@wordpress/components'; import { partial } from 'lodash'; +import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd'; -const Preview = ({ segments, updateSegment, removeSegment }) => { +const getItemStyle = (isDragging, draggableStyle) => ({ + userSelect: 'none', + background: isDragging ? 'lightblue' : 'rgba(0,0,0,0)', + ...draggableStyle, +}); + +const getListStyle = (isDraggingOver) => ({ + background: isDraggingOver ? 'lightgrey' : 'rgba(0,0,0,0)', +}); + +const reorder = (list, startIndex, endIndex) => { + const result = Array.from(list); + const [removed] = result.splice(startIndex, 1); + result.splice(endIndex, 0, removed); + + return result; +}; + +const Preview = ({ + segments, + updateSegment, + removeSegment, + onSegmentsReorder, +}) => { if (segments.length === 0) { return null; } @@ -14,32 +38,73 @@ const Preview = ({ segments, updateSegment, removeSegment }) => { updateSegment(segment); }; - return segments.map((segment) => ( -
- - { - if ((['keydown', 'keypress'].includes(event.type) && ['Enter', ' '].includes(event.key)) - ) { - event.preventDefault(); - partial(removeSegment, segment.id); - } - }} - > - ✗ - -
- )); + const onDragEnd = (result) => { + if (!result.destination) { + return; + } + + onSegmentsReorder(reorder( + segments, + result.source.index, + result.destination.index + )); + }; + + return ( + + + {(providedDroppable, snapshotDroppable) => ( +
+ {segments.map((segment, index) => ( + + {(providedDraggable, snapshotDraggable) => ( +
+ + { + if ((['keydown', 'keypress'].includes(event.type) && ['Enter', ' '].includes(event.key)) + ) { + event.preventDefault(); + partial(removeSegment, segment.id); + } + }} + > + ✗ + +
+ )} +
+ ))} + {providedDroppable.placeholder} +
+ )} +
+
+ ); }; Preview.propTypes = { @@ -50,6 +115,7 @@ Preview.propTypes = { }).isRequired).isRequired, updateSegment: PropTypes.func.isRequired, removeSegment: PropTypes.func.isRequired, + onSegmentsReorder: PropTypes.func.isRequired, }; export default Preview;