@flozy/editor 2.0.7 → 2.0.9
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.
- package/dist/Editor/CommonEditor.js +2 -2
- package/dist/Editor/DialogWrapper.js +0 -3
- package/dist/Editor/Editor.css +7 -0
- package/dist/Editor/Elements/Button/EditorButton.js +1 -1
- package/dist/Editor/Elements/Embed/Video.js +16 -4
- package/dist/Editor/Elements/Grid/Grid.js +1 -1
- package/dist/Editor/Elements/Grid/GridItem.js +0 -1
- package/dist/Editor/Styles/EditorStyles.js +4 -1
- package/dist/Editor/Toolbar/FormatTools/BlockButton.js +16 -8
- package/dist/Editor/Toolbar/PopupTool/AddElements.js +5 -1
- package/dist/Editor/Toolbar/PopupTool/AddTemplates.js +12 -1
- package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +13 -0
- package/dist/Editor/Toolbar/PopupTool/index.js +7 -0
- package/dist/Editor/Toolbar/toolbarGroups.js +2 -2
- package/dist/Editor/common/Icon.js +6 -2
- package/dist/Editor/helper/deserialize/index.js +141 -0
- package/dist/Editor/hooks/useKeys.js +21 -0
- package/dist/Editor/hooks/withCommon.js +2 -3
- package/dist/Editor/plugins/withEmbeds.js +10 -1
- package/dist/Editor/plugins/withHTML.js +43 -0
- package/dist/Editor/plugins/withTable.js +0 -9
- package/dist/Editor/utils/SlateUtilityFunctions.js +22 -36
- package/dist/Editor/utils/accordion.js +3 -1
- package/dist/Editor/utils/helper.js +13 -0
- package/dist/Editor/utils/table.js +37 -0
- package/package.json +2 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import React, { useRef, useCallback, useEffect, useMemo, useState, forwardRef, useImperativeHandle } from "react";
|
|
3
|
-
import { createEditor,
|
|
3
|
+
import { createEditor, Transforms } from "slate";
|
|
4
4
|
import { Slate, Editable, ReactEditor } from "slate-react";
|
|
5
5
|
import { useDebounce } from "use-debounce";
|
|
6
6
|
import { getMarked, getBlock } from "./utils/SlateUtilityFunctions";
|
|
@@ -129,7 +129,7 @@ const CommonEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
129
129
|
}
|
|
130
130
|
};
|
|
131
131
|
const classes = editorStyles({
|
|
132
|
-
padHeight: !fullScreen ? otherProps?.padHeight :
|
|
132
|
+
padHeight: !fullScreen ? otherProps?.padHeight : 20,
|
|
133
133
|
placeHolderColor: invertColor(pageColor || "#FFF"),
|
|
134
134
|
theme
|
|
135
135
|
});
|
package/dist/Editor/Editor.css
CHANGED
|
@@ -165,7 +165,7 @@ const EditorButton = props => {
|
|
|
165
165
|
background: bgColor || "rgb(30, 75, 122)",
|
|
166
166
|
borderBlockStyle: "solid",
|
|
167
167
|
borderColor: borderColor || "transparent",
|
|
168
|
-
borderWidth: borderWidth
|
|
168
|
+
borderWidth: borderWidth !== undefined ? borderWidth : borderColor ? "1px" : "0px",
|
|
169
169
|
borderRadius: {
|
|
170
170
|
...getBreakPointsValue(borderRadius || {}, null, "overrideBorderRadius", true)
|
|
171
171
|
},
|
|
@@ -27,7 +27,8 @@ const Video = ({
|
|
|
27
27
|
borderColor,
|
|
28
28
|
borderStyle,
|
|
29
29
|
url,
|
|
30
|
-
xsHidden
|
|
30
|
+
xsHidden,
|
|
31
|
+
width: oldWidth
|
|
31
32
|
} = element;
|
|
32
33
|
const editor = useSlateStatic();
|
|
33
34
|
const [openSetttings, setOpenSettings] = useState(false);
|
|
@@ -40,9 +41,18 @@ const Video = ({
|
|
|
40
41
|
horizantal
|
|
41
42
|
} = alignment || {};
|
|
42
43
|
const path = ReactEditor.findPath(editor, element);
|
|
44
|
+
const getSize = () => {
|
|
45
|
+
if (element?.size === undefined) {
|
|
46
|
+
return {
|
|
47
|
+
widthInPercent: parseInt(oldWidth)
|
|
48
|
+
};
|
|
49
|
+
} else {
|
|
50
|
+
return element?.size || {};
|
|
51
|
+
}
|
|
52
|
+
};
|
|
43
53
|
const [size, onMouseDown, resizing, onLoad] = useResize({
|
|
44
54
|
parentDOM,
|
|
45
|
-
size:
|
|
55
|
+
size: getSize(),
|
|
46
56
|
onChange: uSize => {
|
|
47
57
|
Transforms.setNodes(editor, {
|
|
48
58
|
size: uSize
|
|
@@ -113,10 +123,10 @@ const Video = ({
|
|
|
113
123
|
} else {
|
|
114
124
|
return {
|
|
115
125
|
width: {
|
|
116
|
-
...getBreakPointsValue(
|
|
126
|
+
...getBreakPointsValue(getSize(), null, "overrideReSize", true)
|
|
117
127
|
},
|
|
118
128
|
height: url ? {
|
|
119
|
-
...getBreakPointsValue(
|
|
129
|
+
...getBreakPointsValue(getSize(), null, "overrideReSizeH", true)
|
|
120
130
|
} : "auto"
|
|
121
131
|
};
|
|
122
132
|
}
|
|
@@ -175,6 +185,8 @@ const Video = ({
|
|
|
175
185
|
xs: xsHidden ? "none" : "flex"
|
|
176
186
|
},
|
|
177
187
|
flexDirection: "row",
|
|
188
|
+
flexWrap: "wrap",
|
|
189
|
+
// to support oldWidth with link
|
|
178
190
|
width: `100%`,
|
|
179
191
|
justifyContent: horizantal,
|
|
180
192
|
alignContent: vertical
|
|
@@ -51,7 +51,6 @@ const GridItem = props => {
|
|
|
51
51
|
const selected = hoverPath === path.join(",");
|
|
52
52
|
const [showTool] = useEditorSelection(editor);
|
|
53
53
|
const isEmpty = !readOnly && isEmptyNode(editor, element?.children, path) ? "empty" : "";
|
|
54
|
-
console.log(cellGHeight);
|
|
55
54
|
const GridItemToolbar = () => {
|
|
56
55
|
return selected && !showTool ? /*#__PURE__*/_jsx("div", {
|
|
57
56
|
contentEditable: false,
|
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import Icon from "../../common/Icon";
|
|
3
3
|
import Button from "../../common/Button";
|
|
4
|
-
import { toggleBlock, isBlockActive } from "../../utils/SlateUtilityFunctions.js";
|
|
4
|
+
import { toggleBlock, isBlockActive, isMarkActive, toggleMark } from "../../utils/SlateUtilityFunctions.js";
|
|
5
5
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
const MARK_TYPES = ["doublequote"];
|
|
7
|
+
const BlockButton = props => {
|
|
8
|
+
const {
|
|
9
|
+
editor,
|
|
10
|
+
format,
|
|
11
|
+
title
|
|
12
|
+
} = props;
|
|
13
|
+
const isMark = MARK_TYPES?.indexOf(format) >= 0;
|
|
14
|
+
const isActive = isMark ? isMarkActive(editor, format) : isBlockActive(editor, format);
|
|
11
15
|
return /*#__PURE__*/_jsx(Button, {
|
|
12
|
-
active:
|
|
16
|
+
active: isActive,
|
|
13
17
|
format: format,
|
|
14
18
|
onMouseDown: e => {
|
|
15
19
|
e.preventDefault();
|
|
16
|
-
|
|
20
|
+
if (isMark) {
|
|
21
|
+
toggleMark(editor, format);
|
|
22
|
+
} else {
|
|
23
|
+
toggleBlock(editor, format);
|
|
24
|
+
}
|
|
17
25
|
},
|
|
18
26
|
title: title,
|
|
19
27
|
children: /*#__PURE__*/_jsx(Icon, {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { Grid } from "@mui/material";
|
|
2
|
+
import { Grid, Box } from "@mui/material";
|
|
3
3
|
import { toolbarGroups } from "../toolbarGroups";
|
|
4
4
|
import { RenderToolbarIcon } from "../Toolbar";
|
|
5
5
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
@@ -17,6 +17,7 @@ const AddElements = props => {
|
|
|
17
17
|
const filteredElements = elements.filter(f => (hideTools || []).indexOf(f.type) === -1);
|
|
18
18
|
return /*#__PURE__*/_jsx(Grid, {
|
|
19
19
|
container: true,
|
|
20
|
+
className: "elements-wrpr-pp",
|
|
20
21
|
sx: classes.textFormatWrapper,
|
|
21
22
|
spacing: 2,
|
|
22
23
|
style: {
|
|
@@ -24,8 +25,11 @@ const AddElements = props => {
|
|
|
24
25
|
},
|
|
25
26
|
children: filteredElements.map(m => {
|
|
26
27
|
return /*#__PURE__*/_jsx(Grid, {
|
|
28
|
+
className: "ele-item-single",
|
|
27
29
|
item: true,
|
|
28
30
|
xs: 6,
|
|
31
|
+
md: 4,
|
|
32
|
+
lg: 4,
|
|
29
33
|
children: /*#__PURE__*/_jsx(RenderToolbarIcon, {
|
|
30
34
|
editor: editor,
|
|
31
35
|
element: m,
|
|
@@ -5,6 +5,14 @@ import FullViewCard from "./FullViewCard";
|
|
|
5
5
|
import ButtonTemplateCard from "./ButtonTemplatesCard";
|
|
6
6
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
7
7
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
8
|
+
const CATEGORIES_SORT_INDEX = {
|
|
9
|
+
Brief: 1,
|
|
10
|
+
Buttons: 2,
|
|
11
|
+
Banners: 3,
|
|
12
|
+
Tables: 4,
|
|
13
|
+
Contract: 5,
|
|
14
|
+
Proposal: 6
|
|
15
|
+
};
|
|
8
16
|
const Categories = props => {
|
|
9
17
|
const {
|
|
10
18
|
value,
|
|
@@ -65,6 +73,9 @@ const AddTemplates = props => {
|
|
|
65
73
|
useEffect(() => {
|
|
66
74
|
getTemplatesList();
|
|
67
75
|
}, []);
|
|
76
|
+
const sortCategory = (a, b) => {
|
|
77
|
+
return (CATEGORIES_SORT_INDEX[a] || Infinity) - (CATEGORIES_SORT_INDEX[b] || Infinity);
|
|
78
|
+
};
|
|
68
79
|
const getTemplatesList = async () => {
|
|
69
80
|
setLoading(true);
|
|
70
81
|
const result = await services("listTemplates", {});
|
|
@@ -74,7 +85,7 @@ const AddTemplates = props => {
|
|
|
74
85
|
a.push(b.category);
|
|
75
86
|
}
|
|
76
87
|
return a;
|
|
77
|
-
}, []);
|
|
88
|
+
}, []).sort(sortCategory);
|
|
78
89
|
const ft = tempList?.filter(f => f.category === lic[0]);
|
|
79
90
|
setTemplates(tempList);
|
|
80
91
|
setCategories(lic);
|
|
@@ -50,9 +50,22 @@ const usePopupStyle = theme => ({
|
|
|
50
50
|
textFormatWrapper: {
|
|
51
51
|
padding: "0px 16px 16px 16px",
|
|
52
52
|
width: "370px",
|
|
53
|
+
maxWidth: "100%",
|
|
53
54
|
// 30% of window height
|
|
54
55
|
maxHeight: `${window.innerHeight * 0.45}px`,
|
|
55
56
|
overflow: "auto",
|
|
57
|
+
"&.elements-wrpr-pp": {
|
|
58
|
+
width: "500px",
|
|
59
|
+
maxWidth: "100%",
|
|
60
|
+
"&.fullscreen": {
|
|
61
|
+
width: "100%",
|
|
62
|
+
maxHeight: "fit-content"
|
|
63
|
+
},
|
|
64
|
+
"& .ele-item-single": {
|
|
65
|
+
paddingLeft: "4px",
|
|
66
|
+
paddingTop: "4px"
|
|
67
|
+
}
|
|
68
|
+
},
|
|
56
69
|
"&.templates": {
|
|
57
70
|
width: "500px",
|
|
58
71
|
maxWidth: "100%",
|
|
@@ -8,6 +8,7 @@ import useDrag from "../../hooks/useDrag";
|
|
|
8
8
|
import PopperHeader from "./PopperHeader";
|
|
9
9
|
import { TableUtil } from "../../utils/table";
|
|
10
10
|
import useWindowResize from "../../hooks/useWindowResize";
|
|
11
|
+
import useEvent from "../../hooks/useKeys";
|
|
11
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
12
13
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
14
|
const PopupTool = props => {
|
|
@@ -26,6 +27,7 @@ const PopupTool = props => {
|
|
|
26
27
|
const id = open ? "popup-edit-tool" : "";
|
|
27
28
|
const table = new TableUtil(editor);
|
|
28
29
|
const [size] = useWindowResize();
|
|
30
|
+
const [eventKey] = useEvent();
|
|
29
31
|
useEffect(() => {
|
|
30
32
|
if (event === "end" && anchorEl && !open) {
|
|
31
33
|
// for table cell selection
|
|
@@ -37,6 +39,11 @@ const PopupTool = props => {
|
|
|
37
39
|
setOpen(false);
|
|
38
40
|
}
|
|
39
41
|
}, [event, anchorEl]);
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (eventKey) {
|
|
44
|
+
setOpen(false);
|
|
45
|
+
}
|
|
46
|
+
}, [eventKey]);
|
|
40
47
|
useEffect(() => {
|
|
41
48
|
if (!selection || !inFocus || Range.isCollapsed(selection) || Editor.string(editor, selection) === "") {
|
|
42
49
|
setAnchorEl(null);
|
|
@@ -103,9 +103,9 @@ export const toolbarGroups = [[{
|
|
|
103
103
|
group: "typography"
|
|
104
104
|
}, {
|
|
105
105
|
id: 14,
|
|
106
|
-
format: "
|
|
106
|
+
format: "doublequote",
|
|
107
107
|
type: "block",
|
|
108
|
-
title: "
|
|
108
|
+
title: "Double Quote",
|
|
109
109
|
group: "typography"
|
|
110
110
|
}], [{
|
|
111
111
|
id: 15,
|
|
@@ -8,8 +8,8 @@ import { SiLatex } from "react-icons/si";
|
|
|
8
8
|
import { RiDeleteColumn, RiDeleteRow } from "react-icons/ri";
|
|
9
9
|
import { IoIosImage } from "react-icons/io";
|
|
10
10
|
import { GridIcon, AccordionIcon, SignatureIcon, ButtonIcon, Carousal, FormIcon, BoldIcon, FontFamilyIcon, FontSizeIcon, ImageIcon, ItalicIcon, LinkIcon, StrikethroughIcon, TableIcon, UnderLineIcon, VideoIcon, CheckboxIcon, AppHeader, MoreHorizontal, UploadImage, DocsUpload, LeftArrow, RightArrow, CheckListButton, CheckListButtonActive, ExcelIcon, CsvIcon, DividerIcon } from "./iconslist";
|
|
11
|
-
import ArrowRightIcon from
|
|
12
|
-
import ArrowDropDownIcon from
|
|
11
|
+
import ArrowRightIcon from "@mui/icons-material/ArrowRight";
|
|
12
|
+
import ArrowDropDownIcon from "@mui/icons-material/ArrowDropDown";
|
|
13
13
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
14
14
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
15
|
const iconList = {
|
|
@@ -51,6 +51,10 @@ const iconList = {
|
|
|
51
51
|
size: 20,
|
|
52
52
|
fill: "#64748B"
|
|
53
53
|
}),
|
|
54
|
+
doublequote: /*#__PURE__*/_jsx(MdFormatQuote, {
|
|
55
|
+
size: 20,
|
|
56
|
+
fill: "#64748B"
|
|
57
|
+
}),
|
|
54
58
|
superscript: /*#__PURE__*/_jsx(FaSuperscript, {
|
|
55
59
|
size: 15,
|
|
56
60
|
fill: "#64748B"
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { jsx } from "slate-hyperscript";
|
|
2
|
+
const ELEMENT_TAGS = {
|
|
3
|
+
A: el => ({
|
|
4
|
+
type: "link",
|
|
5
|
+
url: el.getAttribute("href")
|
|
6
|
+
}),
|
|
7
|
+
BLOCKQUOTE: () => ({
|
|
8
|
+
type: "quote"
|
|
9
|
+
}),
|
|
10
|
+
H1: () => ({
|
|
11
|
+
type: "headingOne"
|
|
12
|
+
}),
|
|
13
|
+
H2: () => ({
|
|
14
|
+
type: "headingTwo"
|
|
15
|
+
}),
|
|
16
|
+
H3: () => ({
|
|
17
|
+
type: "headingThree"
|
|
18
|
+
}),
|
|
19
|
+
H4: () => ({
|
|
20
|
+
type: "headingFour"
|
|
21
|
+
}),
|
|
22
|
+
H5: () => ({
|
|
23
|
+
type: "headingFive"
|
|
24
|
+
}),
|
|
25
|
+
H6: () => ({
|
|
26
|
+
type: "headingSix"
|
|
27
|
+
}),
|
|
28
|
+
IMG: el => ({
|
|
29
|
+
type: "image",
|
|
30
|
+
url: el.getAttribute("src")
|
|
31
|
+
}),
|
|
32
|
+
LI: () => ({
|
|
33
|
+
type: "list-item"
|
|
34
|
+
}),
|
|
35
|
+
UL: () => ({
|
|
36
|
+
type: "unorderedList"
|
|
37
|
+
}),
|
|
38
|
+
OL: () => ({
|
|
39
|
+
type: "orderedList"
|
|
40
|
+
}),
|
|
41
|
+
P: () => ({
|
|
42
|
+
type: "paragraph"
|
|
43
|
+
}),
|
|
44
|
+
PRE: () => ({
|
|
45
|
+
type: "code"
|
|
46
|
+
}),
|
|
47
|
+
META: () => ({
|
|
48
|
+
type: "paragraph"
|
|
49
|
+
}),
|
|
50
|
+
STYLE: () => ({
|
|
51
|
+
type: "paragraph"
|
|
52
|
+
}),
|
|
53
|
+
"GOOGLE-SHEETS-HTML-ORIGIN": () => ({
|
|
54
|
+
type: "paragraph"
|
|
55
|
+
}),
|
|
56
|
+
TABLE: () => ({
|
|
57
|
+
type: "table"
|
|
58
|
+
}),
|
|
59
|
+
THEAD: () => ({
|
|
60
|
+
type: "table-head"
|
|
61
|
+
}),
|
|
62
|
+
TBODY: () => ({
|
|
63
|
+
type: "table-body"
|
|
64
|
+
}),
|
|
65
|
+
TH: () => ({
|
|
66
|
+
type: "table-cell"
|
|
67
|
+
}),
|
|
68
|
+
TR: () => ({
|
|
69
|
+
type: "table-row"
|
|
70
|
+
}),
|
|
71
|
+
TD: () => ({
|
|
72
|
+
type: "table-cell"
|
|
73
|
+
}),
|
|
74
|
+
COLGROUP: () => ({
|
|
75
|
+
type: "paragraph"
|
|
76
|
+
}),
|
|
77
|
+
COL: () => ({
|
|
78
|
+
type: "paragraph"
|
|
79
|
+
})
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// COMPAT: `B` is omitted here because Google Docs uses `<b>` in weird ways.
|
|
83
|
+
const TEXT_TAGS = {
|
|
84
|
+
CODE: () => ({
|
|
85
|
+
code: true
|
|
86
|
+
}),
|
|
87
|
+
DEL: () => ({
|
|
88
|
+
strikethrough: true
|
|
89
|
+
}),
|
|
90
|
+
EM: () => ({
|
|
91
|
+
italic: true
|
|
92
|
+
}),
|
|
93
|
+
I: () => ({
|
|
94
|
+
italic: true
|
|
95
|
+
}),
|
|
96
|
+
S: () => ({
|
|
97
|
+
strikethrough: true
|
|
98
|
+
}),
|
|
99
|
+
STRONG: () => ({
|
|
100
|
+
bold: true
|
|
101
|
+
}),
|
|
102
|
+
U: () => ({
|
|
103
|
+
underline: true
|
|
104
|
+
})
|
|
105
|
+
};
|
|
106
|
+
const deserialize = el => {
|
|
107
|
+
if (el.nodeType === 3) {
|
|
108
|
+
return el.textContent;
|
|
109
|
+
} else if (el.nodeType !== 1) {
|
|
110
|
+
return null;
|
|
111
|
+
} else if (el.nodeName === "BR") {
|
|
112
|
+
return "\n";
|
|
113
|
+
}
|
|
114
|
+
const {
|
|
115
|
+
nodeName
|
|
116
|
+
} = el;
|
|
117
|
+
let parent = el;
|
|
118
|
+
console.log(nodeName);
|
|
119
|
+
if (nodeName === "PRE" && el.childNodes[0] && el.childNodes[0].nodeName === "CODE") {
|
|
120
|
+
parent = el.childNodes[0];
|
|
121
|
+
}
|
|
122
|
+
let children = Array.from(parent.childNodes).map(deserialize).flat();
|
|
123
|
+
if (children.length === 0) {
|
|
124
|
+
children = [{
|
|
125
|
+
text: ""
|
|
126
|
+
}];
|
|
127
|
+
}
|
|
128
|
+
if (el.nodeName === "BODY") {
|
|
129
|
+
return jsx("fragment", {}, children);
|
|
130
|
+
}
|
|
131
|
+
if (ELEMENT_TAGS[nodeName]) {
|
|
132
|
+
const attrs = ELEMENT_TAGS[nodeName](el);
|
|
133
|
+
return jsx("element", attrs, children);
|
|
134
|
+
}
|
|
135
|
+
if (TEXT_TAGS[nodeName]) {
|
|
136
|
+
const attrs = TEXT_TAGS[nodeName](el);
|
|
137
|
+
return children.map(child => jsx("text", attrs, child));
|
|
138
|
+
}
|
|
139
|
+
return children;
|
|
140
|
+
};
|
|
141
|
+
export default deserialize;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
const useEvent = () => {
|
|
3
|
+
const [event, setEvent] = useState("");
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
addListener();
|
|
6
|
+
return () => {
|
|
7
|
+
removeListener();
|
|
8
|
+
};
|
|
9
|
+
}, []);
|
|
10
|
+
const onKeyUp = e => {
|
|
11
|
+
setEvent(e.keyCode);
|
|
12
|
+
};
|
|
13
|
+
const addListener = () => {
|
|
14
|
+
document.addEventListener("keyup", onKeyUp);
|
|
15
|
+
};
|
|
16
|
+
const removeListener = () => {
|
|
17
|
+
document.removeEventListener("keyup", onKeyUp);
|
|
18
|
+
};
|
|
19
|
+
return [event];
|
|
20
|
+
};
|
|
21
|
+
export default useEvent;
|
|
@@ -6,9 +6,8 @@ import withEmbeds from "../plugins/withEmbeds";
|
|
|
6
6
|
import withEquation from "../plugins/withEquation";
|
|
7
7
|
import withMentions from "../plugins/withMentions";
|
|
8
8
|
import withLayout from "../plugins/withLayout";
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
import withHtml from "../plugins/withHTML";
|
|
11
10
|
const withCommon = (props, rest = {}) => {
|
|
12
|
-
return rest.needLayout ? withEquation(withLayout(withHistory(withEmbeds(withTables(withLinks(withMentions(withReact(props)))))))) : withEquation(withHistory(withEmbeds(withTables(withLinks(withMentions(withReact(props)))))));
|
|
11
|
+
return rest.needLayout ? withHtml(withEquation(withLayout(withHistory(withEmbeds(withTables(withLinks(withMentions(withReact(props))))))))) : withHtml(withEquation(withHistory(withEmbeds(withTables(withLinks(withMentions(withReact(props))))))));
|
|
13
12
|
};
|
|
14
13
|
export default withCommon;
|
|
@@ -40,9 +40,18 @@ const withEmbeds = editor => {
|
|
|
40
40
|
select: true // Focus on this node once inserted
|
|
41
41
|
});
|
|
42
42
|
} else {
|
|
43
|
-
|
|
43
|
+
// to disable default leafs
|
|
44
|
+
Transforms.insertNodes(editor, {
|
|
45
|
+
type: "paragraph",
|
|
46
|
+
children: [{
|
|
47
|
+
text: ""
|
|
48
|
+
}]
|
|
49
|
+
}, {
|
|
50
|
+
select: true // Focus on this node once inserted
|
|
51
|
+
});
|
|
44
52
|
}
|
|
45
53
|
};
|
|
54
|
+
|
|
46
55
|
return editor;
|
|
47
56
|
};
|
|
48
57
|
export default withEmbeds;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Transforms, Editor, Element } from "slate";
|
|
2
|
+
import deserialize from "../helper/deserialize";
|
|
3
|
+
const withHtml = editor => {
|
|
4
|
+
const {
|
|
5
|
+
insertData,
|
|
6
|
+
isInline,
|
|
7
|
+
isVoid
|
|
8
|
+
} = editor;
|
|
9
|
+
editor.isInline = element => {
|
|
10
|
+
return element.type === "link" ? true : isInline(element);
|
|
11
|
+
};
|
|
12
|
+
editor.isVoid = element => {
|
|
13
|
+
return element.type === "image" ? true : isVoid(element);
|
|
14
|
+
};
|
|
15
|
+
editor.insertData = data => {
|
|
16
|
+
const slateHTML = data?.getData("application/x-slate-fragment");
|
|
17
|
+
const html = data?.getData("text/html");
|
|
18
|
+
console.log(slateHTML, "****", html);
|
|
19
|
+
if (slateHTML) {
|
|
20
|
+
const [tableNode] = Editor.nodes(editor, {
|
|
21
|
+
match: n => !Editor.isEditor(n) && Element.isElement(n) && n.type === "table"
|
|
22
|
+
});
|
|
23
|
+
// do not paste table cell inside table cell
|
|
24
|
+
// only plain text for internal paste
|
|
25
|
+
if (tableNode && tableNode[0]) {
|
|
26
|
+
const text = data?.getData("text/plain");
|
|
27
|
+
Transforms.insertText(editor, text);
|
|
28
|
+
} else {
|
|
29
|
+
insertData(data);
|
|
30
|
+
}
|
|
31
|
+
} else if (html) {
|
|
32
|
+
const parsed = new DOMParser().parseFromString(html, "text/html");
|
|
33
|
+
console.log(parsed.body);
|
|
34
|
+
const fragment = deserialize(parsed.body);
|
|
35
|
+
Transforms.insertFragment(editor, fragment);
|
|
36
|
+
return;
|
|
37
|
+
} else {
|
|
38
|
+
insertData(data);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
return editor;
|
|
42
|
+
};
|
|
43
|
+
export default withHtml;
|
|
@@ -5,15 +5,6 @@ const withTable = editor => {
|
|
|
5
5
|
deleteBackward,
|
|
6
6
|
deleteForward
|
|
7
7
|
} = editor;
|
|
8
|
-
editor.insertData = data => {
|
|
9
|
-
try {
|
|
10
|
-
const text = data.getData("text/plain");
|
|
11
|
-
Transforms.insertText(editor, text);
|
|
12
|
-
return;
|
|
13
|
-
} catch (err) {
|
|
14
|
-
console.log(err);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
8
|
editor.deleteBackward = unit => {
|
|
18
9
|
const {
|
|
19
10
|
selection
|
|
@@ -39,6 +39,7 @@ import { getBreakPointsValue } from "../helper/theme";
|
|
|
39
39
|
import Variables from "../Elements/Variables/Variable";
|
|
40
40
|
import insertNewLine from "./insertNewLine";
|
|
41
41
|
import Divider from "../Elements/Divider/Divider";
|
|
42
|
+
import { getBorderColor } from "./helper";
|
|
42
43
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
43
44
|
const alignment = ["alignLeft", "alignRight", "alignCenter"];
|
|
44
45
|
const list_types = ["orderedList", "unorderedList"];
|
|
@@ -160,6 +161,7 @@ export const activeMark = (editor, format) => {
|
|
|
160
161
|
}
|
|
161
162
|
};
|
|
162
163
|
export const getMarked = (leaf, children) => {
|
|
164
|
+
const className = leaf?.doublequote ? "doublequote" : "";
|
|
163
165
|
if (leaf.bold) {
|
|
164
166
|
children = /*#__PURE__*/_jsx("strong", {
|
|
165
167
|
children: children
|
|
@@ -198,7 +200,9 @@ export const getMarked = (leaf, children) => {
|
|
|
198
200
|
children: children
|
|
199
201
|
});
|
|
200
202
|
}
|
|
201
|
-
|
|
203
|
+
// cover under single span
|
|
204
|
+
if (leaf.color || leaf.bgColor || leaf.fontSize || leaf.fontFamily || leaf.fontWeight || className) {
|
|
205
|
+
const family = fontFamilyMap[leaf?.fontFamily];
|
|
202
206
|
const textStyles = leaf?.color?.indexOf("gradient") >= 0 ? {
|
|
203
207
|
background: leaf?.color?.concat("text"),
|
|
204
208
|
WebkitBackgroundClip: "text",
|
|
@@ -206,45 +210,17 @@ export const getMarked = (leaf, children) => {
|
|
|
206
210
|
} : {
|
|
207
211
|
color: leaf.color
|
|
208
212
|
};
|
|
209
|
-
children = /*#__PURE__*/_jsx("span", {
|
|
210
|
-
style: {
|
|
211
|
-
...textStyles
|
|
212
|
-
},
|
|
213
|
-
children: children
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
if (leaf.bgColor) {
|
|
217
|
-
children = /*#__PURE__*/_jsx("span", {
|
|
218
|
-
style: {
|
|
219
|
-
background: leaf.bgColor
|
|
220
|
-
},
|
|
221
|
-
children: children
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
if (leaf.fontSize) {
|
|
225
213
|
children = /*#__PURE__*/_jsx(Box, {
|
|
214
|
+
className: className,
|
|
226
215
|
component: "span",
|
|
227
216
|
sx: {
|
|
228
217
|
fontSize: {
|
|
229
218
|
lg: sizeMap[leaf.fontSize] || leaf.fontSize,
|
|
230
219
|
...getBreakPointsValue(leaf.fontSize, null, "overrideText")
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
}
|
|
236
|
-
if (leaf.fontFamily) {
|
|
237
|
-
const family = fontFamilyMap[leaf.fontFamily];
|
|
238
|
-
children = /*#__PURE__*/_jsx("span", {
|
|
239
|
-
style: {
|
|
240
|
-
fontFamily: family
|
|
241
|
-
},
|
|
242
|
-
children: children
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
if (leaf.fontWeight) {
|
|
246
|
-
children = /*#__PURE__*/_jsx("span", {
|
|
247
|
-
style: {
|
|
220
|
+
},
|
|
221
|
+
background: leaf.bgColor,
|
|
222
|
+
...textStyles,
|
|
223
|
+
fontFamily: family,
|
|
248
224
|
fontWeight: leaf.fontWeight
|
|
249
225
|
},
|
|
250
226
|
children: children
|
|
@@ -300,12 +276,14 @@ export const getBlock = props => {
|
|
|
300
276
|
...attributes,
|
|
301
277
|
...element.attr,
|
|
302
278
|
style: {
|
|
303
|
-
borderColor: element?.color || "transparent",
|
|
279
|
+
// borderColor: element?.color || "transparent",
|
|
280
|
+
...getBorderColor(element?.color || "transparent", 3),
|
|
304
281
|
background: element?.bgColor || "none",
|
|
305
282
|
padding: `${element?.bgColor ? "16px" : "0px"} 8px`,
|
|
306
283
|
borderRadius: `${element?.color ? "0px" : "12px"} 12px 12px ${element?.color ? "0px" : "12px"}`,
|
|
307
284
|
margin: `${element?.bgColor ? "16px" : "0px"} 0px`,
|
|
308
|
-
width: element?.bgColor ? "calc(100% - 16px)" : "100%"
|
|
285
|
+
width: element?.bgColor ? "calc(100% - 16px)" : "100%",
|
|
286
|
+
borderWidth: element?.color ? "0px 0px 0px 3px" : "0px"
|
|
309
287
|
},
|
|
310
288
|
children: children
|
|
311
289
|
});
|
|
@@ -376,6 +354,14 @@ export const getBlock = props => {
|
|
|
376
354
|
return /*#__PURE__*/_jsx(Table, {
|
|
377
355
|
...props
|
|
378
356
|
});
|
|
357
|
+
case "table-head":
|
|
358
|
+
return /*#__PURE__*/_jsx("thead", {
|
|
359
|
+
children: children
|
|
360
|
+
});
|
|
361
|
+
case "table-body":
|
|
362
|
+
return /*#__PURE__*/_jsx("tbody", {
|
|
363
|
+
children: children
|
|
364
|
+
});
|
|
379
365
|
case "table-row":
|
|
380
366
|
return /*#__PURE__*/_jsx(TableRow, {
|
|
381
367
|
...props
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Transforms } from "slate";
|
|
2
2
|
import insertNewLine from "./insertNewLine";
|
|
3
|
+
import { getSelectedText } from "./helper";
|
|
3
4
|
export const insertAccordion = (editor, path) => {
|
|
4
5
|
try {
|
|
6
|
+
const selectedText = getSelectedText(editor);
|
|
5
7
|
const accordion = {
|
|
6
8
|
type: "accordion",
|
|
7
9
|
children: [{
|
|
@@ -9,7 +11,7 @@ export const insertAccordion = (editor, path) => {
|
|
|
9
11
|
children: [{
|
|
10
12
|
type: "paragraph",
|
|
11
13
|
children: [{
|
|
12
|
-
text: ""
|
|
14
|
+
text: selectedText || ""
|
|
13
15
|
}]
|
|
14
16
|
}]
|
|
15
17
|
}, {
|
|
@@ -43,6 +43,19 @@ export const gradientBorder = color => {
|
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
|
+
export const getBorderColor = (color, borderWidth = 3) => {
|
|
47
|
+
if (color?.indexOf("linear") > -1) {
|
|
48
|
+
return {
|
|
49
|
+
borderImage: `${color} ${borderWidth}`,
|
|
50
|
+
borderWidth: `0px 0px 0px ${borderWidth}px`,
|
|
51
|
+
borderStyle: "solid"
|
|
52
|
+
};
|
|
53
|
+
} else {
|
|
54
|
+
return {
|
|
55
|
+
borderColor: color || "transparent"
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
};
|
|
46
59
|
export const absoluteLink = url => {
|
|
47
60
|
try {
|
|
48
61
|
if (url?.indexOf("://") === -1) {
|
|
@@ -390,8 +390,45 @@ export const createTableCell = text => {
|
|
|
390
390
|
}]
|
|
391
391
|
};
|
|
392
392
|
};
|
|
393
|
+
|
|
394
|
+
// const createHead = (cellText) => {
|
|
395
|
+
// const newHead = Array.from(cellText, (value) => createTableHeadCell(value));
|
|
396
|
+
// return {
|
|
397
|
+
// type: "table-head",
|
|
398
|
+
// children: [
|
|
399
|
+
// {
|
|
400
|
+
// type: "table-row",
|
|
401
|
+
// children: newHead,
|
|
402
|
+
// },
|
|
403
|
+
// ],
|
|
404
|
+
// };
|
|
405
|
+
// };
|
|
406
|
+
|
|
407
|
+
// export const createTableHeadCell = (text) => {
|
|
408
|
+
// return {
|
|
409
|
+
// type: "table-cell",
|
|
410
|
+
// children: [
|
|
411
|
+
// {
|
|
412
|
+
// type: "paragraph",
|
|
413
|
+
// children: [{ text }],
|
|
414
|
+
// },
|
|
415
|
+
// ],
|
|
416
|
+
// };
|
|
417
|
+
// };
|
|
418
|
+
|
|
419
|
+
// const createTbody = (children) => {
|
|
420
|
+
// return [
|
|
421
|
+
// {
|
|
422
|
+
// type: "table-body",
|
|
423
|
+
// children: children,
|
|
424
|
+
// },
|
|
425
|
+
// ];
|
|
426
|
+
// };
|
|
427
|
+
|
|
393
428
|
const createTableNode = (cellText, rows, columns) => {
|
|
429
|
+
// const tableHead = Array.from([cellText[0]], (value) => createHead(value));
|
|
394
430
|
const tableChildren = Array.from(cellText, value => createRow(value));
|
|
431
|
+
// const tbodyChildren = createTbody(tableChildren);
|
|
395
432
|
let tableNode = {
|
|
396
433
|
type: "table",
|
|
397
434
|
children: tableChildren,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flozy/editor",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.9",
|
|
4
4
|
"description": "An Editor for flozy app brain",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
"react-slick": "^0.29.0",
|
|
42
42
|
"slate": "^0.94.1",
|
|
43
43
|
"slate-history": "^0.93.0",
|
|
44
|
+
"slate-hyperscript": "^0.100.0",
|
|
44
45
|
"slate-react": "^0.98.3",
|
|
45
46
|
"styled-components": "^5.3.11",
|
|
46
47
|
"use-debounce": "^10.0.0",
|