@flozy/editor 4.5.9 → 4.6.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -439,12 +439,14 @@ const CommonEditor = /*#__PURE__*/forwardRef((props, ref) => {
439
439
  }
440
440
  return style;
441
441
  }, [pageBgImage, pageColor]);
442
- const handleContextMenu = e => {
443
- if (!readOnly) {
444
- e.preventDefault();
445
- e.stopPropagation();
446
- }
447
- };
442
+
443
+ // const handleContextMenu = (e) => {
444
+ // if (!readOnly) {
445
+ // e.preventDefault();
446
+ // e.stopPropagation();
447
+ // }
448
+ // };
449
+
448
450
  const handleCursorScroll = container => {
449
451
  try {
450
452
  if (!customProps?.isMobile) {
@@ -481,8 +483,9 @@ const CommonEditor = /*#__PURE__*/forwardRef((props, ref) => {
481
483
  style: {
482
484
  ...dotBg
483
485
  },
484
- "data-breakpoint": breakpoint,
485
- onContextMenu: handleContextMenu,
486
+ "data-breakpoint": breakpoint
487
+ // onContextMenu={handleContextMenu}
488
+ ,
486
489
  children: /*#__PURE__*/_jsxs(Slate, {
487
490
  editor: editor,
488
491
  initialValue: value,
@@ -1206,4 +1206,17 @@ blockquote {
1206
1206
 
1207
1207
  .freegrid-section {
1208
1208
  max-width: 100% !important;
1209
+ }
1210
+
1211
+ .divider-settings {
1212
+ display: none;
1213
+ position: absolute;
1214
+ }
1215
+
1216
+ .dividerComponent:hover {
1217
+ padding: 10px 0;
1218
+ }
1219
+
1220
+ .dividerComponent:hover .divider-settings {
1221
+ display: block;
1209
1222
  }
@@ -1,30 +1,129 @@
1
- import React from "react";
1
+ import React, { useState } from "react";
2
+ import { useEditorContext, useEditorSelection } from "../../hooks/useMouseMove";
3
+ import { ReactEditor, useSlateStatic } from "slate-react";
4
+ import { IconButton, Tooltip } from "@mui/material";
5
+ import { GridSettingsIcon } from "../../common/iconslist";
6
+ import DividerPopup from "./DividerPopup";
7
+ import { Transforms } from "slate";
2
8
  import { jsx as _jsx } from "react/jsx-runtime";
3
9
  import { jsxs as _jsxs } from "react/jsx-runtime";
4
10
  const Divider = props => {
5
11
  const {
6
12
  attributes,
7
- children
13
+ children,
14
+ element,
15
+ customProps
8
16
  } = props;
17
+ const {
18
+ theme
19
+ } = useEditorContext();
20
+ const {
21
+ borderColor = theme?.palette?.text?.primary || '#0F172A',
22
+ borderWidth = '1px',
23
+ borderStyle = 'solid'
24
+ } = element;
25
+ const {
26
+ readOnly
27
+ } = customProps;
28
+ const editor = useSlateStatic();
29
+ const path = ReactEditor.findPath(editor, element);
30
+ const [openSettings, setOpenSettings] = useState(false);
31
+ const {
32
+ hoverPath
33
+ } = useEditorContext();
34
+ const [showTool] = useEditorSelection(editor);
35
+ const selected = hoverPath === path.join(",");
36
+ const onSettings = () => {
37
+ setOpenSettings(true);
38
+ };
39
+ const DividerToolbar = ({
40
+ selected,
41
+ showTool,
42
+ onSettings
43
+ }) => {
44
+ return /*#__PURE__*/_jsx("div", {
45
+ contentEditable: false,
46
+ className: "divider-settings",
47
+ style: {
48
+ top: "-20px",
49
+ left: 0
50
+ },
51
+ children: /*#__PURE__*/_jsx(Tooltip, {
52
+ title: "Divider Settings",
53
+ arrow: true,
54
+ children: /*#__PURE__*/_jsx(IconButton, {
55
+ size: "small",
56
+ sx: {
57
+ boxShadow: '0px 0px 4px 0px #00000040',
58
+ borderRadius: '50%'
59
+ },
60
+ onClick: onSettings,
61
+ children: /*#__PURE__*/_jsx(GridSettingsIcon, {})
62
+ })
63
+ })
64
+ });
65
+ };
66
+ const onSave = data => {
67
+ const updateData = {
68
+ ...data
69
+ };
70
+ delete updateData.children;
71
+ Transforms.setNodes(editor, {
72
+ ...updateData
73
+ }, {
74
+ at: path
75
+ });
76
+ onClose();
77
+ };
78
+ const onClose = () => {
79
+ setOpenSettings(false);
80
+ };
81
+ const onDelete = () => {
82
+ if (path) {
83
+ Transforms.removeNodes(editor, {
84
+ at: path
85
+ });
86
+ }
87
+ };
9
88
  return /*#__PURE__*/_jsxs("div", {
10
89
  ...attributes,
11
90
  className: "dividerComponent",
12
- contentEditable: "false",
13
91
  style: {
14
- userSelect: "none"
92
+ userSelect: "none",
93
+ position: 'relative'
15
94
  },
16
- children: [/*#__PURE__*/_jsx("hr", {
17
- contentEditable: "false",
95
+ children: [!readOnly && /*#__PURE__*/_jsx("div", {
96
+ className: `element-root element-selector`,
97
+ contentEditable: false,
98
+ style: {
99
+ zIndex: 1000
100
+ },
101
+ children: /*#__PURE__*/_jsx(DividerToolbar, {
102
+ selected: selected,
103
+ showTool: showTool,
104
+ onSettings: onSettings
105
+ })
106
+ }), /*#__PURE__*/_jsx("hr", {
107
+ contentEditable: false,
18
108
  className: "editorDivider",
19
109
  style: {
20
- userSelect: "none"
110
+ userSelect: "none",
111
+ borderTop: !borderColor?.includes("linear") ? `${borderWidth} ${borderStyle} ${borderColor}` : `transparent`,
112
+ backgroundImage: borderColor?.includes("linear") ? borderColor : "none",
113
+ height: borderColor?.includes("linear") ? borderWidth : undefined
21
114
  }
22
115
  }), /*#__PURE__*/_jsx("span", {
23
116
  style: {
24
117
  display: "none"
25
118
  },
26
119
  children: children
27
- })]
120
+ }), openSettings ? /*#__PURE__*/_jsx(DividerPopup, {
121
+ element: element,
122
+ onSave: onSave,
123
+ onClose: onClose,
124
+ onDelete: onDelete,
125
+ customProps: customProps
126
+ }) : null]
28
127
  });
29
128
  };
30
129
  export default Divider;
@@ -0,0 +1,24 @@
1
+ import React from "react";
2
+ import StyleBuilder from "../../common/StyleBuilder";
3
+ import dividerStyle from "../../common/StyleBuilder/dividerStyles";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ const DividerPopup = props => {
6
+ const {
7
+ element,
8
+ onSave,
9
+ onClose,
10
+ onDelete,
11
+ customProps
12
+ } = props;
13
+ return /*#__PURE__*/_jsx(StyleBuilder, {
14
+ title: "Divider",
15
+ type: "dividerStyle",
16
+ element: element,
17
+ onSave: onSave,
18
+ onClose: onClose,
19
+ renderTabs: dividerStyle,
20
+ onDelete: onDelete,
21
+ customProps: customProps
22
+ });
23
+ };
24
+ export default DividerPopup;
@@ -6,14 +6,16 @@ const EmojiPicker = props => {
6
6
  const {
7
7
  onEmojiSelect,
8
8
  onClose,
9
- theme = 'light'
9
+ theme = 'light',
10
+ ...rest
10
11
  } = props;
11
12
  return /*#__PURE__*/_jsx(_Fragment, {
12
13
  children: /*#__PURE__*/_jsx(Picker, {
13
14
  data: data,
14
15
  onEmojiSelect: onEmojiSelect,
15
16
  onClickOutside: onClose,
16
- theme: theme
17
+ theme: theme,
18
+ ...rest
17
19
  })
18
20
  });
19
21
  };
@@ -47,7 +47,8 @@ const FreeGrid = props => {
47
47
  } = element;
48
48
  const {
49
49
  readOnly,
50
- customSX
50
+ customSX,
51
+ hideTools
51
52
  } = customProps;
52
53
  const {
53
54
  updated_at,
@@ -342,6 +343,26 @@ const FreeGrid = props => {
342
343
  at: [...insertAt]
343
344
  });
344
345
  break;
346
+ case "addDivider":
347
+ Transforms.insertNodes(editor, [{
348
+ type: "freegridItem",
349
+ childType: "divider",
350
+ children: [{
351
+ type: "divider",
352
+ children: [{
353
+ text: ""
354
+ }]
355
+ }],
356
+ gridArea: "3 / 1 / 4 / 2",
357
+ left: 50,
358
+ marginTop: 0,
359
+ top: 0,
360
+ width: 170,
361
+ height: 30
362
+ }], {
363
+ at: [...insertAt]
364
+ });
365
+ break;
345
366
  default:
346
367
  }
347
368
  // focus on newly added element
@@ -414,6 +435,7 @@ const FreeGrid = props => {
414
435
  ...getBreakPointsValue(sectionBorderRadius || {}, null, "overrideBorderRadius", true)
415
436
  }
416
437
  }, theme);
438
+ const sectionTypeOptions = (itemOptions?.section || []).filter(f => (hideTools || []).indexOf(f) === -1);
417
439
  return /*#__PURE__*/_jsx(RnD, {
418
440
  id: `freegrid_container_${path.join("|")}_${updated_at}_${breakpoint}`,
419
441
  className: `
@@ -441,7 +463,7 @@ const FreeGrid = props => {
441
463
  bottomLeft: false,
442
464
  bottomRight: false
443
465
  },
444
- actions: itemOptions?.section || [],
466
+ actions: sectionTypeOptions,
445
467
  type: "parent",
446
468
  optionsProps: {
447
469
  placement: "right",
@@ -462,7 +484,8 @@ const FreeGrid = props => {
462
484
  placement: "left",
463
485
  title: "Add Element",
464
486
  props: {
465
- handleClick: handleAddElementClick
487
+ handleClick: handleAddElementClick,
488
+ hideTools: hideTools || []
466
489
  }
467
490
  },
468
491
  more: {
@@ -28,7 +28,8 @@ const FreeGridItem = props => {
28
28
  const editor = useSlateStatic();
29
29
  const path = ReactEditor.findPath(editor, element);
30
30
  const {
31
- readOnly
31
+ readOnly,
32
+ hideTools
32
33
  } = customProps;
33
34
  const {
34
35
  updated_at,
@@ -211,12 +212,13 @@ const FreeGridItem = props => {
211
212
  break;
212
213
  }
213
214
  };
215
+ const itemTypeOptions = (itemOptions[childType] || itemOptions?.default).filter(f => (hideTools || []).indexOf(f) === -1);
214
216
  return /*#__PURE__*/_jsx(RnD, {
215
217
  id: `freegrid_item_${path.join("|")}_${updated_at}_${breakpoint}`,
216
218
  className: `freegrid-item path-${path.length} breakpoint-${breakpoint}`,
217
219
  editor: editor,
218
220
  path: path,
219
- actions: itemOptions[childType] || itemOptions?.default,
221
+ actions: itemTypeOptions,
220
222
  settingsProps: {
221
223
  settings: "freegridItem",
222
224
  onChange: onChangeSettings,
@@ -43,15 +43,25 @@ const FREE_GRID_ELEMENTS = [{
43
43
  actionType: "addSignature",
44
44
  label: "Signature",
45
45
  icon: "signature"
46
+ }, {
47
+ actionType: "addDivider",
48
+ label: "Divider",
49
+ icon: "divider"
46
50
  }];
47
51
  const AddElement = props => {
48
52
  const {
49
- handleClick
53
+ handleClick,
54
+ hideTools
50
55
  } = props;
56
+ const ADD_ELEMENTS = FREE_GRID_ELEMENTS.filter(f => (hideTools || []).indexOf(f.actionType) === -1);
51
57
  return /*#__PURE__*/_jsx(Box, {
58
+ sx: {
59
+ maxHeight: "500px",
60
+ overflowY: 'auto'
61
+ },
52
62
  children: /*#__PURE__*/_jsx(List, {
53
63
  className: "item-list-wrpr",
54
- children: FREE_GRID_ELEMENTS.map(m => {
64
+ children: ADD_ELEMENTS.map(m => {
55
65
  return /*#__PURE__*/_jsxs(ListItemButton, {
56
66
  className: "item-wrapper",
57
67
  onClick: handleClick(m.actionType),
@@ -7,10 +7,11 @@ const boxOptions = ["settings", "link", "saveAsTemplate", "close"];
7
7
  const appHeaderOptions = ["settings", "saveAsTemplate", "close"];
8
8
  const tableOptions = ["drag", "edit", "settings", "saveAsTemplate", "close"];
9
9
  const embedScriptOptions = ["embedScript", "saveAsTemplate", "close"];
10
- const sectionOptions = ["addElement", "settings", "moveUp", "moveDown", "saveAsTemplate", "more"];
10
+ const sectionOptions = ["addElementInSection", "settings", "moveUp", "moveDown", "saveAsTemplate", "more"];
11
11
  const formOptions = ["drag", "edit", "settings", "addFormField", "workFlow", "saveAsTemplate", "close"];
12
12
  const signatureOptions = ["signatureSettings", "saveAsTemplate", "close"];
13
13
  const signOptions = ["removeSign", "saveAsTemplate", "close"];
14
+ const dividerOptions = ["settings", "saveAsTemplate", "close"];
14
15
  const itemOptions = {
15
16
  default: commonOptions,
16
17
  text: textOptions,
@@ -24,6 +25,7 @@ const itemOptions = {
24
25
  embedScript: embedScriptOptions,
25
26
  video: videoOptions,
26
27
  signature: signatureOptions,
27
- sign: signOptions
28
+ sign: signOptions,
29
+ divider: dividerOptions
28
30
  };
29
31
  export default itemOptions;
@@ -27,7 +27,7 @@ const Actions = {
27
27
  Icon: null,
28
28
  title: "Add Section"
29
29
  },
30
- addElement: {
30
+ addElementInSection: {
31
31
  type: "addElement",
32
32
  Button: IconButton,
33
33
  Icon: AddIcon,
@@ -0,0 +1,49 @@
1
+ import React from "react";
2
+ import { Transforms, Node } from "slate";
3
+ import { Box } from "@mui/material";
4
+ import { StyleContent } from "../../../StyleBuilder";
5
+ import dividerStyle from "../../../StyleBuilder/dividerStyles";
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ const DividerSettings = props => {
8
+ const {
9
+ editor,
10
+ path,
11
+ customProps
12
+ } = props;
13
+ const item_path = path?.split("|").map(m => parseInt(m));
14
+ const element_path = [...item_path, 0];
15
+ const element = Node.get(editor, element_path);
16
+ const onChange = data => {
17
+ console.log("🚀 ~ onChange ~ data:", data);
18
+ console.log("🚀 ~ onChange ~ element:", element);
19
+ const updated_props = {
20
+ ...element,
21
+ ...data,
22
+ field_type: data?.element
23
+ };
24
+ delete updated_props.children;
25
+ Transforms.setNodes(editor, {
26
+ ...updated_props
27
+ }, {
28
+ at: element_path
29
+ });
30
+ };
31
+ const handleClose = () => {
32
+ console.log("close");
33
+ };
34
+ return /*#__PURE__*/_jsx(Box, {
35
+ component: "div",
36
+ className: "item-w",
37
+ children: dividerStyle?.map((m, i) => {
38
+ return /*#__PURE__*/_jsx(StyleContent, {
39
+ renderTabs: dividerStyle,
40
+ value: m.value,
41
+ element: element,
42
+ onChange: onChange,
43
+ customProps: customProps,
44
+ handleClose: handleClose
45
+ }, `tab_${m.value}_$${i}`);
46
+ })
47
+ });
48
+ };
49
+ export default DividerSettings;
@@ -7,6 +7,7 @@ import AppHeaderSettings from "./AppHeaderSettings";
7
7
  import FormSettings from "./FormSettings";
8
8
  import TableSettings from "./TableSettings";
9
9
  import CodeSettings from "./CodeSettings";
10
+ import DividerSettings from "./DividerSettings";
10
11
  const SettingsComponents = {
11
12
  text: TextSettings,
12
13
  button: ButtonSettings,
@@ -16,6 +17,7 @@ const SettingsComponents = {
16
17
  appHeader: AppHeaderSettings,
17
18
  form: FormSettings,
18
19
  table: TableSettings,
19
- embedScript: CodeSettings
20
+ embedScript: CodeSettings,
21
+ divider: DividerSettings
20
22
  };
21
23
  export default SettingsComponents;
@@ -7,7 +7,8 @@ export const settingsLabel = {
7
7
  appHeader: "App Header Settings",
8
8
  form: "Form Settings",
9
9
  table: "Table Settings",
10
- embedScript: "Code Settings"
10
+ embedScript: "Code Settings",
11
+ divider: 'Divider Settings'
11
12
  };
12
13
  export const ItemTypes = {
13
14
  text: "Text",
@@ -19,5 +20,6 @@ export const ItemTypes = {
19
20
  form: "Form",
20
21
  table: "Table",
21
22
  embedScript: "Code",
22
- signature: "Signature"
23
+ signature: "Signature",
24
+ divider: 'Divider'
23
25
  };
@@ -89,7 +89,7 @@ const VirtualElement = props => {
89
89
  const sectionProps = {
90
90
  path: curPath,
91
91
  props: {
92
- height: rect.height
92
+ height: rect?.height
93
93
  }
94
94
  };
95
95
  const itemsData = [];
@@ -151,12 +151,6 @@ const RnD = props => {
151
151
  e.preventDefault();
152
152
  e.stopPropagation();
153
153
  }
154
-
155
- // to prevent auto scroll to top
156
- // when no editor.selection
157
- if (!editor.selection) {
158
- // Transforms.select(editor, Editor.end(editor, []));
159
- }
160
154
  switch (e.detail) {
161
155
  case 1:
162
156
  if (!enable) {
@@ -167,7 +161,9 @@ const RnD = props => {
167
161
  anchorEl: rndRef?.current
168
162
  });
169
163
  }
170
- // ReactEditor.focus(editor);
164
+ focusSelection(editor, {
165
+ path
166
+ });
171
167
  break;
172
168
  case 2:
173
169
  focusSelection(editor, {
@@ -0,0 +1,56 @@
1
+ import Icon from "../Icon";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ const dividerStyle = [{
4
+ tab: "Border",
5
+ value: "sectionBorderRadius",
6
+ fields: [{
7
+ label: "Divider Color",
8
+ key: "borderColor",
9
+ type: "color",
10
+ infoIcon: /*#__PURE__*/_jsx(Icon, {
11
+ icon: "info"
12
+ })
13
+ }, {
14
+ label: "Divider Width",
15
+ key: "borderWidth",
16
+ type: "text",
17
+ placeholder: "1px",
18
+ width: 6
19
+ }, {
20
+ label: "Divider Style",
21
+ key: "borderStyle",
22
+ type: "textOptions",
23
+ width: 6,
24
+ options: [{
25
+ text: "Solid",
26
+ value: "solid"
27
+ }, {
28
+ text: "Dotted",
29
+ value: "dotted"
30
+ }, {
31
+ text: "Dashed",
32
+ value: "dashed"
33
+ }, {
34
+ text: "Double",
35
+ value: "double"
36
+ }, {
37
+ text: "Groove",
38
+ value: "groove"
39
+ }, {
40
+ text: "Ridge",
41
+ value: "ridge"
42
+ }, {
43
+ text: "Inset",
44
+ value: "inset"
45
+ }, {
46
+ text: "Outset",
47
+ value: "outset"
48
+ }],
49
+ renderOption: option => {
50
+ return /*#__PURE__*/_jsx("span", {
51
+ children: option.text
52
+ });
53
+ }
54
+ }]
55
+ }];
56
+ export default dividerStyle;
@@ -1,5 +1,5 @@
1
1
  import React, { useEffect, useState } from "react";
2
- import { Grid, TextField, InputAdornment, Typography } from "@mui/material";
2
+ import { Grid, TextField, InputAdornment, Typography, Tooltip } from "@mui/material";
3
3
  import ColorPickerButton from "../../ColorPickerButton";
4
4
  import { jsx as _jsx } from "react/jsx-runtime";
5
5
  import { jsxs as _jsxs } from "react/jsx-runtime";
@@ -46,15 +46,30 @@ const Color = props => {
46
46
  item: true,
47
47
  xs: 12,
48
48
  className: "btnColorPicker",
49
- children: [/*#__PURE__*/_jsx(Typography, {
49
+ children: [/*#__PURE__*/_jsxs(Typography, {
50
50
  variant: "body1",
51
51
  color: "primary",
52
52
  sx: {
53
53
  fontSize: "14px",
54
54
  fontWeight: 500,
55
- marginBottom: "5px"
55
+ marginBottom: "5px",
56
+ display: 'flex',
57
+ alignItems: 'center',
58
+ '& svg': {
59
+ width: '20px',
60
+ height: '20px'
61
+ }
56
62
  },
57
- children: label
63
+ children: [label, data?.infoIcon ? /*#__PURE__*/_jsx(Tooltip, {
64
+ arrow: true,
65
+ title: "Note: If color gradient is used, divider styles will not apply",
66
+ children: /*#__PURE__*/_jsx("span", {
67
+ style: {
68
+ display: 'inline-block'
69
+ },
70
+ children: data?.infoIcon
71
+ })
72
+ }) : null]
58
73
  }), /*#__PURE__*/_jsx(TextField, {
59
74
  fullWidth: true,
60
75
  value: value,
@@ -4,6 +4,7 @@ import html2canvas from "html2canvas";
4
4
  import { rectIntersection, closestCenter } from "@dnd-kit/core";
5
5
  import { getQueryStrings } from "../utils/SlateUtilityFunctions";
6
6
  import { Node } from "slate";
7
+ import { focusUsingTemporaryNode } from "./RnD/focusNode";
7
8
  // import { focusUsingTemporaryNode } from "./RnD/focusNode";
8
9
  const HIDE_PLACHOLDERS = ["grid", "grid-item", "table"];
9
10
  const PREVIEW_IMAGE_HIDE_CLASS = ["grid-container-toolbar", "grid-item-toolbar", "element-toolbar", "mini-tool-wrpr-ei", "element-selector", "element-selector-ctrl"];
@@ -257,7 +258,7 @@ export const focusSelection = (editor, {
257
258
  behavior: "smooth",
258
259
  block: "nearest"
259
260
  });
260
- // focusUsingTemporaryNode(editor, selectedDOM);
261
+ focusUsingTemporaryNode(editor, selectedDOM);
261
262
  } catch (err) {
262
263
  console.log(err);
263
264
  }
@@ -139,10 +139,10 @@ export const groupByBreakpoint = (styleProps, theme) => {
139
139
  return a;
140
140
  }, {});
141
141
  return {
142
- [theme.breakpoints.up("md")]: {
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
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flozy/editor",
3
- "version": "4.5.9",
3
+ "version": "4.6.1",
4
4
  "description": "An Editor for flozy app brain",
5
5
  "files": [
6
6
  "dist"