@flozy/editor 4.3.9 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/Editor/ChatEditor.js +2 -14
- package/dist/Editor/CommonEditor.js +11 -24
- package/dist/Editor/Editor.css +7 -1
- package/dist/Editor/Elements/AI/Styles.js +0 -1
- package/dist/Editor/Elements/Button/EditorButton.js +8 -4
- package/dist/Editor/Elements/Embed/Embed.css +1 -1
- package/dist/Editor/Elements/Embed/Image.js +2 -1
- package/dist/Editor/Elements/Embed/Video.js +2 -1
- package/dist/Editor/Elements/Form/Form.js +0 -1
- package/dist/Editor/Elements/Form/Workflow/FormWorkflow.js +3 -12
- package/dist/Editor/Elements/Mentions/Mentions.js +2 -3
- package/dist/Editor/Elements/SimpleText/index.js +3 -2
- package/dist/Editor/Elements/Table/TableRow.js +1 -1
- package/dist/Editor/Styles/EditorStyles.js +1 -1
- package/dist/Editor/Toolbar/Mini/MiniToolbar.js +1 -2
- package/dist/Editor/Toolbar/PopupTool/ButtonTemplatesCard.js +35 -29
- package/dist/Editor/Toolbar/PopupTool/FullViewCard.js +35 -30
- package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/index.js +0 -2
- package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +22 -38
- package/dist/Editor/Toolbar/PopupTool/TextFormat.js +0 -1
- package/dist/Editor/Toolbar/PopupTool/index.js +5 -5
- package/dist/Editor/common/FontLoader/FontLoader.js +6 -6
- package/dist/Editor/common/Icon.js +1 -1
- package/dist/Editor/common/RnD/ElementSettings/OtherSettings/SaveAsTemplate.js +1 -0
- package/dist/Editor/common/RnD/index.js +3 -2
- package/dist/Editor/common/Section/index.js +11 -1
- package/dist/Editor/common/Section/styles.js +14 -0
- package/dist/Editor/common/Shorthands/mentions.js +1 -1
- package/dist/Editor/helper/RnD/focusNode.js +70 -0
- package/dist/Editor/helper/index.js +4 -2
- package/dist/Editor/hooks/useBreakpoints.js +1 -1
- package/dist/Editor/hooks/useMentions.js +13 -39
- package/dist/Editor/hooks/withCommon.js +2 -7
- package/dist/Editor/plugins/withHTML.js +0 -29
- package/dist/Editor/utils/SlateUtilityFunctions.js +9 -0
- package/dist/Editor/utils/chatEditor/SlateUtilityFunctions.js +24 -1
- package/dist/Editor/utils/events.js +36 -0
- package/package.json +1 -1
@@ -46,8 +46,7 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
46
46
|
const [deboundedValue] = useDebounce(value, 500);
|
47
47
|
const editor = useMemo(() => {
|
48
48
|
return withCommon(createEditor(), {
|
49
|
-
needLayout
|
50
|
-
isChatEditor: true
|
49
|
+
needLayout
|
51
50
|
});
|
52
51
|
}, []);
|
53
52
|
const isReadOnly = readOnly === "readonly";
|
@@ -249,16 +248,6 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
249
248
|
restVal
|
250
249
|
});
|
251
250
|
};
|
252
|
-
const handlePaste = event => {
|
253
|
-
const items = event.clipboardData.items;
|
254
|
-
for (let i = 0; i < items.length; i++) {
|
255
|
-
if (items[i].type.startsWith("image/")) {
|
256
|
-
event.preventDefault(); // Prevent the default paste behavior
|
257
|
-
return; // Exit early to keep the editor empty
|
258
|
-
}
|
259
|
-
}
|
260
|
-
};
|
261
|
-
|
262
251
|
return /*#__PURE__*/_jsx(EditorProvider, {
|
263
252
|
theme: theme,
|
264
253
|
editor: editor,
|
@@ -278,8 +267,7 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
278
267
|
placeholder: "Start typing ...",
|
279
268
|
spellCheck: true,
|
280
269
|
onBlur: handleBlur,
|
281
|
-
onKeyDown: onKeyDown
|
282
|
-
onPaste: handlePaste
|
270
|
+
onKeyDown: onKeyDown
|
283
271
|
}), !readOnly ? /*#__PURE__*/_jsx(MentionsPopup, {
|
284
272
|
ref: mentionsRef,
|
285
273
|
mentions: mentions,
|
@@ -1,7 +1,7 @@
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
2
2
|
import React, { useRef, useCallback, useEffect, useMemo, useState, forwardRef, useImperativeHandle } from "react";
|
3
3
|
import PropTypes from "prop-types";
|
4
|
-
import { createEditor, Transforms
|
4
|
+
import { createEditor, Transforms } from "slate";
|
5
5
|
import { Slate, Editable, ReactEditor } from "slate-react";
|
6
6
|
import { useDebounce, useDebouncedCallback } from "use-debounce";
|
7
7
|
import { getMarked, getBlock } from "./utils/SlateUtilityFunctions";
|
@@ -10,7 +10,7 @@ import { draftToSlate } from "./utils/draftToSlate";
|
|
10
10
|
import useMentions from "./hooks/useMentions";
|
11
11
|
import MentionsPopup from "./common/MentionsPopup";
|
12
12
|
import { RemoteCursorOverlay } from "./RemoteCursorOverlay/Overlay";
|
13
|
-
import { mentionsEvent, commands, indentation, escapeEvent, enterEvent } from "./utils/events";
|
13
|
+
import { mentionsEvent, commands, indentation, escapeEvent, enterEvent, upDownArrowKeyEvents } from "./utils/events";
|
14
14
|
import withCommon from "./hooks/withCommon";
|
15
15
|
import DialogWrapper from "./DialogWrapper";
|
16
16
|
import { serializeToText } from "./utils/serializeToText";
|
@@ -33,10 +33,10 @@ import PopoverAIInput from "./Elements/AI/PopoverAIInput";
|
|
33
33
|
import RnDCopy from "./common/RnD/RnDCopy";
|
34
34
|
import SwitchViewport from "./common/RnD/SwitchViewport/SwitchViewport";
|
35
35
|
import { onInsertFragment } from "./utils/RnD/RnDCtrlCmds";
|
36
|
-
import FontLoader from "./common/FontLoader/FontLoader";
|
37
36
|
import "./font.css";
|
38
37
|
import "./Editor.css";
|
39
38
|
import "animate.css";
|
39
|
+
import FontLoader from "./common/FontLoader/FontLoader";
|
40
40
|
import { jsx as _jsx } from "react/jsx-runtime";
|
41
41
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
42
42
|
const Item = /*#__PURE__*/forwardRef(({
|
@@ -365,20 +365,10 @@ const CommonEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
365
365
|
});
|
366
366
|
} else if (event.key === "Enter") {
|
367
367
|
enterEvent(event, editor, customProps?.isMobile);
|
368
|
-
} else if (event.key === '
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
event.preventDefault();
|
373
|
-
if (selection) {
|
374
|
-
if (!Range.isCollapsed(selection)) {
|
375
|
-
editor.deleteFragment();
|
376
|
-
} else {
|
377
|
-
editor.deleteBackward({
|
378
|
-
unit: 'character'
|
379
|
-
});
|
380
|
-
}
|
381
|
-
}
|
368
|
+
} else if (event.key === "ArrowUp" && otherProps?.tagName !== 'Pages') {
|
369
|
+
upDownArrowKeyEvents(event, editor);
|
370
|
+
} else if (event.key === "ArrowDown" && otherProps?.tagName !== 'Pages') {
|
371
|
+
upDownArrowKeyEvents(event, editor);
|
382
372
|
}
|
383
373
|
}, [chars, editor, target, mentions, setMentions, search, type, mentionsRef]);
|
384
374
|
const Overlay = collaborativeEditor && !isReadOnly ? RemoteCursorOverlay : React.Fragment;
|
@@ -443,22 +433,19 @@ const CommonEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
443
433
|
const selection = window?.getSelection();
|
444
434
|
if (selection && selection.rangeCount > 0) {
|
445
435
|
const cursorPosition = selection.getRangeAt(0)?.getBoundingClientRect();
|
446
|
-
const
|
447
|
-
const containerBottom = containerRect?.bottom;
|
436
|
+
const containerBottom = container?.getBoundingClientRect()?.bottom;
|
448
437
|
if (cursorPosition && cursorPosition.bottom > containerBottom - 250) {
|
449
|
-
// Calculate dynamic scroll based on remaining space
|
450
|
-
const scrollAmount = Math.min(200, cursorPosition.bottom - containerBottom + 250);
|
451
438
|
container?.scrollBy({
|
452
|
-
top:
|
439
|
+
top: 200,
|
453
440
|
behavior: "smooth"
|
454
441
|
});
|
455
442
|
}
|
456
443
|
} else {
|
457
|
-
console.warn(
|
444
|
+
console.warn("No valid selection range found");
|
458
445
|
}
|
459
446
|
}
|
460
447
|
} catch (err) {
|
461
|
-
console.log(
|
448
|
+
console.log("handleCursorScroll", err);
|
462
449
|
}
|
463
450
|
};
|
464
451
|
return /*#__PURE__*/_jsx(EditorProvider, {
|
package/dist/Editor/Editor.css
CHANGED
@@ -244,6 +244,13 @@ blockquote {
|
|
244
244
|
width: 17px !important;
|
245
245
|
}
|
246
246
|
|
247
|
+
.react-datepicker__input-container input {
|
248
|
+
height: 40px !important;
|
249
|
+
border: 1px solid #ccc;
|
250
|
+
border-radius: 5px;
|
251
|
+
width: 100%;
|
252
|
+
}
|
253
|
+
|
247
254
|
.close-popupbtn {
|
248
255
|
border-radius: 4px !important;
|
249
256
|
width: 24px;
|
@@ -884,7 +891,6 @@ blockquote {
|
|
884
891
|
/* For Firefox */
|
885
892
|
.removeScroll {
|
886
893
|
-moz-appearance: textfield;
|
887
|
-
appearance: none;
|
888
894
|
}
|
889
895
|
|
890
896
|
.borderInput:focus-visible {
|
@@ -10,10 +10,14 @@ import { getTRBLBreakPoints, getBreakPointsValue, groupByBreakpoint } from "../.
|
|
10
10
|
import { handleLinkType, windowVar } from "../../utils/helper";
|
11
11
|
import LinkSettings from "../../common/LinkSettings";
|
12
12
|
import Icon from "../../common/Icon";
|
13
|
+
import { useEditorContext } from "../../hooks/useMouseMove";
|
13
14
|
import { jsx as _jsx } from "react/jsx-runtime";
|
14
15
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
15
16
|
const EditorButton = props => {
|
16
17
|
const theme = useTheme();
|
18
|
+
const {
|
19
|
+
theme: appTheme
|
20
|
+
} = useEditorContext();
|
17
21
|
const {
|
18
22
|
attributes,
|
19
23
|
element,
|
@@ -140,8 +144,8 @@ const EditorButton = props => {
|
|
140
144
|
sx: {
|
141
145
|
display: "inline-flex",
|
142
146
|
color: "rgba(0, 0, 0, 0.54)",
|
143
|
-
borderRadius:
|
144
|
-
border:
|
147
|
+
borderRadius: "50% !important",
|
148
|
+
border: "none !important"
|
145
149
|
},
|
146
150
|
...btnProps,
|
147
151
|
children: /*#__PURE__*/_jsx(Icon, {
|
@@ -212,7 +216,7 @@ const EditorButton = props => {
|
|
212
216
|
},
|
213
217
|
"& svg": {
|
214
218
|
"& path": {
|
215
|
-
stroke:
|
219
|
+
stroke: appTheme.palette.text.primary
|
216
220
|
}
|
217
221
|
},
|
218
222
|
"& button": {
|
@@ -277,7 +281,7 @@ const EditorButton = props => {
|
|
277
281
|
right: "-42px",
|
278
282
|
stroke: "#fff",
|
279
283
|
"& path": {
|
280
|
-
fill: openMoreOptions ?
|
284
|
+
fill: openMoreOptions ? appTheme.palette.text.blueText : ""
|
281
285
|
}
|
282
286
|
},
|
283
287
|
onClick: handleMoreBtn,
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import React, { useState, useEffect
|
1
|
+
import React, { useState, useEffect } from "react";
|
2
2
|
import { useSlateStatic, ReactEditor } from "slate-react";
|
3
3
|
import { Node, Transforms } from "slate";
|
4
4
|
import { IconButton, Tooltip, Box, useTheme } from "@mui/material";
|
@@ -220,6 +220,7 @@ const Video = ({
|
|
220
220
|
alignContent: vertical
|
221
221
|
},
|
222
222
|
...element.attr,
|
223
|
+
contentEditable: false,
|
223
224
|
children: [openSetttings ? /*#__PURE__*/_jsx(EmbedPopup, {
|
224
225
|
element: element,
|
225
226
|
onSave: onSave,
|
@@ -71,11 +71,11 @@ const FormWorkflow = props => {
|
|
71
71
|
children: [/*#__PURE__*/_jsx(Grid, {
|
72
72
|
item: true,
|
73
73
|
sx: classes.radioBtn,
|
74
|
-
children: /*#__PURE__*/
|
74
|
+
children: /*#__PURE__*/_jsx(RadioGroup, {
|
75
75
|
name: "set timing",
|
76
76
|
value: schedule,
|
77
77
|
defaultValue: 1,
|
78
|
-
children:
|
78
|
+
children: /*#__PURE__*/_jsx(FormControlLabel, {
|
79
79
|
value: "immediately",
|
80
80
|
label: "Immediately",
|
81
81
|
onChange: () => {
|
@@ -84,16 +84,7 @@ const FormWorkflow = props => {
|
|
84
84
|
control: /*#__PURE__*/_jsx(Radio, {
|
85
85
|
size: "small"
|
86
86
|
})
|
87
|
-
})
|
88
|
-
value: "after",
|
89
|
-
label: "After",
|
90
|
-
onChange: () => {
|
91
|
-
setSchedule("after");
|
92
|
-
},
|
93
|
-
control: /*#__PURE__*/_jsx(Radio, {
|
94
|
-
size: "small"
|
95
|
-
})
|
96
|
-
})]
|
87
|
+
})
|
97
88
|
})
|
98
89
|
}), schedule === "after" && /*#__PURE__*/_jsx(Grid, {
|
99
90
|
item: true,
|
@@ -14,10 +14,9 @@ const Mentions = ({
|
|
14
14
|
verticalAlign: "baseline",
|
15
15
|
display: "inline-block",
|
16
16
|
borderRadius: "4px",
|
17
|
-
backgroundColor: "#
|
17
|
+
backgroundColor: "#eee",
|
18
18
|
fontSize: "0.9em",
|
19
|
-
boxShadow: selected && focused ? "0 0 0 2px #B4D5FF" : "none"
|
20
|
-
color: "#FFF"
|
19
|
+
boxShadow: selected && focused ? "0 0 0 2px #B4D5FF" : "none"
|
21
20
|
};
|
22
21
|
// See if our empty text child has any styling marks applied and apply those
|
23
22
|
if (element.children[0].bold) {
|
@@ -6,6 +6,7 @@ import { isTextSelected } from "../../utils/helper";
|
|
6
6
|
import { useEditorContext } from "../../hooks/useMouseMove";
|
7
7
|
import SimpleTextStyle from "./style";
|
8
8
|
import { jsx as _jsx } from "react/jsx-runtime";
|
9
|
+
import { Fragment as _Fragment } from "react/jsx-runtime";
|
9
10
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
10
11
|
import { createElement as _createElement } from "react";
|
11
12
|
const SimpleText = props => {
|
@@ -47,9 +48,9 @@ const SimpleText = props => {
|
|
47
48
|
sx: classes.root,
|
48
49
|
key: `para_${path.join("|")}`
|
49
50
|
}, children, openAI ? null : /*#__PURE__*/_jsx("span", {
|
51
|
+
contentEditable: false,
|
50
52
|
className: "placeholder-simple-text",
|
51
|
-
children: isEmptyEditor ? editorPlaceholder || "Write Something..." : showPlaceHolder ? opacity && selected ? /*#__PURE__*/_jsxs(
|
52
|
-
className: "placeholder-simple-text-default",
|
53
|
+
children: isEmptyEditor ? editorPlaceholder || "Write Something..." : showPlaceHolder ? opacity && selected ? /*#__PURE__*/_jsxs(_Fragment, {
|
53
54
|
children: ["Type ", /*#__PURE__*/_jsx("span", {
|
54
55
|
style: {
|
55
56
|
backgroundColor: '#F2F6FA',
|
@@ -123,8 +123,7 @@ const MiniToolbar = props => {
|
|
123
123
|
label,
|
124
124
|
icon: Icon
|
125
125
|
}) => {
|
126
|
-
const isDisabled = popupType === type || type === "undo" ? !canUndo : type === "redo" ? !canRedo : false;
|
127
|
-
|
126
|
+
const isDisabled = popupType === type || type === "undo" ? !canUndo : type === "redo" ? !canRedo : false;
|
128
127
|
return /*#__PURE__*/_jsx(Tooltip, {
|
129
128
|
arrow: true,
|
130
129
|
title: label,
|
@@ -1,22 +1,28 @@
|
|
1
1
|
import React from "react";
|
2
|
-
import { Box, Card, CardMedia, Grid } from "@mui/material";
|
3
|
-
|
4
|
-
// const Select = (props) => {
|
5
|
-
// const { classes, data, onSelectTemplate } = props;
|
6
|
-
// return (
|
7
|
-
// <Box
|
8
|
-
// className="template-card-action"
|
9
|
-
// component={"div"}
|
10
|
-
// sx={classes.templateCardBtnGrp}
|
11
|
-
// style={{ padding: 0, background: "transparent"}}
|
12
|
-
// >
|
13
|
-
// <Button className="blueBtn" onClick={onSelectTemplate(data)}>
|
14
|
-
// Select
|
15
|
-
// </Button>
|
16
|
-
// </Box>
|
17
|
-
// );
|
18
|
-
// };
|
2
|
+
import { Box, Button, Card, CardMedia, Grid } from "@mui/material";
|
19
3
|
import { jsx as _jsx } from "react/jsx-runtime";
|
4
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
5
|
+
const Select = props => {
|
6
|
+
const {
|
7
|
+
classes,
|
8
|
+
data,
|
9
|
+
onSelectTemplate
|
10
|
+
} = props;
|
11
|
+
return /*#__PURE__*/_jsx(Box, {
|
12
|
+
className: "template-card-action",
|
13
|
+
component: "div",
|
14
|
+
sx: classes.templateCardBtnGrp,
|
15
|
+
style: {
|
16
|
+
padding: 0,
|
17
|
+
background: "transparent"
|
18
|
+
},
|
19
|
+
children: /*#__PURE__*/_jsx(Button, {
|
20
|
+
className: "blueBtn",
|
21
|
+
onClick: onSelectTemplate(data),
|
22
|
+
children: "Select"
|
23
|
+
})
|
24
|
+
});
|
25
|
+
};
|
20
26
|
const ButtonTemplateCard = props => {
|
21
27
|
const {
|
22
28
|
classes,
|
@@ -28,19 +34,19 @@ const ButtonTemplateCard = props => {
|
|
28
34
|
xs: 3,
|
29
35
|
children: /*#__PURE__*/_jsx(Card, {
|
30
36
|
sx: classes.paperOverrides,
|
31
|
-
children: /*#__PURE__*/
|
37
|
+
children: /*#__PURE__*/_jsxs(Box, {
|
32
38
|
sx: classes.buttonCardMediaWrpr,
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
})
|
39
|
+
children: [/*#__PURE__*/_jsx(CardMedia, {
|
40
|
+
className: `template-card-media`,
|
41
|
+
component: "div",
|
42
|
+
image: m?.thumbnail,
|
43
|
+
alt: m?.title,
|
44
|
+
sx: classes.buttonCardMedia
|
45
|
+
}), /*#__PURE__*/_jsx(Select, {
|
46
|
+
classes: classes,
|
47
|
+
onSelectTemplate: onSelectTemplate,
|
48
|
+
data: m
|
49
|
+
})]
|
44
50
|
})
|
45
51
|
})
|
46
52
|
}, `template_${m.id}`);
|
@@ -1,22 +1,27 @@
|
|
1
1
|
import React from "react";
|
2
|
-
import { Box, Card, CardMedia, Grid } from "@mui/material";
|
3
|
-
|
4
|
-
// const Select = (props) => {
|
5
|
-
// const { classes, data, onSelectTemplate } = props;
|
6
|
-
// return (
|
7
|
-
// <Box
|
8
|
-
// className="template-card-action"
|
9
|
-
// component={"div"}
|
10
|
-
// sx={classes.templateCardBtnGrp}
|
11
|
-
// style={{background: "transparent"}}
|
12
|
-
// >
|
13
|
-
// <Button className="blueBtn" onClick={onSelectTemplate(data)}>
|
14
|
-
// Select
|
15
|
-
// </Button>
|
16
|
-
// </Box>
|
17
|
-
// );
|
18
|
-
// };
|
2
|
+
import { Box, Button, Card, CardMedia, Grid } from "@mui/material";
|
19
3
|
import { jsx as _jsx } from "react/jsx-runtime";
|
4
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
5
|
+
const Select = props => {
|
6
|
+
const {
|
7
|
+
classes,
|
8
|
+
data,
|
9
|
+
onSelectTemplate
|
10
|
+
} = props;
|
11
|
+
return /*#__PURE__*/_jsx(Box, {
|
12
|
+
className: "template-card-action",
|
13
|
+
component: "div",
|
14
|
+
sx: classes.templateCardBtnGrp,
|
15
|
+
style: {
|
16
|
+
background: "transparent"
|
17
|
+
},
|
18
|
+
children: /*#__PURE__*/_jsx(Button, {
|
19
|
+
className: "blueBtn",
|
20
|
+
onClick: onSelectTemplate(data),
|
21
|
+
children: "Select"
|
22
|
+
})
|
23
|
+
});
|
24
|
+
};
|
20
25
|
const FullViewCard = props => {
|
21
26
|
const {
|
22
27
|
classes,
|
@@ -30,19 +35,19 @@ const FullViewCard = props => {
|
|
30
35
|
children: /*#__PURE__*/_jsx(Card, {
|
31
36
|
sx: classes.paperOverrides,
|
32
37
|
className: "paperOverrides",
|
33
|
-
children: /*#__PURE__*/
|
34
|
-
sx: classes.
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
})
|
38
|
+
children: /*#__PURE__*/_jsxs(Box, {
|
39
|
+
sx: classes.buttonCardMediaWrpr,
|
40
|
+
children: [/*#__PURE__*/_jsx(CardMedia, {
|
41
|
+
component: "div",
|
42
|
+
image: m?.thumbnail,
|
43
|
+
alt: m?.title,
|
44
|
+
sx: classes.fullViewCardMedia,
|
45
|
+
className: height
|
46
|
+
}), /*#__PURE__*/_jsx(Select, {
|
47
|
+
classes: classes,
|
48
|
+
onSelectTemplate: onSelectTemplate,
|
49
|
+
data: m
|
50
|
+
})]
|
46
51
|
})
|
47
52
|
})
|
48
53
|
}, `template_${m.id}`);
|
@@ -13,7 +13,6 @@ import PopperHeader from "../PopperHeader";
|
|
13
13
|
import MiniColorPicker from "./MiniColorPicker";
|
14
14
|
import SelectAlignment from "./SelectAlignment";
|
15
15
|
import SelectFontSize from "./SelectFontSize";
|
16
|
-
// import InfinityAITool from "./InfinityAITool";
|
17
16
|
import { jsx as _jsx } from "react/jsx-runtime";
|
18
17
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
19
18
|
const DEFAULT_COLOR = {
|
@@ -28,7 +27,6 @@ const MiniTextFormat = props => {
|
|
28
27
|
classes,
|
29
28
|
editor,
|
30
29
|
closeMainPopup
|
31
|
-
// customProps
|
32
30
|
} = props;
|
33
31
|
const [anchorEl, setAnchorEl] = useState(null);
|
34
32
|
const open = Boolean(anchorEl);
|
@@ -3,9 +3,10 @@ const usePopupStyle = theme => ({
|
|
3
3
|
boxShadow: "1px 2px 15px 0px #2563EB40",
|
4
4
|
zIndex: 1300,
|
5
5
|
marginBottom: "12px !important",
|
6
|
-
border: "1px solid #D8DDE1",
|
7
6
|
borderRadius: "6px",
|
7
|
+
border: "1px solid #D8DDE1",
|
8
8
|
maxWidth: "100%",
|
9
|
+
// maxHeight: "40px",
|
9
10
|
"&.fullscreen": {
|
10
11
|
marginBottom: "0px !important",
|
11
12
|
"& .papper-wrpr": {
|
@@ -481,10 +482,9 @@ const usePopupStyle = theme => ({
|
|
481
482
|
}
|
482
483
|
},
|
483
484
|
fullViewCardMedia: {
|
484
|
-
margin: "5px 0px",
|
485
485
|
width: "100%",
|
486
486
|
backgroundPosition: "left top",
|
487
|
-
backgroundSize: "100
|
487
|
+
backgroundSize: "100% auto",
|
488
488
|
zIndex: 1,
|
489
489
|
position: "relative",
|
490
490
|
"&.fullscreen": {
|
@@ -499,10 +499,9 @@ const usePopupStyle = theme => ({
|
|
499
499
|
}
|
500
500
|
},
|
501
501
|
buttonCardMedia: {
|
502
|
-
margin: "5px 0px",
|
503
502
|
width: "100%",
|
504
|
-
height: "
|
505
|
-
backgroundPosition: "
|
503
|
+
height: "48px",
|
504
|
+
backgroundPosition: "left top",
|
506
505
|
backgroundSize: "contain",
|
507
506
|
zIndex: 1,
|
508
507
|
position: "relative",
|
@@ -511,25 +510,26 @@ const usePopupStyle = theme => ({
|
|
511
510
|
}
|
512
511
|
},
|
513
512
|
buttonCardMediaWrpr: {
|
514
|
-
padding: "5px",
|
515
513
|
position: "relative",
|
516
514
|
margin: "8px",
|
517
|
-
|
518
|
-
"
|
519
|
-
"
|
520
|
-
|
521
|
-
backgroundColor: "#E9F3FE",
|
522
|
-
border: "1px solid #2563EB40",
|
523
|
-
borderRadius: "5px",
|
524
|
-
// height: "100%",
|
525
|
-
margin: "0px"
|
526
|
-
// "& .template-card-action": {
|
527
|
-
// display: "flex",
|
528
|
-
// },
|
515
|
+
marginBottom: "0px",
|
516
|
+
"&:hover": {
|
517
|
+
"& .template-card-action": {
|
518
|
+
display: "flex"
|
529
519
|
}
|
520
|
+
},
|
521
|
+
"& .img-loader-wrapper": {
|
522
|
+
position: "absolute",
|
523
|
+
width: "12px",
|
524
|
+
height: "12px",
|
525
|
+
left: 0,
|
526
|
+
right: 0,
|
527
|
+
top: 0,
|
528
|
+
bottom: 0,
|
529
|
+
margin: "auto",
|
530
|
+
zIndex: 0
|
530
531
|
}
|
531
532
|
},
|
532
|
-
|
533
533
|
paperOverrides: {
|
534
534
|
"&.MuiPaper-root": {
|
535
535
|
background: "transparent",
|
@@ -587,13 +587,12 @@ const usePopupStyle = theme => ({
|
|
587
587
|
},
|
588
588
|
customSelectPopoverWrapper: {
|
589
589
|
"& .MuiPopover-paper": {
|
590
|
+
maxHeight: "140px",
|
590
591
|
// minWidth: "130px",
|
591
592
|
border: "1px solid #E4E8EB",
|
592
|
-
maxHeight: "140px",
|
593
593
|
background: `${theme?.palette?.editor?.background} !important`,
|
594
|
-
// overflowY: "hidden",
|
595
|
-
padding: "6px 12px 6px 0px",
|
596
594
|
overflowY: "scroll",
|
595
|
+
padding: "6px 12px 6px 0px",
|
597
596
|
"@media only screen and (max-width: 600px)": {
|
598
597
|
marginTop: "-40px"
|
599
598
|
}
|
@@ -643,21 +642,6 @@ const usePopupStyle = theme => ({
|
|
643
642
|
"& fieldset": {
|
644
643
|
border: "none !important"
|
645
644
|
}
|
646
|
-
},
|
647
|
-
fullViewCardMediaWrpr: {
|
648
|
-
padding: "5px",
|
649
|
-
position: "relative",
|
650
|
-
margin: "8px",
|
651
|
-
height: "140px",
|
652
|
-
"& .img-wrapper": {
|
653
|
-
"&:hover": {
|
654
|
-
padding: "0px 2px 0px 2px",
|
655
|
-
backgroundColor: "#E9F3FE",
|
656
|
-
border: "1px solid #2563EB40",
|
657
|
-
borderRadius: "5px",
|
658
|
-
margin: "0px"
|
659
|
-
}
|
660
|
-
}
|
661
645
|
}
|
662
646
|
});
|
663
647
|
export default usePopupStyle;
|
@@ -80,16 +80,16 @@ const PopupTool = props => {
|
|
80
80
|
updateAnchorEl();
|
81
81
|
}
|
82
82
|
}, [selection]);
|
83
|
-
const handleClose = () => {
|
84
|
-
setAnchorEl(null);
|
85
|
-
setOpen(false);
|
86
|
-
setPopupType("");
|
87
|
-
};
|
88
83
|
useEffect(() => {
|
89
84
|
if (selectedElement?.enable === 1) {
|
90
85
|
setAnchorEl(null);
|
91
86
|
}
|
92
87
|
}, [selection, selectedElement?.path, selectedElement?.enable]);
|
88
|
+
const handleClose = () => {
|
89
|
+
setAnchorEl(null);
|
90
|
+
setOpen(false);
|
91
|
+
setPopupType("");
|
92
|
+
};
|
93
93
|
return open && !openAI ? /*#__PURE__*/_jsx(ClickAwayListener, {
|
94
94
|
onClickAway: e => {
|
95
95
|
// close the mini toolbar, if user clicks outside the editor (in Flozy app.)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { useEffect } from "react";
|
2
2
|
import WebFont from "webfontloader";
|
3
3
|
import { useEditorContext } from "../../hooks/useMouseMove";
|
4
|
-
const defaultFonts = [
|
4
|
+
const defaultFonts = ["PoppinsRegular", "PoppinsBold", "Helvetica", "Georgia", "Times New Roman", "Monaco", "Courier New", "Qwitcher Grypen", "EB Garamond", "Anton", "DM Serif Text", "Libre Baskerville", "Montserrat", "Open Sans", "Public Sans", "Raleway", "Space Mono", "Bulgarian Garamond", "Impact", "Redacted Script", "Great Vibes", "Zeyada", "Allura", "Pinyon Script", "Herr Von Muellerhoff", "Dawning of a New Day", "Coming Soon", "Dancing Script", "Engagement", "Gaegu", "Ingrid Darling", "Kite One", "La Belle Aurore", "Mea Culpa", "Meddon", "Merriweather", "The Girl Next Door"];
|
5
5
|
const FontLoader = props => {
|
6
6
|
const {
|
7
7
|
otherProps,
|
@@ -15,7 +15,7 @@ const FontLoader = props => {
|
|
15
15
|
let retryCount = 0;
|
16
16
|
function loadNextBatch() {
|
17
17
|
if (currentIndex >= families?.length) {
|
18
|
-
console.log(
|
18
|
+
console.log("All fonts have been loaded");
|
19
19
|
return;
|
20
20
|
}
|
21
21
|
const batch = families?.slice(currentIndex, currentIndex + batchSize);
|
@@ -68,13 +68,13 @@ const FontLoader = props => {
|
|
68
68
|
});
|
69
69
|
} else {
|
70
70
|
function correctFontArray(fontString) {
|
71
|
-
let fontsArray = fontString.split(
|
71
|
+
let fontsArray = fontString.split(",");
|
72
72
|
let cleanedFontsArray = [...new Set(fontsArray.map(font => font.trim()))];
|
73
73
|
return cleanedFontsArray;
|
74
74
|
}
|
75
75
|
function sanitizeFontFamily(fontFamily) {
|
76
76
|
const correctedFonts = correctFontArray(fontFamily);
|
77
|
-
return correctedFonts.join(
|
77
|
+
return correctedFonts.join(", ");
|
78
78
|
}
|
79
79
|
const elements = Array.from(document?.querySelectorAll("*"));
|
80
80
|
const fontSet = new Set();
|
@@ -83,8 +83,8 @@ const FontLoader = props => {
|
|
83
83
|
fontSet.add(sanitizeFontFamily(computedStyles?.fontFamily));
|
84
84
|
});
|
85
85
|
let families = Array.from(fontSet);
|
86
|
-
families = correctFontArray(families.join(
|
87
|
-
families = families.map(font => font.replace(/\"/g,
|
86
|
+
families = correctFontArray(families.join(", "));
|
87
|
+
families = families.map(font => font.replace(/\"/g, ""));
|
88
88
|
loadFontsInBatches(families);
|
89
89
|
}
|
90
90
|
}, []);
|
@@ -224,7 +224,6 @@ const iconList = {
|
|
224
224
|
fill: "#64748B"
|
225
225
|
}
|
226
226
|
}),
|
227
|
-
calenderNewIcon: /*#__PURE__*/_jsx(CalendlyIcon, {}),
|
228
227
|
freegrid: /*#__PURE__*/_jsx(CiGrid32, {
|
229
228
|
size: 20,
|
230
229
|
style: {
|
@@ -234,6 +233,7 @@ const iconList = {
|
|
234
233
|
text: /*#__PURE__*/_jsx(Text, {
|
235
234
|
stroke: "#64748B"
|
236
235
|
}),
|
236
|
+
calenderNewIcon: /*#__PURE__*/_jsx(CalendlyIcon, {}),
|
237
237
|
textArea: /*#__PURE__*/_jsx(TextAreaIcon, {}),
|
238
238
|
phone: /*#__PURE__*/_jsx(Phone, {}),
|
239
239
|
briefCase: /*#__PURE__*/_jsx(BriefCase, {}),
|
@@ -155,6 +155,7 @@ const RnD = props => {
|
|
155
155
|
switch (e.detail) {
|
156
156
|
case 1:
|
157
157
|
if (!enable) {
|
158
|
+
// focusSelection(editor, { path });
|
158
159
|
setSelectedElement({
|
159
160
|
path: str_path,
|
160
161
|
enable: 1,
|
@@ -162,7 +163,6 @@ const RnD = props => {
|
|
162
163
|
anchorEl: rndRef?.current
|
163
164
|
});
|
164
165
|
}
|
165
|
-
// ReactEditor.focus(editor);
|
166
166
|
break;
|
167
167
|
case 2:
|
168
168
|
focusSelection(editor, {
|
@@ -270,7 +270,9 @@ const RnD = props => {
|
|
270
270
|
dragOver: null
|
271
271
|
}, null);
|
272
272
|
}
|
273
|
+
// focusSelection(editor, { path: updated_at });
|
273
274
|
};
|
275
|
+
|
274
276
|
const onDragStart = e => {
|
275
277
|
e.preventDefault();
|
276
278
|
if (e?.target?.dataset?.path?.split(",").join("|") === sp) {
|
@@ -312,7 +314,6 @@ const RnD = props => {
|
|
312
314
|
const onDrag = (e, d) => {
|
313
315
|
e.preventDefault();
|
314
316
|
const lines = getClosestDraggable(e.clientX, e.clientY, `.freegrid-section_${parentSectionPath} .freegrid-container .freegrid-item.inactive-drag`.replace(/\|/g, "\\|"), ".freegrid-item.active-drag:not(.exclude-virtual)");
|
315
|
-
console.log(lines);
|
316
317
|
setAbsPosition({
|
317
318
|
...absPosition,
|
318
319
|
"--zIndex": 2000
|
@@ -104,6 +104,13 @@ const Section = props => {
|
|
104
104
|
};
|
105
105
|
const isFreeGrid = element?.children?.find(f => f.type === "freegrid");
|
106
106
|
const needHover = element?.children?.find(f => f.type === "grid" && !list_types.includes(element.type)) ? "needHover" : "";
|
107
|
+
let tempProps = {};
|
108
|
+
if (element?.type === "temp") {
|
109
|
+
tempProps = {
|
110
|
+
"--left": `${element?.left}px`,
|
111
|
+
"--top": `${element?.top}px`
|
112
|
+
};
|
113
|
+
}
|
107
114
|
const sectionBgImage = sectionBackgroundImage && sectionBackgroundImage !== "none" ? {
|
108
115
|
backgroundImage: `url(${sectionBackgroundImage})`
|
109
116
|
} : {};
|
@@ -122,7 +129,10 @@ const Section = props => {
|
|
122
129
|
}, theme);
|
123
130
|
return path.length === 1 && !isFreeGrid ? /*#__PURE__*/_jsxs(Box, {
|
124
131
|
component: "div",
|
125
|
-
className: `ed-section-wrapper ${readOnly ? "" : "hselect"} ${needHover}`,
|
132
|
+
className: `ed-section-wrapper ${readOnly ? "" : "hselect"} ${needHover} is-${element?.type}`,
|
133
|
+
style: {
|
134
|
+
...tempProps
|
135
|
+
},
|
126
136
|
sx: {
|
127
137
|
...classes.root,
|
128
138
|
background: sectionBgColor,
|
@@ -52,6 +52,20 @@ const SectionStyle = theme => ({
|
|
52
52
|
[theme.breakpoints.between("xs", "md")]: {
|
53
53
|
maxWidth: `320px !important`
|
54
54
|
}
|
55
|
+
},
|
56
|
+
"&.is-temp": {
|
57
|
+
position: "fixed",
|
58
|
+
background: "red",
|
59
|
+
padding: "12px",
|
60
|
+
width: "10px",
|
61
|
+
height: "10px",
|
62
|
+
// left: 0,
|
63
|
+
// top: 0,
|
64
|
+
margin: "auto",
|
65
|
+
left: "var(--left)",
|
66
|
+
top: "var(--top)",
|
67
|
+
zIndex: 1000,
|
68
|
+
pointerEvents: "none"
|
55
69
|
}
|
56
70
|
}
|
57
71
|
});
|
@@ -3,6 +3,6 @@ const mentions = props => {
|
|
3
3
|
CHARACTERS,
|
4
4
|
search
|
5
5
|
} = props;
|
6
|
-
return CHARACTERS.filter(c => c
|
6
|
+
return CHARACTERS.filter(c => c.name.toLowerCase().startsWith(search?.toLowerCase())).slice(0, 10);
|
7
7
|
};
|
8
8
|
export default mentions;
|
@@ -0,0 +1,70 @@
|
|
1
|
+
import { Editor, Transforms } from "slate";
|
2
|
+
import { ReactEditor } from "slate-react";
|
3
|
+
const TEMP_NODE_ID = "temp-focus-node";
|
4
|
+
const ensureTemporaryFocusNode = (editor, selectedDOM) => {
|
5
|
+
// Check if the temporary focus node already exists
|
6
|
+
const {
|
7
|
+
left,
|
8
|
+
top
|
9
|
+
} = selectedDOM?.getBoundingClientRect();
|
10
|
+
const [tempNodeEntry] = Editor.nodes(editor, {
|
11
|
+
at: [],
|
12
|
+
match: n => n.temp === TEMP_NODE_ID
|
13
|
+
});
|
14
|
+
if (!tempNodeEntry) {
|
15
|
+
// If not, insert the temporary focus node at the start of the editor
|
16
|
+
Transforms.insertNodes(editor, {
|
17
|
+
type: "temp",
|
18
|
+
temp: TEMP_NODE_ID,
|
19
|
+
children: [{
|
20
|
+
text: ""
|
21
|
+
}],
|
22
|
+
left,
|
23
|
+
top
|
24
|
+
}, {
|
25
|
+
at: [editor.children.length]
|
26
|
+
});
|
27
|
+
} else {
|
28
|
+
Transforms.setNodes(editor, {
|
29
|
+
type: "temp",
|
30
|
+
temp: TEMP_NODE_ID,
|
31
|
+
children: [{
|
32
|
+
text: ""
|
33
|
+
}],
|
34
|
+
left,
|
35
|
+
top
|
36
|
+
}, {
|
37
|
+
at: tempNodeEntry[1]
|
38
|
+
});
|
39
|
+
}
|
40
|
+
};
|
41
|
+
export const focusUsingTemporaryNode = (editor, selectedDOM) => {
|
42
|
+
// de-select and select
|
43
|
+
Transforms.deselect(editor);
|
44
|
+
|
45
|
+
// Ensure the temporary node exists
|
46
|
+
ensureTemporaryFocusNode(editor, selectedDOM);
|
47
|
+
|
48
|
+
// Select the temporary node without causing scroll
|
49
|
+
const [tempNodeEntry] = Editor.nodes(editor, {
|
50
|
+
at: [],
|
51
|
+
match: n => n.temp === TEMP_NODE_ID
|
52
|
+
});
|
53
|
+
if (tempNodeEntry) {
|
54
|
+
const [, path] = tempNodeEntry;
|
55
|
+
Transforms.select(editor, path); // Move selection to the temp node
|
56
|
+
}
|
57
|
+
|
58
|
+
ReactEditor.focus(editor);
|
59
|
+
};
|
60
|
+
export const cleanupTemporaryFocusNode = editor => {
|
61
|
+
// Remove the temporary focus node if it exists
|
62
|
+
for (const [node, path] of Editor.nodes(editor, {
|
63
|
+
at: [],
|
64
|
+
match: n => n.temp === TEMP_NODE_ID
|
65
|
+
})) {
|
66
|
+
Transforms.removeNodes(editor, {
|
67
|
+
at: path
|
68
|
+
});
|
69
|
+
}
|
70
|
+
};
|
@@ -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
|
const HIDE_PLACHOLDERS = ["grid", "grid-item", "table"];
|
8
9
|
const PREVIEW_IMAGE_HIDE_CLASS = ["grid-container-toolbar", "grid-item-toolbar", "element-toolbar", "mini-tool-wrpr-ei", "element-selector", "element-selector-ctrl"];
|
9
10
|
const RND_ITEMS = ["freegridItem", "freegridBox"];
|
@@ -254,8 +255,9 @@ export const focusSelection = (editor, {
|
|
254
255
|
const selectedDOM = ReactEditor.toDOMNode(editor, selectedNode);
|
255
256
|
selectedDOM.scrollIntoView({
|
256
257
|
behavior: "smooth",
|
257
|
-
block: "
|
258
|
+
block: "nearest"
|
258
259
|
});
|
260
|
+
// focusUsingTemporaryNode(editor, selectedDOM);
|
259
261
|
} catch (err) {
|
260
262
|
console.log(err);
|
261
263
|
}
|
@@ -302,7 +304,7 @@ export const getTextColor = (color = "") => {
|
|
302
304
|
WebkitTextFillColor: "transparent !important",
|
303
305
|
color: "transparent !important",
|
304
306
|
caretColor: "black",
|
305
|
-
|
307
|
+
"& span": {
|
306
308
|
color: "transparent !important"
|
307
309
|
}
|
308
310
|
} : {
|
@@ -13,7 +13,7 @@ const getStartEnd = ({
|
|
13
13
|
// Get start and end, modify it as we move along.
|
14
14
|
let [start, end] = Range.edges(selection);
|
15
15
|
|
16
|
-
// Move backwards
|
16
|
+
// Move backwards
|
17
17
|
while (true) {
|
18
18
|
const before = Editor.before(editor, start, {
|
19
19
|
unit: "character"
|
@@ -22,15 +22,16 @@ const getStartEnd = ({
|
|
22
22
|
anchor: before,
|
23
23
|
focus: start
|
24
24
|
});
|
25
|
-
if (before) {
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
start = before;
|
30
|
-
} else {
|
31
|
-
start = before;
|
25
|
+
if (before && wordBefore && SHORTHAND_CMDS.indexOf(wordBefore) < 0) {
|
26
|
+
start = before;
|
27
|
+
if (start.offset === 0) {
|
28
|
+
// Means we've wrapped to beginning of another block
|
32
29
|
break;
|
33
30
|
}
|
31
|
+
} else if (SHORTHAND_CMDS.indexOf(wordBefore) >= 0) {
|
32
|
+
// reached the character end
|
33
|
+
start = before;
|
34
|
+
break;
|
34
35
|
} else {
|
35
36
|
break;
|
36
37
|
}
|
@@ -40,38 +41,11 @@ const getStartEnd = ({
|
|
40
41
|
focus: end
|
41
42
|
};
|
42
43
|
const word = Editor.string(editor, wordRange);
|
43
|
-
const firstChar = word[0];
|
44
|
-
|
45
|
-
// Handle the commands
|
46
|
-
if (firstChar === '@') {
|
47
|
-
// Only trigger @ if preceded by a space
|
48
|
-
const isPrecededBySpace = Editor.string(editor, {
|
49
|
-
anchor: {
|
50
|
-
path: start.path,
|
51
|
-
offset: start.offset - 1
|
52
|
-
},
|
53
|
-
focus: start
|
54
|
-
}).trim() === "";
|
55
|
-
if (isPrecededBySpace) {
|
56
|
-
return {
|
57
|
-
word,
|
58
|
-
search: word.substring(1),
|
59
|
-
target: wordRange,
|
60
|
-
type: TYPES[firstChar]
|
61
|
-
};
|
62
|
-
}
|
63
|
-
} else if (firstChar === '/') {
|
64
|
-
return {
|
65
|
-
word,
|
66
|
-
search: word.substring(1),
|
67
|
-
target: wordRange,
|
68
|
-
type: TYPES[firstChar]
|
69
|
-
};
|
70
|
-
}
|
71
44
|
return {
|
72
|
-
word
|
73
|
-
|
74
|
-
|
45
|
+
word,
|
46
|
+
search: word?.substring(1, word.length),
|
47
|
+
target: wordRange,
|
48
|
+
type: TYPES[word[0]]
|
75
49
|
};
|
76
50
|
} catch (err) {
|
77
51
|
return {
|
@@ -9,12 +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
|
-
const withCommon = (props, {
|
13
|
-
needLayout
|
14
|
-
isChatEditor = false
|
15
|
-
}) => {
|
16
|
-
const editor = needLayout ? withErrorHandling(withHtml(withEquation(withLayout(withHistory(withEmbeds(withTables(withLinks(withMentions(withCustomDeleteBackward(withReact(props))))))))))) : withErrorHandling(withHtml(withEquation(withHistory(withEmbeds(withTables(withLinks(withMentions(withCustomDeleteBackward(withReact(props))))))))));
|
17
|
-
editor.isChatEditor = isChatEditor;
|
18
|
-
return editor;
|
12
|
+
const withCommon = (props, rest = {}) => {
|
13
|
+
return rest.needLayout ? withErrorHandling(withHtml(withEquation(withLayout(withHistory(withEmbeds(withTables(withLinks(withMentions(withCustomDeleteBackward(withReact(props))))))))))) : withErrorHandling(withHtml(withEquation(withHistory(withEmbeds(withTables(withLinks(withMentions(withCustomDeleteBackward(withReact(props))))))))));
|
19
14
|
};
|
20
15
|
export default withCommon;
|
@@ -114,23 +114,6 @@ const withHtml = editor => {
|
|
114
114
|
const defaultInsert = loopChildren(decoded, true);
|
115
115
|
if (defaultInsert) {
|
116
116
|
insertData(data);
|
117
|
-
// } else if (editor.isChatEditor) {
|
118
|
-
// // Only convert table to paragraphs if in chat editor mode
|
119
|
-
// const paragraphs = decoded.map(row =>
|
120
|
-
// row.children.map(cell =>
|
121
|
-
// cell.children.map(paragraph =>
|
122
|
-
// paragraph.children.map(textNode => textNode.text).join('')
|
123
|
-
// ).join(' ')
|
124
|
-
// ).join(' ')
|
125
|
-
// ).join('\n'); // Joining with a newline for separate paragraphs
|
126
|
-
|
127
|
-
// // Insert text as paragraphs
|
128
|
-
// const textNodes = paragraphs.split('\n').map(text => ({
|
129
|
-
// type: 'paragraph',
|
130
|
-
// children: [{ text }]
|
131
|
-
// }));
|
132
|
-
|
133
|
-
// Transforms.insertNodes(editor, textNodes);
|
134
117
|
} else {
|
135
118
|
// do not paste table, grid inside table cell
|
136
119
|
// only plain text for internal paste
|
@@ -144,9 +127,6 @@ const withHtml = editor => {
|
|
144
127
|
const parsed = new DOMParser().parseFromString(html, "text/html");
|
145
128
|
const isGoogleSheet = parsed.body.querySelector("google-sheets-html-origin");
|
146
129
|
if (isGoogleSheet) {
|
147
|
-
if (editor.isChatEditor) {
|
148
|
-
return;
|
149
|
-
}
|
150
130
|
const table = parsed.body.querySelector("table");
|
151
131
|
const colGrp = table.querySelector("colgroup");
|
152
132
|
if (colGrp) {
|
@@ -158,15 +138,6 @@ const withHtml = editor => {
|
|
158
138
|
}
|
159
139
|
const fragment = deserialize(parsed.body);
|
160
140
|
const formattedFragment = formatFragment[eltype] ? formatFragment[eltype](fragment) : fragment;
|
161
|
-
let is_img_table = false;
|
162
|
-
formattedFragment.map(f => {
|
163
|
-
if (f.type === 'image' || f?.type?.includes('table')) {
|
164
|
-
is_img_table = true;
|
165
|
-
}
|
166
|
-
});
|
167
|
-
if (editor.isChatEditor && is_img_table) {
|
168
|
-
return;
|
169
|
-
}
|
170
141
|
handleInsert(editor, () => Transforms.insertFragment(editor, formattedFragment), formattedFragment);
|
171
142
|
return;
|
172
143
|
} else {
|
@@ -529,6 +529,15 @@ export const getBlock = props => {
|
|
529
529
|
return /*#__PURE__*/_jsx(Code, {
|
530
530
|
...props
|
531
531
|
});
|
532
|
+
// RnD Focus Node
|
533
|
+
case "temp":
|
534
|
+
return /*#__PURE__*/_jsx("span", {
|
535
|
+
...attributes,
|
536
|
+
...element.attr,
|
537
|
+
contentEditable: false,
|
538
|
+
className: "temp-focus-node",
|
539
|
+
children: children
|
540
|
+
});
|
532
541
|
default:
|
533
542
|
return /*#__PURE__*/_jsx(SimpleText, {
|
534
543
|
...props,
|
@@ -1,6 +1,9 @@
|
|
1
1
|
import { Editor, Transforms, Element as SlateElement } from "slate";
|
2
2
|
import { Box } from "@mui/material";
|
3
3
|
import { fontFamilyMap, sizeMap } from "../font";
|
4
|
+
import Table from "../../Elements/Table/Table";
|
5
|
+
import TableRow from "../../Elements/Table/TableRow";
|
6
|
+
import TableCell from "../../Elements/Table/TableCell";
|
4
7
|
import Mentions from "../../Elements/Mentions/Mentions";
|
5
8
|
import CheckList from "../../Elements/List/CheckList";
|
6
9
|
import { isEmptyTextNode } from "../../helper";
|
@@ -337,11 +340,31 @@ export const getBlock = props => {
|
|
337
340
|
...props,
|
338
341
|
isEmpty: isEmpty
|
339
342
|
});
|
343
|
+
case "table":
|
344
|
+
return /*#__PURE__*/_jsx(Table, {
|
345
|
+
...props
|
346
|
+
});
|
347
|
+
case "table-head":
|
348
|
+
return /*#__PURE__*/_jsx("thead", {
|
349
|
+
children: children
|
350
|
+
});
|
351
|
+
case "table-body":
|
352
|
+
return /*#__PURE__*/_jsx("tbody", {
|
353
|
+
children: children
|
354
|
+
});
|
355
|
+
case "table-row":
|
356
|
+
return /*#__PURE__*/_jsx(TableRow, {
|
357
|
+
...props
|
358
|
+
});
|
359
|
+
case "table-cell":
|
360
|
+
return /*#__PURE__*/_jsx(TableCell, {
|
361
|
+
...props
|
362
|
+
});
|
340
363
|
case "mention":
|
341
364
|
return /*#__PURE__*/_jsx(Mentions, {
|
342
365
|
...props
|
343
366
|
});
|
344
367
|
default:
|
345
|
-
return
|
368
|
+
return;
|
346
369
|
}
|
347
370
|
};
|
@@ -285,4 +285,40 @@ export const enterEvent = (e, editor, isMobile) => {
|
|
285
285
|
} catch (err) {
|
286
286
|
console.log(err);
|
287
287
|
}
|
288
|
+
};
|
289
|
+
export const upDownArrowKeyEvents = (e, editor) => {
|
290
|
+
try {
|
291
|
+
const {
|
292
|
+
selection
|
293
|
+
} = editor;
|
294
|
+
if (!selection || Range.isCollapsed(selection)) {
|
295
|
+
return;
|
296
|
+
}
|
297
|
+
const parentPath = selection.anchor.path.slice(0, -1);
|
298
|
+
const nextNodePath = [...parentPath];
|
299
|
+
const index = parentPath[parentPath.length - 1];
|
300
|
+
const parentNode = Editor.parent(editor, parentPath);
|
301
|
+
if (parentNode.children[index + 1]) {
|
302
|
+
nextNodePath[parentPath.length - 1] += 1;
|
303
|
+
} else {
|
304
|
+
return;
|
305
|
+
}
|
306
|
+
Transforms.move(editor, {
|
307
|
+
distance: 0,
|
308
|
+
unit: 'offset',
|
309
|
+
reverse: false
|
310
|
+
});
|
311
|
+
Transforms.select(editor, {
|
312
|
+
anchor: {
|
313
|
+
path: nextNodePath,
|
314
|
+
offset: 0
|
315
|
+
},
|
316
|
+
focus: {
|
317
|
+
path: nextNodePath,
|
318
|
+
offset: 0
|
319
|
+
}
|
320
|
+
});
|
321
|
+
} catch (err) {
|
322
|
+
console.log(err);
|
323
|
+
}
|
288
324
|
};
|