@flozy/editor 3.9.4 → 3.9.5
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/Editor/ChatEditor.js +65 -44
- package/dist/Editor/CommonEditor.js +3 -2
- package/dist/Editor/Editor.css +12 -1
- package/dist/Editor/Elements/Accordion/Accordion.js +75 -8
- package/dist/Editor/Elements/Accordion/AccordionBtnPopup.js +3 -2
- package/dist/Editor/Elements/Accordion/AccordionSummary.js +24 -64
- package/dist/Editor/Elements/Embed/Image.js +27 -19
- package/dist/Editor/Elements/Embed/Video.js +14 -10
- package/dist/Editor/Elements/Emoji/EmojiPicker.js +4 -2
- package/dist/Editor/Elements/Form/Form.js +1 -1
- package/dist/Editor/Elements/List/CheckList.js +2 -1
- package/dist/Editor/Elements/PageSettings/PageSettingsButton.js +5 -1
- package/dist/Editor/Elements/Table/Table.js +1 -1
- package/dist/Editor/Elements/Table/TableCell.js +1 -1
- package/dist/Editor/Toolbar/Mini/MiniToolbar.js +25 -1
- package/dist/Editor/common/ColorPickerButton.js +12 -4
- package/dist/Editor/common/EditorCmds.js +35 -0
- package/dist/Editor/common/MentionsPopup/MentionsListCard.js +6 -1
- package/dist/Editor/common/MentionsPopup/Styles.js +5 -2
- package/dist/Editor/common/StyleBuilder/accordionTitleBtnStyle.js +9 -8
- package/dist/Editor/common/StyleBuilder/accordionTitleStyle.js +16 -16
- package/dist/Editor/common/StyleBuilder/fieldTypes/bannerSpacing.js +26 -20
- package/dist/Editor/common/StyleBuilder/fieldTypes/borderRadius.js +18 -16
- package/dist/Editor/common/StyleBuilder/fieldTypes/color.js +6 -4
- package/dist/Editor/common/StyleBuilder/fieldTypes/selectBox.js +14 -3
- package/dist/Editor/helper/deserialize/index.js +14 -9
- package/dist/Editor/helper/index.js +22 -0
- package/dist/Editor/helper/theme.js +2 -1
- package/dist/Editor/hooks/useMouseMove.js +0 -1
- package/dist/Editor/plugins/withHTML.js +46 -4
- package/dist/Editor/plugins/withLayout.js +15 -10
- package/dist/Editor/plugins/withTable.js +1 -1
- package/dist/Editor/utils/SlateUtilityFunctions.js +2 -8
- package/dist/Editor/utils/draftToSlate.js +1 -1
- package/dist/Editor/utils/events.js +11 -4
- package/dist/Editor/utils/helper.js +43 -12
- package/package.json +1 -1
@@ -1,4 +1,4 @@
|
|
1
|
-
import React, { useState } from "react";
|
1
|
+
import React, { useMemo, useState } from "react";
|
2
2
|
import { Grid, Button, Popover } from "@mui/material";
|
3
3
|
import ColorPickerTool from "react-gcolor-picker";
|
4
4
|
import { colors } from "../Elements/Color Picker/defaultColors";
|
@@ -11,7 +11,8 @@ const ColorPickerButton = props => {
|
|
11
11
|
onSave,
|
12
12
|
defaultColors = [],
|
13
13
|
classes = {},
|
14
|
-
recentColors = []
|
14
|
+
recentColors = [],
|
15
|
+
hideGradient
|
15
16
|
} = props;
|
16
17
|
const [anchorEl, setAnchorEl] = useState(null);
|
17
18
|
const [color, setColor] = useState(value);
|
@@ -29,6 +30,13 @@ const ColorPickerButton = props => {
|
|
29
30
|
const handleColorChange = color => {
|
30
31
|
setColor(color);
|
31
32
|
};
|
33
|
+
const initialColors = useMemo(() => {
|
34
|
+
let colors = [...recentColors, ...defaultColors];
|
35
|
+
if (hideGradient) {
|
36
|
+
colors = colors.filter(c => c && !c.includes("gradient"));
|
37
|
+
}
|
38
|
+
return colors;
|
39
|
+
}, [recentColors, defaultColors, hideGradient]);
|
32
40
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
33
41
|
children: [/*#__PURE__*/_jsx(Button, {
|
34
42
|
style: {
|
@@ -61,10 +69,10 @@ const ColorPickerButton = props => {
|
|
61
69
|
xs: 12,
|
62
70
|
children: [/*#__PURE__*/_jsx("div", {
|
63
71
|
children: /*#__PURE__*/_jsx(ColorPickerTool, {
|
64
|
-
gradient: true,
|
72
|
+
gradient: hideGradient ? false : true,
|
65
73
|
value: color,
|
66
74
|
onChange: handleColorChange,
|
67
|
-
defaultColors:
|
75
|
+
defaultColors: initialColors
|
68
76
|
})
|
69
77
|
}), /*#__PURE__*/_jsxs("div", {
|
70
78
|
style: {
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import { Editor, Transforms } from "slate";
|
2
|
+
const selectAll = (event, {
|
3
|
+
editor,
|
4
|
+
needLayout
|
5
|
+
}) => {
|
6
|
+
try {
|
7
|
+
if (needLayout) {
|
8
|
+
event.preventDefault();
|
9
|
+
// Select the entire document
|
10
|
+
const {
|
11
|
+
selection
|
12
|
+
} = editor;
|
13
|
+
const [firstNode] = Editor.nodes(editor, {
|
14
|
+
at: [0]
|
15
|
+
}); // First node
|
16
|
+
const [lastNode] = Editor.nodes(editor, {
|
17
|
+
at: [editor.children.length - 1]
|
18
|
+
}); // Last node
|
19
|
+
|
20
|
+
if (firstNode && lastNode) {
|
21
|
+
Transforms.select(editor, {
|
22
|
+
anchor: Editor.start(editor, [0]),
|
23
|
+
// Start at the first node
|
24
|
+
focus: Editor.end(editor, [editor.children.length - 1]) // End at the last node
|
25
|
+
});
|
26
|
+
}
|
27
|
+
}
|
28
|
+
} catch (err) {
|
29
|
+
console.log(err);
|
30
|
+
}
|
31
|
+
};
|
32
|
+
const EDITORCMDS = {
|
33
|
+
a: selectAll
|
34
|
+
};
|
35
|
+
export default EDITORCMDS;
|
@@ -39,7 +39,12 @@ const MentionsListCard = props => {
|
|
39
39
|
},
|
40
40
|
alt: name,
|
41
41
|
children: /*#__PURE__*/_jsx(Avatar, {
|
42
|
-
|
42
|
+
sx: {
|
43
|
+
background: 'linear-gradient(90deg, #5351FC 0%, #19A9FC 100%)'
|
44
|
+
},
|
45
|
+
alt: name,
|
46
|
+
src: avatar_filename,
|
47
|
+
children: !avatar_filename && name && name.charAt(0).toUpperCase()
|
43
48
|
})
|
44
49
|
}), /*#__PURE__*/_jsx(Box, {
|
45
50
|
sx: {
|
@@ -39,10 +39,13 @@ const usePopupStyles = theme => ({
|
|
39
39
|
color: theme?.palette?.editor?.textColor
|
40
40
|
},
|
41
41
|
"&.active": {
|
42
|
-
background:
|
42
|
+
background: `#2563EB2B`,
|
43
|
+
"& .MuiTypography-root": {
|
44
|
+
color: `${theme?.palette?.editor?.activeColor} !important`
|
45
|
+
}
|
43
46
|
},
|
44
47
|
"&:hover": {
|
45
|
-
background:
|
48
|
+
background: theme?.palette?.action?.hover || `#F4F4F4`
|
46
49
|
},
|
47
50
|
"&.renderComp": {
|
48
51
|
padding: "0px",
|
@@ -1,18 +1,19 @@
|
|
1
1
|
const accordionTitleBtnStyle = [{
|
2
2
|
tab: "Colors",
|
3
|
-
value: "
|
3
|
+
value: "accordionColor",
|
4
4
|
fields: [{
|
5
|
-
label: "
|
6
|
-
key: "
|
5
|
+
label: "Accordion Color",
|
6
|
+
key: "accordionTextColor",
|
7
7
|
type: "color",
|
8
|
-
needPreview: true
|
8
|
+
needPreview: true,
|
9
|
+
hideGradient: true
|
9
10
|
}, {
|
10
|
-
label: "Background Color",
|
11
|
-
key: "
|
11
|
+
label: "Accordion Background Color",
|
12
|
+
key: "accordionBgColor",
|
12
13
|
type: "color"
|
13
14
|
}, {
|
14
|
-
label: "Border Color",
|
15
|
-
key: "
|
15
|
+
label: "Accordion Border Color",
|
16
|
+
key: "accordionBorderColor",
|
16
17
|
type: "color"
|
17
18
|
}]
|
18
19
|
}];
|
@@ -1,20 +1,4 @@
|
|
1
1
|
const accordionTitleStyle = [{
|
2
|
-
tab: "Banner Spacing",
|
3
|
-
value: "bannerSpacing",
|
4
|
-
fields: [{
|
5
|
-
label: "Banner Spacing",
|
6
|
-
key: "bannerSpacing",
|
7
|
-
type: "bannerSpacing"
|
8
|
-
}]
|
9
|
-
}, {
|
10
|
-
tab: "Border Radius",
|
11
|
-
value: "borderRadius",
|
12
|
-
fields: [{
|
13
|
-
label: "Border Radius",
|
14
|
-
key: "borderRadius",
|
15
|
-
type: "borderRadius"
|
16
|
-
}]
|
17
|
-
}, {
|
18
2
|
tab: "Colors",
|
19
3
|
value: "colors",
|
20
4
|
fields: [{
|
@@ -31,5 +15,21 @@ const accordionTitleStyle = [{
|
|
31
15
|
key: "borderColor",
|
32
16
|
type: "color"
|
33
17
|
}]
|
18
|
+
}, {
|
19
|
+
tab: "Banner Spacing",
|
20
|
+
value: "bannerSpacing",
|
21
|
+
fields: [{
|
22
|
+
label: "Banner Spacing",
|
23
|
+
key: "bannerSpacing",
|
24
|
+
type: "bannerSpacing"
|
25
|
+
}]
|
26
|
+
}, {
|
27
|
+
tab: "Border Radius",
|
28
|
+
value: "borderRadius",
|
29
|
+
fields: [{
|
30
|
+
label: "Border Radius",
|
31
|
+
key: "borderRadius",
|
32
|
+
type: "borderRadius"
|
33
|
+
}]
|
34
34
|
}];
|
35
35
|
export default accordionTitleStyle;
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React from "react";
|
2
2
|
import { Checkbox, FormControlLabel, Grid, Slider, Typography, Box } from "@mui/material";
|
3
3
|
import { squreStyle } from "./radiusStyle";
|
4
|
-
import { getBreakPointsValue } from "../../../helper/theme";
|
4
|
+
import { getBreakPointsValue, getCustomizationValue } from "../../../helper/theme";
|
5
5
|
import useWindowResize from "../../../hooks/useWindowResize";
|
6
6
|
import { jsx as _jsx } from "react/jsx-runtime";
|
7
7
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
@@ -78,10 +78,12 @@ const BannerSpacing = props => {
|
|
78
78
|
component: "input",
|
79
79
|
sx: classes.sapcingInput,
|
80
80
|
name: "top",
|
81
|
-
value: !lockSpacing ? "" : value?.top
|
82
|
-
className: "sliderInput",
|
81
|
+
value: !lockSpacing ? "" : getCustomizationValue(value?.top),
|
82
|
+
className: "sliderInput removeScroll",
|
83
83
|
disabled: !lockSpacing,
|
84
|
-
onChange: handleChange
|
84
|
+
onChange: handleChange,
|
85
|
+
type: "number",
|
86
|
+
placeholder: "0"
|
85
87
|
})]
|
86
88
|
}), /*#__PURE__*/_jsx(FormControlLabel, {
|
87
89
|
className: "ccheckbox-primary",
|
@@ -123,50 +125,54 @@ const BannerSpacing = props => {
|
|
123
125
|
children: [/*#__PURE__*/_jsx("div", {
|
124
126
|
className: "bannerSpaceBoxTop",
|
125
127
|
children: /*#__PURE__*/_jsx("input", {
|
126
|
-
type: "
|
128
|
+
type: "number",
|
127
129
|
name: "top",
|
128
|
-
value: value?.top,
|
129
|
-
className: "borderInput",
|
130
|
+
value: getCustomizationValue(value?.top),
|
131
|
+
className: "borderInput removeScroll",
|
130
132
|
style: {
|
131
133
|
...squreStyle.topRight
|
132
134
|
},
|
133
|
-
onChange: handleChange
|
135
|
+
onChange: handleChange,
|
136
|
+
placeholder: "0"
|
134
137
|
})
|
135
138
|
}), /*#__PURE__*/_jsx("div", {
|
136
139
|
className: "bannerSpaceBoxRight",
|
137
140
|
children: /*#__PURE__*/_jsx("input", {
|
138
|
-
type: "
|
141
|
+
type: "number",
|
139
142
|
name: "right",
|
140
|
-
value: value?.right,
|
141
|
-
className: "borderInput",
|
143
|
+
value: getCustomizationValue(value?.right),
|
144
|
+
className: "borderInput removeScroll",
|
142
145
|
style: {
|
143
146
|
...squreStyle.bottomLeft
|
144
147
|
},
|
145
|
-
onChange: handleChange
|
148
|
+
onChange: handleChange,
|
149
|
+
placeholder: "0"
|
146
150
|
})
|
147
151
|
}), /*#__PURE__*/_jsx("div", {
|
148
152
|
className: "bannerSpaceBoxBottom",
|
149
153
|
children: /*#__PURE__*/_jsx("input", {
|
150
|
-
type: "
|
154
|
+
type: "number",
|
151
155
|
name: "bottom",
|
152
|
-
value: value?.bottom,
|
153
|
-
className: "borderInput",
|
156
|
+
value: getCustomizationValue(value?.bottom),
|
157
|
+
className: "borderInput removeScroll",
|
154
158
|
style: {
|
155
159
|
...squreStyle.bottomRight
|
156
160
|
},
|
157
|
-
onChange: handleChange
|
161
|
+
onChange: handleChange,
|
162
|
+
placeholder: "0"
|
158
163
|
})
|
159
164
|
}), /*#__PURE__*/_jsx("div", {
|
160
165
|
className: "bannerSpaceBoxLeft",
|
161
166
|
children: /*#__PURE__*/_jsx("input", {
|
162
|
-
type: "
|
167
|
+
type: "number",
|
163
168
|
name: "left",
|
164
|
-
className: "borderInput",
|
165
|
-
value: value?.left,
|
169
|
+
className: "borderInput removeScroll",
|
170
|
+
value: getCustomizationValue(value?.left),
|
166
171
|
style: {
|
167
172
|
...squreStyle.topLeft
|
168
173
|
},
|
169
|
-
onChange: handleChange
|
174
|
+
onChange: handleChange,
|
175
|
+
placeholder: "0"
|
170
176
|
})
|
171
177
|
})]
|
172
178
|
})
|
@@ -2,7 +2,7 @@ import React from "react";
|
|
2
2
|
import { Grid, Typography, Slider, FormControlLabel, Checkbox, Box } from "@mui/material";
|
3
3
|
import { radiusStyle } from "./radiusStyle";
|
4
4
|
import useWindowResize from "../../../hooks/useWindowResize";
|
5
|
-
import { getBreakPointsValue } from "../../../helper/theme";
|
5
|
+
import { getBreakPointsValue, getCustomizationValue } from "../../../helper/theme";
|
6
6
|
import { jsx as _jsx } from "react/jsx-runtime";
|
7
7
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
8
8
|
const BORDER_RADIUS_KEYS = ["topLeft", "topRight", "bottomLeft", "bottomRight"];
|
@@ -80,11 +80,13 @@ const BorderRadius = props => {
|
|
80
80
|
}), /*#__PURE__*/_jsx(Box, {
|
81
81
|
sx: classes.sapcingInput,
|
82
82
|
component: "input",
|
83
|
-
value: !lockRadius ? "" : value?.topLeft
|
84
|
-
className: "sliderInput",
|
83
|
+
value: !lockRadius ? "" : getCustomizationValue(value?.topLeft),
|
84
|
+
className: "sliderInput removeScroll",
|
85
85
|
name: "topLeft",
|
86
86
|
disabled: !lockRadius,
|
87
|
-
onChange: handleChange
|
87
|
+
onChange: handleChange,
|
88
|
+
type: "number",
|
89
|
+
placeholder: "0"
|
88
90
|
})]
|
89
91
|
}), /*#__PURE__*/_jsx(FormControlLabel, {
|
90
92
|
className: "ccheckbox-primary",
|
@@ -125,10 +127,10 @@ const BorderRadius = props => {
|
|
125
127
|
borderRadius: `${value?.topLeft}px ${value?.topRight}px ${value?.bottomLeft}px ${value?.bottomRight}px`
|
126
128
|
},
|
127
129
|
children: [/*#__PURE__*/_jsx("input", {
|
128
|
-
type: "
|
130
|
+
type: "number",
|
129
131
|
name: "topLeft",
|
130
|
-
value: value?.topLeft,
|
131
|
-
className: "borderInput",
|
132
|
+
value: getCustomizationValue(value?.topLeft),
|
133
|
+
className: "borderInput removeScroll",
|
132
134
|
placeholder: "0",
|
133
135
|
style: {
|
134
136
|
...radiusStyle.topLeft,
|
@@ -136,10 +138,10 @@ const BorderRadius = props => {
|
|
136
138
|
},
|
137
139
|
onChange: handleChange
|
138
140
|
}), /*#__PURE__*/_jsx("input", {
|
139
|
-
type: "
|
141
|
+
type: "number",
|
140
142
|
name: "topRight",
|
141
|
-
value: value?.topRight,
|
142
|
-
className: "borderInput",
|
143
|
+
value: getCustomizationValue(value?.topRight),
|
144
|
+
className: "borderInput removeScroll",
|
143
145
|
placeholder: "0",
|
144
146
|
style: {
|
145
147
|
...radiusStyle.topRight,
|
@@ -148,10 +150,10 @@ const BorderRadius = props => {
|
|
148
150
|
},
|
149
151
|
onChange: handleChange
|
150
152
|
}), /*#__PURE__*/_jsx("input", {
|
151
|
-
type: "
|
153
|
+
type: "number",
|
152
154
|
name: "bottomLeft",
|
153
|
-
value: value?.bottomLeft,
|
154
|
-
className: "borderInput",
|
155
|
+
value: getCustomizationValue(value?.bottomLeft),
|
156
|
+
className: "borderInput removeScroll",
|
155
157
|
placeholder: "0",
|
156
158
|
style: {
|
157
159
|
...radiusStyle.bottomLeft,
|
@@ -160,10 +162,10 @@ const BorderRadius = props => {
|
|
160
162
|
},
|
161
163
|
onChange: handleChange
|
162
164
|
}), /*#__PURE__*/_jsx("input", {
|
163
|
-
type: "
|
165
|
+
type: "number",
|
164
166
|
name: "bottomRight",
|
165
|
-
value: value?.bottomRight,
|
166
|
-
className: "borderInput",
|
167
|
+
value: getCustomizationValue(value?.bottomRight),
|
168
|
+
className: "borderInput removeScroll",
|
167
169
|
placeholder: "0",
|
168
170
|
style: {
|
169
171
|
...radiusStyle.bottomRight,
|
@@ -12,11 +12,12 @@ const Color = props => {
|
|
12
12
|
} = props;
|
13
13
|
const {
|
14
14
|
key,
|
15
|
-
label
|
15
|
+
label,
|
16
|
+
hideGradient
|
16
17
|
} = data;
|
17
18
|
const [recentColors, setRecentColors] = useState({});
|
18
19
|
useEffect(() => {
|
19
|
-
const storedColors = JSON.parse(localStorage.getItem(
|
20
|
+
const storedColors = JSON.parse(localStorage.getItem("recentColors"));
|
20
21
|
if (storedColors) {
|
21
22
|
setRecentColors(storedColors);
|
22
23
|
}
|
@@ -39,7 +40,7 @@ const Color = props => {
|
|
39
40
|
[key]: updatedColors
|
40
41
|
};
|
41
42
|
setRecentColors(updatedColors);
|
42
|
-
localStorage.setItem(
|
43
|
+
localStorage.setItem("recentColors", JSON.stringify(updatedColors));
|
43
44
|
};
|
44
45
|
return /*#__PURE__*/_jsxs(Grid, {
|
45
46
|
item: true,
|
@@ -68,7 +69,8 @@ const Color = props => {
|
|
68
69
|
classes: classes,
|
69
70
|
value: value,
|
70
71
|
onSave: onSave,
|
71
|
-
recentColors: recentColors[key]
|
72
|
+
recentColors: recentColors[key],
|
73
|
+
hideGradient: hideGradient
|
72
74
|
})
|
73
75
|
})
|
74
76
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import React from "react";
|
1
|
+
import React, { useEffect, useState, useRef } from "react";
|
2
2
|
import { Grid, Checkbox, FormControlLabel, FormHelperText } from "@mui/material";
|
3
3
|
import { jsx as _jsx } from "react/jsx-runtime";
|
4
4
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
@@ -6,12 +6,23 @@ const SelectBox = props => {
|
|
6
6
|
const {
|
7
7
|
value,
|
8
8
|
data,
|
9
|
-
onChange
|
9
|
+
onChange,
|
10
|
+
elementProps
|
10
11
|
} = props;
|
11
12
|
const {
|
12
13
|
key,
|
13
14
|
placeholder
|
14
15
|
} = data;
|
16
|
+
const [checkedValue, setCheckedValue] = useState(false);
|
17
|
+
const isFirstRender = useRef(true);
|
18
|
+
useEffect(() => {
|
19
|
+
if (isFirstRender.current && elementProps.element === "email" && value === undefined) {
|
20
|
+
setCheckedValue(true);
|
21
|
+
isFirstRender.current = false;
|
22
|
+
} else {
|
23
|
+
setCheckedValue(value);
|
24
|
+
}
|
25
|
+
}, [elementProps.element, value]);
|
15
26
|
const handleChange = e => {
|
16
27
|
onChange({
|
17
28
|
[key]: e.target.checked
|
@@ -26,7 +37,7 @@ const SelectBox = props => {
|
|
26
37
|
children: [/*#__PURE__*/_jsx(FormControlLabel, {
|
27
38
|
control: /*#__PURE__*/_jsx(Checkbox, {
|
28
39
|
value: value,
|
29
|
-
checked:
|
40
|
+
checked: checkedValue,
|
30
41
|
onChange: handleChange
|
31
42
|
}),
|
32
43
|
label: placeholder
|
@@ -72,15 +72,20 @@ const ELEMENT_TAGS = {
|
|
72
72
|
type: "paragraph"
|
73
73
|
}),
|
74
74
|
TABLE: (el, children = []) => {
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
75
|
+
try {
|
76
|
+
const tableBody = (children || [])?.find(f => f?.type === "table-body");
|
77
|
+
const bodyChild = tableBody?.children || [];
|
78
|
+
const firstRowChildren = tableBody[0]?.children || [];
|
79
|
+
return {
|
80
|
+
type: "table",
|
81
|
+
overwriteChild: bodyChild,
|
82
|
+
// we are not having table-body in our json format, just we are wrapping table-row's inside the table
|
83
|
+
rows: bodyChild?.length,
|
84
|
+
columns: firstRowChildren?.length
|
85
|
+
};
|
86
|
+
} catch (err) {
|
87
|
+
console.log(err);
|
88
|
+
}
|
84
89
|
},
|
85
90
|
THEAD: () => ({
|
86
91
|
type: "table-head"
|
@@ -154,4 +154,26 @@ export const debounce = function (func, wait, immediate) {
|
|
154
154
|
timeout = setTimeout(later, wait);
|
155
155
|
if (callNow) func.apply(context, args);
|
156
156
|
};
|
157
|
+
};
|
158
|
+
export const getTextColor = (color = "") => {
|
159
|
+
return color?.indexOf("gradient") >= 0 ? {
|
160
|
+
background: color?.concat("text"),
|
161
|
+
WebkitBackgroundClip: "text",
|
162
|
+
WebkitTextFillColor: "transparent",
|
163
|
+
color: "transparent",
|
164
|
+
caretColor: "black"
|
165
|
+
} : {
|
166
|
+
color
|
167
|
+
};
|
168
|
+
};
|
169
|
+
export const getBorderColor = (borderColor = "") => {
|
170
|
+
const borderStyle = borderColor ? {
|
171
|
+
border: "1px solid"
|
172
|
+
} : {};
|
173
|
+
if (borderColor?.indexOf("gradient") >= 0) {
|
174
|
+
borderStyle.borderImage = `${borderColor} 1`;
|
175
|
+
} else {
|
176
|
+
borderStyle.borderColor = borderColor;
|
177
|
+
}
|
178
|
+
return borderStyle;
|
157
179
|
};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { Transforms, Editor, Element, Node } from "slate";
|
1
|
+
import { Transforms, Editor, Element, Node, Path } from "slate";
|
2
2
|
import deserialize from "../helper/deserialize";
|
3
3
|
import { decodeAndParseBase64 } from "../utils/helper";
|
4
4
|
const avoidDefaultInsert = ["table", "grid"];
|
@@ -26,6 +26,48 @@ const getCurrentElement = editor => {
|
|
26
26
|
return null;
|
27
27
|
}
|
28
28
|
};
|
29
|
+
const getCurrentElementText = editor => {
|
30
|
+
try {
|
31
|
+
if (editor.selection) {
|
32
|
+
return Editor.string(editor, editor?.selection?.anchor?.path);
|
33
|
+
} else {
|
34
|
+
return null;
|
35
|
+
}
|
36
|
+
} catch (err) {
|
37
|
+
return null;
|
38
|
+
}
|
39
|
+
};
|
40
|
+
const insertAtNextNode = (editor, formattedFragment) => {
|
41
|
+
try {
|
42
|
+
const {
|
43
|
+
selection
|
44
|
+
} = editor;
|
45
|
+
if (selection) {
|
46
|
+
const parentPath = Path.parent(editor?.selection?.anchor?.path);
|
47
|
+
const nextPath = Path.next(parentPath);
|
48
|
+
Transforms.insertNodes(editor, {
|
49
|
+
type: "paragraph",
|
50
|
+
children: [{
|
51
|
+
text: ""
|
52
|
+
}]
|
53
|
+
}, {
|
54
|
+
at: nextPath
|
55
|
+
});
|
56
|
+
Transforms.insertFragment(editor, formattedFragment, {
|
57
|
+
at: nextPath
|
58
|
+
});
|
59
|
+
}
|
60
|
+
} catch (err) {
|
61
|
+
console.log(err);
|
62
|
+
}
|
63
|
+
};
|
64
|
+
const handleInsert = (editor, defaultInsert, fragment = []) => {
|
65
|
+
if (getCurrentElementText(editor) && fragment.some(f => f.type === "table")) {
|
66
|
+
insertAtNextNode(editor, fragment);
|
67
|
+
} else {
|
68
|
+
defaultInsert();
|
69
|
+
}
|
70
|
+
};
|
29
71
|
const formatFragment = {
|
30
72
|
"list-item": fragment => {
|
31
73
|
let refactorFragment = [];
|
@@ -64,11 +106,11 @@ const withHtml = editor => {
|
|
64
106
|
const currentEl = getCurrentElement(editor);
|
65
107
|
const eltype = currentEl?.type;
|
66
108
|
if (slateHTML && !formatFragment[eltype]) {
|
109
|
+
const decoded = decodeAndParseBase64(slateHTML);
|
67
110
|
const [tableNode] = Editor.nodes(editor, {
|
68
111
|
match: n => !Editor.isEditor(n) && Element.isElement(n) && n.type === "table"
|
69
112
|
});
|
70
113
|
if (tableNode && tableNode[0]) {
|
71
|
-
const decoded = decodeAndParseBase64(slateHTML);
|
72
114
|
const defaultInsert = loopChildren(decoded, true);
|
73
115
|
if (defaultInsert) {
|
74
116
|
insertData(data);
|
@@ -79,7 +121,7 @@ const withHtml = editor => {
|
|
79
121
|
Transforms.insertText(editor, text);
|
80
122
|
}
|
81
123
|
} else {
|
82
|
-
insertData(data);
|
124
|
+
handleInsert(editor, () => insertData(data), decoded);
|
83
125
|
}
|
84
126
|
} else if (html) {
|
85
127
|
const parsed = new DOMParser().parseFromString(html, "text/html");
|
@@ -96,7 +138,7 @@ const withHtml = editor => {
|
|
96
138
|
}
|
97
139
|
const fragment = deserialize(parsed.body);
|
98
140
|
const formattedFragment = formatFragment[eltype] ? formatFragment[eltype](fragment) : fragment;
|
99
|
-
Transforms.insertFragment(editor, formattedFragment);
|
141
|
+
handleInsert(editor, () => Transforms.insertFragment(editor, formattedFragment), formattedFragment);
|
100
142
|
return;
|
101
143
|
} else {
|
102
144
|
insertData(data);
|
@@ -32,16 +32,21 @@ const withLayout = editor => {
|
|
32
32
|
editor.normalizeNode = ([node, path]) => {
|
33
33
|
if (path.length === 0) {
|
34
34
|
if (editor.children.length <= 1 && Editor.string(editor, [0, 0]) === "") {
|
35
|
-
const
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
35
|
+
const {
|
36
|
+
anchor
|
37
|
+
} = editor?.selection || {};
|
38
|
+
if (anchor?.offset !== 0) {
|
39
|
+
const title = {
|
40
|
+
type: "title",
|
41
|
+
children: [{
|
42
|
+
text: "Untitled"
|
43
|
+
}]
|
44
|
+
};
|
45
|
+
Transforms.insertNodes(editor, title, {
|
46
|
+
at: path.concat(0),
|
47
|
+
select: true
|
48
|
+
});
|
49
|
+
}
|
45
50
|
}
|
46
51
|
if (editor.children.length === 0) {
|
47
52
|
const paragraph = {
|
@@ -8,7 +8,7 @@ const withTable = editor => {
|
|
8
8
|
delete: slateDelete
|
9
9
|
} = editor;
|
10
10
|
editor.delete = arg => {
|
11
|
-
if (arg
|
11
|
+
if (arg?.reverse) {
|
12
12
|
const table = new TableUtil(editor);
|
13
13
|
const cellsSelected = table.isCellSelected(editor.selection);
|
14
14
|
if (cellsSelected && cellsSelected.length > 1) {
|
@@ -32,7 +32,7 @@ import FormField from "../Elements/Form/FormField";
|
|
32
32
|
import InlineIcon from "../Elements/InlineIcon/InlineIcon";
|
33
33
|
import SimpleText from "../Elements/SimpleText";
|
34
34
|
import CheckList from "../Elements/List/CheckList";
|
35
|
-
import { isEmptyTextNode } from "../helper";
|
35
|
+
import { getTextColor, isEmptyTextNode } from "../helper";
|
36
36
|
import Attachments from "../Elements/Attachments/Attachments";
|
37
37
|
import { getBreakPointsValue } from "../helper/theme";
|
38
38
|
import Variables from "../Elements/Variables/Variable";
|
@@ -203,13 +203,7 @@ export const getMarked = (leaf, children) => {
|
|
203
203
|
// cover under single span
|
204
204
|
if (leaf.color || leaf.bgColor || leaf.fontSize || leaf.fontFamily || leaf.fontWeight || className) {
|
205
205
|
const family = fontFamilyMap[leaf?.fontFamily];
|
206
|
-
const textStyles = leaf?.color
|
207
|
-
background: leaf?.color?.concat("text"),
|
208
|
-
WebkitBackgroundClip: "text",
|
209
|
-
WebkitTextFillColor: "transparent"
|
210
|
-
} : {
|
211
|
-
color: leaf.color
|
212
|
-
};
|
206
|
+
const textStyles = getTextColor(leaf?.color);
|
213
207
|
children = /*#__PURE__*/_jsx("span", {
|
214
208
|
style: {
|
215
209
|
background: leaf.bgColor
|