@flozy/editor 4.0.6 → 4.0.8
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/ChatEditor.js +21 -25
- package/dist/Editor/CommonEditor.js +3 -0
- package/dist/Editor/Editor.css +12 -1
- package/dist/Editor/Elements/AI/PopoverAIInput.js +3 -2
- package/dist/Editor/Elements/Accordion/Accordion.js +1 -1
- package/dist/Editor/Elements/Accordion/AccordionSummary.js +21 -5
- package/dist/Editor/Elements/EmbedScript/Code.js +14 -12
- package/dist/Editor/Elements/EmbedScript/EmbedScript.js +7 -115
- package/dist/Editor/Elements/EmbedScript/EmbedScriptPopup.js +130 -0
- package/dist/Editor/Elements/Emoji/EmojiPicker.js +4 -2
- package/dist/Editor/Elements/FreeGrid/FreeGrid.js +55 -7
- package/dist/Editor/Elements/FreeGrid/FreeGridBox.js +8 -2
- package/dist/Editor/Elements/FreeGrid/FreeGridItem.js +43 -6
- package/dist/Editor/Elements/FreeGrid/Options/AddElement.js +9 -1
- package/dist/Editor/Elements/FreeGrid/Options/sectionItemOptions.js +5 -1
- package/dist/Editor/Elements/FreeGrid/styles.js +27 -0
- package/dist/Editor/Elements/List/CheckList.js +2 -1
- package/dist/Editor/Elements/Table/Table.js +3 -4
- package/dist/Editor/Elements/Table/TableCell.js +1 -1
- package/dist/Editor/Elements/Table/TableRow.js +2 -1
- package/dist/Editor/Toolbar/FormatTools/FontFamilyAutocomplete.js +66 -0
- package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +9 -8
- package/dist/Editor/Toolbar/PopupTool/TextFormat.js +8 -4
- package/dist/Editor/common/ColorPickerButton.js +12 -4
- package/dist/Editor/common/FontLoader/FontLoader.js +68 -0
- package/dist/Editor/common/Icon.js +4 -0
- package/dist/Editor/common/RnD/ElementOptions/Actions.js +7 -0
- package/dist/Editor/common/RnD/ElementSettings/OtherSettings/Settings.js +4 -2
- package/dist/Editor/common/RnD/ElementSettings/Settings/CodeSettings.js +47 -0
- package/dist/Editor/common/RnD/ElementSettings/Settings/TableSettings.js +77 -0
- package/dist/Editor/common/RnD/ElementSettings/Settings/TextSettings.js +4 -2
- package/dist/Editor/common/RnD/ElementSettings/Settings/index.js +5 -1
- package/dist/Editor/common/RnD/ElementSettings/settingsConstants.js +8 -4
- package/dist/Editor/common/RnD/OptionsPopup/style.js +23 -4
- package/dist/Editor/common/RnD/index.js +5 -4
- package/dist/Editor/common/StyleBuilder/accordionTitleBtnStyle.js +2 -1
- package/dist/Editor/common/StyleBuilder/appHeaderStyle.js +1 -0
- package/dist/Editor/common/StyleBuilder/boxStyle.js +31 -0
- package/dist/Editor/common/StyleBuilder/buttonStyle.js +1 -0
- package/dist/Editor/common/StyleBuilder/embedScriptStyle.js +10 -0
- package/dist/Editor/common/StyleBuilder/fieldTypes/bannerSpacing.js +15 -9
- 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/textOptions.js +19 -3
- package/dist/Editor/common/StyleBuilder/formButtonStyle.js +1 -0
- package/dist/Editor/common/StyleBuilder/formStyle.js +1 -0
- package/dist/Editor/common/StyleBuilder/sectionStyle.js +2 -1
- package/dist/Editor/helper/deserialize/index.js +3 -0
- package/dist/Editor/helper/index.js +24 -1
- package/dist/Editor/helper/theme.js +2 -1
- package/dist/Editor/hooks/useMouseMove.js +4 -1
- package/dist/Editor/utils/SlateUtilityFunctions.js +4 -10
- package/dist/Editor/utils/chatEditor/SlateUtilityFunctions.js +9 -0
- package/dist/Editor/utils/embedScript.js +20 -2
- package/dist/Editor/utils/freegrid.js +130 -17
- package/dist/Editor/utils/mentions.js +2 -0
- package/dist/Editor/utils/table.js +105 -0
- package/package.json +2 -1
|
@@ -14,6 +14,7 @@ import useMentions from "./hooks/useMentions";
|
|
|
14
14
|
import Shorthands from "./common/Shorthands";
|
|
15
15
|
import usePopupStyle from "./Toolbar/PopupTool/PopupToolStyle";
|
|
16
16
|
import { EditorProvider } from "./hooks/useMouseMove";
|
|
17
|
+
import decorators from "./utils/Decorators";
|
|
17
18
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
18
19
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
19
20
|
const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
@@ -27,7 +28,8 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
27
28
|
toolBar = true,
|
|
28
29
|
onSave,
|
|
29
30
|
onsubmit,
|
|
30
|
-
onBlur = () => {}
|
|
31
|
+
onBlur = () => {},
|
|
32
|
+
isMobile = false
|
|
31
33
|
} = props;
|
|
32
34
|
const classes = usePopupStyle(theme);
|
|
33
35
|
const convertedContent = draftToSlate({
|
|
@@ -42,7 +44,6 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
42
44
|
const [value, setValue] = useState(convertedContent);
|
|
43
45
|
const [loadedValue] = useState(value);
|
|
44
46
|
const [deboundedValue] = useDebounce(value, 500);
|
|
45
|
-
const [isExternalUpdate, setIsExternalUpdate] = useState(false);
|
|
46
47
|
const editor = useMemo(() => {
|
|
47
48
|
return withCommon(createEditor(), {
|
|
48
49
|
needLayout
|
|
@@ -98,24 +99,24 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
98
99
|
data: content
|
|
99
100
|
});
|
|
100
101
|
setValue(newValue);
|
|
101
|
-
setTimeout(() => {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}, 300);
|
|
102
|
+
// setTimeout(() => {
|
|
103
|
+
if (editor.children.length === 0) {
|
|
104
|
+
Transforms.insertNodes(editor, newValue);
|
|
105
|
+
}
|
|
106
|
+
Transforms.select(editor, Editor.end(editor, []));
|
|
107
|
+
ReactEditor.focus(editor);
|
|
108
|
+
// }, 300);
|
|
108
109
|
} catch {
|
|
109
110
|
console.log("error:");
|
|
110
111
|
}
|
|
111
112
|
}
|
|
112
113
|
}));
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
114
|
+
|
|
115
|
+
// useEffect(() => {
|
|
116
|
+
// setIsExternalUpdate(true);
|
|
117
|
+
// setValue(draftToSlate({ data: content }));
|
|
118
|
+
// }, [content]);
|
|
119
|
+
|
|
119
120
|
useEffect(() => {
|
|
120
121
|
if (JSON.stringify(loadedValue) !== JSON.stringify(deboundedValue) && isInteracted && onSave) {
|
|
121
122
|
const {
|
|
@@ -178,14 +179,9 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
178
179
|
});
|
|
179
180
|
};
|
|
180
181
|
const handleEditorChange = newValue => {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
} else {
|
|
185
|
-
setValue(newValue);
|
|
186
|
-
if (!isInteracted) {
|
|
187
|
-
setIsInteracted(true);
|
|
188
|
-
}
|
|
182
|
+
setValue(newValue);
|
|
183
|
+
if (!isInteracted) {
|
|
184
|
+
setIsInteracted(true);
|
|
189
185
|
}
|
|
190
186
|
};
|
|
191
187
|
const Element = props => {
|
|
@@ -222,7 +218,7 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
222
218
|
event,
|
|
223
219
|
editor
|
|
224
220
|
});
|
|
225
|
-
} else if (event.key === "Enter") {
|
|
221
|
+
} else if (event.key === "Enter" && !isMobile) {
|
|
226
222
|
const isEmpty = value.length === 1 && value[0].type === 'paragraph' && value[0].children.length === 1 && value[0].children[0].text === '';
|
|
227
223
|
if (isEmpty) {
|
|
228
224
|
event.preventDefault();
|
|
@@ -267,9 +263,9 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
267
263
|
className: "chatEditorRoot",
|
|
268
264
|
renderElement: renderElement,
|
|
269
265
|
renderLeaf: renderLeaf,
|
|
266
|
+
decorate: decorators,
|
|
270
267
|
placeholder: "Start typing ...",
|
|
271
268
|
spellCheck: true,
|
|
272
|
-
autoFocus: true,
|
|
273
269
|
onBlur: handleBlur,
|
|
274
270
|
onKeyDown: onKeyDown
|
|
275
271
|
}), !readOnly ? /*#__PURE__*/_jsx(MentionsPopup, {
|
|
@@ -33,6 +33,7 @@ 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";
|
|
36
37
|
import "./font.css";
|
|
37
38
|
import "./Editor.css";
|
|
38
39
|
import "animate.css";
|
|
@@ -552,6 +553,8 @@ const CommonEditor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
552
553
|
}), htmlAction.showInput && /*#__PURE__*/_jsx(CodeToText, {
|
|
553
554
|
...htmlAction,
|
|
554
555
|
handleCodeToText: handleCodeToText
|
|
556
|
+
}), /*#__PURE__*/_jsx(FontLoader, {
|
|
557
|
+
...props
|
|
555
558
|
})]
|
|
556
559
|
}, id)
|
|
557
560
|
})
|
package/dist/Editor/Editor.css
CHANGED
|
@@ -851,6 +851,17 @@ blockquote {
|
|
|
851
851
|
text-align: center;
|
|
852
852
|
}
|
|
853
853
|
|
|
854
|
+
.removeScroll::-webkit-outer-spin-button,
|
|
855
|
+
.removeScroll::-webkit-inner-spin-button {
|
|
856
|
+
-webkit-appearance: none;
|
|
857
|
+
margin: 0;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
/* For Firefox */
|
|
861
|
+
.removeScroll {
|
|
862
|
+
-moz-appearance: textfield;
|
|
863
|
+
}
|
|
864
|
+
|
|
854
865
|
.borderInput:focus-visible {
|
|
855
866
|
outline: none !important;
|
|
856
867
|
}
|
|
@@ -900,7 +911,7 @@ blockquote {
|
|
|
900
911
|
}
|
|
901
912
|
|
|
902
913
|
.sliderInput {
|
|
903
|
-
width:
|
|
914
|
+
width: 30px;
|
|
904
915
|
padding: 2px 10px;
|
|
905
916
|
margin-left: 18px;
|
|
906
917
|
box-shadow: 0px 4px 16px 0px #0000000d;
|
|
@@ -22,10 +22,11 @@ const scrollToAIInput = editor => {
|
|
|
22
22
|
selectionRect = ReactEditor.toDOMRange(editor, getNextLine(editor).at).getBoundingClientRect();
|
|
23
23
|
}
|
|
24
24
|
const wrapperTop = slateWrapper.getBoundingClientRect().top;
|
|
25
|
-
const cursorViewPortPosition = selectionRect.
|
|
25
|
+
const cursorViewPortPosition = selectionRect.bottom - wrapperTop; // here the slatewrapper is the viewport, not the whole screen. We are finding the position of the cursor/selection relative to the slate wrapper, that why we are subracting the slate wrapper top with selection bottom
|
|
26
|
+
|
|
26
27
|
if (cursorViewPortPosition > 80) {
|
|
27
28
|
// scroll to top of the slateWrapper
|
|
28
|
-
slateWrapper.scrollBy(0,
|
|
29
|
+
slateWrapper.scrollBy(0, cursorViewPortPosition - 80);
|
|
29
30
|
}
|
|
30
31
|
}, 200);
|
|
31
32
|
} catch (err) {
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
+
import { getBorderColor, getTextColor } from "../../helper";
|
|
3
|
+
import { Box } from "@mui/material";
|
|
4
|
+
import { getBreakPointsValue, getTRBLBreakPoints } from "../../helper/theme";
|
|
2
5
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
6
|
const AccordionSummary = props => {
|
|
4
7
|
const {
|
|
@@ -9,18 +12,31 @@ const AccordionSummary = props => {
|
|
|
9
12
|
const {
|
|
10
13
|
textColor,
|
|
11
14
|
bgColor,
|
|
12
|
-
borderColor
|
|
15
|
+
borderColor,
|
|
16
|
+
borderRadius,
|
|
17
|
+
bannerSpacing
|
|
13
18
|
} = element;
|
|
14
|
-
|
|
19
|
+
const textStyles = getTextColor(textColor);
|
|
20
|
+
const borderStyle = getBorderColor(borderColor);
|
|
21
|
+
return /*#__PURE__*/_jsx(Box, {
|
|
15
22
|
className: `accordion-summary-container`,
|
|
16
23
|
...attributes,
|
|
17
24
|
style: {
|
|
18
25
|
width: "100%",
|
|
19
26
|
position: "relative",
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
color: textColor
|
|
27
|
+
background: bgColor,
|
|
28
|
+
...borderStyle
|
|
23
29
|
},
|
|
30
|
+
sx: {
|
|
31
|
+
borderRadius: {
|
|
32
|
+
...getBreakPointsValue(borderRadius || {}, null, "overrideBorderRadius", true)
|
|
33
|
+
},
|
|
34
|
+
padding: {
|
|
35
|
+
...getTRBLBreakPoints(bannerSpacing)
|
|
36
|
+
},
|
|
37
|
+
'& span[data-slate-string="true"]': textStyles
|
|
38
|
+
},
|
|
39
|
+
component: "div",
|
|
24
40
|
children: children
|
|
25
41
|
});
|
|
26
42
|
};
|
|
@@ -18,7 +18,7 @@ import { Transforms } from "slate";
|
|
|
18
18
|
// return doc.body.innerHTML;
|
|
19
19
|
// };
|
|
20
20
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
21
|
-
import {
|
|
21
|
+
import { createElement as _createElement } from "react";
|
|
22
22
|
const getCode = (embedData, isEncoded) => {
|
|
23
23
|
if (isEncoded) {
|
|
24
24
|
return decodeString(embedData);
|
|
@@ -75,20 +75,22 @@ const Code = props => {
|
|
|
75
75
|
allowedScriptDomains: allowedDomains // for old code's that are already inserted without sanitization
|
|
76
76
|
});
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
if (clean) {
|
|
79
|
+
const slotHtml = document.createRange().createContextualFragment(clean); // Create a 'tiny' document and parse the html string
|
|
80
|
+
codeRef.current.innerHTML = ""; // Clear the container
|
|
81
|
+
codeRef.current.appendChild(slotHtml);
|
|
82
|
+
}
|
|
81
83
|
}
|
|
82
|
-
}, []);
|
|
83
|
-
return /*#__PURE__*/
|
|
84
|
+
}, [embedData]);
|
|
85
|
+
return /*#__PURE__*/_createElement("div", {
|
|
84
86
|
className: "embed-code has-hover",
|
|
85
87
|
contentEditable: false,
|
|
86
88
|
...attributes,
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
});
|
|
89
|
+
key: element?.updatedOn
|
|
90
|
+
}, /*#__PURE__*/_jsx("div", {
|
|
91
|
+
ref: codeRef
|
|
92
|
+
}), children, !readOnly && /*#__PURE__*/_jsx(ToolBar, {
|
|
93
|
+
onDelete: onDelete
|
|
94
|
+
}));
|
|
93
95
|
};
|
|
94
96
|
export default Code;
|
|
@@ -1,70 +1,18 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useState } from "react";
|
|
2
2
|
import ToolbarIcon from "../../common/ToolbarIcon";
|
|
3
3
|
import Icon from "../../common/Icon";
|
|
4
|
-
import
|
|
5
|
-
import { insertEmbedScript } from "../../utils/embedScript";
|
|
6
|
-
import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined";
|
|
4
|
+
import EmbedScriptPopup from "./EmbedScriptPopup";
|
|
7
5
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
-
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
6
|
import { Fragment as _Fragment } from "react/jsx-runtime";
|
|
7
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
8
|
const EmbedScript = props => {
|
|
11
9
|
const {
|
|
12
|
-
|
|
13
|
-
icoBtnType,
|
|
14
|
-
customProps
|
|
10
|
+
icoBtnType
|
|
15
11
|
} = props;
|
|
16
12
|
const [open, setOpen] = useState(false);
|
|
17
|
-
const [code, setCode] = useState("");
|
|
18
|
-
const [apiStatus, setApiStatus] = useState({
|
|
19
|
-
loading: false,
|
|
20
|
-
error: false
|
|
21
|
-
});
|
|
22
|
-
const [allowedDomains, setAllowedDomains] = useState([]);
|
|
23
|
-
const {
|
|
24
|
-
loading,
|
|
25
|
-
error
|
|
26
|
-
} = apiStatus;
|
|
27
|
-
useEffect(() => {
|
|
28
|
-
customProps.services("allowedDomains", {}).then(data => {
|
|
29
|
-
setAllowedDomains(data?.data || []);
|
|
30
|
-
}).catch(err => {
|
|
31
|
-
console.log(err);
|
|
32
|
-
});
|
|
33
|
-
}, []);
|
|
34
|
-
const updateApiStatus = update => {
|
|
35
|
-
setApiStatus(prev => ({
|
|
36
|
-
...prev,
|
|
37
|
-
...update
|
|
38
|
-
}));
|
|
39
|
-
};
|
|
40
|
-
const handleChange = e => {
|
|
41
|
-
setCode(e.target.value);
|
|
42
|
-
};
|
|
43
13
|
const handleClick = () => {
|
|
44
14
|
setOpen(true);
|
|
45
15
|
};
|
|
46
|
-
const onSubmit = async () => {
|
|
47
|
-
updateApiStatus({
|
|
48
|
-
loading: true
|
|
49
|
-
});
|
|
50
|
-
const result = await customProps.services("validateCode", {
|
|
51
|
-
code
|
|
52
|
-
});
|
|
53
|
-
const {
|
|
54
|
-
error,
|
|
55
|
-
sanitizedCode
|
|
56
|
-
} = result?.data || {};
|
|
57
|
-
updateApiStatus({
|
|
58
|
-
loading: false,
|
|
59
|
-
error
|
|
60
|
-
});
|
|
61
|
-
if (!error) {
|
|
62
|
-
insertEmbedScript(editor, sanitizedCode || "");
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
const onCancel = () => {
|
|
66
|
-
setOpen(false);
|
|
67
|
-
};
|
|
68
16
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
69
17
|
children: [/*#__PURE__*/_jsx(ToolbarIcon, {
|
|
70
18
|
title: "Code",
|
|
@@ -73,65 +21,9 @@ const EmbedScript = props => {
|
|
|
73
21
|
icon: "embedScript"
|
|
74
22
|
}),
|
|
75
23
|
icoBtnType: icoBtnType
|
|
76
|
-
}), /*#__PURE__*/
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
children: [/*#__PURE__*/_jsx(DialogTitle, {
|
|
80
|
-
children: /*#__PURE__*/_jsxs(Box, {
|
|
81
|
-
component: "div",
|
|
82
|
-
sx: {
|
|
83
|
-
display: "flex",
|
|
84
|
-
alignItems: "center",
|
|
85
|
-
gap: "6px"
|
|
86
|
-
},
|
|
87
|
-
children: ["Embed Code", allowedDomains?.length ? /*#__PURE__*/_jsx(Tooltip, {
|
|
88
|
-
title: /*#__PURE__*/_jsxs(Box, {
|
|
89
|
-
sx: {
|
|
90
|
-
textTransform: "none"
|
|
91
|
-
},
|
|
92
|
-
children: [/*#__PURE__*/_jsx("span", {
|
|
93
|
-
style: {
|
|
94
|
-
fontWeight: "bold"
|
|
95
|
-
},
|
|
96
|
-
children: "Allowed Domains"
|
|
97
|
-
}), /*#__PURE__*/_jsx("br", {}), allowedDomains.join(", ")]
|
|
98
|
-
}),
|
|
99
|
-
children: /*#__PURE__*/_jsx(InfoOutlinedIcon, {
|
|
100
|
-
color: "gray",
|
|
101
|
-
fontSize: "14px",
|
|
102
|
-
style: {
|
|
103
|
-
fill: "#94A3B8",
|
|
104
|
-
cursor: "pointer"
|
|
105
|
-
}
|
|
106
|
-
})
|
|
107
|
-
}) : null]
|
|
108
|
-
})
|
|
109
|
-
}), /*#__PURE__*/_jsxs(DialogContent, {
|
|
110
|
-
children: [/*#__PURE__*/_jsx("textarea", {
|
|
111
|
-
value: code,
|
|
112
|
-
onChange: handleChange,
|
|
113
|
-
style: {
|
|
114
|
-
minHeight: "200px",
|
|
115
|
-
width: "100%",
|
|
116
|
-
resize: "none",
|
|
117
|
-
padding: "4px",
|
|
118
|
-
boxSizing: "border-box"
|
|
119
|
-
}
|
|
120
|
-
}), /*#__PURE__*/_jsx(Box, {
|
|
121
|
-
component: "div",
|
|
122
|
-
color: "red",
|
|
123
|
-
children: error ? "There was some error on this code." : ""
|
|
124
|
-
})]
|
|
125
|
-
}), /*#__PURE__*/_jsxs(DialogActions, {
|
|
126
|
-
children: [/*#__PURE__*/_jsx(Button, {
|
|
127
|
-
onClick: onSubmit,
|
|
128
|
-
disabled: loading,
|
|
129
|
-
children: loading ? "Validating" : "Save"
|
|
130
|
-
}), /*#__PURE__*/_jsx(Button, {
|
|
131
|
-
onClick: onCancel,
|
|
132
|
-
children: "Cancel"
|
|
133
|
-
})]
|
|
134
|
-
})]
|
|
24
|
+
}), /*#__PURE__*/_jsx(EmbedScriptPopup, {
|
|
25
|
+
...props,
|
|
26
|
+
open: open
|
|
135
27
|
})]
|
|
136
28
|
});
|
|
137
29
|
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
|
2
|
+
import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Tooltip } from "@mui/material";
|
|
3
|
+
import { insertEmbedScript, updateEmbedScript } from "../../utils/embedScript";
|
|
4
|
+
import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined";
|
|
5
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { Fragment as _Fragment } from "react/jsx-runtime";
|
|
8
|
+
const EmbedScriptPopup = props => {
|
|
9
|
+
const {
|
|
10
|
+
open,
|
|
11
|
+
editor,
|
|
12
|
+
customProps,
|
|
13
|
+
onClose,
|
|
14
|
+
updatePath,
|
|
15
|
+
parentPath
|
|
16
|
+
} = props;
|
|
17
|
+
const [code, setCode] = useState("");
|
|
18
|
+
const [apiStatus, setApiStatus] = useState({
|
|
19
|
+
loading: false,
|
|
20
|
+
error: false
|
|
21
|
+
});
|
|
22
|
+
const [allowedDomains, setAllowedDomains] = useState([]);
|
|
23
|
+
const {
|
|
24
|
+
loading,
|
|
25
|
+
error
|
|
26
|
+
} = apiStatus;
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
customProps.services("allowedDomains", {}).then(data => {
|
|
29
|
+
setAllowedDomains(data?.data || []);
|
|
30
|
+
}).catch(err => {
|
|
31
|
+
console.log(err);
|
|
32
|
+
});
|
|
33
|
+
}, []);
|
|
34
|
+
const updateApiStatus = update => {
|
|
35
|
+
setApiStatus(prev => ({
|
|
36
|
+
...prev,
|
|
37
|
+
...update
|
|
38
|
+
}));
|
|
39
|
+
};
|
|
40
|
+
const handleChange = e => {
|
|
41
|
+
setCode(e.target.value);
|
|
42
|
+
};
|
|
43
|
+
const onSubmit = async () => {
|
|
44
|
+
updateApiStatus({
|
|
45
|
+
loading: true
|
|
46
|
+
});
|
|
47
|
+
const result = await customProps.services("validateCode", {
|
|
48
|
+
code
|
|
49
|
+
});
|
|
50
|
+
const {
|
|
51
|
+
error,
|
|
52
|
+
sanitizedCode
|
|
53
|
+
} = result?.data || {};
|
|
54
|
+
updateApiStatus({
|
|
55
|
+
loading: false,
|
|
56
|
+
error
|
|
57
|
+
});
|
|
58
|
+
if (!error) {
|
|
59
|
+
if (updatePath) {
|
|
60
|
+
updateEmbedScript(editor, sanitizedCode || "", updatePath, parentPath);
|
|
61
|
+
} else {
|
|
62
|
+
insertEmbedScript(editor, sanitizedCode || "");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
onClose();
|
|
66
|
+
};
|
|
67
|
+
return /*#__PURE__*/_jsx(_Fragment, {
|
|
68
|
+
children: /*#__PURE__*/_jsxs(Dialog, {
|
|
69
|
+
open: open,
|
|
70
|
+
fullWidth: true,
|
|
71
|
+
children: [/*#__PURE__*/_jsx(DialogTitle, {
|
|
72
|
+
children: /*#__PURE__*/_jsxs(Box, {
|
|
73
|
+
component: "div",
|
|
74
|
+
sx: {
|
|
75
|
+
display: "flex",
|
|
76
|
+
alignItems: "center",
|
|
77
|
+
gap: "6px"
|
|
78
|
+
},
|
|
79
|
+
children: ["Embed Code", allowedDomains?.length ? /*#__PURE__*/_jsx(Tooltip, {
|
|
80
|
+
title: /*#__PURE__*/_jsxs(Box, {
|
|
81
|
+
sx: {
|
|
82
|
+
textTransform: "none"
|
|
83
|
+
},
|
|
84
|
+
children: [/*#__PURE__*/_jsx("span", {
|
|
85
|
+
style: {
|
|
86
|
+
fontWeight: "bold"
|
|
87
|
+
},
|
|
88
|
+
children: "Allowed Domains"
|
|
89
|
+
}), /*#__PURE__*/_jsx("br", {}), allowedDomains.join(", ")]
|
|
90
|
+
}),
|
|
91
|
+
children: /*#__PURE__*/_jsx(InfoOutlinedIcon, {
|
|
92
|
+
color: "gray",
|
|
93
|
+
fontSize: "14px",
|
|
94
|
+
style: {
|
|
95
|
+
fill: "#94A3B8",
|
|
96
|
+
cursor: "pointer"
|
|
97
|
+
}
|
|
98
|
+
})
|
|
99
|
+
}) : null]
|
|
100
|
+
})
|
|
101
|
+
}), /*#__PURE__*/_jsxs(DialogContent, {
|
|
102
|
+
children: [/*#__PURE__*/_jsx("textarea", {
|
|
103
|
+
value: code,
|
|
104
|
+
onChange: handleChange,
|
|
105
|
+
style: {
|
|
106
|
+
minHeight: "200px",
|
|
107
|
+
width: "100%",
|
|
108
|
+
resize: "none",
|
|
109
|
+
padding: "4px",
|
|
110
|
+
boxSizing: "border-box"
|
|
111
|
+
}
|
|
112
|
+
}), /*#__PURE__*/_jsx(Box, {
|
|
113
|
+
component: "div",
|
|
114
|
+
color: "red",
|
|
115
|
+
children: error ? "There was some error on this code." : ""
|
|
116
|
+
})]
|
|
117
|
+
}), /*#__PURE__*/_jsxs(DialogActions, {
|
|
118
|
+
children: [/*#__PURE__*/_jsx(Button, {
|
|
119
|
+
onClick: onSubmit,
|
|
120
|
+
disabled: loading,
|
|
121
|
+
children: loading ? "Validating" : "Save"
|
|
122
|
+
}), /*#__PURE__*/_jsx(Button, {
|
|
123
|
+
onClick: onClose,
|
|
124
|
+
children: "Cancel"
|
|
125
|
+
})]
|
|
126
|
+
})]
|
|
127
|
+
})
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
export default EmbedScriptPopup;
|
|
@@ -5,13 +5,15 @@ import { Fragment as _Fragment } from "react/jsx-runtime";
|
|
|
5
5
|
const EmojiPicker = props => {
|
|
6
6
|
const {
|
|
7
7
|
onEmojiSelect,
|
|
8
|
-
onClose
|
|
8
|
+
onClose,
|
|
9
|
+
theme = 'dark'
|
|
9
10
|
} = props;
|
|
10
11
|
return /*#__PURE__*/_jsx(_Fragment, {
|
|
11
12
|
children: /*#__PURE__*/_jsx(Picker, {
|
|
12
13
|
data: data,
|
|
13
14
|
onEmojiSelect: onEmojiSelect,
|
|
14
|
-
onClickOutside: onClose
|
|
15
|
+
onClickOutside: onClose,
|
|
16
|
+
theme: theme
|
|
15
17
|
})
|
|
16
18
|
});
|
|
17
19
|
};
|
|
@@ -18,7 +18,9 @@ import { onPasteRnDNode } from "../../helper";
|
|
|
18
18
|
import focusOnNewItem from "../../helper/RnD/focusOnNewItem";
|
|
19
19
|
import { appHeaderNode } from "../../utils/insertAppHeader";
|
|
20
20
|
import { FORM_NODE } from "../../utils/form";
|
|
21
|
+
import { DEFAULT_TABLE_NODE } from "../../utils/table";
|
|
21
22
|
import itemOptions from "./Options/sectionItemOptions";
|
|
23
|
+
import { getBreakPointsValue, groupByBreakpoint } from "../../helper/theme";
|
|
22
24
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
23
25
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
24
26
|
const MAX_DEVICE_WIDTH = {
|
|
@@ -40,7 +42,8 @@ const FreeGrid = props => {
|
|
|
40
42
|
customProps
|
|
41
43
|
} = props;
|
|
42
44
|
const {
|
|
43
|
-
sectionName
|
|
45
|
+
sectionName,
|
|
46
|
+
sectionBorderRadius
|
|
44
47
|
} = element;
|
|
45
48
|
const {
|
|
46
49
|
readOnly,
|
|
@@ -158,7 +161,7 @@ const FreeGrid = props => {
|
|
|
158
161
|
marginTop: 0,
|
|
159
162
|
top: 0,
|
|
160
163
|
width: 170,
|
|
161
|
-
height:
|
|
164
|
+
height: 30
|
|
162
165
|
}], {
|
|
163
166
|
at: [...insertAt]
|
|
164
167
|
});
|
|
@@ -189,14 +192,16 @@ const FreeGrid = props => {
|
|
|
189
192
|
top: 12,
|
|
190
193
|
right: 12,
|
|
191
194
|
bottom: 12
|
|
192
|
-
}
|
|
195
|
+
},
|
|
196
|
+
textAlign: "center",
|
|
197
|
+
label: "Get Started"
|
|
193
198
|
}],
|
|
194
199
|
gridArea: "3 / 1 / 4 / 2",
|
|
195
200
|
left: 50,
|
|
196
201
|
marginTop: 0,
|
|
197
202
|
top: 0,
|
|
198
|
-
width:
|
|
199
|
-
height:
|
|
203
|
+
width: 143,
|
|
204
|
+
height: 50
|
|
200
205
|
}], {
|
|
201
206
|
at: [...insertAt]
|
|
202
207
|
});
|
|
@@ -237,6 +242,41 @@ const FreeGrid = props => {
|
|
|
237
242
|
at: [...insertAt]
|
|
238
243
|
});
|
|
239
244
|
break;
|
|
245
|
+
case "addTable":
|
|
246
|
+
Transforms.insertNodes(editor, [{
|
|
247
|
+
...insertFreeGridItem("table", {
|
|
248
|
+
...DEFAULT_TABLE_NODE()
|
|
249
|
+
}, {
|
|
250
|
+
height: 130,
|
|
251
|
+
width: 400
|
|
252
|
+
})
|
|
253
|
+
}], {
|
|
254
|
+
at: [...insertAt]
|
|
255
|
+
});
|
|
256
|
+
break;
|
|
257
|
+
case "addCode":
|
|
258
|
+
Transforms.insertNodes(editor, [{
|
|
259
|
+
type: "freegridItem",
|
|
260
|
+
childType: "embedScript",
|
|
261
|
+
children: [{
|
|
262
|
+
type: "embedScript",
|
|
263
|
+
embedData: "",
|
|
264
|
+
children: [{
|
|
265
|
+
text: " "
|
|
266
|
+
}],
|
|
267
|
+
isEncoded: true,
|
|
268
|
+
isSanitized: true
|
|
269
|
+
}],
|
|
270
|
+
gridArea: "3 / 1 / 4 / 2",
|
|
271
|
+
left: 50,
|
|
272
|
+
marginTop: 0,
|
|
273
|
+
top: 0,
|
|
274
|
+
width: 400,
|
|
275
|
+
height: 300
|
|
276
|
+
}], {
|
|
277
|
+
at: [...insertAt]
|
|
278
|
+
});
|
|
279
|
+
break;
|
|
240
280
|
case "addBox":
|
|
241
281
|
Transforms.insertNodes(editor, [{
|
|
242
282
|
...insertFreeGridItem("box", {
|
|
@@ -254,7 +294,7 @@ const FreeGrid = props => {
|
|
|
254
294
|
...insertFreeGridItem("form", {
|
|
255
295
|
...FORM_NODE()
|
|
256
296
|
}, {
|
|
257
|
-
height:
|
|
297
|
+
height: 92,
|
|
258
298
|
width: 400
|
|
259
299
|
})
|
|
260
300
|
}], {
|
|
@@ -341,6 +381,11 @@ const FreeGrid = props => {
|
|
|
341
381
|
}
|
|
342
382
|
};
|
|
343
383
|
const repeatTimes = Math.floor(height / ROW_HEIGHT);
|
|
384
|
+
const freegridSX = groupByBreakpoint({
|
|
385
|
+
borderRadius: {
|
|
386
|
+
...getBreakPointsValue(sectionBorderRadius || {}, null, "overrideBorderRadius", true)
|
|
387
|
+
}
|
|
388
|
+
}, theme);
|
|
344
389
|
return /*#__PURE__*/_jsx(RnD, {
|
|
345
390
|
id: `freegrid_container_${path.join("|")}_${updated_at}_${breakpoint}`,
|
|
346
391
|
className: `freegrid-section breakpoint-${breakpoint}`,
|
|
@@ -417,7 +462,10 @@ const FreeGrid = props => {
|
|
|
417
462
|
id: sectionName,
|
|
418
463
|
"data-event": "rnd-click",
|
|
419
464
|
className: "freegrid-container freegrid-container-parent",
|
|
420
|
-
sx:
|
|
465
|
+
sx: {
|
|
466
|
+
...classes.root,
|
|
467
|
+
...freegridSX
|
|
468
|
+
},
|
|
421
469
|
"data-path": path.join("|"),
|
|
422
470
|
style: {
|
|
423
471
|
"--cols": `100%`,
|