@flozy/editor 4.5.8 → 4.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. package/dist/Editor/ChatEditor.js +8 -0
  2. package/dist/Editor/CommonEditor.js +16 -15
  3. package/dist/Editor/Editor.css +19 -1
  4. package/dist/Editor/Elements/AI/AIInput.js +4 -5
  5. package/dist/Editor/Elements/AI/PopoverAIInput.js +40 -29
  6. package/dist/Editor/Elements/AI/Styles.js +1 -1
  7. package/dist/Editor/Elements/Button/EditorButton.js +8 -4
  8. package/dist/Editor/Elements/Embed/Embed.css +1 -1
  9. package/dist/Editor/Elements/Embed/Image.js +4 -3
  10. package/dist/Editor/Elements/Embed/Video.js +9 -7
  11. package/dist/Editor/Elements/Form/Form.js +0 -1
  12. package/dist/Editor/Elements/Form/Workflow/FormWorkflow.js +3 -12
  13. package/dist/Editor/Elements/FreeGrid/FreeGrid.js +30 -0
  14. package/dist/Editor/Elements/FreeGrid/FreeGridBox.js +2 -0
  15. package/dist/Editor/Elements/FreeGrid/FreeGridItem.js +3 -1
  16. package/dist/Editor/Elements/FreeGrid/Options/AddElement.js +4 -0
  17. package/dist/Editor/Elements/FreeGrid/Options/sectionItemOptions.js +5 -1
  18. package/dist/Editor/Elements/FreeGrid/styles.js +82 -1
  19. package/dist/Editor/Elements/Signature/SignaturePopup.js +24 -7
  20. package/dist/Editor/Elements/Signature/Signed.js +1 -1
  21. package/dist/Editor/Elements/SimpleText/index.js +7 -8
  22. package/dist/Editor/Elements/Table/TableRow.js +1 -1
  23. package/dist/Editor/Styles/EditorStyles.js +2 -2
  24. package/dist/Editor/Toolbar/Mini/MiniToolbar.js +1 -2
  25. package/dist/Editor/Toolbar/PopupTool/ButtonTemplatesCard.js +35 -29
  26. package/dist/Editor/Toolbar/PopupTool/FullViewCard.js +35 -30
  27. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/index.js +4 -4
  28. package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +22 -38
  29. package/dist/Editor/Toolbar/PopupTool/TextFormat.js +0 -1
  30. package/dist/Editor/Toolbar/PopupTool/index.js +5 -5
  31. package/dist/Editor/common/FontLoader/FontLoader.js +6 -6
  32. package/dist/Editor/common/Icon.js +1 -1
  33. package/dist/Editor/common/LinkSettings/index.js +3 -2
  34. package/dist/Editor/common/LinkSettings/navOptions.js +4 -1
  35. package/dist/Editor/common/RnD/DragOver/index.js +0 -1
  36. package/dist/Editor/common/RnD/ElementOptions/Actions.js +14 -1
  37. package/dist/Editor/common/RnD/ElementOptions/styles.js +5 -0
  38. package/dist/Editor/common/RnD/ElementSettings/OtherSettings/Settings.js +1 -1
  39. package/dist/Editor/common/RnD/ElementSettings/OtherSettings/Signature.js +53 -0
  40. package/dist/Editor/common/RnD/ElementSettings/OtherSettings/index.js +32 -2
  41. package/dist/Editor/common/RnD/ElementSettings/settingsConstants.js +2 -1
  42. package/dist/Editor/common/RnD/RnDCopy.js +2 -0
  43. package/dist/Editor/common/RnD/Utils/gridDropItem.js +5 -3
  44. package/dist/Editor/common/RnD/VirtualElement/index.js +1 -1
  45. package/dist/Editor/common/RnD/index.js +67 -37
  46. package/dist/Editor/common/Section/index.js +11 -1
  47. package/dist/Editor/common/Section/styles.js +16 -0
  48. package/dist/Editor/common/StyleBuilder/embedVideoStyle.js +19 -0
  49. package/dist/Editor/common/iconslist.js +23 -0
  50. package/dist/Editor/helper/RnD/focusNode.js +74 -0
  51. package/dist/Editor/helper/index.js +5 -2
  52. package/dist/Editor/helper/theme.js +2 -2
  53. package/dist/Editor/hooks/useBreakpoints.js +1 -1
  54. package/dist/Editor/hooks/useDragging.js +51 -0
  55. package/dist/Editor/hooks/useMouseMove.js +5 -4
  56. package/dist/Editor/hooks/withCommon.js +1 -0
  57. package/dist/Editor/hooks/withRestrictedNodes.js +48 -0
  58. package/dist/Editor/utils/Decorators/highlightSelection.js +16 -0
  59. package/dist/Editor/utils/Decorators/index.js +3 -2
  60. package/dist/Editor/utils/RnD/RnDCtrlCmds.js +16 -1
  61. package/dist/Editor/utils/SlateUtilityFunctions.js +33 -5
  62. package/dist/Editor/utils/customHooks/useResize.js +4 -5
  63. package/dist/Editor/utils/events.js +71 -0
  64. package/dist/Editor/utils/helper.js +16 -0
  65. package/package.json +1 -1
