@flozy/editor 9.3.5 → 9.3.6

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 (31) hide show
  1. package/dist/Editor/ChatEditor.js +1 -1
  2. package/dist/Editor/Elements/DataView/Layouts/DataTypes/Components/MultiSelect.js +422 -0
  3. package/dist/Editor/Elements/DataView/Layouts/DataTypes/MultiSelectType.js +18 -5
  4. package/dist/Editor/Elements/DataView/Layouts/Options/AddOptions.js +5 -1
  5. package/dist/Editor/Elements/DataView/Layouts/Options/EditOption.js +3 -2
  6. package/dist/Editor/Elements/DataView/Layouts/Options/index.js +11 -0
  7. package/dist/Editor/Elements/Embed/Image.js +2 -1
  8. package/dist/Editor/Elements/FreeGrid/FreeGrid.js +44 -9
  9. package/dist/Editor/Elements/FreeGrid/FreeGridBox.js +16 -2
  10. package/dist/Editor/Elements/FreeGrid/FreeGridItem.js +26 -2
  11. package/dist/Editor/Elements/FreeGrid/Options/More.js +7 -2
  12. package/dist/Editor/Elements/Table/TableCell.js +4 -0
  13. package/dist/Editor/assets/svg/ClearAllRounded.js +31 -0
  14. package/dist/Editor/common/RnD/Utils/gridDropItem.js +58 -7
  15. package/dist/Editor/common/RnD/Utils/index.js +3 -0
  16. package/dist/Editor/common/RnD/VirtualElement/ForceAutoAlignment.js +110 -0
  17. package/dist/Editor/common/RnD/VirtualElement/VirtualTextElement.js +112 -0
  18. package/dist/Editor/common/RnD/VirtualElement/helper.js +267 -0
  19. package/dist/Editor/common/RnD/VirtualElement/index.js +185 -102
  20. package/dist/Editor/common/RnD/VirtualElement/styles.js +95 -8
  21. package/dist/Editor/common/RnD/VirtualElement/updateAutoProps.js +5 -3
  22. package/dist/Editor/common/RnD/index.js +50 -5
  23. package/dist/Editor/common/SnackBar/index.js +43 -0
  24. package/dist/Editor/hooks/useAutoScroll.js +38 -0
  25. package/dist/Editor/hooks/useMouseMove.js +5 -2
  26. package/dist/Editor/hooks/useTable.js +4 -1
  27. package/dist/Editor/utils/divider.js +11 -3
  28. package/dist/Editor/utils/freegrid.js +2 -2
  29. package/dist/Editor/utils/helper.js +62 -9
  30. package/dist/Editor/utils/table.js +45 -37
  31. package/package.json +1 -1
@@ -37,7 +37,11 @@ const FreeGridBox = props => {
37
37
  sectionBorderRadius,
38
38
  borderWidth,
39
39
  borderColor,
40
- borderStyle
40
+ borderStyle,
41
+ height_xs,
42
+ marginTop_xs,
43
+ gridArea_xs,
44
+ width_xs
41
45
  } = element;
42
46
  // get values based on breakpoint size
