@flozy/editor 1.7.0 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/Editor/CommonEditor.js +9 -79
  2. package/dist/Editor/Editor.css +11 -0
  3. package/dist/Editor/Elements/Button/EditorButton.js +7 -3
  4. package/dist/Editor/Elements/Carousel/Carousel.js +4 -4
  5. package/dist/Editor/Elements/Embed/Image.js +5 -1
  6. package/dist/Editor/Elements/Form/Form.js +3 -3
  7. package/dist/Editor/Elements/Form/Workflow/FormWorkflow.js +17 -12
  8. package/dist/Editor/Elements/Form/Workflow/MoreOptions.js +4 -7
  9. package/dist/Editor/Elements/Form/Workflow/Styles.js +97 -89
  10. package/dist/Editor/Elements/Form/Workflow/UserInputs.js +10 -15
  11. package/dist/Editor/Elements/Form/Workflow/index.js +23 -24
  12. package/dist/Editor/Elements/Grid/Grid.js +9 -1
  13. package/dist/Editor/Elements/Grid/GridItem.js +3 -0
  14. package/dist/Editor/Elements/Signature/SignaturePopup.js +8 -3
  15. package/dist/Editor/Elements/SimpleText.js +9 -4
  16. package/dist/Editor/MiniEditor.js +118 -0
  17. package/dist/Editor/Styles/EditorStyles.js +20 -0
  18. package/dist/Editor/Toolbar/PopupTool/TextFormat.js +1 -1
  19. package/dist/Editor/common/DnD/DragHandle.js +99 -0
  20. package/dist/Editor/common/DnD/Draggable.js +41 -0
  21. package/dist/Editor/common/DnD/Droppable.js +28 -0
  22. package/dist/Editor/common/DnD/index.js +48 -0
  23. package/dist/Editor/common/StyleBuilder/sectionStyle.js +8 -0
  24. package/dist/Editor/common/iconslist.js +17 -1
  25. package/dist/Editor/hooks/useMouseMove.js +9 -1
  26. package/dist/Editor/utils/helper.js +1 -0
  27. package/dist/Editor/utils/pageSettings.js +2 -2
  28. package/dist/Editor/utils/serializeToHTML.js +5 -0
  29. package/dist/Editor/utils/{serializer.js → serializeToText.js} +3 -3
  30. package/dist/index.js +2 -0
  31. package/package.json +1 -1
  32. package/dist/Editor/Elements/Section.js +0 -42
@@ -3,7 +3,7 @@ import React, { useState } from "react";
3
3
  import FormStyles from "./Styles";
4
4
  import Icon from "../../../common/Icon";
5
5
  import { PlusIcon, RestRight } from "../../../common/iconslist";
6
- import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
6
+ import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown";
7
7
  import { AllColors } from "../../Color Picker/ColorButtons";
8
8
  import PopupToolStyle from "../../../Toolbar/PopupTool/PopupToolStyle";