@@ -139,10 +139,10 @@ export const groupByBreakpoint = (styleProps, theme) => {
139
139
  return a;
140
140
  }, {});
141
141
  return {
142
- [theme.breakpoints.up("lg")]: {
142
+ [theme?.breakpoints?.up("md")]: {
143
143
  ...groupedLG
144
144
  },
145
- [theme.breakpoints.between("xs", "md")]: {
145
+ [theme?.breakpoints?.between("xs", "md")]: {
146
146
  ...groupedXS
147
147
  }
148
148
  };
@@ -1,6 +1,6 @@
1
1
  import { useMediaQuery } from "@mui/material";
2
2
  export const STIMULATOR_MOCK = {
3
- xs: "@media (min-width: 1200px) and (max-width: 7680px)"
3
+ xs: "@media (min-width: 1200px) and (max-width: 1980px)"
4
4
  };
5
5
  export const isStimulator = () => {
6
6
  try {
@@ -0,0 +1,51 @@
1
+ import { useState, useCallback, useRef } from "react";
2
+ const initialState = {
3
+ id: null,
4
+ active: false,
5
+ isDragging: 0,
6
+ dragOver: false,
7
+ dragOverType: null
8
+ };
9
+ const useDragging = () => {
10
+ const [dragging, setDragging] = useState({
11
+ ...initialState
12
+ });
13
+
14
+ // Ref to keep the latest draggingStatus
15
+ const draggingRef = useRef(dragging);
16
+ const updateDragging = newStatus => {
17
+ setDragging(prevStatus => {
18
+ const updatedStatus = {
19
+ ...prevStatus,
20
+ ...newStatus
21
+ };
22
+ draggingRef.current = updatedStatus; // Update the ref to hold latest status
23
+ return updatedStatus;
24
+ });
25
+ };
26
+ const startDragging = useCallback(data => {
27
+ // console.log("dragissue", "startDragging");
28
+ updateDragging({
29
+ ...data
30
+ });
31
+ }, []);
32
+ const stopDragging = useCallback(() => {
33
+ // console.log("dragissue", "stopDragging");
34
+ updateDragging({
35
+ ...initialState
36
+ });
37
+ }, []);
38
+ const setDragOver = useCallback(isOver => {
39
+ updateDragging({
40
+ dragOver: isOver
41
+ });
42
+ }, []);
43
+ return {
44
+ dragging,
45
+ draggingRef,
46
+ startDragging,
47
+ stopDragging,
48
+ setDragOver
49
+ };
50
+ };
51
+ export default useDragging;
@@ -98,10 +98,11 @@ export const EditorProvider = ({
98
98
  updateDragging,
99
99
  fontFamilies,
100
100
  setFontFamilies
101
- }), [path, editor?.selection, selectedPath, selectedElement, dragging.active, dragging.isDragging, dragging.dragOver, contextMenu, openAI, popupType, drop
102
- // fontFamilies,
103
- ]);
104
-
101
+ }), [path, editor?.selection, selectedPath, selectedElement,
102
+ // dragging.active,
103
+ // dragging.isDragging,
104
+ // dragging.dragOver,
105
+ contextMenu, openAI, popupType, drop]);
105
106
  return /*#__PURE__*/_jsx(EditorContext.Provider, {
106
107
  value: otherValues,
107
108
  children: children
@@ -9,6 +9,7 @@ import withLayout from "../plugins/withLayout";
9
9
  import withHtml from "../plugins/withHTML";
10
10
  import withErrorHandling from "./withErrorHandling";
11
11
  import withCustomDeleteBackward from "../plugins/withCustomDeleteBackward";
12
+ import withRestrictedNodes from "./withRestrictedNodes";
12
13
  const withCommon = (props, {
13
14
  needLayout = false,
14
15
  isChatEditor = false
@@ -0,0 +1,48 @@
1
+ import { Editor } from "slate";
2
+
3
+ // Custom insertText that prevents updates in specific node types
4
+ const withRestrictedNodes = editor => {
5
+ const {
6
+ insertText,
7
+ deleteBackward
8
+ } = editor;
9
+
10
+ // Override insertText
11
+ editor.insertText = text => {
12
+ const {
13
+ selection
14
+ } = editor;
15
+ if (selection) {
16
+ const [node] = Editor.node(editor, selection);
17
+ console.log(node);
18
+
19
+ // Prevent insertText if node type matches
20
+ if (node && node.type === "restrictedType") {
21
+ return; // Skip inserting text
22
+ }
23
+ }
24
+
25
+ // Call the original insertText if node type does not match
26
+ insertText(text);
27
+ };
28
+
29
+ // Similarly override deleteBackward if needed
30
+ editor.deleteBackward = (...args) => {
31
+ const {
32
+ selection
33
+ } = editor;
34
+ if (selection) {
35
+ const [node] = Editor.node(editor, selection);
36
+
37
+ // Prevent deletion if node type matches
38
+ if (node && node.type === "restrictedType") {
39
+ return; // Skip deleting text
40
+ }
41
+ }
42
+
43
+ // Call the original deleteBackward if node type does not match
44
+ deleteBackward(...args);
45
+ };
46
+ return editor;
47
+ };
48
+ export default withRestrictedNodes;
@@ -0,0 +1,16 @@
1
+ import { Editor, Range, Text } from "slate";
2
+ const highlightSelection = ([node, path], editor = {}) => {
3
+ if (Text.isText(node) && editor?.selection) {
4
+ const intersection = Range.intersection(editor.selection, Editor.range(editor, path));
5
+ if (intersection == null) {
6
+ return [];
7
+ }
8
+ const range = {
9
+ highlight: true,
10
+ ...intersection
11
+ };
12
+ return [range];
13
+ }
14
+ return [];
15
+ };
16
+ export default highlightSelection;
@@ -1,5 +1,6 @@
1
+ import highlightSelection from "./highlightSelection";
1
2
  import link from "./link";
2
- const decorators = d => {
3
- return [...link(d)];
3
+ const decorators = (d, editor) => {
4
+ return [...link(d, editor), ...highlightSelection(d, editor)];
4
5
  };
5
6
  export default decorators;
@@ -1,6 +1,7 @@
1
1
  import { Editor, Transforms, Node, Path } from "slate";
2
2
  import { isSelectionInNodeType, getCaretPosition, onPasteRnDNode, bringItemToFB } from "../../helper";
3
3
  import focusOnNewItem from "../../helper/RnD/focusOnNewItem";
4
+ import { ReactEditor } from "slate-react";
4
5
  const RND_ITEM_TYPES = ["freegrid", "freegridItem", "freegridBox"];
5
6
  const parsePath = path => path?.split("|").map(m => parseInt(m));
6
7
  const selectAll = (event, {
@@ -157,7 +158,7 @@ const onBringBack = (event, {
157
158
  console.log(err);
158
159
  }
159
160
  };
160
- export const onInsertFragment = async ({
161
+ export const onInsertFragment = ({
161
162
  editor,
162
163
  slateNodes
163
164
  }) => {
@@ -181,6 +182,20 @@ export const onInsertFragment = async ({
181
182
  setSelectedElement: window.updateSelectedItem
182
183
  });
183
184
  }
185
+ } else {
186
+ ReactEditor.focus(editor);
187
+ if (editor.children.length === 0) {
188
+ Transforms.insertNodes(editor, {
189
+ text: ""
190
+ }, {
191
+ at: [0]
192
+ });
193
+ }
194
+ Transforms.insertNodes(editor, [{
195
+ ...slateNodes
196
+ }], {
197
+ at: [editor.children.length - 1]
198
+ });
184
199
  }
185
200
  } catch (err) {
186
201
  console.log(err);
@@ -34,7 +34,7 @@ import SimpleText from "../Elements/SimpleText";
34
34
  import CheckList from "../Elements/List/CheckList";
35
35
  import { getTextColor, isEmptyTextNode } from "../helper";
36
36
  import Attachments from "../Elements/Attachments/Attachments";
37
- import { getBreakPointsValue } from "../helper/theme";
37
+ import { getBreakPointsValue, groupByBreakpoint } from "../helper/theme";
38
38
  import Variables from "../Elements/Variables/Variable";
39
39
  import insertNewLine from "./insertNewLine";
40
40
  import Divider from "../Elements/Divider/Divider";
@@ -216,10 +216,20 @@ export const getMarked = (leaf, children, theme) => {
216
216
  className: className,
217
217
  component: "span",
218
218
  sx: {
219
- ...wrapThemeBreakpoints({
220
- lg: sizeMap[leaf.fontSize] || leaf.fontSize,
221
- ...getBreakPointsValue(leaf.fontSize, null, "overrideText")
222
- }, "fontSize", theme),
219
+ ...groupByBreakpoint({
220
+ fontSize: {
221
+ lg: sizeMap[leaf.fontSize] || leaf.fontSize,
222
+ ...getBreakPointsValue(leaf.fontSize, null, "overrideText")
223
+ }
224
+ }, theme),
225
+ // ...wrapThemeBreakpoints(
226
+ // {
227
+ // lg: sizeMap[leaf.fontSize] || leaf.fontSize,
228
+ // ...getBreakPointsValue(leaf.fontSize, null, "overrideText"),
229
+ // },
230
+ // "fontSize",
231
+ // theme
232
+ // ),
223
233
  // fontSize: {
224
234
  // lg: sizeMap[leaf.fontSize] || leaf.fontSize,
225
235
  // ...getBreakPointsValue(leaf.fontSize, null, "overrideText"),
@@ -232,6 +242,15 @@ export const getMarked = (leaf, children, theme) => {
232
242
  })
233
243
  });
234
244
  }
245
+ if (leaf.highlight) {
246
+ children = /*#__PURE__*/_jsx("span", {
247
+ style: {
248
+ background: "#EAEBFE",
249
+ color: "inherit"
250
+ },
251
+ children: children
252
+ });
253
+ }
235
254
  if (leaf.decoration === "link") {
236
255
  children = /*#__PURE__*/_jsx("a", {
237
256
  style: {
@@ -529,6 +548,15 @@ export const getBlock = props => {
529
548
  return /*#__PURE__*/_jsx(Code, {
530
549
  ...props
531
550
  });
551
+ // RnD Focus Node
552
+ case "temp":
553
+ return /*#__PURE__*/_jsx("span", {
554
+ ...attributes,
555
+ ...element.attr,
556
+ className: "temp-focus-node",
557
+ contentEditable: false,
558
+ children: children
559
+ });
532
560
  default:
533
561
  return /*#__PURE__*/_jsx(SimpleText, {
534
562
  ...props,
@@ -10,7 +10,7 @@ const useResize = ({
10
10
  const defaultSize = getBreakPointsValue(allSize);
11
11
  const {
12
12
  width,
13
- height = 370
13
+ height
14
14
  } = parentDOM?.getBoundingClientRect() || {
15
15
  ...defaultSize
16
16
  };
@@ -50,11 +50,10 @@ const useResize = ({
50
50
  setSize(currentSize => {
51
51
  const calcWidth = (currentSize.width || width) + e.movementX;
52
52
  const cWP = calcWidth / width * 100;
53
- const calcHeight = (parseInt(currentSize.height) || height) + e.movementY;
54
53
  const calc = {
55
- width: Math.max(calcWidth, 140),
56
- height: Math.max(calcHeight, 50),
57
- widthInPercent: cWP > 100 ? 100 : Math.max(cWP, 15)
54
+ width: calcWidth,
55
+ height: (parseInt(currentSize.height) || height) + e.movementY,
56
+ widthInPercent: cWP > 100 ? 100 : cWP
58
57
  };
59
58
  latest = calc;
60
59
  return calc;
@@ -282,6 +282,77 @@ export const enterEvent = (e, editor, isMobile) => {
282
282
  default:
283
283
  }
284
284
  }
285
+ // Handle blockquote splitting
286
+ const [blockquote] = Editor.nodes(editor, {
287
+ match: n => Element.isElement(n) && n.type === "blockquote"
288
+ });
289
+ if (blockquote) {
290
+ e.preventDefault();
291
+ const {
292
+ selection
293
+ } = editor;
294
+ if (selection && Range.isCollapsed(selection)) {
295
+ const isAtEnd = Editor.isEnd(editor, selection.anchor, blockquote[1]);
296
+ if (isAtEnd) {
297
+ Transforms.insertNodes(editor, {
298
+ type: "paragraph",
299
+ children: [{
300
+ text: ""
301
+ }]
302
+ });
303
+ const newLocation = Editor.after(editor, selection);
304
+ if (newLocation) {
305
+ Transforms.select(editor, newLocation);
306
+ }
307
+ } else {
308
+ Transforms.splitNodes(editor, {
309
+ always: true
310
+ });
311
+ Transforms.setNodes(editor, {
312
+ type: "paragraph"
313
+ }, {
314
+ at: editor.selection
315
+ });
316
+ }
317
+ }
318
+ return;
319
+ }
320
+ } catch (err) {
321
+ console.log(err);
322
+ }
323
+ };
324
+ export const upDownArrowKeyEvents = (e, editor) => {
325
+ try {
326
+ const {
327
+ selection
328
+ } = editor;
329
+ if (!selection || Range.isCollapsed(selection)) {
330
+ return;
331
+ }
332
+ const parentPath = selection.anchor.path.slice(0, -1);
333
+ const nextNodePath = [...parentPath];
334
+ const index = parentPath[parentPath.length - 1];
335
+ const parentNode = Editor.parent(editor, parentPath);
336
+ if (parentNode.children[index + 1]) {
337
+ nextNodePath[parentPath.length - 1] += 1;
338
+ } else {
339
+ return;
340
+ }
341
+ Transforms.move(editor, {
342
+ distance: 0,
343
+ unit: 'offset',
344
+ reverse: false
345
+ });
346
+ Transforms.select(editor, {
347
+ anchor: {
348
+ path: nextNodePath,
349
+ offset: 0
350
+ },
351
+ focus: {
352
+ path: nextNodePath,
353
+ offset: 0
354
+ }
355
+ });
285
356
  } catch (err) {
286
357
  console.log(err);
287
358
  }
@@ -471,6 +471,22 @@ export const editorThemeStyle = {
471
471
  export const getEditorTheme = (themeType = "light") => {
472
472
  return editorThemeStyle[themeType] || {};
473
473
  };
474
+ export const isFreeGrid = (nodes, types = ["freegrid", "freegridItem", "freegridBox"]) => {
475
+ try {
476
+ for (const node of nodes) {
477
+ if (types.includes(node.type)) {
478
+ return true;
479
+ }
480
+ if (node.children && isFreeGrid(node.children, types)) {
481
+ return true;
482
+ }
483
+ }
484
+ return false;
485
+ } catch (err) {
486
+ console.log("isFreeGrid error:", err);
487
+ return false;
488
+ }
489
+ };
474
490
  export const getPreviousNode = editor => {
475
491
  try {
476
492
  const parentPath = Path.parent(editor?.selection?.anchor?.path);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flozy/editor",
3
- "version": "4.5.8",
3
+ "version": "4.6.0",
4
4
  "description": "An Editor for flozy app brain",
5
5
  "files": [
6
6
  "dist"