43
47
  const {
@@ -168,12 +172,22 @@ const FreeGridBox = props => {
168
172
  "--gridArea": `${gridArea}`,
169
173
  "--width": `${width}px`,
170
174
  "--height": `${height}px`,
171
- "--zIndex": 100 + arrangeIndex
175
+ "--zIndex": 100 + arrangeIndex,
176
+ "--height_xs": height_xs ? `${height_xs}px` : "auto",
177
+ "--marginTop_xs": marginTop_xs ? `${marginTop_xs}px` : "24px"
178
+ // "--gridArea_xs": gridArea_xs ? gridArea_xs : "unset",
172
179
  },
180
+
173
181
  defaultStyle: {
174
182
  height: `${height}px`,
175
183
  width: `${width}px`
176
184
  },
185
+ dataSets: {
186
+ "data-grid-area-xs": gridArea_xs,
187
+ "data-margin-top-xs": marginTop_xs,
188
+ "data-height-xs": height_xs,
189
+ "data-width-xs": width_xs
190
+ },
177
191
  gridArea: gridArea,
178
192
  onChange: onChange,
179
193
  delta: {
@@ -35,7 +35,11 @@ const FreeGridItem = props => {
35
35
  const {
36
36
  updated_at,
37
37
  childType,
38
- zIndex
38
+ zIndex,
39
+ height_xs,
40
+ width_xs,
41
+ marginTop_xs,
42
+ gridArea_xs
39
43
  } = element;
40
44
  // get values based on breakpoint size
41
45
  const {
@@ -53,6 +57,9 @@ const FreeGridItem = props => {
53
57
  const arrangeIndex = zIndex === undefined ? path[path.length - 1] : zIndex;
54
58
  const [popup, setPopup] = useState(null);
55
59
  const onChangeSettings = () => {};
60
+ // const refInput = useRef();
61
+ // const [virtualHeight, setVirtualHeight] = useState(height || 0);
62
+
56
63
  const onChange = data => {
57
64
  let updateData = {
58
65
  ...data
@@ -108,6 +115,13 @@ const FreeGridItem = props => {
108
115
  Transforms.removeNodes(editor, {
109
116
  at: path
110
117
  });
118
+ const parentPath = Path.parent(path);
119
+ Transforms.setNodes(editor, {
120
+ xs_updatedOn: null,
121
+ updated_at: new Date().getTime()
122
+ }, {
123
+ at: parentPath
124
+ });
111
125
  } catch (err) {
112
126
  console.log(err);
113
127
  }
@@ -253,7 +267,17 @@ const FreeGridItem = props => {
253
267
  "--gridArea": `${gridArea}`,
254
268
  "--width": `${width}px`,
255
269
  "--height": `${height}px`,
256
- "--zIndex": 100 + arrangeIndex
270
+ "--zIndex": 100 + arrangeIndex,
271
+ "--height_xs": height_xs ? `${height_xs}px` : "auto",
272
+ "--marginTop_xs": marginTop_xs ? `${marginTop_xs}px` : "0px"
273
+ // "--gridArea_xs": gridArea_xs ? gridArea_xs : "unset",
274
+ },
275
+
276
+ dataSets: {
277
+ "data-grid-area-xs": gridArea_xs,
278
+ "data-margin-top-xs": marginTop_xs,
279
+ "data-height-xs": height_xs,
280
+ "data-width-xs": width_xs
257
281
  },
258
282
  defaultStyle: {
259
283
  height: `${height}px`,
@@ -5,7 +5,8 @@ import { jsxs as _jsxs } from "react/jsx-runtime";
5
5
  const More = props => {
6
6
  const {
7
7
  handleClick,
8
- translation
8
+ translation,
9
+ breakpoint
9
10
  } = props;
10
11
  return /*#__PURE__*/_jsx(Box, {
11
12
  children: /*#__PURE__*/_jsxs(List, {
@@ -18,7 +19,11 @@ const More = props => {
18
19
  className: "item-wrapper",
19
20
  onClick: handleClick("duplicateSection"),
20
21
  children: translation?.translation("Duplicate Section")
21
- })]
22
+ }), breakpoint === "xs" ? /*#__PURE__*/_jsx(ListItemButton, {
23
+ className: "item-wrapper",
24
+ onClick: handleClick("forceAutoAlignment"),
25
+ children: "Force Auto Alignment"
26
+ }) : null]
22
27
  })
23
28
  });
24
29
  };
@@ -193,6 +193,7 @@ const TableCell = props => {
193
193
  setHoverPath(null);
194
194
  };
195
195
  const onMouseDownInCell = e => {
196
+ setHoverPath(path);
196
197
  if (
197
198
  // for shift selection
198
199
  e.shiftKey && startCellPath?.length && startCellPath.toString() !== path.toString()) {
@@ -376,6 +377,9 @@ const TableCell = props => {
376
377
  setOpenSettings(false);
377
378
  };
378
379
  const onSave = data => {
380
+ const tableProps = table.getTableProps({
381
+ at: path
382
+ });
379
383
  const updateData = {
380
384
  ...data
381
385
  };
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsxs as _jsxs } from "react/jsx-runtime";
3
+ const ClearAllIcon = () => /*#__PURE__*/_jsxs("svg", {
4
+ xmlns: "http://www.w3.org/2000/svg",
5
+ width: "20",
6
+ height: "20",
7
+ viewBox: "0 0 20 20",
8
+ children: [/*#__PURE__*/_jsx("rect", {
9
+ x: "4",
10
+ y: "5",
11
+ width: "12",
12
+ height: "2",
13
+ rx: "1",
14
+ fill: "currentColor"
15
+ }), /*#__PURE__*/_jsx("rect", {
16
+ x: "4",
17
+ y: "9",
18
+ width: "10",
19
+ height: "2",
20
+ rx: "1",
21
+ fill: "currentColor"
22
+ }), /*#__PURE__*/_jsx("rect", {
23
+ x: "4",
24
+ y: "13",
25
+ width: "12",
26
+ height: "2",
27
+ rx: "1",
28
+ fill: "currentColor"
29
+ })]
30
+ });
31
+ export default ClearAllIcon;
@@ -1,6 +1,7 @@
1
- import { Transforms, Node, Path } from "slate";
1
+ import { Transforms, Node, Path, Editor } from "slate";
2
2
  import { ReactEditor } from "slate-react";
3
3
  import { handleNegativeInteger } from "../../../utils/helper";
4
+ import { handleBoxAlignment } from "../VirtualElement/helper";
4
5
  export const ROW_HEIGHT = 50;
5
6
 
6
7
  // const MARGIN_OF = {
@@ -21,9 +22,18 @@ export function updateRows() {}
21
22
  export function updateCols() {}
22
23
  const handleMoveNode = (editor, path, newPath, {
23
24
  isEmpty
24
- }) => {
25
+ }, autoAlign) => {
25
26
  try {
26
- const replaceNode = Node.get(editor, path);
27
+ let replaceNode = Node.get(editor, path);
28
+ if (autoAlign) {
29
+ // reset node for auto alignment in mobile
30
+ replaceNode = {
31
+ ...replaceNode,
32
+ gridArea_xs: null,
33
+ xs_updatedOn: null,
34
+ marginTop_xs: null
35
+ };
36
+ }
27
37
  if (isEmpty) {
28
38
  const toPath = [...newPath, 0];
29
39
  Transforms.insertNodes(editor, [{
@@ -57,9 +67,10 @@ const handleMoveNode = (editor, path, newPath, {
57
67
  * This method will update prop in child node so it will re-render and update the path
58
68
  * @param {*} path - contains the parent section path
59
69
  */
60
- const reRenderChildNodes = (editor, path) => {
70
+ export const reRenderChildNodes = (editor, path) => {
61
71
  try {
62
72
  const sectionNode = Node.get(editor, path);
73
+ console.log("sectionNode", sectionNode);
63
74
  // parent node
64
75
  Transforms.setNodes(editor, {
65
76
  updated_at: new Date().getTime()
@@ -92,7 +103,9 @@ function isContainerElement(editor, moveTopath, props, appenBp) {
92
103
  // get parent node
93
104
  parentNode = Node.get(editor, Path.parent(dragItemPath));
94
105
  }
106
+ console.log("moveTopath", moveTopath, path, parentPath, dragOver);
95
107
  const moveToNode = Node.get(editor, moveTopath);
108
+ console.log("parentNode, moveToNode", parentNode, moveToNode);
96
109
  const leftOfMoveToNode = moveToNode[`left${appenBp}`];
97
110
  if (moveToNode.type === "freegridBox") {
98
111
  if (parentNode.type === "freegridBox") {
@@ -127,6 +140,9 @@ function isContainerElement(editor, moveTopath, props, appenBp) {
127
140
  console.log(err);
128
141
  }
129
142
  }
143
+ const isInsidePath = (from, moveTo) => {
144
+ return Path.isAncestor(from, moveTo);
145
+ };
130
146
  export function onDropItem(props, parentClass) {
131
147
  try {
132
148
  const {
@@ -174,7 +190,17 @@ export function onDropItem(props, parentClass) {
174
190
  }, {
175
191
  at: path
176
192
  });
177
- reRenderChildNodes(editor, from);
193
+ let reRenderSectionPath;
194
+ const [sectionData] = Editor.nodes(editor, {
195
+ at: moveTo,
196
+ match: n => n.type === "freegrid"
197
+ });
198
+ const [sectionNode, sectionPath] = sectionData || [];
199
+ if (needMove && isInsidePath(from, moveTo)) {
200
+ reRenderSectionPath = sectionPath;
201
+ } else {
202
+ reRenderChildNodes(editor, from);
203
+ }
178
204
 
179
205
  // move the node if section parent changed
180
206
  if (needMove) {
@@ -183,10 +209,35 @@ export function onDropItem(props, parentClass) {
183
209
  if (!isEmpty) {
184
210
  newPath = [...newPath, toSectionNode?.children?.length];
185
211
  }
212
+ const moveSectionToSection = from?.length === 2 && moveTo?.length === 2;
213
+
214
+ // const autoAlign = breakpoint === "lg" && moveSectionToSection;
215
+ const autoAlign = breakpoint === "lg";
216
+
217
+ // const boxNode = Node.get(editor, moveTo);
218
+
219
+ if (moveSectionToSection && autoAlign) {
220
+ // auto align in mobile
221
+ Transforms.setNodes(editor, {
222
+ xs_updatedOn: null
223
+ }, {
224
+ at: moveTo
225
+ });
226
+ } else if (autoAlign) {
227
+ Transforms.setNodes(editor, {
228
+ autoAlign: true,
229
+ xs_updatedOn: new Date().getTime()
230
+ }, {
231
+ at: moveTo
232
+ });
233
+ }
186
234
  const rPath = handleMoveNode(editor, path, newPath, {
187
235
  isEmpty
188
- });
189
- reRenderChildNodes(editor, moveTo);
236
+ }, autoAlign);
237
+ reRenderChildNodes(editor, reRenderSectionPath || moveTo);
238
+ if (autoAlign) {
239
+ handleBoxAlignment(editor, sectionNode, sectionPath);
240
+ }
190
241
  return {
191
242
  updated_at: rPath
192
243
  };
@@ -293,4 +293,7 @@ export function getAbsolutePositionY(currentEle) {
293
293
  gridArea,
294
294
  marginTop
295
295
  };
296
+ }
297
+ export function getPathFromElement(element) {
298
+ return element?.dataset.path?.split("|").map(m => parseInt(m));
296
299
  }
@@ -0,0 +1,110 @@
1
+ import { Box } from "@mui/material";
2
+ import { useAutoAlignStyles } from "./styles";
3
+ import { useEffect, useRef } from "react";
4
+ import { ROW_HEIGHT, calculateGridArea, reRenderChildNodes } from "../Utils/gridDropItem";
5
+ import updateAutoProps from "./updateAutoProps";
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ const ROOT_ITEM_CLASS = ".freegrid-item.path-3";
8
+ const getMarginTop = y => {
9
+ const calcMargin = y % ROW_HEIGHT;
10
+ return calcMargin <= 0 ? 0 : calcMargin;
11
+ };
12
+ function ForceAutoAlignment(props) {
13
+ const {
14
+ editor,
15
+ sectionCls,
16
+ path,
17
+ autoAlign,
18
+ setAutoAlign
19
+ } = props;
20
+ const classes = useAutoAlignStyles();
21
+ const virtualRef = useRef();
22
+ useEffect(() => {
23
+ let timeoutId;
24
+ if (virtualRef?.current && autoAlign) {
25
+ timeoutId = setTimeout(() => {
26
+ const allData = calculateProps(path, virtualRef?.current, ROOT_ITEM_CLASS, []);
27
+ updateAutoProps(editor, allData, "xs", true);
28
+ const currentSectionPath = path.split("|").map(m => parseInt(m));
29
+ reRenderChildNodes(editor, currentSectionPath);
30
+ setAutoAlign(false);
31
+ }, 100);
32
+ }
33
+ return () => {
34
+ if (timeoutId) {
35
+ clearTimeout(timeoutId);
36
+ }
37
+ };
38
+ }, [autoAlign, virtualRef?.current]);
39
+ const calculateProps = (curPath, dom, domClass, allData, parentDom) => {
40
+ const rect = dom?.getBoundingClientRect();
41
+ const bufferHeight = parentDom ? 0 : 12;
42
+ const sectionProps = {
43
+ path: curPath,
44
+ props: {
45
+ height: rect?.height + bufferHeight
46
+ }
47
+ };
48
+ const itemsData = [];
49
+ const items = dom.querySelectorAll(domClass);
50
+ const nextItemPathLength = curPath?.split("|").length + 2;
51
+ // let sectionHeight = 12;
52
+ for (let i = 0; i < items.length; i++) {
53
+ const itemRect = items[i]?.getBoundingClientRect();
54
+ if (items[i]?.classList.contains("type_box")) {
55
+ allData = calculateProps(items[i]?.dataset.path, items[i], `.freegrid-item.path-${nextItemPathLength}`, allData, dom);
56
+ } else {
57
+ const y = Math.abs(rect.top - itemRect?.top);
58
+ itemsData.push({
59
+ path: items[i]?.dataset.path,
60
+ props: {
61
+ top: y,
62
+ left: 24,
63
+ marginTop: getMarginTop(y),
64
+ width: itemRect?.width,
65
+ height: itemRect?.height,
66
+ gridArea: calculateGridArea(y)
67
+ }
68
+ });
69
+ // sectionHeight += itemRect?.height;
70
+ }
71
+ }
72
+
73
+ if (dom?.classList.contains("type_box") && parentDom) {
74
+ const parentDomRect = parentDom?.getBoundingClientRect();
75
+ const y = Math.abs(parentDomRect.top - rect?.top);
76
+ sectionProps.props.gridArea = calculateGridArea(y);
77
+ sectionProps.props.left = 24;
78
+ sectionProps.props.marginTop = getMarginTop(y);
79
+ sectionProps.props.width = rect?.width;
80
+ }
81
+ allData = [sectionProps, [...allData, ...itemsData]]?.flat();
82
+ return allData;
83
+ };
84
+ const getItems = () => {
85
+ const cloneNode = document.querySelector(sectionCls)?.cloneNode(true);
86
+ const items = cloneNode?.querySelectorAll(ROOT_ITEM_CLASS) || [];
87
+ if (!cloneNode || !items?.length) {
88
+ return;
89
+ }
90
+ let itemsHTML = "";
91
+ for (let i = 0; i < items?.length; i++) {
92
+ items[i].classList.add("exclude-virtual");
93
+ itemsHTML += items[i].outerHTML;
94
+ }
95
+ return itemsHTML;
96
+ };
97
+ return /*#__PURE__*/_jsx(Box, {
98
+ className: "force-mobile-virtual-mode",
99
+ ref: virtualRef,
100
+ sx: {
101
+ visibility: "hidden",
102
+ ...classes.root
103
+ },
104
+ "aria-hidden": "true",
105
+ dangerouslySetInnerHTML: {
106
+ __html: getItems()
107
+ }
108
+ });
109
+ }
110
+ export default ForceAutoAlignment;
@@ -0,0 +1,112 @@
1
+ import { useEffect, useRef } from "react";
2
+ import { Path, Transforms } from "slate";
3
+ import { getNode } from "../../../utils/helper";
4
+ import { ROW_HEIGHT } from "../Utils/gridDropItem";
5
+ import { findFirstRowOverlap, getGridArea, handleContainers, moveOverlappedItems } from "./helper";
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ const updateTextHeight = (editor, path, height) => {
8
+ if (!height) {
9
+ return;
10
+ }
11
+ const parentPath = Path.parent(path);
12
+ const currentNode = getNode(editor, parentPath);
13
+ const gridItems = currentNode?.children || [];
14
+ const isNewlyAddedElement = gridItems.some(gridItem => !gridItem.gridArea_xs && gridItem.type !== "paragraph");
15
+ if (isNewlyAddedElement) {
16
+ return;
17
+ }
18
+ const textItemIndex = path[parentPath.length];
19
+ const textItem = gridItems.find((_, index) => textItemIndex === index);
20
+ const {
21
+ marginTop_xs: marginTop,
22
+ gridArea_xs: gridArea,
23
+ height_xs
24
+ } = textItem;
25
+ const oldHeight = height_xs + marginTop;
26
+ const newHeight = height + marginTop;
27
+ const extraHeight = newHeight - oldHeight;
28
+ let containerExtraHeight = extraHeight;
29
+ if (extraHeight > 0) {
30
+ const [startRow] = getGridArea(gridArea);
31
+ const newRows = Math.floor(newHeight / ROW_HEIGHT) + 1;
32
+ const endRow = startRow + newRows;
33
+ const firstOverlappedRow = findFirstRowOverlap(gridItems, startRow, endRow, textItemIndex);
34
+ if (firstOverlappedRow) {
35
+ const moveRows = endRow - firstOverlappedRow;
36
+ moveOverlappedItems(editor, moveRows, gridItems, parentPath, textItemIndex, startRow);
37
+ containerExtraHeight += moveRows * ROW_HEIGHT;
38
+ }
39
+
40
+ // handle containers (box and section)
41
+ const containerData = handleContainers(editor, parentPath, containerExtraHeight);
42
+ containerData.forEach(container => {
43
+ const {
44
+ moveRows,
45
+ containerNode,
46
+ containerPath,
47
+ newHeight,
48
+ childIndex,
49
+ lastChildStartRow
50
+ } = container;
51
+ if (moveRows) {
52
+ moveOverlappedItems(editor, moveRows, containerNode?.children, containerPath, childIndex, lastChildStartRow);
53
+ }
54
+ Transforms.setNodes(editor, {
55
+ height_xs: newHeight,
56
+ xs_updatedOn: new Date().getTime()
57
+ }, {
58
+ at: containerPath
59
+ });
60
+ });
61
+ Transforms.setNodes(editor, {
62
+ height_xs: height
63
+ }, {
64
+ at: path
65
+ });
66
+ }
67
+ };
68
+ function VirtualTextElement(props) {
69
+ const {
70
+ dataSets,
71
+ getCurrentEle,
72
+ path,
73
+ editor
74
+ } = props;
75
+ const textRef = useRef(null);
76
+ const currElement = getCurrentEle();
77
+ useEffect(() => {
78
+ const observer = new ResizeObserver(([entry]) => {
79
+ if (entry) {
80
+ const {
81
+ height
82
+ } = entry.contentRect;
83
+ updateTextHeight(editor, path, height);
84
+ }
85
+ });
86
+ const elementRef = textRef?.current;
87
+ if (elementRef) {
88
+ observer.observe(elementRef);
89
+ }
90
+ return () => {
91
+ const elementRef = textRef?.current;
92
+ if (elementRef) {
93
+ observer.unobserve(elementRef);
94
+ }
95
+ observer.disconnect();
96
+ };
97
+ }, []);
98
+ return /*#__PURE__*/_jsx("div", {
99
+ style: {
100
+ position: "fixed",
101
+ width: dataSets["data-width-xs"],
102
+ minHeight: "fit-content",
103
+ visibility: "hidden",
104
+ pointerEvents: "none",
105
+ right: 0,
106
+ top: 0
107
+ },
108
+ ref: textRef,
109
+ children: currElement?.innerText
110
+ });
111
+ }
112
+ export default VirtualTextElement;