9
9
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -20,7 +20,7 @@ const UserInputs = props => {
20
20
  const variables = element?.children;
21
21
  const classes = FormStyles();
22
22
  const popupClasses = PopupToolStyle();
23
- const [activeColor, setActiveColor] = useState(['#000000']);
23
+ const [activeColor, setActiveColor] = useState(["#000000"]);
24
24
  //state
25
25
  const [anchorEl, setAnchorEl] = useState(null);
26
26
  const [colorAnchorEl, setColorAnchorEl] = useState(null);
@@ -115,7 +115,7 @@ const UserInputs = props => {
115
115
  title: "Current Color",
116
116
  children: /*#__PURE__*/_jsx(IconButton, {
117
117
  style: {
118
- borderRadius: '50px',
118
+ borderRadius: "50px",
119
119
  background: activeColor
120
120
  }
121
121
  })
@@ -140,6 +140,7 @@ const UserInputs = props => {
140
140
  item: true,
141
141
  children: /*#__PURE__*/_jsxs(Grid, {
142
142
  container: true,
143
+ alignItems: "center",
143
144
  children: [/*#__PURE__*/_jsx(Grid, {
144
145
  item: true,
145
146
  children: /*#__PURE__*/_jsx(Tooltip, {
@@ -166,12 +167,12 @@ const UserInputs = props => {
166
167
  anchorEl: anchorEl,
167
168
  onClose: handleClose,
168
169
  anchorOrigin: {
169
- vertical: 'bottom',
170
- horizontal: 'right'
170
+ vertical: "bottom",
171
+ horizontal: "right"
171
172
  },
172
173
  transformOrigin: {
173
- vertical: 'top',
174
- horizontal: 'right'
174
+ vertical: "top",
175
+ horizontal: "right"
175
176
  },
176
177
  children: variables?.map((m, i) => /*#__PURE__*/_jsx(MenuItem, {
177
178
  sx: {
@@ -188,18 +189,12 @@ const UserInputs = props => {
188
189
  }), /*#__PURE__*/_jsx(Grid, {
189
190
  item: true,
190
191
  xs: 12,
192
+ sx: classes.bodyTextArea,
191
193
  children: type === 2 && /*#__PURE__*/_jsx(TextareaAutosize, {
192
194
  margin: "none",
193
195
  minRows: 6,
194
196
  value: subject,
195
- onChange: handleField,
196
- className: classes.bodyTextArea,
197
- style: {
198
- border: 'none',
199
- width: "96%",
200
- padding: '10px',
201
- outline: "none"
202
- }
197
+ onChange: handleField
203
198
  })
204
199
  })]
205
200
  });
@@ -1,11 +1,11 @@
1
1
  import React, { useEffect, useState } from "react";
2
2
  import { Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton } from "@mui/material";
3
- import ArrowBackIcon from '@mui/icons-material/ArrowBack';
3
+ import ArrowBackIcon from "@mui/icons-material/ArrowBack";
4
4
  import FormStyles from "./Styles";
5
5
  import FormWorkflow from "./FormWorkflow";
6
6
 
7
7
  //Constants
8
- import { minutes, hours, days } from './constant';
8
+ import { minutes, hours, days } from "./constant";
9
9
  import ListWorkflow from "./ListWorkflow";
10
10
  import { PlusIcon } from "../../../common/iconslist";
11
11
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -23,12 +23,12 @@ const Workflow = props => {
23
23
  const classes = FormStyles();
24
24
  const [workflowList, setWorkflowList] = useState([]);
25
25
  const [formData, setFormData] = useState(false);
26
- const [schedule, setSchedule] = useState('immediately');
27
- const [scheduleEvery, setScheduleEvery] = useState('min');
28
- const currentInstant = scheduleEvery === 'min' ? minutes : scheduleEvery === 'hr' ? hours : scheduleEvery === 'day' ? days : [];
26
+ const [schedule, setSchedule] = useState("immediately");
27
+ const [scheduleEvery, setScheduleEvery] = useState("min");
28
+ const currentInstant = scheduleEvery === "min" ? minutes : scheduleEvery === "hr" ? hours : scheduleEvery === "day" ? days : [];
29
29
  const [scheduleOn, setScheduleOn] = useState(currentInstant[0]);
30
- const [subject, setSubject] = useState('');
31
- const [bodyData, setBodyData] = useState('');
30
+ const [subject, setSubject] = useState("Welcome to Flozy!");
31
+ const [bodyData, setBodyData] = useState("Hey %field_name% \n\nThanks for attending the event called %Event Name% at %Event Time% on %Event Time%.");
32
32
  const [flowEdited, setFlowEdited] = useState({
33
33
  isEdited: false,
34
34
  listIndex: null
@@ -44,16 +44,16 @@ const Workflow = props => {
44
44
  };
45
45
  const onFormBack = () => {
46
46
  setFormData(false);
47
- setBodyData('');
48
- setSubject('');
49
- setSchedule('immediately');
47
+ setBodyData("");
48
+ setSubject("");
49
+ setSchedule("immediately");
50
50
  };
51
51
  const saveFormWorkflow = () => {
52
52
  let workflowData = [...workflowList];
53
53
  let data = {
54
54
  schedule_type: schedule,
55
- schedule_every: schedule === 'after' ? scheduleEvery : 0,
56
- schedule_on: schedule === 'after' ? scheduleOn : 0,
55
+ schedule_every: schedule === "after" ? scheduleEvery : 0,
56
+ schedule_on: schedule === "after" ? scheduleOn : 0,
57
57
  subject_data: subject,
58
58
  body_data: bodyData
59
59
  };
@@ -67,9 +67,9 @@ const Workflow = props => {
67
67
  };
68
68
  onSave(saveData);
69
69
  setFormData(false);
70
- setBodyData('');
71
- setSubject('');
72
- setSchedule('immediately');
70
+ setBodyData("");
71
+ setSubject("");
72
+ setSchedule("immediately");
73
73
  setFlowEdited({
74
74
  isEdited: false,
75
75
  listIndex: null
@@ -117,25 +117,25 @@ const Workflow = props => {
117
117
  children: [/*#__PURE__*/_jsxs(DialogTitle, {
118
118
  sx: classes.popupTitle,
119
119
  style: {
120
- padding: formData ? '16px 12px' : '16px 24px',
120
+ padding: formData ? "16px 12px" : "16px 24px",
121
121
  justifyContent: !formData ? "space-between" : ""
122
122
  },
123
123
  children: [formData && /*#__PURE__*/_jsx(IconButton, {
124
124
  onClick: onFormBack,
125
125
  children: /*#__PURE__*/_jsx(ArrowBackIcon, {})
126
- }), "Follow-Up Email", !formData && workflowList?.length > 0 && /*#__PURE__*/_jsx(Button, {
126
+ }), "Follow-Up Email", !formData && workflowList?.length > 0 && /*#__PURE__*/_jsxs(Button, {
127
127
  variant: "outlined",
128
128
  sx: {
129
- textTransform: 'none',
130
- background: '#EBF1F9'
129
+ textTransform: "none",
130
+ background: "#EBF1F9",
131
+ padding: "7px 15px"
131
132
  },
132
133
  onClick: handleAddFormWorkflow,
133
134
  size: "small",
134
135
  startIcon: /*#__PURE__*/_jsx(PlusIcon, {}),
135
- children: " New Email"
136
+ children: [" ", "New Email"]
136
137
  })]
137
138
  }), /*#__PURE__*/_jsxs(DialogContent, {
138
- dividers: true,
139
139
  children: [!formData && workflowList?.length > 0 && /*#__PURE__*/_jsx(ListWorkflow, {
140
140
  workflow: workflowList,
141
141
  handleEditFormWorkflow: handleEditFormWorkflow,
@@ -160,15 +160,14 @@ const Workflow = props => {
160
160
  }), /*#__PURE__*/_jsxs(DialogActions, {
161
161
  sx: classes.dialogFooter,
162
162
  children: [/*#__PURE__*/_jsx(Button, {
163
- color: "primary",
163
+ className: "secondaryBtn",
164
164
  sx: classes.closeBtn,
165
- variant: "outlined",
166
165
  onClick: closeWorkflow,
167
166
  size: "small",
168
167
  children: "Close"
169
168
  }), (formData || workflowList?.length === 0) && /*#__PURE__*/_jsx(Button, {
169
+ className: "primaryBtn",
170
170
  sx: classes.saveBtn,
171
- variant: "contained",
172
171
  onClick: saveFormWorkflow,
173
172
  size: "small",
174
173
  children: "Save"
@@ -46,6 +46,7 @@ const Grid = props => {
46
46
  sectionBgColor,
47
47
  sectionBackgroundImage,
48
48
  sectionBannerSpacing,
49
+ sectionBorderRadius,
49
50
  gridSize
50
51
  } = element;
51
52
  const {
@@ -71,6 +72,12 @@ const Grid = props => {
71
72
  bottomLeft,
72
73
  bottomRight
73
74
  } = borderRadius || {};
75
+ const {
76
+ topLeft: ssTopLeft,
77
+ topRight: ssTopRight,
78
+ bottomLeft: ssBottomLeft,
79
+ bottomRight: ssBottomRight
80
+ } = sectionBorderRadius || {};
74
81
  const editor = useSlateStatic();
75
82
  const path = ReactEditor.findPath(editor, element);
76
83
  const {
@@ -289,7 +296,8 @@ const Grid = props => {
289
296
  paddingLeft: `${ssleft}px`,
290
297
  paddingRight: `${ssright}px`,
291
298
  paddingTop: `${sstop}px`,
292
- paddingBottom: `${ssbottom}px`
299
+ paddingBottom: `${ssbottom}px`,
300
+ borderRadius: `${ssTopLeft}px ${ssTopRight}px ${ssBottomLeft}px ${ssBottomRight}px`
293
301
  },
294
302
  "data-path": path.join(","),
295
303
  children: /*#__PURE__*/_jsxs(GridContainer, {
@@ -150,6 +150,9 @@ const GridItem = props => {
150
150
  children: [!readOnly && /*#__PURE__*/_jsxs("div", {
151
151
  className: `element-selector ${selected ? "selected" : ""}`,
152
152
  contentEditable: false,
153
+ style: {
154
+ zIndex: 1000
155
+ },
153
156
  children: [/*#__PURE__*/_jsx("div", {
154
157
  className: "element-selector-dots tl",
155
158
  children: " "
@@ -26,7 +26,9 @@ const SignaturePopup = props => {
26
26
  const [open, setOpen] = useState(false);
27
27
  const [tab, setTab] = useState(0);
28
28
  const SeletectedTab = SignatureOptions[tab];
29
- const [signedData, setSignedData] = useState({});
29
+ const [signedData, setSignedData] = useState({
30
+ signedOn: new Date()
31
+ });
30
32
  const [brush, setBrush] = useState({
31
33
  size: 1,
32
34
  color: "#000000"
@@ -250,12 +252,14 @@ const SignaturePopup = props => {
250
252
  children: /*#__PURE__*/_jsx(DatePicker, {
251
253
  showIcon: true,
252
254
  id: "signedOn",
255
+ name: "signedOn",
253
256
  selected: signedData?.signedOn ? new Date(signedData?.signedOn) : new Date(),
257
+ value: signedData?.signedOn || "",
254
258
  dateFormat: "MM/dd/yyyy",
255
259
  onChange: date => {
256
260
  setSignedData({
257
261
  ...signedData,
258
- signedOn: new Date(date).toISOString().split("T")[0]
262
+ signedOn: date ? new Date(date).toISOString().split("T")[0] : ""
259
263
  });
260
264
  }
261
265
  })
@@ -342,7 +346,8 @@ const SignaturePopup = props => {
342
346
  children: "Delete"
343
347
  }) : null, /*#__PURE__*/_jsx(Button, {
344
348
  onClick: handleSave,
345
- className: "primaryBtn",
349
+ className: `primaryBtn ${!signedData?.signature ? "disabled" : ""}`,
350
+ disabled: !signedData?.signature,
346
351
  children: "Save"
347
352
  })]
348
353
  })]
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import { useSlateStatic, useSelected, ReactEditor } from "slate-react";
3
- import { Node } from "slate";
3
+ import { Node, Editor } from "slate";
4
4
  import { Box } from "@mui/material";
5
5
  import { jsx as _jsx } from "react/jsx-runtime";
6
6
  import { jsxs as _jsxs } from "react/jsx-runtime";
@@ -47,7 +47,8 @@ const SimpleText = props => {
47
47
  customProps
48
48
  } = props;
49
49
  const {
50
- readOnly
50
+ readOnly,
51
+ editorPlaceholder
51
52
  } = customProps;
52
53
  const classes = SimpleTextStyle();
53
54
  const editor = useSlateStatic();
@@ -55,20 +56,24 @@ const SimpleText = props => {
55
56
  const path = ReactEditor.findPath(editor, element);
56
57
  const noContent = Node.string(Node.get(editor, path)).length === 0 && path.length === 1;
57
58
  const emptyEditor = editor.children.length === 1 && path[0] === 0 && path.length === 1 && !selected;
59
+ const isMoreText = (editor.selection ? Editor.string(editor, editor.selection) : "")?.trim()?.length === 0;
58
60
  return /*#__PURE__*/_jsxs(Box, {
59
61
  ...element.attr,
60
62
  ...attributes,
61
63
  className: `simple-text`,
62
64
  sx: classes.root,
63
- children: [children, selected && noContent && !readOnly ? /*#__PURE__*/_jsxs("span", {
65
+ children: [children, isMoreText && selected && noContent && !readOnly ? /*#__PURE__*/_jsxs("span", {
64
66
  className: "placeholder-simple-text",
65
67
  children: ["Type ", /*#__PURE__*/_jsx("span", {
66
68
  className: "bg-pad-sl",
67
69
  children: "/"
68
70
  }), " for browse elements"]
69
- }) : null, emptyEditor && !readOnly ? /*#__PURE__*/_jsx("span", {
71
+ }) : null, isMoreText && emptyEditor && !readOnly ? /*#__PURE__*/_jsx("span", {
70
72
  className: "placeholder-simple-text",
71
73
  children: "Write Something..."
74
+ }) : null, editorPlaceholder && !selected ? /*#__PURE__*/_jsx("span", {
75
+ className: "placeholder-simple-text",
76
+ children: editorPlaceholder
72
77
  }) : null]
73
78
  });
74
79
  };
@@ -0,0 +1,118 @@
1
+ import React, { useCallback, useMemo, useRef, useState } from "react";
2
+ import { createEditor } from 'slate';
3
+ import { Slate, Editable, withReact } from "slate-react";
4
+ import { getBlock, getMarked } from "./utils/SlateUtilityFunctions";
5
+ import { commands, mentionsEvent } from "./utils/events";
6
+ import useMentions from "./hooks/useMentions";
7
+ import Shorthands from "./common/Shorthands";
8
+ // import withCommon from "./hooks/withCommon";
9
+ import { jsx as _jsx } from "react/jsx-runtime";
10
+ const initialValue = [{
11
+ type: 'paragraph',
12
+ children: [{
13
+ text: ''
14
+ }]
15
+ }];
16
+ const MiniEditor = props => {
17
+ const {
18
+ id,
19
+ // content,
20
+ // onSave,
21
+ // editor: collaborativeEditor,
22
+ readOnly,
23
+ miniEditorPlaceholder,
24
+ otherProps
25
+ } = props;
26
+ const {
27
+ CHARACTERS = []
28
+ // needLayout = true,
29
+ } = otherProps || {};
30
+ const mentionsRef = useRef();
31
+ const [editor] = useState(() => withReact(createEditor()));
32
+
33
+ // const editor = useMemo(() => {
34
+ // if (collaborativeEditor) return collaborativeEditor;
35
+ // return withCommon(createEditor(), { needLayout });
36
+ // }, [collaborativeEditor]);
37
+
38
+ const isReadOnly = readOnly === "readonly";
39
+ const customProps = {
40
+ ...(otherProps || {}),
41
+ readOnly: isReadOnly,
42
+ editorPlaceholder: miniEditorPlaceholder,
43
+ page_id: id
44
+ };
45
+ const [mentions, setMentions] = useMentions({
46
+ editor,
47
+ selection: editor?.selection
48
+ });
49
+ const {
50
+ search,
51
+ target,
52
+ index,
53
+ type
54
+ } = mentions;
55
+ console.log("🚀 ~ MiniEditor ~ mentions:", mentions);
56
+ const chars = type ? Shorthands[type]({
57
+ ...mentions,
58
+ CHARACTERS
59
+ }) : [];
60
+ const Leaf = ({
61
+ attributes,
62
+ children,
63
+ leaf
64
+ }) => {
65
+ children = getMarked(leaf, children);
66
+ return /*#__PURE__*/_jsx("span", {
67
+ ...attributes,
68
+ children: children
69
+ });
70
+ };
71
+ const Element = props => {
72
+ return getBlock(props);
73
+ };
74
+ const renderLeaf = useCallback(props => {
75
+ return /*#__PURE__*/_jsx(Leaf, {
76
+ ...props,
77
+ customProps: customProps
78
+ });
79
+ }, []);
80
+ const onKeyDown = useCallback(event => {
81
+ const isMetaKey = event.metaKey && event.keyCode >= 65 && event.keyCode <= 90;
82
+ const isCtrlKey = event.ctrlKey || isMetaKey;
83
+ if (target && chars.length > 0 && !isCtrlKey) {
84
+ mentionsEvent({
85
+ event,
86
+ mentions,
87
+ setMentions,
88
+ chars,
89
+ target,
90
+ editor,
91
+ type,
92
+ mentionsRef
93
+ });
94
+ } else if (isCtrlKey) {
95
+ commands({
96
+ event,
97
+ editor
98
+ });
99
+ }
100
+ }, [chars, editor, target, mentions, setMentions, search, type, mentionsRef]);
101
+ const renderElement = useCallback(props => {
102
+ return /*#__PURE__*/_jsx(Element, {
103
+ ...props,
104
+ customProps: customProps
105
+ });
106
+ }, []);
107
+ return /*#__PURE__*/_jsx(Slate, {
108
+ editor: editor,
109
+ initialValue: initialValue,
110
+ children: /*#__PURE__*/_jsx(Editable, {
111
+ renderElement: renderElement,
112
+ renderLeaf: renderLeaf,
113
+ onKeyDown: onKeyDown
114
+ })
115
+ });
116
+ };
117
+ MiniEditor.displayName = "MiniEditor";
118
+ export default MiniEditor;
@@ -62,6 +62,26 @@ const editorStyles = ({
62
62
  },
63
63
  "& .accordion-summary-collapse-btn": {
64
64
  padding: "4px"
65
+ },
66
+ "& .workflow-icon-btn": {
67
+ pointerEvents: "none",
68
+ position: "absolute",
69
+ right: "-9px",
70
+ top: "-9px",
71
+ border: "2px solid #f3b814",
72
+ padding: "0px",
73
+ background: "#FFF",
74
+ "& svg": {
75
+ width: "18px",
76
+ height: "18px"
77
+ }
78
+ },
79
+ "& .svg-big-btn": {
80
+ padding: "2px !important",
81
+ "& svg": {
82
+ width: "24px !important",
83
+ height: "24px !important"
84
+ }
65
85
  }
66
86
  }
67
87
  });
@@ -50,7 +50,7 @@ const TextFormat = props => {
50
50
  };
51
51
  const handlePageWidth = width => () => {
52
52
  updatePageSettings(editor, {
53
- ...pageProps,
53
+ ...(pageProps || {}),
54
54
  pageWidth: width
55
55
  });
56
56
  };
@@ -0,0 +1,99 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { ReactEditor, useSlateStatic } from "slate-react";
3
+ import { Box } from "@mui/material";
4
+ import Draggable from "./Draggable";
5
+ import Droppable from "./Droppable";
6
+ import { useEditorContext } from "../../hooks/useMouseMove";
7
+ import { Transforms } from "slate";
8
+ import { jsx as _jsx } from "react/jsx-runtime";
9
+ import { jsxs as _jsxs } from "react/jsx-runtime";
10
+ const DRAGGABLE_TYPES = ["paragraph"];
11
+ const DragHandleStyle = () => ({
12
+ root: {
13
+ position: "relative",
14
+ paddingLeft: "20px",
15
+ "&:hover": {
16
+ "& > .dh-para:first-child": {
17
+ opacity: 1
18
+ }
19
+ },
20
+ "&.dragging": {
21
+ backgroundColor: "#def4ff"
22
+ }
23
+ },
24
+ dragHandle: {
25
+ opacity: 0,
26
+ content: '" "',
27
+ position: "absolute",
28
+ top: 0,
29
+ left: 0,
30
+ borderRadius: "4px",
31
+ padding: "0px",
32
+ width: "18px",
33
+ background: "transparent",
34
+ border: 0,
35
+ display: "flex",
36
+ alignItems: "center",
37
+ justifyContent: "center",
38
+ cursor: "grab",
39
+ "& svg": {
40
+ fill: "#ccc",
41
+ width: "20px"
42
+ },
43
+ "&:hover": {
44
+ opacity: 1,
45
+ background: "#eee"
46
+ },
47
+ "&.active": {
48
+ opacity: 1,
49
+ cursor: "grabbing"
50
+ }
51
+ },
52
+ dropArea: {
53
+ height: "2px"
54
+ }
55
+ });
56
+ const DragHandle = props => {
57
+ const classes = DragHandleStyle();
58
+ const editor = useSlateStatic();
59
+ const [dragging, setDragging] = useState(false);
60
+ const {
61
+ attributes,
62
+ element,
63
+ children
64
+ } = props;
65
+ const path = ReactEditor.findPath(editor, element);
66
+ const canDraggable = DRAGGABLE_TYPES.indexOf(element?.type) > -1;
67
+ const {
68
+ drop
69
+ } = useEditorContext();
70
+ const id = `${element.type}_${[...path].join("|")}`;
71
+ const {
72
+ moved
73
+ } = element;
74
+ useEffect(() => {
75
+ if (moved) {
76
+ Transforms.removeNodes(editor, {
77
+ at: path
78
+ });
79
+ }
80
+ }, [moved]);
81
+ const handleOnDrag = isDragging => {
82
+ setDragging(isDragging);
83
+ };
84
+ return canDraggable ? /*#__PURE__*/_jsxs(Box, {
85
+ ...attributes,
86
+ component: "div",
87
+ className: `${dragging ? "dragging" : ""}`,
88
+ sx: classes.root,
89
+ children: [/*#__PURE__*/_jsx(Droppable, {
90
+ id: id,
91
+ classes: classes
92
+ }), children, /*#__PURE__*/_jsx(Draggable, {
93
+ id: id,
94
+ classes: classes,
95
+ onDrag: handleOnDrag
96
+ })]
97
+ }, `${id}_${drop}`) : children;
98
+ };
99
+ export default DragHandle;
@@ -0,0 +1,41 @@
1
+ import React, { useEffect } from "react";
2
+ import { useDraggable } from "@dnd-kit/core";
3
+ import { Box } from "@mui/material";
4
+ import DragIndicatorIcon from "@mui/icons-material/DragIndicator";
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ const Draggable = props => {
7
+ const {
8
+ id,
9
+ classes,
10
+ onDrag
11
+ } = props;
12
+ const {
13
+ attributes: dragAttributes,
14
+ listeners,
15
+ setNodeRef,
16
+ isDragging,
17
+ transform
18
+ } = useDraggable({
19
+ id: id
20
+ });
21
+ useEffect(() => {
22
+ if (onDrag) {
23
+ onDrag(isDragging);
24
+ }
25
+ }, [isDragging]);
26
+ const dragStyle = transform ? {
27
+ transform: `translate3d(${transform.x}px, ${transform.y}px, 0)`
28
+ } : undefined;
29
+ return /*#__PURE__*/_jsx(Box, {
30
+ ref: setNodeRef,
31
+ ...listeners,
32
+ ...dragAttributes,
33
+ component: "button",
34
+ className: `dh-para ${isDragging ? "active" : ""}`,
35
+ contentEditable: false,
36
+ style: dragStyle,
37
+ sx: classes.dragHandle,
38
+ children: /*#__PURE__*/_jsx(DragIndicatorIcon, {})
39
+ });
40
+ };
41
+ export default Draggable;
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+ import { useDroppable } from "@dnd-kit/core";
3
+ import { Box } from "@mui/material";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ const Droppable = props => {
6
+ const {
7
+ id,
8
+ classes
9
+ } = props;
10
+ const {
11
+ isOver,
12
+ setNodeRef
13
+ } = useDroppable({
14
+ id: id
15
+ });
16
+ const dropStyle = {
17
+ backgroundColor: isOver ? "green" : undefined
18
+ };
19
+ return /*#__PURE__*/_jsx(Box, {
20
+ ref: setNodeRef,
21
+ component: "div",
22
+ className: `droppable-para`,
23
+ contentEditable: false,
24
+ style: dropStyle,
25
+ sx: classes.dropArea
26
+ });
27
+ };
28
+ export default Droppable;